Main method to apply the INCL physics model.
177 if((isIonTrack && (trackZ<=0 || trackA<=trackZ)) || (nucleusA>1 && (nucleusZ<=0 || nucleusA<=nucleusZ))) {
186 if(trackA<=1 && nucleusA<=1) {
193 if(trackA > theMaxProjMassINCL && nucleusA > theMaxProjMassINCL) {
196 std::stringstream ss;
197 ss <<
"INCL++ refuses to handle reactions between nuclei with A>" 198 << theMaxProjMassINCL
199 <<
". A backup model (" 201 <<
") will be used instead.";
211 && trackKinE < cascadeMinEnergyPerNucleon) {
214 std::stringstream ss;
215 ss <<
"INCL++ refuses to handle nucleon-induced reactions below " 216 << cascadeMinEnergyPerNucleon /
MeV 217 <<
" MeV. A PreCoumpound model (" 219 <<
") will be used instead.";
228 const G4double theTrackEnergy = trackKinE + theTrackMass;
229 const G4double theTrackMomentumAbs2 = theTrackEnergy*theTrackEnergy - theTrackMass*theTrackMass;
230 const G4double theTrackMomentumAbs = ((theTrackMomentumAbs2>0.0) ? std::sqrt(theTrackMomentumAbs2) : 0.0);
235 fourMomentumIn.
setE(theTrackEnergy + theNucleusMass);
236 fourMomentumIn.
setVect(theTrackMomentum);
245 G4Nucleus *theTargetNucleus = &theNucleus;
246 if(inverseKinematics) {
250 if(oldProjectileDef != 0 && oldTargetDef != 0) {
254 if(newTargetA > 0 && newTargetZ > 0) {
256 theTargetNucleus =
new G4Nucleus(newTargetA, newTargetZ);
259 G4DynamicParticle swappedProjectileParticle(oldTargetDef, (*toInverseKinematics) * theProjectile4Momentum);
262 G4String message =
"badly defined target after swapping. Falling back to normal (non-swapped) mode.";
267 G4String message =
"oldProjectileDef or oldTargetDef was null";
303 std::list<G4Fragment> remnants;
305 const G4int maxTries = 200;
325 if(inverseKinematics) {
344 momentum *= toLabFrame;
346 if(inverseKinematics) {
347 momentum *= *toDirectKinematics;
353 fourMomentumOut += momentum;
357 G4String message =
"the model produced a particle that couldn't be converted to Geant4 particle.";
372 eventInfo.
jyRem[i]*hbar_Planck,
373 eventInfo.
jzRem[i]*hbar_Planck
382 if(std::abs(scaling - 1.0) > 0.01) {
383 std::stringstream ss;
384 ss <<
"momentum scaling = " << scaling
385 <<
"\n Lorentz vector = " << fourMomentum
386 <<
")\n A = " << A <<
", Z = " << Z
387 <<
"\n E* = " << excitationE <<
", nuclearMass = " << nuclearMass
388 <<
"\n remnant i=" << i <<
", nRemnants=" << eventInfo.
nRemnants 392 <<
", in " << (inverseKinematics ?
"inverse" :
"direct") <<
" kinematics.";
397 fourMomentum *= toLabFrame;
400 if(inverseKinematics) {
401 fourMomentum *= *toDirectKinematics;
402 fourMomentum.setVect(-fourMomentum.vect());
405 fourMomentumOut += fourMomentum;
407 remnant.SetAngularMomentum(spin);
409 G4cerr <<
"G4INCLXX_DUMP_REMNANT: " << remnant <<
" spin: " << spin <<
G4endl;
411 remnants.push_back(remnant);
415 const G4LorentzVector violation4Momentum = fourMomentumOut - fourMomentumIn;
416 const G4double energyViolation = std::abs(violation4Momentum.
e());
417 const G4double momentumViolation = violation4Momentum.
rho();
419 std::stringstream ss;
420 ss <<
"energy conservation violated by " << energyViolation/
MeV <<
" MeV in " 423 <<
" inelastic reaction, in " << (inverseKinematics ?
"inverse" :
"direct") <<
" kinematics. Will resample.";
427 for(
G4int j=0; j<nSecondaries; ++j)
433 std::stringstream ss;
434 ss <<
"momentum conservation violated by " << momentumViolation/
MeV <<
" MeV in " 437 <<
" inelastic reaction, in " << (inverseKinematics ?
"inverse" :
"direct") <<
" kinematics. Will resample.";
441 for(
G4int j=0; j<nSecondaries; ++j)
449 }
while(!eventIsOK && nTries < maxTries);
452 if(inverseKinematics) {
453 delete aProjectileTrack;
454 delete theTargetNucleus;
455 delete toInverseKinematics;
456 delete toDirectKinematics;
460 std::stringstream ss;
461 ss <<
"maximum number of tries exceeded for the proposed " 464 <<
" inelastic reaction, in " << (inverseKinematics ?
"inverse" :
"direct") <<
" kinematics.";
475 for(std::list<G4Fragment>::iterator i = remnants.begin();
476 i != remnants.end(); ++i) {
479 for(G4ReactionProductVector::iterator fragment = deExcitationResult->begin();
480 fragment != deExcitationResult->end(); ++fragment) {
488 for(G4ReactionProductVector::iterator fragment = deExcitationResult->begin();
489 fragment != deExcitationResult->end(); ++fragment) {
492 deExcitationResult->clear();
493 delete deExcitationResult;
Short_t nRemnants
Number of remnants.
static G4double GetNuclearMass(const G4double A, const G4double Z)
G4double remnant4MomentumScaling(G4double mass, G4double kineticE, G4double px, G4double py, G4double pz) const
Rescale remnant momentum if necessary.
G4bool AccurateProjectile(const G4HadProjectile &aTrack, const G4Nucleus &theTargetNucleus) const
G4int GetNumberOfSecondaries() const
G4HadronicInteraction * theBackupModel
G4HadSecondary * GetSecondary(size_t i)
CLHEP::HepLorentzRotation G4LorentzRotation
virtual G4ReactionProductVector * DeExcite(G4Fragment &aFragment)=0
Float_t py[maxSizeParticles]
Particle momentum, y component [MeV/c].
const G4LorentzVector & Get4Momentum() const
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
static G4Proton * ProtonDefinition()
Float_t jzRem[maxSizeRemnants]
Remnant angular momentum, z component [ ].
const G4String & GetParticleType() const
const G4String & GetIonName(G4int Z, G4int A, G4int lvl=0) const
Float_t EKin[maxSizeParticles]
Particle kinetic energy [MeV].
HepRotation & rotateY(double delta)
Float_t EKinRem[maxSizeRemnants]
Remnant kinetic energy [MeV].
G4bool complainedAboutPreCompound
G4double GetIonMass(G4int Z, G4int A, G4int L=0, G4int lvl=0) const
Float_t pyRem[maxSizeRemnants]
Remnant momentum, y component [MeV/c].
Float_t pz[maxSizeParticles]
Particle momentum, z component [MeV/c].
G4HadronicInteraction * theBackupModelNucleon
Short_t ZRem[maxSizeRemnants]
Remnant charge number.
G4VPreCompoundModel * thePreCompoundModel
G4bool complainedAboutBackupModel
void SetStatusChange(G4HadFinalStateStatus aS)
Short_t ARem[maxSizeRemnants]
Remnant mass number.
std::vector< G4ReactionProduct * > G4ReactionProductVector
const G4String & GetParticleName() const
double A(double temperature)
Short_t Z[maxSizeParticles]
Particle charge number.
Short_t nParticles
Number of particles in the final state.
G4HadFinalState theResult
Float_t jxRem[maxSizeRemnants]
Remnant angular momentum, x component [ ].
const EventInfo & processEvent()
Float_t pzRem[maxSizeRemnants]
Remnant momentum, z component [MeV/c].
Float_t EStarRem[maxSizeRemnants]
Remnant excitation energy [MeV].
HepLorentzRotation inverse() const
Float_t jyRem[maxSizeRemnants]
Remnant angular momentum, y component [ ].
Float_t pxRem[maxSizeRemnants]
Remnant momentum, x component [MeV/c].
const G4ParticleDefinition * GetDefinition() const
Short_t A[maxSizeParticles]
Particle mass number.
void Set4Momentum(const G4LorentzVector &momentum)
G4int GetAtomicNumber() const
void SetEnergyChange(G4double anEnergy)
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &thePrimary, G4Nucleus &theNucleus)=0
static G4GenericIon * GenericIon()
G4double GetKineticEnergy() const
G4INCL::INCL * theINCLModel
G4double GetPDGMass() const
G4DynamicParticle * GetParticle()
G4INCL::ParticleSpecies toINCLParticleSpecies(G4HadProjectile const &) const
Convert G4HadProjectile to corresponding INCL particle species.
G4INCLXXVInterfaceTally * theTally
G4VPreCompoundModel * theDeExcitation
G4DynamicParticle * toG4Particle(G4int A, G4int Z, G4double kinE, G4double px, G4double py, G4double pz) const
Convert an INCL particle to a G4DynamicParticle.
HepRotation & rotateZ(double delta)
G4LorentzVector Get4Momentum() const
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
std::map< G4String, G4AttDef > * GetInstance(const G4String &storeKey, G4bool &isNew)
void setVect(const Hep3Vector &)
HepRotation inverse() const
G4IonTable *const theIonTable
Bool_t transparent
True if the event is transparent.
G4double toINCLKineticEnergy(G4HadProjectile const &) const
Convert G4HadProjectile to corresponding INCL particle kinetic energy.
const G4String & GetModelName() const
virtual void Tally(G4HadProjectile const &aTrack, G4Nucleus const &theNucleus, G4HadFinalState const &result)=0
G4int GetAtomicMass() const
Float_t px[maxSizeParticles]
Particle momentum, x component [MeV/c].
static G4Neutron * NeutronDefinition()
void SetMomentumChange(const G4ThreeVector &aV)
G4double GetPDGCharge() const
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)=0
G4GLOB_DLL std::ostream G4cerr
G4INCLXXInterfaceStore *const theInterfaceStore