Belle II Software  release-08-01-10
NeutronPhysics.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/NeutronPhysics.h>
10 
11 #include "G4ProcessManager.hh"
12 #include "G4HadronInelasticProcess.hh"
13 #include "G4HadronElasticProcess.hh"
14 #include "G4NeutronCaptureProcess.hh"
15 #include "G4NeutronKiller.hh"
16 
17 #include "G4CascadeInterface.hh"
18 #include "G4TheoFSGenerator.hh"
19 #include "G4FTFModel.hh"
20 #include "G4ExcitedStringDecay.hh"
21 #include "G4LundStringFragmentation.hh"
22 #include "G4GeneratorPrecompoundInterface.hh"
23 #include "G4ChipsElasticModel.hh"
24 #include "G4NeutronRadCapture.hh"
25 
26 #include "G4BGGNucleonInelasticXS.hh"
27 #include "G4NeutronElasticXS.hh"
28 #include "G4NeutronCaptureXS.hh"
29 
30 #include "G4SystemOfUnits.hh"
31 
32 using namespace Belle2;
33 using namespace Simulation;
34 
35 
36 NeutronPhysics::NeutronPhysics()
37  : m_ftfp(nullptr), m_stringModel(nullptr), m_stringDecay(nullptr),
38  m_fragModel(nullptr), m_preCompoundModel(nullptr)
39 {}
40 
41 
42 NeutronPhysics::~NeutronPhysics()
43 {
44  delete m_stringDecay;
45  delete m_stringModel;
46  delete m_fragModel;
47  delete m_preCompoundModel;
48 }
49 
50 
51 void NeutronPhysics::ConstructParticle()
52 {}
53 
54 
55 void NeutronPhysics::ConstructProcess()
56 {
57  // Low energy elastic model
58  G4ChipsElasticModel* elMod = new G4ChipsElasticModel();
59 
60  // Use Bertini cascade for low energies
61  G4CascadeInterface* loInelModel = new G4CascadeInterface;
62  loInelModel->SetMinEnergy(0.0);
63  loInelModel->SetMaxEnergy(12.0 * GeV);
64 
65  // Capture model
66  G4NeutronRadCapture* capModel = new G4NeutronRadCapture();
67 
68  // Use FTFP for high energies ==>> eventually replace this with new class FTFPInterface
69  m_ftfp = new G4TheoFSGenerator("FTFP");
70  m_stringModel = new G4FTFModel;
71  m_stringDecay =
72  new G4ExcitedStringDecay(m_fragModel = new G4LundStringFragmentation);
73  m_stringModel->SetFragmentationModel(m_stringDecay);
74  m_preCompoundModel = new G4GeneratorPrecompoundInterface();
75 
76  m_ftfp->SetHighEnergyGenerator(m_stringModel);
77  m_ftfp->SetTransport(m_preCompoundModel);
78  m_ftfp->SetMinEnergy(5 * GeV);
79  m_ftfp->SetMaxEnergy(100 * TeV);
80 
81  // Cross section sets
82  G4BGGNucleonInelasticXS* inelCS = new G4BGGNucleonInelasticXS(G4Neutron::Neutron());
83  G4NeutronElasticXS* elCS = new G4NeutronElasticXS;
84  G4NeutronCaptureXS* capCS = new G4NeutronCaptureXS;
85 
86  G4ProcessManager* procMan = G4Neutron::Neutron()->GetProcessManager();
87 
88  // Elastic process
89  G4HadronElasticProcess* nProcEl = new G4HadronElasticProcess;
90  nProcEl->RegisterMe(elMod);
91  nProcEl->AddDataSet(elCS);
92  procMan->AddDiscreteProcess(nProcEl);
93 
94  // Inelastic process
95  G4HadronInelasticProcess* nProcInel = new G4HadronInelasticProcess("neutronInelastic", G4Neutron::Definition());
96  nProcInel->RegisterMe(loInelModel);
97  nProcInel->RegisterMe(m_ftfp);
98  nProcInel->AddDataSet(inelCS);
99  procMan->AddDiscreteProcess(nProcInel);
100 
101  // Capture process
102  G4NeutronCaptureProcess* nProcCap = new G4NeutronCaptureProcess;
103  nProcCap->RegisterMe(capModel);
104  nProcCap->AddDataSet(capCS);
105  procMan->AddDiscreteProcess(nProcCap);
106 
107  // Neutron cut (kill neutrons that live too long or have too little energy)
108  G4NeutronKiller* nKiller = new G4NeutronKiller();
109  nKiller->SetKinEnergyLimit(0.0 * MeV);
110  nKiller->SetTimeLimit(10.*microsecond);
111  procMan->AddDiscreteProcess(nKiller);
112 
113 }
114 
115 
Abstract base class for different kinds of events.