11 #include <simulation/physicslist/IonPhysics.h>
13 #include "G4ProcessManager.hh"
14 #include "G4HadronElasticProcess.hh"
15 #include "G4HadronInelasticProcess.hh"
17 #include "G4TheoFSGenerator.hh"
18 #include "G4FTFModel.hh"
19 #include "G4ExcitedStringDecay.hh"
20 #include "G4LundStringFragmentation.hh"
21 #include "G4GeneratorPrecompoundInterface.hh"
22 #include "G4QMDReaction.hh"
23 #include "G4HadronicInteractionRegistry.hh"
24 #include "G4PreCompoundModel.hh"
25 #include "G4BinaryLightIonReaction.hh"
26 #include "G4NuclNuclDiffuseElastic.hh"
28 #include "G4CrossSectionElastic.hh"
29 #include "G4CrossSectionInelastic.hh"
30 #include "G4ComponentGGNuclNuclXsc.hh"
31 #include "G4SystemOfUnits.hh"
34 using namespace Simulation;
37 IonPhysics::IonPhysics()
38 : m_ftfp(nullptr), m_stringModel(nullptr), m_stringDecay(nullptr),
39 m_fragModel(nullptr), m_preCompoundModel(nullptr)
43 IonPhysics::~IonPhysics()
61 G4ProcessManager* procMan = 0;
64 G4NuclNuclDiffuseElastic* ionElastic =
new G4NuclNuclDiffuseElastic;
65 ionElastic->SetMinEnergy(0.0);
68 m_ftfp =
new G4TheoFSGenerator(
"FTFP");
71 new G4ExcitedStringDecay(
m_fragModel =
new G4LundStringFragmentation);
77 m_ftfp->SetMinEnergy(10.01 * GeV);
78 m_ftfp->SetMaxEnergy(1.0 * TeV);
81 G4QMDReaction* qmd =
new G4QMDReaction;
82 qmd->SetMinEnergy(100.0 * MeV);
83 qmd->SetMaxEnergy(10.0 * GeV);
86 G4HadronicInteraction* p =
87 G4HadronicInteractionRegistry::Instance()->FindModel(
"PRECO");
88 G4PreCompoundModel* thePreCompound =
static_cast<G4PreCompoundModel*
>(p);
89 if (!thePreCompound) { thePreCompound =
new G4PreCompoundModel; }
91 G4BinaryLightIonReaction* ionBC =
new G4BinaryLightIonReaction(thePreCompound);
92 ionBC->SetMinEnergy(0.0 * MeV);
93 ionBC->SetMaxEnergy(110.0 * MeV);
97 G4VCrossSectionDataSet* ionElasticXS =
new G4CrossSectionElastic(
m_ionGGXS);
98 ionElasticXS->SetMinKinEnergy(0.0);
102 G4VCrossSectionDataSet* nuclNuclXS =
109 procMan = G4Deuteron::Deuteron()->GetProcessManager();
115 G4HadronInelasticProcess* deutProcInel =
116 new G4HadronInelasticProcess(
"DeuteronInelProcess", G4Deuteron::Deuteron());
117 deutProcInel->RegisterMe(ionBC);
118 deutProcInel->RegisterMe(qmd);
119 deutProcInel->RegisterMe(
m_ftfp);
120 deutProcInel->AddDataSet(nuclNuclXS);
121 procMan->AddDiscreteProcess(deutProcInel);
127 procMan = G4Triton::Triton()->GetProcessManager();
133 G4HadronInelasticProcess* tritProcInel =
134 new G4HadronInelasticProcess(
"TritonInelProcess", G4Triton::Triton());
135 tritProcInel->RegisterMe(ionBC);
136 tritProcInel->RegisterMe(qmd);
137 tritProcInel->RegisterMe(
m_ftfp);
138 tritProcInel->AddDataSet(nuclNuclXS);
139 procMan->AddDiscreteProcess(tritProcInel);
145 procMan = G4He3::He3()->GetProcessManager();
151 G4HadronInelasticProcess* he3ProcInel =
152 new G4HadronInelasticProcess(
"He3InelProcess", G4He3::He3());
153 he3ProcInel->RegisterMe(ionBC);
154 he3ProcInel->RegisterMe(qmd);
155 he3ProcInel->RegisterMe(
m_ftfp);
156 he3ProcInel->AddDataSet(nuclNuclXS);
157 procMan->AddDiscreteProcess(he3ProcInel);
163 procMan = G4Alpha::Alpha()->GetProcessManager();
169 G4HadronInelasticProcess* alphProcInel =
170 new G4HadronInelasticProcess(
"AlphaInelProcess", G4Alpha::Alpha());
171 alphProcInel->RegisterMe(ionBC);
172 alphProcInel->RegisterMe(qmd);
173 alphProcInel->RegisterMe(
m_ftfp);
174 alphProcInel->AddDataSet(nuclNuclXS);
175 procMan->AddDiscreteProcess(alphProcInel);
181 procMan = G4GenericIon::GenericIon()->GetProcessManager();
184 G4HadronElasticProcess* ionProcEl =
new G4HadronElasticProcess;
185 ionProcEl->RegisterMe(ionElastic);
186 ionProcEl->AddDataSet(ionElasticXS);
187 procMan->AddDiscreteProcess(ionProcEl);
190 G4HadronInelasticProcess* genIonProcInel =
191 new G4HadronInelasticProcess(
"IonInelProcess", G4GenericIon::GenericIon());
192 genIonProcInel->RegisterMe(ionBC);
193 genIonProcInel->RegisterMe(qmd);
194 genIonProcInel->RegisterMe(
m_ftfp);
195 genIonProcInel->AddDataSet(nuclNuclXS);
196 procMan->AddDiscreteProcess(genIonProcInel);