Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4INCLStore.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// INCL++ intra-nuclear cascade model
27// 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#ifndef G4INCLParticleStore_hh
39#define G4INCLParticleStore_hh 1
40
41#include <map>
42#include <set>
43#include <list>
44#include <string>
45#include <algorithm>
46
47#include "G4INCLParticle.hh"
48#include "G4INCLIAvatar.hh"
49#include "G4INCLBook.hh"
50#include "G4INCLConfig.hh"
51
52#ifdef INCLXX_IN_GEANT4_MODE
53#define INCL_AVATAR_SEARCH_MinElement 1
54#endif // INCLXX_IN_GEANT4_MODE
55
56#if !defined(NDEBUG) && !defined(INCLXX_IN_GEANT4_MODE)
57// Force instantiation of all the std::multimap<Particle*,IAvatar*> methods for
58// debugging purposes
59namespace G4INCL {
60 class Particle;
61 class IAvatar;
62}
63template class std::multimap<G4INCL::Particle*, G4INCL::IAvatar*>;
64#endif
65
66namespace G4INCL {
67
68 /**
69 * The purpose of the Store object is to act as a "particle manager"
70 * that keeps track ofall the particles in our simulation. It also
71 * tracks the avatars and their connections to particles.
72 */
73 class Store {
74 public:
75 /**
76 * Store constructor
77 */
78 Store(Config const * const config);
79
80 /**
81 * Store destructor
82 */
83 ~Store();
84
85 /**
86 * Add one particle to the store.
87 *
88 * Particle objects don't know anything about avatars so this
89 * method will only do two things:
90 * 1. add the particle to the particle map ParticleID -> Particle*
91 * 2. add an empty entry for this particle into map AvatarID -> [ParticleID]
92 */
93 void add(Particle *p);
94
95 /** \brief Add a list of particles to the Store
96 *
97 * This acts as if add(Particle *) was called on each element of the list.
98 */
99 void add(ParticleList const &pL);
100
101 /// \brief Add one ParticleEntry avatar
102 void addParticleEntryAvatar(IAvatar *a);
103
104 /// \brief Add one ParticleEntry avatar
105 void addParticleEntryAvatars(IAvatarList const &al);
106
107 /**
108 * Add one avatar to the store
109 *
110 * Avatars know about the particles they are associated
111 * with. Adding an avatar consists of the following steps:
112 * 1. Add the new avatar to the avatar list
113 * 2. Add any related new particles to the store by calling add(Particle*)
114 * (this should not happen, by the time we are adding avatars all particles
115 * should have already been added)
116 * 3. Connect the particles involved to the avatar in the map:
117 * particleAvatarConnections :: ParticleID -> [AvatarID]
118 * 4. Add the new avatar to the map:
119 * avatarParticleConnections :: AvatarID -> [ParticleID]
120 */
121 void add(IAvatar *a);
122
123 /**
124 * Return the list of avatars
125 */
126 IAvatarList const &getAvatars() const {
127 return avatarList;
128 }
129
130 /**
131 * Add a particle to the incoming list.
132 *
133 * \param p particle to add
134 */
135 void addIncomingParticle(Particle * const p);
136
137 /**
138 * Add a particle to the incoming list.
139 *
140 * \param p particle to add
141 */
142 void removeFromIncoming(Particle * const p) { incoming.remove(p); }
143
144 /// \brief Clear the incoming list
145 inline void clearIncoming() {
146 incoming.clear();
147 }
148
149 /// \brief Clear the incoming list and delete the particles
150 inline void deleteIncoming() {
151 for(ParticleIter iter=incoming.begin(), e=incoming.end(); iter!=e; ++iter) {
152 delete (*iter);
153 }
154 clearIncoming();
155 }
156
157 /** \brief Notify the Store about a particle update
158 *
159 * Notify the Store that a particle has been updated. This
160 * schedules the removal of obsolete avatars and their disconnection from
161 * the particle.
162 */
163 void particleHasBeenUpdated(Particle * const);
164
165 /// \brief Remove avatars that have been scheduled
166 void removeScheduledAvatars();
167
168 /**
169 * Find the avatar that has the smallest time.
170 */
171 IAvatar* findSmallestTime();
172
173 /**
174 * Make one time step: propagate particles and subtract the length
175 * of the step from the avatar times.
176 */
177 void timeStep(G4double step);
178
179 /**
180 * Mark the particle as ejected. This removes it from the list of
181 * inside particles and removes all avatars related to this
182 * particle.
183 */
184 void particleHasBeenEjected(Particle * const);
185
186 /** \brief add the particle to the outgoing particle list.
187 *
188 * \param p pointer to the particle to be added
189 */
190 void addToOutgoing(Particle *p) { outgoing.push_back(p); }
191
192 /** \brief Add a list of particles to the outgoing particle list.
193 *
194 * \param pl list of particles to be added
195 */
196 void addToOutgoing(ParticleList const &pl) {
197 for(ParticleIter p=pl.begin(), e=pl.end(); p!=e; ++p)
198 addToOutgoing(*p);
199 }
200
201 /**
202 * Remove the particle from the system. This also removes all
203 * avatars related to this particle.
204 */
205 void particleHasBeenDestroyed(Particle * const);
206
207 /** \brief Move a particle from incoming to inside
208 *
209 * \param particle pointer to a particle
210 **/
211 void particleHasEntered(Particle * const particle);
212
213 /**
214 * Return the list of incoming particles (i.e. particles that have yet to
215 * enter the cascade).
216 */
217 ParticleList const & getIncomingParticles() const { return incoming; }
218
219 /**
220 * Return the list of outgoing particles (i.e. particles that have left the
221 * cascade).
222 */
223 ParticleList const & getOutgoingParticles() const { return outgoing; }
224
225 /** \brief Returns a list of dynamical spectators
226 *
227 * Looks in the outgoing list for particles without collisions and decays,
228 * removes them from outgoing and returns them in a list.
229 *
230 * \return the (possibly empty) list of dynamical spectators
231 */
233 ParticleList spectators;
234 for(ParticleIter p=outgoing.begin(), e=outgoing.end(); p!=e; ++p) {
235 if((*p)->isProjectileSpectator()) {
236// assert((*p)->isNucleon() || (*p)->isLambda());
237 spectators.push_back(*p); // add them to the list we will return
238 }
239 }
240
241 // Now erase them from outgoing
242 for(ParticleIter i=spectators.begin(); i!=spectators.end(); ++i) {
243 outgoing.remove(*i);
244 }
245
246 return spectators;
247 }
248
249 /**
250 * Return the list of "active" particles (i.e. particles that can
251 * participate in collisions).
252 */
253 ParticleList const & getParticles() const { return inside; }
254
255 /**
256 * Return the pointer to the Book object which keeps track of
257 * various counters.
258 */
259 Book &getBook() { return theBook; };
260
262 G4int n=0;
263 for(ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i) {
264 if(!(*i)->isTargetSpectator())
265 ++n;
266 }
267 return n;
268 }
269
270 /**
271 * Get the config object
272 */
273 Config const * getConfig() { return theConfig; };
274
275 /**
276 * Clear all avatars and particles from the store.
277 *
278 * Warning! This actually deletes the objects as well!
279 */
280 void clear();
281
282 /**
283 * Clear all inside particles from the store.
284 *
285 * Warning! This actually deletes the objects as well!
286 */
287 void clearInside();
288
289 /**
290 * Clear all outgoing particles from the store.
291 *
292 * Warning! This actually deletes the objects as well!
293 */
294 void clearOutgoing();
295
296 /**
297 * Clear avatars only.
298 */
299 void clearAvatars();
300
301 /**
302 * Load particle configuration from ASCII file (see
303 * avatarPredictionTest).
304 */
305 void loadParticles(std::string const &filename);
306
307 /**
308 * Get the value of the nucleus mass number that we read from file
309 * with loadParticles.
310 */
311 G4int getLoadedA() { return loadedA; };
312
313 /**
314 * Get the value of the nucleus charge number that we read from file
315 * with loadParticles.
316 */
317 G4int getLoadedZ() { return loadedZ; };
318
319 /**
320 * Get the value of the stopping time that we read from file
321 * with loadParticles.
322 */
323 G4double getLoadedStoppingTime() { return loadedStoppingTime; };
324
325 /**
326 * Print the nucleon configuration of the nucleus.
327 */
328 std::string printParticleConfiguration();
329
330 /**
331 * Print the nucleon configuration of the nucleus.
332 */
333 void writeParticles(std::string const &filename);
334
335 /**
336 * Print the list of avatars
337 */
338 std::string printAvatars();
339
340 G4bool containsCollisions() const;
341
342#if defined(INCL_AVATAR_SEARCH_FullSort) || defined(INCL_AVATAR_SEARCH_MinElement)
343 /** \brief Comparison predicate for avatars.
344 *
345 * avatarComparisonPredicate is used by the std::sort or std::min_element
346 * functions to compare the avatar objects according to their time.
347 *
348 * \param lhs pointer to the first avatar
349 * \param rhs pointer to the second avatar
350 * \return true iff lhs' time is smaller than rhs'.
351 */
353 return (lhs->getTime() < rhs->getTime());
354 }
355#endif
356
357 private:
358 /// \brief Dummy copy constructor to shut up Coverity warnings
359 Store(const Store &rhs);
360
361 /// \brief Dummy assignment operator to shut up Coverity warnings
362 Store &operator=(Store const &rhs);
363
364
365 /** \brief Connect an avatar to a particle
366 *
367 * Adds the avatar to the list of avatars where the particle appears. This
368 * is typically called when the avatar is created.
369 *
370 * \param p the particle
371 * \param a the avatar
372 */
373 void connectAvatarToParticle(IAvatar * const a, Particle * const p);
374
375 /** \brief Disconnect an avatar from a particle
376 *
377 * Removes the avatar from the list of avatars where the particle appears.
378 * This is typically called when the avatar has been invalidated or
379 * realised.
380 *
381 * \param p the particle
382 * \param a the avatar
383 */
384 void disconnectAvatarFromParticle(IAvatar * const a, Particle * const p);
385
386 /** \brief Remove an avatar from the list of avatars
387 *
388 * Removes an avatar from the list of all avatars. The avatar is *not*
389 * deleted.
390 *
391 * \param a the avatar to remove
392 */
393 void removeAvatar(IAvatar * const a);
394
395 private:
396 /**
397 * Map particle -> [avatar]
398 */
399 std::multimap<Particle*, IAvatar*> particleAvatarConnections;
400 typedef std::multimap<Particle*, IAvatar*>::value_type PAPair;
401 typedef std::multimap<Particle*, IAvatar*>::iterator PAIter;
402 typedef std::pair<PAIter, PAIter> PAIterPair;
403
404 /// \brief Set of avatars to be removed
405 std::set<IAvatar*> avatarsToBeRemoved;
406 typedef std::set<IAvatar*>::const_iterator ASIter;
407
408 private:
409 /**
410 * List of all avatars
411 */
412 IAvatarList avatarList;
413
414 /**
415 * List of incoming particles
416 */
417 ParticleList incoming;
418
419 /**
420 * List of particles that are inside the nucleus
421 */
422 ParticleList inside;
423
424 /**
425 * List of outgoing particles
426 */
427 ParticleList outgoing;
428
429 /**
430 * List of geometrical spectators
431 */
432 ParticleList geomSpectators;
433
434 /**
435 * The current time in the simulation
436 */
437 G4double currentTime;
438
439 /**
440 * The Book object keeps track of global counters
441 */
442 Book theBook;
443
444 /**
445 * The target nucleus mass number that was loaded from a particle file
446 */
447 G4int loadedA;
448
449 /**
450 * The target nucleus charge number that was loaded from a particle file
451 */
452 G4int loadedZ;
453
454 /**
455 * The stopping time that was loaded from a particle file
456 */
457 G4double loadedStoppingTime;
458
459 /**
460 * Pointer to the Config object
461 */
462 Config const * theConfig;
463
464 };
465}
466
467#endif
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4double getTime() const
ParticleList const & getIncomingParticles() const
Definition: G4INCLStore.hh:217
void addToOutgoing(ParticleList const &pl)
Add a list of particles to the outgoing particle list.
Definition: G4INCLStore.hh:196
void deleteIncoming()
Clear the incoming list and delete the particles.
Definition: G4INCLStore.hh:150
ParticleList const & getOutgoingParticles() const
Definition: G4INCLStore.hh:223
void addToOutgoing(Particle *p)
add the particle to the outgoing particle list.
Definition: G4INCLStore.hh:190
G4double getLoadedStoppingTime()
Definition: G4INCLStore.hh:323
Book & getBook()
Definition: G4INCLStore.hh:259
G4int countCascading()
Definition: G4INCLStore.hh:261
G4int getLoadedA()
Definition: G4INCLStore.hh:311
void clearIncoming()
Clear the incoming list.
Definition: G4INCLStore.hh:145
G4int getLoadedZ()
Definition: G4INCLStore.hh:317
static G4bool avatarComparisonPredicate(IAvatar *lhs, IAvatar *rhs)
Comparison predicate for avatars.
Definition: G4INCLStore.hh:352
ParticleList const & getParticles() const
Definition: G4INCLStore.hh:253
Config const * getConfig()
Definition: G4INCLStore.hh:273
void removeFromIncoming(Particle *const p)
Definition: G4INCLStore.hh:142
ParticleList extractDynamicalSpectators()
Returns a list of dynamical spectators.
Definition: G4INCLStore.hh:232
IAvatarList const & getAvatars() const
Definition: G4INCLStore.hh:126
ParticleList::const_iterator ParticleIter