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