Geant4  10.00.p03
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 //
28 //
29 // $Id: RunAction.cc 68753 2013-04-05 10:26:04Z gcosmo $
30 //
31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
33 
34 #include "RunAction.hh"
35 
36 #include "DetectorConstruction.hh"
37 #include "PrimaryGeneratorAction.hh"
38 #include "HistoManager.hh"
39 
40 #include "G4Run.hh"
41 #include "G4RunManager.hh"
42 #include "G4UnitsTable.hh"
43 #include "G4EmCalculator.hh"
44 
45 #include "Randomize.hh"
46 #include <iomanip>
47 
48 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
49 
51  HistoManager* histo)
52  : detector(det), primary(prim), ProcCounter(0), histoManager(histo)
53 {
55  }
56 
57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
58 
60 { }
61 
62 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
63 
64 void RunAction::BeginOfRunAction(const G4Run* aRun)
65 {
66  G4cout << "### Run " << aRun->GetRunID() << " start." << G4endl;
67 
68  // save Rndm status
69  // G4RunManager::GetRunManager()->SetRandomNumberStore(false);
70  // CLHEP::HepRandom::showEngineStatus();
71 
72  if (ProcCounter) delete ProcCounter;
74  totalEventCount = 0;
78 
79  histoManager->book();
80 }
81 
82 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
83 void RunAction::FillData(const G4String & particleName,
84  G4double kinEnergy, G4double costheta,
85  G4double /* phi*/,
86  G4double longitudinalPolarization)
87 {
88  if (particleName=="gamma")
89  photonStats.FillData(kinEnergy, costheta, longitudinalPolarization);
90  else if (particleName=="e-")
91  electronStats.FillData(kinEnergy, costheta, longitudinalPolarization);
92  else if (particleName=="e+")
93  positronStats.FillData(kinEnergy, costheta, longitudinalPolarization);
94 }
95 
97 {
98  // is the process already counted ?
99  // *AS* change to std::map?!
100  size_t nbProc = ProcCounter->size();
101  size_t i = 0;
102  while ((i<nbProc)&&((*ProcCounter)[i]->GetName()!=procName)) i++;
103  if (i == nbProc) ProcCounter->push_back( new OneProcessCount(procName));
104 
105  (*ProcCounter)[i]->Count();
106 }
107 
108 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
109 
110 void RunAction::EndOfRunAction(const G4Run* aRun)
111 {
112  G4int NbOfEvents = aRun->GetNumberOfEvent();
113  if (NbOfEvents == 0) return;
114 
115  G4int prec = G4cout.precision(5);
116 
117  G4Material* material = detector->GetMaterial();
118  G4double density = material->GetDensity();
119 
120  G4ParticleDefinition* particle =
122  G4String Particle = particle->GetParticleName();
124  G4cout << "\n The run consists of " << NbOfEvents << " "<< Particle << " of "
125  << G4BestUnit(energy,"Energy") << " through "
126  << G4BestUnit(detector->GetBoxSizeZ(),"Length") << " of "
127  << material->GetName() << " (density: "
128  << G4BestUnit(density,"Volumic Mass") << ")" << G4endl;
129 
130  //frequency of processes
131  G4cout << "\n Process calls frequency --->\n";
132  for (size_t i=0; i< ProcCounter->size();i++) {
133  G4String procName = (*ProcCounter)[i]->GetName();
134  G4int count = (*ProcCounter)[i]->GetCounter();
135  G4cout << "\t" << procName << " = " << count<<"\n";
136  }
137 
138  if (totalEventCount == 0) return;
139 
140  G4cout<<" Gamma: \n";
142  G4cout<<" Electron: \n";
144  G4cout<<" Positron: \n";
146 
147  //cross check from G4EmCalculator
148  // G4cout << "\n Verification from G4EmCalculator. \n";
149  // G4EmCalculator emCal;
150 
151  //restore default format
152  G4cout.precision(prec);
153 
154  // write out histograms
155  histoManager->save();
156 
157  // show Rndm status
158  CLHEP::HepRandom::showEngineStatus();
159 }
160 
161 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
162 
164 {
165  ++totalEventCount;
169 }
170 
171 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
172 
174  : currentNumber(0),
175  totalNumber(0), totalNumber2(0),
176  sumEnergy(0), sumEnergy2(0),
177  sumPolarization(0), sumPolarization2(0),
178  sumCosTheta(0), sumCosTheta2(0)
179 {}
180 
181 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
182 
184 {}
185 
186 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
187 
189 {
190  totalNumber+=currentNumber;
191  totalNumber2+=currentNumber*currentNumber;
192  currentNumber=0;
193 }
194 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
195 
197  G4double costheta,
198  G4double longitudinalPolarization)
199 {
200  ++currentNumber;
201  sumEnergy+=kinEnergy;
202  sumEnergy2+=kinEnergy*kinEnergy;
203  sumPolarization+=longitudinalPolarization;
204  sumPolarization2+=longitudinalPolarization*longitudinalPolarization;
205  sumCosTheta+=costheta;
206  sumCosTheta2+=costheta*costheta;
207 }
208 
209 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
210 
212 {
213  G4cout<<"Mean Number per Event :"
214  <<G4double(totalNumber)/G4double(totalNumberOfEvents)<<"\n";
215  if (totalNumber==0) totalNumber=1;
216  G4double energyMean=sumEnergy/totalNumber;
217  G4double energyRms=std::sqrt(sumEnergy2/totalNumber-energyMean*energyMean);
218  G4cout<<"Mean Energy :"<< G4BestUnit(energyMean,"Energy")
219  <<" +- "<<G4BestUnit(energyRms,"Energy")<<"\n";
220  G4double polarizationMean=sumPolarization/totalNumber;
221  G4double polarizationRms=
222  std::sqrt(sumPolarization2/totalNumber-polarizationMean*polarizationMean);
223  G4cout<<"Mean Polarization :"<< polarizationMean
224  <<" +- "<<polarizationRms<<"\n";
225 }
226 
227 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
228 
230 {
231  currentNumber=0;
232  totalNumber=totalNumber2=0;
233  sumEnergy=sumEnergy2=0;
234  sumPolarization=sumPolarization2=0;
235  sumCosTheta=sumCosTheta2=0;
236 }
237 
238 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
std::vector< OneProcessCount * > ProcessesCount
void FillData(const G4String &particleName, G4double kinEnergy, G4double costheta, G4double phi, G4double longitudinalPolarization)
Definition: RunAction.cc:83
void BeginOfRunAction(const G4Run *)
Definition: RunAction.cc:57
HistoManager * histoManager
Definition: RunAction.hh:73
const G4String & GetName() const
Definition: G4Material.hh:176
G4double GetDensity() const
Definition: G4Material.hh:178
G4int totalEventCount
Definition: RunAction.hh:90
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
void CountProcesses(G4String procName)
Definition: RunAction.hh:59
int G4int
Definition: G4Types.hh:78
const G4String & GetParticleName() const
ParticleStatistics electronStats
Definition: RunAction.hh:93
ParticleStatistics photonStats
Definition: RunAction.hh:92
G4double density
Definition: TRTMaterials.hh:39
static const double prec
Definition: RanecuEngine.cc:51
G4GLOB_DLL std::ostream G4cout
void FillData(G4double kinEnergy, G4double costheta, G4double longitudinalPolarization)
Definition: RunAction.cc:196
ParticleStatistics positronStats
Definition: RunAction.hh:94
G4int GetNumberOfEvent() const
Definition: G4Run.hh:79
void EndOfRunAction(const G4Run *)
Definition: RunAction.cc:260
void PrintResults(G4int totalNumberOfEvents)
Definition: RunAction.cc:211
G4int GetRunID() const
Definition: G4Run.hh:76
Definition: G4Run.hh:46
void EventFinished()
Definition: RunAction.cc:163
~RunAction()
Definition: RunAction.cc:52
ProcessesCount * ProcCounter
Definition: RunAction.hh:87
G4ParticleGun * GetParticleGun()
G4double energy(const ThreeVector &p, const G4double m)
PrimaryGeneratorAction * primary
Definition: RunAction.hh:60
G4ParticleDefinition * GetParticleDefinition() const
DetectorConstruction * detector
Definition: RunAction.hh:59
Detector construction class to demonstrate various ways of placement.
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
G4double GetParticleEnergy() const