38#include "G4Version.hh"
40#if G4VERSION_NUMBER > 1039
44#include "BDSEmStandardPhysicsOp4Channelling.hh"
46#include "G4SystemOfUnits.hh"
47#include "G4ParticleDefinition.hh"
48#include "G4LossTableManager.hh"
49#include "G4EmParameters.hh"
51#include "G4ComptonScattering.hh"
52#include "G4GammaConversion.hh"
53#include "G4PhotoElectricEffect.hh"
54#include "G4RayleighScattering.hh"
55#include "G4PEEffectFluoModel.hh"
56#include "G4KleinNishinaModel.hh"
57#include "G4LowEPComptonModel.hh"
58#include "G4PenelopeGammaConversionModel.hh"
59#include "G4LivermorePhotoElectricModel.hh"
61#include "G4eMultipleScattering.hh"
62#include "G4MuMultipleScattering.hh"
63#include "G4hMultipleScattering.hh"
64#include "G4MscStepLimitType.hh"
65#include "G4UrbanMscModel.hh"
66#include "G4DummyModel.hh"
67#include "G4WentzelVIModel.hh"
68#include "G4CoulombScattering.hh"
69#include "G4eCoulombScatteringModel.hh"
71#include "G4eIonisation.hh"
72#include "G4eBremsstrahlung.hh"
73#include "G4Generator2BS.hh"
74#include "G4Generator2BN.hh"
75#include "G4SeltzerBergerModel.hh"
76#include "G4PenelopeIonisationModel.hh"
77#include "G4UniversalFluctuation.hh"
79#include "G4eplusAnnihilation.hh"
80#include "G4UAtomicDeexcitation.hh"
82#include "G4MuIonisation.hh"
83#include "G4MuBremsstrahlung.hh"
84#include "G4MuPairProduction.hh"
85#include "G4hBremsstrahlung.hh"
86#include "G4hPairProduction.hh"
87#include "G4ePairProduction.hh"
89#include "G4MuBremsstrahlungModel.hh"
90#include "G4MuPairProductionModel.hh"
91#include "G4hBremsstrahlungModel.hh"
92#include "G4hPairProductionModel.hh"
94#include "G4hIonisation.hh"
95#include "G4ionIonisation.hh"
96#include "G4IonParametrisedLossModel.hh"
97#include "G4NuclearStopping.hh"
100#include "G4Electron.hh"
101#include "G4Positron.hh"
102#include "G4MuonPlus.hh"
103#include "G4MuonMinus.hh"
104#include "G4PionPlus.hh"
105#include "G4PionMinus.hh"
106#include "G4KaonPlus.hh"
107#include "G4KaonMinus.hh"
108#include "G4Proton.hh"
109#include "G4AntiProton.hh"
110#include "G4Deuteron.hh"
111#include "G4Triton.hh"
114#include "G4GenericIon.hh"
116#include "G4PhysicsListHelper.hh"
117#include "G4BuilderType.hh"
118#include "G4EmModelActivator.hh"
121#include "G4PhysicsConstructorFactory.hh"
127BDSEmStandardPhysicsOp4Channelling::BDSEmStandardPhysicsOp4Channelling(G4int ver,
129 : G4VPhysicsConstructor(
"G4EmStandard_opt4_channeling"), verbose(ver)
131 G4EmParameters* param = G4EmParameters::Instance();
132 param->SetDefaults();
133 param->SetVerbose(verbose);
134 param->SetMinEnergy(100*eV);
135 param->SetMaxEnergy(10*TeV);
136 param->SetLowestElectronEnergy(10*eV);
137 param->SetNumberOfBinsPerDecade(20);
138 param->ActivateAngularGeneratorForIonisation(
true);
139 param->SetMscThetaLimit(0.0);
140 param->SetFluo(
true);
141 param->SetAuger(
true);
142 param->SetPixe(
true);
143 SetPhysicsType(bElectromagnetic);
148BDSEmStandardPhysicsOp4Channelling::~BDSEmStandardPhysicsOp4Channelling()
151void BDSEmStandardPhysicsOp4Channelling::ConstructParticle()
157 G4Electron::Electron();
158 G4Positron::Positron();
159 G4MuonPlus::MuonPlus();
160 G4MuonMinus::MuonMinus();
163 G4PionPlus::PionPlusDefinition();
164 G4PionMinus::PionMinusDefinition();
165 G4KaonPlus::KaonPlusDefinition();
166 G4KaonMinus::KaonMinusDefinition();
170 G4AntiProton::AntiProton();
173 G4Deuteron::Deuteron();
177 G4GenericIon::GenericIonDefinition();
182void BDSEmStandardPhysicsOp4Channelling::ConstructProcess()
185 G4cout <<
"### " << GetPhysicsName() <<
" Construct Processes " << G4endl;
187 G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
190 G4MuBremsstrahlung* mub =
new G4MuBremsstrahlung();
191 G4MuPairProduction* mup =
new G4MuPairProduction();
192 G4hBremsstrahlung* pib =
new G4hBremsstrahlung();
193 G4hPairProduction* pip =
new G4hPairProduction();
194 G4hBremsstrahlung* kb =
new G4hBremsstrahlung();
195 G4hPairProduction* kp =
new G4hPairProduction();
196 G4hBremsstrahlung* pb =
new G4hBremsstrahlung();
197 G4hPairProduction* pp =
new G4hPairProduction();
198 G4ePairProduction* ee =
new G4ePairProduction();
201 G4CoulombScattering* muss =
new G4CoulombScattering();
202 G4CoulombScattering* piss =
new G4CoulombScattering();
203 G4CoulombScattering* kss =
new G4CoulombScattering();
204 G4CoulombScattering* pss =
new G4CoulombScattering();
209 G4double penEnergyLimit = 1*MeV;
212 G4NuclearStopping* pnuc =
new G4NuclearStopping();
215#if G4VERSION_NUMBER > 1029
216 auto aParticleIterator=GetParticleIterator();
218 aParticleIterator->reset();
219 while( (*aParticleIterator)() ){
220 G4ParticleDefinition* particle = aParticleIterator->value();
221 G4String particleName = particle->GetParticleName();
223 if (particleName ==
"gamma") {
226 G4PhotoElectricEffect* pe =
new G4PhotoElectricEffect();
227 G4VEmModel* theLivermorePEModel =
new G4LivermorePhotoElectricModel();
228 pe->SetEmModel(theLivermorePEModel,1);
229 ph->RegisterProcess(pe, particle);
232 G4ComptonScattering* cs =
new G4ComptonScattering;
233 cs->SetEmModel(
new G4KleinNishinaModel(),1);
234 G4VEmModel* theLowEPComptonModel =
new G4LowEPComptonModel();
235 theLowEPComptonModel->SetHighEnergyLimit(20*MeV);
236 cs->AddEmModel(0, theLowEPComptonModel);
237 ph->RegisterProcess(cs, particle);
240 G4GammaConversion* gc =
new G4GammaConversion();
241 G4VEmModel* thePenelopeGCModel =
new G4PenelopeGammaConversionModel();
242 thePenelopeGCModel->SetHighEnergyLimit(1*GeV);
243 gc->SetEmModel(thePenelopeGCModel,1);
244 ph->RegisterProcess(gc, particle);
247 ph->RegisterProcess(
new G4RayleighScattering(), particle);
249 }
else if (particleName ==
"e-") {
252 G4eCoulombScatteringModel* ssm =
new G4eCoulombScatteringModel();
253 G4CoulombScattering* ss =
new G4CoulombScattering();
254 ss->SetEmModel(ssm, 1);
257 G4eIonisation* eIoni =
new G4eIonisation();
258 eIoni->SetStepFunction(0.2, 100*um);
259 G4PenelopeIonisationModel* pen =
new G4PenelopeIonisationModel();
260 pen->SetHighEnergyLimit(penEnergyLimit);
261 eIoni->AddEmModel(0, pen,
new G4UniversalFluctuation());
264 G4eBremsstrahlung* brem =
new G4eBremsstrahlung();
265 G4SeltzerBergerModel* br1 =
new G4SeltzerBergerModel();
266 G4eBremsstrahlungRelModel* br2 =
new G4eBremsstrahlungRelModel();
267 br1->SetAngularDistribution(
new G4Generator2BS());
268 br2->SetAngularDistribution(
new G4Generator2BS());
269 brem->SetEmModel(br1,1);
270 brem->SetEmModel(br2,2);
271 br2->SetLowEnergyLimit(GeV);
274 ph->RegisterProcess(eIoni, particle);
275 ph->RegisterProcess(brem, particle);
276#if G4VERSION_NUMBER > 1029
277 ph->RegisterProcess(ee, particle);
279 ph->RegisterProcess(ss, particle);
281 }
else if (particleName ==
"e+") {
284 G4eCoulombScatteringModel* ssm =
new G4eCoulombScatteringModel();
285 G4CoulombScattering* ss =
new G4CoulombScattering();
286 ss->SetEmModel(ssm, 1);
289 G4eIonisation* eIoni =
new G4eIonisation();
290 eIoni->SetStepFunction(0.2, 100*um);
291 G4PenelopeIonisationModel* pen =
new G4PenelopeIonisationModel();
292 pen->SetHighEnergyLimit(penEnergyLimit);
293 eIoni->AddEmModel(0, pen,
new G4UniversalFluctuation());
296 G4eBremsstrahlung* brem =
new G4eBremsstrahlung();
297 G4SeltzerBergerModel* br1 =
new G4SeltzerBergerModel();
298 G4eBremsstrahlungRelModel* br2 =
new G4eBremsstrahlungRelModel();
299 br1->SetAngularDistribution(
new G4Generator2BS());
300 br2->SetAngularDistribution(
new G4Generator2BS());
301 brem->SetEmModel(br1,1);
302 brem->SetEmModel(br2,2);
303 br2->SetLowEnergyLimit(GeV);
306 ph->RegisterProcess(eIoni, particle);
307 ph->RegisterProcess(brem, particle);
308#if G4VERSION_NUMBER > 1029
309 ph->RegisterProcess(ee, particle);
311 ph->RegisterProcess(
new G4eplusAnnihilation(), particle);
312 ph->RegisterProcess(ss, particle);
314 }
else if (particleName ==
"mu+" ||
315 particleName ==
"mu-" ) {
317 G4MuIonisation* muIoni =
new G4MuIonisation();
318 muIoni->SetStepFunction(0.2, 50*um);
320 ph->RegisterProcess(muIoni, particle);
321 ph->RegisterProcess(mub, particle);
322 ph->RegisterProcess(mup, particle);
323 ph->RegisterProcess(muss, particle);
325 }
else if (particleName ==
"alpha" ||
326 particleName ==
"He3") {
328 G4ionIonisation* ionIoni =
new G4ionIonisation();
329 ionIoni->SetStepFunction(0.1, 10*um);
331 ph->RegisterProcess(
new G4CoulombScattering(), particle);
332 ph->RegisterProcess(ionIoni, particle);
335 }
else if (particleName ==
"GenericIon") {
337 G4ionIonisation* ionIoni =
new G4ionIonisation();
338 ionIoni->SetEmModel(
new G4IonParametrisedLossModel());
339 ionIoni->SetStepFunction(0.1, 1*um);
341 ph->RegisterProcess(
new G4CoulombScattering(), particle);
342 ph->RegisterProcess(ionIoni, particle);
345 }
else if (particleName ==
"pi+" ||
346 particleName ==
"pi-" ) {
349 G4hIonisation* hIoni =
new G4hIonisation();
350 hIoni->SetStepFunction(0.2, 50*um);
352 ph->RegisterProcess(hIoni, particle);
353 ph->RegisterProcess(pib, particle);
354 ph->RegisterProcess(pip, particle);
355 ph->RegisterProcess(piss, particle);
357 }
else if (particleName ==
"kaon+" ||
358 particleName ==
"kaon-" ) {
361 G4hIonisation* hIoni =
new G4hIonisation();
362 hIoni->SetStepFunction(0.2, 50*um);
364 ph->RegisterProcess(hIoni, particle);
365 ph->RegisterProcess(kb, particle);
366 ph->RegisterProcess(kp, particle);
367 ph->RegisterProcess(kss, particle);
369 }
else if (particleName ==
"proton" ||
370 particleName ==
"anti_proton") {
372 G4hIonisation* hIoni =
new G4hIonisation();
373 hIoni->SetStepFunction(0.1, 20*um);
375 ph->RegisterProcess(hIoni, particle);
376 ph->RegisterProcess(pb, particle);
377 ph->RegisterProcess(pp, particle);
378 ph->RegisterProcess(pss, particle);
381 }
else if (particleName ==
"B+" ||
382 particleName ==
"B-" ||
383 particleName ==
"D+" ||
384 particleName ==
"D-" ||
385 particleName ==
"Ds+" ||
386 particleName ==
"Ds-" ||
387 particleName ==
"anti_He3" ||
388 particleName ==
"anti_alpha" ||
389 particleName ==
"anti_deuteron" ||
390 particleName ==
"anti_lambda_c+" ||
391 particleName ==
"anti_omega-" ||
392 particleName ==
"anti_sigma_c+" ||
393 particleName ==
"anti_sigma_c++" ||
394 particleName ==
"anti_sigma+" ||
395 particleName ==
"anti_sigma-" ||
396 particleName ==
"anti_triton" ||
397 particleName ==
"anti_xi_c+" ||
398 particleName ==
"anti_xi-" ||
399 particleName ==
"deuteron" ||
400 particleName ==
"lambda_c+" ||
401 particleName ==
"omega-" ||
402 particleName ==
"sigma_c+" ||
403 particleName ==
"sigma_c++" ||
404 particleName ==
"sigma+" ||
405 particleName ==
"sigma-" ||
406 particleName ==
"tau+" ||
407 particleName ==
"tau-" ||
408 particleName ==
"triton" ||
409 particleName ==
"xi_c+" ||
410 particleName ==
"xi-" ) {
412 ph->RegisterProcess(
new G4CoulombScattering(), particle);
413 ph->RegisterProcess(
new G4hIonisation(), particle);
419 pnuc->SetMaxKinEnergy(MeV);
422 G4VAtomDeexcitation* de =
new G4UAtomicDeexcitation();
423 G4LossTableManager::Instance()->SetAtomDeexcitation(de);
424#if G4VERSION_NUMBER > 1029
425 G4EmModelActivator mact(GetPhysicsName());
427 G4EmModelActivator mact;