Frame of reference for secondaries in Hadronic Interactions

Dear all,

I am looking into electro-nuclear reactions with Geant 4 using a simple geometry. A 3.2 GeV electron gun is placed in front of a tungstent block. I started using a modified FTFP_BERT physics list, registering only G4EmExtraPhysics and G4DecayPhysics.

I’m using different ways of extracting the scattered electron 4-vector and all secondaries from any electro-nuclear reactions, and as a sanity check, I’m checking manually for 4-vector conservation. I seem to observe that energy and momentum in the direction of flight of the incident electron are conserved, but it also seems that the momentum of the scattered electron transverse to the direction of flight of the incident electron is not accounted for. If I sum over the momentum of all secondaries, the components transverse to the direction of flight of the incident electron are (almost) always compatible with 0.

I observe the same for electron-nuclear interactions using the full FTFP_BERT physics list, same for QGSP_BERT, and as it seems, also for some other processes. I have also tried different electron energies and different target materials.
I have looked a bit into the Geant4 classes that are used to calculate the electron nuclear interactions. As far as I understand, the electron-nuclear interaction is essentially split into the radiation of a gamma from the incident electron, and the interaction of that photon with the target nucleus (photon energy is < 10 GeV in all cases) - it’s my understanding that this happens in G4ElectroVDNuclearModel::ApplyYourself(), which calls G4ElectroVDNuclearModel::CalculateEMVertex() for the emission of the photon and G4ElectroVDNuclearModel::CalculateHadronicVertex() for the interaction of the gamma with the target nucleus.

The momentum of the photon in the transverse plane to the incident electron balances that of the scattered electron in the transverse plane to incident electron. The CalculateHadronicVertex() function creates a G4HadProjectile calling G4HadProjectile::G4HadProjectile(const G4DynamicParticle), which rotates the coordinate system such that the photon momentum points along the z-axis. It seems that the 3-momenta of all secondaries are calculated in this coordinate system, but they are never rotated back into the lab frame. The secondaries are propagated through my world volume according to the 3-momentum in the rotated labframe, violating momentum conservation in the lab frame, as the 3-momentum of the scattered electron is correctly given in the lab frame.

This is the first time I get in touch with Geant4 directly, so I might very well be doing something wrong here. The general observation seems to be correct though, I get the same numerical results that I get by hand when I call G4HadProcess::CheckEnergyMomentumConservation().

Do I misunderstand anything here, or is the observed behaviour even expected (if so, why?).

Thank you very much for your help,

Please fill out the following information to help in answering your question, and also see tips for posting code snippets. If you don’t provide this information it will take more time to help with your problem!

Geant4 Version: geant4-v11.2.1
Operating System: Red Hat Enterprise 9.4
Compiler/Version: GCC 11.4.1
CMake Version: 3.26.5

1 Like