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
G4QAntiBaryonNuclearCrossSection.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//
27// The lust update: M.V. Kossov, CERN/ITEP(Moscow) 17-June-02
28// GEANT4 tag $Name: not supported by cvs2svn $
29//
30//
31// G4 Physics class: G4QAntiBaryonNuclearCrossSection for gamma+A cross sections
32// Created: M.V. Kossov, CERN/ITEP(Moscow), 20-Dec-03
33// The last update: M.V. Kossov, CERN/ITEP (Moscow) 15-Feb-04
34// --------------------------------------------------------------------------------
35// ****************************************************************************************
36// This Header is a part of the CHIPS physics package (author: M. Kosov)
37// ****************************************************************************************
38// Short description: CHIPS cross-sections for AntiBaryon(minus&zero)-nuclear interactions
39// ----------------------------------------------------------------------------------------
40//
41//#define debug
42//#define pdebug
43//#define debug3
44//#define debugn
45//#define debugs
46
48#include "G4SystemOfUnits.hh"
49
50// Initialization of the
51G4double* G4QAntiBaryonNuclearCrossSection::lastLEN=0; // Pointer to lastArray of LowEn CS
52G4double* G4QAntiBaryonNuclearCrossSection::lastHEN=0; // Pointer to lastArray of HighEn CS
53G4int G4QAntiBaryonNuclearCrossSection::lastN=0; // The last N of calculated nucleus
54G4int G4QAntiBaryonNuclearCrossSection::lastZ=0; // The last Z of calculated nucleus
55G4double G4QAntiBaryonNuclearCrossSection::lastP=0.; // Last used Cross Section Momentum
56G4double G4QAntiBaryonNuclearCrossSection::lastTH=0.; // Last threshold momentum
57G4double G4QAntiBaryonNuclearCrossSection::lastCS=0.; // Last value of the Cross Section
58G4int G4QAntiBaryonNuclearCrossSection::lastI=0; // The last position in the DAMDB
59std::vector<G4double*>* G4QAntiBaryonNuclearCrossSection::LEN = new std::vector<G4double*>;
60std::vector<G4double*>* G4QAntiBaryonNuclearCrossSection::HEN = new std::vector<G4double*>;
61
62// Returns Pointer to the G4VQCrossSection class
64{
65 static G4QAntiBaryonNuclearCrossSection theCrossSection; //*Static body of Cross Section*
66 return &theCrossSection;
67}
68
70{
71 G4int lens=LEN->size();
72 for(G4int i=0; i<lens; ++i) delete[] (*LEN)[i];
73 delete LEN;
74 G4int hens=HEN->size();
75 for(G4int i=0; i<hens; ++i) delete[] (*HEN)[i];
76 delete HEN;
77}
78
79// The main member function giving the collision cross section (P is in IU, CS is in mb)
80// Make pMom in independent units ! (Now it is MeV)
82 G4int tgZ, G4int tgN, G4int PDG)
83{
84 //A.R.23-Oct-2012 Shadowed variable static G4double tolerance=0.001; // Tolerance (0.1%) to consider as "the same mom"
85 static G4int j; // A#0f Z/N-records already tested in AMDB
86 static std::vector <G4int> colN; // Vector of N for calculated nuclei (isotops)
87 static std::vector <G4int> colZ; // Vector of Z for calculated nuclei (isotops)
88 static std::vector <G4double> colP; // Vector of last momenta for the reaction
89 static std::vector <G4double> colTH; // Vector of energy thresholds for the reaction
90 static std::vector <G4double> colCS; // Vector of last cross sections for the reaction
91 // ***---*** End of the mandatory Static Definitions of the Associative Memory ***---***
92#ifdef debug
93 G4cout<<"G4QaBCS::GetCS:>>> f="<<fCS<<", p="<<pMom<<", Z="<<tgZ<<"("<<lastZ<<") ,N="<<tgN
94 <<"("<<lastN<<"),PDG="<<PDG<<", thresh="<<lastTH<<",Sz="<<colN.size()<<G4endl;
95#endif
96 if(PDG>-2111 || PDG==-3112 || PDG==-3312 || PDG==-3334)
97 G4cout<<"-Warning-G4QAntiBaryonCS::GetCS: Not Negat/Zero AntiBaryon,PDG="<<PDG<<G4endl;
98 G4bool in=false; // By default the isotope must be found in the AMDB
99 if(tgN!=lastN || tgZ!=lastZ) // The nucleus was not the last used isotope
100 {
101 in = false; // By default the isotope haven't be found in AMDB
102 lastP = 0.; // New momentum history (nothing to compare with)
103 lastN = tgN; // The last N of the calculated nucleus
104 lastZ = tgZ; // The last Z of the calculated nucleus
105 lastI = colN.size(); // Size of the Associative Memory DB in the heap
106 j = 0; // A#0f records found in DB for this projectile
107#ifdef debug
108 G4cout<<"G4QaBarNucCS::GetCS: the amount of records in the AMDB lastI="<<lastI<<G4endl;
109#endif
110 if(lastI) for(G4int i=0; i<lastI; i++) // AMDB exists, try to find the (Z,N) isotope
111 {
112 if(colN[i]==tgN && colZ[i]==tgZ) // Try the record "i" in the AMDB
113 {
114 lastI=i; // Remember the index for future fast/last use
115 lastTH =colTH[i]; // The last THreshold (A-dependent)
116#ifdef debug
117 G4cout<<"G4QaBCS::GetCS:*Found* P="<<pMom<<",Threshold="<<lastTH<<",j="<<j<<G4endl;
118#endif
119 if(pMom<=lastTH)
120 {
121#ifdef debug
122 G4cout<<"G4QPCS::GetCS:Found,P="<<pMom<<" < Threshold="<<lastTH<<",CS=0"<<G4endl;
123#endif
124 return 0.; // Energy is below the Threshold value
125 }
126 lastP =colP [i]; // Last Momentum (A-dependent)
127 lastCS =colCS[i]; // Last CrossSect (A-dependent)
128 if(std::fabs(lastP-pMom)<tolerance*pMom)
129 //if(lastP==pMom) // VI do not use tolerance
130 {
131#ifdef debug
132 G4cout<<"..G4QaBCS::GetCS:.DoNothing.P="<<pMom<<",CS="<<lastCS*millibarn<<G4endl;
133#endif
134 //CalculateCrossSection(fCS,-1,j,PDG,lastZ,lastN,pMom); // Update param's only
135 return lastCS*millibarn; // Use theLastCS
136 }
137 in = true; // This is the case when the isotop is found in DB
138 // Momentum pMom is in IU ! @@ Units
139#ifdef debug
140 G4cout<<"G4QaBCS::G:UpdatDB P="<<pMom<<",f="<<fCS<<",lI="<<lastI<<",j="<<j<<G4endl;
141#endif
142 lastCS=CalculateCrossSection(fCS,-1,j,PDG,lastZ,lastN,pMom); // read & update
143#ifdef debug
144 G4cout<<"G4QaBCS::GetCrosSec: *****> New (inDB) Calculated CS="<<lastCS<<G4endl;
145#endif
146 if(lastCS<=0. && pMom>lastTH) // Correct the threshold (@@ No intermediate Zeros)
147 {
148#ifdef debug
149 G4cout<<"G4QaBNucCS::GetCS: New P="<<pMom<<"(CS=0) > Threshold="<<lastTH<<G4endl;
150#endif
151 lastCS=0.;
152 lastTH=pMom;
153 }
154 break; // Go out of the LOOP
155 }
156#ifdef debug
157 G4cout<<"-->G4QaBNucCrossSec::GetCrosSec: pPDG="<<PDG<<", j="<<j<<", N="<<colN[i]
158 <<",Z["<<i<<"]="<<colZ[i]<<G4endl;
159#endif
160 j++; // Increment a#0f records found in DB
161 }
162#ifdef debug
163 G4cout<<"-?-G4QaBCS::GetCS:RC Z="<<tgZ<<",N="<<tgN<<",in="<<in<<",j="<<j<<" ?"<<G4endl;
164#endif
165 if(!in) // This isotope has not been calculated previously
166 {
167#ifdef debug
168 G4cout<<"^^^G4QaBCS::GetCS:CalcNew P="<<pMom<<", f="<<fCS<<", lastI="<<lastI<<G4endl;
169#endif
170 //!!The slave functions must provide cross-sections in millibarns (mb) !! (not in IU)
171 lastCS=CalculateCrossSection(fCS,0,j,PDG,lastZ,lastN,pMom); //calculate & create
172 //if(lastCS>0.) // It means that the AMBD was initialized
173 //{
174
175 lastTH = ThresholdEnergy(tgZ, tgN); // The Threshold Energy which is now the last
176#ifdef debug
177 G4cout<<"G4QaBCrossSection::GetCrossSect: NewThresh="<<lastTH<<",P="<<pMom<<G4endl;
178#endif
179 colN.push_back(tgN);
180 colZ.push_back(tgZ);
181 colP.push_back(pMom);
182 colTH.push_back(lastTH);
183 colCS.push_back(lastCS);
184#ifdef debug
185 G4cout<<"G4QaBCS::GetCrosSec:recCS="<<lastCS<<",lZ="<<lastN<<",lN="<<lastZ<<G4endl;
186#endif
187 //} // M.K. Presence of H1 with high threshold breaks the syncronization
188#ifdef pdebug
189 G4cout<<"G4QaBCS::GetCS:1st,P="<<pMom<<"(MeV),CS="<<lastCS*millibarn<<"(mb)"<<G4endl;
190#endif
191 return lastCS*millibarn;
192 } // End of creation of the new set of parameters
193 else
194 {
195#ifdef debug
196 G4cout<<"G4QAntiBaryNucCrossSection::GetCS: Update lastI="<<lastI<<",j="<<j<<G4endl;
197#endif
198 colP[lastI]=pMom;
199 colCS[lastI]=lastCS;
200 }
201 } // End of parameters udate
202 else if(pMom<=lastTH)
203 {
204#ifdef debug
205 G4cout<<"G4QaBNCS::GetCS: Current P="<<pMom<<" < Threshold="<<lastTH<<", CS=0"<<G4endl;
206#endif
207 return 0.; // Momentum is below the Threshold Value -> CS=0
208 }
209 else if(std::fabs(lastP-pMom)<tolerance*pMom)
210 //else if(lastP==pMom) // VI do not use tolerance
211 {
212#ifdef debug
213 G4cout<<"..G4QPCS::GetCS:OldNZ&P="<<lastP<<"="<<pMom<<",CS="<<lastCS*millibarn<<G4endl;
214#endif
215 return lastCS*millibarn; // Use theLastCS
216 }
217 else // It is the last used -> use the current tables
218 {
219#ifdef debug
220 G4cout<<"-!-G4QPCS::GetCS:UseCur P="<<pMom<<",f="<<fCS<<",I="<<lastI<<",j="<<j<<G4endl;
221#endif
222 lastCS=CalculateCrossSection(fCS,1,j,PDG,lastZ,lastN,pMom); // Only read and UpdateDB
223 lastP=pMom;
224 }
225#ifdef debug
226 G4cout<<"==>G4QaBCS::GetCroSec: P="<<pMom<<"(MeV),CS="<<lastCS*millibarn<<"(mb)"<<G4endl;
227#endif
228 return lastCS*millibarn;
229}
230
231// The main member function giving the gamma-A cross section (E in GeV, CS in mb)
233 G4int, G4int targZ, G4int targN, G4double Momentum)
234{
235 static const G4double THmin=27.; // default minimum Momentum (MeV/c) Threshold
236 static const G4double THmiG=THmin*.001; // minimum Momentum (GeV/c) Threshold
237 static const G4double dP=10.; // step for the LEN (Low ENergy) table MeV/c
238 static const G4double dPG=dP*.001; // step for the LEN (Low ENergy) table GeV/c
239 static const G4int nL=105; // A#of LEN points in E (step 10 MeV/c)
240 static const G4double Pmin=THmin+(nL-1)*dP; // minP for the HighE part with safety
241 static const G4double Pmax=227000.; // maxP for the HEN (High ENergy) part 227 GeV
242 static const G4int nH=224; // A#of HEN points in lnE
243 static const G4double milP=std::log(Pmin);// Low logarithm energy for the HEN part
244 static const G4double malP=std::log(Pmax);// High logarithm energy (each 2.75 percent)
245 static const G4double dlP=(malP-milP)/(nH-1); // Step in log energy in the HEN part
246 static const G4double milPG=std::log(.001*Pmin);// Low logarithmEnergy for HEN part GeV/c
247#ifdef debug
248 G4cout<<"G4QaBarNCS::CalCS:N="<<targN<<",Z="<<targZ<<",P="<<Momentum<<">"<<THmin<<G4endl;
249#endif
250 G4double sigma=0.;
251 if(F&&I) sigma=0.; // @@ *!* Fake line *!* to use F & I !!!Temporary!!!
252 //G4double A=targN+targZ; // A of the target
253#ifdef debug
254 G4cout<<"G4QaBarNucCS::CalCS: A="<<A<<",F="<<F<<",I="<<I<<",nL="<<nL<<",nH="<<nH<<G4endl;
255#endif
256 if(F<=0) // This isotope was not the last used isotop
257 {
258 if(F<0) // This isotope was found in DAMDB =-----=> RETRIEVE
259 {
260 G4int sync=LEN->size();
261 if(sync<=I) G4cerr<<"*!*G4QPiMinusNuclCS::CalcCrosSect:Sync="<<sync<<"<="<<I<<G4endl;
262 lastLEN=(*LEN)[I]; // Pointer to prepared LowEnergy cross sections
263 lastHEN=(*HEN)[I]; // Pointer to prepared High Energy cross sections
264 }
265 else // This isotope wasn't calculated before => CREATE
266 {
267 lastLEN = new G4double[nL]; // Allocate memory for the new LEN cross sections
268 lastHEN = new G4double[nH]; // Allocate memory for the new HEN cross sections
269 // --- Instead of making a separate function ---
270 G4double P=THmiG; // Table threshold in GeV/c
271 for(G4int n=0; n<nL; n++)
272 {
273 lastLEN[n] = CrossSectionLin(targZ, targN, P);
274 P+=dPG;
275 }
276 G4double lP=milPG;
277 for(G4int n=0; n<nH; n++)
278 {
279 lastHEN[n] = CrossSectionLog(targZ, targN, lP);
280 lP+=dlP;
281 }
282#ifdef debug
283 G4cout<<"-*->G4QaBarNucCS::CalcCS:Tab for Z="<<targZ<<",N="<<targN<<",I="<<I<<G4endl;
284#endif
285 // --- End of possible separate function
286 // *** The synchronization check ***
287 G4int sync=LEN->size();
288 if(sync!=I)
289 {
290 G4cerr<<"***G4QPiMinusNuclCS::CalcCrossSect: Sinc="<<sync<<"#"<<I<<", Z=" <<targZ
291 <<", N="<<targN<<", F="<<F<<G4endl;
292 //G4Exception("G4PiMinusNuclearCS::CalculateCS:","39",FatalException,"DBoverflow");
293 }
294 LEN->push_back(lastLEN); // remember the Low Energy Table
295 HEN->push_back(lastHEN); // remember the High Energy Table
296 } // End of creation of the new set of parameters
297 } // End of parameters udate
298 // =-------------------= NOW the Magic Formula =--------------------=
299#ifdef debug
300 G4cout<<"G4QaBNCS::CalcCS:lTH="<<lastTH<<",Pmi="<<Pmin<<",dP="<<dP<<",dlP="<<dlP<<G4endl;
301#endif
302 if (Momentum<lastTH) return 0.; // It must be already checked in the interface class
303 else if (Momentum<Pmin) // High Energy region
304 {
305#ifdef debug
306 G4cout<<"G4QaBNCS::CalcCS:bLEN nL="<<nL<<",TH="<<THmin<<",dP="<<dP<<G4endl;
307#endif
308 sigma=EquLinearFit(Momentum,nL,THmin,dP,lastLEN);
309#ifdef debugn
310 if(sigma<0.)
311 G4cout<<"G4QaBNuCS::CalcCS: E="<<Momentum<<",T="<<THmin<<",dP="<<dP<<G4endl;
312#endif
313 }
314 else if (Momentum<Pmax) // High Energy region
315 {
316 G4double lP=std::log(Momentum);
317#ifdef debug
318 G4cout<<"G4QaBarNucCS::CalcCS: before HEN nH="<<nH<<",iE="<<milP<<",dlP="<<dlP<<G4endl;
319#endif
320 sigma=EquLinearFit(lP,nH,milP,dlP,lastHEN);
321 }
322 else // UHE region (calculation, not frequent)
323 {
324 G4double P=0.001*Momentum; // Approximation formula is for P in GeV/c
325 sigma=CrossSectionFormula(targZ, targN, P, std::log(P));
326 }
327#ifdef debug
328 G4cout<<"G4QAntiBaryonNuclearCrossSection::CalcCS: CS="<<sigma<<G4endl;
329#endif
330 if(sigma<0.) return 0.;
331 return sigma;
332}
333
334// Calculation formula for piMinus-nuclear inelastic cross-section (mb) (P in GeV/c)
335G4double G4QAntiBaryonNuclearCrossSection::CrossSectionLin(G4int tZ, G4int tN, G4double P)
336{
337 G4double lP=std::log(P);
338 return CrossSectionFormula(tZ, tN, P, lP);
339}
340
341// Calculation formula for piMinus-nuclear inelastic cross-section (mb) log(P in GeV/c)
342G4double G4QAntiBaryonNuclearCrossSection::CrossSectionLog(G4int tZ, G4int tN, G4double lP)
343{
344 G4double P=std::exp(lP);
345 return CrossSectionFormula(tZ, tN, P, lP);
346}
347// Calculation formula for piMinus-nuclear inelastic cross-section (mb) log(P in GeV/c)
348G4double G4QAntiBaryonNuclearCrossSection::CrossSectionFormula(G4int tZ, G4int tN,
349 G4double P, G4double lP)
350{
351 G4double sigma=0.;
352 if(tZ==1 && !tN) // AntiBar-Prot interaction from G4QuasiElRatios
353 {
354 G4double ld=lP-3.5;
355 G4double ld2=ld*ld;
356 G4double ye=std::exp(lP*1.25);
357 G4double yt=std::exp(lP*0.35);
358 G4double El=80./(ye+1.);
359 G4double To=(80./yt+.3)/yt;
360 sigma=(To-El)+.2443*ld2+31.48;
361 }
362 else if(tZ==1 && tN==1)
363 {
364 G4double r=lP-3.7;
365 sigma=0.6*r*r+67.+90.*std::exp(-lP*.666);
366 }
367 else if(tZ<97 && tN<152) // General solution
368 {
369 G4double d=lP-4.2;
370 G4double sp=std::sqrt(P);
371 G4double a=tN+tZ; // A of the target
372 G4double sa=std::sqrt(a);
373 G4double a2=a*a;
374 G4double a3=a2*a;
375 G4double a2s=a2*sa;
376 G4double c=(170.+3600./a2s)/(1.+65./a2s)+40.*std::pow(a,0.712)/(1.+12.2/a)/(1.+34./a2);
377 G4double r=(170.+0.01*a3)/(1.+a3/28000.);
378 sigma=c+d*d+r/sp;
379#ifdef pdebug
380 G4cout<<"G4QAntiBarNucCS::CSForm: A="<<a<<",P="<<P<<",CS="<<sigma<<",c="<<c<<",g="<<g
381 <<",d="<<d<<",r="<<r<<",e="<<e<<",h="<<h<<G4endl;
382#endif
383 }
384 else
385 {
386 G4cerr<<"-Warning-G4QAntiBarNuclearCroSect::CSForm:*Bad A* Z="<<tZ<<", N="<<tN<<G4endl;
387 sigma=0.;
388 }
389 if(sigma<0.) return 0.;
390 return sigma;
391}
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 G4cerr
G4DLLIMPORT std::ostream G4cout
G4double CalculateCrossSection(G4bool CS, G4int F, G4int I, G4int PDG, G4int Z, G4int N, G4double Momentum)
virtual G4double GetCrossSection(G4bool fCS, G4double pMom, G4int tgZ, G4int tgN, G4int pPDG=-2212)
G4double EquLinearFit(G4double X, G4int N, G4double X0, G4double DX, G4double *Y)
virtual G4double ThresholdEnergy(G4int Z, G4int N, G4int PDG=0)
static G4double tolerance