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
00040
00041 #include "G4EmStandardPhysics_option3.hh"
00042
00043 #include "G4SystemOfUnits.hh"
00044 #include "G4ParticleDefinition.hh"
00045 #include "G4LossTableManager.hh"
00046 #include "G4EmProcessOptions.hh"
00047
00048 #include "G4ComptonScattering.hh"
00049 #include "G4GammaConversion.hh"
00050 #include "G4PhotoElectricEffect.hh"
00051 #include "G4RayleighScattering.hh"
00052 #include "G4PEEffectFluoModel.hh"
00053 #include "G4KleinNishinaModel.hh"
00054
00055 #include "G4eMultipleScattering.hh"
00056 #include "G4MuMultipleScattering.hh"
00057 #include "G4hMultipleScattering.hh"
00058 #include "G4MscStepLimitType.hh"
00059 #include "G4UrbanMscModel93.hh"
00060 #include "G4UrbanMscModel95.hh"
00061 #include "G4DummyModel.hh"
00062 #include "G4WentzelVIModel.hh"
00063 #include "G4CoulombScattering.hh"
00064
00065 #include "G4eIonisation.hh"
00066 #include "G4eBremsstrahlung.hh"
00067 #include "G4Generator2BS.hh"
00068 #include "G4SeltzerBergerModel.hh"
00069
00070 #include "G4eplusAnnihilation.hh"
00071 #include "G4UAtomicDeexcitation.hh"
00072
00073 #include "G4MuIonisation.hh"
00074 #include "G4MuBremsstrahlung.hh"
00075 #include "G4MuPairProduction.hh"
00076 #include "G4hBremsstrahlung.hh"
00077 #include "G4hPairProduction.hh"
00078
00079 #include "G4MuBremsstrahlungModel.hh"
00080 #include "G4MuPairProductionModel.hh"
00081 #include "G4hBremsstrahlungModel.hh"
00082 #include "G4hPairProductionModel.hh"
00083
00084 #include "G4hIonisation.hh"
00085 #include "G4ionIonisation.hh"
00086 #include "G4IonParametrisedLossModel.hh"
00087 #include "G4NuclearStopping.hh"
00088
00089 #include "G4Gamma.hh"
00090 #include "G4Electron.hh"
00091 #include "G4Positron.hh"
00092 #include "G4MuonPlus.hh"
00093 #include "G4MuonMinus.hh"
00094 #include "G4PionPlus.hh"
00095 #include "G4PionMinus.hh"
00096 #include "G4KaonPlus.hh"
00097 #include "G4KaonMinus.hh"
00098 #include "G4Proton.hh"
00099 #include "G4AntiProton.hh"
00100 #include "G4Deuteron.hh"
00101 #include "G4Triton.hh"
00102 #include "G4He3.hh"
00103 #include "G4Alpha.hh"
00104 #include "G4GenericIon.hh"
00105
00106 #include "G4PhysicsListHelper.hh"
00107 #include "G4BuilderType.hh"
00108
00109
00110 #include "G4PhysicsConstructorFactory.hh"
00111
00112 G4_DECLARE_PHYSCONSTR_FACTORY(G4EmStandardPhysics_option3);
00113
00114
00115
00116 G4EmStandardPhysics_option3::G4EmStandardPhysics_option3(G4int ver)
00117 : G4VPhysicsConstructor("G4EmStandard_opt3"), verbose(ver)
00118 {
00119 G4LossTableManager::Instance();
00120 SetPhysicsType(bElectromagnetic);
00121 }
00122
00123
00124
00125 G4EmStandardPhysics_option3::G4EmStandardPhysics_option3(G4int ver, const G4String&)
00126 : G4VPhysicsConstructor("G4EmStandard_opt3"), verbose(ver)
00127 {
00128 G4LossTableManager::Instance();
00129 SetPhysicsType(bElectromagnetic);
00130 }
00131
00132
00133
00134 G4EmStandardPhysics_option3::~G4EmStandardPhysics_option3()
00135 {}
00136
00137
00138
00139 void G4EmStandardPhysics_option3::ConstructParticle()
00140 {
00141
00142 G4Gamma::Gamma();
00143
00144
00145 G4Electron::Electron();
00146 G4Positron::Positron();
00147 G4MuonPlus::MuonPlus();
00148 G4MuonMinus::MuonMinus();
00149
00150
00151 G4PionPlus::PionPlusDefinition();
00152 G4PionMinus::PionMinusDefinition();
00153 G4KaonPlus::KaonPlusDefinition();
00154 G4KaonMinus::KaonMinusDefinition();
00155
00156
00157 G4Proton::Proton();
00158 G4AntiProton::AntiProton();
00159
00160
00161 G4Deuteron::Deuteron();
00162 G4Triton::Triton();
00163 G4He3::He3();
00164 G4Alpha::Alpha();
00165 G4GenericIon::GenericIonDefinition();
00166 }
00167
00168
00169
00170 void G4EmStandardPhysics_option3::ConstructProcess()
00171 {
00172 G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
00173
00174
00175 G4MuBremsstrahlung* mub = new G4MuBremsstrahlung();
00176 G4MuPairProduction* mup = new G4MuPairProduction();
00177 G4hBremsstrahlung* pib = new G4hBremsstrahlung();
00178 G4hPairProduction* pip = new G4hPairProduction();
00179 G4hBremsstrahlung* kb = new G4hBremsstrahlung();
00180 G4hPairProduction* kp = new G4hPairProduction();
00181 G4hBremsstrahlung* pb = new G4hBremsstrahlung();
00182 G4hPairProduction* pp = new G4hPairProduction();
00183
00184
00185 G4MuMultipleScattering* mumsc = new G4MuMultipleScattering();
00186 mumsc->AddEmModel(0, new G4WentzelVIModel());
00187
00188
00189
00190
00191
00192
00193 G4hMultipleScattering* hmsc = new G4hMultipleScattering("ionmsc");
00194
00195
00196 G4NuclearStopping* ionnuc = new G4NuclearStopping();
00197 G4NuclearStopping* pnuc = new G4NuclearStopping();
00198
00199
00200 theParticleIterator->reset();
00201 while( (*theParticleIterator)() ){
00202 G4ParticleDefinition* particle = theParticleIterator->value();
00203 G4String particleName = particle->GetParticleName();
00204 if(verbose > 1)
00205 G4cout << "### " << GetPhysicsName() << " instantiates for "
00206 << particleName << G4endl;
00207
00208 if (particleName == "gamma") {
00209
00210 G4ComptonScattering* cs = new G4ComptonScattering;
00211 cs->SetEmModel(new G4KleinNishinaModel());
00212
00213 ph->RegisterProcess(new G4PhotoElectricEffect(), particle);
00214 ph->RegisterProcess(cs, particle);
00215 ph->RegisterProcess(new G4GammaConversion(), particle);
00216 ph->RegisterProcess(new G4RayleighScattering(), particle);
00217
00218 } else if (particleName == "e-") {
00219
00220 G4eMultipleScattering* msc = new G4eMultipleScattering();
00221
00222 msc->SetStepLimitType(fUseDistanceToBoundary);
00223 G4eIonisation* eIoni = new G4eIonisation();
00224 eIoni->SetStepFunction(0.2, 100*um);
00225
00226 G4eBremsstrahlung* brem = new G4eBremsstrahlung();
00227 ph->RegisterProcess(msc, particle);
00228 ph->RegisterProcess(eIoni, particle);
00229 ph->RegisterProcess(brem, particle);
00230
00231 } else if (particleName == "e+") {
00232
00233 G4eMultipleScattering* msc = new G4eMultipleScattering();
00234
00235 msc->SetStepLimitType(fUseDistanceToBoundary);
00236 G4eIonisation* eIoni = new G4eIonisation();
00237 eIoni->SetStepFunction(0.2, 100*um);
00238
00239 ph->RegisterProcess(msc, particle);
00240 ph->RegisterProcess(eIoni, particle);
00241 ph->RegisterProcess(new G4eBremsstrahlung(), particle);
00242 ph->RegisterProcess(new G4eplusAnnihilation(), particle);
00243
00244 } else if (particleName == "mu+" ||
00245 particleName == "mu-" ) {
00246
00247 G4MuIonisation* muIoni = new G4MuIonisation();
00248 muIoni->SetStepFunction(0.2, 50*um);
00249
00250 ph->RegisterProcess(mumsc, particle);
00251 ph->RegisterProcess(muIoni, particle);
00252 ph->RegisterProcess(mub, particle);
00253 ph->RegisterProcess(mup, particle);
00254 ph->RegisterProcess(new G4CoulombScattering(), particle);
00255
00256 } else if (particleName == "alpha" ||
00257 particleName == "He3") {
00258
00259 G4hMultipleScattering* msc = new G4hMultipleScattering();
00260 G4ionIonisation* ionIoni = new G4ionIonisation();
00261 ionIoni->SetStepFunction(0.1, 10*um);
00262
00263 ph->RegisterProcess(msc, particle);
00264 ph->RegisterProcess(ionIoni, particle);
00265 ph->RegisterProcess(ionnuc, particle);
00266
00267 } else if (particleName == "GenericIon") {
00268
00269 G4ionIonisation* ionIoni = new G4ionIonisation();
00270 ionIoni->SetEmModel(new G4IonParametrisedLossModel());
00271 ionIoni->SetStepFunction(0.1, 1*um);
00272
00273 ph->RegisterProcess(hmsc, particle);
00274 ph->RegisterProcess(ionIoni, particle);
00275 ph->RegisterProcess(ionnuc, particle);
00276
00277 } else if (particleName == "pi+" ||
00278 particleName == "pi-" ) {
00279
00280 G4hMultipleScattering* pimsc = new G4hMultipleScattering();
00281 G4hIonisation* hIoni = new G4hIonisation();
00282 hIoni->SetStepFunction(0.2, 50*um);
00283
00284 ph->RegisterProcess(pimsc, particle);
00285 ph->RegisterProcess(hIoni, particle);
00286 ph->RegisterProcess(pib, particle);
00287 ph->RegisterProcess(pip, particle);
00288
00289 } else if (particleName == "kaon+" ||
00290 particleName == "kaon-" ) {
00291
00292 G4hMultipleScattering* kmsc = new G4hMultipleScattering();
00293 G4hIonisation* hIoni = new G4hIonisation();
00294 hIoni->SetStepFunction(0.2, 50*um);
00295
00296 ph->RegisterProcess(kmsc, particle);
00297 ph->RegisterProcess(hIoni, particle);
00298 ph->RegisterProcess(kb, particle);
00299 ph->RegisterProcess(kp, particle);
00300
00301 } else if (particleName == "proton" ||
00302 particleName == "anti_proton") {
00303
00304 G4hMultipleScattering* pmsc = new G4hMultipleScattering();
00305 G4hIonisation* hIoni = new G4hIonisation();
00306 hIoni->SetStepFunction(0.2, 50*um);
00307
00308 ph->RegisterProcess(pmsc, particle);
00309 ph->RegisterProcess(hIoni, particle);
00310 ph->RegisterProcess(pb, particle);
00311 ph->RegisterProcess(pp, particle);
00312 ph->RegisterProcess(pnuc, particle);
00313
00314 } else if (particleName == "B+" ||
00315 particleName == "B-" ||
00316 particleName == "D+" ||
00317 particleName == "D-" ||
00318 particleName == "Ds+" ||
00319 particleName == "Ds-" ||
00320 particleName == "anti_He3" ||
00321 particleName == "anti_alpha" ||
00322 particleName == "anti_deuteron" ||
00323 particleName == "anti_lambda_c+" ||
00324 particleName == "anti_omega-" ||
00325 particleName == "anti_sigma_c+" ||
00326 particleName == "anti_sigma_c++" ||
00327 particleName == "anti_sigma+" ||
00328 particleName == "anti_sigma-" ||
00329 particleName == "anti_triton" ||
00330 particleName == "anti_xi_c+" ||
00331 particleName == "anti_xi-" ||
00332 particleName == "deuteron" ||
00333 particleName == "lambda_c+" ||
00334 particleName == "omega-" ||
00335 particleName == "sigma_c+" ||
00336 particleName == "sigma_c++" ||
00337 particleName == "sigma+" ||
00338 particleName == "sigma-" ||
00339 particleName == "tau+" ||
00340 particleName == "tau-" ||
00341 particleName == "triton" ||
00342 particleName == "xi_c+" ||
00343 particleName == "xi-" ) {
00344
00345 ph->RegisterProcess(hmsc, particle);
00346 ph->RegisterProcess(new G4hIonisation(), particle);
00347 }
00348 }
00349
00350
00351
00352 G4EmProcessOptions opt;
00353 opt.SetVerbose(verbose);
00354
00355
00356
00357 opt.SetPolarAngleLimit(CLHEP::pi);
00358
00359
00360
00361 opt.SetMinEnergy(10*eV);
00362 opt.SetMaxEnergy(10*TeV);
00363 opt.SetDEDXBinning(240);
00364 opt.SetLambdaBinning(240);
00365
00366
00367 pnuc->SetMaxKinEnergy(MeV);
00368
00369
00370
00371
00372
00373
00374 G4VAtomDeexcitation* de = new G4UAtomicDeexcitation();
00375 G4LossTableManager::Instance()->SetAtomDeexcitation(de);
00376 de->SetFluo(true);
00377 }
00378
00379