Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 /// \file RunAction.cc 27 /// \brief Implementation of the RunAction cla 28 // 29 // 30 // 31 //....oooOO0OOooo........oooOO0OOooo........oo 32 //....oooOO0OOooo........oooOO0OOooo........oo 33 34 #include "RunAction.hh" 35 36 #include "HistoManager.hh" 37 38 #include "G4AccumulableManager.hh" 39 #include "G4Run.hh" 40 #include "G4RunManager.hh" 41 #include "G4UnitsTable.hh" 42 43 //....oooOO0OOooo........oooOO0OOooo........oo 44 45 RunAction::RunAction(HistoManager* histo) : fH 46 { 47 // Register accumulable to the accumulable m 48 G4AccumulableManager* accumulableManager = G 49 accumulableManager->Register(fSumEAbs); 50 accumulableManager->Register(fSum2EAbs); 51 accumulableManager->Register(fSumEGap); 52 accumulableManager->Register(fSum2EGap); 53 accumulableManager->Register(fSumLAbs); 54 accumulableManager->Register(fSum2LAbs); 55 accumulableManager->Register(fSumLGap); 56 accumulableManager->Register(fSum2LGap); 57 } 58 59 //....oooOO0OOooo........oooOO0OOooo........oo 60 61 RunAction::~RunAction() = default; 62 63 //....oooOO0OOooo........oooOO0OOooo........oo 64 65 void RunAction::BeginOfRunAction(const G4Run* 66 { 67 G4cout << "### Run " << aRun->GetRunID() << 68 69 // reset accumulables to their initial value 70 G4AccumulableManager::Instance()->Reset(); 71 72 // histograms 73 // 74 fHistoManager->Book(); 75 } 76 77 //....oooOO0OOooo........oooOO0OOooo........oo 78 79 void RunAction::FillPerEvent(G4double EAbs, G4 80 { 81 // accumulate statistic 82 // 83 fSumEAbs += EAbs; 84 fSum2EAbs += EAbs * EAbs; 85 fSumEGap += EGap; 86 fSum2EGap += EGap * EGap; 87 88 fSumLAbs += LAbs; 89 fSum2LAbs += LAbs * LAbs; 90 fSumLGap += LGap; 91 fSum2LGap += LGap * LGap; 92 } 93 94 //....oooOO0OOooo........oooOO0OOooo........oo 95 96 void RunAction::EndOfRunAction(const G4Run* aR 97 { 98 // Merge accumulables 99 G4AccumulableManager::Instance()->Merge(); 100 101 G4int nofEvents = aRun->GetNumberOfEvent(); 102 if (nofEvents == 0) { 103 // close open files 104 fHistoManager->Save(); 105 return; 106 } 107 108 // compute statistics: mean and rms 109 // 110 auto sumEAbs = fSumEAbs.GetValue(); 111 auto sum2EAbs = fSum2EAbs.GetValue(); 112 sumEAbs /= nofEvents; 113 sum2EAbs /= nofEvents; 114 auto rmsEAbs = sum2EAbs - sumEAbs * sumEAbs; 115 if (rmsEAbs > 0.) { 116 rmsEAbs = std::sqrt(rmsEAbs); 117 } 118 else { 119 rmsEAbs = 0.; 120 } 121 122 auto sumEGap = fSumEGap.GetValue(); 123 auto sum2EGap = fSum2EGap.GetValue(); 124 sumEGap /= nofEvents; 125 sum2EGap /= nofEvents; 126 auto rmsEGap = sum2EGap - sumEGap * sumEGap; 127 if (rmsEGap > 0.) { 128 rmsEGap = std::sqrt(rmsEGap); 129 } 130 else { 131 rmsEGap = 0.; 132 } 133 134 auto sumLAbs = fSumLAbs.GetValue(); 135 auto sum2LAbs = fSum2LAbs.GetValue(); 136 sumLAbs /= nofEvents; 137 sum2LAbs /= nofEvents; 138 auto rmsLAbs = sum2LAbs - sumLAbs * sumLAbs; 139 if (rmsLAbs > 0.) { 140 rmsLAbs = std::sqrt(rmsLAbs); 141 } 142 else { 143 rmsLAbs = 0.; 144 } 145 146 auto sumLGap = fSumLGap.GetValue(); 147 auto sum2LGap = fSum2LGap.GetValue(); 148 sumLGap /= nofEvents; 149 sum2LGap /= nofEvents; 150 G4double rmsLGap = sum2LGap - sumLGap * sumL 151 if (rmsLGap > 0.) { 152 rmsLGap = std::sqrt(rmsLGap); 153 } 154 else { 155 rmsLGap = 0.; 156 } 157 158 // print 159 // 160 G4cout << "\n--------------------End of Run- 161 << "\n mean Energy in Absorber : " << 162 << G4BestUnit(rmsEAbs, "Energy") 163 << "\n mean Energy in Gap : " << 164 << G4BestUnit(rmsEGap, "Energy") << G 165 166 G4cout << "\n mean trackLength in Absorber : 167 << G4BestUnit(rmsLAbs, "Length") 168 << "\n mean trackLength in Gap : 169 << G4BestUnit(rmsLGap, "Length") 170 << "\n------------------------------- 171 << G4endl; 172 173 // save histograms 174 // 175 fHistoManager->PrintStatistic(); 176 fHistoManager->Save(); 177 } 178 179 //....oooOO0OOooo........oooOO0OOooo........oo 180