Geant4  10.00.p01
G4INCLCascade.hh
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 // INCL++ intra-nuclear cascade model
27 // Pekka Kaitaniemi, CEA and Helsinki Institute of Physics
28 // Davide Mancusi, CEA
29 // Alain Boudard, CEA
30 // Sylvie Leray, CEA
31 // Joseph Cugnon, University of Liege
32 //
33 #define INCLXX_IN_GEANT4_MODE 1
34 
35 #include "globals.hh"
36 
37 #ifndef G4INCLCascade_hh
38 #define G4INCLCascade_hh 1
39 
40 #include "G4INCLParticle.hh"
41 #include "G4INCLNucleus.hh"
43 #include "G4INCLCascadeAction.hh"
44 #include "G4INCLEventInfo.hh"
45 #include "G4INCLGlobalInfo.hh"
46 #include "G4INCLLogger.hh"
47 #include "G4INCLConfig.hh"
48 #include "G4INCLRootFinder.hh"
49 
50 namespace G4INCL {
51  class INCL {
52  public:
53  INCL(Config const * const config);
54 
55  ~INCL();
56 
58  INCL(const INCL &rhs);
59 
61  INCL &operator=(const INCL &rhs);
62 
63  G4bool prepareReaction(const ParticleSpecies &projectileSpecies, const G4double kineticEnergy, const G4int A, const G4int Z);
64  G4bool initializeTarget(const G4int A, const G4int Z);
65  inline const EventInfo &processEvent() {
66  return processEvent(
71  );
72  }
73  const EventInfo &processEvent(
74  ParticleSpecies const &projectileSpecies,
75  const G4double kineticEnergy,
76  const G4int targetA,
77  const G4int targetZ
78  );
79 
80  void finalizeGlobalInfo();
81  const GlobalInfo &getGlobalInfo() const { return theGlobalInfo; }
82 
83  private:
92  Config const * const theConfig;
95 
98 
101 
103  class RecoilFunctor : public RootFunctor {
104  public:
109  RecoilFunctor(Nucleus * const n, const EventInfo &ei) :
110  RootFunctor(0., 1E6),
111  nucleus(n),
112  outgoingParticles(n->getStore()->getOutgoingParticles()),
113  theEventInfo(ei) {
114  for(ParticleIter p=outgoingParticles.begin(), e=outgoingParticles.end(); p!=e; ++p) {
115  particleMomenta.push_back((*p)->getMomentum());
116  particleKineticEnergies.push_back((*p)->getKineticEnergy());
117  }
118  ProjectileRemnant * const aPR = n->getProjectileRemnant();
119  if(aPR && aPR->getA()>0) {
120  particleMomenta.push_back(aPR->getMomentum());
121  particleKineticEnergies.push_back(aPR->getKineticEnergy());
122  outgoingParticles.push_back(aPR);
123  }
124  }
125  virtual ~RecoilFunctor() {}
126 
132  G4double operator()(const G4double x) const {
134  return nucleus->getConservationBalance(theEventInfo,true).energy;
135  }
136 
138  void cleanUp(const G4bool success) const {
139  if(!success)
141  }
142 
143  private:
148  // \brief Reference to the EventInfo object
151  std::list<ThreeVector> particleMomenta;
153  std::list<G4double> particleKineticEnergies;
154 
159  void scaleParticleEnergies(const G4double rescale) const {
160  // Rescale the energies (and the momenta) of the outgoing particles.
161  ThreeVector pBalance = nucleus->getIncomingMomentum();
162  std::list<ThreeVector>::const_iterator iP = particleMomenta.begin();
163  std::list<G4double>::const_iterator iE = particleKineticEnergies.begin();
164  for( ParticleIter i = outgoingParticles.begin(), e = outgoingParticles.end(); i!=e; ++i, ++iP, ++iE)
165  {
166  const G4double mass = (*i)->getMass();
167  const G4double newKineticEnergy = (*iE) * rescale;
168 
169  (*i)->setMomentum(*iP);
170  (*i)->setEnergy(mass + newKineticEnergy);
171  (*i)->adjustMomentumFromEnergy();
172 
173  pBalance -= (*i)->getMomentum();
174  }
175 
176  nucleus->setMomentum(pBalance);
177  const G4double remnantMass = ParticleTable::getTableMass(nucleus->getA(),nucleus->getZ()) + nucleus->getExcitationEnergy();
178  const G4double pRem2 = pBalance.mag2();
179  const G4double recoilEnergy = pRem2/
180  (std::sqrt(pRem2+remnantMass*remnantMass) + remnantMass);
181  nucleus->setEnergy(remnantMass + recoilEnergy);
182  }
183  };
184 
186  class RecoilCMFunctor : public RootFunctor {
187  public:
192  RecoilCMFunctor(Nucleus * const n, const EventInfo &ei) :
193  RootFunctor(0., 1E6),
194  nucleus(n),
195  theIncomingMomentum(nucleus->getIncomingMomentum()),
196  outgoingParticles(n->getStore()->getOutgoingParticles()),
197  theEventInfo(ei) {
198  thePTBoostVector = nucleus->getIncomingMomentum()/nucleus->getInitialEnergy();
199  for(ParticleIter p=outgoingParticles.begin(), e=outgoingParticles.end(); p!=e; ++p) {
200  (*p)->boost(thePTBoostVector);
201  particleCMMomenta.push_back((*p)->getMomentum());
202  }
203  ProjectileRemnant * const aPR = n->getProjectileRemnant();
204  if(aPR && aPR->getA()>0) {
205  aPR->boost(thePTBoostVector);
206  particleCMMomenta.push_back(aPR->getMomentum());
207  outgoingParticles.push_back(aPR);
208  }
209  }
210  virtual ~RecoilCMFunctor() {}
211 
217  G4double operator()(const G4double x) const {
219  return nucleus->getConservationBalance(theEventInfo,true).energy;
220  }
221 
223  void cleanUp(const G4bool success) const {
224  if(!success)
226  }
227 
228  private:
237  // \brief Reference to the EventInfo object
240  std::list<ThreeVector> particleCMMomenta;
241 
246  void scaleParticleCMMomenta(const G4double rescale) const {
247  // Rescale the CM momenta of the outgoing particles.
248  ThreeVector remnantMomentum = theIncomingMomentum;
249  std::list<ThreeVector>::const_iterator iP = particleCMMomenta.begin();
250  for( ParticleIter i = outgoingParticles.begin(), e = outgoingParticles.end(); i!=e; ++i, ++iP)
251  {
252  (*i)->setMomentum(*iP * rescale);
253  (*i)->adjustEnergyFromMomentum();
254  (*i)->boost(-thePTBoostVector);
255 
256  remnantMomentum -= (*i)->getMomentum();
257  }
258 
259  nucleus->setMomentum(remnantMomentum);
260  const G4double remnantMass = ParticleTable::getTableMass(nucleus->getA(),nucleus->getZ()) + nucleus->getExcitationEnergy();
261  const G4double pRem2 = remnantMomentum.mag2();
262  const G4double recoilEnergy = pRem2/
263  (std::sqrt(pRem2+remnantMass*remnantMass) + remnantMass);
264  nucleus->setEnergy(remnantMass + recoilEnergy);
265  }
266  };
267 
274 
275 #ifndef INCLXX_IN_GEANT4_MODE
276 
285  void globalConservationChecks(G4bool afterRecoil);
286 #endif
287 
294 
313 
321  void makeCompoundNucleus();
322 
324  G4bool preCascade(ParticleSpecies const projectileSpecies, const G4double kineticEnergy);
325 
327  void cascade();
328 
330  void postCascade();
331 
336  void initMaxInteractionDistance(ParticleSpecies const &p, const G4double kineticEnergy);
337 
343  void initUniverseRadius(ParticleSpecies const &p, const G4double kineticEnergy, const G4int A, const G4int Z);
344 
346  void updateGlobalInfo();
347  };
348 }
349 
350 #endif
G4int getA() const
Returns the baryon number.
G4double operator()(const G4double x) const
Compute the energy-conservation violation.
G4double maxUniverseRadius
G4bool targetInitSuccess
ConservationBalance getConservationBalance(EventInfo const &theEventInfo, const G4bool afterRecoil) const
Compute charge, mass, energy and momentum balance.
G4int minRemnantSize
Remnant size below which cascade stops.
INCL & operator=(const INCL &rhs)
Dummy assignment operator to silence Coverity warning.
The INCL configuration object.
Definition: G4INCLConfig.hh:67
void cleanUp(const G4bool success) const
Clean up after root finding.
std::list< G4double > particleKineticEnergies
Initial kinetic energies of the outgoing particles.
const GlobalInfo & getGlobalInfo() const
G4bool prepareReaction(const ParticleSpecies &projectileSpecies, const G4double kineticEnergy, const G4int A, const G4int Z)
G4bool continueCascade()
Stopping criterion for the cascade.
void cascade()
The actual cascade loop.
G4double maxInteractionDistance
void postCascade()
Finalise the cascade and clean up.
G4int getTargetZ() const
Get the target charge number.
const ThreeVector & getIncomingMomentum() const
Get the incoming momentum vector.
std::list< ThreeVector > particleMomenta
Initial momenta of the outgoing particles.
Config const *const theConfig
void updateGlobalInfo()
Update global counters and other members of theGlobalInfo object.
const G4INCL::ThreeVector & getMomentum() const
Get the momentum vector.
G4double operator()(const G4double x) const
Compute the energy-conservation violation.
EventInfo const & theEventInfo
RecoilCMFunctor(Nucleus *const n, const EventInfo &ei)
Prepare for calling the () operator and scaleParticleEnergies.
Class to adjust remnant recoil.
void boost(const ThreeVector &aBoostVector)
Boost the cluster with the indicated velocity.
std::list< ThreeVector > particleCMMomenta
Initial CM momenta of the outgoing particles.
void finalizeGlobalInfo()
CascadeAction * cascadeAction
int G4int
Definition: G4Types.hh:78
Propagation model takes care of transporting the particles until something interesting (i...
G4double mag2() const
Get the square of the length.
Class containing default actions to be performed at intermediate cascade steps.
IPropagationModel * propagationModel
Nucleus * nucleus
Pointer to the nucleus.
ParticleList outgoingParticles
List of final-state particles.
void setEnergy(G4double energy)
Set the energy of the particle in MeV.
G4bool preCascade(ParticleSpecies const projectileSpecies, const G4double kineticEnergy)
Initialise the cascade.
void cleanUp(const G4bool success) const
Clean up after root finding.
G4double fixedImpactParameter
void rescaleOutgoingForRecoil()
Rescale the energies of the outgoing particles.
ThreeVector thePTBoostVector
Projectile-target CM boost vector.
G4double getInitialEnergy() const
Get the initial energy.
INCL(Config const *const config)
void initMaxInteractionDistance(ParticleSpecies const &p, const G4double kineticEnergy)
Initialise the maximum interaction distance.
Simple container for output of calculation-wide results.
Simple container for output of event results.
GlobalInfo theGlobalInfo
bool G4bool
Definition: G4Types.hh:79
void initUniverseRadius(ParticleSpecies const &p, const G4double kineticEnergy, const G4int A, const G4int Z)
Initialize the universe radius.
G4int getTargetA() const
Get the target mass number.
const EventInfo & processEvent()
void scaleParticleCMMomenta(const G4double rescale) const
Scale the kinetic energies of the outgoing particles.
G4int getZ() const
Returns the charge number.
RecoilFunctor(Nucleus *const n, const EventInfo &ei)
Prepare for calling the () operator and scaleParticleEnergies.
G4double getExcitationEnergy() const
Get the excitation energy of the nucleus.
Class to adjust remnant recoil in the reaction CM system.
const G4int n
static const G4double A[nN]
G4bool initializeTarget(const G4int A, const G4int Z)
G4double maxImpactParameter
ParticleSpecies getProjectileSpecies() const
Get the projectile species.
G4ThreadLocal NuclearMassFn getTableMass
Static pointer to the mass function for nuclei.
void makeCompoundNucleus()
Make a compound nucleus.
ThreeVector theIncomingMomentum
Incoming momentum.
ProjectileRemnant * getProjectileRemnant() const
Get the projectile remnant.
G4bool forceTransparent
G4double getKineticEnergy() const
Get the particle kinetic energy.
void scaleParticleEnergies(const G4double rescale) const
Scale the kinetic energies of the outgoing particles.
double G4double
Definition: G4Types.hh:76
ParticleList outgoingParticles
List of final-state particles.
Nucleus * nucleus
G4double getProjectileKineticEnergy() const
Get the projectile kinetic energy.
G4int makeProjectileRemnant()
Make a projectile pre-fragment out of geometrical spectators.
Nucleus * nucleus
Pointer to the nucleus.
EventInfo theEventInfo
ParticleList::const_iterator ParticleIter
Static root-finder algorithm.
virtual void setMomentum(const G4INCL::ThreeVector &momentum)
Set the momentum vector.
EventInfo const & theEventInfo