34 #include "RunAction.hh"
35 #include "DetectorConstruction.hh"
36 #include "PrimaryGeneratorAction.hh"
37 #include "HistoManager.hh"
51 :fDetector(det), fPrimary(kin), fHistoManager(0)
71 fEnergyDeposit = fEnergyDeposit2 = 0.;
72 fTrakLenCharged = fTrakLenCharged2 = 0.;
73 fTrakLenNeutral = fTrakLenNeutral2 = 0.;
74 fNbStepsCharged = fNbStepsCharged2 = 0.;
75 fNbStepsNeutral = fNbStepsNeutral2 = 0.;
76 fMscProjecTheta = fMscProjecTheta2 = 0.;
79 fNbGamma = fNbElect = fNbPosit = 0;
81 fTransmit[0] = fTransmit[1] = fReflect[0] = fReflect[1] = 0;
85 fEnergyLeak[0] = fEnergyLeak[1] = fEnergyLeak2[0] = fEnergyLeak2[1] = 0.;
88 if ( analysisManager->IsActive() ) {
89 analysisManager->OpenFile();
104 if (TotNbofEvents == 0)
return;
106 G4double EnergyBalance = fEnergyDeposit + fEnergyLeak[0] + fEnergyLeak[1];
107 EnergyBalance /= TotNbofEvents;
109 fEnergyDeposit /= TotNbofEvents; fEnergyDeposit2 /= TotNbofEvents;
110 G4double rmsEdep = fEnergyDeposit2 - fEnergyDeposit*fEnergyDeposit;
111 if (rmsEdep>0.) rmsEdep = std::sqrt(rmsEdep/TotNbofEvents);
114 fTrakLenCharged /= TotNbofEvents; fTrakLenCharged2 /= TotNbofEvents;
115 G4double rmsTLCh = fTrakLenCharged2 - fTrakLenCharged*fTrakLenCharged;
116 if (rmsTLCh>0.) rmsTLCh = std::sqrt(rmsTLCh/TotNbofEvents);
119 fTrakLenNeutral /= TotNbofEvents; fTrakLenNeutral2 /= TotNbofEvents;
120 G4double rmsTLNe = fTrakLenNeutral2 - fTrakLenNeutral*fTrakLenNeutral;
121 if (rmsTLNe>0.) rmsTLNe = std::sqrt(rmsTLNe/TotNbofEvents);
124 fNbStepsCharged /= TotNbofEvents; fNbStepsCharged2 /= TotNbofEvents;
125 G4double rmsStCh = fNbStepsCharged2 - fNbStepsCharged*fNbStepsCharged;
126 if (rmsStCh>0.) rmsStCh = std::sqrt(rmsTLCh/TotNbofEvents);
129 fNbStepsNeutral /= TotNbofEvents; fNbStepsNeutral2 /= TotNbofEvents;
130 G4double rmsStNe = fNbStepsNeutral2 - fNbStepsNeutral*fNbStepsNeutral;
131 if (rmsStNe>0.) rmsStNe = std::sqrt(rmsTLCh/TotNbofEvents);
139 transmit[0] = 100.*fTransmit[0]/TotNbofEvents;
140 transmit[1] = 100.*fTransmit[1]/TotNbofEvents;
143 reflect[0] = 100.*fReflect[0]/TotNbofEvents;
144 reflect[1] = 100.*fReflect[1]/TotNbofEvents;
147 if (fMscEntryCentral > 0) {
148 fMscProjecTheta /= fMscEntryCentral; fMscProjecTheta2 /= fMscEntryCentral;
149 rmsMsc = fMscProjecTheta2 - fMscProjecTheta*fMscProjecTheta;
150 if (rmsMsc > 0.) { rmsMsc = std::sqrt(rmsMsc); }
151 if(fTransmit[1] > 0.0) {
152 tailMsc = 100.- (100.*fMscEntryCentral)/(2*fTransmit[1]);
156 fEnergyLeak[0] /= TotNbofEvents; fEnergyLeak2[0] /= TotNbofEvents;
157 G4double rmsEl0 = fEnergyLeak2[0] - fEnergyLeak[0]*fEnergyLeak[0];
158 if (rmsEl0>0.) rmsEl0 = std::sqrt(rmsEl0/TotNbofEvents);
161 fEnergyLeak[1] /= TotNbofEvents; fEnergyLeak2[1] /= TotNbofEvents;
162 G4double rmsEl1 = fEnergyLeak2[1] - fEnergyLeak[1]*fEnergyLeak[1];
163 if (rmsEl1>0.) rmsEl1 = std::sqrt(rmsEl1/TotNbofEvents);
179 G4double dEdxTable = 0., dEdxFull = 0.;
181 dEdxTable = emCalculator.
GetDEDX(energy,particle,material);
189 G4double meandEdx = fEnergyDeposit/length;
192 G4cout <<
"\n ======================== run summary ======================\n";
196 G4cout <<
"\n The run was " << TotNbofEvents <<
" " << partName <<
" of "
199 << material->
GetName() <<
" (density: "
204 G4cout <<
"\n Total energy deposit in absorber per event = "
205 <<
G4BestUnit(fEnergyDeposit,
"Energy") <<
" +- "
209 G4cout <<
"\n -----> Mean dE/dx = " << meandEdx/(
MeV/
cm) <<
" MeV/cm"
210 <<
"\t(" << stopPower/(
MeV*
cm2/
g) <<
" MeV*cm2/g)"
214 G4cout <<
" restricted dEdx = " << dEdxTable/(
MeV/
cm) <<
" MeV/cm"
215 <<
"\t(" << stopTable/(
MeV*
cm2/
g) <<
" MeV*cm2/g)"
218 G4cout <<
" full dEdx = " << dEdxFull/(
MeV/
cm) <<
" MeV/cm"
219 <<
"\t(" << stopFull/(
MeV*
cm2/
g) <<
" MeV*cm2/g)"
222 G4cout <<
"\n Leakage : primary = "
223 <<
G4BestUnit(fEnergyLeak[0],
"Energy") <<
" +- "
226 <<
G4BestUnit(fEnergyLeak[1],
"Energy") <<
" +- "
230 G4cout <<
" Energy balance : edep + eleak = "
234 G4cout <<
"\n Total track length (charged) in absorber per event = "
235 <<
G4BestUnit(fTrakLenCharged,
"Length") <<
" +- "
238 G4cout <<
" Total track length (neutral) in absorber per event = "
239 <<
G4BestUnit(fTrakLenNeutral,
"Length") <<
" +- "
242 G4cout <<
"\n Number of steps (charged) in absorber per event = "
243 << fNbStepsCharged <<
" +- " << rmsStCh <<
G4endl;
245 G4cout <<
" Number of steps (neutral) in absorber per event = "
246 << fNbStepsNeutral <<
" +- " << rmsStNe <<
G4endl;
248 G4cout <<
"\n Number of secondaries per event : Gammas = " << Gamma
249 <<
"; electrons = " << Elect
250 <<
"; positrons = " << Posit <<
G4endl;
252 G4cout <<
"\n Number of events with the primary particle transmitted = "
253 << transmit[1] <<
" %" <<
G4endl;
255 G4cout <<
" Number of events with at least 1 particle transmitted "
256 <<
"(same charge as primary) = " << transmit[0] <<
" %" <<
G4endl;
258 G4cout <<
"\n Number of events with the primary particle reflected = "
259 << reflect[1] <<
" %" <<
G4endl;
261 G4cout <<
" Number of events with at least 1 particle reflected "
262 <<
"(same charge as primary) = " << reflect[0] <<
" %" <<
G4endl;
266 G4cout <<
"\n MultipleScattering:"
267 <<
"\n rms proj angle of transmit primary particle = "
268 << rmsMsc/
mrad <<
" mrad (central part only)" <<
G4endl;
270 G4cout <<
" computed theta0 (Highland formula) = "
273 G4cout <<
" central part defined as +- "
274 << fMscThetaCentral/
mrad <<
" mrad; "
275 <<
" Tail ratio = " << tailMsc <<
" %" <<
G4endl;
284 G4double binWidth = analysisManager->GetH1Width(ih);
285 G4double unit = analysisManager->GetH1Unit(ih);
286 G4double fac = unit/(TotNbofEvents*binWidth);
287 analysisManager->ScaleH1(ih,fac);
290 binWidth = analysisManager->GetH1Width(ih);
291 unit = analysisManager->GetH1Unit(ih);
292 fac = unit/(TotNbofEvents*binWidth);
293 analysisManager->ScaleH1(ih,fac);
296 analysisManager->ScaleH1(ih,1./TotNbofEvents);
299 if ( analysisManager->IsActive() ) {
300 analysisManager->Write();
301 analysisManager->CloseFile();
326 G4double teta0 = 13.6*
MeV*z*std::sqrt(t)*(1.+0.038*std::log(t))/bpc;