Geant4  10.02.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),
65  hadronizationTime(hTime),
66  firstAvatar(true),
67  theLocalEnergyType(localEnergyType),
68  theLocalEnergyDeltaType(localEnergyDeltaType)
69  {
70  }
71 
73  {
74  delete theNucleus;
75  }
76 
78  {
79  return theNucleus;
80  }
81 
82  G4double StandardPropagationModel::shoot(ParticleSpecies const &projectileSpecies, const G4double kineticEnergy, const G4double impactParameter, const G4double phi) {
83  if(projectileSpecies.theType==Composite)
84  return shootComposite(projectileSpecies, kineticEnergy, impactParameter, phi);
85  else
86  return shootParticle(projectileSpecies.theType, kineticEnergy, impactParameter, phi);
87  }
88 
89  G4double StandardPropagationModel::shootParticle(ParticleType const type, const G4double kineticEnergy, const G4double impactParameter, const G4double phi) {
91  currentTime = 0.0;
92 
93  // Create the projectile particle
94  const G4double projectileMass = ParticleTable::getTableParticleMass(type);
95  G4double energy = kineticEnergy + projectileMass;
96  G4double momentumZ = std::sqrt(energy*energy - projectileMass*projectileMass);
97  ThreeVector momentum(0.0, 0.0, momentumZ);
98  Particle *p= new G4INCL::Particle(type, energy, momentum, ThreeVector());
99 
100  G4double temfin;
101  G4double TLab;
102  if( p->isPion() ) {
103  temfin = 30.18 * std::pow(theNucleus->getA(), 0.17);
104  TLab = p->getKineticEnergy();
105  } else {
106  temfin = 29.8 * std::pow(theNucleus->getA(), 0.16);
107  TLab = p->getKineticEnergy()/p->getA();
108  }
109 
110  // energy-dependent stopping time above 2 AGeV
111  if(TLab>2000.)
112  temfin *= (5.8E4-TLab)/5.6E4;
113 
114  maximumTime = temfin;
115 
116  // If the incoming particle is slow, use a larger stopping time
117  const G4double rMax = theNucleus->getUniverseRadius();
118  const G4double distance = 2.*rMax;
119  const G4double projectileVelocity = p->boostVector().mag();
120  const G4double traversalTime = distance / projectileVelocity;
121  if(maximumTime < traversalTime)
122  maximumTime = traversalTime;
123  INCL_DEBUG("Cascade stopping time is " << maximumTime << '\n');
124 
125  // If Coulomb is activated, do not process events with impact
126  // parameter larger than the maximum impact parameter, taking into
127  // account Coulomb distortion.
128  if(impactParameter>CoulombDistortion::maxImpactParameter(p->getSpecies(), kineticEnergy, theNucleus)) {
129  INCL_DEBUG("impactParameter>CoulombDistortion::maxImpactParameter" << '\n');
130  delete p;
131  return -1.;
132  }
133 
134  ThreeVector position(impactParameter * std::cos(phi),
135  impactParameter * std::sin(phi),
136  0.);
137  p->setPosition(position);
138 
139  // Fill in the relevant kinematic variables
144 
145  // Reset the particle kinematics to the INCL values
146  p->setINCLMass();
147  p->setEnergy(p->getMass() + kineticEnergy);
149 
152  firstAvatar = false;
153 
154  // Get the entry avatars from Coulomb and put them in the Store
156  if(theEntryAvatar) {
157  theNucleus->getStore()->addParticleEntryAvatar(theEntryAvatar);
158 
159  return p->getTransversePosition().mag();
160  } else {
161  delete p;
162  return -1.;
163  }
164  }
165 
166  G4double StandardPropagationModel::shootComposite(ParticleSpecies const &species, const G4double kineticEnergy, const G4double impactParameter, const G4double phi) {
168  currentTime = 0.0;
169 
170  // Create the ProjectileRemnant object
171  ProjectileRemnant *pr = new ProjectileRemnant(species, kineticEnergy);
172 
173  // Same stopping time as for nucleon-nucleus
174  maximumTime = 29.8 * std::pow(theNucleus->getA(), 0.16);
175 
176  // If the incoming cluster is slow, use a larger stopping time
177  const G4double rms = ParticleTable::getLargestNuclearRadius(pr->getA(), pr->getZ());
178  const G4double rMax = theNucleus->getUniverseRadius();
179  const G4double distance = 2.*rMax + 2.725*rms;
180  const G4double projectileVelocity = pr->boostVector().mag();
181  const G4double traversalTime = distance / projectileVelocity;
182  if(maximumTime < traversalTime)
183  maximumTime = traversalTime;
184  INCL_DEBUG("Cascade stopping time is " << maximumTime << '\n');
185 
186  // If Coulomb is activated, do not process events with impact
187  // parameter larger than the maximum impact parameter, taking into
188  // account Coulomb distortion.
189  if(impactParameter>CoulombDistortion::maxImpactParameter(pr,theNucleus)) {
190  INCL_DEBUG("impactParameter>CoulombDistortion::maxImpactParameter" << '\n');
191  delete pr;
192  return -1.;
193  }
194 
195  // Position the cluster at the right impact parameter
196  ThreeVector position(impactParameter * std::cos(phi),
197  impactParameter * std::sin(phi),
198  0.);
199  pr->setPosition(position);
200 
201  // Fill in the relevant kinematic variables
206 
208  firstAvatar = false;
209 
210  // Get the entry avatars from Coulomb
211  IAvatarList theAvatarList
213 
214  if(theAvatarList.empty()) {
215  INCL_DEBUG("No ParticleEntryAvatar found, transparent event" << '\n');
216  delete pr;
217  return -1.;
218  }
219 
220  /* Store the internal kinematics of the projectile remnant.
221  *
222  * Note that this is at variance with the Fortran version, which stores
223  * the initial kinematics of the particles *after* putting the spectators
224  * on mass shell, but *before* removing the same energy from the
225  * participants. Due to the different code flow, doing so in the C++
226  * version leads to wrong excitation energies for the forced compound
227  * nucleus.
228  */
229  pr->storeComponents();
230 
231  // Tell the Nucleus about the ProjectileRemnant
233 
234  // Register the ParticleEntryAvatars
235  theNucleus->getStore()->addParticleEntryAvatars(theAvatarList);
236 
237  return pr->getTransversePosition().mag();
238  }
239 
241  return maximumTime;
242  }
243 
245 // assert(time>0.0);
246  maximumTime = time;
247  }
248 
250  return currentTime;
251  }
252 
254  {
255  theNucleus = nucleus;
256  }
257 
259  {
260  if(anAvatar) theNucleus->getStore()->add(anAvatar);
261  }
262 
264  // Is either particle a participant?
265  if(!p1->isParticipant() && !p2->isParticipant() && p1->getParticipantType()==p2->getParticipantType()) return NULL;
266 
267  // Is it a pi-resonance collision (we don't treat them)?
268  if((p1->isResonance() && p2->isPion()) || (p1->isPion() && p2->isResonance()))
269  return NULL;
270 
271  // Will the avatar take place between now and the end of the cascade?
272  G4double minDistOfApproachSquared = 0.0;
273  G4double t = getTime(p1, p2, &minDistOfApproachSquared);
274  if(t>maximumTime || t<currentTime+hadronizationTime) return NULL;
275 
276  // Local energy. Jump through some hoops to calculate the cross section
277  // at the collision point, and clean up after yourself afterwards.
278  G4bool hasLocalEnergy;
279  if(p1->isPion() || p2->isPion())
280  hasLocalEnergy = ((theLocalEnergyDeltaType == FirstCollisionLocalEnergy &&
283  else
284  hasLocalEnergy = ((theLocalEnergyType == FirstCollisionLocalEnergy &&
287  const G4bool p1HasLocalEnergy = (hasLocalEnergy && !p1->isPion());
288  const G4bool p2HasLocalEnergy = (hasLocalEnergy && !p2->isPion());
289 
290  if(p1HasLocalEnergy) {
291  backupParticle1 = *p1;
292  p1->propagate(t - currentTime);
293  if(p1->getPosition().mag() > theNucleus->getSurfaceRadius(p1)) {
294  *p1 = backupParticle1;
295  return NULL;
296  }
298  }
299  if(p2HasLocalEnergy) {
300  backupParticle2 = *p2;
301  p2->propagate(t - currentTime);
302  if(p2->getPosition().mag() > theNucleus->getSurfaceRadius(p2)) {
303  *p2 = backupParticle2;
304  if(p1HasLocalEnergy) {
305  *p1 = backupParticle1;
306  }
307  return NULL;
308  }
310  }
311 
312  // Compute the total cross section
313  const G4double totalCrossSection = CrossSections::total(p1, p2);
315 
316  // Restore particles to their state before the local-energy tweak
317  if(p1HasLocalEnergy) {
318  *p1 = backupParticle1;
319  }
320  if(p2HasLocalEnergy) {
321  *p2 = backupParticle2;
322  }
323 
324  // Is the CM energy > cutNN? (no cutNN on the first collision)
326  && p1->isNucleon() && p2->isNucleon()
327  && squareTotalEnergyInCM < BinaryCollisionAvatar::getCutNNSquared()) return NULL;
328 
329  // Do the particles come close enough to each other?
330  if(Math::tenPi*minDistOfApproachSquared > totalCrossSection) return NULL;
331 
332  // Bomb out if the two collision partners are the same particle
333 // assert(p1->getID() != p2->getID());
334 
335  // Return a new avatar, then!
336  return new G4INCL::BinaryCollisionAvatar(t, totalCrossSection, theNucleus, p1, p2);
337  }
338 
340  Intersection theIntersection(
342  aParticle->getPosition(),
343  aParticle->getPropagationVelocity(),
344  theNucleus->getSurfaceRadius(aParticle)));
345  G4double time;
346  if(theIntersection.exists) {
347  time = currentTime + theIntersection.time;
348  } else {
349  INCL_ERROR("Imaginary reflection time for particle: " << '\n'
350  << aParticle->print());
351  time = 10000.0;
352  }
353  return time;
354  }
355 
357  G4INCL::Particle const * const particleB, G4double *minDistOfApproach) const
358  {
359  G4double time;
360  G4INCL::ThreeVector t13 = particleA->getPropagationVelocity();
361  t13 -= particleB->getPropagationVelocity();
362  G4INCL::ThreeVector distance = particleA->getPosition();
363  distance -= particleB->getPosition();
364  const G4double t7 = t13.dot(distance);
365  const G4double dt = t13.mag2();
366  if(dt <= 1.0e-10) {
367  (*minDistOfApproach) = 100000.0;
368  return currentTime + 100000.0;
369  } else {
370  time = -t7/dt;
371  }
372  (*minDistOfApproach) = distance.mag2() + time * t7;
373  return currentTime + time;
374  }
375 
376  void StandardPropagationModel::generateUpdatedCollisions(const ParticleList &updatedParticles, const ParticleList &particles) {
377 
378  // Loop over all the updated particles
379  for(ParticleIter updated=updatedParticles.begin(), e=updatedParticles.end(); updated!=e; ++updated)
380  {
381  // Loop over all the particles
382  for(ParticleIter particle=particles.begin(), end=particles.end(); particle!=end; ++particle)
383  {
384  /* Consider the generation of a collision avatar only if (*particle)
385  * is not one of the updated particles.
386  * The criterion makes sure that you don't generate avatars between
387  * updated particles. */
388  if(updatedParticles.contains(*particle)) continue;
389 
390  registerAvatar(generateBinaryCollisionAvatar(*particle,*updated));
391  }
392  }
393  }
394 
396  // Loop over all the particles
397  for(ParticleIter p1=particles.begin(), e=particles.end(); p1!=e; ++p1) {
398  // Loop over the rest of the particles
399  for(ParticleIter p2 = p1 + 1; p2 != particles.end(); ++p2) {
401  }
402  }
403  }
404 
406 
407  const G4bool haveExcept = !except.empty();
408 
409  // Loop over all the particles
410  for(ParticleIter p1=particles.begin(), e=particles.end(); p1!=e; ++p1)
411  {
412  // Loop over the rest of the particles
413  ParticleIter p2 = p1;
414  for(++p2; p2 != particles.end(); ++p2)
415  {
416  // Skip the collision if both particles must be excluded
417  if(haveExcept && except.contains(*p1) && except.contains(*p2)) continue;
418 
420  }
421  }
422 
423  }
424 
426 
427  for(ParticleIter iter=particles.begin(), e=particles.end(); iter!=e; ++iter) {
428  G4double time = this->getReflectionTime(*iter);
429  if(time <= maximumTime) registerAvatar(new SurfaceAvatar(*iter, time, theNucleus));
430  }
431  ParticleList const &p = theNucleus->getStore()->getParticles();
432  generateUpdatedCollisions(particles, p); // Predict collisions with spectators and participants
433  }
434 
436  ParticleList const &particles = theNucleus->getStore()->getParticles();
437 // assert(!particles.empty());
438  G4double time;
439  for(ParticleIter i=particles.begin(), e=particles.end(); i!=e; ++i) {
440  time = this->getReflectionTime(*i);
441  if(time <= maximumTime) registerAvatar(new SurfaceAvatar(*i, time, theNucleus));
442  }
443  generateCollisions(particles);
444  generateDecays(particles);
445  }
446 
447 #ifdef INCL_REGENERATE_AVATARS
448  void StandardPropagationModel::generateAllAvatarsExceptUpdated(FinalState const * const fs) {
449  ParticleList const &particles = theNucleus->getStore()->getParticles();
450 // assert(!particles.empty());
451  for(ParticleIter i=particles.begin(), e=particles.end(); i!=e; ++i) {
452  G4double time = this->getReflectionTime(*i);
453  if(time <= maximumTime) registerAvatar(new SurfaceAvatar(*i, time, theNucleus));
454  }
455  ParticleList except = fs->getModifiedParticles();
456  ParticleList const &entering = fs->getEnteringParticles();
457  except.insert(except.end(), entering.begin(), entering.end());
458  generateCollisions(particles,except);
459  generateDecays(particles);
460  }
461 #endif
462 
464  for(ParticleIter i=particles.begin(), e=particles.end(); i!=e; ++i) {
465  if((*i)->isDelta()) {
467  G4double time = currentTime + decayTime;
468  if(time <= maximumTime) {
469  registerAvatar(new DecayAvatar((*i), time, theNucleus));
470  }
471  }
472  }
473  }
474 
476  {
477  if(fs) {
478  // We update only the information related to particles that were updated
479  // by the previous avatar.
480 #ifdef INCL_REGENERATE_AVATARS
481 #warning "The INCL_REGENERATE_AVATARS code has not been tested in a while. Use it at your peril."
482  if(!fs->getModifiedParticles().empty() || !fs->getEnteringParticles().empty() || !fs->getCreatedParticles().empty()) {
483  // Regenerates the entire avatar list, skipping collisions between
484  // updated particles
486  theNucleus->getStore()->initialiseParticleAvatarConnections();
487  generateAllAvatarsExceptUpdated(fs);
488  }
489 #else
490  ParticleList const &updatedParticles = fs->getModifiedParticles();
491  if(fs->getValidity()==PauliBlockedFS) {
492  // This final state might represents the outcome of a Pauli-blocked delta
493  // decay
494 // assert(updatedParticles.empty() || (updatedParticles.size()==1 && updatedParticles.front()->isResonance()));
495 // assert(fs->getEnteringParticles().empty() && fs->getCreatedParticles().empty() && fs->getOutgoingParticles().empty() && fs->getDestroyedParticles().empty());
496  generateDecays(updatedParticles);
497  } else {
498  ParticleList const &entering = fs->getEnteringParticles();
499  generateDecays(updatedParticles);
500  generateDecays(entering);
501 
502  ParticleList const &created = fs->getCreatedParticles();
503  if(created.empty() && entering.empty())
504  updateAvatars(updatedParticles);
505  else {
506  ParticleList updatedParticlesCopy = updatedParticles;
507  updatedParticlesCopy.insert(updatedParticlesCopy.end(), entering.begin(), entering.end());
508  updatedParticlesCopy.insert(updatedParticlesCopy.end(), created.begin(), created.end());
509  updateAvatars(updatedParticlesCopy);
510  }
511  }
512 #endif
513  }
514 
516  if(theAvatar == 0) return 0; // Avatar list is empty
517  // theAvatar->dispose();
518 
519  if(theAvatar->getTime() < currentTime) {
520  INCL_ERROR("Avatar time = " << theAvatar->getTime() << ", currentTime = " << currentTime << '\n');
521  return 0;
522  } else if(theAvatar->getTime() > currentTime) {
523  theNucleus->getStore()->timeStep(theAvatar->getTime() - currentTime);
524 
525  currentTime = theAvatar->getTime();
527  }
528 
529  return theAvatar;
530  }
531 }
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
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:622
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.
StandardPropagationModel(LocalEnergyType localEnergyType, LocalEnergyType localEnergyDeltaType, const G4double hTime=0.0)
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.