Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4AdjointSimManager.cc
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// $Id$
27//
28/////////////////////////////////////////////////////////////////////////////
29// Class Name: G4AdjointCrossSurfChecker
30// Author: L. Desorgher
31// Organisation: SpaceIT GmbH
32// Contract: ESA contract 21435/08/NL/AT
33// Customer: ESA/ESTEC
34/////////////////////////////////////////////////////////////////////////////
35
37#include "G4Run.hh"
38#include "G4RunManager.hh"
39
40#include "G4UserEventAction.hh"
45#include "G4UserRunAction.hh"
46
50
52
54
55#include "G4ParticleTable.hh"
56#include "G4PhysicsLogVector.hh"
57
58////////////////////////////////////////////////////////////////////////////////
59//
60G4AdjointSimManager* G4AdjointSimManager::instance = 0;
61
62////////////////////////////////////////////////////////////////////////////////
63//
64G4AdjointSimManager::G4AdjointSimManager()
65{
66 //Create adjoint actions;
67 //----------------------
68
69 theAdjointRunAction = 0;
70 theAdjointPrimaryGeneratorAction = new G4AdjointPrimaryGeneratorAction();
71 theAdjointSteppingAction = new G4AdjointSteppingAction();
72 theAdjointEventAction = 0;
73 theAdjointTrackingAction = 0;
74 theAdjointStackingAction = new G4AdjointStackingAction();
75
76 //Create messenger
77 //----------------
78 theMessenger = new G4AdjointSimMessenger(this);
79
80 user_action_already_defined=false;
81 use_user_StackingAction = false;
82
83 fUserTrackingAction= 0;
84 fUserEventAction= 0;
85 fUserSteppingAction= 0;
86 fUserPrimaryGeneratorAction= 0;
87 fUserRunAction= 0;
88 fUserStackingAction= 0;
89
90 adjoint_sim_mode = false;
91
92 normalisation_mode=3;
93
94 nb_nuc=1.;
95
96 welcome_message =true;
97
98 /*electron_last_weight_vector = new G4PhysicsLogVector(1.e-20,1.e20,400);
99 proton_last_weight_vector = new G4PhysicsLogVector(1.e-20,1.e20,400);
100 gamma_last_weight_vector = new G4PhysicsLogVector(1.e-20,1.e20,400);*/
101}
102////////////////////////////////////////////////////////////////////////////////
103//
104G4AdjointSimManager::~G4AdjointSimManager()
105{
106 if (theAdjointRunAction) delete theAdjointRunAction;
107 if (theAdjointPrimaryGeneratorAction) delete theAdjointPrimaryGeneratorAction;
108 if (theAdjointSteppingAction) delete theAdjointSteppingAction;
109 if (theAdjointEventAction) delete theAdjointEventAction;
110 if (theAdjointTrackingAction) delete theAdjointTrackingAction;
111 if (theAdjointStackingAction) delete theAdjointStackingAction;
112 if (theMessenger) delete theMessenger;
113}
114////////////////////////////////////////////////////////////////////////////////
115//
117{
118 if (instance == 0) instance = new G4AdjointSimManager;
119 return instance;
120}
121////////////////////////////////////////////////////////////////////////////////
122//
124{
125 if (welcome_message) {
126 G4cout<<"****************************************************************"<<std::endl;
127 G4cout<<"*** Geant4 Reverse/Adjoint Monte Carlo mode ***"<<std::endl;
128 G4cout<<"*** Author: L.Desorgher ***"<<std::endl;
129 G4cout<<"*** Company: SpaceIT GmbH, Bern, Switzerland ***"<<std::endl;
130 G4cout<<"*** Sponsored by: ESA/ESTEC contract contract 21435/08/NL/AT ***"<<std::endl;
131 G4cout<<"****************************************************************"<<std::endl;
132 welcome_message=false;
133 }
134
135 //Replace the user defined actions by the adjoint actions
136 //---------------------------------------------------------
137 SetAdjointPrimaryRunAndStackingActions();
138 SetRestOfAdjointActions();
139
140 //Update the list of primaries
141 //-----------------------------
142 theAdjointPrimaryGeneratorAction->UpdateListOfPrimaryParticles();
143
144 adjoint_sim_mode=true;
145
146 ID_of_last_particle_that_reach_the_ext_source=0;
147
148 //Make the run
149 //------------
150
151 nb_evt_of_last_run =nb_evt;
152 G4RunManager::GetRunManager()->BeamOn(theAdjointPrimaryGeneratorAction->GetNbOfAdjointPrimaryTypes()*2*nb_evt);
153
154 //Restore the user defined actions
155 //--------------------------------
156 ResetRestOfUserActions();
157 ResetUserPrimaryRunAndStackingActions();
158 adjoint_sim_mode=false;
159
160 /*
161 //Register the weight vector
162 //--------------------------
163 std::ofstream FileOutputElectronWeight("ElectronWeight.txt", std::ios::out);
164 FileOutputElectronWeight<<std::setiosflags(std::ios::scientific);
165 FileOutputElectronWeight<<std::setprecision(6);
166 G4bool aBool = electron_last_weight_vector->Store(FileOutputElectronWeight, true);
167 FileOutputElectronWeight.close();
168
169 std::ofstream FileOutputProtonWeight("ProtonWeight.txt", std::ios::out);
170 FileOutputProtonWeight<<std::setiosflags(std::ios::scientific);
171 FileOutputProtonWeight<<std::setprecision(6);
172 aBool = proton_last_weight_vector->Store(FileOutputProtonWeight, true);
173 FileOutputProtonWeight.close();
174
175 std::ofstream FileOutputGammaWeight("GammaWeight.txt", std::ios::out);
176 FileOutputGammaWeight<<std::setiosflags(std::ios::scientific);
177 FileOutputGammaWeight<<std::setprecision(6);
178 aBool = gamma_last_weight_vector->Store(FileOutputGammaWeight, true);
179 FileOutputGammaWeight.close();
180 */
181}
182////////////////////////////////////////////////////////////////////////////////
183//
184void G4AdjointSimManager::SetRestOfAdjointActions()
185{
186 G4RunManager* theRunManager = G4RunManager::GetRunManager();
187
188 if (!user_action_already_defined) DefineUserActions();
189
190 //Replace the user action by the adjoint actions
191 //-------------------------------------------------
192
193 theRunManager->SetUserAction(theAdjointEventAction);
194 theRunManager->SetUserAction(theAdjointSteppingAction);
195 theRunManager->SetUserAction(theAdjointTrackingAction);
196}
197////////////////////////////////////////////////////////////////////////////////
198//
199void G4AdjointSimManager::SetAdjointPrimaryRunAndStackingActions()
200{
201 G4RunManager* theRunManager = G4RunManager::GetRunManager();
202
203 if (!user_action_already_defined) DefineUserActions();
204
205 //Replace the user action by the adjoint actions
206 //-------------------------------------------------
207
208 theRunManager->SetUserAction(theAdjointRunAction);
209 theRunManager->SetUserAction(theAdjointPrimaryGeneratorAction);
210 theRunManager->SetUserAction(theAdjointStackingAction);
211 if (use_user_StackingAction) theAdjointStackingAction->SetUserFwdStackingAction(fUserStackingAction);
212 else theAdjointStackingAction->SetUserFwdStackingAction(0);
213}
214////////////////////////////////////////////////////////////////////////////////
215//
216void G4AdjointSimManager::ResetRestOfUserActions()
217{
218 G4RunManager* theRunManager = G4RunManager::GetRunManager();
219
220 //Restore the user defined actions
221 //-------------------------------
222
223 theRunManager->SetUserAction(fUserEventAction);
224 theRunManager->SetUserAction(fUserSteppingAction);
225 theRunManager->SetUserAction(fUserTrackingAction);
226}
227
228////////////////////////////////////////////////////////////////////////////////
229//
230void G4AdjointSimManager::ResetUserPrimaryRunAndStackingActions()
231{
232 G4RunManager* theRunManager = G4RunManager::GetRunManager();
233 //Restore the user defined actions
234 //-------------------------------
235 theRunManager->SetUserAction(fUserRunAction);
236 theRunManager->SetUserAction(fUserPrimaryGeneratorAction);
237 theRunManager->SetUserAction(fUserStackingAction);
238}
239////////////////////////////////////////////////////////////////////////////////
240//
241void G4AdjointSimManager::DefineUserActions()
242{
243 G4RunManager* theRunManager = G4RunManager::GetRunManager();
244 fUserTrackingAction= const_cast<G4UserTrackingAction* >( theRunManager->GetUserTrackingAction() );
245 fUserEventAction= const_cast<G4UserEventAction* >( theRunManager->GetUserEventAction() );
246 fUserSteppingAction= const_cast<G4UserSteppingAction* >( theRunManager->GetUserSteppingAction() );
247 fUserPrimaryGeneratorAction= const_cast<G4VUserPrimaryGeneratorAction* >( theRunManager->GetUserPrimaryGeneratorAction() );
248 fUserRunAction= const_cast<G4UserRunAction*>( theRunManager->GetUserRunAction() );
249 fUserStackingAction= const_cast<G4UserStackingAction* >( theRunManager->GetUserStackingAction() );
250 user_action_already_defined=true;
251}
252///////////////////////////////////////////////////////////////////////////////
253//
255{
256 adjoint_tracking_mode = aBool;
257
258 if (adjoint_tracking_mode) {
259 SetRestOfAdjointActions();
260 theAdjointStackingAction->SetAdjointMode(true);
261 theAdjointStackingAction->SetKillTracks(false);
262
263 }
264 else {
265
266 ResetRestOfUserActions();
267 theAdjointStackingAction->SetAdjointMode(false);
269 theAdjointStackingAction->SetKillTracks(false);
271 }
272 else theAdjointStackingAction->SetKillTracks(true);
273 }
274}
275///////////////////////////////////////////////////////////////////////////////
276//
278{
279 return theAdjointSteppingAction->GetDidAdjParticleReachTheExtSource();
280}
281///////////////////////////////////////////////////////////////////////////////
282//
283std::vector<G4ParticleDefinition*> G4AdjointSimManager::GetListOfPrimaryFwdParticles()
284{
285 return theAdjointPrimaryGeneratorAction->GetListOfPrimaryFwdParticles();
286}
287///////////////////////////////////////////////////////////////////////////////
288//
290{
291 last_pos = theAdjointSteppingAction->GetLastPosition();
292 last_direction = theAdjointSteppingAction->GetLastMomentum();
293 last_direction /=last_direction.mag();
294 last_cos_th = last_direction.z();
295 G4ParticleDefinition* aPartDef= theAdjointSteppingAction->GetLastPartDef();
296
297 last_fwd_part_name= aPartDef->GetParticleName();
298
299 last_fwd_part_name.remove(0,4);
300
301 last_fwd_part_PDGEncoding=G4ParticleTable::GetParticleTable()->FindParticle(last_fwd_part_name)->GetPDGEncoding();
302
303 std::vector<G4ParticleDefinition*> aList = theAdjointPrimaryGeneratorAction->GetListOfPrimaryFwdParticles();
304 last_fwd_part_index=-1;
305 size_t i=0;
306 while(i<aList.size() && last_fwd_part_index<0) {
307 if (aList[i]->GetParticleName() == last_fwd_part_name) last_fwd_part_index=i;
308 i++;
309 }
310
311 last_ekin = theAdjointSteppingAction->GetLastEkin();
312 last_ekin_nuc = last_ekin;
313 if (aPartDef->GetParticleType() == "adjoint_nucleus") {
314 nb_nuc=double(aPartDef->GetBaryonNumber());
315 last_ekin_nuc /=nb_nuc;
316 }
317
318 last_weight = theAdjointSteppingAction->GetLastWeight();
319
320 /* G4PhysicsLogVector* theWeightVector=0;
321 if (last_fwd_part_name =="e-") theWeightVector=electron_last_weight_vector;
322 else if (last_fwd_part_name =="gamma") theWeightVector=gamma_last_weight_vector;
323 else if (last_fwd_part_name =="proton") theWeightVector=proton_last_weight_vector;
324
325 if (theWeightVector){
326
327 size_t ind = size_t(std::log10(last_weight/theAdjointPrimaryWeight)*10. + 200);
328 G4double low_val =theWeightVector->GetLowEdgeEnergy(ind);
329 G4bool aBool = true;
330 G4double bin_weight = theWeightVector->GetValue(low_val, aBool)+1.;
331 theWeightVector->PutValue(ind, bin_weight);
332 }
333 */
334 /*if ((last_weight/theAdjointPrimaryWeight)>1.) last_weight*=1000. ;
335 else if ( (last_weight/theAdjointPrimaryWeight)>0.1) last_weight*=100. ;
336 else if ( (last_weight/theAdjointPrimaryWeight)>0.01) last_weight*=10. ;*/
337
338
339 //G4cout <<"Last Weight "<<last_weight<<'\t'<<theAdjointPrimaryWeight<<'\t'<<last_weight/theAdjointPrimaryWeight<<std::endl;
340 /*if (last_weight/theAdjointPrimaryWeight >10.) {
341 G4cout<<"Warning a weight increase by a factor : "<<last_weight/theAdjointPrimaryWeight<<std::endl;
342 }
343 */
344
345 ID_of_last_particle_that_reach_the_ext_source++;
346}
347///////////////////////////////////////////////////////////////////////////////
348//
350{
351 G4double area;
352 return G4AdjointCrossSurfChecker::GetInstance()->AddaSphericalSurface("ExternalSource", radius, pos, area);
353}
354///////////////////////////////////////////////////////////////////////////////
355//
357{
358 G4double area;
359 G4ThreeVector center;
360 return G4AdjointCrossSurfChecker::GetInstance()->AddaSphericalSurfaceWithCenterAtTheCenterOfAVolume( "ExternalSource", radius, volume_name,center, area);
361}
362///////////////////////////////////////////////////////////////////////////////
363//
365{
366 G4double area;
367 return G4AdjointCrossSurfChecker::GetInstance()->AddanExtSurfaceOfAvolume( "ExternalSource", volume_name,area);
368}
369///////////////////////////////////////////////////////////////////////////////
370//
372{
373 theAdjointSteppingAction->SetExtSourceEMax(Emax);
374}
375///////////////////////////////////////////////////////////////////////////////
376//
378{
379 G4double area;
380 G4bool aBool = G4AdjointCrossSurfChecker::GetInstance()->AddaSphericalSurface("AdjointSource", radius, pos, area);
381 theAdjointPrimaryGeneratorAction->SetSphericalAdjointPrimarySource(radius, pos);
382 area_of_the_adjoint_source=area;
383 return aBool;
384}
385///////////////////////////////////////////////////////////////////////////////
386//
388{
389 G4double area;
390 G4ThreeVector center;
391 G4bool aBool = G4AdjointCrossSurfChecker::GetInstance()->AddaSphericalSurfaceWithCenterAtTheCenterOfAVolume( "AdjointSource", radius, volume_name,center, area);
392 theAdjointPrimaryGeneratorAction->SetSphericalAdjointPrimarySource(radius, center);
393 area_of_the_adjoint_source=area;
394 return aBool;
395}
396///////////////////////////////////////////////////////////////////////////////
397//
399{
400 G4double area;
401 G4bool aBool = G4AdjointCrossSurfChecker::GetInstance()->AddanExtSurfaceOfAvolume( "AdjointSource", volume_name,area);
402 area_of_the_adjoint_source=area;
403 if (aBool) {
404 theAdjointPrimaryGeneratorAction->SetAdjointPrimarySourceOnAnExtSurfaceOfAVolume(volume_name);
405 }
406 return aBool;
407}
408///////////////////////////////////////////////////////////////////////////////
409//
411{
412 theAdjointPrimaryGeneratorAction->SetEmin(Emin);
413}
414///////////////////////////////////////////////////////////////////////////////
415//
417{
418 theAdjointPrimaryGeneratorAction->SetEmax(Emax);
419}
420///////////////////////////////////////////////////////////////////////////////
421//
423{
424 theAdjointPrimaryGeneratorAction->ConsiderParticleAsPrimary(particle_name);
425}
426///////////////////////////////////////////////////////////////////////////////
427//
429{
430 theAdjointPrimaryGeneratorAction->NeglectParticleAsPrimary(particle_name);
431}
432///////////////////////////////////////////////////////////////////////////////
433//
434/*void G4AdjointSimManager::SetPrimaryIon(G4int Z, G4int A)
435{
436 theAdjointPrimaryGeneratorAction->SetPrimaryIon(Z, A);
437}
438*/
439///////////////////////////////////////////////////////////////////////////////
440//
442{
443 theAdjointPrimaryGeneratorAction->SetPrimaryIon(adjointIon, fwdIon);
444}
445///////////////////////////////////////////////////////////////////////////////
446//
448{
449 return theAdjointPrimaryGeneratorAction->GetPrimaryIonName();
450}
451///////////////////////////////////////////////////////////////////////////////
452//
454{
455 theAdjointPrimaryWeight = aWeight;
456 theAdjointSteppingAction->SetPrimWeight(aWeight);
457}
458
459///////////////////////////////////////////////////////////////////////////////
460//
462{
463 theAdjointEventAction = anAction;
464}
465///////////////////////////////////////////////////////////////////////////////
466//
468{
469 theAdjointSteppingAction->SetUserAdjointSteppingAction(anAction);
470}
471///////////////////////////////////////////////////////////////////////////////
472//
474{
475 theAdjointStackingAction->SetUserAdjointStackingAction(anAction);
476}
477///////////////////////////////////////////////////////////////////////////////
478//
480{
481 theAdjointTrackingAction=anAction;
482}
483///////////////////////////////////////////////////////////////////////////////
484//
486{
487 theAdjointRunAction=anAction;
488}
489///////////////////////////////////////////////////////////////////////////////
490//
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4DLLIMPORT std::ostream G4cout
double z() const
double mag() const
G4bool AddaSphericalSurface(const G4String &SurfaceName, G4double radius, G4ThreeVector pos, G4double &area)
G4bool AddanExtSurfaceOfAvolume(const G4String &SurfaceName, const G4String &volume_name, G4double &area)
static G4AdjointCrossSurfChecker * GetInstance()
G4bool AddaSphericalSurfaceWithCenterAtTheCenterOfAVolume(const G4String &SurfaceName, G4double radius, const G4String &volume_name, G4ThreeVector &center, G4double &area)
std::vector< G4ParticleDefinition * > GetListOfPrimaryFwdParticles()
void ConsiderParticleAsPrimary(const G4String &particle_name)
void SetAdjointPrimarySourceOnAnExtSurfaceOfAVolume(const G4String &volume_name)
void SetSphericalAdjointPrimarySource(G4double radius, G4ThreeVector pos)
void NeglectParticleAsPrimary(const G4String &particle_name)
void SetPrimaryIon(G4ParticleDefinition *adjointIon, G4ParticleDefinition *fwdIon)
void SetAdjointStackingAction(G4UserStackingAction *anAction)
G4bool DefineAdjointSourceOnTheExtSurfaceOfAVolume(const G4String &volume_name)
const G4String & GetPrimaryIonName()
G4bool DefineExtSourceOnTheExtSurfaceOfAVolume(const G4String &volume_name)
G4bool GetDidAdjParticleReachTheExtSource()
void RunAdjointSimulation(G4int nb_evt)
G4bool DefineSphericalExtSourceWithCentreAtTheCentreOfAVolume(G4double radius, const G4String &volume_name)
void SetAdjointTrackingMode(G4bool aBool)
std::vector< G4ParticleDefinition * > GetListOfPrimaryFwdParticles()
void ConsiderParticleAsPrimary(const G4String &particle_name)
void SetAdjointRunAction(G4UserRunAction *anAction)
void SetExtSourceEmax(G4double Emax)
void SetAdjointSourceEmax(G4double Emax)
void RegisterAdjointPrimaryWeight(G4double aWeight)
void SetAdjointSourceEmin(G4double Emin)
void SetAdjointEventAction(G4UserEventAction *anAction)
void NeglectParticleAsPrimary(const G4String &particle_name)
G4bool DefineSphericalAdjointSourceWithCentreAtTheCentreOfAVolume(G4double radius, const G4String &volume_name)
static G4AdjointSimManager * GetInstance()
void SetAdjointSteppingAction(G4UserSteppingAction *anAction)
void SetAdjointTrackingAction(G4UserTrackingAction *anAction)
G4bool DefineSphericalExtSource(G4double radius, G4ThreeVector pos)
G4bool DefineSphericalAdjointSource(G4double radius, G4ThreeVector pos)
void SetPrimaryIon(G4ParticleDefinition *adjointIon, G4ParticleDefinition *fwdIon)
void SetUserFwdStackingAction(G4UserStackingAction *anAction)
void SetUserAdjointStackingAction(G4UserStackingAction *anAction)
G4ParticleDefinition * GetLastPartDef()
void SetExtSourceEMax(G4double Emax)
void SetUserAdjointSteppingAction(G4UserSteppingAction *anAction)
void SetPrimWeight(G4double weight)
const G4String & GetParticleType() const
const G4String & GetParticleName() const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
const G4UserTrackingAction * GetUserTrackingAction() const
const G4VUserPrimaryGeneratorAction * GetUserPrimaryGeneratorAction() const
const G4UserEventAction * GetUserEventAction() const
virtual void BeamOn(G4int n_event, const char *macroFile=0, G4int n_select=-1)
static G4RunManager * GetRunManager()
Definition: G4RunManager.cc:62
const G4UserStackingAction * GetUserStackingAction() const
const G4UserSteppingAction * GetUserSteppingAction() const
void SetUserAction(G4UserRunAction *userAction)
const G4UserRunAction * GetUserRunAction() const
G4String & remove(str_size)