34 #include "RunAction.hh"
35 #include "DetectorConstruction.hh"
36 #include "PrimaryGeneratorAction.hh"
37 #include "HistoManager.hh"
51 :fDetector(det), fPrimary(kin), fHistoManager(0)
78 if ( analysisManager->IsActive() ) {
79 analysisManager->OpenFile();
88 if (TotNbofEvents == 0)
return;
101 G4cout <<
"\n ======================== run summary ======================\n";
105 G4cout <<
"\n The run was " << TotNbofEvents <<
" " << partName <<
" of "
108 << material->
GetName() <<
" (density: "
116 G4double fac = 1./(double(TotNbofEvents));
117 analysisManager->ScaleH1(1,fac);
118 analysisManager->ScaleH1(2,fac);
119 analysisManager->ScaleH1(3,fac);
120 analysisManager->ScaleH1(5,fac);
121 analysisManager->ScaleH1(6,fac);
127 if ( analysisManager->IsActive() ) {
128 analysisManager->Write();
129 analysisManager->CloseFile();
144 analysisManager->SetH1(ih, 120, 0*
mm, 240*
mm,
"mm");
148 fNbBins = analysisManager->GetH1Nbins(ih);
149 fDr = analysisManager->GetH1Width(ih);
150 fluence.resize(fNbBins, 0.);
151 fluence1.resize(fNbBins, 0.);
152 fluence2.resize(fNbBins, 0.);
153 fNbEntries.resize(fNbBins, 0);
161 if (ibin >= fNbBins)
return;
164 fluence2[ibin] += fl*fl;
178 ds =
twopi*rmean*fDr;
180 fluence2[
bin] /= (ds*ds);
182 if (fNbEntries[
bin] > 0)
183 variance = fluence2[
bin] - (fluence[
bin]*fluence[
bin])/fNbEntries[
bin];
185 if(variance > 0.) rms = std::sqrt(variance);
191 G4double rnorm(4*
mm), radius(0.), fnorm(0.), fnorm2(0.);
194 inorm++; radius += fDr; fnorm += fluence[inorm]; fnorm2 += fluence2[inorm];
195 }
while (radius < rnorm);
201 G4double err0 = fnorm2/fnorm, err1 = 0.;
206 ratio = fluence[
bin]*scale;
209 err1 = fluence2[
bin]/fluence[
bin];
210 error = ratio*std::sqrt(err1*err1 + err0*err0);
212 fluence1[
bin] = ratio;
213 fluence2[
bin] = error;
216 analysisManager->FillH1(4,rmean,ratio);
228 G4String fileName = name +
".ascii";
229 std::ofstream File(fileName, std::ios::out);
231 std::ios::fmtflags mode = File.flags();
232 File.setf( std::ios::scientific, std::ios::floatfield );
233 G4int prec = File.precision(3);
235 File <<
" Fluence density distribution \n "
236 <<
"\n ibin \t radius (mm) \t Nb \t fluence\t norma fl\t rms/nfl (%) \n"
243 if (fluence1[
bin] > 0.) error = 100*fluence2[
bin]/fluence1[
bin];
244 File <<
" " <<
bin <<
"\t " << rmean/
mm <<
"\t " << fNbEntries[
bin]
245 <<
"\t " << fluence[
bin]/double(TotEvents) <<
"\t " << fluence1[
bin]
251 File.setf(mode,std::ios::floatfield);
252 File.precision(prec);
G4Material * GetMaterialScatter()
void BeginOfRunAction(const G4Run *)
void ComputeFluenceError()
typedef int(XMLCALL *XML_NotStandaloneHandler)(void *userData)
const G4String & GetName() const
G4double GetDensity() const
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
void SetRandomNumberStore(G4bool flag)
const G4String & GetParticleName() const
double precision function energy(A, Z)
G4GLOB_DLL std::ostream G4cout
G4int GetNumberOfEvent() const
G4double GetThicknessScatter()
void EndOfRunAction(const G4Run *)
ExG4HbookAnalysisManager G4AnalysisManager
static void showEngineStatus()
static G4RunManager * GetRunManager()
G4ParticleGun * GetParticleGun()
G4ParticleDefinition * GetParticleDefinition() const
void SumFluence(G4double, G4double)
G4double GetParticleEnergy() const