Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4VHadronPhysics.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$
27 //
28 //---------------------------------------------------------------------------
29 //
30 // ClassName: G4VHadronPhysics
31 //
32 // Author: 28 June 2009 V.Ivanchenko
33 //
34 // Modified:
35 //
36 //----------------------------------------------------------------------------
37 //
38 
39 #include "G4VHadronPhysics.hh"
40 #include "G4SystemOfUnits.hh"
41 #include "G4ParticleDefinition.hh"
43 #include "G4HadronicProcessType.hh"
49 #include "G4Neutron.hh"
50 #include "G4MesonConstructor.hh"
51 #include "G4BaryonConstructor.hh"
52 #include "G4IonConstructor.hh"
54 #include "G4ProcessVector.hh"
55 #include "G4ProcessManager.hh"
56 
58  : G4VPhysicsConstructor(aName)
59 {
60  SetVerboseLevel(verb);
61  if (verboseLevel>1) {
62  G4cout << "### G4VHadronPhysics: <" << aName << "> is created "
63  << G4endl;
64  }
65 }
66 
68 {
69  G4int n = builders.size();
70  if(n > 0) {
71  for(G4int i=0; i<n; i++) {delete builders[i];}
72  }
73 }
74 
76 {
77  G4MesonConstructor pMesonConstructor;
78  pMesonConstructor.ConstructParticle();
79 
80  G4BaryonConstructor pBaryonConstructor;
81  pBaryonConstructor.ConstructParticle();
82 
83  G4IonConstructor pIonConstructor;
84  pIonConstructor.ConstructParticle();
85 
86  G4ShortLivedConstructor pShortLivedConstructor;
87  pShortLivedConstructor.ConstructParticle();
88 }
89 
92  G4double emin,
93  G4double emax)
94 {
95  builders.push_back(mBuilder);
96  G4HadronicInteraction* model = mBuilder->GetModel();
97  model->SetMinEnergy(emin);
98  model->SetMaxEnergy(emax);
99  if (verboseLevel>1) {
100  G4cout << "### G4VHadronPhysics <"
101  << model->GetModelName() << " Emin(GeV)= "
102  << emin/GeV << " Emax(GeV)= " << emax/GeV
103  << G4endl;
104  }
105 
106  return model;
107 }
108 
111  G4double emin,
112  G4double emax)
113 {
114  if(!model) return model;
115  model->SetMinEnergy(emin);
116  model->SetMaxEnergy(emax);
117  if (verboseLevel>1) {
118  G4cout << "### G4VHadronPhysics <"
119  << model->GetModelName() << " Emin(GeV)= "
120  << emin/GeV << " Emax(GeV)= " << emax/GeV
121  << G4endl;
122  }
123  return model;
124 }
125 
126 void
129 {
130  const G4ParticleDefinition* p =
132  if(!p) {
133  G4cout << "### G4VHadronPhysics WARNING: fails to find particle "
134  << pname << G4endl;
135  } else {
136  AddInelasticCrossSection(p, xsec);
137  }
138 }
139 
140 void
143 {
144  if(!p) return;
146  if(!had) return;
147  had->AddDataSet(xsec);
148  if (verboseLevel>1) {
149  G4cout << "### G4VHadronPhysics: the inelastic cross section "
150  << " is added for " << p->GetParticleName()
151  << G4endl;
152  }
153 }
154 
155 void
158 {
159  const G4ParticleDefinition* p =
161  if(!p) {
162  G4cout << "### G4VHadronPhysics WARNING: fails to find particle "
163  << pname << G4endl;
164  } else {
165  AddElasticCrossSection(p, xsec);
166  }
167 }
168 
169 void
172 {
173  if(!p) return;
175  if(!had) return;
176  had->AddDataSet(xsec);
177  if (verboseLevel>1) {
178  G4cout << "### G4VHadronPhysics: the inelastic cross section "
179  << " is added for " << p->GetParticleName()
180  << G4endl;
181  }
182 }
183 
184 void
186 {
188  if(!had) return;
189  had->AddDataSet(xsec);
190  if (verboseLevel>1) {
191  G4cout << "### G4VHadronPhysics: the capture cross section "
192  << " is added for neutron"
193  << G4endl;
194  }
195 }
196 
197 void
199 {
201  if(!had) return;
202  had->AddDataSet(xsec);
203  if (verboseLevel>1) {
204  G4cout << "### G4VHadronPhysics: the fission cross section "
205  << " is added for neutron"
206  << G4endl;
207  }
208 }
209 
212 {
213  G4HadronicProcess* had = 0;
214  const G4ParticleDefinition* p =
216  if(!p) {
217  G4cout << "### G4VHadronPhysics WARNING: fails to find particle "
218  << pname << G4endl;
219  return had;
220  }
221  return FindInelasticProcess(p);
222 }
223 
226 {
227  G4HadronicProcess* had = 0;
228  if(!p) return had;
229  G4ProcessManager* pmanager = p->GetProcessManager();
230  G4ProcessVector* pv = pmanager->GetProcessList();
231  size_t n = pv->size();
232  if(0 < n) {
233  for(size_t i=0; i<n; ++i) {
234  if(fHadronInelastic == ((*pv)[i])->GetProcessSubType()) {
235  had = static_cast<G4HadronicProcess*>((*pv)[i]);
236  return had;
237  }
238  }
239  }
241  had = new G4HadronInelasticProcess(part->GetParticleName()+"Inelastic",part);
242  pmanager->AddDiscreteProcess(had);
243  return had;
244 }
245 
248 {
249  G4HadronicProcess* had = 0;
250  const G4ParticleDefinition* p =
252  if(!p) {
253  G4cout << "### G4VHadronPhysics WARNING: fails to find particle "
254  << pname << G4endl;
255  return had;
256  }
257  return FindElasticProcess(p);
258 }
259 
262 {
263  G4HadronicProcess* had = 0;
264  if(!p) return had;
265  G4ProcessManager* pmanager = p->GetProcessManager();
266  G4ProcessVector* pv = pmanager->GetProcessList();
267  size_t n = pv->size();
268  if(0 < n) {
269  for(size_t i=0; i<n; ++i) {
270  if(fHadronElastic == ((*pv)[i])->GetProcessSubType()) {
271  had = static_cast<G4HadronicProcess*>((*pv)[i]);
272  return had;
273  }
274  }
275  }
276  had = new G4HadronElasticProcess("hElastic");
277  pmanager->AddDiscreteProcess(had);
278  return had;
279 }
280 
282 {
283  G4HadronicProcess* had = 0;
284  G4ProcessManager* pmanager =
286  G4ProcessVector* pv = pmanager->GetProcessList();
287  size_t n = pv->size();
288  if(0 < n) {
289  for(size_t i=0; i<n; ++i) {
290  if(fCapture == ((*pv)[i])->GetProcessSubType()) {
291  had = static_cast<G4HadronicProcess*>((*pv)[i]);
292  return had;
293  }
294  }
295  }
296  had = new G4HadronCaptureProcess("nCapture");
297  pmanager->AddDiscreteProcess(had);
298  return had;
299 }
300 
302 {
303  G4HadronicProcess* had = 0;
304  G4ProcessManager* pmanager =
306  G4ProcessVector* pv = pmanager->GetProcessList();
307  size_t n = pv->size();
308  if(0 < n) {
309  for(size_t i=0; i<n; ++i) {
310  if(fFission == ((*pv)[i])->GetProcessSubType()) {
311  had = static_cast<G4HadronicProcess*>((*pv)[i]);
312  return had;
313  }
314  }
315  }
316  had = new G4HadronFissionProcess("nFission");
317  pmanager->AddDiscreteProcess(had);
318  return had;
319 }
320