Physics List

From New IAC Wiki
Revision as of 03:54, 10 January 2010 by Oborn (talk | contribs) (Created page with '// // ******************************************************************** // * DISCLAIMER * // * ...')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

// // ******************************************************************** // * 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......

  1. include "globals.hh"
  2. include "BetheBlochPhysicsList.hh"
  1. include "G4ProcessManager.hh"
  2. include "G4ParticleTypes.hh"
  3. 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......

  1. include "G4ComptonScattering.hh"
  2. include "G4GammaConversion.hh"
  3. include "G4PhotoElectricEffect.hh"
  1. include "G4MultipleScattering.hh"
  1. include "G4eIonisation.hh"
  2. include "G4eBremsstrahlung.hh"
  3. include "G4eplusAnnihilation.hh"
  1. include "G4MuIonisation.hh"
  2. include "G4MuBremsstrahlung.hh"
  3. include "G4MuPairProduction.hh"
  1. include "G4hIonisation.hh"

//#include "G4PenelopeIonisation.hh"

//#include "G4ionIonisation.hh"

//#include "G4StepLimiter.hh" //#include "G4UserSpecialCuts.hh"

// this include file defindes the class G4HadronElasticProcess

  1. 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"

  1. include "G4GammaNuclearReaction.hh"
  2. include "G4PhotoNuclearProcess.hh"
  1. include "G4StepLimiter.hh"
  2. include "G4UserSpecialCuts.hh"
  1. include <G4PhotoNuclearCrossSection.hh>

//....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......

  1. 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......