LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
G4EmStandardPhysics_pseudoLaser.cc
Go to the documentation of this file.
2 
3 #include "Geant4/G4SystemOfUnits.hh"
4 #include "Geant4/G4ParticleDefinition.hh"
5 #include "Geant4/G4EmParameters.hh"
6 #include "Geant4/G4LossTableManager.hh"
7 
8 #include "Geant4/G4ComptonScattering.hh"
9 #include "Geant4/G4GammaConversion.hh"
10 #include "Geant4/G4PhotoElectricEffect.hh"
11 #include "Geant4/G4RayleighScattering.hh"
12 #include "Geant4/G4LivermorePhotoElectricModel.hh"
13 
14 #include "Geant4/G4eMultipleScattering.hh"
15 #include "Geant4/G4MuMultipleScattering.hh"
16 #include "Geant4/G4hMultipleScattering.hh"
17 #include "Geant4/G4CoulombScattering.hh"
18 #include "Geant4/G4eCoulombScatteringModel.hh"
19 #include "Geant4/G4WentzelVIModel.hh"
20 #include "Geant4/G4UrbanMscModel.hh"
21 
22 #include "Geant4/G4MuBremsstrahlungModel.hh"
23 #include "Geant4/G4MuPairProductionModel.hh"
24 #include "Geant4/G4hBremsstrahlungModel.hh"
25 #include "Geant4/G4hPairProductionModel.hh"
26 
27 #include "Geant4/G4eIonisation.hh"
28 #include "Geant4/G4eBremsstrahlung.hh"
29 #include "Geant4/G4eplusAnnihilation.hh"
30 #include "Geant4/G4UAtomicDeexcitation.hh"
31 
32 #include "Geant4/G4MuIonisation.hh" // -- mu- only
33 #include "MyG4MuIonisationNoDelta.hh" // -- mu+ only
34 #include "Geant4/G4MuBremsstrahlung.hh"
35 #include "Geant4/G4MuPairProduction.hh"
36 #include "Geant4/G4hBremsstrahlung.hh"
37 #include "Geant4/G4hPairProduction.hh"
38 
39 #include "Geant4/G4hIonisation.hh"
40 #include "Geant4/G4ionIonisation.hh"
41 #include "Geant4/G4alphaIonisation.hh"
42 
43 #include "Geant4/G4ParticleTable.hh"
44 #include "Geant4/G4Gamma.hh"
45 #include "Geant4/G4Electron.hh"
46 #include "Geant4/G4Positron.hh"
47 #include "Geant4/G4MuonPlus.hh"
48 #include "Geant4/G4MuonMinus.hh"
50 #include "Geant4/G4PionPlus.hh"
51 #include "Geant4/G4PionMinus.hh"
52 #include "Geant4/G4KaonPlus.hh"
53 #include "Geant4/G4KaonMinus.hh"
54 #include "Geant4/G4Proton.hh"
55 #include "Geant4/G4AntiProton.hh"
56 #include "Geant4/G4Deuteron.hh"
57 #include "Geant4/G4Triton.hh"
58 #include "Geant4/G4He3.hh"
59 #include "Geant4/G4Alpha.hh"
60 #include "Geant4/G4GenericIon.hh"
61 
62 #include "Geant4/G4PhysicsListHelper.hh"
63 #include "Geant4/G4BuilderType.hh"
64 #include "Geant4/G4EmModelActivator.hh"
65 #include "Geant4/G4GammaGeneralProcess.hh"
66 
67 // factoryGeant4/
68 #include "Geant4/G4PhysicsConstructorFactory.hh"
69 //
71 
72 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
73 
75  : G4VPhysicsConstructor("G4EmStandard_pseudoLaser"), verbose(ver)
76 {
77  G4EmParameters* param = G4EmParameters::Instance();
78  param->SetDefaults();
79  param->SetVerbose(verbose);
80  SetPhysicsType(bElectromagnetic);
81  G4cout << "############# mu+ will be used to simulate the ionization laser!!!!! ##############\n";
82 }
83 
84 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
85 
87 {}
88 
89 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
90 
92 {
93  // gamma
94  G4Gamma::Gamma();
95 
96  // leptons
97  G4Electron::Electron();
98  G4Positron::Positron();
99  G4MuonPlus::MuonPlus();
100  G4MuonMinus::MuonMinus();
102 
103  // mesons
104  G4PionPlus::PionPlusDefinition();
105  G4PionMinus::PionMinusDefinition();
106  G4KaonPlus::KaonPlusDefinition();
107  G4KaonMinus::KaonMinusDefinition();
108 
109  // barions
110  G4Proton::Proton();
111  G4AntiProton::AntiProton();
112 
113  // ions
114  G4Deuteron::Deuteron();
115  G4Triton::Triton();
116  G4He3::He3();
117  G4Alpha::Alpha();
118  G4GenericIon::GenericIonDefinition();
119 }
120 
121 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
122 
124 {
125  if(verbose > 1) {
126  G4cout << "### " << GetPhysicsName() << " Construct Processes " << G4endl;
127  }
128  G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
129  G4LossTableManager* man = G4LossTableManager::Instance();
130 
131  // muon & hadron bremsstrahlung and pair production
132  G4MuBremsstrahlung* mub = new G4MuBremsstrahlung();
133  G4MuPairProduction* mup = new G4MuPairProduction();
134  G4hBremsstrahlung* pib = new G4hBremsstrahlung();
135  G4hPairProduction* pip = new G4hPairProduction();
136  G4hBremsstrahlung* kb = new G4hBremsstrahlung();
137  G4hPairProduction* kp = new G4hPairProduction();
138  G4hBremsstrahlung* pb = new G4hBremsstrahlung();
139  G4hPairProduction* pp = new G4hPairProduction();
140 
141  // muon & hadron multiple scattering
142  G4MuMultipleScattering* mumsc = new G4MuMultipleScattering();
143  mumsc->SetEmModel(new G4WentzelVIModel());
144  G4CoulombScattering* muss = new G4CoulombScattering();
145 
146  G4hMultipleScattering* pimsc = new G4hMultipleScattering();
147  pimsc->SetEmModel(new G4WentzelVIModel());
148  G4CoulombScattering* piss = new G4CoulombScattering();
149 
150  G4hMultipleScattering* kmsc = new G4hMultipleScattering();
151  kmsc->SetEmModel(new G4WentzelVIModel());
152  G4CoulombScattering* kss = new G4CoulombScattering();
153 
154  G4hMultipleScattering* hmsc = new G4hMultipleScattering("ionmsc");
155 
156  // high energy limit for e+- scattering models
157  G4double highEnergyLimit = G4EmParameters::Instance()->MscEnergyLimit();
158 
159  // Add standard EM Processes
160  G4ParticleTable* table = G4ParticleTable::GetParticleTable();
161  for(const auto& particleName : partList.PartNames()) {
162  G4ParticleDefinition* particle = table->FindParticle(particleName);
163  if (!particle) { continue; }
164  if (particleName == "gamma") {
165 
166  G4PhotoElectricEffect* pee = new G4PhotoElectricEffect();
167  pee->SetEmModel(new G4LivermorePhotoElectricModel());
168 
169  if(G4EmParameters::Instance()->GeneralProcessActive()) {
170  G4GammaGeneralProcess* sp = new G4GammaGeneralProcess();
171  sp->AddEmProcess(pee);
172  sp->AddEmProcess(new G4ComptonScattering());
173  sp->AddEmProcess(new G4GammaConversion());
174  sp->AddEmProcess(new G4RayleighScattering());
175  man->SetGammaGeneralProcess(sp);
176  ph->RegisterProcess(sp, particle);
177 
178  } else {
179  ph->RegisterProcess(pee, particle);
180  ph->RegisterProcess(new G4ComptonScattering(), particle);
181  ph->RegisterProcess(new G4GammaConversion(), particle);
182  ph->RegisterProcess(new G4RayleighScattering(), particle);
183  }
184 
185  } else if (particleName == "e-") {
186 
187  G4eMultipleScattering* msc = new G4eMultipleScattering;
188  G4UrbanMscModel* msc1 = new G4UrbanMscModel();
189  G4WentzelVIModel* msc2 = new G4WentzelVIModel();
190  msc1->SetHighEnergyLimit(highEnergyLimit);
191  msc2->SetLowEnergyLimit(highEnergyLimit);
192  msc->SetEmModel(msc1);
193  msc->SetEmModel(msc2);
194 
195  G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel();
196  G4CoulombScattering* ss = new G4CoulombScattering();
197  ss->SetEmModel(ssm);
198  ss->SetMinKinEnergy(highEnergyLimit);
199  ssm->SetLowEnergyLimit(highEnergyLimit);
200  ssm->SetActivationLowEnergyLimit(highEnergyLimit);
201 
202  ph->RegisterProcess(msc, particle);
203  ph->RegisterProcess(new G4eIonisation(), particle);
204  ph->RegisterProcess(new G4eBremsstrahlung(), particle);
205  ph->RegisterProcess(ss, particle);
206 
207  } else if (particleName == "e+") {
208 
209  G4eMultipleScattering* msc = new G4eMultipleScattering;
210  G4UrbanMscModel* msc1 = new G4UrbanMscModel();
211  G4WentzelVIModel* msc2 = new G4WentzelVIModel();
212  msc1->SetHighEnergyLimit(highEnergyLimit);
213  msc2->SetLowEnergyLimit(highEnergyLimit);
214  msc->SetEmModel(msc1);
215  msc->SetEmModel(msc2);
216 
217  G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel();
218  G4CoulombScattering* ss = new G4CoulombScattering();
219  ss->SetEmModel(ssm);
220  ss->SetMinKinEnergy(highEnergyLimit);
221  ssm->SetLowEnergyLimit(highEnergyLimit);
222  ssm->SetActivationLowEnergyLimit(highEnergyLimit);
223 
224  ph->RegisterProcess(msc, particle);
225  ph->RegisterProcess(new G4eIonisation(), particle);
226  ph->RegisterProcess(new G4eBremsstrahlung(), particle);
227  ph->RegisterProcess(new G4eplusAnnihilation(), particle);
228  ph->RegisterProcess(ss, particle);
229 
230  } else if (particleName == "mu-" ) {
231 
232  ph->RegisterProcess(mumsc, particle);
233  ph->RegisterProcess(new G4MuIonisation(), particle);
234  ph->RegisterProcess(mub, particle);
235  ph->RegisterProcess(mup, particle);
236  ph->RegisterProcess(muss, particle);
237 
238  // -- distinguish the muplus for substitue of a laser
239  } else if (particleName == "mu+") {
240 
241  // -- mu+ will ionize ONLY
242  G4cout << "##### Turning off Multiple scattering, Coulomb Scattering, Pair Prodution, and Bremstrahlung for mu+!!!\n";
243  ph->RegisterProcess(new G4MuIonisation(), particle); // -- ionization
244  //ph->RegisterProcess(new MyG4MuIonisationNoDelta(), particle); // -- ionization
245  // -- turn off Multiple scattering, bremstrahlung, pair production, and Coulomb scattering
246  ph->RegisterProcess(mumsc, particle); // -- multiple scattering
247  ph->RegisterProcess(mub, particle); // -- bremmstrahlung
248  ph->RegisterProcess(mup, particle); // -- pair production
249  ph->RegisterProcess(muss, particle); // -- Coulomb scattering
250 
251  } else if (particleName == "alpha" ||
252  particleName == "He3") {
253 
254  ph->RegisterProcess(new G4hMultipleScattering(), particle);
255  ph->RegisterProcess(new G4ionIonisation(), particle);
256 
257  } else if (particleName == "GenericIon") {
258 
259  ph->RegisterProcess(hmsc, particle);
260  ph->RegisterProcess(new G4ionIonisation(), particle);
261 
262  } else if (particleName == "pi+" ||
263  particleName == "pi-" ) {
264 
265  ph->RegisterProcess(pimsc, particle);
266  ph->RegisterProcess(new G4hIonisation(), particle);
267  ph->RegisterProcess(pib, particle);
268  ph->RegisterProcess(pip, particle);
269  ph->RegisterProcess(piss, particle);
270 
271  } else if (particleName == "kaon+" ||
272  particleName == "kaon-" ) {
273 
274  ph->RegisterProcess(kmsc, particle);
275  ph->RegisterProcess(new G4hIonisation(), particle);
276  ph->RegisterProcess(kb, particle);
277  ph->RegisterProcess(kp, particle);
278  ph->RegisterProcess(kss, particle);
279 
280  } else if (particleName == "proton" ||
281  particleName == "anti_proton") {
282 
283  G4hMultipleScattering* pmsc = new G4hMultipleScattering();
284  pmsc->SetEmModel(new G4WentzelVIModel());
285 
286  ph->RegisterProcess(pmsc, particle);
287  ph->RegisterProcess(new G4hIonisation(), particle);
288  ph->RegisterProcess(pb, particle);
289  ph->RegisterProcess(pp, particle);
290  ph->RegisterProcess(new G4CoulombScattering(), particle);
291 
292  } else if (particleName == "B+" ||
293  particleName == "B-" ||
294  particleName == "D+" ||
295  particleName == "D-" ||
296  particleName == "Ds+" ||
297  particleName == "Ds-" ||
298  particleName == "anti_He3" ||
299  particleName == "anti_alpha" ||
300  particleName == "anti_deuteron" ||
301  particleName == "anti_lambda_c+" ||
302  particleName == "anti_omega-" ||
303  particleName == "anti_sigma_c+" ||
304  particleName == "anti_sigma_c++" ||
305  particleName == "anti_sigma+" ||
306  particleName == "anti_sigma-" ||
307  particleName == "anti_triton" ||
308  particleName == "anti_xi_c+" ||
309  particleName == "anti_xi-" ||
310  particleName == "deuteron" ||
311  particleName == "lambda_c+" ||
312  particleName == "omega-" ||
313  particleName == "sigma_c+" ||
314  particleName == "sigma_c++" ||
315  particleName == "sigma+" ||
316  particleName == "sigma-" ||
317  particleName == "tau+" ||
318  particleName == "tau-" ||
319  particleName == "triton" ||
320  particleName == "xi_c+" ||
321  particleName == "xi-" ) {
322 
323  ph->RegisterProcess(hmsc, particle);
324  ph->RegisterProcess(new G4hIonisation(), particle);
325  }
326  }
327 
328  //Find the mulaser particle by hand
329  G4ParticleDefinition* particle = table->FindParticle("mulaser");
330  ph->RegisterProcess(new MyG4MuIonisationNoDelta(), particle); // -- ionization
331 
332  // Deexcitation
333  //
334  man->SetAtomDeexcitation(new G4UAtomicDeexcitation());
335 
336  G4EmModelActivator mact(GetPhysicsName());
337 }
338 
339 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
static G4PseudoLaser * PseudoLaser()
G4_DECLARE_PHYSCONSTR_FACTORY(G4EmStandardPhysics_pseudoLaser)
G4EmStandardPhysics_pseudoLaser(G4int ver=1, const G4String &name="")