Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ITTrackHolder.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/*
27 * G4ITTrackHolder.hh
28 *
29 * Created on: 17 sept. 2014
30 * Author: kara
31 */
32
33#ifndef G4ITTRACKHOLDER_HH
34#define G4ITTRACKHOLDER_HH
35
36#include "G4TrackList.hh"
37#include "G4VITTrackHolder.hh"
38#include <iostream>
39
40class PriorityList : public G4TrackList::Watcher
41{
42public:
43 enum Type
44 {
48 Undefined = -1
49 };
50
52 PriorityList(G4TrackManyList& allMainList);
53 PriorityList(const PriorityList& right);
54 ~PriorityList() override;
55
56 virtual void NotifyDeletingList(G4TrackList* __list);
57
58 void NewMainList(G4TrackList* __list, G4TrackManyList& allMainList);
59
61
62 void PushToMainList(G4Track* __track, G4TrackManyList& allMainList);
63
64 void TransferToMainList(G4TrackList*& __list, G4TrackManyList& allMainList);
65
66 void PushToListOfSecondaries(G4Track* __track,
67 G4TrackManyList& listOfAllSecondaries);
68
69 void PushToWaitingList(G4Track* __track);
70
72
73 void PushToMainList(G4Track* track);
74
75 void MergeWithMainList(G4TrackList* trackList);
76
78 {
79 return fpMainList;
80 }
81
83 {
84 return &fSecondaries;
85 }
86
87 inline void SetWaitingList(G4TrackList* __list)
88 {
89 fpWaitingList = __list;
90 }
91
92 inline G4TrackList* Get(Type type)
93 {
94 switch (type)
95 {
96 case MainList:
97 return fpMainList;
98 break;
99 case SecondariesList:
100 return &fSecondaries;
101 break;
102 case WaitingList:
103 return fpWaitingList;
104 break;
105 case Undefined:
106 return nullptr;
107 }
108 return nullptr;
109 }
110
111 int GetNTracks();
112
113private:
114 G4TrackList* fpMainList;
115 G4TrackList fSecondaries;
116 // to merge with fpMainList
117 G4TrackList* fpWaitingList;
118 // Waiting queue of currentList
119};
120
122{
123 /* UR:
124 * Push on time
125 * Push delayed
126 * Exception when going back
127 * Get all tracks
128 */
129
130 static G4ThreadLocal G4ITTrackHolder* fgInstance;
131 static G4ITTrackHolder* fgMasterInstance;
132 friend class G4Scheduler;
133 friend class G4ITStepProcessor;
134 friend class G4ITModelProcessor;
135
136public:
137 //----- typedefs -----
138 using Key = int; //TODO
139 using MapOfPriorityLists = std::map<Key, PriorityList*>;
140 using MapOfDelayedLists = std::map<double, std::map<Key, G4TrackList*> >;
141
142 //----- Access singletons + constructors/destructors-----
143
144 static G4ITTrackHolder* Instance();
146
148
149 ~G4ITTrackHolder() override;
150
151 //----- Time of the next set of tracks -----
152 inline double GetNextTime()
153 {
154 if (fDelayedList.empty()) return DBL_MAX;
155 return fDelayedList.begin()->first;
156 }
157
158 //----- Add new tracks to the list -----
159 void Push(G4Track*) override;
160 static void PushToMaster(G4Track*);
161
162 //----- Operations between lists -----
163
164 inline void PushToKill(G4Track* track)
165 {
166 G4TrackList::Pop(track);
168
171 }
172 }
173
174 bool MergeNextTimeToMainList(double& time);
177
178 // ----- To call at the end of the step -----
179 void KillTracks();
180 void Clear();
181
182 // ----- Add a watcher to a specific track list -----
183 // comment: to stop watching, just call StopWatching from your watcher class
184 bool AddWatcher(int,
185 G4TrackList::Watcher*,
187
188 void AddWatcherForMainList(G4TrackList::Watcher*);
189 void AddWatcherForKillList(G4TrackList::Watcher*);
190
191 // ----- Access track lists -----
193 { return fLists;}
197 {
198 return &fAllMainList;
199 }
200
202 {
203 return &fAllSecondariesList;
204 }
205
207 {
208 return fDelayedList;
209 }
210
211 size_t GetNTracks() override;
212
213 // ----- Check track lists are NOT empty -----
214 // comment: checking NOT empty faster than checking IS empty
215 inline bool MainListsNOTEmpty()
216 {
218 }
219
224
225 bool DelayListsNOTEmpty();
226
227 bool CheckMapIsNOTEmpty(MapOfPriorityLists& mapOfLists,
228 PriorityList::Type type);
229
230 inline void SetVerbose(int verbose)
231 {
232 fVerbose = verbose;
233 }
234
236 {
237 return &fToBeKilledList;
238 }
239
240protected:
241 void AddTrackID(G4Track* track);
242 void _PushTrack(G4Track* track);
244 void PushDelayed(G4Track* track);
245
246protected:
247 std::map<Key, PriorityList*> fLists;
253
255 // double fPreActivityGlobalTime ;
256
259};
260
261#endif /* G4MIMOLECULARTRACKS_HH_ */
@ fKillTrackAndSecondaries
@ fStopAndKill
static void Pop(G4Track *)
void push_back(OBJECT *__track)
size_t GetNTracks() override
static G4ITTrackHolder * MasterInstance()
void SetVerbose(int verbose)
void Push(G4Track *) override
MapOfDelayedLists & GetDelayedLists()
G4TrackManyList fAllMainList
void _PushTrack(G4Track *track)
~G4ITTrackHolder() override
void PushToKill(G4Track *track)
MapOfDelayedLists fDelayedList
std::map< Key, PriorityList * > MapOfPriorityLists
G4TrackManyList * GetMainList()
void PushTo(G4Track *, PriorityList::Type)
G4TrackList fToBeKilledList
G4TrackList * GetKillList()
PriorityList * GetPriorityList(Key)
bool CheckMapIsNOTEmpty(MapOfPriorityLists &mapOfLists, PriorityList::Type type)
void AddTrackID(G4Track *track)
void MergeSecondariesWithMainList()
G4TrackManyList * GetSecondariesList()
std::map< Key, PriorityList * > fLists
void AddWatcherForKillList(G4TrackList::Watcher *)
G4TrackManyList fAllSecondariesList
std::map< double, std::map< Key, G4TrackList * > > MapOfDelayedLists
static G4ITTrackHolder * Instance()
MapOfPriorityLists & GetLists()
bool MergeNextTimeToMainList(double &time)
void PushDelayed(G4Track *track)
bool AddWatcher(int, G4TrackList::Watcher *, PriorityList::Type=PriorityList::MainList)
static void PushToMaster(G4Track *)
void AddWatcherForMainList(G4TrackList::Watcher *)
G4TrackStatus GetTrackStatus() const
void SetTrackStatus(const G4TrackStatus aTrackStatus)
void SetWaitingList(G4TrackList *__list)
void TransferSecondariesToMainList()
void MergeWithMainList(G4TrackList *trackList)
void NewMainList(G4TrackList *__list, G4TrackManyList &allMainList)
G4TrackList * GetSecondariesList()
G4TrackList * GetMainList()
void PushToListOfSecondaries(G4Track *__track, G4TrackManyList &listOfAllSecondaries)
void TransferToMainList(G4TrackList *&__list, G4TrackManyList &allMainList)
G4TrackList * Get(Type type)
virtual void NotifyDeletingList(G4TrackList *__list)
~PriorityList() override
void PushToMainList(G4Track *__track, G4TrackManyList &allMainList)
void PushToWaitingList(G4Track *__track)
#define DBL_MAX
Definition templates.hh:62
#define G4ThreadLocal
Definition tls.hh:77