Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4QHyperonNuclearCrossSection Class Reference

#include <G4QHyperonNuclearCrossSection.hh>

+ Inheritance diagram for G4QHyperonNuclearCrossSection:

Public Member Functions

 ~G4QHyperonNuclearCrossSection ()
 
virtual G4double GetCrossSection (G4bool fCS, G4double pMom, G4int tgZ, G4int tgN, G4int pPDG=3122)
 
G4double CalculateCrossSection (G4bool CS, G4int F, G4int I, G4int PDG, G4int Z, G4int N, G4double Momentum)
 
- Public Member Functions inherited from G4VQCrossSection
virtual ~G4VQCrossSection ()
 
virtual G4double GetCrossSection (G4bool, G4double, G4int, G4int, G4int pPDG=0)
 
virtual G4double ThresholdEnergy (G4int Z, G4int N, G4int PDG=0)
 
virtual G4double CalculateCrossSection (G4bool CS, G4int F, G4int I, G4int PDG, G4int tgZ, G4int tgN, G4double pMom)=0
 
virtual G4double GetLastTOTCS ()
 
virtual G4double GetLastQELCS ()
 
virtual G4double GetDirectPart (G4double Q2)
 
virtual G4double GetNPartons (G4double Q2)
 
virtual G4double GetExchangeEnergy ()
 
virtual G4double GetExchangeT (G4int tZ, G4int tN, G4int pPDG)
 
virtual G4double GetSlope (G4int tZ, G4int tN, G4int pPDG)
 
virtual G4double GetHMaxT ()
 
virtual G4double GetExchangeQ2 (G4double nu=0)
 
virtual G4double GetVirtualFactor (G4double nu, G4double Q2)
 
virtual G4double GetQEL_ExchangeQ2 ()
 
virtual G4double GetNQE_ExchangeQ2 ()
 
virtual G4int GetExchangePDGCode ()
 

Static Public Member Functions

static G4VQCrossSectionGetPointer ()
 
- Static Public Member Functions inherited from G4VQCrossSection
static void setTolerance (G4double tol)
 

Protected Member Functions

 G4QHyperonNuclearCrossSection ()
 
- Protected Member Functions inherited from G4VQCrossSection
 G4VQCrossSection ()
 
G4double LinearFit (G4double X, G4int N, G4double *XN, G4double *YN)
 
G4double EquLinearFit (G4double X, G4int N, G4double X0, G4double DX, G4double *Y)
 

Additional Inherited Members

- Static Protected Attributes inherited from G4VQCrossSection
static G4double tolerance =.001
 

Detailed Description

Definition at line 50 of file G4QHyperonNuclearCrossSection.hh.

Constructor & Destructor Documentation

◆ G4QHyperonNuclearCrossSection()

G4QHyperonNuclearCrossSection::G4QHyperonNuclearCrossSection ( )
inlineprotected

Definition at line 54 of file G4QHyperonNuclearCrossSection.hh.

54{}

◆ ~G4QHyperonNuclearCrossSection()

G4QHyperonNuclearCrossSection::~G4QHyperonNuclearCrossSection ( )

Definition at line 69 of file G4QHyperonNuclearCrossSection.cc.

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}
int G4int
Definition: G4Types.hh:66

Member Function Documentation

◆ CalculateCrossSection()

G4double G4QHyperonNuclearCrossSection::CalculateCrossSection ( G4bool  CS,
G4int  F,
G4int  I,
G4int  PDG,
G4int  Z,
G4int  N,
G4double  Momentum 
)
virtual

Implements G4VQCrossSection.

Definition at line 232 of file G4QHyperonNuclearCrossSection.cc.

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<<"G4QHyNucCS::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<<"G4QHypNucCS::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<<"-*->G4QHypNucCS::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<<"***G4QHyperNuclCS::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<<"G4QHyNCS::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<<"G4QHyNCS::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<<"G4QHyNuCS::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<<"G4QHyNucCS::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<<"G4QHyperonNuclearCrossSection::CalcCS: CS="<<sigma<<G4endl;
329#endif
330 if(sigma<0.) return 0.;
331 return sigma;
332}
double G4double
Definition: G4Types.hh:64
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
G4double EquLinearFit(G4double X, G4int N, G4double X0, G4double DX, G4double *Y)

Referenced by GetCrossSection().

◆ GetCrossSection()

G4double G4QHyperonNuclearCrossSection::GetCrossSection ( G4bool  fCS,
G4double  pMom,
G4int  tgZ,
G4int  tgN,
G4int  pPDG = 3122 
)
virtual

!The slave functions must provide cross-sections in millibarns (mb) !! (not in IU)

Reimplemented from G4VQCrossSection.

Definition at line 81 of file G4QHyperonNuclearCrossSection.cc.

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<<"G4QHyCS::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!=3122 && PDG!=3212 && PDG!=3112 && PDG!=3322 && PDG!=3312 && PDG!=3334)
97 G4cout<<"-Warning-G4QHyperonCS::GetCS:Not a Zero or Negative Hyperon,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<<"G4QHyCS::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<<"G4QHyCS::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<<"..G4QHyCS::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<<"G4QHyCS::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<<"G4QHyCS::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<<"G4QHyCS::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<<"-->G4QHyCrossSec::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<<"-?-G4QHyCS::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<<"^^^G4QHyCS::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<<"G4QHyCrossSection::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<<"G4QHyCS::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<<"G4QHyCS::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<<"G4QHyCS::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<<"G4QHyCS::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<<".G4QHyCS::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<<"!-G4QHyCS::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<<"==>G4QHyCS::GetCroSec: P="<<pMom<<"(MeV),CS="<<lastCS*millibarn<<"(mb)"<<G4endl;
227#endif
228 return lastCS*millibarn;
229}
bool G4bool
Definition: G4Types.hh:67
G4double CalculateCrossSection(G4bool CS, G4int F, G4int I, G4int PDG, G4int Z, G4int N, G4double Momentum)
virtual G4double ThresholdEnergy(G4int Z, G4int N, G4int PDG=0)
static G4double tolerance

◆ GetPointer()

G4VQCrossSection * G4QHyperonNuclearCrossSection::GetPointer ( )
static

Definition at line 63 of file G4QHyperonNuclearCrossSection.cc.

64{
65 static G4QHyperonNuclearCrossSection theCrossSection; //**Static body of Cross Section**
66 return &theCrossSection;
67}

Referenced by G4QHadronInelasticDataSet::GetIsoCrossSection(), and G4QInelastic::GetMeanFreePath().


The documentation for this class was generated from the following files: