34 #include "RunAction.hh"
36 #include "DetectorConstruction.hh"
37 #include "PrimaryGeneratorAction.hh"
38 #include "HistoManager.hh"
52 : detector(det), primary(prim), ProcCounter(0), histoManager(histo)
72 if (ProcCounter)
delete ProcCounter;
76 electronStats.Clear();
77 positronStats.Clear();
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);
100 size_t nbProc = ProcCounter->size();
102 while ((i<nbProc)&&((*ProcCounter)[i]->GetName()!=procName)) i++;
103 if (i == nbProc) ProcCounter->push_back(
new OneProcessCount(procName));
105 (*ProcCounter)[i]->Count();
113 if (NbOfEvents == 0)
return;
124 G4cout <<
"\n The run consists of " << NbOfEvents <<
" "<< Particle <<
" of "
127 << material->
GetName() <<
" (density: "
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";
138 if (totalEventCount == 0)
return;
141 photonStats.PrintResults(totalEventCount);
143 electronStats.PrintResults(totalEventCount);
145 positronStats.PrintResults(totalEventCount);
155 histoManager->
save();
166 photonStats.EventFinished();
167 electronStats.EventFinished();
168 positronStats.EventFinished();
173 RunAction::ParticleStatistics::ParticleStatistics()
175 totalNumber(0), totalNumber2(0),
176 sumEnergy(0), sumEnergy2(0),
177 sumPolarization(0), sumPolarization2(0),
178 sumCosTheta(0), sumCosTheta2(0)
183 RunAction::ParticleStatistics::~ParticleStatistics()
188 void RunAction::ParticleStatistics::EventFinished()
190 totalNumber+=currentNumber;
191 totalNumber2+=currentNumber*currentNumber;
196 void RunAction::ParticleStatistics:: FillData(
G4double kinEnergy,
201 sumEnergy+=kinEnergy;
202 sumEnergy2+=kinEnergy*kinEnergy;
203 sumPolarization+=longitudinalPolarization;
204 sumPolarization2+=longitudinalPolarization*longitudinalPolarization;
205 sumCosTheta+=costheta;
206 sumCosTheta2+=costheta*costheta;
211 void RunAction::ParticleStatistics::PrintResults(
G4int totalNumberOfEvents)
213 G4cout<<
"Mean Number per Event :"
215 if (totalNumber==0) totalNumber=1;
216 G4double energyMean=sumEnergy/totalNumber;
217 G4double energyRms=std::sqrt(sumEnergy2/totalNumber-energyMean*energyMean);
219 <<
" +- "<<
G4BestUnit(energyRms,
"Energy")<<
"\n";
220 G4double polarizationMean=sumPolarization/totalNumber;
222 std::sqrt(sumPolarization2/totalNumber-polarizationMean*polarizationMean);
223 G4cout<<
"Mean Polarization :"<< polarizationMean
224 <<
" +- "<<polarizationRms<<
"\n";
232 totalNumber=totalNumber2=0;
233 sumEnergy=sumEnergy2=0;
234 sumPolarization=sumPolarization2=0;
235 sumCosTheta=sumCosTheta2=0;
std::vector< OneProcessCount * > ProcessesCount
void FillData(const G4String &particleName, G4double kinEnergy, G4double costheta, G4double phi, G4double longitudinalPolarization)
void BeginOfRunAction(const G4Run *)
const G4String & GetName() const
G4double GetDensity() const
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
void CountProcesses(G4String procName)
const G4String & GetParticleName() const
double precision function energy(A, Z)
G4GLOB_DLL std::ostream G4cout
G4int GetNumberOfEvent() const
G4Material * GetMaterial()
void EndOfRunAction(const G4Run *)
static void showEngineStatus()
G4ParticleGun * GetParticleGun()
G4ParticleDefinition * GetParticleDefinition() const
G4double GetParticleEnergy() const