00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
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
00117 #include "G4PhysicsConstructorFactory.hh"
00118
00119 G4_DECLARE_PHYSCONSTR_FACTORY(G4EmStandardPhysics_option4);
00120
00121
00122
00123 G4EmStandardPhysics_option4::G4EmStandardPhysics_option4(G4int ver)
00124 : G4VPhysicsConstructor("G4EmStandard_opt4"), verbose(ver)
00125 {
00126 G4LossTableManager::Instance();
00127 SetPhysicsType(bElectromagnetic);
00128 }
00129
00130
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
00140
00141 G4EmStandardPhysics_option4::~G4EmStandardPhysics_option4()
00142 {}
00143
00144
00145
00146 void G4EmStandardPhysics_option4::ConstructParticle()
00147 {
00148
00149 G4Gamma::Gamma();
00150
00151
00152 G4Electron::Electron();
00153 G4Positron::Positron();
00154 G4MuonPlus::MuonPlus();
00155 G4MuonMinus::MuonMinus();
00156
00157
00158 G4PionPlus::PionPlusDefinition();
00159 G4PionMinus::PionMinusDefinition();
00160 G4KaonPlus::KaonPlusDefinition();
00161 G4KaonMinus::KaonMinusDefinition();
00162
00163
00164 G4Proton::Proton();
00165 G4AntiProton::AntiProton();
00166
00167
00168 G4Deuteron::Deuteron();
00169 G4Triton::Triton();
00170 G4He3::He3();
00171 G4Alpha::Alpha();
00172 G4GenericIon::GenericIonDefinition();
00173 }
00174
00175
00176
00177 void G4EmStandardPhysics_option4::ConstructProcess()
00178 {
00179 G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
00180
00181
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
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
00203 G4double highEnergyLimit = 100*MeV;
00204
00205
00206 G4NuclearStopping* ionnuc = new G4NuclearStopping();
00207 G4NuclearStopping* pnuc = new G4NuclearStopping();
00208
00209
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
00221 G4ComptonScattering* cs = new G4ComptonScattering;
00222 cs->SetEmModel(new G4KleinNishinaModel(),1);
00223 G4VEmModel* theLowEPComptonModel = new G4LivermoreComptonModel();
00224
00225 theLowEPComptonModel->SetHighEnergyLimit(2*MeV);
00226 cs->AddEmModel(0, theLowEPComptonModel);
00227 ph->RegisterProcess(cs, particle);
00228
00229
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
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
00244 ph->RegisterProcess(new G4RayleighScattering(), particle);
00245
00246 } else if (particleName == "e-") {
00247
00248
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
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
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
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
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
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
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
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
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
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
00425
00426 G4EmProcessOptions opt;
00427 opt.SetVerbose(verbose);
00428
00429
00430
00431 opt.SetPolarAngleLimit(CLHEP::pi);
00432
00433
00434
00435 opt.SetMinEnergy(100*eV);
00436 opt.SetMaxEnergy(10*TeV);
00437 opt.SetDEDXBinning(220);
00438 opt.SetLambdaBinning(220);
00439
00440
00441 pnuc->SetMaxKinEnergy(MeV);
00442
00443
00444
00445
00446
00447
00448 G4VAtomDeexcitation* de = new G4UAtomicDeexcitation();
00449 G4LossTableManager::Instance()->SetAtomDeexcitation(de);
00450 de->SetFluo(true);
00451 }
00452
00453