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 // TETRunAction.cc 26 // TETRunAction.cc 27 // 27 // 28 // Author: Haegin Han 28 // Author: Haegin Han 29 // Reference: ICRP Publication 145. Ann. ICRP 29 // Reference: ICRP Publication 145. Ann. ICRP 49(3), 2020. 30 // Geant4 Contributors: J. Allison and S. Guat 30 // Geant4 Contributors: J. Allison and S. Guatelli 31 // 31 // 32 32 33 #include "TETRunAction.hh" 33 #include "TETRunAction.hh" 34 34 35 TETRunAction::TETRunAction(TETModelImport* _te 35 TETRunAction::TETRunAction(TETModelImport* _tetData, G4String _output) 36 :fTetData(_tetData), fRun(nullptr), fNumOfEven 36 :fTetData(_tetData), fRun(nullptr), fNumOfEvent(0), fRunID(0), fOutputFile(_output) 37 {} 37 {} 38 38 39 G4Run* TETRunAction::GenerateRun() 39 G4Run* TETRunAction::GenerateRun() 40 { 40 { 41 // generate run 41 // generate run 42 fRun = new TETRun(); 42 fRun = new TETRun(); 43 return fRun; 43 return fRun; 44 } 44 } 45 45 46 void TETRunAction::BeginOfRunAction(const G4Ru 46 void TETRunAction::BeginOfRunAction(const G4Run* aRun) 47 { 47 { 48 // print the progress at the interval of 10% 48 // print the progress at the interval of 10% 49 fNumOfEvent=aRun->GetNumberOfEventToBeProcess 49 fNumOfEvent=aRun->GetNumberOfEventToBeProcessed(); 50 G4RunManager::GetRunManager()->SetPrintProgre 50 G4RunManager::GetRunManager()->SetPrintProgress(int(fNumOfEvent*0.1)); 51 } 51 } 52 52 53 void TETRunAction::EndOfRunAction(const G4Run* 53 void TETRunAction::EndOfRunAction(const G4Run* aRun) 54 { 54 { 55 // print the result only in the Master 55 // print the result only in the Master 56 if(!isMaster) return; 56 if(!isMaster) return; 57 57 58 // get the run ID 58 // get the run ID 59 fRunID = aRun->GetRunID(); 59 fRunID = aRun->GetRunID(); 60 60 61 // Print the run result by G4cout and std::of 61 // Print the run result by G4cout and std::ofstream 62 // 62 // 63 // print by G4cout 63 // print by G4cout 64 PrintResult(G4cout); 64 PrintResult(G4cout); 65 65 66 // print by std::ofstream 66 // print by std::ofstream 67 std::ofstream ofs(fOutputFile.c_str()); 67 std::ofstream ofs(fOutputFile.c_str()); 68 PrintResult(ofs); 68 PrintResult(ofs); 69 ofs.close(); 69 ofs.close(); 70 } 70 } 71 71 72 void TETRunAction::PrintResult(std::ostream &o 72 void TETRunAction::PrintResult(std::ostream &out) 73 { 73 { 74 // Print run result 74 // Print run result 75 // 75 // 76 using namespace std; 76 using namespace std; 77 EDEPMAP edepMap = *fRun->GetEdepMap(); 77 EDEPMAP edepMap = *fRun->GetEdepMap(); 78 78 79 out << G4endl 79 out << G4endl 80 << "======================================= 80 << "=====================================================================" << G4endl 81 << " Run #" << fRunID << " / Number of even 81 << " Run #" << fRunID << " / Number of event processed : "<< fNumOfEvent << G4endl 82 << "======================================= 82 << "=====================================================================" << G4endl 83 << "organ ID| " 83 << "organ ID| " 84 << setw(19) << "Organ Mass (g)" 84 << setw(19) << "Organ Mass (g)" 85 << setw(19) << "Dose (Gy/source)" 85 << setw(19) << "Dose (Gy/source)" 86 << setw(19) << "Relative Error" << G4endl; 86 << setw(19) << "Relative Error" << G4endl; 87 87 88 out.precision(3); 88 out.precision(3); 89 auto massMap = fTetData->GetMassMap(); 89 auto massMap = fTetData->GetMassMap(); 90 for(auto itr : massMap){ 90 for(auto itr : massMap){ 91 G4double meanDose = edepMap[itr.first]. 91 G4double meanDose = edepMap[itr.first].first / itr.second / fNumOfEvent; 92 G4double squareDose = edepMap[itr.first].s 92 G4double squareDose = edepMap[itr.first].second / (itr.second*itr.second); 93 G4double variance = ((squareDose/fNumOf 93 G4double variance = ((squareDose/fNumOfEvent) - (meanDose*meanDose))/fNumOfEvent; 94 G4double relativeE(1); 94 G4double relativeE(1); 95 if(meanDose > 0) relativeE = sqrt(varian 95 if(meanDose > 0) relativeE = sqrt(variance)/meanDose; 96 96 97 out << setw(8) << itr.first << "| " 97 out << setw(8) << itr.first << "| " 98 << setw(19) << fixed << itr.second/ 98 << setw(19) << fixed << itr.second/g; 99 out << setw(19) << scientific << meanDose/ 99 out << setw(19) << scientific << meanDose/(joule/kg); 100 out << setw(19) << fixed << relativeE 100 out << setw(19) << fixed << relativeE << G4endl; 101 } 101 } 102 out << "==================================== 102 out << "=====================================================================" << G4endl << G4endl; 103 } 103 } 104 104