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