Geant4_10
exrdmPhysListHadron.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 // $Id: exrdmPhysListHadron.cc 75676 2013-11-05 09:03:12Z gcosmo $
27 //
30 //
31 
32 #include "exrdmPhysListHadron.hh"
33 
34 #include "G4ParticleDefinition.hh"
35 #include "G4ProcessManager.hh"
36 
37 #include "G4TheoFSGenerator.hh"
38 #include "G4ExcitationHandler.hh"
39 #include "G4Evaporation.hh"
40 #include "G4FermiBreakUp.hh"
41 #include "G4StatMF.hh"
43 #include "G4PreCompoundModel.hh"
44 #include "G4QGSModel.hh"
45 #include "G4QGSParticipants.hh"
46 #include "G4QGSMFragmentation.hh"
47 #include "G4ExcitedStringDecay.hh"
48 
49 #include "G4HadronElastic.hh"
50 #include "G4LFission.hh"
51 #include "G4NeutronRadCapture.hh"
52 #include "G4NeutronCaptureXS.hh"
53 
54 #include "G4CascadeInterface.hh"
55 
56 #include "G4BinaryCascade.hh"
58 
59 //HPNeutron
60 
61 #include "G4NeutronHPElastic.hh"
63 #include "G4NeutronHPCapture.hh"
65 #include "G4NeutronHPInelastic.hh"
67 //c-s
72 
73 // RadioactiveDecay
74 #include "G4RadioactiveDecay.hh"
75 #include "G4GenericIon.hh"
76 
77 #include "G4SystemOfUnits.hh"
78 
79 
81  : G4VPhysicsConstructor(name),
82  fTheNeutronElasticProcess(0), fTheFissionProcess(0),
83  fTheCaptureProcess(0),fTheDeuteronInelasticProcess(0),
84  fTheTritonInelasticProcess(0), fTheAlphaInelasticProcess(0),
85  fTheIonInelasticProcess(0)
86 {}
87 
89 {}
90 
91 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
93 {
94 
95  G4ProcessManager * pManager = 0;
96 
97  // this will be the model class for high energies
98  G4TheoFSGenerator * theTheoModel = new G4TheoFSGenerator;
99  // all models for treatment of thermal nucleus
100  G4Evaporation * theEvaporation = new G4Evaporation;
101  G4FermiBreakUp * theFermiBreakUp = new G4FermiBreakUp;
102  G4StatMF * theMF = new G4StatMF;
103  // Evaporation logic
104  G4ExcitationHandler * theHandler = new G4ExcitationHandler;
105  theHandler->SetEvaporation(theEvaporation);
106  theHandler->SetFermiModel(theFermiBreakUp);
107  theHandler->SetMultiFragmentation(theMF);
108  theHandler->SetMaxAandZForFermiBreakUp(12, 6);
109  theHandler->SetMinEForMultiFrag(5*MeV);
110  // Pre equilibrium stage
111  G4PreCompoundModel * thePreEquilib = new G4PreCompoundModel(theHandler);
112 
113  // a no-cascade generator-precompound interaface
114  G4GeneratorPrecompoundInterface * theCascade =
116  theCascade->SetDeExcitation(thePreEquilib);
117 
118  // here come the high energy parts
119  // the string model; still not quite according to design
120  // - Explicite use of the forseen interfaces
121  G4VPartonStringModel * theStringModel;
122  theStringModel = new G4QGSModel<G4QGSParticipants>;
123  theTheoModel->SetTransport(theCascade);
124  theTheoModel->SetHighEnergyGenerator(theStringModel);
125  theTheoModel->SetMinEnergy(10*GeV); // 15 GeV may be the right limit
126  theTheoModel->SetMaxEnergy(100*TeV);
127 
128  G4VLongitudinalStringDecay * theFragmentation = new G4QGSMFragmentation;
129  G4ExcitedStringDecay * theStringDecay =
130  new G4ExcitedStringDecay(theFragmentation);
131  theStringModel->SetFragmentationModel(theStringDecay);
132 
133  // Elastic Process
134 
135  fTheElasticProcess.RegisterMe(new G4HadronElastic());
136 
137  // ---------------------------------------------------------------------------
138  // Hadron elastic process
139  // for all particles except neutrons
140 
141  aParticleIterator->reset();
142  while( (*aParticleIterator)() ) {
143  G4ParticleDefinition* particle = aParticleIterator->value();
144  G4String particleName = particle->GetParticleName();
145  if (particleName != "neutron") {
146  pManager = particle->GetProcessManager();
147  if (particle->GetPDGMass() > 110.*MeV &&
148  fTheElasticProcess.IsApplicable(*particle) &&
149  !particle->IsShortLived()) {
150  pManager->AddDiscreteProcess(&fTheElasticProcess);
151  //
152  // G4cout << "### Elastic model are registered for "
153  // << particle->GetParticleName()
154  // << G4endl;
155  }
156  }
157  }
158  // Proton
159  pManager = G4Proton::Proton()->GetProcessManager();
160  // add inelastic process
161  // Binary Cascade
162  G4BinaryCascade * theBC = new G4BinaryCascade;
163  theBC->SetMaxEnergy(10.5*GeV);
164  fTheProtonInelastic.RegisterMe(theBC);
165  // Higher energy
166  fTheProtonInelastic.RegisterMe(theTheoModel);
167  // now the cross-sections.
168  G4ProtonInelasticCrossSection * theProtonData =
170  fTheProtonInelastic.AddDataSet(theProtonData);
171  pManager->AddDiscreteProcess(&fTheProtonInelastic);
172  //
173  //
174  // Neutron
175  pManager = G4Neutron::Neutron()->GetProcessManager();
176  // add process
177  // elastic scattering
178  fTheNeutronElasticProcess =
180  G4HadronElastic* theElasticModel1 = new G4HadronElastic;
181  G4NeutronHPElastic * theElasticNeutron = new G4NeutronHPElastic;
182  fTheNeutronElasticProcess->RegisterMe(theElasticModel1);
183  theElasticModel1->SetMinEnergy(19.*MeV);
184  fTheNeutronElasticProcess->RegisterMe(theElasticNeutron);
185  theElasticNeutron->SetMaxEnergy(20.*MeV);
186 
187  G4NeutronHPElasticData * theNeutronData = new G4NeutronHPElasticData;
188  fTheNeutronElasticProcess->AddDataSet(theNeutronData);
189  pManager->AddDiscreteProcess(fTheNeutronElasticProcess);
190  // inelastic
191  G4NeutronHPInelastic * theHPNeutronInelasticModel =
193  theHPNeutronInelasticModel->SetMaxEnergy(20.*MeV);
194  fTheNeutronInelastic.RegisterMe(theHPNeutronInelasticModel);
195  G4NeutronHPInelasticData * theNeutronData1 = new G4NeutronHPInelasticData;
196  fTheNeutronInelastic.AddDataSet(theNeutronData1);
197  // binary
198  G4BinaryCascade * neutronBC = new G4BinaryCascade;
199  neutronBC->SetMinEnergy(19.*MeV);
200  neutronBC->SetMaxEnergy(10.5*GeV);
201  fTheNeutronInelastic.RegisterMe(neutronBC);
202  // higher energy
203  fTheNeutronInelastic.RegisterMe(theTheoModel);
204  // now the cross-sections.
205  G4NeutronInelasticCrossSection * theNeutronData2 =
207  fTheNeutronInelastic.AddDataSet(theNeutronData2);
208  pManager->AddDiscreteProcess(&fTheNeutronInelastic);
209 
210  // fission
211  fTheFissionProcess = new G4HadronFissionProcess;
212  G4LFission* theFissionModel = new G4LFission;
213  fTheFissionProcess->RegisterMe(theFissionModel);
214  pManager->AddDiscreteProcess(fTheFissionProcess);
215 
216  //capture
217  fTheCaptureProcess = new G4HadronCaptureProcess;
218  G4NeutronRadCapture* theCaptureModel = new G4NeutronRadCapture;
219  theCaptureModel->SetMinEnergy(19.*MeV);
220  fTheCaptureProcess->RegisterMe(theCaptureModel);
221  fTheCaptureProcess->AddDataSet(new G4NeutronCaptureXS);
222 
223  G4NeutronHPCapture * theHPNeutronCaptureModel = new G4NeutronHPCapture;
224  fTheCaptureProcess->RegisterMe(theHPNeutronCaptureModel);
225  G4NeutronHPCaptureData * theNeutronData3 = new G4NeutronHPCaptureData;
226  fTheCaptureProcess->AddDataSet(theNeutronData3);
227  pManager->AddDiscreteProcess(fTheCaptureProcess);
228 
229  // now light ions
230  // light Ion BC
232  theIonBC->SetMinEnergy(1*MeV);
233  theIonBC->SetMaxEnergy(20*GeV);
234  G4TripathiCrossSection * TripathiCrossSection= new G4TripathiCrossSection;
236 
237  // deuteron
238  pManager = G4Deuteron::Deuteron()->GetProcessManager();
239  fTheDeuteronInelasticProcess =
240  new G4DeuteronInelasticProcess("inelastic");
241  fTheDeuteronInelasticProcess->AddDataSet(TripathiCrossSection);
242  fTheDeuteronInelasticProcess->AddDataSet(aShen);
243  // fTheDeuteronInelasticProcess->RegisterMe(theDeuteronInelasticModel);
244  fTheDeuteronInelasticProcess->RegisterMe(theIonBC);
245  fTheDeuteronInelasticProcess->RegisterMe(theTheoModel);
246  pManager->AddDiscreteProcess(fTheDeuteronInelasticProcess);
247  // triton
248  pManager = G4Triton::Triton()->GetProcessManager();
249  fTheTritonInelasticProcess =
250  new G4TritonInelasticProcess("inelastic");
251  fTheTritonInelasticProcess->AddDataSet(TripathiCrossSection);
252  fTheTritonInelasticProcess->AddDataSet(aShen);
253  // fTheTritonInelasticProcess->RegisterMe(theTritonInelasticModel);
254  fTheTritonInelasticProcess->RegisterMe(theIonBC);
255  fTheTritonInelasticProcess->RegisterMe(theTheoModel);
256  pManager->AddDiscreteProcess(fTheTritonInelasticProcess);
257  // alpha
258  pManager = G4Alpha::Alpha()->GetProcessManager();
259  fTheAlphaInelasticProcess =
260  new G4AlphaInelasticProcess("inelastic");
261  fTheAlphaInelasticProcess->AddDataSet(TripathiCrossSection);
262  fTheAlphaInelasticProcess->AddDataSet(aShen);
263  // fTheAlphaInelasticProcess->RegisterMe(theAlphaInelasticModel);
264  fTheAlphaInelasticProcess->RegisterMe(theIonBC);
265  fTheAlphaInelasticProcess->RegisterMe(theTheoModel);
266  pManager->AddDiscreteProcess(fTheAlphaInelasticProcess);
267 
268  // GenericIon
270  // need to add the elastic explicitly
271  pManager->AddDiscreteProcess(&fTheElasticProcess);
272  fTheIonInelasticProcess =
273  new G4IonInelasticProcess();
274  fTheIonInelasticProcess->AddDataSet(TripathiCrossSection);
275  fTheIonInelasticProcess->AddDataSet(aShen);
276  // G4BinaryLightIonReaction * theGenIonBC= new G4BinaryLightIonReaction;
277  // theGenIonBC->SetMinEnergy(0*MeV);
278  //theGenIonBC->SetMaxEnergy(20*GeV);
279  fTheIonInelasticProcess->RegisterMe(theIonBC);
280  fTheIonInelasticProcess->RegisterMe(theTheoModel);
281  pManager->AddDiscreteProcess(fTheIonInelasticProcess);
282 }
void SetFragmentationModel(G4VStringFragmentation *aModel)
exrdmPhysListHadron(const G4String &name="hadron")
Definition of the exrdmPhysListHadron class.
G4int AddDiscreteProcess(G4VProcess *aProcess, G4int ord=ordDefault)
void SetMinEForMultiFrag(G4double anE)
const XML_Char * name
Definition: expat.h:151
G4ProcessManager * GetProcessManager() const
const G4String & GetParticleName() const
void SetHighEnergyGenerator(G4VHighEnergyGenerator *const value)
void RegisterMe(G4HadronicInteraction *a)
void SetMinEnergy(G4double anEnergy)
void AddDataSet(G4VCrossSectionDataSet *aDataSet)
#define aParticleIterator
void SetFermiModel(G4VFermiBreakUp *ptr)
static G4Triton * Triton()
Definition: G4Triton.cc:95
static G4Proton * Proton()
Definition: G4Proton.cc:93
void SetMultiFragmentation(G4VMultiFragmentation *ptr)
static G4Neutron * Neutron()
Definition: G4Neutron.cc:104
static G4Deuteron * Deuteron()
Definition: G4Deuteron.cc:94
static G4GenericIon * GenericIon()
Definition: G4GenericIon.cc:93
G4double GetPDGMass() const
void SetMaxAandZForFermiBreakUp(G4int anA, G4int aZ)
void SetEvaporation(G4VEvaporation *ptr)
void SetMaxEnergy(const G4double anEnergy)
void SetDeExcitation(G4VPreCompoundModel *ptr)
void SetTransport(G4VIntraNuclearTransportModel *const value)
static G4Alpha * Alpha()
Definition: G4Alpha.cc:89
virtual void ConstructProcess()
virtual G4bool IsApplicable(const G4ParticleDefinition &)
Definition: G4VProcess.hh:205