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 // 27 /// \file medical/electronScattering2/src/Elec 28 /// \brief Implementation of the ElectronRun c 29 30 #include "ElectronRun.hh" 31 32 #include "G4MultiFunctionalDetector.hh" 33 #include "G4SDManager.hh" 34 #include "G4SystemOfUnits.hh" 35 #include "G4VPrimitiveScorer.hh" 36 37 #include <assert.h> 38 39 //....oooOO0OOooo........oooOO0OOooo........oo 40 41 ElectronRun::ElectronRun() : G4Run(), fMap() 42 { 43 fMap[0] = new G4THitsMap<G4double>("MyDetect 44 fMap[1] = new G4THitsMap<G4double>("MyDetect 45 fMap[2] = new G4THitsMap<G4double>("MyDetect 46 fMap[3] = new G4THitsMap<G4double>("MyDetect 47 } 48 49 //....oooOO0OOooo........oooOO0OOooo........oo 50 51 ElectronRun::~ElectronRun() 52 { 53 // Important to clean up the map 54 std::map<G4int, G4THitsMap<G4double>*>::iter 55 56 while (iter != fMap.end()) { 57 delete iter->second; 58 iter++; 59 } 60 } 61 62 //....oooOO0OOooo........oooOO0OOooo........oo 63 64 void ElectronRun::RecordEvent(const G4Event* a 65 { 66 // Get the hits collection 67 G4HCofThisEvent* eventHitCollection = anEven 68 69 if (!eventHitCollection) return; 70 71 // Update our private fMap 72 std::map<G4int, G4THitsMap<G4double>*>::iter 73 74 while (iter != fMap.end()) { 75 G4int id = iter->first; 76 77 // Get the hit collection corresponding to 78 G4THitsMap<G4double>* eventHitsMap = 79 dynamic_cast<G4THitsMap<G4double>*>(even 80 81 // Expect this to exist 82 assert(0 != eventHitsMap); 83 84 // Accumulate event data into our G4THitsM 85 *(iter->second) += *eventHitsMap; 86 87 iter++; 88 } 89 90 G4Run::RecordEvent(anEvent); 91 } 92 93 //....oooOO0OOooo........oooOO0OOooo........oo 94 95 void ElectronRun::DumpData(G4String& outputFil 96 { 97 // Titles 98 std::vector<G4String> title; 99 title.push_back("Radius"); 100 101 // Output map - energy binning on x axis, th 102 std::map<G4int, std::vector<G4double>> outpu 103 104 G4int nThetaBins = 233; 105 106 // Energy bins depends on the number of scor 107 G4int nEnergyBins = fMap.size(); 108 109 G4int i(0), j(0); 110 111 // Initialise current to 0 in all bins 112 for (i = 0; i < nThetaBins; i++) { 113 for (j = 0; j < nEnergyBins; j++) { 114 output[i].push_back(0); 115 } 116 } 117 118 i = 0; 119 120 // Fill the output map 121 std::map<G4int, G4THitsMap<G4double>*>::cons 122 123 while (iter != fMap.end()) { 124 G4THitsMap<G4double>* hitMap = iter->secon 125 126 title.push_back(hitMap->GetName()); 127 128 std::map<G4int, G4double*>* myMap = hitMap 129 130 for (j = 0; j < nThetaBins; j++) { 131 G4double* current = (*myMap)[j]; 132 if (0 != current) output[j][i] = (*curre 133 } 134 135 i++; 136 iter++; 137 } 138 139 Print(title, output, outputFileSpec); 140 } 141 142 //....oooOO0OOooo........oooOO0OOooo........oo 143 144 void ElectronRun::Print(const std::vector<G4St 145 const std::map<G4int, 146 G4String& outputFileSp 147 { 148 // Print to G4cout and an output file 149 std::ofstream outFile(outputFileSpec); 150 151 // Print title vector 152 std::vector<G4String>::const_iterator titleI 153 154 while (titleIter != title.end()) { 155 G4cout << std::setw(8) << *titleIter << " 156 titleIter++; 157 } 158 159 G4cout << G4endl; 160 161 // Print current data 162 std::map<G4int, std::vector<G4double>>::cons 163 164 while (iter != myMap.end()) { 165 G4cout << std::setw(8) << std::setprecisio 166 167 std::vector<G4double>::const_iterator ener 168 169 // The built-in scorers do not automatical 170 // cylinder replica rings. We must account 171 // by the ratio of the area of the full cy 172 // scoring ring. 173 // In this ratio, PI divides out, as does 174 // Left with just the number of rings squa 175 // 1 squared minus ring index squared. 176 G4int ringNum = iter->first; 177 G4double areaCorrection = 233. * 233. / (( 178 G4int counter = 0; 179 180 while (energyBinIter != iter->second.end() 181 G4double value = *energyBinIter; 182 if (counter < 2) value = value * areaCor 183 G4cout << std::setw(10) << std::setpreci 184 outFile << value * mm * mm; 185 if (counter < 3) outFile << ","; 186 counter++; 187 energyBinIter++; 188 } 189 outFile << G4endl; 190 G4cout << G4endl; 191 iter++; 192 } 193 } 194 195 //....oooOO0OOooo........oooOO0OOooo........oo 196 197 void ElectronRun::Merge(const G4Run* aRun) 198 { 199 // This method is called at the end of the r 200 // It accumulates the worker's results into 201 const ElectronRun* localRun = static_cast<co 202 const std::map<G4int, G4THitsMap<G4double>*> 203 std::map<G4int, G4THitsMap<G4double>*>::cons 204 for (; iter != localMap.end(); ++iter) 205 (*(fMap[iter->first])) += (*(iter->second) 206 207 // This call lets Geant4 maintain overall su 208 G4Run::Merge(aRun); 209 } 210 211 //....oooOO0OOooo........oooOO0OOooo........oo 212