Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/cross_sections/src/G4ChipsPionPlusElasticXS.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/G4ChipsPionPlusElasticXS.cc (Version 11.3.0) and /processes/hadronic/cross_sections/src/G4ChipsPionPlusElasticXS.cc (Version 5.1.p1)


  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 //                                                
 28 //                                                
 29 // G4 Physics class: G4ChipsPionPlusElasticXS     
 30 // Created: M.V. Kossov, CERN/ITEP(Moscow), 21    
 31 // The last update: M.V. Kossov, CERN/ITEP (Mo    
 32 //                                                
 33 // -------------------------------------------    
 34 // Short description: Interaction cross-sectio    
 35 // Class extracted from CHIPS and integrated i    
 36 // -------------------------------------------    
 37                                                   
 38                                                   
 39 #include "G4ChipsPionPlusElasticXS.hh"            
 40 #include "G4SystemOfUnits.hh"                     
 41 #include "G4DynamicParticle.hh"                   
 42 #include "G4ParticleDefinition.hh"                
 43 #include "G4PionPlus.hh"                          
 44 #include "G4Nucleus.hh"                           
 45 #include "G4ParticleTable.hh"                     
 46 #include "G4NucleiProperties.hh"                  
 47 #include "G4IonTable.hh"                          
 48 #include "G4Log.hh"                               
 49 #include "G4Exp.hh"                               
 50 #include "G4Pow.hh"                               
 51                                                   
 52 // factory                                        
 53 #include "G4CrossSectionFactory.hh"               
 54 //                                                
 55 G4_DECLARE_XS_FACTORY(G4ChipsPionPlusElasticXS    
 56                                                   
 57 G4ChipsPionPlusElasticXS::G4ChipsPionPlusElast    
 58 {                                                 
 59   lPMin=-8.;  // Min tabulated logarithmMoment    
 60   lPMax= 8.;  // Max tabulated logarithmMoment    
 61   dlnP=(lPMax-lPMin)/nLast;// LogStep inTheTab    
 62   onlyCS=true;// Flag toCalcul OnlyCS(not Si/B    
 63   lastSIG=0.; // Last calculated cross section    
 64   lastLP=-10.;// Last log(mom_of IncidentHadro    
 65   lastTM=0.;  // Last t_maximum                   
 66   theSS=0.;   // TheLastSqSlope of 1st difr.Ma    
 67   theS1=0.;   // TheLastMantissa of 1st difr.M    
 68   theB1=0.;   // TheLastSlope of 1st difruct.M    
 69   theS2=0.;   // TheLastMantissa of 2nd difr.M    
 70   theB2=0.;   // TheLastSlope of 2nd difruct.M    
 71   theS3=0.;   // TheLastMantissa of 3d difr. M    
 72   theB3=0.;   // TheLastSlope of 3d difruct. M    
 73   theS4=0.;   // TheLastMantissa of 4th difr.M    
 74   theB4=0.;   // TheLastSlope of 4th difruct.M    
 75   lastTZ=0;   // Last atomic number of the tar    
 76   lastTN=0;   // Last # of neutrons in the tar    
 77   lastPIN=0.; // Last initialized max momentum    
 78   lastCST=0;  // Elastic cross-section table      
 79   lastPAR=0;  // ParametersForFunctionalCalcul    
 80   lastSST=0;  // E-dep of SqaredSlope of 1st d    
 81   lastS1T=0;  // E-dep of mantissa of 1st dif.    
 82   lastB1T=0;  // E-dep of the slope of 1st dif    
 83   lastS2T=0;  // E-dep of mantissa of 2nd difr    
 84   lastB2T=0;  // E-dep of the slope of 2nd dif    
 85   lastS3T=0;  // E-dep of mantissa of 3d difr.    
 86   lastB3T=0;  // E-dep of the slope of 3d difr    
 87   lastS4T=0;  // E-dep of mantissa of 4th difr    
 88   lastB4T=0;  // E-dep of the slope of 4th dif    
 89   lastN=0;    // The last N of calculated nucl    
 90   lastZ=0;    // The last Z of calculated nucl    
 91   lastP=0.;   // LastUsed in cross section Mom    
 92   lastTH=0.;  // Last threshold momentum          
 93   lastCS=0.;  // Last value of the Cross Secti    
 94   lastI=0;    // The last position in the DAMD    
 95 }                                                 
 96                                                   
 97 G4ChipsPionPlusElasticXS::~G4ChipsPionPlusElas    
 98 {                                                 
 99   std::vector<G4double*>::iterator pos;           
100   for (pos=CST.begin(); pos<CST.end(); pos++)     
101   { delete [] *pos; }                             
102   CST.clear();                                    
103   for (pos=PAR.begin(); pos<PAR.end(); pos++)     
104   { delete [] *pos; }                             
105   PAR.clear();                                    
106   for (pos=SST.begin(); pos<SST.end(); pos++)     
107   { delete [] *pos; }                             
108   SST.clear();                                    
109   for (pos=S1T.begin(); pos<S1T.end(); pos++)     
110   { delete [] *pos; }                             
111   S1T.clear();                                    
112   for (pos=B1T.begin(); pos<B1T.end(); pos++)     
113   { delete [] *pos; }                             
114   B1T.clear();                                    
115   for (pos=S2T.begin(); pos<S2T.end(); pos++)     
116   { delete [] *pos; }                             
117   S2T.clear();                                    
118   for (pos=B2T.begin(); pos<B2T.end(); pos++)     
119   { delete [] *pos; }                             
120   B2T.clear();                                    
121   for (pos=S3T.begin(); pos<S3T.end(); pos++)     
122   { delete [] *pos; }                             
123   S3T.clear();                                    
124   for (pos=B3T.begin(); pos<B3T.end(); pos++)     
125   { delete [] *pos; }                             
126   B3T.clear();                                    
127   for (pos=S4T.begin(); pos<S4T.end(); pos++)     
128   { delete [] *pos; }                             
129   S4T.clear();                                    
130   for (pos=B4T.begin(); pos<B4T.end(); pos++)     
131   { delete [] *pos; }                             
132   B4T.clear();                                    
133 }                                                 
134                                                   
135 void                                              
136 G4ChipsPionPlusElasticXS::CrossSectionDescript    
137 {                                                 
138     outFile << "G4ChipsPionPlusElasticXS provi    
139             << "section for pion+ nucleus scat    
140             << "momentum. The cross section is    
141             << "CHIPS parameterization of cros    
142 }                                                 
143                                                   
144 G4bool G4ChipsPionPlusElasticXS::IsIsoApplicab    
145              const G4Element*,                    
146              const G4Material*)                   
147 {                                                 
148   return true;                                    
149 }                                                 
150                                                   
151 // The main member function giving the collisi    
152 // Make pMom in independent units ! (Now it is    
153 G4double G4ChipsPionPlusElasticXS::GetIsoCross    
154                                                   
155                                                   
156                                                   
157 {                                                 
158   G4double pMom=Pt->GetTotalMomentum();           
159   G4int tgN = A - tgZ;                            
160                                                   
161   return GetChipsCrossSection(pMom, tgZ, tgN,     
162 }                                                 
163                                                   
164 G4double G4ChipsPionPlusElasticXS::GetChipsCro    
165 {                                                 
166   G4double pEn=pMom;                              
167   G4bool fCS = false;                             
168   onlyCS=fCS;                                     
169                                                   
170   G4bool in=false;                   // By def    
171   lastP   = 0.;                      // New mo    
172   lastN   = tgN;                     // The la    
173   lastZ   = tgZ;                     // The la    
174   lastI   = (G4int)colN.size();      // Size o    
175   if(lastI) for(G4int i=0; i<lastI; ++i) // Lo    
176   {                                  // The nu    
177     if(colN[i]==tgN && colZ[i]==tgZ) // Isotop    
178     {                                             
179       lastI=i;                                    
180       lastTH =colTH[i];              // Last T    
181       if(pEn<=lastTH)                             
182       {                                           
183         return 0.;                   // Energy    
184       }                                           
185       lastP  =colP [i];              // Last M    
186       lastCS =colCS[i];              // Last C    
187       //  if(std::fabs(lastP/pMom-1.)<toleranc    
188       if(lastP == pMom)              // Do not    
189       {                                           
190         CalculateCrossSection(fCS,-1,i,211,las    
191         return lastCS*millibarn;     // Use th    
192       }                                           
193       in = true;                       // This    
194       // Momentum pMom is in IU ! @@ Units        
195       lastCS=CalculateCrossSection(fCS,-1,i,21    
196       if(lastCS<=0. && pEn>lastTH)    // Corre    
197       {                                           
198         lastTH=pEn;                               
199       }                                           
200       break;                           // Go o    
201     }                                             
202   } // End of attampt to find the nucleus in D    
203   if(!in)                            // This n    
204   {                                               
205     //!!The slave functions must provide cross    
206     lastCS=CalculateCrossSection(fCS,0,lastI,2    
207     if(lastCS<=0.)                                
208     {                                             
209       lastTH = 0; //ThresholdEnergy(tgZ, tgN);    
210       if(pEn>lastTH)                              
211       {                                           
212         lastTH=pEn;                               
213       }                                           
214     }                                             
215     colN.push_back(tgN);                          
216     colZ.push_back(tgZ);                          
217     colP.push_back(pMom);                         
218     colTH.push_back(lastTH);                      
219     colCS.push_back(lastCS);                      
220     return lastCS*millibarn;                      
221   } // End of creation of the new set of param    
222   else                                            
223   {                                               
224     colP[lastI]=pMom;                             
225     colCS[lastI]=lastCS;                          
226   }                                               
227   return lastCS*millibarn;                        
228 }                                                 
229                                                   
230 // Calculation of total elastic cross section     
231 // F=0 - create AMDB, F=-1 - read&update AMDB,    
232 G4double G4ChipsPionPlusElasticXS::CalculateCr    
233                                              G    
234 {                                                 
235   G4double pMom=pIU/GeV;                // All    
236   onlyCS=CS;                            // Fla    
237   lastLP=G4Log(pMom);                // Make a    
238   if(F)                                 // Thi    
239   {                                               
240     if(F<0)                             // the    
241     {                                             
242       lastPIN = PIN[I];                 // Max    
243       lastPAR = PAR[I];                 // Poi    
244       lastCST = CST[I];                 // Poi    
245       lastSST = SST[I];                 // Poi    
246       lastS1T = S1T[I];                 // Poi    
247       lastB1T = B1T[I];                 // Poi    
248       lastS2T = S2T[I];                 // Poi    
249       lastB2T = B2T[I];                 // Poi    
250       lastS3T = S3T[I];                 // Poi    
251       lastB3T = B3T[I];                 // Poi    
252       lastS4T = S4T[I];                 // Poi    
253       lastB4T = B4T[I];                 // Poi    
254     }                                             
255     if(lastLP>lastPIN && lastLP<lPMax)            
256     {                                             
257       lastPIN=GetPTables(lastLP,lastPIN,PDG,tg    
258       PIN[I]=lastPIN;                   // Rem    
259     }                                             
260   }                                               
261   else                                  // Thi    
262   {                                               
263     lastPAR = new G4double[nPoints];    // All    
264     lastPAR[nLast]=0;                   // Ini    
265     lastCST = new G4double[nPoints];    // All    
266     lastSST = new G4double[nPoints];    // All    
267     lastS1T = new G4double[nPoints];    // All    
268     lastB1T = new G4double[nPoints];    // All    
269     lastS2T = new G4double[nPoints];    // All    
270     lastB2T = new G4double[nPoints];    // All    
271     lastS3T = new G4double[nPoints];    // All    
272     lastB3T = new G4double[nPoints];    // All    
273     lastS4T = new G4double[nPoints];    // All    
274     lastB4T = new G4double[nPoints];    // All    
275     lastPIN = GetPTables(lastLP,lPMin,PDG,tgZ,    
276     PIN.push_back(lastPIN);             // Fil    
277     PAR.push_back(lastPAR);             // Fil    
278     CST.push_back(lastCST);             // Fil    
279     SST.push_back(lastSST);             // Fil    
280     S1T.push_back(lastS1T);             // Fil    
281     B1T.push_back(lastB1T);             // Fil    
282     S2T.push_back(lastS2T);             // Fil    
283     B2T.push_back(lastB2T);             // Fil    
284     S3T.push_back(lastS3T);             // Fil    
285     B3T.push_back(lastB3T);             // Fil    
286     S4T.push_back(lastS4T);             // Fil    
287     B4T.push_back(lastB4T);             // Fil    
288   } // End of creation/update of the new set o    
289   // =-----------= NOW Update (if necessary) a    
290   if(lastLP>lastPIN && lastLP<lPMax)              
291   {                                               
292     lastPIN = GetPTables(lastLP,lastPIN,PDG,tg    
293   }                                               
294   if(!onlyCS) lastTM=GetQ2max(PDG, tgZ, tgN, p    
295   if(lastLP>lPMin && lastLP<=lastPIN)   // Lin    
296   {                                               
297     if(lastLP==lastPIN)                           
298     {                                             
299       G4double shift=(lastLP-lPMin)/dlnP+.0000    
300       G4int    blast=static_cast<int>(shift);     
301       if(blast<0 || blast>=nLast) G4cout<<"G4Q    
302       lastSIG = lastCST[blast];                   
303       if(!onlyCS)                       // Ski    
304       {                                           
305         theSS  = lastSST[blast];                  
306         theS1  = lastS1T[blast];                  
307         theB1  = lastB1T[blast];                  
308         theS2  = lastS2T[blast];                  
309         theB2  = lastB2T[blast];                  
310         theS3  = lastS3T[blast];                  
311         theB3  = lastB3T[blast];                  
312         theS4  = lastS4T[blast];                  
313         theB4  = lastB4T[blast];                  
314       }                                           
315     }                                             
316     else                                          
317     {                                             
318       G4double shift=(lastLP-lPMin)/dlnP;         
319       G4int    blast=static_cast<int>(shift);     
320       if(blast<0)   blast=0;                      
321       if(blast>=nLast) blast=nLast-1;             
322       shift-=blast;                               
323       G4int lastL=blast+1;                        
324       G4double SIGL=lastCST[blast];               
325       lastSIG= SIGL+shift*(lastCST[lastL]-SIGL    
326       if(!onlyCS)                       // Ski    
327       {                                           
328         G4double SSTL=lastSST[blast];             
329         theSS=SSTL+shift*(lastSST[lastL]-SSTL)    
330         G4double S1TL=lastS1T[blast];             
331         theS1=S1TL+shift*(lastS1T[lastL]-S1TL)    
332         G4double B1TL=lastB1T[blast];             
333         theB1=B1TL+shift*(lastB1T[lastL]-B1TL)    
334         G4double S2TL=lastS2T[blast];             
335         theS2=S2TL+shift*(lastS2T[lastL]-S2TL)    
336         G4double B2TL=lastB2T[blast];             
337         theB2=B2TL+shift*(lastB2T[lastL]-B2TL)    
338         G4double S3TL=lastS3T[blast];             
339         theS3=S3TL+shift*(lastS3T[lastL]-S3TL)    
340         G4double B3TL=lastB3T[blast];             
341         theB3=B3TL+shift*(lastB3T[lastL]-B3TL)    
342         G4double S4TL=lastS4T[blast];             
343         theS4=S4TL+shift*(lastS4T[lastL]-S4TL)    
344         G4double B4TL=lastB4T[blast];             
345         theB4=B4TL+shift*(lastB4T[lastL]-B4TL)    
346       }                                           
347     }                                             
348   }                                               
349   else lastSIG=GetTabValues(lastLP, PDG, tgZ,     
350   if(lastSIG<0.) lastSIG = 0.;                    
351   return lastSIG;                                 
352 }                                                 
353                                                   
354 // It has parameter sets for all tZ/tN/PDG, us    
355 G4double G4ChipsPionPlusElasticXS::GetPTables(    
356                                                   
357 {                                                 
358   // @@ At present all nA==pA ---------> Each     
359   static const G4double pwd=2727;                 
360   const G4int n_pippel=35;               // #o    
361   //                           -0- -1-   -2- -    
362   G4double pipp_el[n_pippel]={1.27,13.,.0676,3    
363                               3.4,.2,.17,.001,    
364                               3.5e6,5.e-5,1.e1    
365   //                         -14--15--16--17--    
366   //                          -26-   -27-  -28    
367   if(PDG == 211)                                  
368   {                                               
369     // -- Total pp elastic cross section cs &     
370     //p2=p*p;p3=p2*p;sp=sqrt(p);p2s=p2*sp;lp=l    
371     //CS=2.865/p2s/(1+.0022/p2s)+(18.9+.6461*d    
372     //   par(0)       par(7)     par(1) par(2)    
373     //dl2=lp-5., s1=(74.+3.*dl2*dl2)/(1+3.4/p4    
374     //     par(8) par(9) par(10)        par(11    
375     // b1=8.*p**.055/(1.+3.64/p3); s2=5.e-5+40    
376     // par(15) par(16)  par(17)     par(18) pa    
377     // s3=5.e-5+1.e10/(p4*p4+8.5e8*p2+1.e10);     
378     //  par(24) par(25)     par(26)  par(27) p    
379     //                                            
380     if(lastPAR[nLast]!=pwd) // A unique flag t    
381     {                                             
382       if ( tgZ == 1 && tgN == 0 )                 
383       {                                           
384         for (G4int ip=0; ip<n_pippel; ip++) la    
385       }                                           
386       else                                        
387       {                                           
388         G4double a=tgZ+tgN;                       
389         G4double sa=std::sqrt(a);                 
390         G4double ssa=std::sqrt(sa);               
391         G4double asa=a*sa;                        
392         G4double a2=a*a;                          
393         G4double a3=a2*a;                         
394         G4double a4=a3*a;                         
395         G4double a5=a4*a;                         
396         G4double a6=a4*a2;                        
397         G4double a7=a6*a;                         
398         G4double a8=a7*a;                         
399         G4double a9=a8*a;                         
400         G4double a10=a5*a5;                       
401         G4double a12=a6*a6;                       
402         G4double a14=a7*a7;                       
403         G4double a16=a8*a8;                       
404         G4double a17=a16*a;                       
405         //G4double a20=a16*a4;                    
406         G4double a32=a16*a16;                     
407         // Reaction cross-section parameters (    
408         lastPAR[0]=(.95*sa+2.E5/a16)/(1.+17/a)    
409         lastPAR[1]=a/(1./4.4+1./a);               
410         lastPAR[2]=.22/G4Pow::GetInstance()->p    
411         lastPAR[3]=.5*a/(1.+3./a+1800./a8);       
412         lastPAR[4]=3.E-4*G4Pow::GetInstance()-    
413         lastPAR[5]=0.;                            
414         lastPAR[6]=(.55+.001*a2)/(1.+4.E-4*a2)    
415         lastPAR[7]=(.0002/asa+4.E-9*a)/(1.+9./    
416         lastPAR[8]=0.;                            
417         // @@ the differential cross-section i    
418         if(a<6.5)                                 
419         {                                         
420           G4double a28=a16*a12;                   
421           // The main pre-exponent      (pel_s    
422           lastPAR[ 9]=4000*a;                     
423           lastPAR[10]=1.2e7*a8+380*a17;           
424           lastPAR[11]=.7/(1.+4.e-12*a16);         
425           lastPAR[12]=2.5/a8/(a4+1.e-16*a32);     
426           lastPAR[13]=.28*a;                      
427           lastPAR[14]=1.2*a2+2.3;                 
428           lastPAR[15]=3.8/a;                      
429           // The main slope             (pel_s    
430           lastPAR[16]=.01/(1.+.0024*a5);          
431           lastPAR[17]=.2*a;                       
432           lastPAR[18]=9.e-7/(1.+.035*a5);         
433           lastPAR[19]=(42.+2.7e-11*a16)/(1.+.1    
434           // The main quadratic         (pel_s    
435           lastPAR[20]=2.25*a3;                    
436           lastPAR[21]=18.;                        
437           lastPAR[22]=2.4e-3*a8/(1.+2.6e-4*a7)    
438           lastPAR[23]=3.5e-36*a32*a8/(1.+5.e-1    
439           // The 1st max pre-exponent   (pel_q    
440           lastPAR[24]=1.e5/(a8+2.5e12/a16);       
441           lastPAR[25]=8.e7/(a12+1.e-27*a28*a28    
442           lastPAR[26]=.0006*a3;                   
443           // The 1st max slope          (pel_q    
444           lastPAR[27]=10.+4.e-8*a12*a;            
445           lastPAR[28]=.114;                       
446           lastPAR[29]=.003;                       
447           lastPAR[30]=2.e-23;                     
448           // The effective pre-exponent (pel_s    
449           lastPAR[31]=1./(1.+.0001*a8);           
450           lastPAR[32]=1.5e-4/(1.+5.e-6*a12);      
451           lastPAR[33]=.03;                        
452           // The effective slope        (pel_s    
453           lastPAR[34]=a/2;                        
454           lastPAR[35]=2.e-7*a4;                   
455           lastPAR[36]=4.;                         
456           lastPAR[37]=64./a3;                     
457           // The gloria pre-exponent    (pel_u    
458           lastPAR[38]=1.e8*G4Exp(.32*asa);        
459           lastPAR[39]=20.*G4Exp(.45*asa);         
460           lastPAR[40]=7.e3+2.4e6/a5;              
461           lastPAR[41]=2.5e5*G4Exp(.085*a3);       
462           lastPAR[42]=2.5*a;                      
463           // The gloria slope           (pel_u    
464           lastPAR[43]=920.+.03*a8*a3;             
465           lastPAR[44]=93.+.0023*a12;              
466         }                                         
467         else                                      
468         {                                         
469           G4double p1a10=2.2e-28*a10;             
470           G4double r4a16=6.e14/a16;               
471           G4double s4a16=r4a16*r4a16;             
472           // a24                                  
473           // a36                                  
474           // The main pre-exponent      (peh_s    
475           lastPAR[ 9]=4.5*G4Pow::GetInstance()    
476           lastPAR[10]=.06*G4Pow::GetInstance()    
477           lastPAR[11]=.6*a/(1.+2.e15/a16);        
478           lastPAR[12]=.17/(a+9.e5/a3+1.5e33/a3    
479           lastPAR[13]=(.001+7.e-11*a5)/(1.+4.4    
480           lastPAR[14]=(p1a10*p1a10+2.e-29)/(1.    
481           // The main slope             (peh_s    
482           lastPAR[15]=400./a12+2.e-22*a9;         
483           lastPAR[16]=1.e-32*a12/(1.+5.e22/a14    
484           lastPAR[17]=1000./a2+9.5*sa*ssa;        
485           lastPAR[18]=4.e-6*a*asa+1.e11/a16;      
486           lastPAR[19]=(120./a+.002*a2)/(1.+2.e    
487           lastPAR[20]=9.+100./a;                  
488           // The main quadratic         (peh_s    
489           lastPAR[21]=.002*a3+3.e7/a6;            
490           lastPAR[22]=7.e-15*a4*asa;              
491           lastPAR[23]=9000./a4;                   
492           // The 1st max pre-exponent   (peh_q    
493           lastPAR[24]=.0011*asa/(1.+3.e34/a32/    
494           lastPAR[25]=1.e-5*a2+2.e14/a16;         
495           lastPAR[26]=1.2e-11*a2/(1.+1.5e19/a1    
496           lastPAR[27]=.016*asa/(1.+5.e16/a16);    
497           // The 1st max slope          (peh_q    
498           lastPAR[28]=.002*a4/(1.+7.e7/G4Pow::    
499           lastPAR[29]=2.e6/a6+7.2/G4Pow::GetIn    
500           lastPAR[30]=11.*a3/(1.+7.e23/a16/a8)    
501           lastPAR[31]=100./asa;                   
502           // The 2nd max pre-exponent   (peh_s    
503           lastPAR[32]=(.1+4.4e-5*a2)/(1.+5.e5/    
504           lastPAR[33]=3.5e-4*a2/(1.+1.e8/a8);     
505           lastPAR[34]=1.3+3.e5/a4;                
506           lastPAR[35]=500./(a2+50.)+3;            
507           lastPAR[36]=1.e-9/a+s4a16*s4a16;        
508           // The 2nd max slope          (peh_s    
509           lastPAR[37]=.4*asa+3.e-9*a6;            
510           lastPAR[38]=.0005*a5;                   
511           lastPAR[39]=.002*a5;                    
512           lastPAR[40]=10.;                        
513           // The effective pre-exponent (peh_u    
514           lastPAR[41]=.05+.005*a;                 
515           lastPAR[42]=7.e-8/sa;                   
516           lastPAR[43]=.8*sa;                      
517           lastPAR[44]=.02*sa;                     
518           lastPAR[45]=1.e8/a3;                    
519           lastPAR[46]=3.e32/(a32+1.e32);          
520           // The effective slope        (peh_u    
521           lastPAR[47]=24.;                        
522           lastPAR[48]=20./sa;                     
523           lastPAR[49]=7.e3*a/(sa+1.);             
524           lastPAR[50]=900.*sa/(1.+500./a3);       
525         }                                         
526         // Parameter for lowEnergyNeutrons        
527         lastPAR[51]=1.e15+2.e27/a4/(1.+2.e-18*    
528       }                                           
529       lastPAR[nLast]=pwd;                         
530       // and initialize the zero element of th    
531       G4double lp=lPMin;                          
532       G4bool memCS=onlyCS;                        
533       onlyCS=false;                               
534       lastCST[0]=GetTabValues(lp, PDG, tgZ, tg    
535       onlyCS=memCS;                               
536       lastSST[0]=theSS;                           
537       lastS1T[0]=theS1;                           
538       lastB1T[0]=theB1;                           
539       lastS2T[0]=theS2;                           
540       lastB2T[0]=theB2;                           
541       lastS3T[0]=theS3;                           
542       lastB3T[0]=theB3;                           
543       lastS4T[0]=theS4;                           
544       lastB4T[0]=theB4;                           
545     }                                             
546     if(LP>ILP)                                    
547     {                                             
548       G4int ini = static_cast<int>((ILP-lPMin+    
549       if(ini<0) ini=0;                            
550       if(ini<nPoints)                             
551       {                                           
552         G4int fin = static_cast<int>((LP-lPMin    
553         if(fin>=nPoints) fin=nLast;               
554         if(fin>=ini)                              
555         {                                         
556           G4double lp=0.;                         
557           for(G4int ip=ini; ip<=fin; ip++)        
558           {                                       
559             lp=lPMin+ip*dlnP;                     
560             G4bool memCS=onlyCS;                  
561             onlyCS=false;                         
562             lastCST[ip]=GetTabValues(lp, PDG,     
563             onlyCS=memCS;                         
564             lastSST[ip]=theSS;                    
565             lastS1T[ip]=theS1;                    
566             lastB1T[ip]=theB1;                    
567             lastS2T[ip]=theS2;                    
568             lastB2T[ip]=theB2;                    
569             lastS3T[ip]=theS3;                    
570             lastB3T[ip]=theB3;                    
571             lastS4T[ip]=theS4;                    
572             lastB4T[ip]=theB4;                    
573           }                                       
574           return lp;                              
575         }                                         
576         else G4cout<<"*Warning*G4ChipsPionPlus    
577                    <<", Z="<<tgZ<<", N="<<tgN<    
578                    <<" > ILP="<<ILP<<" nothing    
579       }                                           
580       else G4cout<<"*Warning*G4ChipsPionPlusEl    
581                  <<tgZ<<", N="<<tgN<<", i="<<i    
582                  <<" > ILP="<<ILP<<", lPMax="<    
583     }                                             
584   }                                               
585   else                                            
586   {                                               
587     // G4cout<<"*Error*G4ChipsPionPlusElasticX    
588     //       <<", N="<<tgN<<", while it is def    
589     // throw G4QException("G4ChipsPionPlusElas    
590     G4ExceptionDescription ed;                    
591     ed << "PDG = " << PDG << ", Z = " << tgZ <    
592        << ", while it is defined only for PDG=    
593     G4Exception("G4ChipsPionPlusElasticXS::Get    
594                 FatalException, ed);              
595   }                                               
596   return ILP;                                     
597 }                                                 
598                                                   
599 // Returns Q2=-t in independent units (MeV^2)     
600 G4double G4ChipsPionPlusElasticXS::GetExchange    
601 {                                                 
602   static const G4double GeVSQ=gigaelectronvolt    
603   static const G4double third=1./3.;              
604   static const G4double fifth=1./5.;              
605   static const G4double sevth=1./7.;              
606   if(PDG!= 211)G4cout<<"*Warning*G4ChipsPionPl    
607   if(onlyCS)G4cout<<"*Warning*G4ChipsPionPlusE    
608   if(lastLP<-4.3) return lastTM*GeVSQ*G4Unifor    
609   G4double q2=0.;                                 
610   if(tgZ==1 && tgN==0)                // ===>     
611   {                                               
612     G4double E1=lastTM*theB1;                     
613     G4double R1=(1.-G4Exp(-E1));                  
614     G4double E2=lastTM*theB2;                     
615     G4double R2=(1.-G4Exp(-E2*E2*E2));            
616     G4double E3=lastTM*theB3;                     
617     G4double R3=(1.-G4Exp(-E3));                  
618     G4double I1=R1*theS1/theB1;                   
619     G4double I2=R2*theS2;                         
620     G4double I3=R3*theS3;                         
621     G4double I12=I1+I2;                           
622     G4double rand=(I12+I3)*G4UniformRand();       
623     if     (rand<I1 )                             
624     {                                             
625       G4double ran=R1*G4UniformRand();            
626       if(ran>1.) ran=1.;                          
627       q2=-G4Log(1.-ran)/theB1;                    
628     }                                             
629     else if(rand<I12)                             
630     {                                             
631       G4double ran=R2*G4UniformRand();            
632       if(ran>1.) ran=1.;                          
633       q2=-G4Log(1.-ran);                          
634       if(q2<0.) q2=0.;                            
635       q2=G4Pow::GetInstance()->powA(q2,third)/    
636     }                                             
637     else                                          
638     {                                             
639       G4double ran=R3*G4UniformRand();            
640       if(ran>1.) ran=1.;                          
641       q2=-G4Log(1.-ran)/theB3;                    
642     }                                             
643   }                                               
644   else                                            
645   {                                               
646     G4double a=tgZ+tgN;                           
647     G4double E1=lastTM*(theB1+lastTM*theSS);      
648     G4double R1=(1.-G4Exp(-E1));                  
649     G4double tss=theSS+theSS; // for future so    
650     G4double tm2=lastTM*lastTM;                   
651     G4double E2=lastTM*tm2*theB2;                 
652     if(a>6.5)E2*=tm2;                             
653     G4double R2=(1.-G4Exp(-E2));                  
654     G4double E3=lastTM*theB3;                     
655     if(a>6.5)E3*=tm2*tm2*tm2;                     
656     G4double R3=(1.-G4Exp(-E3));                  
657     G4double E4=lastTM*theB4;                     
658     G4double R4=(1.-G4Exp(-E4));                  
659     G4double I1=R1*theS1;                         
660     G4double I2=R2*theS2;                         
661     G4double I3=R3*theS3;                         
662     G4double I4=R4*theS4;                         
663     G4double I12=I1+I2;                           
664     G4double I13=I12+I3;                          
665     G4double rand=(I13+I4)*G4UniformRand();       
666     if(rand<I1)                                   
667     {                                             
668       G4double ran=R1*G4UniformRand();            
669       if(ran>1.) ran=1.;                          
670       q2=-G4Log(1.-ran)/theB1;                    
671       if(std::fabs(tss)>1.e-7) q2=(std::sqrt(t    
672     }                                             
673     else if(rand<I12)                             
674     {                                             
675       G4double ran=R2*G4UniformRand();            
676       if(ran>1.) ran=1.;                          
677       q2=-G4Log(1.-ran)/theB2;                    
678       if(q2<0.) q2=0.;                            
679       if(a<6.5) q2=G4Pow::GetInstance()->powA(    
680       else      q2=G4Pow::GetInstance()->powA(    
681     }                                             
682     else if(rand<I13)                             
683     {                                             
684       G4double ran=R3*G4UniformRand();            
685       if(ran>1.) ran=1.;                          
686       q2=-G4Log(1.-ran)/theB3;                    
687       if(q2<0.) q2=0.;                            
688       if(a>6.5) q2=G4Pow::GetInstance()->powA(    
689     }                                             
690     else                                          
691     {                                             
692       G4double ran=R4*G4UniformRand();            
693       if(ran>1.) ran=1.;                          
694       q2=-G4Log(1.-ran)/theB4;                    
695       if(a<6.5) q2=lastTM-q2;                     
696     }                                             
697   }                                               
698   if(q2<0.) q2=0.;                                
699   if(!(q2>=-1.||q2<=1.)) G4cout<<"*NAN*G4QElas    
700   if(q2>lastTM)                                   
701   {                                               
702     q2=lastTM;                                    
703   }                                               
704   return q2*GeVSQ;                                
705 }                                                 
706                                                   
707 // Returns B in independent units (MeV^-2) (al    
708 G4double G4ChipsPionPlusElasticXS::GetSlope(G4    
709 {                                                 
710   static const G4double GeVSQ=gigaelectronvolt    
711   if(onlyCS)G4cout<<"Warning*G4ChipsPionPlusEl    
712   if(lastLP<-4.3) return 0.;          // S-wav    
713   if(PDG != 211)                                  
714   {                                               
715     // G4cout<<"*Error*G4ChipsPionPlusElasticX    
716     //       <<", N="<<tgN<<", while it is def    
717     // throw G4QException("G4ChipsPionPlusElas    
718     G4ExceptionDescription ed;                    
719     ed << "PDG = " << PDG << ", Z = " << tgZ <    
720        << ", while it is defined only for PDG=    
721     G4Exception("G4ChipsPionPlusElasticXS::Get    
722                 FatalException, ed);              
723   }                                               
724   if(theB1<0.) theB1=0.;                          
725   if(!(theB1>=-1.||theB1<=1.))G4cout<<"*NAN*G4    
726   return theB1/GeVSQ;                             
727 }                                                 
728                                                   
729 // Returns half max(Q2=-t) in independent unit    
730 G4double G4ChipsPionPlusElasticXS::GetHMaxT()     
731 {                                                 
732   static const G4double HGeVSQ=gigaelectronvol    
733   return lastTM*HGeVSQ;                           
734 }                                                 
735                                                   
736 // lastLP is used, so calculating tables, one     
737 G4double G4ChipsPionPlusElasticXS::GetTabValue    
738                                                   
739 {                                                 
740   if(PDG!= 211)G4cout<<"Warning*G4ChipsPionPlu    
741                                                   
742   //AR-24Apr2018 Switch to allow transuranic e    
743   const G4bool isHeavyElementAllowed = true;      
744   if(tgZ<0 || ( !isHeavyElementAllowed && tgZ>    
745   {                                               
746     G4cout<<"*Warning*G4QPionPlusElCS::GetTabV    
747     return 0.;                                    
748   }                                               
749   G4int iZ=tgZ-1; // Z index                      
750   if(iZ<0)                                        
751   {                                               
752     iZ=0;         // conversion of the neutron    
753     tgZ=1;                                        
754     tgN=0;                                        
755   }                                               
756   G4double p=G4Exp(lp);              // moment    
757   G4double sp=std::sqrt(p);             // sqr    
758   G4double p2=p*p;                                
759   G4double p3=p2*p;                               
760   G4double p4=p2*p2;                              
761   if ( tgZ == 1 && tgN == 0 ) // PiPlus+P         
762   {                                               
763     G4double dl2=lp-lastPAR[11];                  
764     theSS=lastPAR[34];                            
765     theS1=(lastPAR[12]+lastPAR[13]*dl2*dl2)/(1    
766           (lastPAR[15]/p2+lastPAR[16]*p)/(p4+l    
767     theB1=lastPAR[18]*G4Pow::GetInstance()->po    
768     theS2=lastPAR[21]+lastPAR[22]/(p4+lastPAR[    
769     theB2=lastPAR[24]+lastPAR[25]/(p4+lastPAR[    
770     theS3=lastPAR[27]+lastPAR[28]/(p4*p4+lastP    
771     theB3=lastPAR[31]+lastPAR[32]/(p4+lastPAR[    
772     theS4=0.;                                     
773     theB4=0.;                                     
774     // Returns the total elastic pip-p cross-s    
775     G4double dl1=lp+lastPAR[0];  // lr            
776     G4double lr2=dl1*dl1;        // lr2           
777     G4double dl3=lp-lastPAR[3];  // ld            
778     G4double dl4=lp-lastPAR[4];  // lm            
779     return lastPAR[1]/(lr2+lr2*lr2+lastPAR[2])    
780            lastPAR[8]/sp)/(1.+lastPAR[9]/p4)+l    
781   }                                               
782   else                                            
783   {                                               
784     G4double p5=p4*p;                             
785     G4double p6=p5*p;                             
786     G4double p8=p6*p2;                            
787     G4double p10=p8*p2;                           
788     G4double p12=p10*p2;                          
789     G4double p16=p8*p8;                           
790     //G4double p24=p16*p8;                        
791     G4double dl=lp-5.;                            
792     G4double a=tgZ+tgN;                           
793     G4double pah=G4Pow::GetInstance()->powA(p,    
794     G4double pa=pah*pah;                          
795     G4double pa2=pa*pa;                           
796     if(a<6.5)                                     
797     {                                             
798       theS1=lastPAR[9]/(1.+lastPAR[10]*p4*pa)+    
799             (lastPAR[13]*dl*dl+lastPAR[14])/(1    
800       theB1=(lastPAR[16]+lastPAR[17]*p2)/(p4+l    
801       theSS=lastPAR[20]/(1.+lastPAR[21]/p2)+la    
802       theS2=lastPAR[24]/(pa/p2+lastPAR[25]/p4)    
803       theB2=lastPAR[27]*G4Pow::GetInstance()->    
804       theS3=lastPAR[31]/(pa*p+lastPAR[32]/pa)+    
805       theB3=lastPAR[34]/(p3+lastPAR[35]/p6)+la    
806       theS4=p2*(pah*lastPAR[38]*G4Exp(-pah*las    
807                 lastPAR[40]/(1.+lastPAR[41]*G4    
808       theB4=lastPAR[43]*pa/p2/(1.+pa*lastPAR[4    
809     }                                             
810     else                                          
811     {                                             
812       theS1=lastPAR[9]/(1.+lastPAR[10]/p4)+las    
813             lastPAR[13]/(p5+lastPAR[14]/p16);     
814       theB1=(lastPAR[15]/p8+lastPAR[19])/(p+la    
815             lastPAR[17]/(1.+lastPAR[18]/p4);      
816       theSS=lastPAR[21]/(p4/G4Pow::GetInstance    
817       theS2=lastPAR[24]/p4/(G4Pow::GetInstance    
818       theB2=lastPAR[28]/G4Pow::GetInstance()->    
819       theS3=lastPAR[32]/G4Pow::GetInstance()->    
820             lastPAR[33]/(1.+lastPAR[34]/p6);      
821       theB3=lastPAR[37]/p8+lastPAR[38]/p2+last    
822       theS4=(lastPAR[41]/p4+lastPAR[46]/p)/(1.    
823             (lastPAR[43]+lastPAR[44]*dl*dl)/(1    
824       theB4=lastPAR[47]/(1.+lastPAR[48]/p)+las    
825     }                                             
826     // Returns the total elastic (n/p)A cross-    
827     //         p1               p2                
828     return (lastPAR[0]*dl*dl+lastPAR[1])/(1.+l    
829            lastPAR[3]/(p4+lastPAR[4]/p3)+lastP    
830     //        p4             p5                   
831   }                                               
832   return 0.;                                      
833 } // End of GetTableValues                        
834                                                   
835 // Returns max -t=Q2 (GeV^2) for the momentum     
836 G4double G4ChipsPionPlusElasticXS::GetQ2max(G4    
837                                                   
838 {                                                 
839   static const G4double mPi= G4PionPlus::PionP    
840   static const G4double mPi2= mPi*mPi;            
841   G4double pP2=pP*pP;                             
842   if(tgZ || tgN>-1)                               
843   {                                               
844     G4double mt=G4ParticleTable::GetParticleTa    
845     G4double dmt=mt+mt;                           
846     G4double mds=dmt*std::sqrt(pP2+mPi2)+mPi2+    
847     return dmt*dmt*pP2/mds;                       
848   }                                               
849   else                                            
850   {                                               
851     G4ExceptionDescription ed;                    
852     ed << "PDG = " << PDG << ", Z = " << tgZ <    
853        << ", while it is defined only for p pr    
854     G4Exception("G4ChipsPionPlusElasticXS::Get    
855                 FatalException, ed);              
856     return 0;                                     
857   }                                               
858 }                                                 
859