ECCE @ EIC Software
Reference for
ECCE @ EIC
simulation and reconstruction software on GitHub
Home page
Related Pages
Modules
Namespaces
Classes
Files
External Links
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
G4AdjointSimManager.hh
Go to the documentation of this file.
Or view
the newest version in sPHENIX GitHub for file G4AdjointSimManager.hh
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
//
28
// Class Name: G4AdjointSimManager.hh
29
// Author: L. Desorgher
30
// Organisation: SpaceIT GmbH
31
// Contract: ESA contract 21435/08/NL/AT
32
// Customer: ESA/ESTEC
34
//
35
// CHANGE HISTORY
36
// --------------
37
// ChangeHistory:
38
// -15-01-2007 creation by L. Desorgher
39
// -March 2008 Redesigned as a non RunManager. L. Desorgher
40
// -01-11-2009 Add the possibility to use user defined run, event, tracking, stepping,
41
// and stacking actions during the adjoint tracking phase. L. Desorgher
42
//
43
//
44
//
45
//-------------------------------------------------------------
46
// Documentation:
47
// This class represents the Manager of an adjoint/reverse MC simulation.
48
// An adjoint run is divided in a serie of alternative adjoint and forward tracking
49
// of adjoint and normal particles.
50
//
51
// Reverse tracking phase:
52
// -----------------------
53
// An adjoint particle of a given type (adjoint_e-, adjoint_gamma,...) is first generated on the so called adjoint source
54
// with a random energy (1/E distribution) and direction. The adjoint source is the
55
// external surface of a user defined volume or of a user defined sphere. The adjoint
56
// source should contain one or several sensitive volumes and should be small
57
// compared to the entire geometry.
58
// The user can set the min and max energy of the adjoint source. After its
59
// generation the adjoint primary particle is tracked
60
// bacward in the geometry till a user defined external surface (spherical or boundary of a volume)
61
// or is killed before if it reaches a user defined upper energy limit that represents
62
// the maximum energy of the external source. During the reverse tracking, reverse
63
// processes take place where the adjoint particle being tracked can be either scattered
64
// or transformed in another type of adjoint paticle. During the reverse tracking the
65
// G4SimulationManager replaces the user defined Primary, Run, ... actions, by its own actions.
66
//
67
// Forward tracking phase
68
// -----------------------
69
// When an adjoint particle reaches the external surface its weight,type, position,
70
// and directions are registered and a normal primary particle with a type equivalent to the last generated primary adjoint is
71
// generated with the same energy, position but opposite direction and is tracked normally in the sensitive region as in a fwd MC simulation.
72
// During this forward tracking phase the
73
// event, stacking, stepping, tracking actions defined by the user for its general fwd application are used. By this clear separation between
74
// adjoint and fwd tracking phases , the code of the user developed for a fwd simulation should be only slightly modified to adapt it for an adjoint
75
// simulation. Indeed the computation of the signal is done by the same actions or classes that the one used in the fwd simulation mode.
76
//
77
// Modification to brought in a existing G4 application to use the ReverseMC method
78
// -------------------------------
79
// In order to be able to use the ReverseMC method in his simulation, the user should modify its code as such:
80
// 1) Adapt its physics list to use ReverseProcesses for adjoint particles. An example of such physics list is provided in an extended
81
// example.
82
// 2) Create an instance of G4AdjointSimManager somewhere in the main code.
83
// 3) Modify the analysis part of the code to normalise the signal computed during the fwd phase to the weight of the last adjoint particle
84
// that reaches the external surface. This is done by using the following method of G4AdjointSimManager.
85
//
86
// G4int GetIDOfLastAdjParticleReachingExtSource()
87
// G4ThreeVector GetPositionAtEndOfLastAdjointTrack(){ return last_pos;}
88
// G4ThreeVector GetDirectionAtEndOfLastAdjointTrack(){ return last_direction;}
89
// G4double GetEkinAtEndOfLastAdjointTrack(){ return last_ekin;}
90
// G4double GetEkinNucAtEndOfLastAdjointTrack(){ return last_ekin_nuc;}
91
// G4double GetWeightAtEndOfLastAdjointTrack(){return last_weight;}
92
// G4double GetCosthAtEndOfLastAdjointTrack(){return last_cos_th;}
93
// G4String GetFwdParticleNameAtEndOfLastAdjointTrack(){return last_fwd_part_name;}
94
// G4int GetFwdParticlePDGEncodingAtEndOfLastAdjointTrack(){return last_fwd_part_PDGEncoding;}
95
// G4int GetFwdParticleIndexAtEndOfLastAdjointTrack().
96
//
97
// In orther to have a code working for both forward and adjoint simulation mode, the extra code needed in user actions for the adjoint
98
// simulation mode can be seperated to the code needed only for the normal forward simulation by using the following method
99
//
100
// G4bool GetAdjointSimMode() that return true if an adjoint simulation is running and false if not!
101
//
102
// Example of modification in the analysis part of the code:
103
// -------------------------------------------------------------
104
// Let say that in the forward simulation a G4 application computes the energy deposited in a volume.
105
// The user wants to normalise its results for an external isotropic source of e- with differential spectrum given by f(E).
106
// A possible modification of the code where the deposited energy Edep during an event is registered would be the following
107
//
108
// G4AdjointSimManager* theAdjSimManager = G4AdjointSimManager::GetInstance();
109
// if (theAdjSimManager->GetAdjointSimMode()) {
110
// //code of the user that should be consider only for forwrad simulation
111
// G4double normalised_edep = 0.;
112
// if (theAdjSimManager->GetFwdParticleNameAtEndOfLastAdjointTrack() == "e-"){
113
// G4double ekin_prim = theAdjSimManager->GetEkinAtEndOfLastAdjointTrack();
114
// G4double weight_prim = theAdjSimManager->GetWeightAtEndOfLastAdjointTrack();
115
// normalised_edep = weight_prim*f(ekin_prim);
116
// }
117
// //then follow the code where normalised_edep is printed, or registered or whatever ....
118
// }
119
//
120
// else { //code of the user that should be consider only for forward simulation
121
// }
122
// Note that in this example a normalisation to only primary e- with only one spectrum f(E) is considered. The example code could be easily
123
// adapted for a normalisatin to several spectra and several type of primary particles in the same simulation.
124
//
125
126
#ifndef G4AdjointSimManager_h
127
#define G4AdjointSimManager_h 1
128
#include "
globals.hh
"
129
#include "
G4ThreeVector.hh
"
130
#include <vector>
131
#include "
G4UserRunAction.hh
"
132
133
class
G4UserEventAction
;
134
class
G4VUserPrimaryGeneratorAction
;
135
class
G4UserTrackingAction
;
136
class
G4UserSteppingAction
;
137
class
G4UserStackingAction
;
138
class
G4AdjointRunAction;
139
class
G4AdjointPrimaryGeneratorAction
;
140
class
G4AdjointSteppingAction
;
141
class
G4AdjointEventAction;
142
class
G4AdjointStackingAction
;
143
class
G4AdjointTrackingAction
;
144
class
G4ParticleDefinition
;
145
class
G4AdjointSimMessenger
;
146
class
G4PhysicsLogVector
;
147
class
G4Run
;
148
149
class
G4AdjointSimManager
:
public
G4UserRunAction
150
{
151
public
:
152
153
static
G4AdjointSimManager
*
GetInstance
();
154
155
public
:
//public methods
156
157
virtual
void
BeginOfRunAction
(
const
G4Run
* aRun);
158
virtual
void
EndOfRunAction
(
const
G4Run
* aRun);
159
void
RunAdjointSimulation
(
G4int
nb_evt);
160
161
inline
G4int
GetNbEvtOfLastRun
(){
return
nb_evt_of_last_run
;}
162
163
void
SetAdjointTrackingMode
(
G4bool
aBool);
164
G4bool
GetAdjointTrackingMode
();
//true if an adjoint track is being processed
165
inline
G4bool
GetAdjointSimMode
(){
return
adjoint_sim_mode
;}
//true if an adjoint simulation is running
166
167
G4bool
GetDidAdjParticleReachTheExtSource
();
168
void
RegisterAtEndOfAdjointTrack
();
169
void
RegisterAdjointPrimaryWeight
(
G4double
aWeight);
170
void
ResetDidOneAdjPartReachExtSourceDuringEvent
();
171
//to continue here
172
inline
G4int
GetIDOfLastAdjParticleReachingExtSource
(){
return
ID_of_last_particle_that_reach_the_ext_source
;};
173
G4ThreeVector
GetPositionAtEndOfLastAdjointTrack
(
size_t
i=0);
174
G4ThreeVector
GetDirectionAtEndOfLastAdjointTrack
(
size_t
i=0);
175
G4double
GetEkinAtEndOfLastAdjointTrack
(
size_t
i=0);
176
G4double
GetEkinNucAtEndOfLastAdjointTrack
(
size_t
i=0);
177
G4double
GetWeightAtEndOfLastAdjointTrack
(
size_t
i=0);
178
G4double
GetCosthAtEndOfLastAdjointTrack
(
size_t
i=0);
179
const
G4String
&
GetFwdParticleNameAtEndOfLastAdjointTrack
();
180
G4int
GetFwdParticlePDGEncodingAtEndOfLastAdjointTrack
(
size_t
i=0);
181
G4int
GetFwdParticleIndexAtEndOfLastAdjointTrack
(
size_t
i=0);
182
size_t
GetNbOfAdointTracksReachingTheExternalSurface
();
183
void
ClearEndOfAdjointTrackInfoVectors
();
184
G4ParticleDefinition
*
GetLastGeneratedFwdPrimaryParticle
();
185
186
187
188
189
std::vector<G4ParticleDefinition*>*
GetListOfPrimaryFwdParticles
();
190
size_t
GetNbOfPrimaryFwdParticles
();
191
192
G4bool
DefineSphericalExtSource
(
G4double
radius
,
G4ThreeVector
pos
);
193
G4bool
DefineSphericalExtSourceWithCentreAtTheCentreOfAVolume
(
G4double
radius
,
const
G4String
& volume_name);
194
G4bool
DefineExtSourceOnTheExtSurfaceOfAVolume
(
const
G4String
& volume_name);
195
void
SetExtSourceEmax
(
G4double
Emax
);
196
197
//Definition of adjoint source
198
//----------------------------
199
200
G4bool
DefineSphericalAdjointSource
(
G4double
radius
,
G4ThreeVector
pos
);
201
G4bool
DefineSphericalAdjointSourceWithCentreAtTheCentreOfAVolume
(
G4double
radius
,
const
G4String
& volume_name);
202
G4bool
DefineAdjointSourceOnTheExtSurfaceOfAVolume
(
const
G4String
& volume_name);
203
void
SetAdjointSourceEmin
(
G4double
Emin
);
204
void
SetAdjointSourceEmax
(
G4double
Emax
);
205
inline
G4double
GetAdjointSourceArea
(){
return
area_of_the_adjoint_source
;}
206
void
ConsiderParticleAsPrimary
(
const
G4String
& particle_name);
207
void
NeglectParticleAsPrimary
(
const
G4String
& particle_name);
208
void
SetPrimaryIon
(
G4ParticleDefinition
* adjointIon,
G4ParticleDefinition
* fwdIon);
209
const
G4String
&
GetPrimaryIonName
();
210
211
inline
void
SetNormalisationMode
(
G4int
n
){
normalisation_mode
=
n
;};
212
G4int
GetNormalisationMode
(){
return
normalisation_mode
;};
213
G4double
GetNumberNucleonsInIon
(){
return
nb_nuc
;};
214
215
//Definition of user actions for the adjoint tracking phase
216
//----------------------------
217
void
SetAdjointEventAction
(
G4UserEventAction
* anAction);
218
void
SetAdjointSteppingAction
(
G4UserSteppingAction
* anAction);
219
void
SetAdjointStackingAction
(
G4UserStackingAction
* anAction);
220
void
SetAdjointRunAction
(
G4UserRunAction
* anAction);
221
222
//Set methods for user run actions
223
//--------------------------------
224
inline
void
UseUserStackingActionInFwdTrackingPhase
(
G4bool
aBool){
use_user_StackingAction
=aBool;}
225
inline
void
UseUserTrackingActionInFwdTrackingPhase
(
G4bool
aBool){
use_user_TrackingAction
=aBool;}
226
227
228
//Set nb of primary fwd gamma
229
//---------------------------
230
void
SetNbOfPrimaryFwdGammasPerEvent
(
G4int
);
231
232
233
//Set nb of adjoint primaries for reverse splitting
234
//-------------------------------------------------
235
void
SetNbAdjointPrimaryGammasPerEvent
(
G4int
);
236
void
SetNbAdjointPrimaryElectronsPerEvent
(
G4int
);
237
238
//Convergence test
239
//-----------------------
240
/*
241
void RegisterSignalForConvergenceTest(G4double aSignal);
242
void DefineExponentialPrimarySpectrumForConvergenceTest(G4ParticleDefinition* aPartDef, G4double E0);
243
void DefinePowerLawPrimarySpectrumForConvergenceTest(G4ParticleDefinition* aPartDef, G4double alpha);
244
245
*/
246
247
private
:
248
249
static
G4ThreadLocal
G4AdjointSimManager
*
instance
;
250
251
252
private
:
// methods
253
254
void
SetRestOfAdjointActions
();
255
void
SetAdjointPrimaryRunAndStackingActions
();
256
void
SetAdjointActions
();
257
void
ResetRestOfUserActions
();
258
void
ResetUserPrimaryRunAndStackingActions
();
259
void
ResetUserActions
();
260
void
DefineUserActions
();
261
public
:
262
void
SwitchToAdjointSimulationMode
();
263
void
BackToFwdSimulationMode
();
264
265
266
private
:
//constructor and destructor
267
268
G4AdjointSimManager
();
269
~G4AdjointSimManager
();
270
271
private
:
//attributes
272
273
//Messenger
274
//----------
275
G4AdjointSimMessenger
*
theMessenger
;
276
277
//user defined actions for the normal fwd simulation. Taken from the G4RunManager
278
//-------------------------------------------------
279
bool
user_action_already_defined
;
280
G4UserRunAction
*
fUserRunAction
;
281
G4UserEventAction
*
fUserEventAction
;
282
G4VUserPrimaryGeneratorAction
*
fUserPrimaryGeneratorAction
;
283
G4UserTrackingAction
*
fUserTrackingAction
;
284
G4UserSteppingAction
*
fUserSteppingAction
;
285
G4UserStackingAction
*
fUserStackingAction
;
286
bool
use_user_StackingAction
;
//only for fwd part of the adjoint simulation
287
bool
use_user_TrackingAction
;
288
289
//action for adjoint simulation
290
//-----------------------------
291
G4UserRunAction
*
theAdjointRunAction
;
292
G4UserEventAction
*
theAdjointEventAction
;
293
G4AdjointPrimaryGeneratorAction
*
theAdjointPrimaryGeneratorAction
;
294
G4AdjointTrackingAction
*
theAdjointTrackingAction
;
295
G4AdjointSteppingAction
*
theAdjointSteppingAction
;
296
G4AdjointStackingAction
*
theAdjointStackingAction
;
297
298
//adjoint mode
299
//-------------
300
G4bool
adjoint_tracking_mode
;
301
G4bool
adjoint_sim_mode
;
302
303
//adjoint particle information on the external surface
304
//-----------------------------
305
std::vector<G4ThreeVector>
last_pos_vec
;
306
std::vector<G4ThreeVector>
last_direction_vec
;
307
std::vector<G4double>
last_ekin_vec
;
308
std::vector<G4double>
last_ekin_nuc_vec
;
309
std::vector<G4double>
last_cos_th_vec
;
310
std::vector<G4double>
last_weight_vec
;
311
std::vector<G4int>
last_fwd_part_PDGEncoding_vec
;
312
std::vector<G4int>
last_fwd_part_index_vec
;
313
std::vector<G4int>
ID_of_last_particle_that_reach_the_ext_source_vec
;
314
315
316
317
318
G4ThreeVector
last_pos
;
319
G4ThreeVector
last_direction
;
320
G4double
last_ekin
,
last_ekin_nuc
;
//last_ekin_nuc=last_ekin/nuc, nuc is 1 if not a nucleus
321
G4double
last_cos_th
;
322
G4String
last_fwd_part_name
;
323
G4int
last_fwd_part_PDGEncoding
;
324
G4int
last_fwd_part_index
;
325
G4double
last_weight
;
326
G4int
ID_of_last_particle_that_reach_the_ext_source
;
327
328
G4int
nb_evt_of_last_run
;
329
G4int
normalisation_mode
;
330
331
//Adjoint source
332
//--------------
333
G4double
area_of_the_adjoint_source
;
334
G4double
nb_nuc
;
335
G4double
theAdjointPrimaryWeight
;
336
337
//Weight Analysis
338
//----------
339
/*G4PhysicsLogVector* electron_last_weight_vector;
340
G4PhysicsLogVector* proton_last_weight_vector;
341
G4PhysicsLogVector* gamma_last_weight_vector;*/
342
343
G4bool
welcome_message
;
344
345
/* For the future
346
//Convergence test
347
//----------------
348
349
G4double normalised_signal;
350
G4double error_signal;
351
G4bool convergence_test_is_used;
352
G4bool power_law_spectrum_for_convergence_test; // true PowerLaw, ;
353
G4ParticleDefinition* the_par_def_for_convergence_test;
354
*/
355
356
};
357
358
#endif
359
geant4
tree
geant4-10.6-release
source
run
include
G4AdjointSimManager.hh
Built by
Jin Huang
. updated:
Wed Jun 29 2022 17:25:53
using
1.8.2 with
ECCE GitHub integration