Belle II Software development
KaonPhysics.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/KaonPhysics.h>
10
11#include "G4ProcessManager.hh"
12#include "G4HadronInelasticProcess.hh"
13#include "G4HadronElasticProcess.hh"
14#include "G4HadronicAbsorptionBertini.hh"
15
16#include "G4CascadeInterface.hh"
17#include "G4TheoFSGenerator.hh"
18#include "G4FTFModel.hh"
19#include "G4ExcitedStringDecay.hh"
20#include "G4LundStringFragmentation.hh"
21#include "G4GeneratorPrecompoundInterface.hh"
22#include "G4HadronElastic.hh"
23
24#include "G4CrossSectionElastic.hh"
25#include "G4CrossSectionInelastic.hh"
26#include "G4ComponentGGHadronNucleusXsc.hh"
27#include "G4SystemOfUnits.hh"
28
29using namespace Belle2;
30using namespace Simulation;
31
32
33KaonPhysics::KaonPhysics()
34 : m_ftfp(nullptr), m_stringModel(nullptr), m_stringDecay(nullptr),
35 m_fragModel(nullptr), m_preCompoundModel(nullptr)
36{}
37
38
39KaonPhysics::~KaonPhysics()
40{
41 delete m_stringDecay;
42 delete m_stringModel;
43 delete m_fragModel;
44 delete m_preCompoundModel;
45}
46
47
48void KaonPhysics::ConstructParticle()
49{}
50
51
52void KaonPhysics::ConstructProcess()
53{
54 G4ProcessManager* procMan;
55
56 // One elastic model for all kaon energies
57 G4HadronElastic* elModel = new G4HadronElastic();
58
59 // Use Bertini cascade for low energies
60 G4CascadeInterface* loInelModel = new G4CascadeInterface;
61 loInelModel->SetMinEnergy(0.0);
62 loInelModel->SetMaxEnergy(12.0 * GeV);
63
64 // Use FTFP for high energies ==>> eventually replace this with new class FTFPInterface
65 m_ftfp = new G4TheoFSGenerator("FTFP");
66 m_stringModel = new G4FTFModel;
67 m_stringDecay =
68 new G4ExcitedStringDecay(m_fragModel = new G4LundStringFragmentation);
69 m_stringModel->SetFragmentationModel(m_stringDecay);
70 m_preCompoundModel = new G4GeneratorPrecompoundInterface();
71
72 m_ftfp->SetHighEnergyGenerator(m_stringModel);
73 m_ftfp->SetTransport(m_preCompoundModel);
74 m_ftfp->SetMinEnergy(10 * GeV);
75 m_ftfp->SetMaxEnergy(100 * TeV);
76
77 // Inelastic cross section sets
78 G4VCrossSectionDataSet* kinelCS =
79 new G4CrossSectionInelastic(new G4ComponentGGHadronNucleusXsc);
80
81 // Elastic cross section
82 G4VCrossSectionDataSet* kelCS =
83 new G4CrossSectionElastic(new G4ComponentGGHadronNucleusXsc);
84
86 // K+ //
88
89 procMan = G4KaonPlus::KaonPlus()->GetProcessManager();
90
91 // elastic
92 G4HadronElasticProcess* kpProcEl = new G4HadronElasticProcess;
93 kpProcEl->RegisterMe(elModel);
94 kpProcEl->AddDataSet(kelCS);
95 procMan->AddDiscreteProcess(kpProcEl);
96
97 // inelastic
98 G4HadronInelasticProcess* kpProcInel = new G4HadronInelasticProcess("kaon+Inelastic", G4KaonPlus::Definition());
99 kpProcInel->RegisterMe(loInelModel);
100 kpProcInel->RegisterMe(m_ftfp);
101 kpProcInel->AddDataSet(kinelCS);
102 procMan->AddDiscreteProcess(kpProcInel);
103
105 // K- //
107
108 procMan = G4KaonMinus::KaonMinus()->GetProcessManager();
109
110 // elastic
111 G4HadronElasticProcess* kmProcEl = new G4HadronElasticProcess;
112 kmProcEl->RegisterMe(elModel);
113 kmProcEl->AddDataSet(kelCS);
114 procMan->AddDiscreteProcess(kmProcEl);
115
116 // inelastic
117 G4HadronInelasticProcess* kmProcInel = new G4HadronInelasticProcess("kaon-Inelastic", G4KaonMinus::Definition());
118 kmProcInel->RegisterMe(loInelModel);
119 kmProcInel->RegisterMe(m_ftfp);
120 kmProcInel->AddDataSet(kinelCS);
121 procMan->AddDiscreteProcess(kmProcInel);
122
123 // stopping
124 G4HadronicAbsorptionBertini* bertAbsorb = new G4HadronicAbsorptionBertini;
125 procMan->AddRestProcess(bertAbsorb);
126
128 // K0L //
130
131 procMan = G4KaonZeroLong::KaonZeroLong()->GetProcessManager();
132
133 // elastic
134 G4HadronElasticProcess* k0LProcEl = new G4HadronElasticProcess;
135 k0LProcEl->RegisterMe(elModel);
136 k0LProcEl->AddDataSet(kelCS);
137 procMan->AddDiscreteProcess(k0LProcEl);
138
139 // inelastic
140 G4HadronInelasticProcess* k0LProcInel = new G4HadronInelasticProcess("kaon0LInelastic", G4KaonZeroLong::Definition());
141 k0LProcInel->RegisterMe(loInelModel);
142 k0LProcInel->RegisterMe(m_ftfp);
143 k0LProcInel->AddDataSet(kinelCS);
144 procMan->AddDiscreteProcess(k0LProcInel);
145
147 // K0S //
149
150 procMan = G4KaonZeroShort::KaonZeroShort()->GetProcessManager();
151
152 // elastic
153 G4HadronElasticProcess* k0SProcEl = new G4HadronElasticProcess;
154 k0SProcEl->RegisterMe(elModel);
155 k0SProcEl->AddDataSet(kelCS);
156 procMan->AddDiscreteProcess(k0SProcEl);
157
158 // inelastic
159 G4HadronInelasticProcess* k0SProcInel = new G4HadronInelasticProcess("kaon0SInelastic", G4KaonZeroShort::Definition());
160 k0SProcInel->RegisterMe(loInelModel);
161 k0SProcInel->RegisterMe(m_ftfp);
162 k0SProcInel->AddDataSet(kinelCS);
163 procMan->AddDiscreteProcess(k0SProcInel);
164}
165
Abstract base class for different kinds of events.