Geant4 Cross Reference

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


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 //                                                 26 //
 27 // The lust update: M.V. Kossov, CERN/ITEP(Mos     27 // The lust update: M.V. Kossov, CERN/ITEP(Moscow) 17-June-02
                                                   >>  28 // GEANT4 tag $Name: not supported by cvs2svn $
 28 //                                                 29 //
 29 // *******************************************     30 // ****************************************************************************************
 30 // Short description: Cross-sections extracted     31 // Short description: Cross-sections extracted (by W.Pokorski) from the CHIPS package for 
 31 // Hyperon-nuclear  interactions. Original aut     32 // Hyperon-nuclear  interactions. Original author: M. Kossov
 32 // -------------------------------------------     33 // -------------------------------------------------------------------------------------
 33 //                                                 34 //
 34                                                    35 
 35 #include "G4ChipsHyperonInelasticXS.hh"            36 #include "G4ChipsHyperonInelasticXS.hh"
 36 #include "G4SystemOfUnits.hh"                      37 #include "G4SystemOfUnits.hh"
 37 #include "G4DynamicParticle.hh"                    38 #include "G4DynamicParticle.hh"
 38 #include "G4ParticleDefinition.hh"                 39 #include "G4ParticleDefinition.hh"
 39 #include "G4Lambda.hh"                             40 #include "G4Lambda.hh"
 40 #include "G4SigmaPlus.hh"                          41 #include "G4SigmaPlus.hh"
 41 #include "G4SigmaMinus.hh"                         42 #include "G4SigmaMinus.hh"
 42 #include "G4SigmaZero.hh"                          43 #include "G4SigmaZero.hh"
 43 #include "G4XiMinus.hh"                            44 #include "G4XiMinus.hh"
 44 #include "G4XiZero.hh"                             45 #include "G4XiZero.hh"
 45 #include "G4OmegaMinus.hh"                         46 #include "G4OmegaMinus.hh"
 46 #include "G4Log.hh"                            << 
 47 #include "G4Exp.hh"                            << 
 48                                                    47 
 49 // factory                                         48 // factory
 50 #include "G4CrossSectionFactory.hh"                49 #include "G4CrossSectionFactory.hh"
 51 //                                                 50 //
 52 G4_DECLARE_XS_FACTORY(G4ChipsHyperonInelasticX     51 G4_DECLARE_XS_FACTORY(G4ChipsHyperonInelasticXS);
 53                                                    52 
 54 G4ChipsHyperonInelasticXS::G4ChipsHyperonInela     53 G4ChipsHyperonInelasticXS::G4ChipsHyperonInelasticXS():G4VCrossSectionDataSet(Default_Name())
 55 {                                                  54 {
 56   // Initialization of the                         55   // Initialization of the
 57   lastLEN=0; // Pointer to the lastArray of Lo     56   lastLEN=0; // Pointer to the lastArray of LowEn CS
 58   lastHEN=0; // Pointer to the lastArray of Hi     57   lastHEN=0; // Pointer to the lastArray of HighEn CS
 59   lastN=0;   // The last N of calculated nucle     58   lastN=0;   // The last N of calculated nucleus
 60   lastZ=0;   // The last Z of calculated nucle     59   lastZ=0;   // The last Z of calculated nucleus
 61   lastP=0.;  // Last used in cross section Mom     60   lastP=0.;  // Last used in cross section Momentum
 62   lastTH=0.; // Last threshold momentum            61   lastTH=0.; // Last threshold momentum
 63   lastCS=0.; // Last value of the Cross Sectio     62   lastCS=0.; // Last value of the Cross Section
 64   lastI=0;   // The last position in the DAMDB     63   lastI=0;   // The last position in the DAMDB
 65   LEN = new std::vector<G4double*>;                64   LEN = new std::vector<G4double*>;
 66   HEN = new std::vector<G4double*>;                65   HEN = new std::vector<G4double*>;
 67 }                                                  66 }
 68                                                    67 
 69 G4ChipsHyperonInelasticXS::~G4ChipsHyperonInel     68 G4ChipsHyperonInelasticXS::~G4ChipsHyperonInelasticXS()
 70 {                                                  69 {
 71     std::size_t lens=LEN->size();              <<  70     G4int lens=LEN->size();
 72     for(std::size_t i=0; i<lens; ++i) delete[] <<  71     for(G4int i=0; i<lens; ++i) delete[] (*LEN)[i];
 73     delete LEN;                                    72     delete LEN;
 74                                                    73 
 75     std::size_t hens=HEN->size();              <<  74     G4int hens=HEN->size();
 76     for(std::size_t i=0; i<hens; ++i) delete[] <<  75     for(G4int i=0; i<hens; ++i) delete[] (*HEN)[i];
 77     delete HEN;                                    76     delete HEN;
 78 }                                                  77 }
 79                                                    78 
 80 void G4ChipsHyperonInelasticXS::CrossSectionDe <<  79 G4bool G4ChipsHyperonInelasticXS::IsIsoApplicable(const G4DynamicParticle* Pt, G4int, G4int,    
 81 {                                              << 
 82   outFile << "G4ChipsHyperonInelasticXS provid << 
 83           << "section for hyperon nucleus scat << 
 84           << "momentum. The cross section is c << 
 85           << "CHIPS parameterization of cross  << 
 86 }                                              << 
 87                                                << 
 88 G4bool G4ChipsHyperonInelasticXS::IsIsoApplica << 
 89          const G4Element*,                         80          const G4Element*,
 90          const G4Material*)                        81          const G4Material*)
 91 {                                                  82 {
 92   return true;                                 <<  83   G4ParticleDefinition* particle = Pt->GetDefinition();
                                                   >>  84   if (particle == G4Lambda::Lambda()) 
                                                   >>  85     {
                                                   >>  86       return true;
                                                   >>  87     }
                                                   >>  88   else if(particle == G4SigmaPlus::SigmaPlus())
                                                   >>  89     {
                                                   >>  90     return true;
                                                   >>  91     }
                                                   >>  92   else if(particle == G4SigmaMinus::SigmaMinus())
                                                   >>  93     {
                                                   >>  94     return true;
                                                   >>  95     }
                                                   >>  96   else if(particle == G4SigmaZero::SigmaZero())
                                                   >>  97     {
                                                   >>  98       return true;
                                                   >>  99     }
                                                   >> 100   else if(particle == G4XiMinus::XiMinus())
                                                   >> 101     {
                                                   >> 102       return true;
                                                   >> 103     }
                                                   >> 104   else if(particle == G4XiZero::XiZero())
                                                   >> 105     {
                                                   >> 106       return true;
                                                   >> 107     }
                                                   >> 108   else if(particle == G4OmegaMinus::OmegaMinus())
                                                   >> 109     {
                                                   >> 110       return true;
                                                   >> 111     }
                                                   >> 112   return false;
 93 }                                                 113 }
 94                                                   114 
 95 // The main member function giving the collisi    115 // The main member function giving the collision cross section (P is in IU, CS is in mb)
 96 // Make pMom in independent units ! (Now it is    116 // Make pMom in independent units ! (Now it is MeV)
 97 G4double G4ChipsHyperonInelasticXS::GetIsoCros    117 G4double G4ChipsHyperonInelasticXS::GetIsoCrossSection(const G4DynamicParticle* Pt, G4int tgZ, G4int A,  
 98                const G4Isotope*,                  118                const G4Isotope*,
 99                const G4Element*,                  119                const G4Element*,
100                const G4Material*)                 120                const G4Material*)
101 {                                                 121 {
102   G4double pMom=Pt->GetTotalMomentum();           122   G4double pMom=Pt->GetTotalMomentum();
103   G4int tgN = A - tgZ;                            123   G4int tgN = A - tgZ;
104   G4int pdg = Pt->GetDefinition()->GetPDGEncod    124   G4int pdg = Pt->GetDefinition()->GetPDGEncoding();
105                                                   125   
106   return GetChipsCrossSection(pMom, tgZ, tgN,     126   return GetChipsCrossSection(pMom, tgZ, tgN, pdg);
107 }                                                 127 }
108                                                   128 
109 G4double G4ChipsHyperonInelasticXS::GetChipsCr    129 G4double G4ChipsHyperonInelasticXS::GetChipsCrossSection(G4double pMom, G4int tgZ, G4int tgN, G4int PDG)
110 {                                                 130 {
                                                   >> 131   static G4int j;                      // A#0f Z/N-records already tested in AMDB
                                                   >> 132   static std::vector <G4int>    colN;  // Vector of N for calculated nuclei (isotops)
                                                   >> 133   static std::vector <G4int>    colZ;  // Vector of Z for calculated nuclei (isotops)
                                                   >> 134   static std::vector <G4double> colP;  // Vector of last momenta for the reaction
                                                   >> 135   static std::vector <G4double> colTH; // Vector of energy thresholds for the reaction
                                                   >> 136   static std::vector <G4double> colCS; // Vector of last cross sections for the reaction
                                                   >> 137   // ***---*** End of the mandatory Static Definitions of the Associative Memory ***---***
111                                                   138  
112   G4bool in=false;                     // By d    139   G4bool in=false;                     // By default the isotope must be found in the AMDB
113   if(tgN!=lastN || tgZ!=lastZ)         // The     140   if(tgN!=lastN || tgZ!=lastZ)         // The nucleus was not the last used isotope
114   {                                               141   {
115     in = false;                        // By d    142     in = false;                        // By default the isotope haven't be found in AMDB  
116     lastP   = 0.;                      // New     143     lastP   = 0.;                      // New momentum history (nothing to compare with)
117     lastN   = tgN;                     // The     144     lastN   = tgN;                     // The last N of the calculated nucleus
118     lastZ   = tgZ;                     // The     145     lastZ   = tgZ;                     // The last Z of the calculated nucleus
119     lastI   = (G4int)colN.size();      // Size << 146     lastI   = colN.size();             // Size of the Associative Memory DB in the heap
120     j  = 0;                            // A#0f    147     j  = 0;                            // A#0f records found in DB for this projectile
121                                                   148 
122     if(lastI) for(G4int i=0; i<lastI; ++i) //  << 149     if(lastI) for(G4int i=0; i<lastI; i++) // AMDB exists, try to find the (Z,N) isotope
123     {                                             150     {
124       if(colN[i]==tgN && colZ[i]==tgZ) // Try     151       if(colN[i]==tgN && colZ[i]==tgZ) // Try the record "i" in the AMDB
125       {                                           152       {
126         lastI=i;                       // Reme    153         lastI=i;                       // Remember the index for future fast/last use
127         lastTH =colTH[i];              // The     154         lastTH =colTH[i];              // The last THreshold (A-dependent)
128                                                   155 
129         if(pMom<=lastTH)                          156         if(pMom<=lastTH)
130         {                                         157         {
131           return 0.;                   // Ener    158           return 0.;                   // Energy is below the Threshold value
132         }                                         159         }
133         lastP  =colP [i];              // Last    160         lastP  =colP [i];              // Last Momentum  (A-dependent)
134         lastCS =colCS[i];              // Last    161         lastCS =colCS[i];              // Last CrossSect (A-dependent)
135         in = true;                     // This    162         in = true;                     // This is the case when the isotop is found in DB
136         // Momentum pMom is in IU ! @@ Units      163         // Momentum pMom is in IU ! @@ Units
137         lastCS=CalculateCrossSection(-1,j,PDG,    164         lastCS=CalculateCrossSection(-1,j,PDG,lastZ,lastN,pMom); // read & update
138                                                   165 
139         if(lastCS<=0. && pMom>lastTH)  // Corr    166         if(lastCS<=0. && pMom>lastTH)  // Correct the threshold (@@ No intermediate Zeros)
140         {                                         167         {
141           lastCS=0.;                              168           lastCS=0.;
142           lastTH=pMom;                            169           lastTH=pMom;
143         }                                         170         }
144         break;                         // Go o    171         break;                         // Go out of the LOOP
145       }                                           172       }
146       j++;                             // Incr    173       j++;                             // Increment a#0f records found in DB
147     }                                             174     }
148     if(!in)                            // This    175     if(!in)                            // This isotope has not been calculated previously
149     {                                             176     {
150       //!!The slave functions must provide cro    177       //!!The slave functions must provide cross-sections in millibarns (mb) !! (not in IU)
151       lastCS=CalculateCrossSection(0,j,PDG,las    178       lastCS=CalculateCrossSection(0,j,PDG,lastZ,lastN,pMom); //calculate & create
                                                   >> 179       //if(lastCS>0.)                   // It means that the AMBD was initialized
                                                   >> 180       //{
152                                                   181 
153       lastTH = 0; //ThresholdEnergy(tgZ, tgN);    182       lastTH = 0; //ThresholdEnergy(tgZ, tgN); // The Threshold Energy which is now the last
154         colN.push_back(tgN);                      183         colN.push_back(tgN);
155         colZ.push_back(tgZ);                      184         colZ.push_back(tgZ);
156         colP.push_back(pMom);                     185         colP.push_back(pMom);
157         colTH.push_back(lastTH);                  186         colTH.push_back(lastTH);
158         colCS.push_back(lastCS);                  187         colCS.push_back(lastCS);
159   //} // M.K. Presence of H1 with high thresho    188   //} // M.K. Presence of H1 with high threshold breaks the syncronization
160       return lastCS*millibarn;                    189       return lastCS*millibarn;
161     } // End of creation of the new set of par    190     } // End of creation of the new set of parameters
162     else                                          191     else
163     {                                             192     {
164       colP[lastI]=pMom;                           193       colP[lastI]=pMom;
165       colCS[lastI]=lastCS;                        194       colCS[lastI]=lastCS;
166     }                                             195     }
167   } // End of parameters udate                    196   } // End of parameters udate
168   else if(pMom<=lastTH)                           197   else if(pMom<=lastTH)
169   {                                               198   {
170     return 0.;                         // Mome    199     return 0.;                         // Momentum is below the Threshold Value -> CS=0
171   }                                               200   }
172   else                                 // It i    201   else                                 // It is the last used -> use the current tables
173   {                                               202   {
174     lastCS=CalculateCrossSection(1,j,PDG,lastZ    203     lastCS=CalculateCrossSection(1,j,PDG,lastZ,lastN,pMom); // Only read and UpdateDB
175     lastP=pMom;                                   204     lastP=pMom;
176   }                                               205   }
177   return lastCS*millibarn;                        206   return lastCS*millibarn;
178 }                                                 207 }
179                                                   208 
180 // The main member function giving the gamma-A    209 // The main member function giving the gamma-A cross section (E in GeV, CS in mb)
181 G4double G4ChipsHyperonInelasticXS::CalculateC    210 G4double G4ChipsHyperonInelasticXS::CalculateCrossSection(G4int F, G4int I,
182                 G4int, G4int targZ, G4int targ    211                 G4int, G4int targZ, G4int targN, G4double Momentum)
183 {                                                 212 {
184   static const G4double THmin=27.;     // defa    213   static const G4double THmin=27.;     // default minimum Momentum (MeV/c) Threshold
185   static const G4double THmiG=THmin*.001; // m    214   static const G4double THmiG=THmin*.001; // minimum Momentum (GeV/c) Threshold
186   static const G4double dP=10.;        // step    215   static const G4double dP=10.;        // step for the LEN (Low ENergy) table MeV/c
187   static const G4double dPG=dP*.001;   // step    216   static const G4double dPG=dP*.001;   // step for the LEN (Low ENergy) table GeV/c
188   static const G4int    nL=105;        // A#of    217   static const G4int    nL=105;        // A#of LEN points in E (step 10 MeV/c)
189   static const G4double Pmin=THmin+(nL-1)*dP;     218   static const G4double Pmin=THmin+(nL-1)*dP; // minP for the HighE part with safety
190   static const G4double Pmax=227000.;  // maxP    219   static const G4double Pmax=227000.;  // maxP for the HEN (High ENergy) part 227 GeV
191   static const G4int    nH=224;        // A#of    220   static const G4int    nH=224;        // A#of HEN points in lnE
192   static const G4double milP=G4Log(Pmin);// Lo << 221   static const G4double milP=std::log(Pmin);// Low logarithm energy for the HEN part
193   static const G4double malP=G4Log(Pmax);// Hi << 222   static const G4double malP=std::log(Pmax);// High logarithm energy (each 2.75 percent)
194   static const G4double dlP=(malP-milP)/(nH-1)    223   static const G4double dlP=(malP-milP)/(nH-1); // Step in log energy in the HEN part
195   static const G4double milPG=G4Log(.001*Pmin) << 224   static const G4double milPG=std::log(.001*Pmin);// Low logarithmEnergy for HEN part GeV/c
196                                                << 225   G4double sigma=0.;
                                                   >> 226   if(F&&I) sigma=0.;                   // @@ *!* Fake line *!* to use F & I !!!Temporary!!!
                                                   >> 227   //G4double A=targN+targZ;              // A of the target
197   if(F<=0)                             // This    228   if(F<=0)                             // This isotope was not the last used isotop
198   {                                               229   {
199     if(F<0)                            // This    230     if(F<0)                            // This isotope was found in DAMDB =-----=> RETRIEVE
200     {                                             231     {
201       G4int sync=(G4int)LEN->size();           << 232       G4int sync=LEN->size();
202       if(sync<=I) G4cerr<<"*!*G4QPiMinusNuclCS    233       if(sync<=I) G4cerr<<"*!*G4QPiMinusNuclCS::CalcCrosSect:Sync="<<sync<<"<="<<I<<G4endl;
203       lastLEN=(*LEN)[I];               // Poin    234       lastLEN=(*LEN)[I];               // Pointer to prepared LowEnergy cross sections
204       lastHEN=(*HEN)[I];               // Poin    235       lastHEN=(*HEN)[I];               // Pointer to prepared High Energy cross sections
205     }                                             236     }
206     else                               // This    237     else                               // This isotope wasn't calculated before => CREATE
207     {                                             238     {
208       lastLEN = new G4double[nL];      // Allo    239       lastLEN = new G4double[nL];      // Allocate memory for the new LEN cross sections
209       lastHEN = new G4double[nH];      // Allo    240       lastHEN = new G4double[nH];      // Allocate memory for the new HEN cross sections
210       // --- Instead of making a separate func    241       // --- Instead of making a separate function ---
211       G4double P=THmiG;                // Tabl    242       G4double P=THmiG;                // Table threshold in GeV/c
212       for(G4int k=0; k<nL; k++)                   243       for(G4int k=0; k<nL; k++)
213       {                                           244       {
214         lastLEN[k] = CrossSectionLin(targZ, ta    245         lastLEN[k] = CrossSectionLin(targZ, targN, P);
215         P+=dPG;                                   246         P+=dPG;
216       }                                           247       }
217       G4double lP=milPG;                          248       G4double lP=milPG;
218       for(G4int n=0; n<nH; n++)                   249       for(G4int n=0; n<nH; n++)
219       {                                           250       {
220         lastHEN[n] = CrossSectionLog(targZ, ta    251         lastHEN[n] = CrossSectionLog(targZ, targN, lP);
221         lP+=dlP;                                  252         lP+=dlP;
222       }                                           253       }
223       // --- End of possible separate function    254       // --- End of possible separate function
224       // *** The synchronization check ***        255       // *** The synchronization check ***
225       G4int sync=(G4int)LEN->size();           << 256       G4int sync=LEN->size();
226       if(sync!=I)                                 257       if(sync!=I)
227       {                                           258       {
228         G4cerr<<"***G4QHyperNuclCS::CalcCrossS    259         G4cerr<<"***G4QHyperNuclCS::CalcCrossSect: Sinc="<<sync<<"#"<<I<<", Z=" <<targZ
229               <<", N="<<targN<<", F="<<F<<G4en    260               <<", N="<<targN<<", F="<<F<<G4endl;
230         //G4Exception("G4PiMinusNuclearCS::Cal    261         //G4Exception("G4PiMinusNuclearCS::CalculateCS:","39",FatalException,"DBoverflow");
231       }                                           262       }
232       LEN->push_back(lastLEN);         // reme    263       LEN->push_back(lastLEN);         // remember the Low Energy Table
233       HEN->push_back(lastHEN);         // reme    264       HEN->push_back(lastHEN);         // remember the High Energy Table
234     } // End of creation of the new set of par    265     } // End of creation of the new set of parameters
235   } // End of parameters udate                    266   } // End of parameters udate
236   // =--------------------------= NOW the Magi    267   // =--------------------------= NOW the Magic Formula =------------------------------=
237   G4double sigma;                              << 
238   if (Momentum<lastTH) return 0.;      // It m    268   if (Momentum<lastTH) return 0.;      // It must be already checked in the interface class
239   else if (Momentum<Pmin)              // High    269   else if (Momentum<Pmin)              // High Energy region
240   {                                               270   {
241     sigma=EquLinearFit(Momentum,nL,THmin,dP,la    271     sigma=EquLinearFit(Momentum,nL,THmin,dP,lastLEN);
242   }                                               272   }
243   else if (Momentum<Pmax)              // High    273   else if (Momentum<Pmax)              // High Energy region
244   {                                               274   {
245     G4double lP=G4Log(Momentum);               << 275     G4double lP=std::log(Momentum);
246     sigma=EquLinearFit(lP,nH,milP,dlP,lastHEN)    276     sigma=EquLinearFit(lP,nH,milP,dlP,lastHEN);
247   }                                               277   }
248   else                                 // UHE     278   else                                 // UHE region (calculation, not frequent)
249   {                                               279   {
250     G4double P=0.001*Momentum;         // Appr    280     G4double P=0.001*Momentum;         // Approximation formula is for P in GeV/c
251     sigma=CrossSectionFormula(targZ, targN, P, << 281     sigma=CrossSectionFormula(targZ, targN, P, std::log(P));
252   }                                               282   }
253   if (sigma<0.) return 0.;                     << 283   if(sigma<0.) return 0.;
254   return sigma;                                   284   return sigma;
255 }                                                 285 }
256                                                   286 
257 // Calculation formula for piMinus-nuclear ine    287 // Calculation formula for piMinus-nuclear inelastic cross-section (mb) (P in GeV/c)
258 G4double G4ChipsHyperonInelasticXS::CrossSecti    288 G4double G4ChipsHyperonInelasticXS::CrossSectionLin(G4int tZ, G4int tN, G4double P)
259 {                                                 289 {
260   G4double lP=G4Log(P);                        << 290   G4double lP=std::log(P);
261   return CrossSectionFormula(tZ, tN, P, lP);      291   return CrossSectionFormula(tZ, tN, P, lP);
262 }                                                 292 }
263                                                   293 
264 // Calculation formula for piMinus-nuclear ine    294 // Calculation formula for piMinus-nuclear inelastic cross-section (mb) log(P in GeV/c)
265 G4double G4ChipsHyperonInelasticXS::CrossSecti    295 G4double G4ChipsHyperonInelasticXS::CrossSectionLog(G4int tZ, G4int tN, G4double lP)
266 {                                                 296 {
267   G4double P=G4Exp(lP);                        << 297   G4double P=std::exp(lP);
268   return CrossSectionFormula(tZ, tN, P, lP);      298   return CrossSectionFormula(tZ, tN, P, lP);
269 }                                                 299 }
270 // Calculation formula for piMinus-nuclear ine    300 // Calculation formula for piMinus-nuclear inelastic cross-section (mb) log(P in GeV/c)
271 G4double G4ChipsHyperonInelasticXS::CrossSecti    301 G4double G4ChipsHyperonInelasticXS::CrossSectionFormula(G4int tZ, G4int tN,
272                                                   302                                                               G4double P, G4double lP)
273 {                                                 303 {
274   G4double sigma=0.;                              304   G4double sigma=0.;
275                                                << 
276   //AR-24Apr2018 Switch to allow transuranic e << 
277   const G4bool isHeavyElementAllowed = true;   << 
278                                                << 
279   if(tZ==1 && !tN)                        // H    305   if(tZ==1 && !tN)                        // Hyperon-P interaction from G4QuasiElastRatios
280   {                                               306   {
281     G4double ld=lP-3.5;                           307     G4double ld=lP-3.5;
282     G4double ld2=ld*ld;                           308     G4double ld2=ld*ld;
283     G4double p2=P*P;                              309     G4double p2=P*P;
284     G4double p4=p2*p2;                            310     G4double p4=p2*p2;
285     G4double sp=std::sqrt(P);                     311     G4double sp=std::sqrt(P);
286     G4double El=(.0557*ld2+6.72+99./p2)/(1.+2.    312     G4double El=(.0557*ld2+6.72+99./p2)/(1.+2./sp+2./p4);
287     G4double To=(.3*ld2+38.2+900./sp)/(1.+27./    313     G4double To=(.3*ld2+38.2+900./sp)/(1.+27./sp+3./p4);
288     sigma=To-El;                                  314     sigma=To-El;
289   }                                               315   }
290   else if((tZ<97 && tN<152) || isHeavyElementA << 316   else if(tZ<97 && tN<152)                // General solution
291   {                                               317   {
292     G4double d=lP-4.2;                            318     G4double d=lP-4.2;
293     G4double p2=P*P;                              319     G4double p2=P*P;
294     G4double p4=p2*p2;                            320     G4double p4=p2*p2;
295     G4double sp=std::sqrt(P);                     321     G4double sp=std::sqrt(P);
296     G4double ssp=std::sqrt(sp);                   322     G4double ssp=std::sqrt(sp);
297     G4double a=tN+tZ;                      //     323     G4double a=tN+tZ;                      // A of the target
298     G4double al=G4Log(a);                      << 324     G4double al=std::log(a);
299     G4double sa=std::sqrt(a);                     325     G4double sa=std::sqrt(a);
300     G4double a2=a*a;                              326     G4double a2=a*a;
301     G4double a2s=a2*sa;                           327     G4double a2s=a2*sa;
302     G4double a4=a2*a2;                            328     G4double a4=a2*a2;
303     G4double a8=a4*a4;                            329     G4double a8=a4*a4;
304     G4double c=(170.+3600./a2s)/(1.+65./a2s);     330     G4double c=(170.+3600./a2s)/(1.+65./a2s);
305     G4double gg=42.*(G4Exp(al*0.8)+4.E-8*a4)/( << 331     G4double gg=42.*(std::exp(al*0.8)+4.E-8*a4)/(1.+28./a)/(1.+5.E-5*a2);
306     G4double e=390.;                       //     332     G4double e=390.;                       // Defolt values for deutrons
307     G4double r=0.27;                              333     G4double r=0.27;
308     G4double h=2.E-7;                             334     G4double h=2.E-7;
309     G4double t=0.3;                               335     G4double t=0.3;
310     if(tZ>1 || tN>1)                              336     if(tZ>1 || tN>1)
311     {                                             337     {
312       e=380.+18.*a2/(1.+a2/60.)/(1.+2.E-19*a8)    338       e=380.+18.*a2/(1.+a2/60.)/(1.+2.E-19*a8);
313       r=0.15;                                     339       r=0.15;
314       h=1.E-8*a2/(1.+a2/17.)/(1.+3.E-20*a8);      340       h=1.E-8*a2/(1.+a2/17.)/(1.+3.E-20*a8);
315       t=(.2+.00056*a2)/(1.+a2*.0006);             341       t=(.2+.00056*a2)/(1.+a2*.0006);
316     }                                             342     }
317     sigma=(c+d*d)/(1.+t/ssp+r/p4)+(gg+e*G4Exp( << 343     sigma=(c+d*d)/(1.+t/ssp+r/p4)+(gg+e*std::exp(-6.*P))/(1.+h/p4/p4);
318 #ifdef pdebug                                     344 #ifdef pdebug
319     G4cout<<"G4QHyperonNucCS::CSForm: A="<<a<<    345     G4cout<<"G4QHyperonNucCS::CSForm: A="<<a<<",P="<<P<<",CS="<<sigma<<",c="<<c<<",g="<<gg
320           <<",d="<<d<<",r="<<r<<",e="<<e<<",h=    346           <<",d="<<d<<",r="<<r<<",e="<<e<<",h="<<h<<G4endl;
321 #endif                                            347 #endif
322   }                                               348   }
323   else                                            349   else
324   {                                               350   {
325     G4cerr<<"-Warning-G4QHyperonNuclearCroSect    351     G4cerr<<"-Warning-G4QHyperonNuclearCroSect::CSForm:*Bad A* Z="<<tZ<<", N="<<tN<<G4endl;
326     sigma=0.;                                     352     sigma=0.;
327   }                                               353   }
328   if(sigma<0.) return 0.;                         354   if(sigma<0.) return 0.;
329   return sigma;                                   355   return sigma;  
330 }                                                 356 }
331                                                   357 
332 G4double G4ChipsHyperonInelasticXS::EquLinearF    358 G4double G4ChipsHyperonInelasticXS::EquLinearFit(G4double X, G4int N, G4double X0, G4double DX, G4double* Y)
333 {                                                 359 {
334   if(DX<=0. || N<2)                               360   if(DX<=0. || N<2)
335     {                                             361     {
336       G4cerr<<"***G4ChipsHyperonInelasticXS::E    362       G4cerr<<"***G4ChipsHyperonInelasticXS::EquLinearFit: DX="<<DX<<", N="<<N<<G4endl;
337       return Y[0];                                363       return Y[0];
338     }                                             364     }
339                                                   365   
340   G4int    N2=N-2;                                366   G4int    N2=N-2;
341   G4double d=(X-X0)/DX;                           367   G4double d=(X-X0)/DX;
342   G4int         jj=static_cast<int>(d);        << 368   G4int         j=static_cast<int>(d);
343   if     (jj<0)  jj=0;                         << 369   if     (j<0)  j=0;
344   else if(jj>N2) jj=N2;                        << 370   else if(j>N2) j=N2;
345   d-=jj; // excess                             << 371   d-=j; // excess
346   G4double yi=Y[jj];                           << 372   G4double yi=Y[j];
347   G4double sigma=yi+(Y[jj+1]-yi)*d;            << 373   G4double sigma=yi+(Y[j+1]-yi)*d;
348                                                   374   
349   return sigma;                                   375   return sigma;
350 }                                                 376 }
351                                                   377