Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/extended/electromagnetic/TestEm17/src/MuCrossSections.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 /examples/extended/electromagnetic/TestEm17/src/MuCrossSections.cc (Version 11.3.0) and /examples/extended/electromagnetic/TestEm17/src/MuCrossSections.cc (Version 11.0.p4)


  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 /// \file electromagnetic/TestEm17/src/MuCross     26 /// \file electromagnetic/TestEm17/src/MuCrossSections.cc
 27 /// \brief Implementation of the MuCrossSectio     27 /// \brief Implementation of the MuCrossSections class
 28 //                                                 28 //
 29 //                                             <<  29 // 
 30 //....oooOO0OOooo........oooOO0OOooo........oo     30 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 31 //....oooOO0OOooo........oooOO0OOooo........oo     31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 32                                                    32 
 33 #include "MuCrossSections.hh"                      33 #include "MuCrossSections.hh"
 34                                                    34 
 35 #include "G4DataVector.hh"                     << 
 36 #include "G4Exp.hh"                            << 
 37 #include "G4Log.hh"                            << 
 38 #include "G4Material.hh"                           35 #include "G4Material.hh"
 39 #include "G4MuonMinus.hh"                      << 
 40 #include "G4NistManager.hh"                    << 
 41 #include "G4PhysicalConstants.hh"                  36 #include "G4PhysicalConstants.hh"
 42 #include "G4SystemOfUnits.hh"                      37 #include "G4SystemOfUnits.hh"
 43                                                    38 
 44 //....oooOO0OOooo........oooOO0OOooo........oo     39 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 45                                                    40 
 46 using namespace std;                               41 using namespace std;
 47                                                <<  42  
 48 MuCrossSections::MuCrossSections()                 43 MuCrossSections::MuCrossSections()
 49 {                                              <<  44 { }
 50   fNist = G4NistManager::Instance();           << 
 51   fMuonMass = G4MuonMinus::MuonMinus()->GetPDG << 
 52   fMueRatio = fMuonMass / CLHEP::electron_mass << 
 53 }                                              << 
 54                                                    45 
 55 //....oooOO0OOooo........oooOO0OOooo........oo     46 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 56                                                    47 
 57 G4double MuCrossSections::CR_Macroscopic(const <<  48 MuCrossSections::~MuCrossSections()
                                                   >>  49 { }
                                                   >>  50 
                                                   >>  51 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
                                                   >>  52 
                                                   >>  53 G4double MuCrossSections::CR_Macroscopic(const G4String& process, 
                                                   >>  54                                          const G4Material* material,
 58                                          G4dou     55                                          G4double tkin, G4double ep)
                                                   >>  56                                           
 59 // return the macroscopic cross section (1/L)      57 // return the macroscopic cross section (1/L) in GEANT4 internal units
 60 {                                                  58 {
 61   const G4ElementVector* theElementVector = ma     59   const G4ElementVector* theElementVector = material->GetElementVector();
 62   const G4double* NbOfAtomsPerVolume = materia     60   const G4double* NbOfAtomsPerVolume = material->GetVecNbOfAtomsPerVolume();
 63                                                    61 
 64   G4double SIGMA = 0.;                             62   G4double SIGMA = 0.;
 65   G4int nelm = material->GetNumberOfElements() <<  63   G4int nelm = material->GetNumberOfElements(); 
 66   for (G4int i = 0; i < nelm; ++i) {           <<  64   for (G4int i=0; i < nelm; ++i)
                                                   >>  65   {
 67     const G4Element* element = (*theElementVec     66     const G4Element* element = (*theElementVector)[i];
 68     SIGMA += NbOfAtomsPerVolume[i] * CR_PerAto     67     SIGMA += NbOfAtomsPerVolume[i] * CR_PerAtom(process, element, tkin, ep);
 69   }                                                68   }
 70   return SIGMA;                                    69   return SIGMA;
 71 }                                                  70 }
 72                                                    71 
 73 //....oooOO0OOooo........oooOO0OOooo........oo     72 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 74                                                    73 
 75 G4double MuCrossSections::CR_PerAtom(const G4S <<  74 G4double MuCrossSections::CR_PerAtom(const G4String& process, 
                                                   >>  75                                      const G4Element* element,
 76                                      G4double      76                                      G4double tkin, G4double ep)
 77 {                                                  77 {
 78   G4double z = element->GetZ();                <<  78  G4double z = element->GetZ();
 79   G4double a = element->GetA();                <<  79  G4double a = element->GetA();
 80   G4double sigma = 0.;                         << 
 81   if (process == "muBrems")                    << 
 82     sigma = CRB_Mephi(z, a / (g / mole), tkin  << 
 83                                                << 
 84   else if (process == "muIoni")                << 
 85     sigma = CRK_Mephi(z, a / (g / mole), tkin  << 
 86                                                << 
 87   // else if (process == "muNucl")             << 
 88   else if (process == "muonNuclear")           << 
 89     sigma = CRN_Mephi(z, a / (g / mole), tkin  << 
 90                                                    80 
 91   else if (process == "muPairProd")            <<  81  G4double sigma = 0.;
 92     sigma = CRP_Mephi(z, a / (g / mole), tkin  <<  82  if (process == "muBrems")
 93                                                <<  83    sigma = CRB_Mephi(z,a/(g/mole),tkin/GeV,ep/GeV)*(cm2/(g*GeV))*a/Avogadro;
 94   else if (process == "muToMuonPairProd")      <<  84    
 95     sigma = CRM_Mephi(z, tkin, ep);            <<  85  else if (process == "muIoni")
 96                                                <<  86    sigma = CRK_Mephi(z,a/(g/mole),tkin/GeV,ep/GeV)*(cm2/(g*GeV))*a/Avogadro;
 97   return sigma;                                <<  87    
                                                   >>  88  //else if (process == "muNucl")
                                                   >>  89  else if (process == "muonNuclear")
                                                   >>  90    sigma = CRN_Mephi(z,a/(g/mole),tkin/GeV,ep/GeV)*(cm2/(g*GeV))*a/Avogadro;
                                                   >>  91    
                                                   >>  92  else if (process == "muPairProd")
                                                   >>  93    sigma = CRP_Mephi(z,a/(g/mole),tkin/GeV,ep/GeV)*(cm2/(g*GeV))*a/Avogadro;
                                                   >>  94    
                                                   >>  95  return sigma;        
 98 }                                                  96 }
 99                                                    97 
100 //....oooOO0OOooo........oooOO0OOooo........oo     98 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
101                                                    99 
102 G4double MuCrossSections::CRB_Mephi(G4double z << 100 double MuCrossSections::CRB_Mephi(double z,double a,double tkin,double ep)
103                                                   101 
104 //********************************************    102 //***********************************************************************
105 //***        crb_g4_1.inc        in comparison    103 //***        crb_g4_1.inc        in comparison with crb_.inc, following
106 //***        changes are introduced (September    104 //***        changes are introduced (September 24th, 1998):
107 //***                1) function crb_g4 (Z,A,T    105 //***                1) function crb_g4 (Z,A,Tkin,EP), Tkin is kinetic energy
108 //***                2) special case of hidrog    106 //***                2) special case of hidrogen (Z<1.5; b,b1,Dn_star)
109 //***                Numerical comparison: 5 d    107 //***                Numerical comparison: 5 decimal digits coincide.
110 //***                                             108 //***
111 //***        Cross section for bremsstrahlung     109 //***        Cross section for bremsstrahlung by fast muon
112 //***        By R.P.Kokoulin, September 1998      110 //***        By R.P.Kokoulin, September 1998
113 //***        Formulae from Kelner,Kokoulin,Pet    111 //***        Formulae from Kelner,Kokoulin,Petrukhin 1995, Preprint MEPhI
114 //***        (7,18,19,20,21,25,26); Dn (18) is    112 //***        (7,18,19,20,21,25,26); Dn (18) is modified to incorporate
115 //***        Bugaev's inelatic nuclear correct    113 //***        Bugaev's inelatic nuclear correction (28) for Z > 1.
116 //********************************************    114 //***********************************************************************
117 {                                                 115 {
118   //    G4double Z,A,Tkin,EP;                  << 116 //    G4double Z,A,Tkin,EP;
119   G4double crb_g4;                             << 117     G4double crb_g4;
120   G4double e, v, delta, rab0, z_13, dn, b, b1, << 118     G4double e,v,delta,rab0,z_13,dn,b,b1,dn_star,rab1,fn,epmax1,fe,rab2;
121   //                                           << 119 //    
122   G4double ame = 0.51099907e-3;  // GeV        << 120     G4double ame=0.51099907e-3; // GeV
123   G4double lamu = 0.105658389;  // GeV         << 121     G4double lamu=0.105658389;        // GeV
124   G4double re = 2.81794092e-13;  // cm         << 122     G4double re=2.81794092e-13; // cm
125   G4double avno = 6.022137e23;                 << 123     G4double avno=6.022137e23;
126   G4double alpha = 1. / 137.036;               << 124     G4double alpha=1./137.036;
127   G4double rmass = lamu / ame;  // "207"       << 125     G4double rmass=lamu/ame; // "207"
128   G4double coeff = 16. / 3. * alpha * avno * ( << 126     G4double coeff=16./3.*alpha*avno*(re/rmass)*(re/rmass); // cm^2
129   G4double sqrte = 1.64872127;  // sqrt(2.7182 << 127     G4double sqrte=1.64872127; // sqrt(2.71828...)
130   G4double btf = 183.;                         << 128     G4double btf=183.;
131   G4double btf1 = 1429.;                       << 129     G4double btf1=1429.;
132   G4double bh = 202.4;                         << 130     G4double bh=202.4;
133   G4double bh1 = 446.;                         << 131     G4double bh1=446.;
134   //***                                        << 132 //***
135   if (ep >= tkin) {                            << 133         if(ep >= tkin)
136     return 0.;                                 << 134         {
137   }                                            << 135           crb_g4=0.;
138   e = tkin + lamu;                             << 136           return crb_g4;
139   v = ep / e;                                  << 137         }
140   delta = lamu * lamu * v / (2. * (e - ep));   << 138         e=tkin+lamu;
141   rab0 = delta * sqrte;                        << 139         v=ep/e;
142   G4int Z = G4lrint(z);                        << 140         delta=lamu*lamu*v/(2.*(e-ep)); // qmin
143   z_13 = 1. / fNist->GetZ13(z);  //            << 141         rab0=delta*sqrte;
144   //***       nuclear size and excitation, scr << 142         z_13=pow(z,-0.3333333); //
145   dn = 1.54 * fNist->GetA27(Z);                << 143 //***                nuclear size and excitation, screening parameters
146   if (z <= 1.5)  // special case for hydrogen  << 144         dn=1.54*pow(a,0.27);
147   {                                            << 145         if(z <= 1.5) // special case for hydrogen
148     b = bh;                                    << 146         {
149     b1 = bh1;                                  << 147           b=bh;
150     dn_star = dn;                              << 148           b1=bh1;
151   }                                            << 149           dn_star=dn;
152   else {                                       << 150         }
153     b = btf;                                   << 151         else
154     b1 = btf1;                                 << 152         {
155     dn_star = pow(dn, (1. - 1. / z));  // with << 153           b=btf;
156   }                                            << 154           b1=btf1;
157   //***                nucleus contribution lo << 155           dn_star=pow(dn,(1.-1./z)); // with Bugaev's correction
158   rab1 = b * z_13;                             << 156         }
159   fn = G4Log(rab1 / (dn_star * (ame + rab0 * r << 157 //***                nucleus contribution logarithm
160   if (fn < 0.) fn = 0.;                        << 158         rab1=b*z_13;
161   //***                electron contribution l << 159         fn=log(rab1/(dn_star*(ame+rab0*rab1))*(lamu+delta*(dn_star*sqrte-2.)));
162   epmax1 = e / (1. + lamu * rmass / (2. * e)); << 160         if(fn < 0.) fn=0.;
163   if (ep >= epmax1) {                          << 161 //***                electron contribution logarithm
164     fe = 0.;                                   << 162         epmax1=e/(1.+lamu*rmass/(2.*e));
165   }                                            << 163         if(ep >= epmax1)
166   else {                                       << 164         {
167     rab2 = b1 * z_13 * z_13;                   << 165           fe=0.;
168     fe = G4Log(rab2 * lamu / ((1. + delta * rm << 166           goto label10;
169     if (fe < 0.) fe = 0.;                      << 167         }
170   }                                            << 168         rab2=b1*z_13*z_13;
171   crb_g4 = coeff * (1. - v * (1. - 0.75 * v))  << 169         fe=log(rab2*lamu/((1.+delta*rmass/(ame*sqrte))*(ame+rab0*rab2)));
172   return crb_g4;                               << 170         if(fe < 0.) fe=0.;
                                                   >> 171 //***
                                                   >> 172 label10:
                                                   >> 173         crb_g4=coeff*(1.-v*(1.-0.75*v))*z*(z*fn+fe)/(a*ep);
                                                   >> 174         return crb_g4;
173 }                                                 175 }
174                                                   176 
175 //....oooOO0OOooo........oooOO0OOooo........oo    177 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
176                                                   178 
177 G4double MuCrossSections::CRK_Mephi(G4double z << 179 G4double MuCrossSections::CRK_Mephi(G4double z,G4double a,G4double tkin,G4double ep)
                                                   >> 180  
178 //********************************************    181 //***********************************************************************
179 //***        Cross section for knock-on electr    182 //***        Cross section for knock-on electron production by fast muons
180 //***        (including bremsstrahlung e-diagr    183 //***        (including bremsstrahlung e-diagrams and rad. correction).
181 //***        Units: cm^2/(g*GeV); Tkin, ep - G    184 //***        Units: cm^2/(g*GeV); Tkin, ep - GeV.
182 //***        By R.P.Kokoulin, October 1998        185 //***        By R.P.Kokoulin, October 1998
183 //***        Formulae from Kelner,Kokoulin,Pet    186 //***        Formulae from Kelner,Kokoulin,Petrukhin, Phys.Atom.Nuclei, 1997
184 //***        (a bit simplified Kelner's versio    187 //***        (a bit simplified Kelner's version of Eq.30 - with 2 logarithms).
185 //***                                             188 //***
186 {                                                 189 {
187   //    G4double Z,A,Tkin,EP;                  << 190 //    G4double Z,A,Tkin,EP;
188   G4double crk_g4;                             << 191     G4double crk_g4;
189   G4double v, sigma0, a1, a3;                  << 192     G4double v,sigma0,a1,a3;
190   //                                           << 193 //
191   G4double ame = 0.51099907e-3;  // GeV        << 194     G4double ame=0.51099907e-3; // GeV
192   G4double lamu = 0.105658389;  // GeV         << 195     G4double lamu=0.105658389; // GeV
193   G4double re = 2.81794092e-13;  // cm         << 196     G4double re=2.81794092e-13; // cm
194   G4double avno = 6.022137e23;                 << 197     G4double avno=6.022137e23;
195   G4double alpha = 1. / 137.036;               << 198     G4double alpha=1./137.036;
196   G4double lpi = 3.141592654;                  << 199     G4double lpi=3.141592654;
197   G4double bmu = lamu * lamu / (2. * ame);     << 200     G4double bmu=lamu*lamu/(2.*ame);
198   G4double coeff0 = avno * 2. * lpi * ame * re << 201     G4double coeff0=avno*2.*lpi*ame*re*re;
199   G4double coeff1 = alpha / (2. * lpi);        << 202     G4double coeff1=alpha/(2.*lpi);
200   //***                                        << 203 //***
201                                                << 204 
202   G4double e = tkin + lamu;                    << 205     G4double e=tkin+lamu;
203   G4double epmax = e / (1. + bmu / e);         << 206     if(e < 0.) {
204   if (ep >= epmax) {                           << 207       G4cout << "CRK: " << tkin << "  " << ep << "  " << e << G4endl;
205     return 0.0;                                << 208     }
206   }                                            << 209     G4double epmax=e/(1.+bmu/e);
207   v = ep / e;                                  << 210     if(ep >= epmax)
208   sigma0 = coeff0 * (z / a) * (1. - ep / epmax << 211         {
209   a1 = G4Log(1. + 2. * ep / ame);              << 212           crk_g4=0.;
210   a3 = G4Log(4. * e * (e - ep) / (lamu * lamu) << 213           return crk_g4;
211   crk_g4 = sigma0 * (1. + coeff1 * a1 * (a3 -  << 214         }
212   return crk_g4;                               << 215     v=ep/e;
                                                   >> 216     sigma0=coeff0*(z/a)*(1.-ep/epmax+0.5*v*v)/(ep*ep);
                                                   >> 217     a1=std::log(1.+2.*ep/ame);
                                                   >> 218     a3=std::log(4.*e*(e-ep)/(lamu*lamu));
                                                   >> 219     crk_g4=sigma0*(1.+coeff1*a1*(a3-a1));
                                                   >> 220     return crk_g4;
213 }                                                 221 }
214                                                   222 
215 //....oooOO0OOooo........oooOO0OOooo........oo    223 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
216                                                   224 
217 G4double MuCrossSections::CRN_Mephi(G4double,  << 225 G4double MuCrossSections::CRN_Mephi(G4double /* z */,G4double a,G4double tkin,G4double ep)
218                                                   226 
219 //********************************************    227 //***********************************************************************
220 //***        Differential cross section for ph    228 //***        Differential cross section for photonuclear muon interaction.
221 //***        Formulae from Borog & Petrukhin,     229 //***        Formulae from Borog & Petrukhin, 1975
222 //***        Real photon cross section: Caldwe    230 //***        Real photon cross section: Caldwell e.a., 1979
223 //***        Nuclear shadowing: Brodsky e.a.,     231 //***        Nuclear shadowing: Brodsky e.a., 1972
224 //***        Units: cm^2 / g GeV.                 232 //***        Units: cm^2 / g GeV.
225 //***        CRN_G4_1.inc        January 31st,    233 //***        CRN_G4_1.inc        January 31st, 1998        R.P.Kokoulin
226 //********************************************    234 //***********************************************************************
227 {                                                 235 {
228   //    G4double Z,A,Tkin,EP;                  << 236 //    G4double Z,A,Tkin,EP;
229   G4double crn_g4;                             << 237     G4double crn_g4;
230   G4double e, aeff, sigph, v, v1, v2, amu2, up << 238     G4double e,aeff,sigph,v,v1,v2,amu2,up,down;
231   //***                                        << 239 //***
232   G4double lamu = 0.105658389;  // GeV         << 240     G4double lamu=0.105658389; // GeV
233   G4double avno = 6.022137e23;                 << 241     G4double avno=6.022137e23;
234   G4double amp = 0.9382723;  // GeV            << 242     G4double amp=0.9382723; // GeV
235   G4double lpi = 3.14159265;                   << 243     G4double lpi=3.14159265;
236   G4double alpha = 1. / 137.036;               << 244     G4double alpha=1./137.036;
237   //***                                        << 245 //***
238   G4double epmin_phn = 0.20;  // GeV           << 246     G4double epmin_phn=0.20; // GeV
239   G4double alam2 = 0.400000;  // GeV**2        << 247     G4double alam2=0.400000; // GeV**2
240   G4double alam = 0.632456;  // sqrt(alam2)    << 248     G4double alam =0.632456; // sqrt(alam2)
241   G4double coeffn = alpha / lpi * avno * 1e-30 << 249     G4double coeffn=alpha/lpi*avno*1e-30; // cm^2/microbarn
242   //***                                        << 250 //***
243   e = tkin + lamu;                             << 251         e=tkin+lamu;
244   crn_g4 = 0.;                                 << 252         crn_g4=0.;
245   if (ep >= e - 0.5 * amp || ep <= epmin_phn)  << 253         if(ep >= e-0.5*amp) return crn_g4;
246   aeff = 0.22 * a + 0.78 * pow(a, 0.89);  // s << 254         if(ep <= epmin_phn) return crn_g4;
247   sigph = 49.2 + 11.1 * G4Log(ep) + 151.8 / st << 255         aeff=0.22*a+0.78*pow(a,0.89); // shadowing
248   v = ep / e;                                  << 256         sigph=49.2+11.1*log(ep)+151.8/sqrt(ep); // microbarn
249   v1 = 1. - v;                                 << 257         v=ep/e;
250   v2 = v * v;                                  << 258         v1=1.-v;
251   amu2 = lamu * lamu;                          << 259         v2=v*v;
252   up = e * e * v1 / amu2 * (1. + amu2 * v2 / ( << 260         amu2=lamu*lamu;
253   down = 1. + ep / alam * (1. + alam / (2. * a << 261         up=e*e*v1/amu2*(1.+amu2*v2/(alam2*v1));
254   crn_g4 = coeffn * aeff / a * sigph / ep      << 262         down=1.+ep/alam*(1.+alam/(2.*amp)+ep/alam);
255            * (-v1 + (v1 + 0.5 * v2 * (1. + 2.  << 263         crn_g4=coeffn*aeff/a*sigph/ep*(-v1+(v1+0.5*v2*(1.+2.*amu2/alam2))*log(up/down));
256   if (crn_g4 < 0.) crn_g4 = 0.;                << 264         if(crn_g4 < 0.) crn_g4=0.;
257   return crn_g4;                               << 265         return crn_g4;
258 }                                                 266 }
259                                                   267 
260 //....oooOO0OOooo........oooOO0OOooo........oo    268 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
261                                                   269 
262 G4double MuCrossSections::CRP_Mephi(G4double z << 270 G4double MuCrossSections::CRP_Mephi(G4double z,G4double a,G4double tkin,G4double ep)
263                                                   271 
264 //********************************************    272 //**********************************************************************
265 //***        crp_g4_1.inc        in comparison    273 //***        crp_g4_1.inc        in comparison with crp_m.inc, following
266 //***        changes are introduced (January 1    274 //***        changes are introduced (January 16th, 1998):
267 //***                1) Avno/A, cm^2/gram GeV     275 //***                1) Avno/A, cm^2/gram GeV
268 //***                2) zeta_loss(E,Z)            276 //***                2) zeta_loss(E,Z)         from Kelner 1997, Eqs.(53-54)
269 //***                3) function crp_g4 (Z,A,T    277 //***                3) function crp_g4 (Z,A,Tkin,EP), Tkin is kinetic energy
270 //***                4) bbb=183        (Thomas    278 //***                4) bbb=183        (Thomas-Fermi)
271 //***                5) special case of hidrog    279 //***                5) special case of hidrogen (Z<1.5), bbb,g1,g2
272 //***                6) expansions in 'xi' are    280 //***                6) expansions in 'xi' are simplified        (Jan.17th,1998)
273 //***                                             281 //***
274 //***        Cross section for electron pair p    282 //***        Cross section for electron pair production by fast muon
275 //***        By R.P.Kokoulin, December 1997       283 //***        By R.P.Kokoulin, December 1997
276 //***        Formulae from Kokoulin & Petrukhi    284 //***        Formulae from Kokoulin & Petrukhin 1971, Hobart, Eqs.(1,8,9,10)
277 {                                                 285 {
278   //    G4double Z,A,Tkin,EP;                  << 286 //    G4double Z,A,Tkin,EP;
279   G4double crp_g4;                             << 287     G4double crp_g4;
280   G4double bbbtf, bbbh, g1tf, g2tf, g1h, g2h,  << 288     G4double bbbtf,bbbh,g1tf,g2tf,g1h,g2h,e,z13,e1,alf,a3,bbb;
281   G4double g1, g2, zeta1, zeta2, zeta, z2, scr << 289     G4double g1,g2,zeta1,zeta2,zeta,z2,screen0,a0,a1,bet,xi0,del;
282   G4double tmn, sum, a4, a5, a6, a7, a9, xi, x << 290     G4double tmn,sum,a4,a5,a6,a7,a9,xi,xii,xi1,screen,yeu,yed,ye1;
283   G4double ale, cre, be, fe, ymu, ymd, ym1, al << 291     G4double ale,cre,be,fe,ymu,ymd,ym1,alm_crm,a10,bm,fm;
284   //                                           << 292 //
285   G4double ame = 0.51099907e-3;  // GeV        << 293     G4double ame=0.51099907e-3; // GeV
286   G4double lamu = 0.105658389;  // GeV         << 294     G4double lamu=0.105658389; // GeV
287   G4double re = 2.81794092e-13;  // cm         << 295     G4double re=2.81794092e-13; // cm
288   G4double avno = 6.022137e23;                 << 296     G4double avno=6.022137e23;
289   G4double lpi = 3.14159265;                   << 297     G4double lpi=3.14159265;
290   G4double alpha = 1. / 137.036;               << 298     G4double alpha=1./137.036;
291   G4double rmass = lamu / ame;  // "207"       << 299     G4double rmass=lamu/ame; // "207"
292   G4double coeff = 4. / (3. * lpi) * (alpha *  << 300     G4double coeff=4./(3.*lpi)*(alpha*re)*(alpha*re)*avno; // cm^2
293   G4double sqrte = 1.64872127;  // sqrt(2.7182 << 301     G4double sqrte=1.64872127; // sqrt(2.71828...)
294   G4double c3 = 3. * sqrte * lamu / 4.;  // fo << 302     G4double c3=3.*sqrte*lamu/4.; // for limits
295   G4double c7 = 4. * ame;  // -"-              << 303     G4double c7=4.*ame; // -"-
296   G4double c8 = 6. * lamu * lamu;  // -"-      << 304     G4double c8=6.*lamu*lamu; // -"-
297                                                << 305 
298   G4double xgi[8] = {.0199, .1017, .2372, .408 << 306     G4double xgi[8]={.0199,.1017,.2372,.4083,.5917,.7628,.8983,.9801}; // Gauss, 8
299   G4double wgi[8] = {.0506, .1112, .1569, .181 << 307     G4double wgi[8]={.0506,.1112,.1569,.1813,.1813,.1569,.1112,.0506}; // Gauss, 8
300   bbbtf = 183.;  // for the moment...          << 308     bbbtf=183.; // for the moment...
301   bbbh = 202.4;  // for the moment...          << 309     bbbh=202.4; // for the moment...
302   g1tf = 1.95e-5;                              << 310     g1tf=1.95e-5;
303   g2tf = 5.3e-5;                               << 311     g2tf=5.3e-5;
304   g1h = 4.4e-5;                                << 312     g1h=4.4e-5;
305   g2h = 4.8e-5;                                << 313     g2h=4.8e-5;
306                                                << 314 
307   e = tkin + lamu;                             << 315         e=tkin+lamu;
308   z13 = fNist->GetZ13(G4lrint(z));             << 316         z13=pow(z,0.3333333);
309   e1 = e - ep;                                 << 317         e1=e-ep;
310   crp_g4 = 0.;                                 << 318         crp_g4=0.;
311   if (e1 <= c3 * z13) return crp_g4;  // ep >  << 319         if(e1 <= c3*z13) return crp_g4; // ep > max
312   alf = c7 / ep;  // 4m/ep                     << 320         alf=c7/ep; // 4m/ep
313   a3 = 1. - alf;                               << 321         a3=1.-alf;
314   if (a3 <= 0.) return crp_g4;  // ep < min    << 322         if(a3 <= 0.) return crp_g4; // ep < min
315   //***                zeta calculation        << 323 //***                zeta calculation
316   if (z <= 1.5)  // special case of hidrogen   << 324         if(z <= 1.5) // special case of hidrogen
317   {                                            << 325         {
318     bbb = bbbh;                                << 326           bbb=bbbh;
319     g1 = g1h;                                  << 327           g1=g1h;
320     g2 = g2h;                                  << 328           g2=g2h;
321   }                                            << 329         }
322   else {                                       << 330         else
323     bbb = bbbtf;                               << 331         {
324     g1 = g1tf;                                 << 332           bbb=bbbtf;
325     g2 = g2tf;                                 << 333           g1=g1tf;
326   }                                            << 334           g2=g2tf;
327   zeta1 = 0.073 * G4Log(e / (lamu + g1 * z13 * << 335         }
328   if (zeta1 > 0.) {                            << 336         zeta1=0.073*log(e/(lamu+g1*z13*z13*e))-0.26;
329     zeta2 = 0.058 * log(e / (lamu + g2 * z13 * << 337         if(zeta1 > 0.)
330     zeta = zeta1 / zeta2;                      << 338         {
331   }                                            << 339           zeta2=0.058*log(e/(lamu+g2*z13*e))-0.14;
332   else {                                       << 340           zeta=zeta1/zeta2;
333     zeta = 0.;                                 << 341         }
334   }                                            << 342         else
335   z2 = z * (z + zeta);  //                     << 343         {
336   //***                just to check (for comp << 344           zeta=0.;
337   //        z2=z*(z+1.)                        << 345         }
338   //        bbb=189.                           << 346         z2=z*(z+zeta); //
339   //***                                        << 347 //***                just to check (for comparison with crp_m)
340   screen0 = 2. * ame * sqrte * bbb / (z13 * ep << 348 //        z2=z*(z+1.)
341   a0 = e * e1;                                 << 349 //        bbb=189.
342   a1 = ep * ep / a0;  // 2*beta                << 350 //***
343   bet = 0.5 * a1;  // beta                     << 351         screen0=2.*ame*sqrte*bbb/(z13*ep); // be careful with "ame"
344   xi0 = 0.25 * rmass * rmass * a1;  // xi0     << 352         a0=e*e1;
345   del = c8 / a0;  // 6mu^2/EE'                 << 353         a1=ep*ep/a0; // 2*beta
346   tmn = G4Log((alf + 2. * del * a3) / (1. + (1 << 354         bet=0.5*a1; // beta
347   sum = 0.;                                    << 355         xi0=0.25*rmass*rmass*a1; // xi0
348   for (G4int i = 0; i < 8; ++i) {              << 356         del=c8/a0; // 6mu^2/EE'
349     a4 = G4Exp(tmn * xgi[i]);  // 1-r          << 357         tmn=log((alf+2.*del*a3)/(1.+(1.-del)*sqrt(a3))); // log(1-rmax)
350     a5 = a4 * (2. - a4);  // 1-r2              << 358         sum=0.;
351     a6 = 1. - a5;  // r2                       << 359         for(int i=0; i<=7; i++) // integration
352     a7 = 1. + a6;  // 1+r2                     << 360         {
353     a9 = 3. + a6;  // 3+r2                     << 361           a4=exp(tmn*xgi[i]); // 1-r
354     xi = xi0 * a5;                             << 362           a5=a4*(2.-a4); // 1-r2
355     xii = 1. / xi;                             << 363           a6=1.-a5; // r2
356     xi1 = 1. + xi;                             << 364           a7=1.+a6; // 1+r2
357     screen = screen0 * xi1 / a5;               << 365           a9=3.+a6; // 3+r2
358     yeu = 5. - a6 + 4. * bet * a7;             << 366           xi=xi0*a5;
359     yed = 2. * (1. + 3. * bet) * G4Log(3. + xi << 367           xii=1./xi;
360     ye1 = 1. + yeu / yed;                      << 368           xi1=1.+xi;
361     ale = G4Log(bbb / z13 * std::sqrt(xi1 * ye << 369           screen=screen0*xi1/a5;
362     cre = 0.5 * G4Log(1. + (1.5 / rmass * z13) << 370           yeu=5.-a6+4.*bet*a7;
363     if (xi <= 1e3) {                           << 371           yed=2.*(1.+3.*bet)*log(3.+xii)-a6-a1*(2.-a6);
364       be = ((2. + a6) * (1. + bet) + xi * a9)  << 372           ye1=1.+yeu/yed;
365     }                                          << 373           ale=log(bbb/z13*sqrt(xi1*ye1)/(1.+screen*ye1));
366     else {                                     << 374           cre=0.5*log(1.+(1.5/rmass*z13)*(1.5/rmass*z13)*xi1*ye1);
367       be = (3. - a6 + a1 * a7) / (2. * xi);  / << 375           if(xi <= 1e3) //
368     }                                          << 376           {
369     fe = std::max(0., (ale - cre) * be);       << 377             be=((2.+a6)*(1.+bet)+xi*a9)*log(1.+xii)+(a5-bet)/xi1-a9;
370     ymu = 4. + a6 + 3. * bet * a7;             << 378           }
371     ymd = a7 * (1.5 + a1) * G4Log(3. + xi) + 1 << 379           else
372     ym1 = 1. + ymu / ymd;                      << 380           {
373     alm_crm = G4Log(bbb * rmass / (1.5 * z13 * << 381             be=(3.-a6+a1*a7)/(2.*xi); // -(6.-5.*a6+3.*bet*a6)/(6.*xi*xi);
374     if (xi >= 1e-3) {                          << 382           }
375       a10 = (1. + a1) * a5;  // (1+2b)(1-r2)   << 383           fe=max(0.,(ale-cre)*be);          
376       bm = (a7 * (1. + 1.5 * bet) - a10 * xii) << 384           ymu=4.+a6+3.*bet*a7;
377     }                                          << 385           ymd=a7*(1.5+a1)*log(3.+xi)+1.-1.5*a6;
378     else {                                     << 386           ym1=1.+ymu/ymd;
379       bm = (5. - a6 + bet * a9) * (xi / 2.);   << 387           alm_crm=log(bbb*rmass/(1.5*z13*z13*(1.+screen*ym1)));
380     }                                          << 388           if(xi >= 1e-3) //
381     fm = max(0., (alm_crm)*bm);                << 389           {
382     //***                                      << 390             a10=(1.+a1)*a5; // (1+2b)(1-r2)
383     sum = sum + a4 * (fe + fm / (rmass * rmass << 391             bm=(a7*(1.+1.5*bet)-a10*xii)*log(xi1)+xi*(a5-bet)/xi1+a10;
384   }                                            << 392           }
385   crp_g4 = -tmn * sum * (z2 / a) * coeff * e1  << 393           else
386   return crp_g4;                               << 394           {
387 }                                              << 395             bm=(5.-a6+bet*a9)*(xi/2.); // -(11.-5.*a6+.5*bet*(5.+a6))*(xi*xi/6.)
388                                                << 396           }
389 //....oooOO0OOooo........oooOO0OOooo........oo << 397           fm=max(0.,(alm_crm)*bm);          
390                                                << 398 //***
391 G4double MuCrossSections::CRM_Mephi(G4double Z << 399           sum=sum+a4*(fe+fm/(rmass*rmass))*wgi[i];
392 {                                              << 400         }
393   /*                                           << 401         crp_g4=-tmn*sum*(z2/a)*coeff*e1/(e*ep);
394       ||Cross section for pair production of m << 402         return crp_g4;
395       ||By Siddharth Yajaman 19-07-2022        << 
396       ||Based on the formulae from Kelner, Kok << 
397       ||Physics of Atomic Nuclei, Vol. 63, No. << 
398       ||Equations (15) - (22)                  << 
399   */                                           << 
400                                                << 
401   const G4double xgi[] = {0.0198550717512320,  << 
402                           0.4082826787521750,  << 
403                           0.8983332387068135,  << 
404                                                << 
405   const G4double wgi[] = {0.0506142681451880,  << 
406                           0.1813418916891810,  << 
407                           0.1111905172266870,  << 
408                                                << 
409   static const G4double factorForCross =       << 
410     2. / (3 * CLHEP::pi)                       << 
411     * pow(CLHEP::fine_structure_const * CLHEP: << 
412                                                << 
413   if (pairEnergy <= 2. * fMuonMass) return 0.0 << 
414                                                << 
415   G4double totalEnergy = tkin + fMuonMass;     << 
416   G4double residEnergy = totalEnergy - pairEne << 
417                                                << 
418   if (residEnergy <= fMuonMass) return 0.0;    << 
419                                                << 
420   G4double a0 = 1.0 / (totalEnergy * residEner << 
421   G4double rhomax = 1.0 - 2 * fMuonMass / pair << 
422   G4double tmnexp = 1. - rhomax;               << 
423                                                << 
424   if (tmnexp >= 1.0) {                         << 
425     return 0.0;                                << 
426   }                                            << 
427                                                << 
428   G4double tmn = G4Log(tmnexp);                << 
429                                                << 
430   G4double z2 = Z * Z;                         << 
431   G4double beta = 0.5 * pairEnergy * pairEnerg << 
432   G4double xi0 = 0.5 * beta;                   << 
433                                                << 
434   // Gaussian integration in ln(1-ro) ( with 8 << 
435   G4double rho[8];                             << 
436   G4double rho2[8];                            << 
437   G4double xi[8];                              << 
438   G4double xi1[8];                             << 
439   G4double xii[8];                             << 
440                                                << 
441   for (G4int i = 0; i < 8; ++i) {              << 
442     rho[i] = G4Exp(tmn * xgi[i]) - 1.0;  // rh << 
443     rho2[i] = rho[i] * rho[i];                 << 
444     xi[i] = xi0 * (1.0 - rho2[i]);             << 
445     xi1[i] = 1.0 + xi[i];                      << 
446     xii[i] = 1.0 / xi[i];                      << 
447   }                                            << 
448                                                << 
449   G4double ximax = xi0 * (1. - rhomax * rhomax << 
450                                                << 
451   G4double Y = 10 * sqrt(fMuonMass / totalEner << 
452   G4double U[8];                               << 
453                                                << 
454   for (G4int i = 0; i < 8; ++i) {              << 
455     U[i] = U_func(Z, rho2[i], xi[i], Y, pairEn << 
456   }                                            << 
457                                                << 
458   G4double UMax = U_func(Z, rhomax * rhomax, x << 
459                                                << 
460   G4double sum = 0.0;                          << 
461                                                << 
462   for (G4int i = 0; i < 8; ++i) {              << 
463     G4double X = 1 + U[i] - UMax;              << 
464     G4double lnX = G4Log(X);                   << 
465     G4double phi = ((2 + rho2[i]) * (1 + beta) << 
466                    - 3 * rho2[i] + beta * (1 - << 
467                    + ((1 + rho2[i]) * (1 + 1.5 << 
468                        * G4Log(xi1[i]);        << 
469     sum += wgi[i] * (1.0 + rho[i]) * phi * lnX << 
470   }                                            << 
471                                                << 
472   return -tmn * sum * factorForCross * z2 * re << 
473 }                                                 403 }
474                                                << 
475 //....oooOO0OOooo........oooOO0OOooo........oo    404 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
476                                                   405 
477 G4double MuCrossSections::U_func(G4double Z, G << 
478                                  G4double pair << 
479 {                                              << 
480   G4int z = G4lrint(Z);                        << 
481   G4double A27 = fNist->GetA27(z);             << 
482   G4double Z13 = fNist->GetZ13(z);             << 
483   static const G4double sqe = 2 * std::sqrt(G4 << 
484   G4double res = (0.65 * B / (A27 * Z13) * fMu << 
485                  / (1                          << 
486                     + (sqe * B * (1 + xi) * (1 << 
487                         / (Z13 * CLHEP::electr << 
488   return res;                                  << 
489 }                                              << 
490                                                   406 
491 //....oooOO0OOooo........oooOO0OOooo........oo << 
492                                                   407