Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4NeutronElasticXS.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// GEANT4 Class file
31//
32//
33// File name: G4NeutronElasticXS
34//
35// Author Ivantchenko, Geant4, 3-Aug-09
36//
37// Modifications:
38//
39
41#include "G4NeutronElasticXS.hh"
42#include "G4Neutron.hh"
43#include "G4DynamicParticle.hh"
44#include "G4Element.hh"
45#include "G4ElementTable.hh"
46#include "G4PhysicsLogVector.hh"
47#include "G4PhysicsVector.hh"
49#include "G4HadronNucleonXsc.hh"
50#include "G4NistManager.hh"
51#include "G4Proton.hh"
52
53#include <iostream>
54#include <fstream>
55#include <sstream>
56
57using namespace std;
58
60 : G4VCrossSectionDataSet("G4NeutronElasticXS"),
61 proton(G4Proton::Proton()), maxZ(92)
62{
63 // verboseLevel = 0;
64 if(verboseLevel > 0){
65 G4cout << "G4NeutronElasticXS::G4NeutronElasticXS Initialise for Z < "
66 << maxZ + 1 << G4endl;
67 }
68 data.resize(maxZ+1, 0);
69 coeff.resize(maxZ+1, 1.0);
70 ggXsection = new G4GlauberGribovCrossSection();
71 fNucleon = new G4HadronNucleonXsc();
72 isInitialized = false;
73}
74
76{
77 delete fNucleon;
78 for(G4int i=0; i<=maxZ; ++i) {
79 delete data[i];
80 }
81}
82
83void G4NeutronElasticXS::CrossSectionDescription(std::ostream& outFile) const
84{
85 outFile << "G4NeutronElasticXS calculates the neutron elastic scattering\n"
86 << "cross section on nuclei using data from the high precision\n"
87 << "neutron database. These data are simplified and smoothed over\n"
88 << "the resonance region in order to reduce CPU time.\n"
89 << "G4NeutronElasticXS is valid for energies up to 20 MeV, for all\n"
90 << "targets through U.\n";
91}
92
93G4bool
95 G4int, const G4Material*)
96{
97 return true;
98}
99
102 G4int Z, const G4Material*)
103{
104 G4double xs = 0.0;
105 G4double ekin = aParticle->GetKineticEnergy();
106
107 if(Z < 1 || Z > maxZ) { return xs; }
108
109 G4int Amean = G4int(G4NistManager::Instance()->GetAtomicMassAmu(Z)+0.5);
110 G4PhysicsVector* pv = data[Z];
111 // G4cout << "G4NeutronElasticXS::GetCrossSection e= " << ekin << " Z= " << Z << G4endl;
112
113 // element was not initialised
114 if(!pv) {
115 Initialise(Z);
116 pv = data[Z];
117 if(!pv) { return xs; }
118 }
119
120 G4double e1 = pv->Energy(0);
121 if(ekin <= e1) { return (*pv)[0]; }
122
123 G4int n = pv->GetVectorLength() - 1;
124 G4double e2 = pv->Energy(n);
125
126 if(ekin <= e2) {
127 xs = pv->Value(ekin);
128 } else if(1 == Z) {
129 fNucleon->GetHadronNucleonXscPDG(aParticle, proton);
130 xs = coeff[1]*fNucleon->GetElasticHadronNucleonXsc();
131 } else {
132 ggXsection->GetIsoCrossSection(aParticle, Z, Amean);
133 xs = coeff[Z]*ggXsection->GetElasticGlauberGribovXsc();
134 }
135
136 if(verboseLevel > 0){
137 G4cout << "ekin= " << ekin << ", XSinel= " << xs << G4endl;
138 }
139 return xs;
140}
141
142void
144{
145 if(isInitialized) { return; }
146 if(verboseLevel > 0){
147 G4cout << "G4NeutronElasticXS::BuildPhysicsTable for "
148 << p.GetParticleName() << G4endl;
149 }
150 if(p.GetParticleName() != "neutron") {
151 throw G4HadronicException(__FILE__, __LINE__,"Wrong particle type");
152 return;
153 }
154 isInitialized = true;
155
156 // check environment variable
157 // Build the complete string identifying the file with the data set
158 char* path = getenv("G4NEUTRONXSDATA");
159 if (!path){
160 throw G4HadronicException(__FILE__, __LINE__,
161 "G4NEUTRONXSDATA environment variable not defined");
162 return;
163 }
164
165 G4DynamicParticle* dynParticle =
167
168 // Access to elements
169 const G4ElementTable* theElmTable = G4Element::GetElementTable();
170 size_t numOfElm = G4Element::GetNumberOfElements();
171 if(numOfElm > 0) {
172 for(size_t i=0; i<numOfElm; ++i) {
173 G4int Z = G4int(((*theElmTable)[i])->GetZ());
174 if(Z < 1) { Z = 1; }
175 else if(Z > maxZ) { Z = maxZ; }
176 //G4cout << "Z= " << Z << G4endl;
177 // Initialisation
178 if(!data[Z]) { Initialise(Z, dynParticle, path); }
179 }
180 }
181 delete dynParticle;
182}
183
184void
185G4NeutronElasticXS::Initialise(G4int Z, G4DynamicParticle* dp,
186 const char* p)
187{
188 if(data[Z]) { return; }
189 const char* path = p;
190 if(!p) {
191 // check environment variable
192 // Build the complete string identifying the file with the data set
193 path = getenv("G4NEUTRONXSDATA");
194 if (!path) {
195 throw G4HadronicException(__FILE__, __LINE__,
196 "G4NEUTRONXSDATA environment variable not defined");
197 return;
198 }
199 }
200 G4DynamicParticle* dynParticle = dp;
201 if(!dp) {
202 dynParticle =
204 }
205
206 G4int Amean = G4int(G4NistManager::Instance()->GetAtomicMassAmu(Z)+0.5);
207
208 // upload data from file
209 data[Z] = new G4PhysicsLogVector();
210
211 std::ostringstream ost;
212 ost << path << "/elast" << Z ;
213 std::ifstream filein(ost.str().c_str());
214 if (!(filein)) {
215 G4cout << ost.str()
216 << " is not opened by G4NeutronElasticXS" << G4endl;
217 throw G4HadronicException(__FILE__, __LINE__,"NO data sets opened");
218 return;
219 }else{
220 if(verboseLevel > 1) {
221 G4cout << "file " << ost.str()
222 << " is opened by G4NeutronElasticXS" << G4endl;
223 }
224
225 // retrieve data from DB
226 data[Z]->Retrieve(filein, true);
227
228 // smooth transition
229 size_t n = data[Z]->GetVectorLength() - 1;
230 G4double emax = data[Z]->Energy(n);
231 G4double sig1 = (*data[Z])[n];
232 dynParticle->SetKineticEnergy(emax);
233 G4double sig2 = 0.0;
234 if(1 == Z) {
235 fNucleon->GetHadronNucleonXscPDG(dynParticle, proton);
236 sig2 = fNucleon->GetElasticHadronNucleonXsc();
237 } else {
238 ggXsection->GetIsoCrossSection(dynParticle, Z, Amean);
239 sig2 = ggXsection->GetElasticGlauberGribovXsc();
240 }
241 if(sig2 > 0.) { coeff[Z] = sig1/sig2; }
242 }
243 if(!dp) { delete dynParticle; }
244}
std::vector< G4Element * > G4ElementTable
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
G4double GetKineticEnergy() const
void SetKineticEnergy(G4double aEnergy)
static size_t GetNumberOfElements()
Definition: G4Element.cc:406
static const G4ElementTable * GetElementTable()
Definition: G4Element.cc:399
virtual G4double GetIsoCrossSection(const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso=0, const G4Element *elm=0, const G4Material *mat=0)
G4double GetHadronNucleonXscPDG(const G4DynamicParticle *, const G4ParticleDefinition *)
G4double GetElasticHadronNucleonXsc()
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
virtual void CrossSectionDescription(std::ostream &) const
virtual G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat=0)
virtual G4bool IsElementApplicable(const G4DynamicParticle *, G4int Z, const G4Material *)
static G4Neutron * Neutron()
Definition: G4Neutron.cc:104
static G4NistManager * Instance()
const G4String & GetParticleName() const
G4double Value(G4double theEnergy)
size_t GetVectorLength() const
G4double Energy(size_t index) const