Geant4  10.01.p01
G4INCLStandardPropagationModel.cc
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 // Alain Boudard, CEA-Saclay, France
28 // Joseph Cugnon, University of Liege, Belgium
29 // Jean-Christophe David, CEA-Saclay, France
30 // Pekka Kaitaniemi, CEA-Saclay, France, and Helsinki Institute of Physics, Finland
31 // Sylvie Leray, CEA-Saclay, France
32 // Davide Mancusi, CEA-Saclay, France
33 //
34 #define INCLXX_IN_GEANT4_MODE 1
35 
36 #include "globals.hh"
37 
38 /*
39  * StandardPropagationModel.cpp
40  *
41  * \date 4 juin 2009
42  * \author Pekka Kaitaniemi
43  */
44 
46 #include "G4INCLSurfaceAvatar.hh"
48 #include "G4INCLDecayAvatar.hh"
49 #include "G4INCLCrossSections.hh"
50 #include "G4INCLRandom.hh"
51 #include <iostream>
52 #include <algorithm>
53 #include "G4INCLLogger.hh"
54 #include "G4INCLGlobals.hh"
55 #include "G4INCLKinematicsUtils.hh"
59 #include "G4INCLIntersection.hh"
60 
61 namespace G4INCL {
62 
64  :theNucleus(0), maximumTime(70.0), currentTime(0.0), firstAvatar(true),
65  theLocalEnergyType(localEnergyType),
66  theLocalEnergyDeltaType(localEnergyDeltaType)
67  {
68  }
69 
71  {
72  delete theNucleus;
73  }
74 
76  {
77  return theNucleus;
78  }
79 
80  G4double StandardPropagationModel::shoot(ParticleSpecies const &projectileSpecies, const G4double kineticEnergy, const G4double impactParameter, const G4double phi) {
81  if(projectileSpecies.theType==Composite)
82  return shootComposite(projectileSpecies, kineticEnergy, impactParameter, phi);
83  else
84  return shootParticle(projectileSpecies.theType, kineticEnergy, impactParameter, phi);
85  }
86 
87  G4double StandardPropagationModel::shootParticle(ParticleType const type, const G4double kineticEnergy, const G4double impactParameter, const G4double phi) {
89  currentTime = 0.0;
90 
91  // Create the projectile particle
92  const G4double projectileMass = ParticleTable::getTableParticleMass(type);
93  G4double energy = kineticEnergy + projectileMass;
94  G4double momentumZ = std::sqrt(energy*energy - projectileMass*projectileMass);
95  ThreeVector momentum(0.0, 0.0, momentumZ);
96  Particle *p= new G4INCL::Particle(type, energy, momentum, ThreeVector());
97 
98  G4double temfin;
99  G4double TLab;
100  if( p->isPion() ) {
101  temfin = 30.18 * std::pow(theNucleus->getA(), 0.17);
102  TLab = p->getKineticEnergy();
103  } else {
104  temfin = 29.8 * std::pow(theNucleus->getA(), 0.16);
105  TLab = p->getKineticEnergy()/p->getA();
106  }
107 
108  // energy-dependent stopping time above 2 AGeV
109  if(TLab>2000.)
110  temfin *= (5.8E4-TLab)/5.6E4;
111 
112  maximumTime = temfin;
113 
114  // If the incoming particle is slow, use a larger stopping time
115  const G4double rMax = theNucleus->getUniverseRadius();
116  const G4double distance = 2.*rMax;
117  const G4double projectileVelocity = p->boostVector().mag();
118  const G4double traversalTime = distance / projectileVelocity;
119  if(maximumTime < traversalTime)
120  maximumTime = traversalTime;
121  INCL_DEBUG("Cascade stopping time is " << maximumTime << '\n');
122 
123  // If Coulomb is activated, do not process events with impact
124  // parameter larger than the maximum impact parameter, taking into
125  // account Coulomb distortion.
126  if(impactParameter>CoulombDistortion::maxImpactParameter(p->getSpecies(), kineticEnergy, theNucleus)) {
127  INCL_DEBUG("impactParameter>CoulombDistortion::maxImpactParameter" << '\n');
128  delete p;
129  return -1.;
130  }
131 
132  ThreeVector position(impactParameter * std::cos(phi),
133  impactParameter * std::sin(phi),
134  0.);
135  p->setPosition(position);
136 
137  // Fill in the relevant kinematic variables
142 
143  // Reset the particle kinematics to the INCL values
144  p->setINCLMass();
145  p->setEnergy(p->getMass() + kineticEnergy);
147 
150  firstAvatar = false;
151 
152  // Get the entry avatars from Coulomb and put them in the Store
154  if(theEntryAvatar) {
155  theNucleus->getStore()->addParticleEntryAvatar(theEntryAvatar);
156 
157  return p->getTransversePosition().mag();
158  } else {
159  delete p;
160  return -1.;
161  }
162  }
163 
164  G4double StandardPropagationModel::shootComposite(ParticleSpecies const &species, const G4double kineticEnergy, const G4double impactParameter, const G4double phi) {
166  currentTime = 0.0;
167 
168  // Create the ProjectileRemnant object
169  ProjectileRemnant *pr = new ProjectileRemnant(species, kineticEnergy);
170 
171  // Same stopping time as for nucleon-nucleus
172  maximumTime = 29.8 * std::pow(theNucleus->getA(), 0.16);
173 
174  // If the incoming cluster is slow, use a larger stopping time
175  const G4double rms = ParticleTable::getLargestNuclearRadius(pr->getA(), pr->getZ());
176  const G4double rMax = theNucleus->getUniverseRadius();
177  const G4double distance = 2.*rMax + 2.725*rms;
178  const G4double projectileVelocity = pr->boostVector().mag();
179  const G4double traversalTime = distance / projectileVelocity;
180  if(maximumTime < traversalTime)
181  maximumTime = traversalTime;
182  INCL_DEBUG("Cascade stopping time is " << maximumTime << '\n');
183 
184  // If Coulomb is activated, do not process events with impact
185  // parameter larger than the maximum impact parameter, taking into
186  // account Coulomb distortion.
187  if(impactParameter>CoulombDistortion::maxImpactParameter(pr,theNucleus)) {
188  INCL_DEBUG("impactParameter>CoulombDistortion::maxImpactParameter" << '\n');
189  delete pr;
190  return -1.;
191  }
192 
193  // Position the cluster at the right impact parameter
194  ThreeVector position(impactParameter * std::cos(phi),
195  impactParameter * std::sin(phi),
196  0.);
197  pr->setPosition(position);
198 
199  // Fill in the relevant kinematic variables
204 
206  firstAvatar = false;
207 
208  // Get the entry avatars from Coulomb
209  IAvatarList theAvatarList
211 
212  if(theAvatarList.empty()) {
213  INCL_DEBUG("No ParticleEntryAvatar found, transparent event" << '\n');
214  delete pr;
215  return -1.;
216  }
217 
218  /* Store the internal kinematics of the projectile remnant.
219  *
220  * Note that this is at variance with the Fortran version, which stores
221  * the initial kinematics of the particles *after* putting the spectators
222  * on mass shell, but *before* removing the same energy from the
223  * participants. Due to the different code flow, doing so in the C++
224  * version leads to wrong excitation energies for the forced compound
225  * nucleus.
226  */
227  pr->storeComponents();
228 
229  // Tell the Nucleus about the ProjectileRemnant
231 
232  // Register the ParticleEntryAvatars
233  theNucleus->getStore()->addParticleEntryAvatars(theAvatarList);
234 
235  return pr->getTransversePosition().mag();
236  }
237 
239  return maximumTime;
240  }
241 
243 // assert(time>0.0);
244  maximumTime = time;
245  }
246 
248  return currentTime;
249  }
250 
252  {
253  theNucleus = nucleus;
254  }
255 
257  {
258  if(anAvatar) theNucleus->getStore()->add(anAvatar);
259  }
260 
262  // Is either particle a participant?
263  if(!p1->isParticipant() && !p2->isParticipant() && p1->getParticipantType()==p2->getParticipantType()) return NULL;
264 
265  // Is it a pi-resonance collision (we don't treat them)?
266  if((p1->isResonance() && p2->isPion()) || (p1->isPion() && p2->isResonance()))
267  return NULL;
268 
269  // Will the avatar take place between now and the end of the cascade?
270  G4double minDistOfApproachSquared = 0.0;
271  G4double t = getTime(p1, p2, &minDistOfApproachSquared);
272  if(t>maximumTime || t<currentTime) return NULL;
273 
274  // Local energy. Jump through some hoops to calculate the cross section
275  // at the collision point, and clean up after yourself afterwards.
276  G4bool hasLocalEnergy;
277  if(p1->isPion() || p2->isPion())
278  hasLocalEnergy = ((theLocalEnergyDeltaType == FirstCollisionLocalEnergy &&
281  else
282  hasLocalEnergy = ((theLocalEnergyType == FirstCollisionLocalEnergy &&
285  const G4bool p1HasLocalEnergy = (hasLocalEnergy && !p1->isPion());
286  const G4bool p2HasLocalEnergy = (hasLocalEnergy && !p2->isPion());
287 
288  if(p1HasLocalEnergy) {
289  backupParticle1 = *p1;
290  p1->propagate(t - currentTime);
291  if(p1->getPosition().mag() > theNucleus->getSurfaceRadius(p1)) {
292  *p1 = backupParticle1;
293  return NULL;
294  }
296  }
297  if(p2HasLocalEnergy) {
298  backupParticle2 = *p2;
299  p2->propagate(t - currentTime);
300  if(p2->getPosition().mag() > theNucleus->getSurfaceRadius(p2)) {
301  *p2 = backupParticle2;
302  if(p1HasLocalEnergy) {
303  *p1 = backupParticle1;
304  }
305  return NULL;
306  }
308  }
309 
310  // Compute the total cross section
311  const G4double totalCrossSection = CrossSections::total(p1, p2);
313 
314  // Restore particles to their state before the local-energy tweak
315  if(p1HasLocalEnergy) {
316  *p1 = backupParticle1;
317  }
318  if(p2HasLocalEnergy) {
319  *p2 = backupParticle2;
320  }
321 
322  // Is the CM energy > cutNN? (no cutNN on the first collision)
324  && p1->isNucleon() && p2->isNucleon()
325  && squareTotalEnergyInCM < BinaryCollisionAvatar::getCutNNSquared()) return NULL;
326 
327  // Do the particles come close enough to each other?
328  if(Math::tenPi*minDistOfApproachSquared > totalCrossSection) return NULL;
329 
330  // Bomb out if the two collision partners are the same particle
331 // assert(p1->getID() != p2->getID());
332 
333  // Return a new avatar, then!
334  return new G4INCL::BinaryCollisionAvatar(t, totalCrossSection, theNucleus, p1, p2);
335  }
336 
338  Intersection theIntersection(
340  aParticle->getPosition(),
341  aParticle->getPropagationVelocity(),
342  theNucleus->getSurfaceRadius(aParticle)));
343  G4double time;
344  if(theIntersection.exists) {
345  time = currentTime + theIntersection.time;
346  } else {
347  INCL_ERROR("Imaginary reflection time for particle: " << '\n'
348  << aParticle->print());
349  time = 10000.0;
350  }
351  return time;
352  }
353 
355  G4INCL::Particle const * const particleB, G4double *minDistOfApproach) const
356  {
357  G4double time;
358  G4INCL::ThreeVector t13 = particleA->getPropagationVelocity();
359  t13 -= particleB->getPropagationVelocity();
360  G4INCL::ThreeVector distance = particleA->getPosition();
361  distance -= particleB->getPosition();
362  const G4double t7 = t13.dot(distance);
363  const G4double dt = t13.mag2();
364  if(dt <= 1.0e-10) {
365  (*minDistOfApproach) = 100000.0;
366  return currentTime + 100000.0;
367  } else {
368  time = -t7/dt;
369  }
370  (*minDistOfApproach) = distance.mag2() + time * t7;
371  return currentTime + time;
372  }
373 
374  void StandardPropagationModel::generateUpdatedCollisions(const ParticleList &updatedParticles, const ParticleList &particles) {
375 
376  // Loop over all the updated particles
377  for(ParticleIter updated=updatedParticles.begin(), e=updatedParticles.end(); updated!=e; ++updated)
378  {
379  // Loop over all the particles
380  for(ParticleIter particle=particles.begin(), end=particles.end(); particle!=end; ++particle)
381  {
382  /* Consider the generation of a collision avatar only if (*particle)
383  * is not one of the updated particles.
384  * The criterion makes sure that you don't generate avatars between
385  * updated particles. */
386  if(updatedParticles.contains(*particle)) continue;
387 
388  registerAvatar(generateBinaryCollisionAvatar(*particle,*updated));
389  }
390  }
391  }
392 
394  // Loop over all the particles
395  for(ParticleIter p1=particles.begin(), e=particles.end(); p1!=e; ++p1) {
396  // Loop over the rest of the particles
397  for(ParticleIter p2 = p1 + 1; p2 != particles.end(); ++p2) {
399  }
400  }
401  }
402 
404 
405  const G4bool haveExcept = !except.empty();
406 
407  // Loop over all the particles
408  for(ParticleIter p1=particles.begin(), e=particles.end(); p1!=e; ++p1)
409  {
410  // Loop over the rest of the particles
411  ParticleIter p2 = p1;
412  for(++p2; p2 != particles.end(); ++p2)
413  {
414  // Skip the collision if both particles must be excluded
415  if(haveExcept && except.contains(*p1) && except.contains(*p2)) continue;
416 
418  }
419  }
420 
421  }
422 
424 
425  for(ParticleIter iter=particles.begin(), e=particles.end(); iter!=e; ++iter) {
426  G4double time = this->getReflectionTime(*iter);
427  if(time <= maximumTime) registerAvatar(new SurfaceAvatar(*iter, time, theNucleus));
428  }
429  ParticleList const &p = theNucleus->getStore()->getParticles();
430  generateUpdatedCollisions(particles, p); // Predict collisions with spectators and participants
431  }
432 
434  ParticleList const &particles = theNucleus->getStore()->getParticles();
435 // assert(!particles.empty());
436  G4double time;
437  for(ParticleIter i=particles.begin(), e=particles.end(); i!=e; ++i) {
438  time = this->getReflectionTime(*i);
439  if(time <= maximumTime) registerAvatar(new SurfaceAvatar(*i, time, theNucleus));
440  }
441  generateCollisions(particles);
442  generateDecays(particles);
443  }
444 
445 #ifdef INCL_REGENERATE_AVATARS
446  void StandardPropagationModel::generateAllAvatarsExceptUpdated(FinalState const * const fs) {
447  ParticleList const &particles = theNucleus->getStore()->getParticles();
448 // assert(!particles.empty());
449  for(ParticleIter i=particles.begin(), e=particles.end(); i!=e; ++i) {
450  G4double time = this->getReflectionTime(*i);
451  if(time <= maximumTime) registerAvatar(new SurfaceAvatar(*i, time, theNucleus));
452  }
453  ParticleList except = fs->getModifiedParticles();
454  ParticleList const &entering = fs->getEnteringParticles();
455  except.insert(except.end(), entering.begin(), entering.end());
456  generateCollisions(particles,except);
457  generateDecays(particles);
458  }
459 #endif
460 
462  for(ParticleIter i=particles.begin(), e=particles.end(); i!=e; ++i) {
463  if((*i)->isDelta()) {
465  G4double time = currentTime + decayTime;
466  if(time <= maximumTime) {
467  registerAvatar(new DecayAvatar((*i), time, theNucleus));
468  }
469  }
470  }
471  }
472 
474  {
475  if(fs) {
476  // We update only the information related to particles that were updated
477  // by the previous avatar.
478 #ifdef INCL_REGENERATE_AVATARS
479 #warning "The INCL_REGENERATE_AVATARS code has not been tested in a while. Use it at your peril."
480  if(!fs->getModifiedParticles().empty() || !fs->getEnteringParticles().empty() || !fs->getCreatedParticles().empty()) {
481  // Regenerates the entire avatar list, skipping collisions between
482  // updated particles
484  theNucleus->getStore()->initialiseParticleAvatarConnections();
485  generateAllAvatarsExceptUpdated(fs);
486  }
487 #else
488  ParticleList const &updatedParticles = fs->getModifiedParticles();
489  if(fs->getValidity()==PauliBlockedFS) {
490  // This final state might represents the outcome of a Pauli-blocked delta
491  // decay
492 // assert(updatedParticles.empty() || (updatedParticles.size()==1 && updatedParticles.front()->isResonance()));
493 // assert(fs->getEnteringParticles().empty() && fs->getCreatedParticles().empty() && fs->getOutgoingParticles().empty() && fs->getDestroyedParticles().empty());
494  generateDecays(updatedParticles);
495  } else {
496  ParticleList const &entering = fs->getEnteringParticles();
497  generateDecays(updatedParticles);
498  generateDecays(entering);
499 
500  ParticleList const &created = fs->getCreatedParticles();
501  if(created.empty() && entering.empty())
502  updateAvatars(updatedParticles);
503  else {
504  ParticleList updatedParticlesCopy = updatedParticles;
505  updatedParticlesCopy.insert(updatedParticlesCopy.end(), entering.begin(), entering.end());
506  updatedParticlesCopy.insert(updatedParticlesCopy.end(), created.begin(), created.end());
507  updateAvatars(updatedParticlesCopy);
508  }
509  }
510 #endif
511  }
512 
514  if(theAvatar == 0) return 0; // Avatar list is empty
515  // theAvatar->dispose();
516 
517  if(theAvatar->getTime() < currentTime) {
518  INCL_ERROR("Avatar time = " << theAvatar->getTime() << ", currentTime = " << currentTime << '\n');
519  return 0;
520  } else if(theAvatar->getTime() > currentTime) {
521  theNucleus->getStore()->timeStep(theAvatar->getTime() - currentTime);
522 
523  currentTime = theAvatar->getTime();
525  }
526 
527  return theAvatar;
528  }
529 }
G4int getA() const
Returns the baryon number.
G4double shootComposite(ParticleSpecies const &s, const G4double kineticEnergy, const G4double impactParameter, const G4double phi)
G4double shoot(ParticleSpecies const &projectileSpecies, const G4double kineticEnergy, const G4double impactParameter, const G4double phi)
void clearAvatars()
Clear avatars only.
Definition: G4INCLStore.cc:193
void registerAvatar(G4INCL::IAvatar *anAvatar)
Add an avatar to the storage.
ParticleEntryAvatar * bringToSurface(Particle *p, Nucleus *const n)
Modify the momentum of an incoming particle and position it on the surface of the nucleus...
G4bool isResonance() const
Is it a resonance?
FinalStateValidity getValidity() const
void generateAllAvatars()
(Re)Generate all possible avatars.
G4double getMass() const
Get the cached particle mass.
void setIncomingAngularMomentum(const ThreeVector &j)
Set the incoming angular-momentum vector.
void setIncomingMomentum(const ThreeVector &p)
Set the incoming momentum vector.
G4ThreadLocal ParticleMassFn getTableParticleMass
Static pointer to the mass function for particles.
G4double dot(const ThreeVector &v) const
Dot product.
ParticleList const & getParticles() const
Return the list of "active" particles (i.e.
Definition: G4INCLStore.hh:253
void transformToLocalEnergyFrame(Nucleus const *const n, Particle *const p)
G4int getAcceptedCollisions() const
Definition: G4INCLBook.hh:100
ThreeVector getPropagationVelocity() const
Get the propagation velocity of the particle.
void setInitialEnergy(const G4double e)
Set the initial energy.
G4double squareTotalEnergyInCM(Particle const *const p1, Particle const *const p2)
ParticleList const & getModifiedParticles() const
StandardPropagationModel(LocalEnergyType localEnergyType, LocalEnergyType localEnergyDeltaType)
void generateCollisions(const ParticleList &particles)
Generate and register collisions among particles in a list, except between those in another list...
const G4double tenPi
#define INCL_ERROR(x)
IAvatar * findSmallestTime()
Find the avatar that has the smallest time.
Definition: G4INCLStore.cc:142
const G4INCL::ThreeVector & getMomentum() const
Get the momentum vector.
G4INCL::IAvatar * propagate(FinalState const *const fs)
Propagate all particles and return the first avatar.
Store * getStore() const
void setParticleNucleusCollision()
Set a particle-nucleus collision.
std::string print() const
void add(Particle *p)
Add one particle to the store.
Definition: G4INCLStore.cc:58
G4double getReflectionTime(G4INCL::Particle const *const aParticle)
Get the reflection time.
void updateAvatars(const ParticleList &particles)
Update all avatars related to a particle.
void storeComponents()
Store the projectile components.
G4double getEnergy() const
Get the energy of the particle in MeV.
void setINCLMass()
Set the mass of the Particle to its table mass.
virtual void makeProjectileSpectator()
void propagate(G4double step)
G4double maxImpactParameter(ParticleSpecies const &p, const G4double kinE, Nucleus const *const n)
Return the maximum impact parameter for Coulomb-distorted trajectories.
void setNucleus(G4INCL::Nucleus *nucleus)
Set the nucleus for this propagation model.
G4double getSurfaceRadius(Particle const *const particle) const
Get the maximum allowed radius for a given particle.
G4bool isParticipant() const
ThreeVector boostVector() const
Returns a three vector we can give to the boost() -method.
void setStoppingTime(G4double)
Set the stopping time of the simulation.
G4double mag2() const
Get the square of the length.
G4double getTime(G4INCL::Particle const *const particleA, G4INCL::Particle const *const particleB, G4double *minDistOfApproach) const
Get the predicted time of the collision between two particles.
void setEnergy(G4double energy)
Set the energy of the particle in MeV.
Intersection getLaterTrajectoryIntersection(const ThreeVector &x0, const ThreeVector &p, const G4double r)
Compute the second intersection of a straight particle trajectory with a sphere.
G4INCL::ThreeVector getAngularMomentum() const
Get the total angular momentum (orbital + spin)
static G4double computeDecayTime(Particle *p)
void addParticleEntryAvatars(IAvatarList const &al)
Add one ParticleEntry avatar.
Definition: G4INCLStore.cc:78
ParticleList const & getCreatedParticles() const
G4double getTime() const
Static class for selecting Coulomb distortion.
Final state of an interaction.
#define position
Definition: xmlparse.cc:605
Book & getBook()
Return the pointer to the Book object which keeps track of various counters.
Definition: G4INCLStore.hh:259
ParticipantType getParticipantType() const
G4double getLargestNuclearRadius(const G4int A, const G4int Z)
bool G4bool
Definition: G4Types.hh:79
virtual G4INCL::ThreeVector getAngularMomentum() const
Get the angular momentum w.r.t.
virtual void setPosition(const G4INCL::ThreeVector &position)
G4double getCurrentTime()
Returns the current global time of the system.
G4int getZ() const
Returns the charge number.
ThreeVector getTransversePosition() const
Transverse component of the position w.r.t.
IAvatar * generateBinaryCollisionAvatar(Particle *const p1, Particle *const p2)
Generate a two-particle avatar.
void generateDecays(const ParticleList &particles)
Generate decays for particles that can decay.
void addParticleEntryAvatar(IAvatar *a)
Add one ParticleEntry avatar.
Definition: G4INCLStore.cc:66
G4INCL::Nucleus * getNucleus()
Get the nucleus.
G4double total(Particle const *const p1, Particle const *const p2)
G4double energy(const ThreeVector &p, const G4double m)
G4ThreadLocal NuclearMassFn getTableMass
Static pointer to the mass function for nuclei.
void setProjectileRemnant(ProjectileRemnant *const c)
Set the projectile remnant.
ParticleList const & getEnteringParticles() const
const G4INCL::ThreeVector & getPosition() const
Set the position vector.
G4bool isNucleon() const
Is this a nucleon?
void setCurrentTime(G4double t)
Definition: G4INCLBook.hh:97
G4double getKineticEnergy() const
Get the particle kinetic energy.
virtual G4INCL::ParticleSpecies getSpecies() const
Get the particle species.
G4double getUniverseRadius() const
Getter for theUniverseRadius.
G4bool contains(const T &t) const
Intersection-point structure.
G4double mag() const
Get the length of the vector.
double G4double
Definition: G4Types.hh:76
#define INCL_DEBUG(x)
G4double shootParticle(ParticleType const t, const G4double kineticEnergy, const G4double impactParameter, const G4double phi)
void generateUpdatedCollisions(const ParticleList &updatedParticles, const ParticleList &particles)
Generate and register collisions between a list of updated particles and all the other particles...
G4bool isPion() const
Is this a pion?
const ThreeVector & adjustMomentumFromEnergy()
Rescale the momentum to match the total energy.
void setNucleusNucleusCollision()
Set a nucleus-nucleus collision.
G4double getStoppingTime()
Get the current stopping time.
void timeStep(G4double step)
Make one time step: propagate particles and subtract the length of the step from the avatar times...
Definition: G4INCLStore.cc:168
void setPosition(const ThreeVector &position)
Set the position of the cluster.
ParticleList::const_iterator ParticleIter
Simple class for computing intersections between a straight line and a sphere.