Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ProcessManager.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// $Id$
28//
29//
30// ------------------------------------------------------------
31// GEANT 4 class header file
32//
33// History: first implementation, based on object model of
34// 2nd December 1995, G.Cosmo
35// ---------------- G4ProcessManager -----------------
36// Class Description
37// It collects all physics a particle can undertake as seven vectors.
38// These vectors are
39// one vector for all processes (called as "process List")
40// two vectors for processes with AtRestGetPhysicalInteractionLength
41// and AtRestDoIt
42// two vectors for processes with AlongStepGetPhysicalInteractionLength
43// and AlongStepDoIt
44// two vectors for processes with PostStepGetPhysicalInteractionLength
45// and PostStepDoIt
46// The tracking will message three types of GetPhysicalInteractionLength
47// in order to limit the Step and select the occurence of processes.
48// It will message the corresponding DoIt() to apply the selected
49// processes. In addition, the Tracking will limit the Step
50// and select the occurence of the processes according to
51// the shortest physical interaction length computed (except for
52// processes at rest, for which the Tracking will select the
53// occurence of the process which returns the shortest mean
54// life-time from the GetPhysicalInteractionLength()).
55//
56// History:
57// revised by G.Cosmo, 06 May 1996
58// Added vector of processes at rest, 06 May 1996
59// ------------------------------------------------------------
60// New Physics scheme 8 Jan. 1997 H.Kurahige
61// Add SetProcessOrdering methods 27 Mar 1998 H.Kurahige
62// Add copy constructor (deep copy) 28 June 1998 H.Kurashige
63// Add GetProcessActivation 3 May. 1999 H.Kurashige
64// Use STL vector instead of RW vector 1. Mar 00 H.Kurashige
65// Modify G4ProcessVectorOrdering to fix FindInsedrtPosition 15 Feb. 2005
66// Add
67// ------------------------------------------------------------
68
69#ifndef G4ProcessManager_h
70#define G4ProcessManager_h 1
71
72#include "globals.hh"
73#include "G4ios.hh"
74#include <vector>
75
76#include "G4VProcess.hh"
77#include "G4ProcessVector.hh"
79
82
83// Indexes for ProcessVector
85{
86 typeGPIL = 0, // for GetPhysicalInteractionLength
87 typeDoIt =1 // for DoIt
88};
90{
91 idxAll = -1, // for all DoIt/GPIL
92 idxAtRest = 0, // for AtRestDoIt/GPIL
93 idxAlongStep = 1, // for AlongStepDoIt/GPIL
94 idxPostStep =2, // for AlongSTepDoIt/GPIL
95 NDoit =3
96};
97
98// enumeration for Ordering Parameter
100{
101 ordInActive = -1, // ordering parameter to indicate InActive DoIt
102 ordDefault = 1000, // default ordering parameter
103 ordLast = 9999 // ordering parameter to indicate the last DoIt
105
107{
108
109 public:
110 // copy constructor
112
113 private:
114 // hide default constructor and assignment operator
115 G4ProcessManager & operator=(const G4ProcessManager &right);
117
118 public:
119
120 G4ProcessManager(const G4ParticleDefinition* aParticleType);
121 // Constructor
122
124 // Destructor
125
126 G4int operator==(const G4ProcessManager &right) const;
127 G4int operator!=(const G4ProcessManager &right) const;
128
129 public: // with description
131 // Returns the address of the vector of all processes
132
134 // Returns the number of process in the ProcessVector
135
137 // Returns the index of the process in the process List
138
139 // --------------------------------------
140
144 ) const;
145 // Returns the address of the vector of processes
146
149 ) const;
150 // Returns the address of the vector of processes for
151 // AtRestGetPhysicalInteractionLength idx =0
152 // AtRestGetPhysicalDoIt idx =1
155 ) const;
156 // Returns the address of the vector of processes for
157 // AlongStepGetPhysicalInteractionLength idx =0
158 // AlongStepGetPhysicalDoIt idx =1
159
162 ) const;
163 // Returns the address of the vector of processes for
164 // PostStepGetPhysicalInteractionLength idx =0
165 // PostStepGetPhysicalDoIt idx =1
166
168 G4VProcess* aProcess,
171 ) const;
173 G4VProcess* aProcess,
175 ) const;
177 G4VProcess* aProcess,
179 ) const;
181 G4VProcess* aProcess,
183 ) const;
184 // Returns the index for GPIL/DoIt process vector of the process
185
187 G4VProcess *aProcess,
188 G4int ordAtRestDoIt = ordInActive,
189 G4int ordAlongSteptDoIt = ordInActive,
190 G4int ordPostStepDoIt = ordInActive
191 );
192 // Add a process to the process List
193 // return values are index to the List. Negative return value
194 // indicates that the process has not be added due to some errors
195 // The first argument is a pointer to process.
196 // Following arguments are ordering parameters of the process in
197 // process vectors. If value is negative, the process is
198 // not added to the corresponding process vector.
199
200 // following methods are provided for simple processes
201 // AtRestProcess has only AtRestDoIt
202 // ContinuousProcess has only AlongStepDoIt
203 // DiscreteProcess has only PostStepDoIt
204 // If the ording parameter is not specified, the process is
205 // added at the end of List of process vectors
206 // If a process with same ordering parameter exists,
207 // this new process will be added just after processes
208 // with same ordering parameter
209 // (except for processes assigned to LAST explicitly )
210 // for both DoIt and GetPhysicalInteractionLength
211 //
212
216
217
218 ///////////////////////////////////////////////
219 // Methods for setting ordering parameters
220 // Altanative methods for setting ordering parameters
221 // Note: AddProcess method should precede these methods
222
224 G4VProcess *aProcess,
226 );
227
229 G4VProcess *aProcess,
231 G4int ordDoIt = ordDefault
232 );
233 // Set ordering parameter for DoIt specified by typeDoIt.
234 // If a process with same ordering parameter exists,
235 // this new process will be added just after processes
236 // with same ordering parameter
237 // Note: Ordering parameter will bet set to non-zero
238 // even if you set ordDoIt = 0
239
241 G4VProcess *aProcess,
243 );
244 // Set ordering parameter to the first of all processes
245 // for DoIt specified by idDoIt.
246 // Note: If you use this method for two processes,
247 // a process called later will be first.
248
250 G4VProcess *aProcess,
252 );
253 // Set ordering parameter to 1 for DoIt specified by idDoIt
254 // and the rpocess will be added just after
255 // the processes with ordering parameter equal to zero
256 // Note: If you use this method for two processes,
257 // a process called later will be .
258
260 G4VProcess *aProcess,
262 );
263 // Set ordering parameter to the last of all processes
264 // for DoIt specified by idDoIt.
265 // Note: If you use this method for two processes,
266 // a process called later will precede.
267
270 // Removes a process from the process List.
271 // return value is pointer to the removed process.
272 // (0 value will be returned in case of errors)
273
276 // Set activation flag.
277 // return value is pointer to the applied process.
278 // (0 value will be returned in case of errors)
279
280 G4bool GetProcessActivation(G4VProcess *aProcess) const;
281 G4bool GetProcessActivation(G4int index) const;
282 // Get activation flag.
283
285 // get the particle type
287 // set the particle type
288
289 void StartTracking(G4Track* aTrack=0);
290 void EndTracking();
291 // these two methods are used by G4TrackingManager
292 // in order to inform Start/End of tracking for each track
293 // to the process manager and all physics processes
294
295
296 public:
298 private:
300 // vector for processes with GetPhysicalInteractionLength/DoIt
301
302 typedef std::vector<G4ProcessAttribute*> G4ProcessAttrVector;
303 G4ProcessAttrVector* theAttrVector;
304 // vector for process attribute
305
306 protected: // with description
307 G4int InsertAt(G4int position, G4VProcess* process, G4int ivec);
308 // insert process at position in theProcVector[ivec]
309
310 G4int RemoveAt(G4int position, G4VProcess* process, G4int ivec);
311 // remove process at position in theProcVector[ivec]
312
314 // find insert position according to ordering parameter
315 // in theProcVector[ivec]
316
319
321 // check consistencies between ordering parameters and
322 // validity of DoIt of the Process
323
324 private:
325 G4ProcessAttribute* GetAttribute(G4int index) const;
326 G4ProcessAttribute* GetAttribute(G4VProcess *aProcess) const;
327 // get Pointer to ProcessAttribute
328
329 G4VProcess* ActivateProcess(G4int index);
330 G4VProcess* InActivateProcess(G4int index);
331 // Activate/InActivateProcess Process
332
333 private:
334 const G4ParticleDefinition* theParticleType;
335 // particle which has this process manager object
336
337 G4int numberOfProcesses;
338 G4ProcessVector* theProcessList;
339 // vector for all processes (called as "process List")
340
341 private:
342 G4bool duringTracking;
343 void CreateGPILvectors();
344 void SetIndexToProcessVector(G4int ivec);
345
346 G4bool isSetOrderingFirstInvoked[NDoit];
347 G4bool isSetOrderingLastInvoked[NDoit];
348
349 public: // with description
350 void DumpInfo();
351
354 // controle flag for output message
355 // 0: Silent
356 // 1: Warning message
357 // 2: More
358
359 protected:
361
362 private:
363 static G4ProcessManagerMessenger* fProcessManagerMessenger;
364 static G4int counterOfObjects;
365};
366#include "G4ProcessManager.icc"
367
368#endif
369
G4ProcessVectorTypeIndex
@ typeGPIL
@ typeDoIt
G4ProcessVectorOrdering
@ ordInActive
@ ordDefault
@ ordLast
G4ProcessVectorDoItIndex
@ idxPostStep
@ idxAtRest
@ NDoit
@ idxAll
@ idxAlongStep
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
void SetProcessOrdering(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt, G4int ordDoIt=ordDefault)
G4ProcessVector * GetProcessVector(G4ProcessVectorDoItIndex idx, G4ProcessVectorTypeIndex typ=typeGPIL) const
G4int AddRestProcess(G4VProcess *aProcess, G4int ord=ordDefault)
G4VProcess * SetProcessActivation(G4VProcess *aProcess, G4bool fActive)
void StartTracking(G4Track *aTrack=0)
G4ParticleDefinition * GetParticleType() const
void SetParticleType(const G4ParticleDefinition *)
G4int AddDiscreteProcess(G4VProcess *aProcess, G4int ord=ordDefault)
G4int GetAlongStepIndex(G4VProcess *aProcess, G4ProcessVectorTypeIndex typ=typeGPIL) const
G4ProcessVector * GetAlongStepProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
G4int AddContinuousProcess(G4VProcess *aProcess, G4int ord=ordDefault)
G4int GetProcessListLength() const
G4int GetAtRestIndex(G4VProcess *aProcess, G4ProcessVectorTypeIndex typ=typeGPIL) const
void CheckOrderingParameters(G4VProcess *) const
G4int GetProcessVectorId(G4ProcessVectorDoItIndex idx, G4ProcessVectorTypeIndex typ=typeGPIL) const
void SetVerboseLevel(G4int value)
G4int GetProcessVectorIndex(G4VProcess *aProcess, G4ProcessVectorDoItIndex idx, G4ProcessVectorTypeIndex typ=typeGPIL) const
G4int GetProcessOrdering(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt)
G4int operator!=(const G4ProcessManager &right) const
void SetProcessOrderingToSecond(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt)
G4bool GetProcessActivation(G4VProcess *aProcess) const
G4int GetPostStepIndex(G4VProcess *aProcess, G4ProcessVectorTypeIndex typ=typeGPIL) const
G4ProcessVector * GetProcessList() const
G4int GetProcessIndex(G4VProcess *) const
G4int FindInsertPosition(G4int ord, G4int ivec)
G4ProcessVector * GetPostStepProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
G4VProcess * RemoveProcess(G4VProcess *aProcess)
G4int AddProcess(G4VProcess *aProcess, G4int ordAtRestDoIt=ordInActive, G4int ordAlongSteptDoIt=ordInActive, G4int ordPostStepDoIt=ordInActive)
G4int operator==(const G4ProcessManager &right) const
G4int InsertAt(G4int position, G4VProcess *process, G4int ivec)
void SetProcessOrderingToLast(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt)
G4int GetVerboseLevel() const
void SetProcessOrderingToFirst(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt)
G4ProcessVector * GetAtRestProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
G4int RemoveAt(G4int position, G4VProcess *process, G4int ivec)