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 #include "G4EmLivermorePhysics.hh"
00029 #include "G4ParticleDefinition.hh"
00030 #include "G4SystemOfUnits.hh"
00031
00032
00033
00034
00035 #include "G4PhotoElectricEffect.hh"
00036 #include "G4LivermorePhotoElectricModel.hh"
00037
00038 #include "G4ComptonScattering.hh"
00039 #include "G4LivermoreComptonModel.hh"
00040
00041 #include "G4GammaConversion.hh"
00042 #include "G4LivermoreGammaConversionModel.hh"
00043
00044 #include "G4RayleighScattering.hh"
00045 #include "G4LivermoreRayleighModel.hh"
00046
00047
00048 #include "G4eMultipleScattering.hh"
00049 #include "G4UniversalFluctuation.hh"
00050
00051 #include "G4eIonisation.hh"
00052 #include "G4LivermoreIonisationModel.hh"
00053
00054 #include "G4eBremsstrahlung.hh"
00055 #include "G4LivermoreBremsstrahlungModel.hh"
00056 #include "G4Generator2BS.hh"
00057
00058
00059 #include "G4eplusAnnihilation.hh"
00060
00061
00062 #include "G4MuMultipleScattering.hh"
00063 #include "G4MuIonisation.hh"
00064 #include "G4MuBremsstrahlung.hh"
00065 #include "G4MuPairProduction.hh"
00066
00067 #include "G4MuBremsstrahlungModel.hh"
00068 #include "G4MuPairProductionModel.hh"
00069 #include "G4hBremsstrahlungModel.hh"
00070 #include "G4hPairProductionModel.hh"
00071
00072
00073 #include "G4hMultipleScattering.hh"
00074 #include "G4MscStepLimitType.hh"
00075
00076 #include "G4hBremsstrahlung.hh"
00077 #include "G4hPairProduction.hh"
00078
00079 #include "G4hIonisation.hh"
00080 #include "G4ionIonisation.hh"
00081 #include "G4alphaIonisation.hh"
00082 #include "G4IonParametrisedLossModel.hh"
00083 #include "G4NuclearStopping.hh"
00084
00085
00086 #include "G4UrbanMscModel95.hh"
00087 #include "G4WentzelVIModel.hh"
00088 #include "G4GoudsmitSaundersonMscModel.hh"
00089 #include "G4CoulombScattering.hh"
00090 #include "G4eCoulombScatteringModel.hh"
00091
00092
00093 #include "G4LossTableManager.hh"
00094 #include "G4EmProcessOptions.hh"
00095 #include "G4UAtomicDeexcitation.hh"
00096
00097
00098
00099 #include "G4Gamma.hh"
00100 #include "G4Electron.hh"
00101 #include "G4Positron.hh"
00102 #include "G4MuonPlus.hh"
00103 #include "G4MuonMinus.hh"
00104 #include "G4PionPlus.hh"
00105 #include "G4PionMinus.hh"
00106 #include "G4KaonPlus.hh"
00107 #include "G4KaonMinus.hh"
00108 #include "G4Proton.hh"
00109 #include "G4AntiProton.hh"
00110 #include "G4Deuteron.hh"
00111 #include "G4Triton.hh"
00112 #include "G4He3.hh"
00113 #include "G4Alpha.hh"
00114 #include "G4GenericIon.hh"
00115
00116
00117 #include "G4PhysicsListHelper.hh"
00118 #include "G4BuilderType.hh"
00119
00120
00121 #include "G4PhysicsConstructorFactory.hh"
00122
00123 G4_DECLARE_PHYSCONSTR_FACTORY(G4EmLivermorePhysics);
00124
00125
00126
00127
00128 G4EmLivermorePhysics::G4EmLivermorePhysics(G4int ver)
00129 : G4VPhysicsConstructor("G4EmLivermorePhysics"), verbose(ver)
00130 {
00131 G4LossTableManager::Instance();
00132 SetPhysicsType(bElectromagnetic);
00133 }
00134
00135
00136
00137 G4EmLivermorePhysics::G4EmLivermorePhysics(G4int ver, const G4String&)
00138 : G4VPhysicsConstructor("G4EmLivermorePhysics"), verbose(ver)
00139 {
00140 G4LossTableManager::Instance();
00141 SetPhysicsType(bElectromagnetic);
00142 }
00143
00144
00145
00146 G4EmLivermorePhysics::~G4EmLivermorePhysics()
00147 {}
00148
00149
00150
00151 void G4EmLivermorePhysics::ConstructParticle()
00152 {
00153
00154 G4Gamma::Gamma();
00155
00156
00157 G4Electron::Electron();
00158 G4Positron::Positron();
00159 G4MuonPlus::MuonPlus();
00160 G4MuonMinus::MuonMinus();
00161
00162
00163 G4PionPlus::PionPlusDefinition();
00164 G4PionMinus::PionMinusDefinition();
00165 G4KaonPlus::KaonPlusDefinition();
00166 G4KaonMinus::KaonMinusDefinition();
00167
00168
00169 G4Proton::Proton();
00170 G4AntiProton::AntiProton();
00171
00172
00173 G4Deuteron::Deuteron();
00174 G4Triton::Triton();
00175 G4He3::He3();
00176 G4Alpha::Alpha();
00177 G4GenericIon::GenericIonDefinition();
00178 }
00179
00180
00181
00182 void G4EmLivermorePhysics::ConstructProcess()
00183 {
00184 G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
00185
00186
00187 G4MuBremsstrahlung* mub = new G4MuBremsstrahlung();
00188 G4MuPairProduction* mup = new G4MuPairProduction();
00189 G4hBremsstrahlung* pib = new G4hBremsstrahlung();
00190 G4hPairProduction* pip = new G4hPairProduction();
00191 G4hBremsstrahlung* kb = new G4hBremsstrahlung();
00192 G4hPairProduction* kp = new G4hPairProduction();
00193 G4hBremsstrahlung* pb = new G4hBremsstrahlung();
00194 G4hPairProduction* pp = new G4hPairProduction();
00195
00196
00197 G4MuMultipleScattering* mumsc = new G4MuMultipleScattering();
00198 mumsc->AddEmModel(0, new G4WentzelVIModel());
00199 G4hMultipleScattering* pimsc = new G4hMultipleScattering();
00200 pimsc->AddEmModel(0, new G4WentzelVIModel());
00201 G4hMultipleScattering* kmsc = new G4hMultipleScattering();
00202 kmsc->AddEmModel(0, new G4WentzelVIModel());
00203 G4hMultipleScattering* pmsc = new G4hMultipleScattering();
00204 pmsc->AddEmModel(0, new G4WentzelVIModel());
00205 G4hMultipleScattering* hmsc = new G4hMultipleScattering("ionmsc");
00206
00207
00208 G4double highEnergyLimit = 100*MeV;
00209
00210
00211 G4NuclearStopping* ionnuc = new G4NuclearStopping();
00212 G4NuclearStopping* pnuc = new G4NuclearStopping();
00213
00214
00215 theParticleIterator->reset();
00216
00217 while( (*theParticleIterator)() ){
00218
00219 G4ParticleDefinition* particle = theParticleIterator->value();
00220 G4String particleName = particle->GetParticleName();
00221
00222 if(verbose > 1)
00223 G4cout << "### " << GetPhysicsName() << " instantiates for "
00224 << particleName << G4endl;
00225
00226
00227
00228 G4double LivermoreHighEnergyLimit = GeV;
00229
00230 if (particleName == "gamma") {
00231
00232
00233 G4PhotoElectricEffect* thePhotoElectricEffect = new G4PhotoElectricEffect();
00234 G4LivermorePhotoElectricModel* theLivermorePhotoElectricModel =
00235 new G4LivermorePhotoElectricModel();
00236 thePhotoElectricEffect->SetEmModel(theLivermorePhotoElectricModel);
00237 ph->RegisterProcess(thePhotoElectricEffect, particle);
00238
00239
00240 G4ComptonScattering* theComptonScattering = new G4ComptonScattering();
00241 G4LivermoreComptonModel* theLivermoreComptonModel =
00242 new G4LivermoreComptonModel();
00243 theLivermoreComptonModel->SetHighEnergyLimit(LivermoreHighEnergyLimit);
00244 theComptonScattering->SetEmModel(theLivermoreComptonModel, 1);
00245 ph->RegisterProcess(theComptonScattering, particle);
00246
00247
00248 G4GammaConversion* theGammaConversion = new G4GammaConversion();
00249 G4VEmModel* theLivermoreGammaConversionModel =
00250 new G4LivermoreGammaConversionModel();
00251 theGammaConversion->SetEmModel(theLivermoreGammaConversionModel, 1);
00252 ph->RegisterProcess(theGammaConversion, particle);
00253
00254
00255 G4RayleighScattering* theRayleigh = new G4RayleighScattering();
00256 ph->RegisterProcess(theRayleigh, particle);
00257
00258 } else if (particleName == "e-") {
00259
00260
00261 G4eMultipleScattering* msc = new G4eMultipleScattering;
00262 msc->SetStepLimitType(fUseDistanceToBoundary);
00263 G4UrbanMscModel95* msc1 = new G4UrbanMscModel95();
00264 G4WentzelVIModel* msc2 = new G4WentzelVIModel();
00265 msc1->SetHighEnergyLimit(highEnergyLimit);
00266 msc2->SetLowEnergyLimit(highEnergyLimit);
00267 msc->AddEmModel(0, msc1);
00268 msc->AddEmModel(0, msc2);
00269
00270 G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel();
00271 G4CoulombScattering* ss = new G4CoulombScattering();
00272 ss->SetEmModel(ssm, 1);
00273 ss->SetMinKinEnergy(highEnergyLimit);
00274 ssm->SetLowEnergyLimit(highEnergyLimit);
00275 ssm->SetActivationLowEnergyLimit(highEnergyLimit);
00276 ph->RegisterProcess(msc, particle);
00277 ph->RegisterProcess(ss, particle);
00278
00279
00280 G4eIonisation* eIoni = new G4eIonisation();
00281 G4LivermoreIonisationModel* theIoniLivermore = new
00282 G4LivermoreIonisationModel();
00283 theIoniLivermore->SetHighEnergyLimit(0.1*MeV);
00284 eIoni->AddEmModel(0, theIoniLivermore, new G4UniversalFluctuation() );
00285 eIoni->SetStepFunction(0.2, 100*um);
00286 ph->RegisterProcess(eIoni, particle);
00287
00288
00289 G4eBremsstrahlung* eBrem = new G4eBremsstrahlung();
00290 G4VEmModel* theBremLivermore = new G4LivermoreBremsstrahlungModel();
00291 theBremLivermore->SetHighEnergyLimit(1*GeV);
00292
00293 eBrem->SetEmModel(theBremLivermore,1);
00294
00295 ph->RegisterProcess(eBrem, particle);
00296
00297 } else if (particleName == "e+") {
00298
00299
00300
00301
00302 G4eMultipleScattering* msc = new G4eMultipleScattering;
00303 msc->SetStepLimitType(fUseDistanceToBoundary);
00304 G4UrbanMscModel95* msc1 = new G4UrbanMscModel95();
00305 G4WentzelVIModel* msc2 = new G4WentzelVIModel();
00306 msc1->SetHighEnergyLimit(highEnergyLimit);
00307 msc2->SetLowEnergyLimit(highEnergyLimit);
00308 msc->AddEmModel(0, msc1);
00309 msc->AddEmModel(0, msc2);
00310
00311 G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel();
00312 G4CoulombScattering* ss = new G4CoulombScattering();
00313 ss->SetEmModel(ssm, 1);
00314 ss->SetMinKinEnergy(highEnergyLimit);
00315 ssm->SetLowEnergyLimit(highEnergyLimit);
00316 ssm->SetActivationLowEnergyLimit(highEnergyLimit);
00317
00318 G4eIonisation* eIoni = new G4eIonisation();
00319 eIoni->SetStepFunction(0.2, 100*um);
00320
00321 ph->RegisterProcess(msc, particle);
00322 ph->RegisterProcess(eIoni, particle);
00323 ph->RegisterProcess(new G4eBremsstrahlung(), particle);
00324 ph->RegisterProcess(new G4eplusAnnihilation(), particle);
00325 ph->RegisterProcess(ss, particle);
00326
00327 } else if (particleName == "mu+" ||
00328 particleName == "mu-" ) {
00329
00330 G4MuIonisation* muIoni = new G4MuIonisation();
00331 muIoni->SetStepFunction(0.2, 50*um);
00332
00333 ph->RegisterProcess(mumsc, particle);
00334 ph->RegisterProcess(muIoni, particle);
00335 ph->RegisterProcess(mub, particle);
00336 ph->RegisterProcess(mup, particle);
00337 ph->RegisterProcess(new G4CoulombScattering(), particle);
00338
00339 } else if (particleName == "alpha" ||
00340 particleName == "He3" ) {
00341
00342
00343
00344 G4hMultipleScattering* msc = new G4hMultipleScattering();
00345 G4ionIonisation* ionIoni = new G4ionIonisation();
00346 ionIoni->SetStepFunction(0.1, 10*um);
00347
00348 ph->RegisterProcess(msc, particle);
00349 ph->RegisterProcess(ionIoni, particle);
00350 ph->RegisterProcess(ionnuc, particle);
00351
00352 } else if (particleName == "GenericIon") {
00353
00354
00355
00356 G4ionIonisation* ionIoni = new G4ionIonisation();
00357 ionIoni->SetEmModel(new G4IonParametrisedLossModel());
00358 ionIoni->SetStepFunction(0.1, 1*um);
00359
00360 ph->RegisterProcess(hmsc, particle);
00361 ph->RegisterProcess(ionIoni, particle);
00362 ph->RegisterProcess(ionnuc, particle);
00363
00364 } else if (particleName == "pi+" ||
00365 particleName == "pi-" ) {
00366
00367
00368 G4hIonisation* hIoni = new G4hIonisation();
00369 hIoni->SetStepFunction(0.2, 50*um);
00370
00371 ph->RegisterProcess(pimsc, particle);
00372 ph->RegisterProcess(hIoni, particle);
00373 ph->RegisterProcess(pib, particle);
00374 ph->RegisterProcess(pip, particle);
00375
00376 } else if (particleName == "kaon+" ||
00377 particleName == "kaon-" ) {
00378
00379
00380 G4hIonisation* hIoni = new G4hIonisation();
00381 hIoni->SetStepFunction(0.2, 50*um);
00382
00383 ph->RegisterProcess(kmsc, particle);
00384 ph->RegisterProcess(hIoni, particle);
00385 ph->RegisterProcess(kb, particle);
00386 ph->RegisterProcess(kp, particle);
00387
00388 } else if (particleName == "proton" ||
00389 particleName == "anti_proton") {
00390
00391
00392 G4hIonisation* hIoni = new G4hIonisation();
00393 hIoni->SetStepFunction(0.2, 50*um);
00394
00395 ph->RegisterProcess(pmsc, particle);
00396 ph->RegisterProcess(hIoni, particle);
00397 ph->RegisterProcess(pb, particle);
00398 ph->RegisterProcess(pp, particle);
00399 ph->RegisterProcess(pnuc, particle);
00400
00401 } else if (particleName == "B+" ||
00402 particleName == "B-" ||
00403 particleName == "D+" ||
00404 particleName == "D-" ||
00405 particleName == "Ds+" ||
00406 particleName == "Ds-" ||
00407 particleName == "anti_He3" ||
00408 particleName == "anti_alpha" ||
00409 particleName == "anti_deuteron" ||
00410 particleName == "anti_lambda_c+" ||
00411 particleName == "anti_omega-" ||
00412 particleName == "anti_sigma_c+" ||
00413 particleName == "anti_sigma_c++" ||
00414 particleName == "anti_sigma+" ||
00415 particleName == "anti_sigma-" ||
00416 particleName == "anti_triton" ||
00417 particleName == "anti_xi_c+" ||
00418 particleName == "anti_xi-" ||
00419 particleName == "deuteron" ||
00420 particleName == "lambda_c+" ||
00421 particleName == "omega-" ||
00422 particleName == "sigma_c+" ||
00423 particleName == "sigma_c++" ||
00424 particleName == "sigma+" ||
00425 particleName == "sigma-" ||
00426 particleName == "tau+" ||
00427 particleName == "tau-" ||
00428 particleName == "triton" ||
00429 particleName == "xi_c+" ||
00430 particleName == "xi-" ) {
00431
00432
00433
00434 ph->RegisterProcess(hmsc, particle);
00435 ph->RegisterProcess(new G4hIonisation(), particle);
00436 ph->RegisterProcess(pnuc, particle);
00437 }
00438 }
00439
00440
00441
00442 G4EmProcessOptions opt;
00443 opt.SetVerbose(verbose);
00444
00445
00446
00447 opt.SetPolarAngleLimit(CLHEP::pi);
00448
00449
00450
00451
00452 opt.SetMinEnergy(100*eV);
00453 opt.SetMaxEnergy(10*TeV);
00454 opt.SetDEDXBinning(220);
00455 opt.SetLambdaBinning(220);
00456
00457
00458 pnuc->SetMaxKinEnergy(MeV);
00459
00460
00461
00462
00463
00464
00465
00466 G4VAtomDeexcitation* de = new G4UAtomicDeexcitation();
00467 G4LossTableManager::Instance()->SetAtomDeexcitation(de);
00468 de->SetFluo(true);
00469 }
00470
00471