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 exoticphysics/monopole/src/Run.cc << 26 /// \file electromagnetic/TestEm5/src/Run.cc 27 /// \brief Implementation of the Run class 27 /// \brief Implementation of the Run class 28 // 28 // 29 // << 29 // $Id: Run.cc 71376 2013-06-14 07:44:50Z maire $ >> 30 // 30 //....oooOO0OOooo........oooOO0OOooo........oo 31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 31 //....oooOO0OOooo........oooOO0OOooo........oo 32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 32 33 33 #include "Run.hh" 34 #include "Run.hh" 34 << 35 #include "DetectorConstruction.hh" << 36 #include "PrimaryGeneratorAction.hh" 35 #include "PrimaryGeneratorAction.hh" 37 << 36 #include "DetectorConstruction.hh" 38 #include "G4EmCalculator.hh" 37 #include "G4EmCalculator.hh" 39 #include "G4Proton.hh" << 40 #include "G4SystemOfUnits.hh" 38 #include "G4SystemOfUnits.hh" 41 #include "G4UnitsTable.hh" 39 #include "G4UnitsTable.hh" 42 << 43 #include <iomanip> 40 #include <iomanip> 44 41 45 //....oooOO0OOooo........oooOO0OOooo........oo 42 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 46 43 47 Run::Run(DetectorConstruction* det, PrimaryGen << 44 Run::Run(DetectorConstruction* det, PrimaryGeneratorAction* prim) >> 45 :fDetector(det), fPrimary(prim) 48 { 46 { 49 fAnalysisManager = G4AnalysisManager::Instan 47 fAnalysisManager = G4AnalysisManager::Instance(); 50 48 51 G4double length = fDetector->GetAbsorSizeX() << 49 G4double length = fDetector->GetAbsorSizeX(); 52 fOffsetX = -0.5 * length; 50 fOffsetX = -0.5 * length; 53 51 54 fVerboseLevel = 1; 52 fVerboseLevel = 1; 55 fNevt = 0; 53 fNevt = 0; 56 fProjRange = fProjRange2 = 0.; 54 fProjRange = fProjRange2 = 0.; 57 } 55 } 58 56 59 //....oooOO0OOooo........oooOO0OOooo........oo 57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 60 58 61 Run::~Run() {} << 59 Run::~Run() >> 60 {} 62 61 63 //....oooOO0OOooo........oooOO0OOooo........oo 62 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 64 63 65 void Run::Merge(const G4Run* run) 64 void Run::Merge(const G4Run* run) 66 { 65 { 67 const Run* localRun = static_cast<const Run* 66 const Run* localRun = static_cast<const Run*>(run); 68 67 69 fNevt += localRun->GetNumberOfEvent(); << 68 fNevt += localRun->GetNumberOfEvent(); 70 fProjRange += localRun->fProjRange; 69 fProjRange += localRun->fProjRange; 71 fProjRange2 += localRun->fProjRange2; 70 fProjRange2 += localRun->fProjRange2; 72 << 71 73 G4Run::Merge(run); << 72 G4Run::Merge(run); 74 } << 73 } 75 74 76 //....oooOO0OOooo........oooOO0OOooo........oo 75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 77 76 78 void Run::EndOfRun(G4double binLength) << 77 void Run::EndOfRun(double binLength) 79 { 78 { 80 if (!G4Threading::IsMultithreadedApplication << 79 81 fNevt += this->GetNumberOfEvent(); << 80 #ifndef G4MULTITHREADED 82 } << 81 fNevt += this->GetNumberOfEvent(); >> 82 #endif 83 83 84 G4int nEvents = fNevt; 84 G4int nEvents = fNevt; 85 if (nEvents == 0) { << 85 if (nEvents == 0) { return; } 86 return; << 87 } << 88 86 89 // run conditions << 87 //run conditions 90 // << 88 // 91 const G4Material* material = fDetector->GetA 89 const G4Material* material = fDetector->GetAbsorMaterial(); 92 G4double density = material->GetDensity(); 90 G4double density = material->GetDensity(); 93 G4String matName = material->GetName(); 91 G4String matName = material->GetName(); 94 << 92 const G4ParticleDefinition* part = 95 const G4ParticleDefinition* part = fPrimary- << 93 fPrimary->GetParticleGun()->GetParticleDefinition(); 96 G4String particle = part->GetParticleName(); << 94 G4String particle = part->GetParticleName(); 97 const G4ParticleDefinition* proton = G4Proto << 98 << 99 G4double energy = fPrimary->GetParticleGun() 95 G4double energy = fPrimary->GetParticleGun()->GetParticleEnergy(); 100 96 101 if (GetVerbose() > 0) { << 97 if(GetVerbose() > 0){ 102 G4cout << "\n The run consists of " << nEv << 98 G4cout << "\n The run consists of " << nEvents << " "<< particle << " of " 103 << G4BestUnit(energy, "Energy") << << 99 << G4BestUnit(energy,"Energy") << " through " 104 << G4BestUnit(fDetector->GetAbsorSi << 100 << G4BestUnit(fDetector->GetAbsorSizeX(),"Length") << " of " 105 << " (density: " << G4BestUnit(dens << 101 << matName << " (density: " 106 // G4cout<<"Proj "<<fProjRange<<" "<<fProj << 102 << G4BestUnit(density,"Volumic Mass") << ")" << G4endl; >> 103 //G4cout<<"Proj "<<fProjRange<<" "<<fProjRange2<<G4endl; 107 }; 104 }; >> 105 >> 106 //compute projected range and straggling 108 107 109 // compute projected range and straggling << 108 fProjRange /= nEvents; fProjRange2 /= nEvents; 110 fProjRange /= nEvents; << 109 G4double rms = fProjRange2 - fProjRange*fProjRange; 111 fProjRange2 /= nEvents; << 110 if (rms>0.) { rms = std::sqrt(rms); } 112 G4double rms = fProjRange2 - fProjRange * fP << 111 else { rms = 0.; } 113 if (rms > 0.) { << 114 rms = std::sqrt(rms); << 115 } << 116 else { << 117 rms = 0.; << 118 } << 119 112 120 if (GetVerbose() > 0) { << 113 if(GetVerbose() > 0){ 121 G4cout.precision(5); << 114 G4cout.precision(5); 122 G4cout << " Projected Range= " << G4BestUn 115 G4cout << " Projected Range= " << G4BestUnit(fProjRange, "Length") 123 << " rms= " << G4BestUnit(rms, "L << 116 << " rms= " << G4BestUnit(rms, "Length") 124 << G4endl; << 117 << "\n" << G4endl; 125 }; 118 }; 126 119 127 G4double ekin[100], dedxp[100], dedxmp[100], << 120 G4double ekin[100], dedxproton[100], dedxmp[100]; 128 G4EmCalculator calc; 121 G4EmCalculator calc; 129 // calc.SetVerbose(2); << 122 //calc.SetVerbose(2); 130 G4int i; 123 G4int i; 131 for (i = 0; i < 100; ++i) { << 124 for(i = 0; i < 100; ++i) { 132 ekin[i] = std::pow(10., 0.1 * G4double(i)) << 125 ekin[i] = std::pow(10., 0.1*G4double(i)) * keV; 133 dedxp[i] = calc.GetDEDX(ekin[i], proton, m << 126 dedxproton[i] = 134 xsp[i] = calc.GetCrossSectionPerVolume(eki << 127 calc.ComputeElectronicDEDX(ekin[i], "proton", matName); 135 tdedxp[i] = calc.ComputeElectronicDEDX(eki << 128 dedxmp[i] = 136 dedxmp[i] = calc.GetDEDX(ekin[i], part, ma << 129 calc.ComputeElectronicDEDX(ekin[i], "monopole", matName); 137 xsmp[i] = calc.GetCrossSectionPerVolume(ek << 138 tdedxmp[i] = calc.ComputeElectronicDEDX(ek << 139 } 130 } 140 131 141 if (GetVerbose() > 0) { << 132 if(GetVerbose() > 0){ 142 G4int prec = G4cout.precision(3); << 133 G4cout << "### Stopping Powers" << G4endl; 143 G4cout << "############################### << 134 for(i=0; i<100; ++i) { 144 G4cout << "### Stopping Powers and Cross S << 135 G4cout << " E(MeV)= " << ekin[i] << " dedxp(MeV/mm)= " << dedxproton[i] 145 G4cout << "############################### << 136 << " dedxmp(MeV/mm)= " << dedxmp[i] 146 << 137 << G4endl; 147 G4cout << "# N E(MeV) p_dEdx(MeV/mm) mp << 148 G4cout << " restr tot << 149 G4cout << "############################### << 150 for (i = 0; i < 100; ++i) { << 151 G4cout << std::setw(2) << i << "." << st << 152 << std::setw(8) << tdedxp[i] << s << 153 << std::setw(10) << xsp[i] << std << 154 } 138 } 155 G4cout.precision(prec); << 156 G4cout << "############################### << 157 } 139 } >> 140 G4cout << "### End of stopping power table" << G4endl; 158 141 159 // normalize histogram 142 // normalize histogram 160 G4double fac = (mm / MeV) / (nEvents * binLe << 143 G4double fac = (mm/MeV) / (nEvents * binLength); 161 fAnalysisManager->ScaleH1(1, fac); << 144 fAnalysisManager->ScaleH1(1,fac); 162 145 163 for (i = 0; i < 100; ++i) { << 146 if(GetVerbose() > 0){ >> 147 G4cout << "Range table for " << matName << G4endl; >> 148 } >> 149 >> 150 for(i=0; i<100; ++i) { 164 G4double e = std::log10(ekin[i] / MeV) + 0 151 G4double e = std::log10(ekin[i] / MeV) + 0.05; 165 fAnalysisManager->FillH1(2, e, tdedxp[i]); << 152 fAnalysisManager->FillH1(2, e, dedxproton[i]); 166 fAnalysisManager->FillH1(3, e, tdedxmp[i]) << 153 fAnalysisManager->FillH1(3, e, dedxmp[i]); 167 fAnalysisManager->FillH1(4, e, std::log10( << 154 fAnalysisManager->FillH1(4, e, 168 fAnalysisManager->FillH1(5, e, std::log10( << 155 std::log10(calc.GetRange(ekin[i],"proton",matName)/mm)); 169 fAnalysisManager->FillH1(6, e, dedxp[i]); << 156 fAnalysisManager->FillH1(5, e, 170 fAnalysisManager->FillH1(7, e, dedxmp[i]); << 157 std::log10(calc.GetRange(ekin[i],"monopole",matName)/mm)); 171 fAnalysisManager->FillH1(8, e, xsp[i]); << 172 fAnalysisManager->FillH1(9, e, xsmp[i]); << 173 } 158 } 174 } << 159 } 175 160 176 //....oooOO0OOooo........oooOO0OOooo........oo 161 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 162 177 163 178 void Run::FillHisto(G4int histoId, G4double v1 164 void Run::FillHisto(G4int histoId, G4double v1, G4double v2) 179 { 165 { 180 fAnalysisManager->FillH1(histoId, v1, v2); 166 fAnalysisManager->FillH1(histoId, v1, v2); 181 } 167 } 182 168 183 //....oooOO0OOooo........oooOO0OOooo........oo 169 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 184 170