source: trunk/source/processes/hadronic/models/coherent_elastic/src/G4CHIPSElasticXS.cc@ 1357

Last change on this file since 1357 was 1350, checked in by garnier, 15 years ago

update to last version 4.9.4

File size: 5.5 KB
Line 
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: G4CHIPSElasticXS.cc,v 1.2 2010/09/24 13:56:00 vnivanch Exp $
27// GEANT4 tag $Name: geant4-09-03-ref-09 $
28//
29// -------------------------------------------------------------------
30//
31// GEANT4 Class file
32//
33//
34// File name: G4CHIPSElasticXS
35//
36// Author Ivantchenko, Geant4, 3-Aug-09
37//
38// Modifications:
39//
40
41#include "G4CHIPSElasticXS.hh"
42#include "G4DynamicParticle.hh"
43#include "G4ParticleDefinition.hh"
44#include "G4Element.hh"
45#include "G4Proton.hh"
46#include "G4Neutron.hh"
47#include "G4VQCrossSection.hh"
48#include "G4QProtonElasticCrossSection.hh"
49#include "G4QNeutronElasticCrossSection.hh"
50
51G4CHIPSElasticXS::G4CHIPSElasticXS()
52 : G4VCrossSectionDataSet("CHIPSElasticXS"),
53 theProton(G4Proton::Proton()),
54 theNeutron(G4Neutron::Neutron()),
55 thEnergy(19*CLHEP::MeV),
56 isInitialized(false)
57{
58 // verboseLevel = 0;
59 pCManager = G4QProtonElasticCrossSection::GetPointer();
60 nCManager = G4QNeutronElasticCrossSection::GetPointer();
61}
62
63G4CHIPSElasticXS::~G4CHIPSElasticXS()
64{}
65
66G4bool
67G4CHIPSElasticXS::IsApplicable(const G4DynamicParticle* dyn,
68 const G4Element* elm)
69{
70 return (elm->GetZ() < 2.5 && dyn->GetKineticEnergy() > thEnergy);
71}
72
73G4bool
74G4CHIPSElasticXS::IsZAApplicable(const G4DynamicParticle* dyn,
75 G4double ZZ, G4double /*AA*/)
76{
77 return (ZZ < 2.5 && dyn->GetKineticEnergy() > thEnergy);
78}
79
80G4bool
81G4CHIPSElasticXS::IsIsoApplicable(const G4DynamicParticle* dyn,
82 G4int Z, G4int /*N*/)
83{
84 return (Z <= 2 && dyn->GetKineticEnergy() > thEnergy);
85}
86
87G4double
88G4CHIPSElasticXS::GetCrossSection(const G4DynamicParticle* aParticle,
89 const G4Element* elm,
90 G4double)
91{
92 G4double xs = 0.0;
93 G4int Z = G4int(elm->GetZ());
94 G4IsotopeVector* isv = elm->GetIsotopeVector();
95 G4int ni = 0;
96 if(isv) { ni = isv->size(); }
97
98 if(ni <= 1) {
99 G4int A = G4int(elm->GetN()+0.5);
100 xs = GetZandACrossSection(aParticle, Z, A);
101 } else {
102 G4double* ab = elm->GetRelativeAbundanceVector();
103 for(G4int j=0; j<ni; ++j) {
104 G4int A = (*isv)[j]->GetN();
105 xs += ab[j]*GetZandACrossSection(aParticle, Z, A);
106 }
107 }
108
109 if(verboseLevel > 1) {
110 G4cout << "G4CHIPSElasticXS::GetCrossSection for "
111 << theParticle->GetParticleName()
112 << " on " << elm->GetName()
113 << " ekin(MeV)= " << aParticle->GetKineticEnergy()/CLHEP::MeV
114 << ", XSel(bn)= " << xs/CLHEP::barn << G4endl;
115 }
116 return xs;
117}
118
119G4double
120G4CHIPSElasticXS::GetIsoCrossSection(const G4DynamicParticle* p,
121 const G4Isotope* iso,
122 G4double)
123{
124 return GetZandACrossSection(p, iso->GetZ(), iso->GetN());
125}
126
127G4double
128G4CHIPSElasticXS::GetIsoZACrossSection(const G4DynamicParticle* p,
129 G4double ZZ,
130 G4double AA,
131 G4double)
132{
133 return GetZandACrossSection(p, G4int(ZZ), G4int(AA));
134}
135
136G4double
137G4CHIPSElasticXS::GetZandACrossSection(const G4DynamicParticle* dyn,
138 G4int Z, G4int A, G4double)
139{
140 G4double momentum = dyn->GetTotalMomentum();
141
142 // only proton, deuteron and He4 x-sections
143 G4int N = A - Z;
144 if(Z == 1) {
145 if(N > 1) { N = 1; }
146 } else if(Z == 2) { N = 2; }
147
148 G4double x = 0.0;
149 if(theParticle == theProton) {
150 x = pCManager->GetCrossSection(false,momentum,Z,N,pPDG);
151 } else {
152 x = nCManager->GetCrossSection(false,momentum,Z,N,pPDG);
153 }
154 return x;
155}
156
157void
158G4CHIPSElasticXS::BuildPhysicsTable(const G4ParticleDefinition& p)
159{
160 if(isInitialized) { return; }
161 if(verboseLevel > 0){
162 G4cout << "G4CHIPSElasticXS::BuildPhysicsTable for "
163 << p.GetParticleName()
164 << " Elow(MeV)= " << thEnergy/MeV
165 << G4endl;
166 }
167 isInitialized = true;
168 theParticle = &p;
169 if(theParticle != theProton && theParticle != theNeutron) {
170 G4cout << "G4CHIPSElasticXS::BuildPhysicsTable ERROR for "
171 << p.GetParticleName()
172 << G4endl;
173 G4Exception("G4CHIPSElasticXS", "", FatalException,"Not applicable");
174 }
175 pPDG = theParticle->GetPDGEncoding();
176}
177
178void
179G4CHIPSElasticXS::DumpPhysicsTable(const G4ParticleDefinition&)
180{}
181
Note: See TracBrowser for help on using the repository browser.