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