GEMC  1.8
Geant4 Monte-Carlo Framework
HadronPhysics.cc
Go to the documentation of this file.
1 #include "HadronPhysics.h"
2 #include "G4MesonConstructor.hh"
3 #include "G4LeptonConstructor.hh"
4 #include "G4BaryonConstructor.hh"
5 #include "G4ShortLivedConstructor.hh"
6 #include "G4IonConstructor.hh"
7 
8 // processes
9 #include "G4ProcessManager.hh"
10 #include "G4HadronElasticProcess.hh"
11 #include "G4PionPlusInelasticProcess.hh"
12 #include "G4PionMinusInelasticProcess.hh"
13 #include "G4KaonPlusInelasticProcess.hh"
14 #include "G4KaonMinusInelasticProcess.hh"
15 #include "G4KaonZeroLInelasticProcess.hh"
16 #include "G4KaonZeroSInelasticProcess.hh"
17 #include "G4ProtonInelasticProcess.hh"
18 #include "G4NeutronInelasticProcess.hh"
19 #include "G4HadronFissionProcess.hh"
20 #include "G4HadronCaptureProcess.hh"
21 #include "G4AntiProtonInelasticProcess.hh"
22 #include "G4AntiNeutronInelasticProcess.hh"
23 #include "G4LambdaInelasticProcess.hh"
24 #include "G4AntiLambdaInelasticProcess.hh"
25 #include "G4SigmaPlusInelasticProcess.hh"
26 #include "G4SigmaMinusInelasticProcess.hh"
27 #include "G4AntiSigmaPlusInelasticProcess.hh"
28 #include "G4AntiSigmaMinusInelasticProcess.hh"
29 #include "G4PionMinusAbsorptionAtRest.hh"
30 #include "G4KaonMinusAbsorption.hh"
31 #include "G4AntiProtonAnnihilationAtRest.hh"
32 #include "G4AntiNeutronAnnihilationAtRest.hh"
33 
34 // Lepton nuclear interations
35 #include "G4PhotoNuclearProcess.hh"
36 #include "G4GammaNuclearReaction.hh"
37 #include "G4ElectroNuclearReaction.hh"
38 #include "G4ElectronNuclearProcess.hh"
39 
40 
41 // cross sections
42 #include "G4PiNuclearCrossSection.hh"
43 #include "G4ProtonInelasticCrossSection.hh"
44 #include "G4NeutronInelasticCrossSection.hh"
45 
46 // models
47 #include "G4LElastic.hh"
48 #include "G4CascadeInterface.hh"
49 #include "G4LEPionPlusInelastic.hh"
50 #include "G4LEPionMinusInelastic.hh"
51 #include "G4LEKaonPlusInelastic.hh"
52 #include "G4LEKaonMinusInelastic.hh"
53 #include "G4LEKaonZeroLInelastic.hh"
54 #include "G4LEKaonZeroSInelastic.hh"
55 #include "G4LEProtonInelastic.hh"
56 #include "G4LENeutronInelastic.hh"
57 #include "G4LFission.hh"
58 #include "G4LCapture.hh"
59 #include "G4LEAntiProtonInelastic.hh"
60 #include "G4LEAntiNeutronInelastic.hh"
61 #include "G4LELambdaInelastic.hh"
62 #include "G4LEAntiLambdaInelastic.hh"
63 #include "G4LESigmaPlusInelastic.hh"
64 #include "G4LESigmaMinusInelastic.hh"
65 #include "G4LEAntiSigmaPlusInelastic.hh"
66 #include "G4LEAntiSigmaMinusInelastic.hh"
67 
68 
70 {
71  gemcOpt = Opt;
72 }
74 
76 {
77  // Construct all mesons
78  G4MesonConstructor pMesonConstructor;
79  pMesonConstructor.ConstructParticle();
80 
81  // Construct all leptons
82  G4LeptonConstructor pLeptonConstructor;
83  pLeptonConstructor.ConstructParticle();
84 
85  // Construct all baryons
86  G4BaryonConstructor pBaryonConstructor;
87  pBaryonConstructor.ConstructParticle();
88 
89  // Construct resonaces and quarks
90  G4ShortLivedConstructor pShortLivedConstructor;
91  pShortLivedConstructor.ConstructParticle();
92 
93  // Construct light ions (d, t, 3He, alpha, and generic ion)
94  G4IonConstructor ionConstruct;
95  ionConstruct.ConstructParticle();
96 }
97 
98 
100 {
101  string hd_msg = gemcOpt.args["LOG_MSG"].args + " Hadron Physics List: <<< ";
102  double PHY_VERBOSITY = gemcOpt.args["PHY_VERBOSITY"].arg ;
103  cout << hd_msg << " Building Hadron Physics Processes " << endl;
104 
105  // Hadronic Elastic Process and Model (the same for all hadrons)
106  G4HadronElasticProcess* elasticProcess = new G4HadronElasticProcess();
107  G4LElastic* elasticModel = new G4LElastic();
108  elasticProcess->RegisterMe(elasticModel);
109 
110  // %%%%%%%%%%%%%%%%%%%%%%%%%
111  // Hadronic inelastic models
112  // %%%%%%%%%%%%%%%%%%%%%%%%%
113 
114  // Bertini cascade model: use for p,n,pi+,pi- between 0 and 9.9 GeV
115  G4CascadeInterface* bertiniModel = new G4CascadeInterface();
116  bertiniModel->SetMaxEnergy(9.9*GeV);
117 
118  // Low energy parameterized models : use between 9.5 and 25 GeV
119  G4double LEPUpperLimit = 25*GeV;
120  G4double LEPpnpiLimit = 9.5*GeV;
121 
122  G4LEKaonZeroLInelastic* LEPk0LModel = new G4LEKaonZeroLInelastic();
123  LEPk0LModel->SetMaxEnergy(LEPUpperLimit);
124 
125  G4LEKaonZeroSInelastic* LEPk0SModel = new G4LEKaonZeroSInelastic();
126  LEPk0SModel->SetMaxEnergy(LEPUpperLimit);
127 
128 
129  G4ProcessManager * pmanager = 0;
130 
131 
132  // Add Hadron Elastic Processes to all hadrons
133  theParticleIterator->reset();
134  while( (*theParticleIterator)() )
135  {
136  G4ParticleDefinition* particle = theParticleIterator->value();
137  pmanager = particle->GetProcessManager();
138  string pname = particle->GetParticleName();
139  if (elasticProcess->IsApplicable(*particle))
140  {
141  if(PHY_VERBOSITY > 2) cout << hd_msg << " Adding Hadron Elastic Process for " << pname << endl;
142  pmanager->AddDiscreteProcess(elasticProcess);
143  }
144  }
145 
146 
147  // Adding inelastic nuclear scattering to leptons
148  G4PhotoNuclearProcess* thePhotoNuclearProcess = new G4PhotoNuclearProcess;
149  G4GammaNuclearReaction* theGammaReaction = new G4GammaNuclearReaction;
150  theGammaReaction->SetMaxEnergy(20*GeV);
151  thePhotoNuclearProcess->RegisterMe(theGammaReaction);
152 
153  G4ElectronNuclearProcess* theElectronNuclearProcess = new G4ElectronNuclearProcess;
154  G4ElectroNuclearReaction* theElectroReaction = new G4ElectroNuclearReaction;
155  theElectroReaction->SetMaxEnergy(20*GeV);
156  theElectronNuclearProcess->RegisterMe(theElectroReaction);
157 
158  theParticleIterator->reset();
159  while( (*theParticleIterator)() )
160  {
161  G4ParticleDefinition* particle = theParticleIterator->value();
162  pmanager = particle->GetProcessManager();
163  string pname = particle->GetParticleName();
164  if (pname == "gamma")
165  {
166  if(PHY_VERBOSITY > 2) cout << hd_msg << " Gamma: inelastic nuclear scattering" << endl;
167  pmanager->AddDiscreteProcess(thePhotoNuclearProcess);
168  }
169  else if (pname == "e-")
170  {
171  if(PHY_VERBOSITY > 2) cout << hd_msg << " Electron: inelastic nuclear scattering" << endl;
172  pmanager->AddDiscreteProcess(thePhotoNuclearProcess);
173 
174  }
175  else if (pname == "e+")
176  {
177  if(PHY_VERBOSITY > 2) cout << hd_msg << " Positron: inelastic nuclear scattering" << endl;
178  pmanager->AddDiscreteProcess(thePhotoNuclearProcess);
179 
180  }
181 
182  }
183 
184 
185 
186 
187 
188 
189 
191  // pi+ physics //
193  pmanager = G4PionPlus::PionPlus()->GetProcessManager();
194 
195  G4PionPlusInelasticProcess* pipinelProc = new G4PionPlusInelasticProcess();
196  G4PiNuclearCrossSection* pion_XC = new G4PiNuclearCrossSection();
197  pipinelProc->AddDataSet(pion_XC);
198  pipinelProc->RegisterMe(bertiniModel);
199 
200  G4LEPionPlusInelastic* LEPpipModel = new G4LEPionPlusInelastic();
201  LEPpipModel->SetMinEnergy(LEPpnpiLimit);
202  LEPpipModel->SetMaxEnergy(LEPUpperLimit);
203  pipinelProc->RegisterMe(LEPpipModel);
204 
205  pmanager->AddDiscreteProcess(pipinelProc);
206 
208  // pi- physics //
210  pmanager = G4PionMinus::PionMinus()->GetProcessManager();
211 
212  G4PionMinusInelasticProcess* piminelProc = new G4PionMinusInelasticProcess();
213  piminelProc->AddDataSet(pion_XC);
214  piminelProc->RegisterMe(bertiniModel);
215 
216  G4LEPionMinusInelastic* LEPpimModel = new G4LEPionMinusInelastic();
217  LEPpimModel->SetMinEnergy(LEPpnpiLimit);
218  LEPpimModel->SetMaxEnergy(LEPUpperLimit);
219  piminelProc->RegisterMe(LEPpimModel);
220 
221  pmanager->AddDiscreteProcess(piminelProc);
222 
223  // pi- absorption at rest
224  G4PionMinusAbsorptionAtRest* pimAbsorb = new G4PionMinusAbsorptionAtRest();
225  pmanager->AddRestProcess(pimAbsorb);
226 
228  // K+ physics //
230  pmanager = G4KaonPlus::KaonPlus()->GetProcessManager();
231 
232  G4KaonPlusInelasticProcess* kpinelProc = new G4KaonPlusInelasticProcess();
233  G4LEKaonPlusInelastic* LEPkpModel = new G4LEKaonPlusInelastic();
234  LEPkpModel->SetMaxEnergy(LEPUpperLimit);
235  kpinelProc->RegisterMe(LEPkpModel);
236  pmanager->AddDiscreteProcess(kpinelProc);
237 
239  // K- physics //
241  pmanager = G4KaonMinus::KaonMinus()->GetProcessManager();
242 
243  G4KaonMinusInelasticProcess* kminelProc = new G4KaonMinusInelasticProcess();
244  G4LEKaonMinusInelastic* LEPkmModel = new G4LEKaonMinusInelastic();
245  LEPkmModel->SetMaxEnergy(LEPUpperLimit);
246  kminelProc->RegisterMe(LEPkmModel);
247  pmanager->AddDiscreteProcess(kminelProc);
248 
249  // K- absorption at rest
250  G4KaonMinusAbsorption* kmAbsorb = new G4KaonMinusAbsorption();
251  pmanager->AddRestProcess(kmAbsorb);
252 
254  // K0L physics //
256  pmanager = G4KaonZeroLong::KaonZeroLong()->GetProcessManager();
257 
258  G4KaonZeroLInelasticProcess* k0LinelProc = new G4KaonZeroLInelasticProcess();
259  k0LinelProc->RegisterMe(LEPk0LModel);
260  pmanager->AddDiscreteProcess(k0LinelProc);
261 
263  // K0S physics //
265  pmanager = G4KaonZeroShort::KaonZeroShort()->GetProcessManager();
266 
267  G4KaonZeroSInelasticProcess* k0SinelProc = new G4KaonZeroSInelasticProcess();
268  k0SinelProc->RegisterMe(LEPk0SModel);
269  pmanager->AddDiscreteProcess(k0SinelProc);
270 
272  // Proton //
274  pmanager = G4Proton::Proton()->GetProcessManager();
275 
276  G4ProtonInelasticProcess* pinelProc = new G4ProtonInelasticProcess();
277  G4ProtonInelasticCrossSection* proton_XC = new G4ProtonInelasticCrossSection();
278  pinelProc->AddDataSet(proton_XC);
279  pinelProc->RegisterMe(bertiniModel);
280 
281  G4LEProtonInelastic* LEPpModel = new G4LEProtonInelastic();
282  LEPpModel->SetMinEnergy(LEPpnpiLimit);
283  LEPpModel->SetMaxEnergy(LEPUpperLimit);
284  pinelProc->RegisterMe(LEPpModel);
285 
286  pmanager->AddDiscreteProcess(pinelProc);
287 
289  // Anti-Proton //
291  pmanager = G4AntiProton::AntiProton()->GetProcessManager();
292 
293  G4AntiProtonInelasticProcess* apinelProc = new G4AntiProtonInelasticProcess();
294  G4LEAntiProtonInelastic* LEPapModel = new G4LEAntiProtonInelastic();
295  apinelProc->RegisterMe(LEPapModel);
296  pmanager->AddDiscreteProcess(apinelProc);
297 
298  // anti-proton annihilation at rest
299  G4AntiProtonAnnihilationAtRest* apAnnihil = new G4AntiProtonAnnihilationAtRest();
300  pmanager->AddRestProcess(apAnnihil);
301 
303  // Neutron //
305  pmanager = G4Neutron::Neutron()->GetProcessManager();
306 
307  // hadron elastic
308  pmanager->AddDiscreteProcess(elasticProcess);
309 
310  // hadron inelastic
311  G4NeutronInelasticProcess* ninelProc = new G4NeutronInelasticProcess();
312  G4NeutronInelasticCrossSection* neutron_XC =
313  new G4NeutronInelasticCrossSection();
314  ninelProc->AddDataSet(neutron_XC);
315  ninelProc->RegisterMe(bertiniModel);
316 
317  G4LENeutronInelastic* LEPnModel = new G4LENeutronInelastic();
318  LEPnModel->SetMinEnergy(LEPpnpiLimit);
319  LEPnModel->SetMaxEnergy(LEPUpperLimit);
320  ninelProc->RegisterMe(LEPnModel);
321 
322  pmanager->AddDiscreteProcess(ninelProc);
323 
324  // neutron-induced fission
325  G4HadronFissionProcess* neutronFission = new G4HadronFissionProcess();
326  G4LFission* neutronFissionModel = new G4LFission();
327  neutronFissionModel->SetMinEnergy(0.);
328  neutronFissionModel->SetMaxEnergy(20*TeV);
329  neutronFission->RegisterMe(neutronFissionModel);
330  pmanager->AddDiscreteProcess(neutronFission);
331 
332  // neutron capture
333  G4HadronCaptureProcess* neutronCapture = new G4HadronCaptureProcess();
334  G4LCapture* neutronCaptureModel = new G4LCapture();
335  neutronCaptureModel->SetMinEnergy(0.);
336  neutronCaptureModel->SetMaxEnergy(20*TeV);
337  neutronCapture->RegisterMe(neutronCaptureModel);
338  pmanager->AddDiscreteProcess(neutronCapture);
339 
341  // Anti-Neutron //
343  pmanager = G4AntiNeutron::AntiNeutron()->GetProcessManager();
344 
345  G4AntiNeutronInelasticProcess* aninelProc = new G4AntiNeutronInelasticProcess();
346  G4LEAntiNeutronInelastic* LEPanModel = new G4LEAntiNeutronInelastic();
347  aninelProc->RegisterMe(LEPanModel);
348  pmanager->AddDiscreteProcess(aninelProc);
349 
350  // anti-neutron annihilation at rest
351  G4AntiNeutronAnnihilationAtRest* anAnnihil = new G4AntiNeutronAnnihilationAtRest();
352  pmanager->AddRestProcess(anAnnihil);
353 
355  // Lambda //
357  pmanager = G4Lambda::Lambda()->GetProcessManager();
358 
359  G4LambdaInelasticProcess* linelProc = new G4LambdaInelasticProcess();
360  G4LELambdaInelastic* LEPlModel = new G4LELambdaInelastic();
361  linelProc->RegisterMe(LEPlModel);
362  pmanager->AddDiscreteProcess(linelProc);
363 
365  // Anti-Lambda //
367  pmanager = G4AntiLambda::AntiLambda()->GetProcessManager();
368 
369  G4AntiLambdaInelasticProcess* alinelProc = new G4AntiLambdaInelasticProcess();
370  G4LEAntiLambdaInelastic* LEPalModel = new G4LEAntiLambdaInelastic();
371  alinelProc->RegisterMe(LEPalModel);
372  pmanager->AddDiscreteProcess(alinelProc);
373 
375  // Sigma- //
377  pmanager = G4SigmaMinus::SigmaMinus()->GetProcessManager();
378 
379  G4SigmaMinusInelasticProcess* sminelProc = new G4SigmaMinusInelasticProcess();
380  G4LESigmaMinusInelastic* LEPsmModel = new G4LESigmaMinusInelastic();
381  sminelProc->RegisterMe(LEPsmModel);
382  pmanager->AddDiscreteProcess(sminelProc);
383 
385  // Anti-Sigma- //
387  pmanager = G4AntiSigmaMinus::AntiSigmaMinus()->GetProcessManager();
388 
389  G4AntiSigmaMinusInelasticProcess* asminelProc = new G4AntiSigmaMinusInelasticProcess();
390  G4LEAntiSigmaMinusInelastic* LEPasmModel = new G4LEAntiSigmaMinusInelastic();
391  asminelProc->RegisterMe(LEPasmModel);
392  pmanager->AddDiscreteProcess(asminelProc);
393 
395  // Sigma+ //
397  pmanager = G4SigmaPlus::SigmaPlus()->GetProcessManager();
398 
399 
400  G4SigmaPlusInelasticProcess* spinelProc = new G4SigmaPlusInelasticProcess();
401  G4LESigmaPlusInelastic* LEPspModel = new G4LESigmaPlusInelastic();
402  spinelProc->RegisterMe(LEPspModel);
403  pmanager->AddDiscreteProcess(spinelProc);
404 
406  // Anti-Sigma+ //
408  pmanager = G4AntiSigmaPlus::AntiSigmaPlus()->GetProcessManager();
409 
410  G4AntiSigmaPlusInelasticProcess* aspinelProc = new G4AntiSigmaPlusInelasticProcess();
411  G4LEAntiSigmaPlusInelastic* LEPaspModel = new G4LEAntiSigmaPlusInelastic();
412  aspinelProc->RegisterMe(LEPaspModel);
413  pmanager->AddDiscreteProcess(aspinelProc);
414 
415 
416 }
gemc_opts gemcOpt
Definition: HadronPhysics.h:21
HadronPhysics(gemc_opts)
virtual void ConstructParticle()
map< string, opts > args
Options map.
Definition: usage.h:68
virtual void ConstructProcess()
virtual ~HadronPhysics()