00001 #include "SimG4Core/PhysicsLists/interface/CMSEmStandardPhysicsLPM.h"
00002
00003 #include "G4ParticleDefinition.hh"
00004 #include "G4ProcessManager.hh"
00005 #include "G4LossTableManager.hh"
00006 #include "G4EmProcessOptions.hh"
00007 #include "G4RegionStore.hh"
00008
00009 #include "G4ComptonScattering.hh"
00010 #include "G4GammaConversion.hh"
00011 #include "G4PhotoElectricEffect.hh"
00012 #include "G4PairProductionRelModel.hh"
00013
00014 #include "G4hMultipleScattering.hh"
00015 #include "G4eMultipleScattering.hh"
00016 #include "G4MuMultipleScattering.hh"
00017 #include "G4MscStepLimitType.hh"
00018 #include "G4UrbanMscModel93.hh"
00019 #include "G4WentzelVIModel.hh"
00020 #include "G4CoulombScattering.hh"
00021
00022 #include "G4eIonisation.hh"
00023 #include "G4eBremsstrahlung.hh"
00024 #include "G4eplusAnnihilation.hh"
00025
00026 #include "G4MuIonisation.hh"
00027 #include "G4MuBremsstrahlung.hh"
00028 #include "G4MuPairProduction.hh"
00029
00030 #include "G4hIonisation.hh"
00031 #include "G4ionIonisation.hh"
00032 #include "G4hBremsstrahlung.hh"
00033 #include "G4hPairProduction.hh"
00034
00035 #include "G4Gamma.hh"
00036 #include "G4Electron.hh"
00037 #include "G4Positron.hh"
00038 #include "G4MuonPlus.hh"
00039 #include "G4MuonMinus.hh"
00040 #include "G4TauMinus.hh"
00041 #include "G4TauPlus.hh"
00042 #include "G4PionPlus.hh"
00043 #include "G4PionMinus.hh"
00044 #include "G4KaonPlus.hh"
00045 #include "G4KaonMinus.hh"
00046 #include "G4BMesonMinus.hh"
00047 #include "G4BMesonPlus.hh"
00048 #include "G4DMesonMinus.hh"
00049 #include "G4DMesonPlus.hh"
00050 #include "G4Proton.hh"
00051 #include "G4AntiProton.hh"
00052 #include "G4SigmaMinus.hh"
00053 #include "G4AntiSigmaMinus.hh"
00054 #include "G4SigmaPlus.hh"
00055 #include "G4AntiSigmaPlus.hh"
00056 #include "G4XiMinus.hh"
00057 #include "G4AntiXiMinus.hh"
00058 #include "G4OmegaMinus.hh"
00059 #include "G4AntiOmegaMinus.hh"
00060 #include "G4LambdacPlus.hh"
00061 #include "G4AntiLambdacPlus.hh"
00062 #include "G4XicPlus.hh"
00063 #include "G4AntiXicPlus.hh"
00064 #include "G4Deuteron.hh"
00065 #include "G4Triton.hh"
00066 #include "G4He3.hh"
00067 #include "G4Alpha.hh"
00068 #include "G4GenericIon.hh"
00069
00070 CMSEmStandardPhysicsLPM::CMSEmStandardPhysicsLPM(const G4String& name, G4int ver):
00071 G4VPhysicsConstructor(name), verbose(ver) {
00072 G4LossTableManager::Instance();
00073 }
00074
00075 CMSEmStandardPhysicsLPM::~CMSEmStandardPhysicsLPM() {}
00076
00077 void CMSEmStandardPhysicsLPM::ConstructParticle() {
00078
00079 G4Gamma::Gamma();
00080
00081
00082 G4Electron::Electron();
00083 G4Positron::Positron();
00084 G4MuonPlus::MuonPlus();
00085 G4MuonMinus::MuonMinus();
00086 G4TauMinus::TauMinusDefinition();
00087 G4TauPlus::TauPlusDefinition();
00088
00089
00090 G4PionPlus::PionPlusDefinition();
00091 G4PionMinus::PionMinusDefinition();
00092 G4KaonPlus::KaonPlusDefinition();
00093 G4KaonMinus::KaonMinusDefinition();
00094 G4DMesonMinus::DMesonMinusDefinition();
00095 G4DMesonPlus::DMesonPlusDefinition();
00096 G4BMesonMinus::BMesonMinusDefinition();
00097 G4BMesonPlus::BMesonPlusDefinition();
00098
00099
00100 G4Proton::Proton();
00101 G4AntiProton::AntiProton();
00102 G4SigmaMinus::SigmaMinusDefinition();
00103 G4AntiSigmaMinus::AntiSigmaMinusDefinition();
00104 G4SigmaPlus::SigmaPlusDefinition();
00105 G4AntiSigmaPlus::AntiSigmaPlusDefinition();
00106 G4XiMinus::XiMinusDefinition();
00107 G4AntiXiMinus::AntiXiMinusDefinition();
00108 G4OmegaMinus::OmegaMinusDefinition();
00109 G4AntiOmegaMinus::AntiOmegaMinusDefinition();
00110 G4LambdacPlus::LambdacPlusDefinition();
00111 G4AntiLambdacPlus::AntiLambdacPlusDefinition();
00112 G4XicPlus::XicPlusDefinition();
00113 G4AntiXicPlus::AntiXicPlusDefinition();
00114
00115
00116 G4Deuteron::Deuteron();
00117 G4Triton::Triton();
00118 G4He3::He3();
00119 G4Alpha::Alpha();
00120 G4GenericIon::GenericIonDefinition();
00121 }
00122
00123 void CMSEmStandardPhysicsLPM::ConstructProcess()
00124 {
00125
00126
00127 theParticleIterator->reset();
00128 while( (*theParticleIterator)() ){
00129 G4ParticleDefinition* particle = theParticleIterator->value();
00130 G4ProcessManager* pmanager = particle->GetProcessManager();
00131 G4String particleName = particle->GetParticleName();
00132 if(verbose > 1)
00133 G4cout << "### " << GetPhysicsName() << " instantiates for "
00134 << particleName << " at " << particle << G4endl;
00135
00136 if (particleName == "gamma") {
00137
00138 pmanager->AddDiscreteProcess(new G4PhotoElectricEffect);
00139 pmanager->AddDiscreteProcess(new G4ComptonScattering);
00140 G4GammaConversion* conv = new G4GammaConversion();
00141 G4PairProductionRelModel* mod = new G4PairProductionRelModel();
00142 mod->SetLowEnergyLimit(100*GeV);
00143 conv->AddEmModel(0, mod);
00144 pmanager->AddDiscreteProcess(conv);
00145
00146 } else if (particleName == "e-") {
00147
00148 G4eIonisation* eioni = new G4eIonisation();
00149 eioni->SetStepFunction(0.8, 1.0*mm);
00150 G4eMultipleScattering* msc = new G4eMultipleScattering;
00151 msc->SetStepLimitType(fMinimal);
00152 msc->AddEmModel(0,new G4UrbanMscModel93());
00153
00154 G4eBremsstrahlung* ebrem = new G4eBremsstrahlung();
00155
00156
00157
00158
00159 pmanager->AddProcess(msc, -1, 1, 1);
00160 pmanager->AddProcess(eioni, -1, 2, 2);
00161 pmanager->AddProcess(ebrem, -1,-3, 3);
00162
00163 } else if (particleName == "e+") {
00164
00165 G4eIonisation* eioni = new G4eIonisation();
00166 eioni->SetStepFunction(0.8, 1.0*mm);
00167 G4eMultipleScattering* msc = new G4eMultipleScattering;
00168 msc->SetStepLimitType(fMinimal);
00169 msc->AddEmModel(0,new G4UrbanMscModel93());
00170
00171 G4eBremsstrahlung* ebrem = new G4eBremsstrahlung();
00172
00173
00174
00175
00176 pmanager->AddProcess(msc, -1, 1, 1);
00177 pmanager->AddProcess(eioni, -1, 2, 2);
00178 pmanager->AddProcess(ebrem, -1,-3, 3);
00179 pmanager->AddProcess(new G4eplusAnnihilation, 0,-1, 4);
00180
00181 } else if (particleName == "mu+" ||
00182 particleName == "mu-" ) {
00183
00184 G4MuMultipleScattering* mumsc = new G4MuMultipleScattering();
00185 mumsc->AddEmModel(0, new G4WentzelVIModel());
00186 pmanager->AddProcess(mumsc, -1, 1, 1);
00187 pmanager->AddProcess(new G4MuIonisation, -1, 2, 2);
00188 pmanager->AddProcess(new G4MuBremsstrahlung, -1,-3, 3);
00189 pmanager->AddProcess(new G4MuPairProduction, -1,-4, 4);
00190 pmanager->AddProcess(new G4CoulombScattering, -1,-4, 5);
00191
00192 } else if (particleName == "alpha" ||
00193 particleName == "He3" ||
00194 particleName == "GenericIon") {
00195
00196 pmanager->AddProcess(new G4hMultipleScattering, -1, 1, 1);
00197 pmanager->AddProcess(new G4ionIonisation, -1, 2, 2);
00198
00199 } else if (particleName == "pi+" ||
00200 particleName == "kaon+" ||
00201 particleName == "kaon-" ||
00202 particleName == "proton" ||
00203 particleName == "pi-" ) {
00204
00205 pmanager->AddProcess(new G4hMultipleScattering, -1, 1, 1);
00206 pmanager->AddProcess(new G4hIonisation, -1, 2, 2);
00207 pmanager->AddProcess(new G4hBremsstrahlung(), -1,-3, 3);
00208 pmanager->AddProcess(new G4hPairProduction(), -1,-4, 4);
00209
00210 } else if (particleName == "B+" ||
00211 particleName == "B-" ||
00212 particleName == "D+" ||
00213 particleName == "D-" ||
00214 particleName == "Ds+" ||
00215 particleName == "Ds-" ||
00216 particleName == "anti_lambda_c+" ||
00217 particleName == "anti_omega-" ||
00218 particleName == "anti_proton" ||
00219 particleName == "anti_sigma_c+" ||
00220 particleName == "anti_sigma_c++" ||
00221 particleName == "anti_sigma+" ||
00222 particleName == "anti_sigma-" ||
00223 particleName == "anti_xi_c+" ||
00224 particleName == "anti_xi-" ||
00225 particleName == "deuteron" ||
00226 particleName == "lambda_c+" ||
00227 particleName == "omega-" ||
00228 particleName == "sigma_c+" ||
00229 particleName == "sigma_c++" ||
00230 particleName == "sigma+" ||
00231 particleName == "sigma-" ||
00232 particleName == "tau+" ||
00233 particleName == "tau-" ||
00234 particleName == "triton" ||
00235 particleName == "xi_c+" ||
00236 particleName == "xi-" ) {
00237
00238 pmanager->AddProcess(new G4hMultipleScattering, -1, 1, 1);
00239 pmanager->AddProcess(new G4hIonisation, -1, 2, 2);
00240 }
00241 }
00242
00243
00244
00245 G4EmProcessOptions opt;
00246 opt.SetVerbose(verbose);
00247
00248
00249 opt.SetPolarAngleLimit(CLHEP::pi);
00250
00251
00252
00253 opt.SetApplyCuts(true);
00254
00255
00256
00257 opt.SetMinEnergy(100.*eV);
00258 opt.SetMaxEnergy(10.*TeV);
00259 opt.SetDEDXBinning(77);
00260 opt.SetLambdaBinning(77);
00261
00262 }