Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4INCL::ParticleEntryChannel Class Reference

#include <G4INCLParticleEntryChannel.hh>

Inheritance diagram for G4INCL::ParticleEntryChannel:

Public Member Functions

 ParticleEntryChannel (Nucleus *n, Particle *p)
virtual ~ParticleEntryChannel ()
void fillFinalState (FinalState *fs)
Public Member Functions inherited from G4INCL::IChannel
 IChannel ()
virtual ~IChannel ()
FinalStategetFinalState ()

Detailed Description

Definition at line 49 of file G4INCLParticleEntryChannel.hh.

Constructor & Destructor Documentation

◆ ParticleEntryChannel()

G4INCL::ParticleEntryChannel::ParticleEntryChannel ( Nucleus * n,
Particle * p )

Definition at line 48 of file G4INCLParticleEntryChannel.cc.

49 :theNucleus(n), theParticle(p)
50 {}

◆ ~ParticleEntryChannel()

G4INCL::ParticleEntryChannel::~ParticleEntryChannel ( )
virtual

Definition at line 52 of file G4INCLParticleEntryChannel.cc.

53 {}

Member Function Documentation

◆ fillFinalState()

void G4INCL::ParticleEntryChannel::fillFinalState ( FinalState * fs)
virtual

Implements G4INCL::IChannel.

Definition at line 55 of file G4INCLParticleEntryChannel.cc.

