Belle II Software development
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
31using namespace Belle2;
32using namespace Simulation;
33
34
35IonPhysics::IonPhysics()
36 : m_ftfp(nullptr), m_stringModel(nullptr), m_stringDecay(nullptr),
37 m_fragModel(nullptr), m_preCompoundModel(nullptr)
38{}
39
40
41IonPhysics::~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
53void IonPhysics::ConstructParticle()
54{}
55
56
57void 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.