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