// // ******************************************************************** // * DISCLAIMER * // * * // * The following disclaimer summarizes all the specific disclaimers * // * of contributors to this software. The specific disclaimers,which * // * govern, are listed with their locations in: * // * http://cern.ch/geant4/license * // * * // * 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. * // * * // * 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: BetheBlochPhysicsList.cc,v 1.21 2005/05/30 16:20:23 maire Exp $ // GEANT4 tag $Name: geant4-08-00-patch-01 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "globals.hh" #include "BetheBlochPhysicsList.hh" #include "G4ProcessManager.hh" #include "G4ParticleTypes.hh" #include "G4IonConstructor.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... BetheBlochPhysicsList::BetheBlochPhysicsList(): G4VUserPhysicsList() { defaultCutValue = 1.0*cm; SetVerboseLevel(1); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... BetheBlochPhysicsList::~BetheBlochPhysicsList() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void BetheBlochPhysicsList::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(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void BetheBlochPhysicsList::ConstructBosons() { // pseudo-particles G4Geantino::GeantinoDefinition(); G4ChargedGeantino::ChargedGeantinoDefinition(); // gamma G4Gamma::GammaDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void BetheBlochPhysicsList::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 BetheBlochPhysicsList::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 BetheBlochPhysicsList::ConstructBaryons() { // barions G4Proton::ProtonDefinition(); G4AntiProton::AntiProtonDefinition(); G4Neutron::NeutronDefinition(); G4AntiNeutron::AntiNeutronDefinition(); G4IonConstructor ion; ion.ConstructParticle(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void BetheBlochPhysicsList::ConstructProcess() { AddTransportation(); ConstructEM(); //ConstructPN(); 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 "G4PenelopeIonisation.hh" //#include "G4ionIonisation.hh" //#include "G4StepLimiter.hh" //#include "G4UserSpecialCuts.hh" // this include file defindes the class G4HadronElasticProcess #include "G4NeutronHPorLElastic.hh" //#include "G4NeutronHPElastic.hh" //#include "G4LElastic.hh" // hadron elastic scattering processes //#include "G4ElasticHadrNucleusHE.hh" /* for high energy elestic scattering */ //#include "G4LElastic.hh" //#include "G4NeutronHPElastic.hh" #include "G4GammaNuclearReaction.hh" #include "G4PhotoNuclearProcess.hh" #include "G4StepLimiter.hh" #include "G4UserSpecialCuts.hh" #include //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void BetheBlochPhysicsList::ConstructEM() { theParticleIterator->reset(); while( (*theParticleIterator)() ){ G4ParticleDefinition* particle = theParticleIterator->value(); G4ProcessManager* pmanager = particle->GetProcessManager(); G4String particleName = particle->GetParticleName(); //G4GammaNuclearReaction* gammaNuclear = new G4GammaNuclearReaction(); //G4PhotoNuclearProcess* photoNuclearProcess = new G4PhotoNuclearProcess(); if (particleName == "gamma") { // gamma pmanager->AddDiscreteProcess(new G4PhotoElectricEffect); //pmanager->AddDiscreteProcess(new G4LowEnergyPhotoElectric); pmanager->AddDiscreteProcess(new G4ComptonScattering); //pmanager->AddDiscreteProcess(new G4LowEnergyCompton); pmanager->AddDiscreteProcess(new G4GammaConversion); //pmanager->AddDiscreteProcess(new G4LowEnergyGammaConversion); //pmanager->AddDiscrete(new G4PenelopeIonisation); //pmanager->AddDiscrete(new G4LowEnergyRayleigh()); //00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00 G4GammaNuclearReaction* gammaNuclear = new G4GammaNuclearReaction(); G4PhotoNuclearProcess* photoNuclearProcess = new G4PhotoNuclearProcess(); photoNuclearProcess->RegisterMe(gammaNuclear); pmanager->AddDiscreteProcess(photoNuclearProcess); //00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00 } else if (particleName == "e-") { //electron pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); pmanager->AddProcess(new G4eIonisation, -1, 2,2); pmanager->AddProcess(new G4eBremsstrahlung, -1, 3,3); } else if (particleName == "proton") { //proton //AddProcess(process name, proccess when at rest, continuous proces flag, discrete process flag); pmanager->AddProcess(new G4hIonisation, -1, 1,1); pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); // G4ionIonisation* iIon= new G4ionIonisation(); // pmanager->AddProcess(iIon,-1, 1,2); //step limit pmanager->AddProcess(new G4StepLimiter, -1,-1,3); } else if (particleName == "e+") { //positron pmanager->AddProcess(new G4MultipleScattering,-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 G4MultipleScattering,-1, 1,1); pmanager->AddProcess(new G4MuIonisation, -1, 2,2); pmanager->AddProcess(new G4MuBremsstrahlung, -1, 3,3); pmanager->AddProcess(new G4MuPairProduction, -1, 4,4); //00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00 } else if (particleName == "neutron") { //neutron // available neutron elastic scattering models //G4LElastic* elasticModel = new G4LElastic(); //G4NeutronHPElastic* elasticModel = new G4NeutronHPElastic(); G4NeutronHPorLElastic* elasticModel = new G4NeutronHPorLElastic(); // define process to handle elastic scattering G4HadronElasticProcess* hadElastProc = new G4HadronElasticProcess(); // register the model you are using for eleastic scatterin hadElastProc->RegisterMe(elasticModel); // add the elastic scattering process to the process manager pmanager->AddDiscreteProcess(hadElastProc); pmanager->AddProcess(new G4StepLimiter, -1,-1,3); //00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00//00 } else if ((!particle->IsShortLived()) && (particle->GetPDGCharge() != 0.0) && (particle->GetParticleName() != "chargedgeantino")) { //all others charged particles except geantino pmanager->AddProcess(new G4MultipleScattering,-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); } } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "G4Decay.hh" void BetheBlochPhysicsList::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 BetheBlochPhysicsList::SetCuts() { //G4VUserPhysicsList::SetCutsWithDefault method sets //the default cut value for all particle types // SetCutsWithDefault(); if (verboseLevel>0) DumpCutValuesTable(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......