G4EmStandardPhysics_option4.cc

Go to the documentation of this file.
00001 //
00002 // ********************************************************************
00003 // * License and Disclaimer                                           *
00004 // *                                                                  *
00005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
00006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
00007 // * conditions of the Geant4 Software License,  included in the file *
00008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
00009 // * include a list of copyright holders.                             *
00010 // *                                                                  *
00011 // * Neither the authors of this software system, nor their employing *
00012 // * institutes,nor the agencies providing financial support for this *
00013 // * work  make  any representation or  warranty, express or implied, *
00014 // * regarding  this  software system or assume any liability for its *
00015 // * use.  Please see the license in the file  LICENSE  and URL above *
00016 // * for the full disclaimer and the limitation of liability.         *
00017 // *                                                                  *
00018 // * This  code  implementation is the result of  the  scientific and *
00019 // * technical work of the GEANT4 collaboration.                      *
00020 // * By using,  copying,  modifying or  distributing the software (or *
00021 // * any work based  on the software)  you  agree  to acknowledge its *
00022 // * use  in  resulting  scientific  publications,  and indicate your *
00023 // * acceptance of all terms of the Geant4 Software license.          *
00024 // ********************************************************************
00025 //
00026 // $Id$
00027 //
00028 //---------------------------------------------------------------------------
00029 //
00030 // ClassName:   G4EmStandardPhysics_option4
00031 //
00032 // Author:      V.Ivanchenko 28.09.2012 from Option3 physics constructor
00033 //
00034 // Modified:
00035 //
00036 //----------------------------------------------------------------------------
00037 //
00038 
00039 #include "G4EmStandardPhysics_option4.hh"
00040 
00041 #include "G4SystemOfUnits.hh"
00042 #include "G4ParticleDefinition.hh"
00043 #include "G4LossTableManager.hh"
00044 #include "G4EmProcessOptions.hh"
00045 
00046 #include "G4ComptonScattering.hh"
00047 #include "G4GammaConversion.hh"
00048 #include "G4PhotoElectricEffect.hh"
00049 #include "G4RayleighScattering.hh"
00050 #include "G4PEEffectFluoModel.hh"
00051 #include "G4KleinNishinaModel.hh"
00052 #include "G4LowEPComptonModel.hh"
00053 #include "G4PenelopeGammaConversionModel.hh"
00054 #include "G4LivermorePhotoElectricModel.hh"
00055 #include "G4LivermoreComptonModel.hh"
00056 
00057 #include "G4eMultipleScattering.hh"
00058 #include "G4MuMultipleScattering.hh"
00059 #include "G4hMultipleScattering.hh"
00060 #include "G4MscStepLimitType.hh"
00061 #include "G4UrbanMscModel93.hh"
00062 #include "G4UrbanMscModel95.hh"
00063 #include "G4UrbanMscModel96.hh"
00064 #include "G4DummyModel.hh"
00065 #include "G4WentzelVIModel.hh"
00066 #include "G4CoulombScattering.hh"
00067 #include "G4eCoulombScatteringModel.hh"
00068 
00069 #include "G4eIonisation.hh"
00070 #include "G4eBremsstrahlung.hh"
00071 #include "G4Generator2BS.hh"
00072 #include "G4Generator2BN.hh"
00073 #include "G4SeltzerBergerModel.hh"
00074 #include "G4PenelopeIonisationModel.hh"
00075 #include "G4UniversalFluctuation.hh"
00076 
00077 #include "G4eplusAnnihilation.hh"
00078 #include "G4UAtomicDeexcitation.hh"
00079 
00080 #include "G4MuIonisation.hh"
00081 #include "G4MuBremsstrahlung.hh"
00082 #include "G4MuPairProduction.hh"
00083 #include "G4hBremsstrahlung.hh"
00084 #include "G4hPairProduction.hh"
00085 
00086 #include "G4MuBremsstrahlungModel.hh"
00087 #include "G4MuPairProductionModel.hh"
00088 #include "G4hBremsstrahlungModel.hh"
00089 #include "G4hPairProductionModel.hh"
00090 
00091 #include "G4hIonisation.hh"
00092 #include "G4ionIonisation.hh"
00093 #include "G4IonParametrisedLossModel.hh"
00094 #include "G4NuclearStopping.hh"
00095 
00096 #include "G4Gamma.hh"
00097 #include "G4Electron.hh"
00098 #include "G4Positron.hh"
00099 #include "G4MuonPlus.hh"
00100 #include "G4MuonMinus.hh"
00101 #include "G4PionPlus.hh"
00102 #include "G4PionMinus.hh"
00103 #include "G4KaonPlus.hh"
00104 #include "G4KaonMinus.hh"
00105 #include "G4Proton.hh"
00106 #include "G4AntiProton.hh"
00107 #include "G4Deuteron.hh"
00108 #include "G4Triton.hh"
00109 #include "G4He3.hh"
00110 #include "G4Alpha.hh"
00111 #include "G4GenericIon.hh"
00112 
00113 #include "G4PhysicsListHelper.hh"
00114 #include "G4BuilderType.hh"
00115 
00116 // factory
00117 #include "G4PhysicsConstructorFactory.hh"
00118 //
00119 G4_DECLARE_PHYSCONSTR_FACTORY(G4EmStandardPhysics_option4);
00120 
00121 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
00122 
00123 G4EmStandardPhysics_option4::G4EmStandardPhysics_option4(G4int ver)
00124   : G4VPhysicsConstructor("G4EmStandard_opt4"), verbose(ver)
00125 {
00126   G4LossTableManager::Instance();
00127   SetPhysicsType(bElectromagnetic);
00128 }
00129 
00130 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
00131 
00132 G4EmStandardPhysics_option4::G4EmStandardPhysics_option4(G4int ver, const G4String&)
00133   : G4VPhysicsConstructor("G4EmStandard_opt3"), verbose(ver)
00134 {
00135   G4LossTableManager::Instance();
00136   SetPhysicsType(bElectromagnetic);
00137 }
00138 
00139 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
00140 
00141 G4EmStandardPhysics_option4::~G4EmStandardPhysics_option4()
00142 {}
00143 
00144 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
00145 
00146 void G4EmStandardPhysics_option4::ConstructParticle()
00147 {
00148 // gamma
00149   G4Gamma::Gamma();
00150 
00151 // leptons
00152   G4Electron::Electron();
00153   G4Positron::Positron();
00154   G4MuonPlus::MuonPlus();
00155   G4MuonMinus::MuonMinus();
00156 
00157 // mesons
00158   G4PionPlus::PionPlusDefinition();
00159   G4PionMinus::PionMinusDefinition();
00160   G4KaonPlus::KaonPlusDefinition();
00161   G4KaonMinus::KaonMinusDefinition();
00162 
00163 // barions
00164   G4Proton::Proton();
00165   G4AntiProton::AntiProton();
00166 
00167 // ions
00168   G4Deuteron::Deuteron();
00169   G4Triton::Triton();
00170   G4He3::He3();
00171   G4Alpha::Alpha();
00172   G4GenericIon::GenericIonDefinition();
00173 }
00174 
00175 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
00176 
00177 void G4EmStandardPhysics_option4::ConstructProcess()
00178 {
00179   G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
00180 
00181   // muon & hadron bremsstrahlung and pair production
00182   G4MuBremsstrahlung* mub = new G4MuBremsstrahlung();
00183   G4MuPairProduction* mup = new G4MuPairProduction();
00184   G4hBremsstrahlung* pib = new G4hBremsstrahlung();
00185   G4hPairProduction* pip = new G4hPairProduction();
00186   G4hBremsstrahlung* kb = new G4hBremsstrahlung();
00187   G4hPairProduction* kp = new G4hPairProduction();
00188   G4hBremsstrahlung* pb = new G4hBremsstrahlung();
00189   G4hPairProduction* pp = new G4hPairProduction();
00190 
00191   // muon & hadron multiple scattering
00192   G4MuMultipleScattering* mumsc = new G4MuMultipleScattering();
00193   mumsc->AddEmModel(0, new G4WentzelVIModel());
00194   G4hMultipleScattering* pimsc = new G4hMultipleScattering();
00195   pimsc->AddEmModel(0, new G4WentzelVIModel());
00196   G4hMultipleScattering* kmsc = new G4hMultipleScattering();
00197   kmsc->AddEmModel(0, new G4WentzelVIModel());
00198   G4hMultipleScattering* pmsc = new G4hMultipleScattering();
00199   pmsc->AddEmModel(0, new G4WentzelVIModel());
00200   G4hMultipleScattering* hmsc = new G4hMultipleScattering("ionmsc");
00201 
00202   // high energy limit for e+- scattering models
00203   G4double highEnergyLimit = 100*MeV;
00204 
00205   // nuclear stopping
00206   G4NuclearStopping* ionnuc = new G4NuclearStopping();
00207   G4NuclearStopping* pnuc = new G4NuclearStopping();
00208 
00209   // Add standard EM Processes
00210   theParticleIterator->reset();
00211   while( (*theParticleIterator)() ){
00212     G4ParticleDefinition* particle = theParticleIterator->value();
00213     G4String particleName = particle->GetParticleName();
00214     if(verbose > 1)
00215       G4cout << "### " << GetPhysicsName() << " instantiates for " 
00216              << particleName << G4endl;
00217 
00218     if (particleName == "gamma") {
00219 
00220       // Compton scattering
00221       G4ComptonScattering* cs = new G4ComptonScattering;
00222       cs->SetEmModel(new G4KleinNishinaModel(),1);
00223       G4VEmModel* theLowEPComptonModel = new G4LivermoreComptonModel();
00224       //G4VEmModel* theLowEPComptonModel = new G4LowEPComptonModel();
00225       theLowEPComptonModel->SetHighEnergyLimit(2*MeV);
00226       cs->AddEmModel(0, theLowEPComptonModel);
00227       ph->RegisterProcess(cs, particle);
00228 
00229       // Photoelectric
00230       G4PhotoElectricEffect* pe = new G4PhotoElectricEffect();
00231       G4VEmModel* theLivermorePEModel = new G4LivermorePhotoElectricModel();
00232       theLivermorePEModel->SetHighEnergyLimit(10*GeV);
00233       pe->SetEmModel(theLivermorePEModel,1);
00234       ph->RegisterProcess(pe, particle);
00235 
00236       // Gamma conversion
00237       G4GammaConversion* gc = new G4GammaConversion();
00238       G4VEmModel* thePenelopeGCModel = new G4PenelopeGammaConversionModel();
00239       thePenelopeGCModel->SetHighEnergyLimit(1*GeV);
00240       gc->SetEmModel(thePenelopeGCModel,1);
00241       ph->RegisterProcess(gc, particle);
00242 
00243       // Rayleigh scattering
00244       ph->RegisterProcess(new G4RayleighScattering(), particle);
00245  
00246     } else if (particleName == "e-") {
00247 
00248       // multiple scattering
00249       G4eMultipleScattering* msc = new G4eMultipleScattering;
00250       msc->SetStepLimitType(fUseDistanceToBoundary);
00251       G4UrbanMscModel95* msc1 = new G4UrbanMscModel95();
00252       G4WentzelVIModel* msc2 = new G4WentzelVIModel();
00253       msc1->SetHighEnergyLimit(highEnergyLimit);
00254       msc2->SetLowEnergyLimit(highEnergyLimit);
00255       msc->AddEmModel(0, msc1);
00256       msc->AddEmModel(0, msc2);
00257 
00258       G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel(); 
00259       G4CoulombScattering* ss = new G4CoulombScattering();
00260       ss->SetEmModel(ssm, 1); 
00261       ss->SetMinKinEnergy(highEnergyLimit);
00262       ssm->SetLowEnergyLimit(highEnergyLimit);
00263       ssm->SetActivationLowEnergyLimit(highEnergyLimit);
00264 
00265       // ionisation
00266       G4eIonisation* eIoni = new G4eIonisation();
00267       eIoni->SetStepFunction(0.2, 100*um);
00268       G4VEmModel* theIoniPenelope = new G4PenelopeIonisationModel();
00269       theIoniPenelope->SetHighEnergyLimit(0.1*MeV);
00270       eIoni->AddEmModel(0, theIoniPenelope, new G4UniversalFluctuation());
00271 
00272       // bremsstrahlung
00273       G4eBremsstrahlung* eBrem = new G4eBremsstrahlung();
00274 
00275       ph->RegisterProcess(msc, particle);
00276       ph->RegisterProcess(eIoni, particle);
00277       ph->RegisterProcess(eBrem, particle);
00278       ph->RegisterProcess(ss, particle);
00279 
00280     } else if (particleName == "e+") {
00281 
00282       // multiple scattering
00283       G4eMultipleScattering* msc = new G4eMultipleScattering;
00284       msc->SetStepLimitType(fUseDistanceToBoundary);
00285       G4UrbanMscModel95* msc1 = new G4UrbanMscModel95();
00286       G4WentzelVIModel* msc2 = new G4WentzelVIModel();
00287       msc1->SetHighEnergyLimit(highEnergyLimit);
00288       msc2->SetLowEnergyLimit(highEnergyLimit);
00289       msc->AddEmModel(0, msc1);
00290       msc->AddEmModel(0, msc2);
00291 
00292       G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel(); 
00293       G4CoulombScattering* ss = new G4CoulombScattering();
00294       ss->SetEmModel(ssm, 1); 
00295       ss->SetMinKinEnergy(highEnergyLimit);
00296       ssm->SetLowEnergyLimit(highEnergyLimit);
00297       ssm->SetActivationLowEnergyLimit(highEnergyLimit);
00298 
00299       // ionisation
00300       G4eIonisation* eIoni = new G4eIonisation();
00301       eIoni->SetStepFunction(0.2, 100*um);
00302       G4VEmModel* theIoniPenelope = new G4PenelopeIonisationModel();
00303       theIoniPenelope->SetHighEnergyLimit(0.1*MeV);
00304       eIoni->AddEmModel(0, theIoniPenelope, new G4UniversalFluctuation());
00305 
00306       // bremsstrahlung
00307       G4eBremsstrahlung* eBrem = new G4eBremsstrahlung();
00308 
00309       ph->RegisterProcess(msc, particle);
00310       ph->RegisterProcess(eIoni, particle);
00311       ph->RegisterProcess(eBrem, particle);
00312       ph->RegisterProcess(ss, particle);
00313 
00314       // annihilation at rest and in flight
00315       ph->RegisterProcess(new G4eplusAnnihilation(), particle);
00316 
00317     } else if (particleName == "mu+" ||
00318                particleName == "mu-"    ) {
00319 
00320       G4MuIonisation* muIoni = new G4MuIonisation();
00321       muIoni->SetStepFunction(0.2, 50*um);          
00322 
00323       ph->RegisterProcess(mumsc, particle);
00324       ph->RegisterProcess(muIoni, particle);
00325       ph->RegisterProcess(mub, particle);
00326       ph->RegisterProcess(mup, particle);
00327       ph->RegisterProcess(new G4CoulombScattering(), particle);
00328 
00329     } else if (particleName == "alpha" ||
00330                particleName == "He3") {
00331 
00332       G4hMultipleScattering* msc = new G4hMultipleScattering();
00333       G4ionIonisation* ionIoni = new G4ionIonisation();
00334       ionIoni->SetStepFunction(0.1, 10*um);
00335 
00336       ph->RegisterProcess(msc, particle);
00337       ph->RegisterProcess(ionIoni, particle);
00338       ph->RegisterProcess(ionnuc, particle);
00339 
00340     } else if (particleName == "GenericIon") {
00341 
00342       G4ionIonisation* ionIoni = new G4ionIonisation();
00343       ionIoni->SetEmModel(new G4IonParametrisedLossModel());
00344       ionIoni->SetStepFunction(0.1, 1*um);
00345 
00346       ph->RegisterProcess(hmsc, particle);
00347       ph->RegisterProcess(ionIoni, particle);
00348       ph->RegisterProcess(ionnuc, particle);
00349 
00350     } else if (particleName == "pi+" ||
00351                particleName == "pi-" ) {
00352 
00353       //G4hMultipleScattering* pimsc = new G4hMultipleScattering();
00354       G4hIonisation* hIoni = new G4hIonisation();
00355       hIoni->SetStepFunction(0.2, 50*um);
00356 
00357       ph->RegisterProcess(pimsc, particle);
00358       ph->RegisterProcess(hIoni, particle);
00359       ph->RegisterProcess(pib, particle);
00360       ph->RegisterProcess(pip, particle);
00361 
00362     } else if (particleName == "kaon+" ||
00363                particleName == "kaon-" ) {
00364 
00365       //G4hMultipleScattering* kmsc = new G4hMultipleScattering();
00366       G4hIonisation* hIoni = new G4hIonisation();
00367       hIoni->SetStepFunction(0.2, 50*um);
00368 
00369       ph->RegisterProcess(kmsc, particle);
00370       ph->RegisterProcess(hIoni, particle);
00371       ph->RegisterProcess(kb, particle);
00372       ph->RegisterProcess(kp, particle);
00373 
00374     } else if (particleName == "proton" ||
00375                particleName == "anti_proton") {
00376 
00377       //G4hMultipleScattering* pmsc = new G4hMultipleScattering();
00378       G4hIonisation* hIoni = new G4hIonisation();
00379       hIoni->SetStepFunction(0.2, 50*um);
00380 
00381       ph->RegisterProcess(pmsc, particle);
00382       ph->RegisterProcess(hIoni, particle);
00383       ph->RegisterProcess(pb, particle);
00384       ph->RegisterProcess(pp, particle);
00385       ph->RegisterProcess(pnuc, particle);
00386 
00387     } else if (particleName == "B+" ||
00388                particleName == "B-" ||
00389                particleName == "D+" ||
00390                particleName == "D-" ||
00391                particleName == "Ds+" ||
00392                particleName == "Ds-" ||
00393                particleName == "anti_He3" ||
00394                particleName == "anti_alpha" ||
00395                particleName == "anti_deuteron" ||
00396                particleName == "anti_lambda_c+" ||
00397                particleName == "anti_omega-" ||
00398                particleName == "anti_sigma_c+" ||
00399                particleName == "anti_sigma_c++" ||
00400                particleName == "anti_sigma+" ||
00401                particleName == "anti_sigma-" ||
00402                particleName == "anti_triton" ||
00403                particleName == "anti_xi_c+" ||
00404                particleName == "anti_xi-" ||
00405                particleName == "deuteron" ||
00406                particleName == "lambda_c+" ||
00407                particleName == "omega-" ||
00408                particleName == "sigma_c+" ||
00409                particleName == "sigma_c++" ||
00410                particleName == "sigma+" ||
00411                particleName == "sigma-" ||
00412                particleName == "tau+" ||
00413                particleName == "tau-" ||
00414                particleName == "triton" ||
00415                particleName == "xi_c+" ||
00416                particleName == "xi-" ) {
00417 
00418       ph->RegisterProcess(hmsc, particle);
00419       ph->RegisterProcess(new G4hIonisation(), particle);
00420       ph->RegisterProcess(pnuc, particle);
00421     }
00422   }
00423     
00424   // Em options
00425   //      
00426   G4EmProcessOptions opt;
00427   opt.SetVerbose(verbose);
00428   
00429   // Multiple Coulomb scattering
00430   //
00431   opt.SetPolarAngleLimit(CLHEP::pi);
00432     
00433   // Physics tables
00434   //
00435   opt.SetMinEnergy(100*eV);
00436   opt.SetMaxEnergy(10*TeV);
00437   opt.SetDEDXBinning(220);
00438   opt.SetLambdaBinning(220);
00439 
00440   // Nuclear stopping
00441   pnuc->SetMaxKinEnergy(MeV);
00442     
00443   // Ionization
00444   //
00445   //opt.SetSubCutoff(true);    
00446 
00447   // Deexcitation
00448   G4VAtomDeexcitation* de = new G4UAtomicDeexcitation();
00449   G4LossTableManager::Instance()->SetAtomDeexcitation(de);
00450   de->SetFluo(true);
00451 }
00452 
00453 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

Generated on Mon May 27 17:48:09 2013 for Geant4 by  doxygen 1.4.7