Loading...
Searching...
No Matches
RunAction.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//
27/// \file B1/src/RunAction.cc
28/// \brief Implementation of the B1::RunAction class
29
30#include "RunAction.hh"
31#include "PrimaryGeneratorAction.hh"
32#include "DetectorConstruction.hh"
33// #include "Run.hh"
34
35#include "G4RunManager.hh"
36#include "G4Run.hh"
37#include "G4AccumulableManager.hh"
38#include "G4LogicalVolumeStore.hh"
39#include "G4LogicalVolume.hh"
40#include "G4UnitsTable.hh"
41#include "G4SystemOfUnits.hh"
42
43namespace VtkVis
44{
45
46//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
47
49{
50 // add new units for dose
51 //
52 const G4double milligray = 1.e-3*gray;
53 const G4double microgray = 1.e-6*gray;
54 const G4double nanogray = 1.e-9*gray;
55 const G4double picogray = 1.e-12*gray;
56
57 new G4UnitDefinition("milligray", "milliGy" , "Dose", milligray);
58 new G4UnitDefinition("microgray", "microGy" , "Dose", microgray);
59 new G4UnitDefinition("nanogray" , "nanoGy" , "Dose", nanogray);
60 new G4UnitDefinition("picogray" , "picoGy" , "Dose", picogray);
61
62 // Register accumulable to the accumulable manager
63 G4AccumulableManager* accumulableManager = G4AccumulableManager::Instance();
64 accumulableManager->RegisterAccumulable(fEdep);
65 accumulableManager->RegisterAccumulable(fEdep2);
66}
67
68//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
69
71{
72 // inform the runManager to save random number seed
73 G4RunManager::GetRunManager()->SetRandomNumberStore(false);
74
75 // reset accumulables to their initial values
76 G4AccumulableManager* accumulableManager = G4AccumulableManager::Instance();
77 accumulableManager->Reset();
78
79}
80
81//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
82
84{
85 G4int nofEvents = run->GetNumberOfEvent();
86 if (nofEvents == 0) return;
87
88 // Merge accumulables
89 G4AccumulableManager* accumulableManager = G4AccumulableManager::Instance();
90 accumulableManager->Merge();
91
92 // Compute dose = total energy deposit in a run and its variance
93 //
94 G4double edep = fEdep.GetValue();
95 G4double edep2 = fEdep2.GetValue();
96
97 G4double rms = edep2 - edep*edep/nofEvents;
98 if (rms > 0.) rms = std::sqrt(rms); else rms = 0.;
99
100 const auto detConstruction = static_cast<const DetectorConstruction*>(
101 G4RunManager::GetRunManager()->GetUserDetectorConstruction());
102 G4double mass = detConstruction->GetScoringVolume()->GetMass();
103 G4double dose = edep/mass;
104 G4double rmsDose = rms/mass;
105
106 // Run conditions
107 // note: There is no primary generator action object for "master"
108 // run manager for multi-threaded mode.
109 const auto generatorAction = static_cast<const PrimaryGeneratorAction*>(
110 G4RunManager::GetRunManager()->GetUserPrimaryGeneratorAction());
111 G4String runCondition;
112 if (generatorAction)
113 {
114 const G4ParticleGun* particleGun = generatorAction->GetParticleGun();
115 runCondition += particleGun->GetParticleDefinition()->GetParticleName();
116 runCondition += " of ";
117 G4double particleEnergy = particleGun->GetParticleEnergy();
118 runCondition += G4BestUnit(particleEnergy,"Energy");
119 }
120
121 // Print
122 //
123 if (IsMaster()) {
124 G4cout
125 << G4endl
126 << "--------------------End of Global Run-----------------------";
127 }
128 else {
129 G4cout
130 << G4endl
131 << "--------------------End of Local Run------------------------";
132 }
133
134 G4cout
135 << G4endl
136 << " The run consists of " << nofEvents << " "<< runCondition
137 << G4endl
138 << " Cumulated dose per run, in scoring volume : "
139 << G4BestUnit(dose,"Dose") << " rms = " << G4BestUnit(rmsDose,"Dose")
140 << G4endl
141 << "------------------------------------------------------------"
142 << G4endl
143 << G4endl;
144}
145
146//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
147
148void RunAction::AddEdep(G4double edep)
149{
150 fEdep += edep;
151 fEdep2 += edep*edep;
152}
153
154//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
155
156}
Detector construction class to define materials and geometry.
G4LogicalVolume * GetScoringVolume() const
The primary generator action class with particle gun.
void EndOfRunAction(const G4Run *) override
Definition RunAction.cc:83
void BeginOfRunAction(const G4Run *) override
Definition RunAction.cc:70
void AddEdep(G4double edep)
Definition RunAction.cc:148
G4Accumulable< G4double > fEdep
Definition RunAction.hh:60
G4Accumulable< G4double > fEdep2
Definition RunAction.hh:61

Applications | User Support | Publications | Collaboration