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 "G4EmLowEPPhysics.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 "G4LowEPComptonModel.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
00091
00092 #include "G4LossTableManager.hh"
00093 #include "G4EmProcessOptions.hh"
00094 #include "G4UAtomicDeexcitation.hh"
00095
00096
00097
00098 #include "G4Gamma.hh"
00099 #include "G4Electron.hh"
00100 #include "G4Positron.hh"
00101 #include "G4MuonPlus.hh"
00102 #include "G4MuonMinus.hh"
00103 #include "G4PionPlus.hh"
00104 #include "G4PionMinus.hh"
00105 #include "G4KaonPlus.hh"
00106 #include "G4KaonMinus.hh"
00107 #include "G4Proton.hh"
00108 #include "G4AntiProton.hh"
00109 #include "G4Deuteron.hh"
00110 #include "G4Triton.hh"
00111 #include "G4He3.hh"
00112 #include "G4Alpha.hh"
00113 #include "G4GenericIon.hh"
00114
00115
00116 #include "G4PhysicsListHelper.hh"
00117 #include "G4BuilderType.hh"
00118
00119
00120 #include "G4PhysicsConstructorFactory.hh"
00121
00122 G4_DECLARE_PHYSCONSTR_FACTORY(G4EmLowEPPhysics);
00123
00124
00125
00126 G4EmLowEPPhysics::G4EmLowEPPhysics(G4int ver)
00127 : G4VPhysicsConstructor("G4EmLowEPPhysics"), verbose(ver)
00128 {
00129 G4LossTableManager::Instance();
00130 SetPhysicsType(bElectromagnetic);
00131 }
00132
00133
00134
00135 G4EmLowEPPhysics::G4EmLowEPPhysics(G4int ver, const G4String&)
00136 : G4VPhysicsConstructor("G4EmLowEPPhysics"), verbose(ver)
00137 {
00138 G4LossTableManager::Instance();
00139 SetPhysicsType(bElectromagnetic);
00140 }
00141
00142
00143
00144 G4EmLowEPPhysics::~G4EmLowEPPhysics()
00145 {}
00146
00147
00148
00149 void G4EmLowEPPhysics::ConstructParticle()
00150 {
00151
00152 G4Gamma::Gamma();
00153
00154
00155 G4Electron::Electron();
00156 G4Positron::Positron();
00157 G4MuonPlus::MuonPlus();
00158 G4MuonMinus::MuonMinus();
00159
00160
00161 G4PionPlus::PionPlusDefinition();
00162 G4PionMinus::PionMinusDefinition();
00163 G4KaonPlus::KaonPlusDefinition();
00164 G4KaonMinus::KaonMinusDefinition();
00165
00166
00167 G4Proton::Proton();
00168 G4AntiProton::AntiProton();
00169
00170
00171 G4Deuteron::Deuteron();
00172 G4Triton::Triton();
00173 G4He3::He3();
00174 G4Alpha::Alpha();
00175 G4GenericIon::GenericIonDefinition();
00176 }
00177
00178
00179
00180 void G4EmLowEPPhysics::ConstructProcess()
00181 {
00182 G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
00183
00184
00185 G4MuBremsstrahlung* mub = new G4MuBremsstrahlung();
00186 G4MuPairProduction* mup = new G4MuPairProduction();
00187 G4hBremsstrahlung* pib = new G4hBremsstrahlung();
00188 G4hPairProduction* pip = new G4hPairProduction();
00189 G4hBremsstrahlung* kb = new G4hBremsstrahlung();
00190 G4hPairProduction* kp = new G4hPairProduction();
00191 G4hBremsstrahlung* pb = new G4hBremsstrahlung();
00192 G4hPairProduction* pp = new G4hPairProduction();
00193
00194
00195 G4MuMultipleScattering* mumsc = new G4MuMultipleScattering();
00196 mumsc->AddEmModel(0, new G4WentzelVIModel());
00197 G4hMultipleScattering* hmsc = new G4hMultipleScattering();
00198 G4hMultipleScattering* pmsc = new G4hMultipleScattering();
00199 G4hMultipleScattering* pimsc = new G4hMultipleScattering();
00200 G4hMultipleScattering* kmsc = new G4hMultipleScattering();
00201
00202
00203 theParticleIterator->reset();
00204
00205 while( (*theParticleIterator)() ){
00206
00207 G4ParticleDefinition* particle = theParticleIterator->value();
00208 G4String particleName = particle->GetParticleName();
00209
00210 if(verbose > 1)
00211 G4cout << "### " << GetPhysicsName() << " instantiates for "
00212 << particleName << G4endl;
00213
00214
00215
00216 G4double LivermoreHighEnergyLimit = GeV;
00217
00218 if (particleName == "gamma") {
00219
00220 G4PhotoElectricEffect* thePhotoElectricEffect = new G4PhotoElectricEffect();
00221 G4LivermorePhotoElectricModel* theLivermorePhotoElectricModel =
00222 new G4LivermorePhotoElectricModel();
00223 theLivermorePhotoElectricModel->SetHighEnergyLimit(LivermoreHighEnergyLimit);
00224 thePhotoElectricEffect->AddEmModel(0, theLivermorePhotoElectricModel);
00225 ph->RegisterProcess(thePhotoElectricEffect, particle);
00226
00227 G4ComptonScattering* theComptonScattering = new G4ComptonScattering();
00228 G4LowEPComptonModel* theLowEPComptonModel =
00229 new G4LowEPComptonModel();
00230 theLowEPComptonModel->SetHighEnergyLimit(LivermoreHighEnergyLimit);
00231 theComptonScattering->AddEmModel(0, theLowEPComptonModel);
00232 ph->RegisterProcess(theComptonScattering, particle);
00233
00234 G4GammaConversion* theGammaConversion = new G4GammaConversion();
00235 G4LivermoreGammaConversionModel* theLivermoreGammaConversionModel =
00236 new G4LivermoreGammaConversionModel();
00237 theLivermoreGammaConversionModel->SetHighEnergyLimit(LivermoreHighEnergyLimit);
00238 theGammaConversion->AddEmModel(0, theLivermoreGammaConversionModel);
00239 ph->RegisterProcess(theGammaConversion, particle);
00240
00241 G4RayleighScattering* theRayleigh = new G4RayleighScattering();
00242 G4LivermoreRayleighModel* theRayleighModel = new G4LivermoreRayleighModel();
00243 theRayleighModel->SetHighEnergyLimit(LivermoreHighEnergyLimit);
00244 theRayleigh->AddEmModel(0, theRayleighModel);
00245 ph->RegisterProcess(theRayleigh, particle);
00246
00247 } else if (particleName == "e-") {
00248
00249 G4eMultipleScattering* msc = new G4eMultipleScattering();
00250 msc->AddEmModel(0, new G4UrbanMscModel95());
00251
00252 msc->SetStepLimitType(fUseDistanceToBoundary);
00253 ph->RegisterProcess(msc, particle);
00254
00255
00256 G4eIonisation* eIoni = new G4eIonisation();
00257 G4LivermoreIonisationModel* theIoniLivermore = new
00258 G4LivermoreIonisationModel();
00259 theIoniLivermore->SetHighEnergyLimit(0.1*MeV);
00260 eIoni->AddEmModel(0, theIoniLivermore, new G4UniversalFluctuation() );
00261 eIoni->SetStepFunction(0.2, 100*um);
00262 ph->RegisterProcess(eIoni, particle);
00263
00264
00265 G4eBremsstrahlung* eBrem = new G4eBremsstrahlung();
00266 G4LivermoreBremsstrahlungModel* theBremLivermore = new
00267 G4LivermoreBremsstrahlungModel();
00268 theBremLivermore->SetHighEnergyLimit(25*MeV);
00269 theBremLivermore->SetAngularDistribution(new G4Generator2BS());
00270 eBrem->AddEmModel(0, theBremLivermore);
00271 ph->RegisterProcess(eBrem, particle);
00272
00273 } else if (particleName == "e+") {
00274
00275
00276
00277 G4eMultipleScattering* msc = new G4eMultipleScattering();
00278 msc->AddEmModel(0, new G4UrbanMscModel95());
00279
00280 msc->SetStepLimitType(fUseDistanceToBoundary);
00281 G4eIonisation* eIoni = new G4eIonisation();
00282 eIoni->SetStepFunction(0.2, 100*um);
00283
00284 ph->RegisterProcess(msc, particle);
00285 ph->RegisterProcess(eIoni, particle);
00286 ph->RegisterProcess(new G4eBremsstrahlung(), particle);
00287 ph->RegisterProcess(new G4eplusAnnihilation(), particle);
00288
00289 } else if (particleName == "mu+" ||
00290 particleName == "mu-" ) {
00291
00292 G4MuIonisation* muIoni = new G4MuIonisation();
00293 muIoni->SetStepFunction(0.2, 50*um);
00294
00295 ph->RegisterProcess(mumsc, particle);
00296 ph->RegisterProcess(muIoni, particle);
00297 ph->RegisterProcess(mub, particle);
00298 ph->RegisterProcess(mup, particle);
00299 ph->RegisterProcess(new G4CoulombScattering(), particle);
00300
00301 } else if (particleName == "alpha" ||
00302 particleName == "He3" ) {
00303
00304
00305
00306 G4ionIonisation* ionIoni = new G4ionIonisation();
00307 ionIoni->SetStepFunction(0.1, 10*um);
00308
00309 ph->RegisterProcess(hmsc, particle);
00310 ph->RegisterProcess(ionIoni, particle);
00311 ph->RegisterProcess(new G4NuclearStopping(), particle);
00312
00313 } else if (particleName == "GenericIon") {
00314
00315
00316
00317 G4ionIonisation* ionIoni = new G4ionIonisation();
00318 ionIoni->SetEmModel(new G4IonParametrisedLossModel());
00319 ionIoni->SetStepFunction(0.1, 1*um);
00320
00321 ph->RegisterProcess(hmsc, particle);
00322 ph->RegisterProcess(ionIoni, particle);
00323 ph->RegisterProcess(new G4NuclearStopping(), particle);
00324
00325 } else if (particleName == "pi+" ||
00326 particleName == "pi-" ) {
00327
00328 G4hIonisation* hIoni = new G4hIonisation();
00329 hIoni->SetStepFunction(0.2, 50*um);
00330
00331 ph->RegisterProcess(pimsc, particle);
00332 ph->RegisterProcess(hIoni, particle);
00333 ph->RegisterProcess(pib, particle);
00334 ph->RegisterProcess(pip, particle);
00335
00336 } else if (particleName == "kaon+" ||
00337 particleName == "kaon-" ) {
00338
00339 G4hIonisation* hIoni = new G4hIonisation();
00340 hIoni->SetStepFunction(0.2, 50*um);
00341
00342 ph->RegisterProcess(kmsc, particle);
00343 ph->RegisterProcess(hIoni, particle);
00344 ph->RegisterProcess(kb, particle);
00345 ph->RegisterProcess(kp, particle);
00346
00347 } else if (particleName == "proton" ||
00348 particleName == "anti_proton") {
00349
00350 G4hIonisation* hIoni = new G4hIonisation();
00351 hIoni->SetStepFunction(0.2, 50*um);
00352
00353 ph->RegisterProcess(pmsc, particle);
00354 ph->RegisterProcess(hIoni, particle);
00355 ph->RegisterProcess(pb, particle);
00356 ph->RegisterProcess(pp, particle);
00357
00358 } else if (particleName == "B+" ||
00359 particleName == "B-" ||
00360 particleName == "D+" ||
00361 particleName == "D-" ||
00362 particleName == "Ds+" ||
00363 particleName == "Ds-" ||
00364 particleName == "anti_He3" ||
00365 particleName == "anti_alpha" ||
00366 particleName == "anti_deuteron" ||
00367 particleName == "anti_lambda_c+" ||
00368 particleName == "anti_omega-" ||
00369 particleName == "anti_sigma_c+" ||
00370 particleName == "anti_sigma_c++" ||
00371 particleName == "anti_sigma+" ||
00372 particleName == "anti_sigma-" ||
00373 particleName == "anti_triton" ||
00374 particleName == "anti_xi_c+" ||
00375 particleName == "anti_xi-" ||
00376 particleName == "deuteron" ||
00377 particleName == "lambda_c+" ||
00378 particleName == "omega-" ||
00379 particleName == "sigma_c+" ||
00380 particleName == "sigma_c++" ||
00381 particleName == "sigma+" ||
00382 particleName == "sigma-" ||
00383 particleName == "tau+" ||
00384 particleName == "tau-" ||
00385 particleName == "triton" ||
00386 particleName == "xi_c+" ||
00387 particleName == "xi-" ) {
00388
00389
00390
00391 ph->RegisterProcess(hmsc, particle);
00392 ph->RegisterProcess(new G4hIonisation(), particle);
00393
00394 }
00395 }
00396
00397
00398
00399 G4EmProcessOptions opt;
00400 opt.SetVerbose(verbose);
00401
00402
00403
00404 opt.SetPolarAngleLimit(CLHEP::pi);
00405
00406
00407
00408
00409 opt.SetMinEnergy(100*eV);
00410 opt.SetMaxEnergy(10*TeV);
00411 opt.SetDEDXBinning(220);
00412 opt.SetLambdaBinning(220);
00413
00414
00415
00416
00417
00418
00419
00420 G4VAtomDeexcitation* de = new G4UAtomicDeexcitation();
00421 G4LossTableManager::Instance()->SetAtomDeexcitation(de);
00422 de->SetFluo(true);
00423 }
00424
00425