ECCE @ EIC Software
 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;
138 class G4AdjointRunAction;
141 class G4AdjointEventAction;
146 class G4PhysicsLogVector;
147 class G4Run;
148 
150 {
151  public:
152 
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 
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 
171  //to continue here
185 
186 
187 
188 
189  std::vector<G4ParticleDefinition*>* GetListOfPrimaryFwdParticles();
191 
196 
197  //Definition of adjoint source
198  //----------------------------
199 
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 
214 
215  //Definition of user actions for the adjoint tracking phase
216  //----------------------------
220  void SetAdjointRunAction(G4UserRunAction* anAction);
221 
222  //Set methods for user run actions
223  //--------------------------------
226 
227 
228  //Set nb of primary fwd gamma
229  //---------------------------
231 
232 
233  //Set nb of adjoint primaries for reverse splitting
234  //-------------------------------------------------
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 
250 
251 
252  private: // methods
253 
254  void SetRestOfAdjointActions();
256  void SetAdjointActions();
257  void ResetRestOfUserActions();
259  void ResetUserActions();
260  void DefineUserActions();
261  public:
264 
265 
266  private: //constructor and destructor
267 
270 
271  private ://attributes
272 
273  //Messenger
274  //----------
276 
277  //user defined actions for the normal fwd simulation. Taken from the G4RunManager
278  //-------------------------------------------------
286  bool use_user_StackingAction; //only for fwd part of the adjoint simulation
288 
289  //action for adjoint simulation
290  //-----------------------------
297 
298  //adjoint mode
299  //-------------
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;
314 
315 
316 
317 
320  G4double last_ekin,last_ekin_nuc; //last_ekin_nuc=last_ekin/nuc, nuc is 1 if not a nucleus
327 
330 
331  //Adjoint source
332  //--------------
336 
337  //Weight Analysis
338  //----------
339  /*G4PhysicsLogVector* electron_last_weight_vector;
340  G4PhysicsLogVector* proton_last_weight_vector;
341  G4PhysicsLogVector* gamma_last_weight_vector;*/
342 
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