Belle II Software  release-08-01-10
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 
29 using namespace Belle2;
30 using namespace Simulation;
31 
32 
33 KaonPhysics::KaonPhysics()
34  : m_ftfp(nullptr), m_stringModel(nullptr), m_stringDecay(nullptr),
35  m_fragModel(nullptr), m_preCompoundModel(nullptr)
36 {}
37 
38 
39 KaonPhysics::~KaonPhysics()
40 {
41  delete m_stringDecay;
42  delete m_stringModel;
43  delete m_fragModel;
44  delete m_preCompoundModel;
45 }
46 
47 
48 void KaonPhysics::ConstructParticle()
49 {}
50 
51 
52 void 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.