Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4ElasticHadrNucleusHE.hh
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//
27// $Id$
28//
29// G4ElasticHadrNucleusHe.hh
30
31// The generator of high energy hadron-nucleus elastic scattering
32// The hadron kinetic energy T > 1 GeV
33// N. Starkov 2003.
34//
35// 19.05.04 Variant for G4 6.1: The 'ApplyYourself' was changed
36// 19.11.05 The HE elastic scattering on proton is added (N.Starkov)
37// 16.11.06 General redesign (N.Starkov)
38// 23.11.06 General cleanup, ONQ0=3 (V.Ivanchenko)
39// 15.05.07 Redesign and cleanup (V.Ivanchenko)
40// 18.05.07 Cleanup (V.Grichine)
41// 19.04.12 Fixed reproducibility violation (A.Ribon)
42// 12.06.12 Fixed warnings of shadowed variables (A.Ribon)
43//
44
45#ifndef G4ElasticHadrNucleusHE_h
46#define G4ElasticHadrNucleusHE_h 1
47
48#include <vector>
49
50#include "globals.hh"
52#include "G4ParticleChange.hh"
53#include "G4Nucleus.hh"
54#include "G4HadronElastic.hh"
55
56class G4NistManager;
57
58static const G4int NHADRONS = 26; // Number of hadrons for which model is applied
59static const G4int ONQ0 = 5; // The initial number of steps on Q2
60static const G4int ONQ2 = 100; // The total number of steps on Q2
61static const G4int NENERGY = 30;
62static const G4int NQTABLE = NENERGY*ONQ2;
63
64
65///////////////////////////////////////////////////////////////////////
66//
67//
68
70{
71public:
72
74 G4int Z, G4double A, G4double* eGeV);
75
77
78 const G4ParticleDefinition* Hadron() {return hadr;}
79
80private:
81 void DefineNucleusParameters(G4double A);
82 const G4ParticleDefinition* hadr;
83
84 // hide assignment operator
85 G4ElasticData & operator=(const G4ElasticData &right);
87
88public:
96 G4int dnkE[NENERGY];
97 G4double maxQ2[NENERGY];
98 //G4double CrossSecMaxQ2[NENERGY];
99
102};
103
104/////////////////////////////////////////////////////////////////////
105//
106//
107
109{
110public:
111
112 G4ElasticHadrNucleusHE(const G4String& name = "hElasticGlauber");
113
114 virtual ~G4ElasticHadrNucleusHE();
115
117 G4double plab,
118 G4int Z, G4int A);
119
120 virtual void Description() const;
121
123 G4double plab,
124 G4int Z, G4int A);
125
127 G4double plabGeV, G4double tmax);
128
130
132 G4double GetHeavyFq2(G4int Z, G4int Nucleus, G4double *LineFq2);
133
135 G4double * F, G4double R);
136
138 G4double c1, G4double c2,
139 G4double p);
140
142
143 void InterpolateHN(G4int n, const G4double EnP[],
144 const G4double C0P[], const G4double C1P[],
145 const G4double B0P[], const G4double B1P[]);
146
147 // hide assignment operator
150
152
154
156
158
160 G4double inLabMom);
161
162 void GetKinematics(const G4ParticleDefinition * aHadron,
163 G4double MomentumH);
164private:
165
166 void Binom();
167
168 // fields
169
170 G4int iHadrCode;
171 G4int iHadron;
172 G4int HadronCode[NHADRONS];
173 G4int HadronType[NHADRONS];
174 G4int HadronType1[NHADRONS];
175
176 // protection energy and momemtum
177
178 G4double lowestEnergyLimit;
179 G4double plabLowLimit;
180 G4double dQ2;
181
182 // transition between internal and CLHEP units
183
184 G4double MbToGeV2;
185 G4double sqMbToGeV;
186 G4double Fm2ToGeV2;
187 G4double GeV2;
188 G4double protonM; // GeV
189 G4double protonM2; // GeV^2
190
191 // projectile kinematics in GeV
192
193 G4double hMass;
194 G4double hMass2;
195 G4double hLabMomentum;
196 G4double hLabMomentum2;
197 G4double MomentumCM;
198 G4double HadrEnergy;
199
200 // nucleaus parameters
201
202 G4double R1, R2, Pnucl, Aeff;
203 G4int NumbN;
204
205 // elastic parameters
206
207 G4double HadrTot, HadrSlope, HadrReIm, TotP,
208 DDSect2, DDSect3, ConstU, FmaxT;
209
210 // momentum limits for different models of hadron/nucleon scatetring
211 G4double BoundaryP[7], BoundaryTL[7], BoundaryTG[7];
212
213 // parameterisation of scattering
214
215 G4double Slope1, Slope2, Coeff1, Coeff2, MaxTR;
216 G4double Slope0, Coeff0;
217
218 G4double aAIm, aDIm, Dtot11;
219
220 G4double Energy[NENERGY];
221 G4double LowEdgeEnergy[NENERGY];
222
223 G4double SetBinom[240][240];
224
225 G4ElasticData* SetOfElasticData[NHADRONS][93];
226 G4NistManager* nistManager;
227
228}; // The end of the class description
229
230////////////////////////////////////////////////////////////////
231
232inline
234 G4double c1, G4double c2,
235 G4double p)
236{
237// G4cout<<" LineInterpol: p1 p2 c1 c2 "<<p1<<" "<<p2<<" "
238// <<c1<<" "<<c2<<" c "<<c1+(p-p1)*(c2-c1)/(p2-p1)<<G4endl;
239
240
241 return c1+(p-p1)*(c2-c1)/(p2-p1);
242}
243
244////////////////////////////////////////////////////////////////
245
246inline
248 const G4double C0P[], const G4double C1P[],
249 const G4double B0P[], const G4double B1P[])
250{
251 G4int i;
252
253 for(i=1; i<n; i++) if(hLabMomentum <= EnP[i]) break;
254
255 if(i == n) i = n - 1;
256
257 Coeff0 = LineInterpol(EnP[i], EnP[i-1], C0P[i], C0P[i-1], hLabMomentum);
258 Coeff1 = LineInterpol(EnP[i], EnP[i-1], C1P[i], C1P[i-1], hLabMomentum);
259 Slope0 = LineInterpol(EnP[i], EnP[i-1], B0P[i], B0P[i-1], hLabMomentum);
260 Slope1 = LineInterpol(EnP[i], EnP[i-1], B1P[i], B1P[i-1], hLabMomentum);
261
262// G4cout<<" InterpolHN: n i "<<n<<" "<<i<<" Mom "
263// <<hLabMomentum<<G4endl;
264}
265
266////////////////////////////////////////////////////////////////
267
268inline
270{
271 if ( numN >= numM && numN <= 240) return SetBinom[numN][numM];
272 else return 0.;
273}
274
275////////////////////////////////////////////////////////////////
276
277inline
279{
280 return GetFt(Q2)/FmaxT;
281}
282
283#endif
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
G4double TableQ2[ONQ2]
const G4ParticleDefinition * Hadron()
G4double TableCrossSec[NQTABLE]
G4double maxQ2[NENERGY]
void InterpolateHN(G4int n, const G4double EnP[], const G4double C0P[], const G4double C1P[], const G4double B0P[], const G4double B1P[])
virtual void Description() const
G4double LineInterpol(G4double p0, G4double p2, G4double c1, G4double c2, G4double p)
virtual G4double SampleInvariantT(const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
G4double HadronNucleusQ2_2(G4ElasticData *pElD, G4int Z, G4double plabGeV, G4double tmax)
G4double HadronProtonQ2(const G4ParticleDefinition *aHadron, G4double inLabMom)
G4double HadrNucDifferCrSec(G4int Z, G4int Nucleus, G4double Q2)
G4double GetDistrFun(G4double Q2)
G4double GetQ2(G4double Ran)
void GetKinematics(const G4ParticleDefinition *aHadron, G4double MomentumH)
G4double GetLightFq2(G4int Z, G4int A, G4double Q)
G4ElasticHadrNucleusHE & operator=(const G4ElasticHadrNucleusHE &right)
G4double GetQ2_2(G4int N, G4double *Q, G4double *F, G4double R)
G4double GetBinomCof(G4int n, G4int m)
G4ElasticHadrNucleusHE(const G4ElasticHadrNucleusHE &)
G4double GetHeavyFq2(G4int Z, G4int Nucleus, G4double *LineFq2)
G4double SampleT(const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)