Belle II Software  release-08-01-10
IonPhysics.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <simulation/physicslist/IonPhysics.h>
10 
11 #include "G4ProcessManager.hh"
12 #include "G4HadronElasticProcess.hh"
13 #include "G4HadronInelasticProcess.hh"
14 
15 #include "G4TheoFSGenerator.hh"
16 #include "G4FTFModel.hh"
17 #include "G4ExcitedStringDecay.hh"
18 #include "G4LundStringFragmentation.hh"
19 #include "G4GeneratorPrecompoundInterface.hh"
20 #include "G4QMDReaction.hh"
21 #include "G4HadronicInteractionRegistry.hh"
22 #include "G4PreCompoundModel.hh"
23 #include "G4BinaryLightIonReaction.hh"
24 #include "G4NuclNuclDiffuseElastic.hh"
25 
26 #include "G4CrossSectionElastic.hh"
27 #include "G4CrossSectionInelastic.hh"
28 #include "G4ComponentGGNuclNuclXsc.hh"
29 #include "G4SystemOfUnits.hh"
30 
31 using namespace Belle2;
32 using namespace Simulation;
33 
34 
35 IonPhysics::IonPhysics()
36  : m_ftfp(nullptr), m_stringModel(nullptr), m_stringDecay(nullptr),
37  m_fragModel(nullptr), m_preCompoundModel(nullptr)
38 {}
39 
40 
41 IonPhysics::~IonPhysics()
42 {
43  delete m_stringDecay;
44  delete m_stringModel;
45  delete m_fragModel;
46  delete m_preCompoundModel;
47 
48  delete m_theGGNuclNuclXS;
49  delete m_ionGGXS;
50 }
51 
52 
53 void IonPhysics::ConstructParticle()
54 {}
55 
56 
57 void IonPhysics::ConstructProcess()
58 {
59  G4ProcessManager* procMan = 0;
60 
61  // Elastic model for generic ions (z > 2)
62  G4NuclNuclDiffuseElastic* ionElastic = new G4NuclNuclDiffuseElastic;
63  ionElastic->SetMinEnergy(0.0);
64 
65  // FTFP ==>> eventually replace this with new class FTFPInterface
66  m_ftfp = new G4TheoFSGenerator("FTFP");
67  m_stringModel = new G4FTFModel;
68  m_stringDecay =
69  new G4ExcitedStringDecay(m_fragModel = new G4LundStringFragmentation);
70  m_stringModel->SetFragmentationModel(m_stringDecay);
71  m_preCompoundModel = new G4GeneratorPrecompoundInterface();
72 
73  m_ftfp->SetHighEnergyGenerator(m_stringModel);
74  m_ftfp->SetTransport(m_preCompoundModel);
75  m_ftfp->SetMinEnergy(10.01 * GeV);
76  m_ftfp->SetMaxEnergy(1.0 * TeV);
77 
78  // QMD model
79  G4QMDReaction* qmd = new G4QMDReaction;
80  qmd->SetMinEnergy(100.0 * MeV);
81  qmd->SetMaxEnergy(10.0 * GeV);
82 
83  // BIC ion model
84  G4HadronicInteraction* p =
85  G4HadronicInteractionRegistry::Instance()->FindModel("PRECO");
86  G4PreCompoundModel* thePreCompound = static_cast<G4PreCompoundModel*>(p);
87  if (!thePreCompound) { thePreCompound = new G4PreCompoundModel; }
88 
89  G4BinaryLightIonReaction* ionBC = new G4BinaryLightIonReaction(thePreCompound);
90  ionBC->SetMinEnergy(0.0 * MeV);
91  ionBC->SetMaxEnergy(110.0 * MeV);
92 
93  // Elastic cross section set
94  m_ionGGXS = new G4ComponentGGNuclNuclXsc;
95  G4VCrossSectionDataSet* ionElasticXS = new G4CrossSectionElastic(m_ionGGXS);
96  ionElasticXS->SetMinKinEnergy(0.0);
97 
98  // Inelastic cross section set
99  m_theGGNuclNuclXS = new G4ComponentGGNuclNuclXsc();
100  G4VCrossSectionDataSet* nuclNuclXS =
101  new G4CrossSectionInelastic(m_theGGNuclNuclXS);
102 
104  // Deuteron //
106 
107  procMan = G4Deuteron::Deuteron()->GetProcessManager();
108 
109  // elastic
110  // no model available
111 
112  // inelastic
113  G4HadronInelasticProcess* deutProcInel =
114  new G4HadronInelasticProcess("DeuteronInelProcess", G4Deuteron::Deuteron());
115  deutProcInel->RegisterMe(ionBC);
116  deutProcInel->RegisterMe(qmd);
117  deutProcInel->RegisterMe(m_ftfp);
118  deutProcInel->AddDataSet(nuclNuclXS);
119  procMan->AddDiscreteProcess(deutProcInel);
120 
122  // Triton //
124 
125  procMan = G4Triton::Triton()->GetProcessManager();
126 
127  // elastic
128  // no model available
129 
130  // inelastic
131  G4HadronInelasticProcess* tritProcInel =
132  new G4HadronInelasticProcess("TritonInelProcess", G4Triton::Triton());
133  tritProcInel->RegisterMe(ionBC);
134  tritProcInel->RegisterMe(qmd);
135  tritProcInel->RegisterMe(m_ftfp);
136  tritProcInel->AddDataSet(nuclNuclXS);
137  procMan->AddDiscreteProcess(tritProcInel);
138 
140  // He3 //
142 
143  procMan = G4He3::He3()->GetProcessManager();
144 
145  // elastic
146  // no model available
147 
148  // inelastic
149  G4HadronInelasticProcess* he3ProcInel =
150  new G4HadronInelasticProcess("He3InelProcess", G4He3::He3());
151  he3ProcInel->RegisterMe(ionBC);
152  he3ProcInel->RegisterMe(qmd);
153  he3ProcInel->RegisterMe(m_ftfp);
154  he3ProcInel->AddDataSet(nuclNuclXS);
155  procMan->AddDiscreteProcess(he3ProcInel);
156 
158  // Alpha //
160 
161  procMan = G4Alpha::Alpha()->GetProcessManager();
162 
163  // elastic
164  // no model available
165 
166  // inelastic
167  G4HadronInelasticProcess* alphProcInel =
168  new G4HadronInelasticProcess("AlphaInelProcess", G4Alpha::Alpha());
169  alphProcInel->RegisterMe(ionBC);
170  alphProcInel->RegisterMe(qmd);
171  alphProcInel->RegisterMe(m_ftfp);
172  alphProcInel->AddDataSet(nuclNuclXS);
173  procMan->AddDiscreteProcess(alphProcInel);
174 
176  // Generic ion //
178 
179  procMan = G4GenericIon::GenericIon()->GetProcessManager();
180 
181  // elastic
182  G4HadronElasticProcess* ionProcEl = new G4HadronElasticProcess;
183  ionProcEl->RegisterMe(ionElastic);
184  ionProcEl->AddDataSet(ionElasticXS);
185  procMan->AddDiscreteProcess(ionProcEl);
186 
187  // inelastic
188  G4HadronInelasticProcess* genIonProcInel =
189  new G4HadronInelasticProcess("IonInelProcess", G4GenericIon::GenericIon());
190  genIonProcInel->RegisterMe(ionBC);
191  genIonProcInel->RegisterMe(qmd);
192  genIonProcInel->RegisterMe(m_ftfp);
193  genIonProcInel->AddDataSet(nuclNuclXS);
194  procMan->AddDiscreteProcess(genIonProcInel);
195 
196 }
197 
Abstract base class for different kinds of events.