55 {
56 // Behaves slightly differency if a third body (the projectile) is present
57 G4bool isNN = theNucleus->isNucleusNucleusCollision();
58
59 /* Corrections to the energy of the entering particle
60 *
61 * In particle-nucleus reactions, the goal of this correction is to satisfy
62 * energy conservation in particle-nucleus reactions using real particle
63 * and nuclear masses.
64 *
65 * In nucleus-nucleus reactions, in addition to the above, the correction
66 * is determined by a model for the excitation energy of the
67 * quasi-projectile (QP). The energy of the entering nucleon is such that
68 * the QP excitation energy, as determined by conservation, is what given
69 * by our model.
70 *
71 * Possible choices for the correction (or, equivalently, for the QP
72 * excitation energy):
73 *
74 * 1. the correction is 0. (same as in particle-nucleus);
75 * 2. the correction is the separation energy of the entering nucleon in
76 * the current QP;
77 * 3. the QP excitation energy is given by A. Boudard's algorithm, as
78 * implemented in INCL4.2-HI/Geant4.
79 * 4. the QP excitation energy vanishes.
80 *
81 * Ideally, the QP excitation energy should always be >=0. Algorithms 1.
82 * and 2. do not guarantee this, although violations to the rule seem to be
83 * more severe for 1. than for 2.. Algorithms 3. and 4., by construction,
84 * yields non-negative QP excitation energies.
85 */
86 G4double theCorrection;
87 if(isNN) {
88// assert(theParticle->isNucleonorLambda() || theParticle->isAntiNucleon()); // Possible hypernucleus projectile of inverse kinematic
89 ProjectileRemnant * const projectileRemnant = theNucleus->getProjectileRemnant();
90// assert(projectileRemnant);
91
92 // No correction (model 1. above)
93 /*
94 theCorrection = theParticle->getEmissionQValueCorrection(
95 theNucleus->getA() + theParticle->getA(),
96 theNucleus->getZ() + theParticle->getZ())
97 + theParticle->getTableMass() - theParticle->getINCLMass();
98 const G4double theProjectileCorrection = 0.;
99 */
100
101 // Correct the energy of the entering particle for the Q-value of the
102 // emission from the projectile (model 2. above)
103 /*
104 theCorrection = theParticle->getTransferQValueCorrection(
105 projectileRemnant->getA(), projectileRemnant->getZ(),
106 theNucleus->getA(), theNucleus->getZ());
107 G4double theProjectileCorrection;
108 if(projectileRemnant->getA()>theParticle->getA()) { // if there are any particles left
109 // Compute the projectile Q-value (to be used as a correction to the
110 // other components of the projectile remnant)
111 theProjectileCorrection = ParticleTable::getTableQValue(
112 projectileRemnant->getA() - theParticle->getA(),
113 projectileRemnant->getZ() - theParticle->getZ(),
114 theParticle->getA(),
115 theParticle->getZ());
116 } else
117 theProjectileCorrection = 0.;
118 */
119
120 // Fix the correction in such a way that the quasi-projectile excitation
121 // energy is given by A. Boudard's INCL4.2-HI model (model 3. above).
122 G4double theProjectileExcitationEnergy = 0;
123 G4double theProjectileEffectiveMass =0;
124 if (theParticle->isNucleonorLambda()){
125 theProjectileExcitationEnergy = (projectileRemnant->getA()-theParticle->getA()>1) ? (projectileRemnant->computeExcitationEnergyExcept(theParticle->getID())) : 0.;
126 theProjectileEffectiveMass =
127 ParticleTable::getTableMass(projectileRemnant->getA() - theParticle->getA(), projectileRemnant->getZ() - theParticle->getZ(), projectileRemnant->getS() - theParticle->getS())
128 + theProjectileExcitationEnergy;
129 }
130 else if (theParticle->isAntiNucleon()){
131 theProjectileExcitationEnergy = (projectileRemnant->getA() -theParticle->getA()<-1) ? (projectileRemnant->computeExcitationEnergyExcept(theParticle->getID())) : 0;
132 theProjectileEffectiveMass =
133 ParticleTable::getTableMass(-(projectileRemnant->getA() - theParticle->getA()), -(projectileRemnant->getZ() - theParticle->getZ()), projectileRemnant->getS() - theParticle->getS())
134 + theProjectileExcitationEnergy;
135 }
136 // Set the projectile excitation energy to zero (cold quasi-projectile,
137 // model 4. above).
138 // const G4double theProjectileExcitationEnergy = 0.;
139 // The part that follows is common to model 3. and 4.
140 const ThreeVector &theProjectileMomentum = projectileRemnant->getMomentum() - theParticle->getMomentum();
141 const G4double theProjectileEnergy = std::sqrt(theProjectileMomentum.mag2() + theProjectileEffectiveMass*theProjectileEffectiveMass);
142 const G4double theProjectileCorrection = theProjectileEnergy - (projectileRemnant->getEnergy() - theParticle->getEnergy());
143 /*if(theParticle->isAntiNucleon()){
144 bool Pvictim=0; //Proton or Neutron is the Victim ?
145 if(((theNucleus->getZ() - theParticle->getZ())- theNucleus->getZ()) == 1)
146 Pvictim = 1;
147 else
148 Pvictim = 0;
149 double theCorrection1 = theParticle->getEmissionPbarQvalueCorrection(theNucleus->getA(), theNucleus->getZ(), Pvictim);
150 double theCorrection2 = theParticle->getEmissionPbarQvalueCorrection(theNucleus->getA(), theNucleus->getZ(), !Pvictim);
151 theCorrection = theParticle->getEmissionPbarQvalueCorrection(theNucleus->getA() - theParticle->getA(), theNucleus->getZ() - theParticle->getZ(),Pvictim)
152 + theParticle->getTableMass() - theParticle->getINCLMass() + theProjectileCorrection;
153 if(Pvictim == 1 && theParticle->getType() == antiNeutron)
154 theCorrection += theCorrection2 - theCorrection1;
155 else if(Pvictim == 0 && theParticle->getType()==antiProton)
156 theCorrection += theCorrection2 - theCorrection1;
157 theCorrection = theParticle->getEmissionQValueCorrection(
158 theNucleus->getA() + theParticle->getA(),
159 theNucleus->getZ() + theParticle->getZ(),
160 theNucleus->getS() + theParticle->getS())
161 + theParticle->getTableMass() - theParticle->getINCLMass()
162 + theProjectileCorrection << std::endl;
163 }*/
164 //else
165 theCorrection = theParticle->getEmissionQValueCorrection(
166 theNucleus->getA() + theParticle->getA(),
167 theNucleus->getZ() + theParticle->getZ(),
168 theNucleus->getS() + theParticle->getS())
169 + theParticle->getTableMass() - theParticle->getINCLMass()
170 + theProjectileCorrection;
171 // end of part common to model 3. and 4.
172
173
174 projectileRemnant->removeParticle(theParticle, theProjectileCorrection);
175 } else {
176 const G4int ACN = theNucleus->getA() + theParticle->getA();
177 const G4int ZCN = theNucleus->getZ() + theParticle->getZ();
178 const G4int SCN = theNucleus->getS() + theParticle->getS();
179 // Correction to the Q-value of the entering particle
180 theCorrection = theParticle->getEmissionQValueCorrection(ACN,ZCN,SCN);
181 INCL_DEBUG("The following Particle enters with correction " << theCorrection << '\n'
182 << theParticle->print() << '\n');
183 }
184
185 const G4double energyBefore = theParticle->getEnergy() - theCorrection;
186 G4bool success;
187 if(isNN && theParticle->isAntiNucleon() && (theParticle->getEnergy() - theCorrection <=theParticle->getINCLMass()) ){
188 success =true;
189 G4double energyInside = theParticle->getEnergy() + theNucleus->getPotential()->computePotentialEnergy(theParticle) - theCorrection;
190 theParticle->setEnergy(energyInside);
191 theParticle->setPotentialEnergy(theNucleus->getPotential()->computePotentialEnergy(theParticle));
192 theParticle->setMomentum(theParticle->getMomentum());
193 theParticle->adjustMomentumFromEnergy();
194 }
195 else{
196 success = particleEnters(theCorrection);
197 }
198 fs->addEnteringParticle(theParticle);
199
200 if(!success) {
201 fs->makeParticleBelowZero();
202 } else if(theParticle->isNucleonorLambda() &&
203 theParticle->getKineticEnergy()<theNucleus->getPotential()->getFermiEnergy(theParticle)) {
204 // If the participant is a nucleon entering below its Fermi energy, force a
205 // compound nucleus
206 fs->makeParticleBelowFermi();
207 } else if(theParticle->isKaon()) theNucleus->setNumberOfKaon(theNucleus->getNumberOfKaon()+1);
208
209 fs->setTotalEnergyBeforeInteraction(energyBefore);
210 }
#define INCL_DEBUG(x)
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
G4ThreadLocal NuclearMassFn getTableMass
Static pointer to the mass function for nuclei.
G4double getINCLMass(const G4int A, const G4int Z, const G4int S)
Get INCL nuclear mass (in MeV/c^2).

The documentation for this class was generated from the following files: