Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/cross_sections/src/G4ChipsKaonPlusInelasticXS.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /processes/hadronic/cross_sections/src/G4ChipsKaonPlusInelasticXS.cc (Version 11.3.0) and /processes/hadronic/cross_sections/src/G4ChipsKaonPlusInelasticXS.cc (Version 4.0.p2)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 //                                                
 27 // The lust update: M.V. Kossov, CERN/ITEP(Mos    
 28 //                                                
 29 //                                                
 30 // G4 Physics class: G4QKaonPlusNuclearCrossSe    
 31 // Created: M.V. Kossov, CERN/ITEP(Moscow), 20    
 32 // The last update: M.V. Kossov, CERN/ITEP (Mo    
 33 //                                                
 34 // -------------------------------------------    
 35 // Short description: Cross-sections extracted    
 36 // kaon(minus)-nuclear interactions. Author: M    
 37 // -------------------------------------------    
 38 //                                                
 39                                                   
 40 #include "G4ChipsKaonPlusInelasticXS.hh"          
 41 #include "G4SystemOfUnits.hh"                     
 42 #include "G4DynamicParticle.hh"                   
 43 #include "G4ParticleDefinition.hh"                
 44 #include "G4KaonPlus.hh"                          
 45 #include "G4Proton.hh"                            
 46 #include "G4PionPlus.hh"                          
 47 #include "G4AutoLock.hh"                          
 48                                                   
 49 // factory                                        
 50 #include "G4CrossSectionFactory.hh"               
 51 //                                                
 52 G4_DECLARE_XS_FACTORY(G4ChipsKaonPlusInelastic    
 53                                                   
 54 namespace {                                       
 55     const G4double THmin=27.;     // default m    
 56     const G4double THmiG=THmin*.001; // minimu    
 57     const G4double dP=10.;        // step for     
 58     const G4double dPG=dP*.001;   // step for     
 59     const G4int    nL=105;        // A#of LEN     
 60     const G4double Pmin=THmin+(nL-1)*dP; // mi    
 61     const G4double Pmax=227000.;  // maxP for     
 62     const G4int    nH=224;        // A#of HEN     
 63     const G4double milP=std::log(Pmin);// Low     
 64     const G4double malP=std::log(Pmax);// High    
 65     const G4double dlP=(malP-milP)/(nH-1); //     
 66     const G4double milPG=std::log(.001*Pmin);/    
 67     const G4double third=1./3.;                   
 68     G4Mutex initM = G4MUTEX_INITIALIZER;          
 69     G4double prM;// = G4Proton::Proton()->GetP    
 70     G4double piM;// = G4PionPlus::PionPlus()->    
 71     G4double pM;// =  G4KaonPlus::KaonPlus()->    
 72     G4double tpM;//= pM+pM;   // Doubled proje    
 73 }                                                 
 74                                                   
 75 G4ChipsKaonPlusInelasticXS::G4ChipsKaonPlusIne    
 76 {                                                 
 77   G4AutoLock l(&initM);                           
 78   prM = G4Proton::Proton()->GetPDGMass(); // P    
 79   piM = G4PionPlus::PionPlus()->GetPDGMass()+.    
 80   pM  = G4KaonPlus::KaonPlus()->GetPDGMass();     
 81   tpM = pM+pM;   // Doubled projectile mass (M    
 82   l.unlock();                                     
 83   // Initialization of the                        
 84   lastLEN=0; // Pointer to the lastArray of Lo    
 85   lastHEN=0; // Pointer to the lastArray of Hi    
 86   lastN=0;   // The last N of calculated nucle    
 87   lastZ=0;   // The last Z of calculated nucle    
 88   lastP=0.;  // Last used in cross section Mom    
 89   lastTH=0.; // Last threshold momentum           
 90   lastCS=0.; // Last value of the Cross Sectio    
 91   lastI=0;   // The last position in the DAMDB    
 92   LEN = new std::vector<G4double*>;               
 93   HEN = new std::vector<G4double*>;               
 94 }                                                 
 95                                                   
 96 G4ChipsKaonPlusInelasticXS::~G4ChipsKaonPlusIn    
 97 {                                                 
 98   std::size_t lens=LEN->size();                   
 99   for(std::size_t i=0; i<lens; ++i) delete[] (    
100   delete LEN;                                     
101                                                   
102   std::size_t hens=HEN->size();                   
103   for(std::size_t i=0; i<hens; ++i) delete[] (    
104   delete HEN;                                     
105 }                                                 
106                                                   
107 void                                              
108 G4ChipsKaonPlusInelasticXS::CrossSectionDescri    
109 {                                                 
110     outFile << "G4ChipsKaonPlusInelasticXS pro    
111             << "section for K+ nucleus scatter    
112             << "momentum. The cross section is    
113             << "CHIPS parameterization of cros    
114 }                                                 
115                                                   
116 G4bool G4ChipsKaonPlusInelasticXS::IsIsoApplic    
117          const G4Element*,                        
118          const G4Material*)                       
119 {                                                 
120   return true;                                    
121 }                                                 
122                                                   
123                                                   
124 // The main member function giving the collisi    
125 // Make pMom in independent units ! (Now it is    
126 G4double G4ChipsKaonPlusInelasticXS::GetIsoCro    
127               const G4Isotope*,                   
128               const G4Element*,                   
129               const G4Material*)                  
130 {                                                 
131   G4double pMom=Pt->GetTotalMomentum();           
132   G4int tgN = A - tgZ;                            
133                                                   
134   return GetChipsCrossSection(pMom, tgZ, tgN,     
135 }                                                 
136                                                   
137 G4double G4ChipsKaonPlusInelasticXS::GetChipsC    
138 {                                                 
139                                                   
140   G4bool in=false;                     // By d    
141   if(tgN!=lastN || tgZ!=lastZ)         // The     
142   {                                               
143     in = false;                        // By d    
144     lastP   = 0.;                      // New     
145     lastN   = tgN;                     // The     
146     lastZ   = tgZ;                     // The     
147     lastI   = (G4int)colN.size();      // Size    
148     j  = 0;                            // A#0f    
149                                                   
150     if(lastI) for(G4int i=0; i<lastI; ++i) //     
151     {                                             
152       if(colN[i]==tgN && colZ[i]==tgZ) // Try     
153       {                                           
154         lastI=i;                       // Reme    
155         lastTH =colTH[i];              // The     
156                                                   
157         if(pMom<=lastTH)                          
158         {                                         
159           return 0.;                   // Ener    
160         }                                         
161         lastP  =colP [i];              // Last    
162         lastCS =colCS[i];              // Last    
163         in = true;                     // This    
164         // Momentum pMom is in IU ! @@ Units      
165         lastCS=CalculateCrossSection(-1,j,321,    
166                                                   
167         if(lastCS<=0. && pMom>lastTH)  // Corr    
168         {                                         
169           lastCS=0.;                              
170           lastTH=pMom;                            
171         }                                         
172         break;                         // Go o    
173       }                                           
174       j++;                             // Incr    
175     }                                             
176     if(!in)                            // This    
177     {                                             
178       //!!The slave functions must provide cro    
179       lastCS=CalculateCrossSection(0,j,321,las    
180                                                   
181       //if(lastCS>0.)                   // It     
182       //{                                         
183                                                   
184       lastTH = 0; //ThresholdEnergy(tgZ, tgN);    
185         colN.push_back(tgN);                      
186         colZ.push_back(tgZ);                      
187         colP.push_back(pMom);                     
188         colTH.push_back(lastTH);                  
189         colCS.push_back(lastCS);                  
190       //} // M.K. Presence of H1 with high thr    
191       return lastCS*millibarn;                    
192     } // End of creation of the new set of par    
193     else                                          
194     {                                             
195       colP[lastI]=pMom;                           
196       colCS[lastI]=lastCS;                        
197     }                                             
198   } // End of parameters udate                    
199   else if(pMom<=lastTH)                           
200   {                                               
201     return 0.;                         // Mome    
202   }                                               
203   else                                 // It i    
204   {                                               
205     lastCS=CalculateCrossSection(1,j,321,lastZ    
206     lastP=pMom;                                   
207   }                                               
208   return lastCS*millibarn;                        
209 }                                                 
210                                                   
211 // The main member function giving the gamma-A    
212 G4double G4ChipsKaonPlusInelasticXS::Calculate    
213                                         G4int,    
214 {                                                 
215   G4double A=targN+targZ;              // A of    
216                                                   
217   if(F<=0)                             // This    
218   {                                               
219     if(F<0)                            // This    
220     {                                             
221       G4int sync=(G4int)LEN->size();              
222       if(sync<=I) G4cerr<<"*!*G4ChipsKPlusNucl    
223       lastLEN=(*LEN)[I];               // Poin    
224       lastHEN=(*HEN)[I];               // Poin    
225     }                                             
226     else                               // This    
227     {                                             
228       lastLEN = new G4double[nL];      // Allo    
229       lastHEN = new G4double[nH];      // Allo    
230       // --- Instead of making a separate func    
231       G4double P=THmiG;                // Tabl    
232       for(G4int k=0; k<nL; k++)                   
233       {                                           
234         lastLEN[k] = CrossSectionLin(targZ, ta    
235         P+=dPG;                                   
236       }                                           
237       G4double lP=milPG;                          
238       for(G4int n=0; n<nH; n++)                   
239       {                                           
240         lastHEN[n] = CrossSectionLog(targZ, ta    
241         lP+=dlP;                                  
242       }                                           
243       // --- End of possible separate function    
244       // *** The synchronization check ***        
245       G4int sync=(G4int)LEN->size();              
246       if(sync!=I)                                 
247       {                                           
248         G4cerr<<"***G4ChipsKPlusNuclCS::CalcCr    
249               <<", N="<<targN<<", F="<<F<<G4en    
250         //G4Exception("G4PiMinusNuclearCS::Cal    
251       }                                           
252       LEN->push_back(lastLEN);         // reme    
253       HEN->push_back(lastHEN);         // reme    
254     } // End of creation of the new set of par    
255   } // End of parameters udate                    
256   // =--------------------------= NOW the Magi    
257                                                   
258   G4double sigma;                                 
259   if (Momentum<lastTH) return 0.;      // It m    
260   else if (Momentum<Pmin)              // Low     
261   {                                               
262     if(A<=1. && Momentum < 600.) sigma=0.; //     
263     else sigma=EquLinearFit(Momentum,nL,THmin,    
264   }                                               
265   else if (Momentum<Pmax)              // High    
266   {                                               
267     G4double lP=std::log(Momentum);               
268     sigma=EquLinearFit(lP,nH,milP,dlP,lastHEN)    
269   }                                               
270   else                                 // UHE     
271   {                                               
272     G4double P=0.001*Momentum;         // Appr    
273     sigma=CrossSectionFormula(targZ, targN, P,    
274   }                                               
275   if(sigma<0.) return 0.;                         
276   return sigma;                                   
277 }                                                 
278                                                   
279 // Electromagnetic momentum-threshold (in MeV/    
280 G4double G4ChipsKaonPlusInelasticXS::Threshold    
281 {                                                 
282   G4double tA=tZ+tN;                              
283   if(tZ<.99 || tN<0.) return 0.;                  
284   G4double tM=931.5*tA;                           
285   G4double dE=piM;                    // At le    
286   if(tZ==1 && tN==0) tM=prM;          // A thr    
287   else dE=tZ/(1.+std::pow(tA,third)); // Safet    
288   //G4double dE=1.263*tZ/(1.+std::pow(tA,third    
289   G4double T=dE+dE*(dE/2+pM)/tM;                  
290   return std::sqrt(T*(tpM+T));                    
291 }                                                 
292                                                   
293 // Calculation formula for piMinus-nuclear ine    
294 G4double G4ChipsKaonPlusInelasticXS::CrossSect    
295 {                                                 
296   G4double lP=std::log(P);                        
297   return CrossSectionFormula(tZ, tN, P, lP);      
298 }                                                 
299                                                   
300 // Calculation formula for piMinus-nuclear ine    
301 G4double G4ChipsKaonPlusInelasticXS::CrossSect    
302 {                                                 
303   G4double P=std::exp(lP);                        
304   return CrossSectionFormula(tZ, tN, P, lP);      
305 }                                                 
306 // Calculation formula for piMinus-nuclear ine    
307 G4double G4ChipsKaonPlusInelasticXS::CrossSect    
308                                                   
309 {                                                 
310   G4double sigma=0.;                              
311   if(tZ==1 && !tN)                        // K    
312   {                                               
313     G4double ld=lP-3.5;                           
314     G4double ld2=ld*ld;                           
315     G4double sp=std::sqrt(P);                     
316     G4double p2=P*P;                              
317     G4double p4=p2*p2;                            
318     G4double lm=P-1.;                             
319     G4double md=lm*lm+.372;                       
320     G4double El=(.0557*ld2+2.23)/(1.-.7/sp+.1/    
321     G4double To=(.3*ld2+19.5)/(1.+.46/sp+1.6/p    
322     sigma=(To-El)+.6/md;                          
323   }                                               
324   else if(tZ<97 && tN<152)                // G    
325   {                                               
326     G4double p2=P*P;                              
327     G4double p4=p2*p2;                            
328     G4double a=tN+tZ;                       //    
329     G4double al=std::log(a);                      
330     G4double sa=std::sqrt(a);                     
331     G4double asa=a*sa;                            
332     G4double a2=a*a;                              
333     G4double a3=a2*a;                             
334     G4double a4=a2*a2;                            
335     G4double a8=a4*a4;                            
336     G4double a12=a8*a4;                           
337     G4double f=.6;                       // De    
338     G4double r=.5;                                
339     G4double gg=3.7;                              
340     G4double c=36.;                               
341     G4double ss=3.5;                              
342     G4double t=3.;                                
343     G4double u=.44;                               
344     G4double v=5.E-9;                             
345     if(tZ>1 && tN>1)                     // Mo    
346     {                                             
347       f=1.;                                       
348       r=1./(1.+.007*a2);                          
349       gg=4.2;                                     
350       c=52.*std::exp(al*.6)*(1.+95./a2)/(1.+9.    
351       ss=(40.+.14*a)/(1.+12./a);                  
352       G4double y=std::exp(al*1.7);                
353       t=.185*y/(1.+.00012*y);                     
354       u=(1.+80./asa)/(1.+200./asa);               
355       v=(1.+3.E-6*a4*(1.+6.E-7*a3+4.E10/a12))/    
356     }                                             
357     G4double d=lP-gg;                             
358     G4double w=P-1.;                              
359     G4double rD=ss/(w*w+.36);                     
360     G4double h=P-.44;                             
361     G4double rR=t/(h*h+u*u);                      
362     sigma=(f*d*d+c)/(1.+r/std::sqrt(P)+1./p4)+    
363   }                                               
364   else                                            
365   {                                               
366     G4cerr<<"-Warning-G4ChipsKaonPlusNuclearCr    
367     sigma=0.;                                     
368   }                                               
369   if(sigma<0.) return 0.;                         
370   return sigma;                                   
371 }                                                 
372                                                   
373 G4double G4ChipsKaonPlusInelasticXS::EquLinear    
374 {                                                 
375   if(DX<=0. || N<2)                               
376     {                                             
377       G4cerr<<"***G4ChipsKaonPlusInelasticXS::    
378       return Y[0];                                
379     }                                             
380                                                   
381   G4int    N2=N-2;                                
382   G4double d=(X-X0)/DX;                           
383   G4int         jj=static_cast<int>(d);           
384   if     (jj<0)  jj=0;                            
385   else if(jj>N2) jj=N2;                           
386   d-=jj; // excess                                
387   G4double yi=Y[jj];                              
388   G4double sigma=yi+(Y[jj+1]-yi)*d;               
389                                                   
390   return sigma;                                   
391 }                                                 
392