// // ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // /// \file Run.cc /// \brief Implementation of the Run class // // $Id: Run.cc 71376 2013-06-14 07:44:50Z maire $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "Run.hh" #include "DetectorConstruction.hh" #include "PrimaryGeneratorAction.hh" #include "HistoManager.hh" #include "G4UnitsTable.hh" #include "G4SystemOfUnits.hh" #include "G4EmCalculator.hh" #include "G4ProcessManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... Run::Run(DetectorConstruction* det, PrimaryGeneratorAction *prim) : G4Run(), fDetector(det), fPrimary(prim), fParticle(0), fEkin(0.), fNbStep1(0), fNbStep2(0), fTrackLen1(0.), fTrackLen2(0.), fTime1(0.),fTime2(0.) { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... Run::~Run() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Run::SetPrimary(G4ParticleDefinition* particle, G4double energy) { fParticle = particle; fEkin = energy; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Run::CountProcesses(const G4VProcess* process) { G4String procName = process->GetProcessName(); std::map::iterator it = fProcCounter.find(procName); if ( it == fProcCounter.end()) { fProcCounter[procName] = 1; } else { fProcCounter[procName]++; } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Run::ParticleCount(G4String name, G4double Ekin) { std::map::iterator it = fParticleDataMap.find(name); if ( it == fParticleDataMap.end()) { fParticleDataMap[name] = ParticleData(1, Ekin, Ekin, Ekin); } else { ParticleData& data = it->second; data.fCount++; data.fEmean += Ekin; //update min max G4double emin = data.fEmin; if (Ekin < emin) data.fEmin = Ekin; G4double emax = data.fEmax; if (Ekin > emax) data.fEmax = Ekin; } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Run::SumTrackLength(G4int nstep1, G4int nstep2, G4double trackl1, G4double trackl2, G4double time1, G4double time2) { fNbStep1 += nstep1; fNbStep2 += nstep2; fTrackLen1 += trackl1; fTrackLen2 += trackl2; fTime1 += time1; fTime2 += time2; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Run::Merge(const G4Run* run) { const Run* localRun = static_cast(run); //primary particle info // fParticle = localRun->fParticle; fEkin = localRun->fEkin; // accumulate sums // fNbStep1 += localRun->fNbStep1; fNbStep2 += localRun->fNbStep2; fTrackLen1 += localRun->fTrackLen1; fTrackLen2 += localRun->fTrackLen2; fTime1 += localRun->fTime1; fTime2 += localRun->fTime2; //map: processes count std::map::const_iterator itp; for ( itp = localRun->fProcCounter.begin(); itp != localRun->fProcCounter.end(); ++itp ) { G4String procName = itp->first; G4int localCount = itp->second; if ( fProcCounter.find(procName) == fProcCounter.end()) { fProcCounter[procName] = localCount; } else { fProcCounter[procName] += localCount; } } //map: created particles count std::map::const_iterator itn; for (itn = localRun->fParticleDataMap.begin(); itn != localRun->fParticleDataMap.end(); ++itn) { G4String name = itn->first; const ParticleData& localData = itn->second; if ( fParticleDataMap.find(name) == fParticleDataMap.end()) { fParticleDataMap[name] = ParticleData(localData.fCount, localData.fEmean, localData.fEmin, localData.fEmax); } else { ParticleData& data = fParticleDataMap[name]; data.fCount += localData.fCount; data.fEmean += localData.fEmean; G4double emin = localData.fEmin; if (emin < data.fEmin) data.fEmin = emin; G4double emax = localData.fEmax; if (emax > data.fEmax) data.fEmax = emax; } } G4Run::Merge(run); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Run::EndOfRun() { G4int prec = 5, wid = prec + 2; G4int dfprec = G4cout.precision(prec); //run condition // G4Material* material = fDetector->GetMaterial(); G4double density = material->GetDensity(); G4String Particle = fParticle->GetParticleName(); G4cout << "\n The run is " << numberOfEvent << " "<< Particle << " of " << G4BestUnit(fEkin,"Energy") << " through " << G4BestUnit(0.5*(fDetector->GetSize()),"Length") << " of " << material->GetName() << " (density: " << G4BestUnit(density,"Volumic Mass") << ")" << G4endl; //*********************LET // get processList and extract EM processes (but not MultipleScattering) // instanciate EmCalculator G4ParticleDefinition *particle = fPrimary->GetParticleGun()->GetParticleDefinition(); G4double energy = fPrimary->GetParticleGun()->GetParticleEnergy(); G4cout << "ENERGY" << energy << G4endl; //fRun->SetPrimary(particle, energy); G4EmCalculator emCal; G4ProcessVector *plist = particle->GetProcessManager()->GetProcessList(); G4String pName; G4double cut; std::vector emName; std::vector enerCut; size_t length = plist->size(); for (size_t j = 0; j < length; j++) { pName = (*plist)[j]->GetProcessName(); if (((*plist)[j]->GetProcessType() == fHadronic) )//&& //(pName != "msc")) { emName.push_back(pName); } std::cout << "NAMEEEE" << pName << "\n"; } // STOPPING POWER // define material // const G4Material *material = fDetector->GetMaterial(); // how about GetVolume?? std::vector dedx1; std::vector dedx2; G4double dedx, dedxtot = 0.; size_t nproc = emName.size(); for (size_t j = 0; j < nproc; j++) { dedx = emCal.ComputeDEDX(energy, particle, emName[j], material, energy); dedxtot += dedx; dedx1.push_back(dedx); dedx2.push_back(dedx / density); dedx1[j] = dedx; dedx2[j] = dedx / density; } dedx1[nproc] = dedxtot; dedx2[nproc] = dedxtot / density; // print stopping power G4cout << "\n \n unrestricted dE/dx : "; for (size_t j = 0; j <= nproc; j++) { G4cout << "\t" << std::setw(13) << G4BestUnit(dedx1[j], "Energy/Length"); } G4cout << "\n (MeV/g/cm2) : "; for (size_t j = 0; j <= nproc; j++) { G4cout << "\t" << std::setw(13) << G4BestUnit(dedx2[j], "Energy*Surface/Mass"); } //************************* if (numberOfEvent == 0) { G4cout.precision(dfprec); return;} //frequency of processes // G4cout << "\n Process calls frequency :" << G4endl; G4int survive = 0; std::map::iterator it; for (it = fProcCounter.begin(); it != fProcCounter.end(); it++) { G4String procName = it->first; G4int count = it->second; G4cout << "\t" << procName << "= " << count; if (procName == "Transportation") survive = count; } G4cout << G4endl; if (survive > 0) { G4cout << "\n Nb of incident particles surviving after " << G4BestUnit(0.5*(fDetector->GetSize()),"Length") << " of " << fDetector->GetMaterial()->GetName() << " : " << survive << G4endl; } // total track length of incident neutron // G4cout << "\n Parcours of incident neutron:"; G4double meanCollision1 = (G4double)fNbStep1/numberOfEvent; G4double meanCollision2 = (G4double)fNbStep2/numberOfEvent; G4double meanCollisTota = meanCollision1 + meanCollision2; G4cout << "\n nb of collisions E>1*eV= " << meanCollision1 << " E<1*eV= " << meanCollision2 << " total= " << meanCollisTota; G4double meanTrackLen1 = fTrackLen1/numberOfEvent; G4double meanTrackLen2 = fTrackLen2/numberOfEvent; G4double meanTrackLtot = meanTrackLen1 + meanTrackLen2; G4cout << "\n track length E>1*eV= " << G4BestUnit(meanTrackLen1,"Length") << " E<1*eV= " << G4BestUnit(meanTrackLen2, "Length") << " total= " << G4BestUnit(meanTrackLtot, "Length"); G4double meanTime1 = fTime1/numberOfEvent; G4double meanTime2 = fTime2/numberOfEvent; G4double meanTimeTo = meanTime1 + meanTime2; G4cout << "\n time of flight E>1*eV= " << G4BestUnit(meanTime1,"Time") << " E<1*eV= " << G4BestUnit(meanTime2, "Time") << " total= " << G4BestUnit(meanTimeTo, "Time") << G4endl; //particles count // G4cout << "\n List of generated particles:" << G4endl; std::map::iterator itn; for (itn = fParticleDataMap.begin(); itn != fParticleDataMap.end(); itn++) { G4String name = itn->first; ParticleData data = itn->second; G4int count = data.fCount; G4double eMean = data.fEmean/count; G4double eMin = data.fEmin; G4double eMax = data.fEmax; G4cout << " " << std::setw(13) << name << ": " << std::setw(7) << count << " Emean = " << std::setw(wid) << G4BestUnit(eMean, "Energy") << "\t( " << G4BestUnit(eMin, "Energy") << " --> " << G4BestUnit(eMax, "Energy") << ")" << G4endl; } //normalize histograms ////G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); ////G4double factor = 1./numberOfEvent; ////analysisManager->ScaleH1(3,factor); //remove all contents in fProcCounter, fCount fProcCounter.clear(); fParticleDataMap.clear(); //restore default format G4cout.precision(dfprec); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......