/* ************************************************ * GEANT4 VCGLIB/CAD INTERFACE - basic example * * File: PhysicsList.cc * * Author: Christopher M Poole, * Email: mail@christopherpoole.net * * Date: 20th March, 2011 **************************************************/ // USER// #include "PhysicsList.hh" // GEANT4 // #include "G4EmStandardPhysics.hh" #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" #include "G4ProcessManager.hh" #include "G4ParticleTypes.hh" #include "G4IonConstructor.hh" #include "G4RadioactiveDecay.hh" PhysicsList::PhysicsList(): G4VUserPhysicsList() { defaultCutValue = 1*mm; SetVerboseLevel(1); } PhysicsList::~PhysicsList() { ;} void PhysicsList::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(); ConstructBaryons(); G4IonConstructor iConstructor; iConstructor.ConstructParticle(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::ConstructBosons() { // pseudo-particles G4Geantino::GeantinoDefinition(); G4ChargedGeantino::ChargedGeantinoDefinition(); // gamma G4Gamma::GammaDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::ConstructLeptons() { // leptons // e+/- G4Electron::ElectronDefinition(); G4Positron::PositronDefinition(); // mu+/- G4MuonPlus::MuonPlusDefinition(); G4MuonMinus::MuonMinusDefinition(); // nu_e G4NeutrinoE::NeutrinoEDefinition(); G4AntiNeutrinoE::AntiNeutrinoEDefinition(); // nu_mu G4NeutrinoMu::NeutrinoMuDefinition(); G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::ConstructMesons() { // mesons // light mesons G4PionPlus::PionPlusDefinition(); G4PionMinus::PionMinusDefinition(); G4PionZero::PionZeroDefinition(); G4Eta::EtaDefinition(); G4EtaPrime::EtaPrimeDefinition(); G4KaonPlus::KaonPlusDefinition(); G4KaonMinus::KaonMinusDefinition(); G4KaonZero::KaonZeroDefinition(); G4AntiKaonZero::AntiKaonZeroDefinition(); G4KaonZeroLong::KaonZeroLongDefinition(); G4KaonZeroShort::KaonZeroShortDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::ConstructBaryons() { // barions G4Proton::ProtonDefinition(); G4AntiProton::AntiProtonDefinition(); G4Neutron::NeutronDefinition(); G4AntiNeutron::AntiNeutronDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::ConstructProcess() { AddTransportation(); ConstructEM(); ConstructGeneral(); } #include "G4ComptonScattering.hh" #include "G4GammaConversion.hh" #include "G4PhotoElectricEffect.hh" #include "G4eMultipleScattering.hh" #include "G4eIonisation.hh" #include "G4eBremsstrahlung.hh" #include "G4eplusAnnihilation.hh" #include "G4MuIonisation.hh" #include "G4MuBremsstrahlung.hh" #include "G4MuPairProduction.hh" #include "G4hIonisation.hh" #include "G4StepLimiter.hh" #include "G4UserSpecialCuts.hh" #include "G4IonTable.hh" #include "G4Ions.hh" #include "G4VAtomDeexcitation.hh" #include "G4UAtomicDeexcitation.hh" #include "G4LossTableManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::ConstructEM() { auto theParticleIterator=GetParticleIterator(); theParticleIterator->reset(); while( (*theParticleIterator)() ){ G4ParticleDefinition* particle = theParticleIterator->value(); G4ProcessManager* pmanager = particle->GetProcessManager(); G4String particleName = particle->GetParticleName(); G4RadioactiveDecay* theRadioactiveDecay = new G4RadioactiveDecay(); if (particleName == "gamma") { // gamma pmanager->AddDiscreteProcess(new G4PhotoElectricEffect); pmanager->AddDiscreteProcess(new G4ComptonScattering); pmanager->AddDiscreteProcess(new G4GammaConversion); } else if (particleName == "GenericIon") { pmanager ->AddProcess(theRadioactiveDecay); pmanager ->SetProcessOrdering(theRadioactiveDecay, idxPostStep); pmanager ->SetProcessOrdering(theRadioactiveDecay, idxAtRest); } else if (particleName == "e-") { //electron pmanager->AddProcess(new G4eMultipleScattering,-1, 1,1); pmanager->AddProcess(new G4eIonisation, -1, 2,2); pmanager->AddProcess(new G4eBremsstrahlung, -1, 3,3); } else if (particleName == "e+") { //positron pmanager->AddProcess(new G4eMultipleScattering,-1, 1,1); pmanager->AddProcess(new G4eIonisation, -1, 2,2); pmanager->AddProcess(new G4eBremsstrahlung, -1, 3,3); pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); } else if( particleName == "mu+" || particleName == "mu-" ) { //muon pmanager->AddProcess(new G4eMultipleScattering,-1, 1,1); pmanager->AddProcess(new G4MuIonisation, -1, 2,2); pmanager->AddProcess(new G4MuBremsstrahlung, -1, 3,3); pmanager->AddProcess(new G4MuPairProduction, -1, 4,4); } else if ((!particle->IsShortLived()) && (particle->GetPDGCharge() != 0.0) && (particle->GetParticleName() != "chargedgeantino")) { //all others charged particles except geantino pmanager->AddProcess(new G4eMultipleScattering,-1, 1,1); pmanager->AddProcess(new G4hIonisation, -1, 2,2); //step limit pmanager->AddProcess(new G4StepLimiter, -1,-1,3); ///pmanager->AddProcess(new G4UserSpecialCuts, -1,-1,4); } } G4VAtomDeexcitation* de = new G4UAtomicDeexcitation(); G4LossTableManager::Instance()->SetAtomDeexcitation(de); de->SetFluo(true); de->SetAuger(true); de->SetPIXE(true); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "G4Decay.hh" void PhysicsList::ConstructGeneral() { // Add Decay Process G4Decay* theDecayProcess = new G4Decay(); auto theParticleIterator=GetParticleIterator(); 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); } } // Declare radioactive decay to the GenericIon in the IonTable. const G4IonTable *theIonTable = G4ParticleTable::GetParticleTable()->GetIonTable(); G4RadioactiveDecay *theRadioactiveDecay = new G4RadioactiveDecay(); for (G4int i=0; iEntries(); i++) { G4String particleName = theIonTable->GetParticle(i)->GetParticleName(); G4String particleType = theIonTable->GetParticle(i)->GetParticleType(); if (particleName == "GenericIon") { G4ProcessManager* pmanager = theIonTable->GetParticle(i)->GetProcessManager(); //pmanager->SetVerboseLevel(VerboseLevel); pmanager ->AddProcess(theRadioactiveDecay); pmanager ->SetProcessOrdering(theRadioactiveDecay, idxPostStep); pmanager ->SetProcessOrdering(theRadioactiveDecay, idxAtRest); } } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::SetCuts() { //G4VUserPhysicsList::SetCutsWithDefault method sets //the default cut value for all particle types // SetCutsWithDefault(); //SetCutValue(1*mm, "gamma"); //SetCutValue(1*cm, "e-"); //SetCutValue(1*cm, "e+"); //if (verboseLevel>0) DumpCutValuesTable(); }