source: trunk/source/geometry/magneticfield/test/field03/src/F03RunAction.cc@ 1199

Last change on this file since 1199 was 1199, checked in by garnier, 16 years ago

nvx fichiers dans CVS

File size: 34.1 KB
Line 
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// $Id: F03RunAction.cc,v 1.4 2006/06/29 18:30:23 gunter Exp $
28// GEANT4 tag $Name: HEAD $
29//
30//
31
32
33#include "F03RunAction.hh"
34#include "F03RunMessenger.hh"
35
36#include "G4Run.hh"
37#include "G4UImanager.hh"
38#include "G4VVisManager.hh"
39#include "G4ios.hh"
40#include <iomanip>
41
42#include "Randomize.hh"
43#ifndef G4NOHIST
44 #include "CLHEP/Hist/HBookFile.h"
45#endif
46#include <assert.h>
47
48//////////////////////////////////////////////////////////////////////////////
49
50F03RunAction::F03RunAction()
51 :histName("histfile"),nbinStep(0),nbinEn(0),nbinTt(0),nbinTb(0),
52 nbinTsec(0),nbinTh(0),nbinThback(0),nbinR(0),nbinGamma(0),
53 nbinvertexz(0)
54{
55 runMessenger = new F03RunMessenger(this);
56 saveRndm = 1;
57#ifndef G4NOHIST
58 histo1=0; histo2=0; histo3=0; histo4=0; histo5=0;
59 histo6=0; histo7=0; histo8=0; histo9=0; histo10=0;
60#endif
61}
62
63////////////////////////////////////////////////////////////////////////////
64
65F03RunAction::~F03RunAction()
66{
67 delete runMessenger;
68#ifndef G4NOHIST
69 if(histo1) delete histo1 ;
70 if(histo2) delete histo2 ;
71 if(histo3) delete histo3 ;
72 if(histo4) delete histo4 ;
73 if(histo5) delete histo5 ;
74 if(histo6) delete histo6 ;
75 if(histo7) delete histo7 ;
76 if(histo8) delete histo8 ;
77 if(histo9) delete histo9 ;
78 if(histo10) delete histo10 ;
79 delete hbookManager;
80#endif
81}
82
83////////////////////////////////////////////////////////////////////////////////
84
85void F03RunAction::bookHisto()
86{
87#ifndef G4NOHIST
88 // init hbook
89
90 hbookManager = new HBookFile(histName, 68);
91 assert (hbookManager != 0);
92
93 // book histograms
94
95 if(nbinStep>0)
96 {
97 histo1 = hbookManager->histogram("number of steps/event"
98 ,nbinStep,Steplow,Stephigh) ;
99 assert (histo1 != 0);
100 }
101 if(nbinEn>0)
102 {
103 histo2 = hbookManager->histogram("Energy Loss (keV)"
104 ,nbinEn,Enlow/keV,Enhigh/keV) ;
105 assert (histo2 != 0);
106 }
107 if(nbinTh>0)
108 {
109 histo3 = hbookManager->histogram("angle distribution at exit(deg)"
110 ,nbinTh,Thlow/deg,Thhigh/deg) ;
111 assert (histo3 != 0);
112 }
113 if(nbinR>0)
114 {
115 histo4 = hbookManager->histogram("Lateral distribution at exit (mm)"
116 ,nbinR ,Rlow,Rhigh) ;
117 assert (histo4 != 0);
118 }
119 if(nbinTt>0)
120 {
121 histo5 = hbookManager->histogram("kinetic energy of the primary at exit(MeV)"
122 ,nbinTt,Ttlow,Tthigh) ;
123 assert (histo5 != 0);
124 }
125 if(nbinThback>0)
126 {
127 histo6 = hbookManager->histogram("angle distribution of backscattered primaries(deg)"
128 ,nbinThback,Thlowback/deg,Thhighback/deg) ;
129 assert (histo6 != 0);
130 }
131 if(nbinTb>0)
132 {
133 histo7 = hbookManager->histogram("kinetic energy of the backscattered primaries (MeV)"
134 ,nbinTb,Tblow,Tbhigh) ;
135 assert (histo7 != 0);
136 }
137 if(nbinTsec>0)
138 {
139 histo8 = hbookManager->histogram("kinetic energy of the charged secondaries (MeV)"
140 ,nbinTsec,Tseclow,Tsechigh) ;
141 assert (histo8 != 0);
142 }
143 if(nbinvertexz>0)
144 {
145 histo9 = hbookManager->histogram("z of secondary charged vertices(mm)"
146 ,nbinvertexz ,zlow,zhigh) ;
147 assert (histo9 != 0);
148 }
149 if(nbinGamma>0)
150 {
151 histo10= hbookManager->histogram("kinetic energy of gammas escaping the absorber (MeV)"
152 // ,nbinGamma,ElowGamma,EhighGamma) ;
153 ,nbinGamma,std::log10(ElowGamma),std::log10(EhighGamma)) ;
154 assert (histo10 != 0);
155 }
156#endif
157}
158
159/////////////////////////////////////////////////////////////////////////////
160
161void F03RunAction::BeginOfRunAction(const G4Run* aRun)
162{
163 G4cout << "### Run " << aRun->GetRunID() << " start." << G4endl;
164
165 // save Rndm status
166 if (saveRndm > 0)
167 {
168 HepRandom::showEngineStatus();
169 HepRandom::saveEngineStatus("beginOfRun.rndm");
170 }
171 G4UImanager* UI = G4UImanager::GetUIpointer();
172
173 G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance();
174
175 if(pVVisManager) UI->ApplyCommand("/vis/scene/notifyHandlers");
176
177
178 EnergySumAbs = 0. ;
179 EnergySquareSumAbs = 0.;
180 tlSumAbs = 0. ;
181 tlsquareSumAbs = 0. ;
182 nStepSumCharged = 0. ;
183 nStepSum2Charged= 0. ;
184 nStepSumNeutral = 0. ;
185 nStepSum2Neutral= 0. ;
186 TotNbofEvents = 0. ;
187 SumCharged=0.;
188 SumNeutral=0.;
189 Sum2Charged=0.;
190 Sum2Neutral=0.;
191 Selectron=0.;
192 Spositron=0.;
193
194 Transmitted=0.;
195 Reflected =0.;
196
197// plot definitions
198
199 if(nbinStep>0)
200 {
201 dStep=(Stephigh-Steplow)/nbinStep;
202 entryStep=0.;
203 underStep=0.;
204 overStep=0.;
205 for(G4int ist=0; ist<nbinStep; ist++)
206 {
207 distStep[ist]=0.;
208 }
209 }
210 if(nbinEn>0)
211 {
212 dEn = (Enhigh-Enlow)/nbinEn ;
213 entryEn=0.;
214 underEn=0.;
215 overEn=0.;
216
217 for (G4int ien=0; ien<nbinEn; ien++) distEn[ien]=0.;
218 }
219 if(nbinTt>0)
220 {
221 dTt = (Tthigh-Ttlow)/nbinTt ;
222 entryTt=0.;
223 underTt=0.;
224 overTt=0.;
225
226 for (G4int itt=0; itt<nbinTt; itt++) distTt[itt]=0.;
227
228 Ttmean=0.;
229 Tt2mean=0.;
230 }
231 if(nbinTb>0)
232 {
233 dTb = (Tbhigh-Tblow)/nbinTb ;
234 entryTb=0.;
235 underTb=0.;
236 overTb=0.;
237 for (G4int itt=0; itt<nbinTb; itt++)
238 {
239 distTb[itt]=0.;
240 }
241 Tbmean=0.;
242 Tb2mean=0.;
243 }
244 if(nbinTsec>0)
245 {
246 dTsec = (Tsechigh-Tseclow)/nbinTsec ;
247 entryTsec=0.;
248 underTsec=0.;
249 overTsec=0.;
250 for (G4int its=0; its<nbinTsec; its++)
251 {
252 distTsec[its]=0.;
253 }
254 }
255 if(nbinTh>0)
256 {
257 dTh = (Thhigh-Thlow)/nbinTh ;
258 entryTh=0.;
259 underTh=0.;
260 overTh=0.;
261 for (G4int ith=0; ith<nbinTh; ith++)
262 {
263 distTh[ith]=0.;
264 }
265 }
266
267 if(nbinThback>0)
268 {
269 dThback = (Thhighback-Thlowback)/nbinThback ;
270 entryThback=0.;
271 underThback=0.;
272 overThback=0.;
273 for (G4int ithback=0; ithback<nbinThback; ithback++)
274 {
275 distThback[ithback]=0.;
276 }
277 }
278
279
280 if(nbinR >0)
281 {
282 dR = (Rhigh-Rlow)/nbinR ;
283 entryR =0.;
284 underR =0.;
285 overR =0.;
286 for (G4int ir =0; ir <nbinR ; ir++)
287 {
288 distR[ir]=0.;
289 }
290 Rmean=0.;
291 R2mean=0.;
292 }
293
294 if(nbinGamma>0)
295 {
296 dEGamma = std::log(EhighGamma/ElowGamma)/nbinGamma ;
297 entryGamma = 0.;
298 underGamma=0.;
299 overGamma=0.;
300 for (G4int ig=0; ig<nbinGamma; ig++)
301 {
302 distGamma[ig]=0.;
303 }
304 }
305 if(nbinvertexz>0)
306 {
307 dz=(zhigh-zlow)/nbinvertexz;
308 entryvertexz=0.;
309 undervertexz=0.;
310 oververtexz=0.;
311 for(G4int iz=0; iz<nbinvertexz; iz++)
312 {
313 distvertexz[iz]=0.;
314 }
315 }
316
317 bookHisto();
318}
319
320/////////////////////////////////////////////////////////////////////////////
321
322void F03RunAction::EndOfRunAction(const G4Run* aRun)
323{
324 G4double sAbs,sigAbs,sigstep,sigcharged,signeutral;
325
326 tlSumAbs /= TotNbofEvents ;
327 sAbs = tlsquareSumAbs/TotNbofEvents-tlSumAbs*tlSumAbs ;
328 if(sAbs>0.)
329 sAbs = std::sqrt(sAbs/TotNbofEvents) ;
330 else
331 sAbs = 0. ;
332
333 EnergySumAbs /= TotNbofEvents ;
334 sigAbs = EnergySquareSumAbs/TotNbofEvents-EnergySumAbs*EnergySumAbs;
335 if(sigAbs>0.)
336 sigAbs = std::sqrt(sigAbs/TotNbofEvents);
337 else
338 sigAbs = 0.;
339
340 nStepSumCharged /= TotNbofEvents ;
341 sigstep = nStepSum2Charged/TotNbofEvents-nStepSumCharged*nStepSumCharged;
342 if(sigstep>0.)
343 sigstep = std::sqrt(sigstep/TotNbofEvents);
344 else
345 sigstep = 0.;
346 G4double sigch=sigstep ;
347
348 nStepSumNeutral /= TotNbofEvents ;
349 sigstep = nStepSum2Neutral/TotNbofEvents-nStepSumNeutral*nStepSumNeutral;
350 if(sigstep>0.)
351 sigstep = std::sqrt(sigstep/TotNbofEvents);
352 else
353 sigstep = 0.;
354 G4double signe=sigstep ;
355
356 SumCharged /= TotNbofEvents;
357 sigcharged = Sum2Charged/TotNbofEvents-SumCharged*SumCharged;
358 if(sigcharged>0.)
359 sigcharged = std::sqrt(sigcharged/TotNbofEvents);
360 else
361 sigcharged = 0. ;
362
363 SumNeutral /= TotNbofEvents;
364 signeutral = Sum2Neutral/TotNbofEvents-SumNeutral*SumNeutral;
365 if(signeutral>0.)
366 signeutral = std::sqrt(signeutral/TotNbofEvents);
367 else
368 signeutral = 0. ;
369
370 Selectron /= TotNbofEvents ;
371 Spositron /= TotNbofEvents ;
372
373 Transmitted /=TotNbofEvents ;
374 Reflected /=TotNbofEvents ;
375 G4cout << " ================== run summary =====================" << G4endl;
376 G4int prec = G4cout.precision(6);
377 G4cout << " end of Run TotNbofEvents = " <<
378 TotNbofEvents << G4endl ;
379 G4cout << " mean charged track length in absorber=" <<
380 tlSumAbs/mm << " +- " << sAbs/mm <<
381 " mm " << G4endl;
382 G4cout << G4endl;
383 G4cout << " mean energy deposit in absorber=" <<
384 EnergySumAbs/MeV << " +- " << sigAbs/MeV <<
385 " MeV " << G4endl ;
386 G4cout << G4endl ;
387 G4cout << " mean number of steps in absorber (charged) =" <<
388 nStepSumCharged << " +- " << sigch <<
389 " " << G4endl ;
390 G4cout << " mean number of steps in absorber (neutral) =" <<
391 nStepSumNeutral << " +- " << signe <<
392 " " << G4endl ;
393 G4cout << G4endl ;
394 G4cout << " mean number of charged secondaries = " <<
395 SumCharged << " +- " << sigcharged << G4endl;
396 G4cout << G4endl ;
397 G4cout << " mean number of neutral secondaries = " <<
398 SumNeutral << " +- " << signeutral << G4endl;
399 G4cout << G4endl ;
400
401 G4cout << " mean number of e-s =" << Selectron <<
402 " and e+s =" << Spositron << G4endl;
403 G4cout << G4endl;
404
405 G4cout << "(number) transmission coeff=" << Transmitted <<
406 " reflection coeff=" << Reflected << G4endl;
407 G4cout << G4endl;
408
409 if(nbinStep>0)
410 {G4double E , dnorm, norm ;
411 G4cout << " step number/event distribution " << G4endl ;
412 G4cout << "#entries=" << entryStep << " #underflows=" << underStep <<
413 " #overflows=" << overStep << G4endl ;
414 if( entryStep>0.)
415 {
416 E = Steplow - dStep ;
417 norm = TotNbofEvents ;
418 G4cout << " bin nb nsteplow entries normalized " << G4endl ;
419 for(G4int iss=0; iss<nbinStep; iss++)
420 {
421 E += dStep ;
422 dnorm = distStep[iss]/norm;
423 G4cout << std::setw(5) << iss << std::setw(10) << E <<
424 std::setw(12) << distStep[iss] <<
425 std::setw(12) << dnorm << G4endl ;
426 }
427 G4cout << G4endl;
428 }
429 }
430 if(nbinEn > 0)
431 {
432 std::ofstream fileOut("distribution.out", std::ios::out ) ;
433 fileOut.setf( std::ios::scientific, std::ios::floatfield );
434
435 std::ofstream normOut("normDist.out", std::ios::out ) ;
436 normOut.setf( std::ios::scientific, std::ios::floatfield );
437
438 G4double E , dnorm, norm,fmax,Emp,width ;
439 Emp=-999.999 ;
440 G4cout << " energy deposit distribution " << G4endl ;
441 G4cout << "#entries=" << entryEn << " #underflows=" << underEn <<
442 " #overflows=" << overEn << G4endl ;
443 if( entryEn>0.)
444 {
445 E = Enlow - dEn ;
446 norm = TotNbofEvents*1.0 ; // *dEn ;
447 G4cout << " bin nb Elow entries normalized " << G4endl ;
448 fmax = 0. ;
449
450 for(G4int ien=0; ien<nbinEn; ien++)
451 {
452 E += dEn ;
453
454 if(distEn[ien]>fmax)
455 {
456 fmax = distEn[ien] ;
457 Emp = E ; // most probable roughly
458 }
459 dnorm = distEn[ien]/norm;
460
461 G4cout << std::setw(5) << ien << std::setw(10) << E/keV <<
462 std::setw(12) << distEn[ien] <<
463 std::setw(12) << dnorm << G4endl ;
464
465 fileOut << E/keV << "\t"<< distEn[ien] << G4endl ;
466 normOut << E/keV << "\t"<< dnorm << G4endl ;
467 }
468 G4cout << G4endl;
469 G4int ii ;
470 G4double E1,E2 ;
471 E1=-1.e6 ;
472 E2=+1.e6 ;
473 E = Enlow -dEn ;
474 ii = -1;
475
476 for(G4int i1=0; i1<nbinEn; i1++)
477 {
478 E += dEn ;
479 if(ii<0)
480 {
481 if(distEn[i1] >= 0.5*fmax)
482 {
483 E1=E ;
484 ii=i1 ;
485 }
486 }
487 }
488 E = Enlow -dEn ;
489
490 for(G4int i2=0; i2<nbinEn; i2++)
491 {
492 E += dEn ;
493
494 if(distEn[i2] >= 0.5*fmax) E2=E ;
495 }
496 G4cout << " Emp = " << std::setw(15) << Emp/MeV << " width="
497 << std::setw(15) << (E2-E1)/MeV << " MeV " << G4endl;
498 G4cout << G4endl ;
499 }
500 }
501 if(nbinTt>0)
502 {
503 G4double E , dnorm, norm ,sig;
504 G4cout << " transmitted energy distribution " << G4endl ;
505 G4cout << "#entries=" << entryTt << " #underflows=" << underTt <<
506 " #overflows=" << overTt << G4endl ;
507 if( entryTt>0.)
508 {
509 Ttmean /= entryTt;
510 sig=Tt2mean/entryTt-Ttmean*Ttmean ;
511 if(sig<=0.)
512 sig=0.;
513 else
514 sig=std::sqrt(sig/entryTt) ;
515 G4cout << " mean energy of transmitted particles=" << Ttmean/keV <<
516 " +- " << sig/keV << " keV." << G4endl;
517 E = Ttlow - dTt ;
518 norm = TotNbofEvents*dTt ;
519 G4cout << " bin nb Elow entries normalized " << G4endl ;
520 for(G4int itt=0; itt<nbinTt; itt++)
521 {
522 E += dTt ;
523 dnorm = distTt[itt]/norm;
524 G4cout << std::setw(5) << itt << std::setw(10) << E <<
525 std::setw(12) << distTt[itt] <<
526 std::setw(12) << dnorm << G4endl ;
527 }
528 G4cout << G4endl;
529 }
530 }
531 if(nbinTb>0)
532 {
533 G4double E , dnorm, norm ,sig;
534 G4cout << " backscattered energy distribution " << G4endl ;
535 G4cout << "#entries=" << entryTb << " #underflows=" << underTb <<
536 " #overflows=" << overTb << G4endl ;
537 if( entryTb>0.)
538 {
539 Tbmean /= entryTb;
540 sig=Tb2mean/entryTb-Tbmean*Tbmean ;
541 if(sig<=0.)
542 sig=0.;
543 else
544 sig=std::sqrt(sig/entryTb) ;
545 G4cout << " mean energy of backscattered particles=" << Tbmean/keV <<
546 " +- " << sig/keV << " keV." << G4endl;
547 E = Tblow - dTb ;
548 norm = TotNbofEvents*dTb ;
549 G4cout << " bin nb Elow entries normalized " << G4endl ;
550 for(G4int itt=0; itt<nbinTb; itt++)
551 {
552 E += dTb ;
553 dnorm = distTb[itt]/norm;
554 G4cout << std::setw(5) << itt << std::setw(10) << E <<
555 std::setw(12) << distTb[itt] <<
556 std::setw(12) << dnorm << G4endl ;
557 }
558 G4cout << G4endl;
559 }
560 }
561 if(nbinTsec>0)
562 {G4double E , dnorm, norm ;
563 G4cout << " energy distribution of charged secondaries " << G4endl ;
564 G4cout << "#entries=" << entryTsec << " #underflows=" << underTsec <<
565 " #overflows=" << overTsec << G4endl ;
566 if( entryTsec>0.)
567 {
568 E = Tseclow - dTsec ;
569 norm = TotNbofEvents*dTsec ;
570 G4cout << " bin nb Elow entries normalized " << G4endl ;
571 for(G4int itt=0; itt<nbinTsec; itt++)
572 {
573 E += dTsec ;
574 dnorm = distTsec[itt]/norm;
575 G4cout << std::setw(5) << itt << std::setw(10) << E <<
576 std::setw(12) << distTsec[itt] <<
577 std::setw(12) << dnorm << G4endl ;
578 }
579 G4cout << G4endl;
580 }
581 }
582
583 if(nbinR >0)
584 {
585 G4double R , dnorm, norm,sig ;
586
587 std::ofstream fileOut("diameter.out", std::ios::out ) ;
588 fileOut.setf( std::ios::scientific, std::ios::floatfield );
589
590 std::ofstream normOut("normDiameter.out", std::ios::out ) ;
591 normOut.setf( std::ios::scientific, std::ios::floatfield );
592
593 G4cout << " R distribution " << G4endl ;
594 G4cout << "#entries=" << entryR << " #underflows=" << underR <<
595 " #overflows=" << overR << G4endl ;
596 if( entryR >0.)
597 {
598 Rmean /= entryR;
599 sig = R2mean/entryR - Rmean*Rmean;
600 if(sig<=0.) sig=0. ;
601 else sig = std::sqrt(sig/entryR) ;
602 G4cout << " mean lateral displacement at exit=" << Rmean/mm << " +- "
603 << sig/mm << " mm." << G4endl ;
604 R = Rlow - dR ;
605 norm = TotNbofEvents*dR ;
606 G4cout << " bin nb Rlow entries normalized " << G4endl ;
607 for(G4int ier=0; ier<nbinR ; ier++)
608 {
609 R+= dR ;
610 dnorm = distR[ier]/norm;
611 G4cout << std::setw(5) << ier << std::setw(10) << R <<
612 std::setw(12) << distR[ier] <<
613 std::setw(12) << dnorm << G4endl ;
614 fileOut << R/mm << "\t"<< distR[ier] << G4endl ;
615 normOut << R/mm << "\t"<< dnorm << G4endl ;
616 }
617 G4cout << G4endl;
618 }
619 }
620
621 if(nbinTh>0)
622 {G4double Th,Thdeg, dnorm, norm,fac0,fnorm,pere,Thpere,Thmean,sum;
623 G4cout << " angle distribution " << G4endl ;
624 G4cout << "#entries=" << entryTh << " #underflows=" << underTh <<
625 " #overflows=" << overTh << G4endl ;
626 if( entryTh>0.)
627 {
628 Th= Thlow - dTh ;
629 norm = TotNbofEvents ;
630 if(distTh[0] == 0.)
631 fac0 = 1. ;
632 else
633 fac0 = 1./distTh[0] ;
634 pere = 1./std::exp(1.) ;
635
636 G4cout << " bin nb Thlowdeg Thlowrad " <<
637 " entries normalized " << G4endl ;
638 Thpere = 0. ;
639 sum = 0. ;
640 Thmean = 0. ;
641 for(G4int ien=0; ien<nbinTh; ien++)
642 {
643 Th+= dTh ;
644 Thdeg = Th*180./pi ;
645 sum += distTh[ien] ;
646 Thmean += distTh[ien]*(Th+0.5*dTh) ;
647 dnorm = distTh[ien]/norm;
648 fnorm = fac0*distTh[ien] ;
649 if( fnorm > pere)
650 Thpere = Th ;
651 G4cout << std::setw(5) << ien << std::setw(10) << Thdeg << " " <<
652 std::setw(10) << Th << " " <<
653 std::setw(12) << distTh[ien] << " " <<
654 std::setw(12) << dnorm << " " << std::setw(12) << fnorm <<G4endl ;
655 }
656 Thmean /= sum ;
657 G4cout << G4endl;
658 G4cout << " mean = " << Thmean << " rad or " << 180.*Thmean/pi <<
659 " deg." << G4endl;
660 G4cout << " theta(1/e)=" << Thpere << " - " << Thpere+dTh << " rad "
661 << " or " << 180.*Thpere/pi << " - " << 180.*(Thpere+dTh)/pi
662 << " deg." << G4endl;
663 G4cout << G4endl;
664 }
665 }
666
667 if(nbinThback>0)
668 {G4double Thb,Thdegb, dnormb, normb,fac0b,fnormb,pereb,Thpereb,Thmeanb,sumb;
669 G4cout << " backscattering angle distribution " << G4endl ;
670 G4cout << "#entries=" << entryThback << " #underflows=" << underThback <<
671 " #overflows=" << overThback << G4endl ;
672 if( entryThback>0.)
673 {
674 Thb= Thlowback - dThback ;
675 normb = TotNbofEvents ;
676 if(distThback[0] == 0.)
677 fac0b = 1. ;
678 else
679 fac0b = 1./distThback[0] ;
680 pereb = 1./std::exp(1.) ;
681
682 G4cout << " bin nb Thlowdeg Thlowrad " <<
683 " entries normalized " << G4endl ;
684 Thpereb = 0. ;
685 sumb = 0. ;
686 Thmeanb = 0. ;
687 for(G4int ien=0; ien<nbinThback; ien++)
688 {
689 Thb+= dThback ;
690 Thdegb = Thb*180./pi ;
691 sumb += distThback[ien] ;
692 Thmeanb += distThback[ien]*(Thb+0.5*dThback) ;
693 dnormb = distThback[ien]/normb;
694 fnormb = fac0b*distThback[ien] ;
695 if( fnormb > pereb)
696 Thpereb = Thb ;
697 G4cout << std::setw(5) << ien << std::setw(10) << Thdegb << " " <<
698 std::setw(10) << Thb << " " <<
699 std::setw(12) << distThback[ien] << " " <<
700 std::setw(12) << dnormb << " " << std::setw(12) << fnormb <<G4endl ;
701 }
702 Thmeanb /= sumb ;
703 G4cout << G4endl;
704 G4cout << " mean = " << Thmeanb << " rad or " << 180.*Thmeanb/pi <<
705 " deg." << G4endl;
706 G4cout << " theta(1/e)=" << Thpereb << " - " << Thpereb+dThback << " rad "
707 << " or " << 180.*Thpereb/pi << " - " << 180.*(Thpereb+dThback)/pi
708 << " deg." << G4endl;
709 G4cout << G4endl;
710 }
711 }
712
713 if(nbinGamma>0)
714 {G4double E , fact,dnorm, norm ;
715 G4cout << " gamma energy distribution " << G4endl ;
716 G4cout << "#entries=" << entryGamma << " #underflows=" << underGamma <<
717 " #overflows=" << overGamma << G4endl ;
718 if( entryGamma>0.)
719 {
720 fact=std::exp(dEGamma) ;
721 E = ElowGamma/fact ;
722 norm = TotNbofEvents*dEGamma;
723 G4cout << " bin nb Elow entries normalized " << G4endl ;
724 for(G4int itt=0; itt<nbinGamma; itt++)
725 {
726 E *= fact ;
727 dnorm = distGamma[itt]/norm;
728 G4cout << std::setw(5) << itt << std::setw(13) << E <<
729 std::setw(12) << distGamma[itt] <<
730 std::setw(15) << dnorm << G4endl ;
731 }
732 G4cout << G4endl;
733 }
734 }
735
736 if(nbinvertexz >0)
737 {G4double z , dnorm, norm ;
738 G4cout << " vertex Z distribution " << G4endl ;
739 G4cout << "#entries=" << entryvertexz << " #underflows=" << undervertexz <<
740 " #overflows=" << oververtexz << G4endl ;
741 if( entryvertexz >0.)
742 {
743 z =zlow - dz ;
744 norm = TotNbofEvents*dz ;
745 G4cout << " bin nb zlow entries normalized " << G4endl ;
746 for(G4int iez=0; iez<nbinvertexz ; iez++)
747 {
748 z+= dz ;
749 if(std::abs(z)<1.e-12) z=0.;
750 dnorm = distvertexz[iez]/norm;
751 G4cout << std::setw(5) << iez << std::setw(10) << z <<
752 std::setw(12) << distvertexz[iez] <<
753 std::setw(12) << dnorm << G4endl ;
754 }
755 G4cout << G4endl;
756 }
757 }
758
759 G4cout.precision(prec);
760
761 if (G4VVisManager::GetConcreteInstance())
762 {
763 G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update");
764 }
765 // Write histogram file
766
767#ifndef G4NOHIST
768 hbookManager->write();
769#endif
770
771 // save Rndm status
772
773 if (saveRndm == 1)
774 {
775 HepRandom::showEngineStatus();
776 HepRandom::saveEngineStatus("endOfRun.rndm");
777 }
778}
779
780///////////////////////////////////////////////////////////////////////////
781
782void F03RunAction::CountEvent()
783{
784 TotNbofEvents += 1. ;
785}
786
787/////////////////////////////////////////////////////////////////////////
788
789void F03RunAction::AddnStepsCharged(G4double ns)
790{
791 nStepSumCharged += ns;
792 nStepSum2Charged += ns*ns;
793}
794
795////////////////////////////////////////////////////////////////////////
796
797void F03RunAction::AddnStepsNeutral(G4double ns)
798{
799 nStepSumNeutral += ns;
800 nStepSum2Neutral += ns*ns;
801}
802
803////////////////////////////////////////////////////////////////////////////
804
805void F03RunAction::AddEdeps(G4double Eabs)
806{
807 EnergySumAbs += Eabs;
808 EnergySquareSumAbs += Eabs*Eabs;
809}
810
811/////////////////////////////////////////////////////////////////////////////
812
813void F03RunAction::AddTrackLength(G4double tlabs)
814{
815 tlSumAbs += tlabs;
816 tlsquareSumAbs += tlabs*tlabs ;
817}
818
819/////////////////////////////////////////////////////////////////////////////
820
821void F03RunAction::AddTrRef(G4double tr,G4double ref)
822{
823 Transmitted += tr ;
824 Reflected += ref;
825}
826
827/////////////////////////////////////////////////////////////////////////////
828
829void F03RunAction::FillNbOfSteps(G4double ns)
830{
831#ifndef G4NOHIST
832 const G4double eps = 1.e-10 ;
833 G4double n,bin ;
834 G4int ibin;
835
836 if(histo1)
837 {
838 entryStep += 1. ;
839
840 if(ns<Steplow)
841 underStep += 1. ;
842 else if(ns>=Stephigh)
843 overStep += 1. ;
844 else
845 {
846 n = ns+eps ;
847 bin = (n-Steplow)/dStep ;
848 ibin= (G4int)bin ;
849 distStep[ibin] += 1. ;
850 }
851 histo1->accumulate(ns) ;
852 }
853#endif
854}
855
856//////////////////////////////////////////////////////////////////////////////
857
858void F03RunAction::FillEn(G4double En)
859{
860#ifndef G4NOHIST
861 G4double bin ;
862 G4int ibin;
863
864 if(histo2)
865 {
866 entryEn += 1. ;
867
868 if(En < Enlow) underEn += 1. ;
869 else if( En >= Enhigh) overEn += 1. ;
870 else
871 {
872 bin = (En-Enlow)/dEn ;
873 ibin= (G4int)bin ;
874 distEn[ibin] += 1. ;
875 }
876 histo2->accumulate(En/keV) ; // was /MeV
877 }
878#endif
879}
880
881////////////////////////////////////////////////////////////////////////////
882
883void F03RunAction::FillTt(G4double En)
884{
885#ifndef G4NOHIST
886 G4double bin ;
887 G4int ibin;
888
889 if(histo5)
890 {
891 entryTt += 1. ;
892 Ttmean += En ;
893 Tt2mean += En*En ;
894
895 if(En<Ttlow)
896 underTt += 1. ;
897 else if(En>=Tthigh)
898 overTt += 1. ;
899 else
900 {
901 bin = (En-Ttlow)/dTt ;
902 ibin= (G4int)bin ;
903 distTt[ibin] += 1. ;
904 }
905 histo5->accumulate(En/MeV) ;
906 }
907#endif
908}
909
910//////////////////////////////////////////////////////////////////////////////
911
912void F03RunAction::FillTb(G4double En)
913{
914#ifndef G4NOHIST
915 G4double bin ;
916 G4int ibin;
917
918 if(histo7)
919 {
920 entryTb += 1. ;
921 Tbmean += En ;
922 Tb2mean += En*En ;
923
924 if(En<Tblow)
925 underTb += 1. ;
926 else if(En>=Tbhigh)
927 overTb += 1. ;
928 else
929 {
930 bin = (En-Tblow)/dTb ;
931 ibin= (G4int)bin ;
932 distTb[ibin] += 1. ;
933 }
934 histo7->accumulate(En/MeV) ;
935 }
936#endif
937}
938
939///////////////////////////////////////////////////////////////////////////////
940
941void F03RunAction::FillTsec(G4double En)
942{
943#ifndef G4NOHIST
944 G4double bin ;
945 G4int ibin;
946
947 if(histo8)
948 {
949 entryTsec += 1. ;
950
951 if(En<Tseclow)
952 underTsec += 1. ;
953 else if(En>=Tsechigh)
954 overTsec += 1. ;
955 else
956 {
957 bin = (En-Tseclow)/dTsec ;
958 ibin= (G4int)bin ;
959 distTsec[ibin] += 1. ;
960 }
961 histo8->accumulate(En/MeV) ;
962 }
963#endif
964}
965
966/////////////////////////////////////////////////////////////////////////////
967
968void F03RunAction::FillGammaSpectrum(G4double En)
969{
970#ifndef G4NOHIST
971 G4double bin ;
972 G4int ibin;
973
974 if(histo10)
975 {
976 entryGamma += 1. ;
977
978 if(En<ElowGamma)
979 underGamma += 1. ;
980 else if(En>=EhighGamma)
981 overGamma += 1. ;
982 else
983 {
984 bin = std::log(En/ElowGamma)/dEGamma;
985 ibin= (G4int)bin ;
986 distGamma[ibin] += 1. ;
987 }
988 histo10->accumulate(std::log10(En/MeV)) ;
989 }
990#endif
991}
992
993////////////////////////////////////////////////////////////////////////////////
994
995void F03RunAction::FillTh(G4double Th)
996{
997#ifndef G4NOHIST
998 static const G4double cn=pi/(64800.*dTh) ;
999 static const G4double cs=pi/
1000 (64800.*(std::cos(Thlow)-std::cos(Thlow+dTh)));
1001 G4double bin,Thbin ,wg;
1002 G4int ibin;
1003
1004 if(histo3)
1005 {
1006 entryTh += 1. ;
1007
1008 wg = 0.;
1009
1010 if(Th<Thlow)
1011 underTh += 1. ;
1012 else if(Th>=Thhigh)
1013 overTh += 1. ;
1014 else
1015 {
1016 bin = (Th-Thlow)/dTh ;
1017 ibin= (G4int)bin ;
1018 Thbin = Thlow+ibin*dTh ;
1019 if(Th > 0.001*dTh)
1020 wg=cn/std::sin(Th) ;
1021 else
1022 {
1023 G4double thdeg=Th*180./pi;
1024 G4cout << "theta < 0.001*dth (from plot excluded) theta="
1025 << std::setw(12) << std::setprecision(4) << thdeg << G4endl;
1026 wg=0. ;
1027 }
1028 distTh[ibin] += wg ;
1029 }
1030
1031 histo3->accumulate(Th/deg, wg) ;
1032 }
1033#endif
1034}
1035
1036//////////////////////////////////////////////////////////////////////////
1037
1038void F03RunAction::FillThBack(G4double Th)
1039{
1040#ifndef G4NOHIST
1041 static const G4double cn=pi/(64800.*dThback) ;
1042 static const G4double cs=pi/
1043 (64800.*(std::cos(Thlowback)-std::cos(Thlowback+dThback)));
1044 G4double bin,Thbin,wg ;
1045 G4int ibin;
1046
1047 if(histo6)
1048 {
1049 entryThback += 1. ;
1050
1051 if(Th<Thlowback)
1052 underThback += 1. ;
1053 else if(Th>=Thhighback)
1054 overThback += 1. ;
1055 else
1056 {
1057 bin = (Th-Thlowback)/dThback ;
1058 ibin= (G4int)bin ;
1059 Thbin = Thlowback+ibin*dThback ;
1060 if(Th > 0.001*dThback)
1061 wg=cn/std::sin(Th) ;
1062 else
1063 {
1064 G4double thdeg=Th*180./pi;
1065 G4cout << "theta < 0.001*dth (from plot excluded) theta="
1066 << std::setw(12) << std::setprecision(4) << thdeg << G4endl;
1067 wg=0. ;
1068 }
1069 distThback[ibin] += wg ;
1070 }
1071 histo6->accumulate(Th/deg, wg) ;
1072 }
1073#endif
1074}
1075
1076//////////////////////////////////////////////////////////////////////////
1077
1078void F03RunAction::FillR(G4double R )
1079{
1080#ifndef G4NOHIST
1081 G4double bin ;
1082 G4int ibin;
1083
1084 if(histo4)
1085 {
1086 entryR += 1. ;
1087 Rmean += R ;
1088 R2mean += R*R ;
1089
1090 if(R <Rlow)
1091 underR += 1. ;
1092 else if(R >=Rhigh)
1093 overR += 1. ;
1094 else
1095 {
1096 bin = (R -Rlow)/dR ;
1097 ibin= (G4int)bin ;
1098 distR[ibin] += 1. ;
1099 }
1100 histo4->accumulate(R/mm) ;
1101 }
1102#endif
1103}
1104
1105/////////////////////////////////////////////////////////////////////////////
1106
1107void F03RunAction::Fillvertexz(G4double z )
1108{
1109#ifndef G4NOHIST
1110 G4double bin ;
1111 G4int ibin;
1112
1113 if(histo9)
1114 {
1115 entryvertexz += 1. ;
1116
1117 if(z <zlow)
1118 undervertexz += 1. ;
1119 else if(z >=zhigh)
1120 oververtexz += 1. ;
1121 else
1122 {
1123 bin = (z -zlow)/dz ;
1124 ibin = (G4int)bin ;
1125 distvertexz[ibin] += 1. ;
1126 }
1127 histo9->accumulate(z/mm) ;
1128 }
1129#endif
1130}
1131
1132//////////////////////////////////////////////////////////////////////////////
1133
1134void F03RunAction::SethistName(G4String name)
1135{
1136 histName = name ;
1137 G4cout << " hist file = " << histName << G4endl;
1138}
1139
1140void F03RunAction::SetnbinStep(G4int nbin)
1141{
1142 nbinStep = nbin ;
1143 if(nbinStep>0)
1144 G4cout << " Nb of bins in #step plot = " << nbinStep << G4endl ;
1145}
1146
1147void F03RunAction::SetSteplow(G4double low)
1148{
1149 Steplow = low ;
1150 if(nbinStep>0)
1151 G4cout << " low in the #step plot = " << Steplow << G4endl ;
1152}
1153void F03RunAction::SetStephigh(G4double high)
1154{
1155 Stephigh = high ;
1156 if(nbinStep>0)
1157 G4cout << " high in the #step plot = " << Stephigh << G4endl ;
1158}
1159
1160////////////////////////////////////////////////////////////////////////
1161
1162void F03RunAction::SetnbinEn(G4int nbin)
1163{
1164 nbinEn = nbin ;
1165
1166 if(nbinEn > 0) G4cout << " Nb of bins in Edep plot = " << nbinEn << G4endl ;
1167}
1168
1169void F03RunAction::SetEnlow(G4double Elow)
1170{
1171 Enlow = Elow ;
1172 if(nbinEn>0) G4cout << " Elow in the Edep plot = " << Enlow << G4endl ;
1173}
1174
1175void F03RunAction::SetEnhigh(G4double Ehigh)
1176{
1177 Enhigh = Ehigh ;
1178
1179 if(nbinEn>0) G4cout << " Ehigh in the Edep plot = " << Enhigh << G4endl ;
1180}
1181
1182/////////////////////////////////////////////////////////////////////////
1183
1184void F03RunAction::SetnbinGamma(G4int nbin)
1185{
1186 nbinGamma = nbin ;
1187 if(nbinGamma>0)
1188 G4cout << " Nb of bins in gamma spectrum plot = " << nbinGamma << G4endl ;
1189}
1190
1191void F03RunAction::SetElowGamma(G4double Elow)
1192{
1193 ElowGamma = Elow ;
1194 if(nbinGamma>0)
1195 G4cout << " Elow in the gamma spectrum plot = " << ElowGamma << G4endl ;
1196}
1197
1198void F03RunAction::SetEhighGamma(G4double Ehigh)
1199{
1200 EhighGamma = Ehigh ;
1201 if(nbinGamma>0)
1202 G4cout << " Ehigh in the gamma spectrum plot = " << EhighGamma << G4endl ;
1203}
1204
1205void F03RunAction::SetnbinTt(G4int nbin)
1206{
1207 nbinTt = nbin ;
1208 if(nbinTt>0)
1209 G4cout << " Nb of bins in Etransmisssion plot = " << nbinTt << G4endl ;
1210}
1211
1212void F03RunAction::SetTtlow(G4double Elow)
1213{
1214 Ttlow = Elow ;
1215 if(nbinTt>0)
1216 G4cout << " Elow in the Etransmission plot = " << Ttlow << G4endl ;
1217}
1218
1219void F03RunAction::SetTthigh(G4double Ehigh)
1220{
1221 Tthigh = Ehigh ;
1222 if(nbinTt>0)
1223 G4cout << " Ehigh in the Etransmission plot = " << Tthigh << G4endl ;
1224}
1225
1226void F03RunAction::SetnbinTb(G4int nbin)
1227{
1228 nbinTb = nbin ;
1229 if(nbinTb>0)
1230 G4cout << " Nb of bins in Ebackscattered plot = " << nbinTb << G4endl ;
1231}
1232
1233void F03RunAction::SetTblow(G4double Elow)
1234{
1235 Tblow = Elow ;
1236 if(nbinTb>0)
1237 G4cout << " Elow in the Ebackscattered plot = " << Tblow << G4endl ;
1238}
1239
1240void F03RunAction::SetTbhigh(G4double Ehigh)
1241{
1242 Tbhigh = Ehigh ;
1243 if(nbinTb>0)
1244 G4cout << " Ehigh in the Ebackscattered plot = " << Tbhigh << G4endl ;
1245}
1246
1247void F03RunAction::SetnbinTsec(G4int nbin)
1248{
1249 nbinTsec = nbin ;
1250 if(nbinTsec>0)
1251 G4cout << " Nb of bins in Tsecondary plot = " << nbinTsec << G4endl ;
1252}
1253
1254void F03RunAction::SetTseclow(G4double Elow)
1255{
1256 Tseclow = Elow ;
1257 if(nbinTsec>0)
1258 G4cout << " Elow in the Tsecondary plot = " << Tseclow << G4endl ;
1259}
1260
1261void F03RunAction::SetTsechigh(G4double Ehigh)
1262{
1263 Tsechigh = Ehigh ;
1264 if(nbinTsec>0)
1265 G4cout << " Ehigh in the Tsecondary plot = " << Tsechigh << G4endl ;
1266}
1267
1268void F03RunAction::SetnbinR(G4int nbin)
1269{
1270 nbinR = nbin ;
1271 if(nbinR>0)
1272 G4cout << " Nb of bins in R plot = " << nbinR << G4endl ;
1273}
1274
1275void F03RunAction::SetRlow(G4double rlow)
1276{
1277 Rlow = rlow ;
1278 if(nbinR>0)
1279 G4cout << " Rlow in the R plot = " << Rlow << G4endl ;
1280}
1281
1282void F03RunAction::SetRhigh(G4double rhigh)
1283{
1284 Rhigh = rhigh ;
1285 if(nbinR>0)
1286 G4cout << " Rhigh in the R plot = " << Rhigh << G4endl ;
1287}
1288
1289void F03RunAction::Setnbinzvertex(G4int nbin)
1290{
1291 nbinvertexz = nbin ;
1292 if(nbinvertexz>0)
1293 G4cout << " Nb of bins in Z plot = " << nbinvertexz << G4endl ;
1294}
1295
1296void F03RunAction::Setzlow(G4double z)
1297{
1298 zlow = z ;
1299 if(nbinvertexz>0)
1300 G4cout << " zlow in the Z plot = " << zlow << G4endl ;
1301}
1302
1303void F03RunAction::Setzhigh(G4double z)
1304{
1305 zhigh = z ;
1306 if(nbinvertexz>0)
1307 G4cout << " zhigh in the Z plot = " << zhigh << G4endl ;
1308}
1309
1310void F03RunAction::SetnbinTh(G4int nbin)
1311{
1312 nbinTh = nbin ;
1313 if(nbinTh>0)
1314 G4cout << " Nb of bins in Theta plot = " << nbinTh << G4endl ;
1315}
1316
1317void F03RunAction::SetThlow(G4double Tlow)
1318{
1319 Thlow = Tlow ;
1320 if(nbinTh>0)
1321 G4cout << " Tlow in the Theta plot = " << Thlow << G4endl ;
1322}
1323
1324void F03RunAction::SetThhigh(G4double Thigh)
1325{
1326 Thhigh = Thigh ;
1327 if(nbinTh>0)
1328 G4cout << " Thigh in the Theta plot = " << Thhigh << G4endl ;
1329}
1330
1331void F03RunAction::SetnbinThBack(G4int nbin)
1332{
1333 nbinThback = nbin ;
1334 if(nbinThback>0)
1335 G4cout << " Nb of bins in Theta plot = " << nbinThback << G4endl ;
1336}
1337
1338void F03RunAction::SetThlowBack(G4double Tlow)
1339{
1340 Thlowback = Tlow ;
1341 if(nbinThback>0)
1342 G4cout << " Tlow in the Theta plot = " << Thlowback << G4endl ;
1343}
1344
1345void F03RunAction::SetThhighBack(G4double Thigh)
1346{
1347 Thhighback = Thigh ;
1348 if(nbinThback>0)
1349 G4cout << " Thigh in the Theta plot = " << Thhighback << G4endl ;
1350}
1351
1352void F03RunAction::CountParticles(G4double nch,G4double nne)
1353{
1354 SumCharged += nch ;
1355 SumNeutral += nne ;
1356 Sum2Charged += nch*nch ;
1357 Sum2Neutral += nne*nne ;
1358}
1359
1360void F03RunAction::AddEP(G4double nele,G4double npos)
1361{
1362 Selectron += nele;
1363 Spositron += npos;
1364}
1365
1366//
1367//
1368////////////////////////////////////////////////////////////////////////
Note: See TracBrowser for help on using the repository browser.