Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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// 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// INCL++ revision: v5.1.8
34//
35#define INCLXX_IN_GEANT4_MODE 1
36
37#include "globals.hh"
38
39/*
40 * StandardPropagationModel.cpp
41 *
42 * \date 4 juin 2009
43 * \author Pekka Kaitaniemi
44 */
45
49#include "G4INCLDecayAvatar.hh"
51#include "G4INCLRandom.hh"
52#include <iostream>
53#include <algorithm>
54#include "G4INCLLogger.hh"
55#include "G4INCLGlobals.hh"
60#include "G4INCLIntersection.hh"
61
62namespace G4INCL {
63
65 :theNucleus(0), maximumTime(70.0), currentTime(0.0), firstAvatar(true),
66 theLocalEnergyType(localEnergyType),
67 theLocalEnergyDeltaType(localEnergyDeltaType)
68 {
69 }
70
72 {
73 delete theNucleus;
74 }
75
77 {
78 return theNucleus;
79 }
80
81 G4double StandardPropagationModel::shoot(ParticleSpecies const projectileSpecies, const G4double kineticEnergy, const G4double impactParameter, const G4double phi) {
82 if(projectileSpecies.theType==Composite)
83 return shootComposite(projectileSpecies, kineticEnergy, impactParameter, phi);
84 else
85 return shootParticle(projectileSpecies.theType, kineticEnergy, impactParameter, phi);
86 }
87
88 G4double StandardPropagationModel::shootParticle(ParticleType const type, const G4double kineticEnergy, const G4double impactParameter, const G4double phi) {
89 theNucleus->setParticleNucleusCollision();
90 currentTime = 0.0;
91
92 // Create the projectile particle
93 const G4double projectileMass = ParticleTable::getTableParticleMass(type);
94 G4double energy = kineticEnergy + projectileMass;
95 G4double momentumZ = std::sqrt(energy*energy - projectileMass*projectileMass);
96 ThreeVector momentum(0.0, 0.0, momentumZ);
97 Particle *p= new G4INCL::Particle(type, energy, momentum, ThreeVector());
98
99 G4double temfin = 0.0;
100 if( p->isNucleon() )
101 temfin = 29.8 * std::pow(theNucleus->getA(), 0.16);
102 else {
103 const G4double tlab = p->getEnergy() - p->getMass();
104 temfin = 30.18 * std::pow(theNucleus->getA(), 0.17*(1.0 - 5.7E-5*tlab));
105 }
106
107 maximumTime = temfin;
108
109 // If the incoming particle is slow, use a larger stopping time
110 const G4double rMax = theNucleus->getUniverseRadius();
111 const G4double distance = 2.*rMax;
112 const G4double projectileVelocity = p->boostVector().mag();
113 const G4double traversalTime = distance / projectileVelocity;
114 if(maximumTime < traversalTime)
115 maximumTime = traversalTime;
116 DEBUG("Cascade stopping time is " << maximumTime << std::endl);
117
118 // If Coulomb is activated, do not process events with impact
119 // parameter larger than the maximum impact parameter, taking into
120 // account Coulomb distortion.
121 if(impactParameter>CoulombDistortion::maxImpactParameter(p->getSpecies(), kineticEnergy, theNucleus)) {
122 DEBUG("impactParameter>CoulombDistortion::maxImpactParameter" << std::endl);
123 delete p;
124 return -1.;
125 }
126
127 ThreeVector position(impactParameter * std::cos(phi),
128 impactParameter * std::sin(phi),
129 0.);
131
132 // Fill in the relevant kinematic variables
134 theNucleus->setIncomingMomentum(p->getMomentum());
135 theNucleus->setInitialEnergy(p->getEnergy()
136 + ParticleTable::getTableMass(theNucleus->getA(),theNucleus->getZ()));
137
138 // Reset the particle kinematics to the INCL values
139 p->setINCLMass();
140 p->setEnergy(p->getMass() + kineticEnergy);
142
145 firstAvatar = false;
146
147 // Get the entry avatars from Coulomb and put them in the Store
148 ParticleEntryAvatar *theEntryAvatar = CoulombDistortion::bringToSurface(p, theNucleus);
149 if(theEntryAvatar) {
150 theNucleus->getStore()->addParticleEntryAvatar(theEntryAvatar);
151
152 theNucleus->setProjectileChargeNumber(p->getZ());
153 theNucleus->setProjectileMassNumber(p->getA());
154
155 return p->getTransversePosition().mag();
156 } else {
157 delete p;
158 return -1.;
159 }
160 }
161
162 G4double StandardPropagationModel::shootComposite(ParticleSpecies const species, const G4double kineticEnergy, const G4double impactParameter, const G4double phi) {
163 theNucleus->setNucleusNucleusCollision();
164 currentTime = 0.0;
165
166 // Create the ProjectileRemnant object
167 ProjectileRemnant *pr = new ProjectileRemnant(species, kineticEnergy);
168
169 // Same stopping time as for nucleon-nucleus
170 maximumTime = 29.8 * std::pow(theNucleus->getA(), 0.16);
171
172 // If the incoming cluster is slow, use a larger stopping time
173 const G4double rms = ParticleTable::getNuclearRadius(pr->getA(), pr->getZ());
174 const G4double rMax = theNucleus->getUniverseRadius();
175 const G4double distance = 2.*rMax + 2.725*rms;
176 const G4double projectileVelocity = pr->boostVector().mag();
177 const G4double traversalTime = distance / projectileVelocity;
178 if(maximumTime < traversalTime)
179 maximumTime = traversalTime;
180 DEBUG("Cascade stopping time is " << maximumTime << std::endl);
181
182 // If Coulomb is activated, do not process events with impact
183 // parameter larger than the maximum impact parameter, taking into
184 // account Coulomb distortion.
185 if(impactParameter>CoulombDistortion::maxImpactParameter(pr,theNucleus)) {
186 pr->deleteParticles();
187 DEBUG("impactParameter>CoulombDistortion::maxImpactParameter" << std::endl);
188 delete pr;
189 return -1.;
190 }
191
192 // Position the cluster at the right impact parameter
193 ThreeVector position(impactParameter * std::cos(phi),
194 impactParameter * std::sin(phi),
195 0.);
197
198 /* Store the internal kinematics of the projectile remnant.
199 *
200 * Note that this is at variance with the Fortran version, which stores
201 * the initial kinematics of the particles *after* putting the spectators
202 * on mass shell, but *before* removing the same energy from the
203 * participants. Due to the different code flow, doing so in the C++
204 * version leads to wrong excitation energies for the forced compound
205 * nucleus.
206 */
207 pr->storeComponents();
208
209 // Fill in the relevant kinematic variables
211 theNucleus->setIncomingMomentum(pr->getMomentum());
212 theNucleus->setInitialEnergy(pr->getEnergy()
213 + ParticleTable::getTableMass(theNucleus->getA(),theNucleus->getZ()));
214
216 firstAvatar = false;
217
218 // Get the entry avatars from Coulomb
219 IAvatarList theAvatarList
220 = CoulombDistortion::bringToSurface(pr, theNucleus);
221
222 if(theAvatarList.empty()) {
223 DEBUG("No ParticleEntryAvatar found, transparent event" << std::endl);
224 pr->deleteParticles();
225 delete pr;
226 return -1.;
227 }
228
229 // Tell the Nucleus about the ProjectileRemnant
230 theNucleus->setProjectileRemnant(pr);
231
232 // Set the number of projectile particles
233 theNucleus->setProjectileChargeNumber(pr->getZ());
234 theNucleus->setProjectileMassNumber(pr->getA());
235
236 // Register the ParticleEntryAvatars
237 theNucleus->getStore()->addParticleEntryAvatars(theAvatarList);
238
239 return pr->getTransversePosition().mag();
240 }
241
243 return maximumTime;
244 }
245
247// assert(time>0.0);
248 maximumTime = time;
249 }
250
252 return currentTime;
253 }
254
256 {
257 theNucleus = nucleus;
258 }
259
261 {
262 if(anAvatar) theNucleus->getStore()->add(anAvatar);
263 }
264
266 // Is either particle a participant?
267 if(!p1->isParticipant() && !p2->isParticipant() && p1->getParticipantType()==p2->getParticipantType()) return NULL;
268
269 // Is it a pi-resonance collision (we don't treat them)?
270 if((p1->isResonance() && p2->isPion()) || (p1->isPion() && p2->isResonance()))
271 return NULL;
272
273 // Will the avatar take place between now and the end of the cascade?
274 G4double minDistOfApproachSquared = 0.0;
275 G4double t = getTime(p1, p2, &minDistOfApproachSquared);
276 if(t>maximumTime || t<currentTime) return NULL;
277
278 // Local energy. Jump through some hoops to calculate the cross section
279 // at the collision point, and clean up after yourself afterwards.
280 G4bool hasLocalEnergy;
281 if(p1->isPion() || p2->isPion())
282 hasLocalEnergy = ((theLocalEnergyDeltaType == FirstCollisionLocalEnergy &&
283 theNucleus->getStore()->getBook()->getAcceptedCollisions()==0) ||
284 theLocalEnergyDeltaType == AlwaysLocalEnergy);
285 else
286 hasLocalEnergy = ((theLocalEnergyType == FirstCollisionLocalEnergy &&
287 theNucleus->getStore()->getBook()->getAcceptedCollisions()==0) ||
288 theLocalEnergyType == AlwaysLocalEnergy);
289 const G4bool p1HasLocalEnergy = (hasLocalEnergy && !p1->isPion());
290 const G4bool p2HasLocalEnergy = (hasLocalEnergy && !p2->isPion());
291
292 Particle backupParticle1 = *p1;
293 if(p1HasLocalEnergy) {
294 p1->propagate(t - currentTime);
295 if(p1->getPosition().mag() > theNucleus->getSurfaceRadius(p1)) {
296 *p1 = backupParticle1;
297 return NULL;
298 }
300 }
301 Particle backupParticle2 = *p2;
302 if(p2HasLocalEnergy) {
303 p2->propagate(t - currentTime);
304 if(p2->getPosition().mag() > theNucleus->getSurfaceRadius(p2)) {
305 *p2 = backupParticle2;
306 if(p1HasLocalEnergy) {
307 *p1 = backupParticle1;
308 }
309 return NULL;
310 }
312 }
313
314 // Compute the total cross section
315 const G4double totalCrossSection = CrossSections::total(p1, p2);
316 const G4double squareTotalEnergyInCM = KinematicsUtils::squareTotalEnergyInCM(p1,p2);
317
318 // Restore particles to their state before the local-energy tweak
319 if(p1HasLocalEnergy) {
320 *p1 = backupParticle1;
321 }
322 if(p2HasLocalEnergy) {
323 *p2 = backupParticle2;
324 }
325
326 // Is the CM energy > cutNN? (no cutNN on the first collision)
327 if(theNucleus->getStore()->getBook()->getAcceptedCollisions()>0
328 && p1->isNucleon() && p2->isNucleon()
329 && squareTotalEnergyInCM < BinaryCollisionAvatar::cutNNSquared) return NULL;
330
331 // Do the particles come close enough to each other?
332 if(Math::tenPi*minDistOfApproachSquared > totalCrossSection) return NULL;
333
334 // Bomb out if the two collision partners are the same particle
335// assert(p1->getID() != p2->getID());
336
337 // Return a new avatar, then!
338 return new G4INCL::BinaryCollisionAvatar(t, totalCrossSection, theNucleus, p1, p2);
339 }
340
342 Intersection theIntersection(
344 aParticle->getPosition(),
345 aParticle->getPropagationVelocity(),
346 theNucleus->getSurfaceRadius(aParticle)));
347 G4double time;
348 if(theIntersection.exists) {
349 time = currentTime + theIntersection.time;
350 } else {
351 ERROR("Imaginary reflection time for particle: " << std::endl
352 << aParticle->print());
353 time = 10000.0;
354 }
355 return time;
356 }
357
359 G4INCL::Particle const * const particleB, G4double *minDistOfApproach) const
360 {
361 G4double time;
363 t13 -= particleB->getPropagationVelocity();
364 G4INCL::ThreeVector distance = particleA->getPosition();
365 distance -= particleB->getPosition();
366 const G4double t7 = t13.dot(distance);
367 const G4double dt = t13.mag2();
368 if(dt <= 1.0e-10) {
369 (*minDistOfApproach) = 100000.0;
370 return currentTime + 100000.0;
371 } else {
372 time = -t7/dt;
373 }
374 (*minDistOfApproach) = distance.mag2() + time * t7;
375 return currentTime + time;
376 }
377
378 void StandardPropagationModel::generateUpdatedCollisions(const ParticleList &updatedParticles, const ParticleList &particles) {
379
380 // Loop over all the updated particles
381 for(ParticleIter updated = updatedParticles.begin(); updated != updatedParticles.end(); ++updated)
382 {
383 // Loop over all the particles
384 for(ParticleIter particle = particles.begin(); particle != particles.end(); ++particle)
385 {
386 /* Consider the generation of a collision avatar only if (*particle)
387 * is not one of the updated particles.
388 * The criterion makes sure that you don't generate avatars between
389 * updated particles. */
390 if((*particle)->isInList(updatedParticles)) continue;
391
393 }
394 }
395 }
396
398
399 G4bool haveExcept;
400 haveExcept=(except.size()!=0);
401
402 // Loop over all the particles
403 for(ParticleIter p1 = particles.begin(); p1 != particles.end(); ++p1)
404 {
405 // Loop over the rest of the particles
406 ParticleIter p2 = p1;
407 for(++p2; p2 != particles.end(); ++p2)
408 {
409 // Skip the collision if both particles must be excluded
410 if(haveExcept && (*p1)->isInList(except) && (*p2)->isInList(except)) continue;
411
413 }
414 }
415
416 }
417
419
420 for(ParticleIter iter = particles.begin(); iter != particles.end(); ++iter) {
421 G4double time = this->getReflectionTime(*iter);
422 if(time <= maximumTime) registerAvatar(new SurfaceAvatar(*iter, time, theNucleus));
423 }
424 ParticleList const &p = theNucleus->getStore()->getParticles();
425 generateUpdatedCollisions(particles, p); // Predict collisions with spectators and participants
426 }
427
429 ParticleList particles = theNucleus->getStore()->getParticles();
430 if(particles.empty()) { ERROR("No particles inside the nucleus!" << std::endl); }
431 for(ParticleIter i = particles.begin(); i != particles.end(); ++i) {
432 G4double time = this->getReflectionTime(*i);
433 if(time <= maximumTime) registerAvatar(new SurfaceAvatar(*i, time, theNucleus));
434 }
435 ParticleList except;
436 if(excludeUpdated)
437 except = theNucleus->getUpdatedParticles();
438 generateCollisions(particles,except);
439 generateDecays(particles);
440 }
441
443 for(ParticleIter i = particles.begin(); i != particles.end(); ++i) {
444 if((*i)->isDelta()) {
446 G4double time = currentTime + decayTime;
447 if(time <= maximumTime) {
448 registerAvatar(new DecayAvatar((*i), time, theNucleus));
449 }
450 }
451 }
452 }
453
455 {
456 // We update only the information related to particles that were updated
457 // by the previous avatar.
458#ifdef INCL_REGENERATE_AVATARS
459#warning "The INCL_REGENERATE_AVATARS code has not been tested in a while. Use it at your peril."
460 if(theNucleus->getUpdatedParticles().size()!=0 || theNucleus->getCreatedParticles().size()!=0) {
461 // Regenerates the entire avatar list, skipping collisions between
462 // updated particles
463 theNucleus->getStore()->clearAvatars();
465 generateAllAvatars(true);
466 }
467#else
468 // Deltas are created by transforming nucleon into a delta for
469 // efficiency reasons
470 Particle * const blockedDelta = theNucleus->getBlockedDelta();
471 ParticleList updatedParticles = theNucleus->getUpdatedParticles();
472 if(blockedDelta)
473 updatedParticles.push_back(blockedDelta);
474 generateDecays(updatedParticles);
475
476 ParticleList needNewAvatars = theNucleus->getUpdatedParticles();
477 ParticleList created = theNucleus->getCreatedParticles();
478 needNewAvatars.splice(needNewAvatars.end(), created);
479 updateAvatars(needNewAvatars);
480#endif
481
482 G4INCL::IAvatar *theAvatar = theNucleus->getStore()->findSmallestTime();
483 if(theAvatar == 0) return 0; // Avatar list is empty
484 // theAvatar->dispose();
485
486 if(theAvatar->getTime() < currentTime) {
487 ERROR("Avatar time = " << theAvatar->getTime() << ", currentTime = " << currentTime << std::endl);
488 return 0;
489 } else if(theAvatar->getTime() > currentTime) {
490 theNucleus->getStore()->timeStep(theAvatar->getTime() - currentTime);
491
492 currentTime = theAvatar->getTime();
493 theNucleus->getStore()->getBook()->setCurrentTime(currentTime);
494 }
495
496 return theAvatar;
497 }
498
499 void StandardPropagationModel::putSpectatorsOnShell(IAvatarList const &entryAvatars, ParticleList const &spectators) {
500 G4double deltaE = 0.0;
501 for(ParticleIter p=spectators.begin(); p!=spectators.end(); ++p) {
502 // put the spectators on shell (conserving their momentum)
503 const G4double oldEnergy = (*p)->getEnergy();
504 (*p)->setTableMass();
505 (*p)->adjustEnergyFromMomentum();
506 deltaE += (*p)->getEnergy() - oldEnergy;
507 }
508
509 deltaE /= entryAvatars.size(); // energy to remove from each participant
510
511 for(IAvatarIter a=entryAvatars.begin(); a!=entryAvatars.end(); ++a) {
512 // remove the energy from the participant
513 Particle *p = (*a)->getParticles().front();
514 ParticleType const t = p->getType();
515 // we also need to slightly correct the participant mass
516 const G4double energy = p->getEnergy() - deltaE
518 p->setEnergy(energy);
519 const G4double newMass = std::sqrt(energy*energy - p->getMomentum().mag2());
520 p->setMass(newMass);
521 }
522 }
523}
Static class for selecting Coulomb distortion.
Simple class for computing intersections between a straight line and a sphere.
#define DEBUG(x)
#define ERROR(x)
double G4double
Definition: G4Types.hh:64
bool G4bool
Definition: G4Types.hh:67
void setCurrentTime(G4double t)
Definition: G4INCLBook.hh:82
G4int getAcceptedCollisions() const
Definition: G4INCLBook.hh:85
G4INCL::ThreeVector getAngularMomentum() const
Get the total angular momentum (orbital + spin)
void setPosition(const ThreeVector &position)
Set the position of the cluster.
static ParticleEntryAvatar * bringToSurface(Particle *p, Nucleus *const n)
Modify the momentum of an incoming particle and position it on the surface of the nucleus.
static G4double maxImpactParameter(ParticleSpecies const &p, const G4double kinE, Nucleus const *const n)
Return the maximum impact parameter for Coulomb-distorted trajectories.
static G4double total(Particle const *const p1, Particle const *const p2)
static G4double computeDecayTime(Particle *p)
virtual ParticleList getParticles() const =0
G4double getTime() const
static Intersection getLaterTrajectoryIntersection(const ThreeVector &x0, const ThreeVector &p, const G4double r)
static G4double squareTotalEnergyInCM(Particle const *const p1, Particle const *const p2)
static void transformToLocalEnergyFrame(Nucleus const *const n, Particle *const p)
Store * getStore() const
Particle * getBlockedDelta() const
Get the delta that could not decay.
ParticleList const & getUpdatedParticles() const
void setIncomingAngularMomentum(const ThreeVector &j)
Set the incoming angular-momentum vector.
void setInitialEnergy(const G4double e)
Set the initial energy.
G4double getSurfaceRadius(Particle const *const particle) const
Get the maximum allowed radius for a given particle.
void setProjectileMassNumber(G4int n)
Set the mass number of the projectile.
ParticleList const & getCreatedParticles() const
void setProjectileChargeNumber(G4int n)
Set the charge number of the projectile.
void setIncomingMomentum(const ThreeVector &p)
Set the incoming momentum vector.
void setParticleNucleusCollision()
Set a particle-nucleus collision.
void setNucleusNucleusCollision()
Set a nucleus-nucleus collision.
void setProjectileRemnant(ProjectileRemnant *const c)
Set the projectile remnant.
G4double getUniverseRadius() const
Getter for theUniverseRadius.
static G4double getINCLMass(const G4int A, const G4int Z)
Get INCL nuclear mass (in MeV/c^2)
static NuclearMassFn getTableMass
Static pointer to the mass function for nuclei.
static ParticleMassFn getTableParticleMass
Static pointer to the mass function for particles.
static G4double getNuclearRadius(const G4int A, const G4int Z)
ThreeVector boostVector() const
virtual G4INCL::ParticleSpecies getSpecies() const
Get the particle species.
virtual G4INCL::ThreeVector getAngularMomentum() const
G4double getEnergy() const
ParticipantType getParticipantType() const
ThreeVector getPropagationVelocity() const
Get the propagation velocity of the particle.
void propagate(G4double step)
G4int getZ() const
Returns the charge number.
const G4INCL::ThreeVector & getPosition() const
G4bool isParticipant() const
virtual void makeProjectileSpectator()
const ThreeVector & adjustMomentumFromEnergy()
Rescale the momentum to match the total energy.
G4bool isPion() const
Is this a pion?
void setINCLMass()
Set the mass of the Particle to its table mass.
const G4INCL::ThreeVector & getMomentum() const
G4bool isResonance() const
Is it a resonance?
void setEnergy(G4double energy)
std::string print() const
ThreeVector getTransversePosition() const
Transverse component of the position w.r.t. the momentum.
G4double getMass() const
Get the cached particle mass.
virtual void setPosition(const G4INCL::ThreeVector &position)
G4int getA() const
Returns the baryon number.
G4bool isNucleon() const
void storeComponents()
Store the projectile components.
G4double shootComposite(ParticleSpecies const s, const G4double kineticEnergy, const G4double impactParameter, const G4double phi)
G4double getReflectionTime(G4INCL::Particle const *const aParticle)
Get the reflection time.
G4double getTime(G4INCL::Particle const *const particleA, G4INCL::Particle const *const particleB, G4double *minDistOfApproach) const
void generateAllAvatars(G4bool excludeUpdated=false)
(Re)Generate all possible avatars.
void registerAvatar(G4INCL::IAvatar *anAvatar)
void updateAvatars(const ParticleList &particles)
IAvatar * generateBinaryCollisionAvatar(Particle *const p1, Particle *const p2) const
Generate a two-particle avatar.
StandardPropagationModel(LocalEnergyType localEnergyType, LocalEnergyType localEnergyDeltaType)
G4double shoot(ParticleSpecies const projectileSpecies, 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.
void generateCollisions(const ParticleList &particles, const ParticleList &except)
Generate and register collisions among particles in a list, except between those in another list.
void generateDecays(const ParticleList &particles)
Generate decays for particles that can decay.
G4double shootParticle(ParticleType const t, const G4double kineticEnergy, const G4double impactParameter, const G4double phi)
Book * getBook()
Definition: G4INCLStore.hh:243
void clearAvatars()
Definition: G4INCLStore.cc:318
void addParticleEntryAvatars(IAvatarList const &al)
Add one ParticleEntry avatar.
Definition: G4INCLStore.cc:86
void timeStep(G4double step)
Definition: G4INCLStore.cc:263
IAvatar * findSmallestTime()
Definition: G4INCLStore.cc:212
void initialiseParticleAvatarConnections()
Initialise the particleAvatarConnections map.
Definition: G4INCLStore.cc:335
void add(Particle *p)
Definition: G4INCLStore.cc:62
ParticleList const & getParticles() const
Definition: G4INCLStore.hh:237
void addParticleEntryAvatar(IAvatar *a)
Add one ParticleEntry avatar.
Definition: G4INCLStore.cc:73
G4double mag() const
G4double dot(const ThreeVector &v) const
G4double mag2() const
const G4double tenPi
std::list< IAvatar * >::const_iterator IAvatarIter
@ FirstCollisionLocalEnergy
std::list< IAvatar * > IAvatarList
std::list< G4INCL::Particle * > ParticleList
std::list< G4INCL::Particle * >::const_iterator ParticleIter
Intersection-point structure.
#define position
Definition: xmlparse.cc:605