// This code implementation is the intellectual property of // the GEANT4 collaboration. // // By copying, distributing or modifying the Program (or any work // based on the Program) you indicate your acceptance of this statement, // and all its terms. // // $Id: Em5PhysicsList.cc,v 1.6 2000/05/24 16:13:21 maire Exp $ // GEANT4 tag $Name: geant4-03-00 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... // Always place it in front! // ////#include "G4Timer.hh" #include "Em5PhysicsList.hh" #include "Em5DetectorConstruction.hh" #include "Em5PhysicsListMessenger.hh" #include "G4ParticleDefinition.hh" #include "G4ParticleWithCuts.hh" #include "G4ProcessManager.hh" #include "G4ProcessVector.hh" #include "G4ParticleTypes.hh" #include "G4ParticleTable.hh" #include "G4Material.hh" #include "G4EnergyLossTables.hh" #include "G4ios.hh" #include "g4std/iomanip" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... Em5PhysicsList::Em5PhysicsList(Em5DetectorConstruction* p) :G4VUserPhysicsList() { pDet = p; currentDefaultCut = defaultCutValue = 1*mm; cutForGamma = defaultCutValue; cutForElectron = defaultCutValue; cutForProton = defaultCutValue; MaxChargedStep = DBL_MAX; SetVerboseLevel(1); physicsListMessenger = new Em5PhysicsListMessenger(this); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... Em5PhysicsList::~Em5PhysicsList() { delete physicsListMessenger; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void Em5PhysicsList::ConstructParticle() { // In this method, static member functions should be called // for all particles which you want to use. // This ensures that objects of these particle types will be // created in the program. ConstructBosons(); ConstructLeptons(); ConstructMesons(); ConstructBarions(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void Em5PhysicsList::ConstructBosons() { // pseudo-particles G4Geantino::GeantinoDefinition(); G4ChargedGeantino::ChargedGeantinoDefinition(); // gamma G4Gamma::GammaDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void Em5PhysicsList::ConstructLeptons() { // leptons G4Electron::ElectronDefinition(); G4Positron::PositronDefinition(); G4MuonPlus::MuonPlusDefinition(); G4MuonMinus::MuonMinusDefinition(); G4NeutrinoE::NeutrinoEDefinition(); G4AntiNeutrinoE::AntiNeutrinoEDefinition(); G4NeutrinoMu::NeutrinoMuDefinition(); G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void Em5PhysicsList::ConstructMesons() { // mesons G4PionPlus::PionPlusDefinition(); G4PionMinus::PionMinusDefinition(); G4PionZero::PionZeroDefinition(); G4KaonPlus::KaonPlusDefinition(); G4KaonMinus::KaonMinusDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void Em5PhysicsList::ConstructBarions() { // barions G4Proton::ProtonDefinition(); G4AntiProton::AntiProtonDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void Em5PhysicsList::ConstructProcess() { AddTransportation(); ConstructEM(); ConstructGeneral(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... #include "G4ComptonScattering.hh" #include "G4GammaConversion.hh" #include "G4PhotoElectricEffect.hh" #include "G4MultipleScattering.hh" #include "G4eIonisation.hh" #include "G4eBremsstrahlung.hh" #include "G4eplusAnnihilation.hh" #include "G4MuIonisation.hh" #include "G4MuBremsstrahlung.hh" #include "G4MuPairProduction.hh" #include "G4hIonisation.hh" #include "Em5StepCut.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void Em5PhysicsList::ConstructEM() { theParticleIterator->reset(); while( (*theParticleIterator)() ){ G4ParticleDefinition* particle = theParticleIterator->value(); G4ProcessManager* pmanager = particle->GetProcessManager(); G4String particleName = particle->GetParticleName(); if (particleName == "gamma") { // gamma pmanager->AddDiscreteProcess(new G4PhotoElectricEffect); pmanager->AddDiscreteProcess(new G4ComptonScattering); pmanager->AddDiscreteProcess(new G4GammaConversion); } else if (particleName == "e-") { //electron pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); pmanager->AddProcess(new G4eIonisation, -1, 2,2); pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); Em5StepCut* theeminusStepCut = new Em5StepCut(); theeminusStepCut->SetMaxStep(MaxChargedStep); pmanager->AddProcess(theeminusStepCut, -1,-1,4); } else if (particleName == "e+") { //positron pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); pmanager->AddProcess(new G4eIonisation, -1, 2,2); pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); Em5StepCut* theeplusStepCut = new Em5StepCut(); theeplusStepCut->SetMaxStep(MaxChargedStep) ; pmanager->AddProcess(theeplusStepCut, -1,-1,5); } else if( particleName == "mu+" || particleName == "mu-" ) { //muon pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); pmanager->AddProcess(new G4MuIonisation, -1, 2,2); pmanager->AddProcess(new G4MuBremsstrahlung, -1,-1,3); pmanager->AddProcess(new G4MuPairProduction, -1,-1,4); } else if ( particleName == "proton" || particleName == "antiproton" || particleName == "pi+" || particleName == "pi-" || particleName == "kaon+" || particleName == "kaon-" ) { pmanager->AddProcess(new G4MultipleScattering,-1,1,1); pmanager->AddProcess(new G4hIonisation, -1,2,2); Em5StepCut* thehadronStepCut = new Em5StepCut(); thehadronStepCut->SetMaxStep(MaxChargedStep); pmanager->AddProcess( thehadronStepCut, -1,-1,3); } } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... #include "G4Decay.hh" void Em5PhysicsList::ConstructGeneral() { // Add Decay Process G4Decay* theDecayProcess = new G4Decay(); theParticleIterator->reset(); while( (*theParticleIterator)() ){ G4ParticleDefinition* particle = theParticleIterator->value(); G4ProcessManager* pmanager = particle->GetProcessManager(); if (theDecayProcess->IsApplicable(*particle)) { pmanager ->AddProcess(theDecayProcess); // set ordering for PostStepDoIt and AtRestDoIt pmanager ->SetProcessOrdering(theDecayProcess, idxPostStep); pmanager ->SetProcessOrdering(theDecayProcess, idxAtRest); } } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void Em5PhysicsList::SetCuts() { ////G4Timer theTimer ; ////theTimer.Start() ; // reactualise cutValues if (currentDefaultCut != defaultCutValue) { if(cutForGamma == currentDefaultCut) cutForGamma = defaultCutValue; if(cutForElectron == currentDefaultCut) cutForElectron = defaultCutValue; currentDefaultCut = defaultCutValue; } if (verboseLevel >0){ G4cout << "Em5PhysicsList::SetCuts:"; G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl; } //special for low energy physics // G4double lowlimit=250*eV; G4Gamma ::SetEnergyRange(lowlimit,100*GeV); G4Electron::SetEnergyRange(lowlimit,100*GeV); G4Positron::SetEnergyRange(lowlimit,100*GeV); // set cut values for gamma at first and for e- second and next for e+, // because some processes for e+/e- need cut values for gamma SetCutValue(cutForGamma,"gamma"); SetCutValue(cutForElectron,"e-"); SetCutValue(cutForElectron,"e+"); SetCutValue(defaultCutValue,"mu-"); SetCutValue(defaultCutValue,"mu+"); // set cut values for proton and anti_proton before all other hadrons // because some processes for hadrons need cut values for proton/anti_proton SetCutValue(defaultCutValue, "proton"); SetCutValue(defaultCutValue, "anti_proton"); SetCutValueForOthers(defaultCutValue); if (verboseLevel>0) DumpCutValuesTable(); ////theTimer.Stop(); ////G4cout.precision(6); ////G4cout << G4endl ; ////G4cout << "total time(SetCuts)=" << theTimer.GetUserElapsed() << " s " <GetAbsorberMaterial(); // set cut values for gamma at first and for e- second and next for e+, // because some processes for e+/e- need cut values for gamma G4ParticleDefinition* part; G4double cut; part = theParticleTable->FindParticle("e-"); cut = G4EnergyLossTables::GetRange(part,val,currMat); SetCutValue(cut, "e-"); part = theParticleTable->FindParticle("e+"); cut = G4EnergyLossTables::GetRange(part,val,currMat); SetCutValue(cut, "e+"); // set cut values for proton and anti_proton before all other hadrons // because some processes for hadrons need cut values for proton/anti_proton part = theParticleTable->FindParticle("proton"); cut = G4EnergyLossTables::GetRange(part,val,currMat); SetCutValue(cut, "proton"); part = theParticleTable->FindParticle("anti_proton"); cut = G4EnergyLossTables::GetRange(part,val,currMat); SetCutValue(cut, "anti_proton"); SetCutValueForOthers(cut); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void Em5PhysicsList::GetRange(G4double val) { G4ParticleTable* theParticleTable = G4ParticleTable::GetParticleTable(); G4Material* currMat = pDet->GetAbsorberMaterial(); G4ParticleDefinition* part; G4double cut; part = theParticleTable->FindParticle("e-"); cut = G4EnergyLossTables::GetRange(part,val,currMat); G4cout << "material : " << currMat->GetName() << G4endl; G4cout << "particle : " << part->GetParticleName() << G4endl; G4cout << "energy : " << val / keV << " (keV)" << G4endl; G4cout << "range : " << cut / mm << " (mm)" << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void Em5PhysicsList::SetMaxStep(G4double step) { MaxChargedStep = step ; G4cout << " MaxChargedStep=" << MaxChargedStep << G4endl; G4cout << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....