9#include <simulation/physicslist/IonPhysics.h>
11#include "G4ProcessManager.hh"
12#include "G4HadronElasticProcess.hh"
13#include "G4HadronInelasticProcess.hh"
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"
26#include "G4CrossSectionElastic.hh"
27#include "G4CrossSectionInelastic.hh"
28#include "G4ComponentGGNuclNuclXsc.hh"
29#include "G4SystemOfUnits.hh"
32using namespace Simulation;
35IonPhysics::IonPhysics()
36 : m_ftfp(nullptr), m_stringModel(nullptr), m_stringDecay(nullptr),
37 m_fragModel(nullptr), m_preCompoundModel(nullptr)
41IonPhysics::~IonPhysics()
46 delete m_preCompoundModel;
48 delete m_theGGNuclNuclXS;
53void IonPhysics::ConstructParticle()
57void IonPhysics::ConstructProcess()
59 G4ProcessManager* procMan = 0;
62 G4NuclNuclDiffuseElastic* ionElastic =
new G4NuclNuclDiffuseElastic;
63 ionElastic->SetMinEnergy(0.0);
66 m_ftfp =
new G4TheoFSGenerator(
"FTFP");
67 m_stringModel =
new G4FTFModel;
69 new G4ExcitedStringDecay(m_fragModel =
new G4LundStringFragmentation);
70 m_stringModel->SetFragmentationModel(m_stringDecay);
71 m_preCompoundModel =
new G4GeneratorPrecompoundInterface();
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);
79 G4QMDReaction* qmd =
new G4QMDReaction;
80 qmd->SetMinEnergy(100.0 * MeV);
81 qmd->SetMaxEnergy(10.0 * GeV);
84 G4HadronicInteraction* p =
85 G4HadronicInteractionRegistry::Instance()->FindModel(
"PRECO");
86 G4PreCompoundModel* thePreCompound =
static_cast<G4PreCompoundModel*
>(p);
87 if (!thePreCompound) { thePreCompound =
new G4PreCompoundModel; }
89 G4BinaryLightIonReaction* ionBC =
new G4BinaryLightIonReaction(thePreCompound);
90 ionBC->SetMinEnergy(0.0 * MeV);
91 ionBC->SetMaxEnergy(110.0 * MeV);
94 m_ionGGXS =
new G4ComponentGGNuclNuclXsc;
95 G4VCrossSectionDataSet* ionElasticXS =
new G4CrossSectionElastic(m_ionGGXS);
96 ionElasticXS->SetMinKinEnergy(0.0);
99 m_theGGNuclNuclXS =
new G4ComponentGGNuclNuclXsc();
100 G4VCrossSectionDataSet* nuclNuclXS =
101 new G4CrossSectionInelastic(m_theGGNuclNuclXS);
107 procMan = G4Deuteron::Deuteron()->GetProcessManager();
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);
125 procMan = G4Triton::Triton()->GetProcessManager();
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);
143 procMan = G4He3::He3()->GetProcessManager();
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);
161 procMan = G4Alpha::Alpha()->GetProcessManager();
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);
179 procMan = G4GenericIon::GenericIon()->GetProcessManager();
182 G4HadronElasticProcess* ionProcEl =
new G4HadronElasticProcess;
183 ionProcEl->RegisterMe(ionElastic);
184 ionProcEl->AddDataSet(ionElasticXS);
185 procMan->AddDiscreteProcess(ionProcEl);
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);
Abstract base class for different kinds of events.