Geant4 Cross Reference

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


  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 // 24.11.08 V. Grichine - first implementation     26 // 24.11.08 V. Grichine - first implementation
 27 //                                                 27 //
 28 // 04.09.18 V. Ivantchenko Major revision of i << 
 29 // 27.05.19 V. Ivantchenko Removed obsolete me << 
 30                                                    28 
 31 #include "G4ComponentGGNuclNuclXsc.hh"             29 #include "G4ComponentGGNuclNuclXsc.hh"
 32                                                    30 
 33 #include "G4PhysicalConstants.hh"                  31 #include "G4PhysicalConstants.hh"
 34 #include "G4SystemOfUnits.hh"                      32 #include "G4SystemOfUnits.hh"
 35 #include "G4NucleiProperties.hh"               <<  33 #include "G4ParticleTable.hh"
                                                   >>  34 #include "G4IonTable.hh"
 36 #include "G4ParticleDefinition.hh"                 35 #include "G4ParticleDefinition.hh"
                                                   >>  36 #include "G4HadTmpUtil.hh"
 37 #include "G4HadronNucleonXsc.hh"                   37 #include "G4HadronNucleonXsc.hh"
 38 #include "G4ComponentGGHadronNucleusXsc.hh"    << 
 39 #include "G4NuclearRadii.hh"                   << 
 40 #include "G4Pow.hh"                            << 
 41                                                    38 
 42 namespace                                      << 
 43 {                                              << 
 44   const G4double inve = 1./CLHEP::eplus;       << 
 45 }                                              << 
 46                                                    39 
 47 G4ComponentGGNuclNuclXsc::G4ComponentGGNuclNuc     40 G4ComponentGGNuclNuclXsc::G4ComponentGGNuclNuclXsc() 
 48  : G4VComponentCrossSection("Glauber-Gribov Nu <<  41  : G4VComponentCrossSection("Glauber-Gribov nucleus nucleus"),
                                                   >>  42 //   fUpperLimit(100000*GeV),
                                                   >>  43    fLowerLimit(0.1*MeV),
                                                   >>  44    fRadiusConst(1.08*fermi),  // 1.1, 1.3 ?
                                                   >>  45    fTotalXsc(0.0), fElasticXsc(0.0), fInelasticXsc(0.0), fProductionXsc(0.0),
                                                   >>  46    fDiffractionXsc(0.0),
                                                   >>  47     cacheDP(G4Proton::Proton(),G4ParticleMomentum(1.,0,0),0),
                                                   >>  48     dProton(G4Proton::Proton(),G4ParticleMomentum(1.,0,0),0),
                                                   >>  49     dNeutron(G4Neutron::Neutron(),G4ParticleMomentum(1.,0,0),0)
                                                   >>  50 // , fHadronNucleonXsc(0.0)
 49 {                                                  51 {
 50   theProton   = G4Proton::Proton();                52   theProton   = G4Proton::Proton();
 51   theNeutron  = G4Neutron::Neutron();              53   theNeutron  = G4Neutron::Neutron();
 52   theLambda  = G4Lambda::Lambda();             <<  54   hnXsc = new G4HadronNucleonXsc();
 53   fHNXsc = new G4HadronNucleonXsc();           << 
 54   fHadrNucl = new G4ComponentGGHadronNucleusXs << 
 55 }                                                  55 }
 56                                                    56 
                                                   >>  57 
 57 G4ComponentGGNuclNuclXsc::~G4ComponentGGNuclNu     58 G4ComponentGGNuclNuclXsc::~G4ComponentGGNuclNuclXsc()
 58 {                                                  59 {
 59   delete fHNXsc;                               <<  60   delete hnXsc;
 60 }                                                  61 }
 61                                                    62 
 62 ////////////////////////////////////////////// <<  63 ////////////////////////////////////////////////////////////////////
 63                                                    64 
 64 G4double G4ComponentGGNuclNuclXsc::GetTotalEle <<  65 G4double G4ComponentGGNuclNuclXsc::GetTotalIsotopeCrossSection(const G4ParticleDefinition* aParticle,
 65          const G4ParticleDefinition* aParticle <<  66                G4double kinEnergy,
 66    G4int Z, G4double A)                        <<  67                G4int Z, G4int A)
 67 {                                              <<  68 {
 68   ComputeCrossSections(aParticle, kinEnergy, Z <<  69   cacheDP.SetDefinition(aParticle);
                                                   >>  70   cacheDP.SetKineticEnergy(kinEnergy);
                                                   >>  71   fInelasticXsc = GetZandACrossSection(&cacheDP, Z, A);
 69   return fTotalXsc;                                72   return fTotalXsc;
 70 }                                                  73 }
 71                                                    74 
 72 ////////////////////////////////////////////// <<  75 //////////////////////////////////////////////////////////////////////
 73                                                    76 
 74 G4double G4ComponentGGNuclNuclXsc::GetTotalIso <<  77 G4double G4ComponentGGNuclNuclXsc::GetTotalElementCrossSection(const G4ParticleDefinition* aParticle,
 75          const G4ParticleDefinition* aParticle <<  78                G4double kinEnergy, 
 76    G4int Z, G4int A)                           <<  79                G4int Z, G4double A)
 77 {                                              <<  80 {
 78   ComputeCrossSections(aParticle, kinEnergy, Z <<  81   cacheDP.SetDefinition(aParticle);
                                                   >>  82   cacheDP.SetKineticEnergy(kinEnergy);
                                                   >>  83   fInelasticXsc = GetZandACrossSection(&cacheDP, Z, G4int(A));
 79   return fTotalXsc;                                84   return fTotalXsc;
 80 }                                                  85 }
 81                                                    86 
 82 ////////////////////////////////////////////// <<  87 ////////////////////////////////////////////////////////////////////
 83                                                    88 
 84 G4double G4ComponentGGNuclNuclXsc::GetInelasti <<  89 G4double G4ComponentGGNuclNuclXsc::GetInelasticIsotopeCrossSection(const G4ParticleDefinition* aParticle,
 85          const G4ParticleDefinition* aParticle <<  90              G4double kinEnergy, 
 86    G4int Z, G4double A)                        <<  91              G4int Z, G4int A)
 87 {                                              <<  92 {
 88   ComputeCrossSections(aParticle, kinEnergy, Z <<  93   cacheDP.SetDefinition(aParticle);
                                                   >>  94   cacheDP.SetKineticEnergy(kinEnergy);
                                                   >>  95   fInelasticXsc = GetZandACrossSection(&cacheDP, Z, A);
 89   return fInelasticXsc;                            96   return fInelasticXsc;
 90 }                                                  97 }
 91                                                    98 
 92 ////////////////////////////////////////////// <<  99 /////////////////////////////////////////////////////////////////////
 93                                                   100 
 94 G4double G4ComponentGGNuclNuclXsc::GetInelasti << 101 G4double G4ComponentGGNuclNuclXsc::GetInelasticElementCrossSection(const G4ParticleDefinition* aParticle,
 95          const G4ParticleDefinition* aParticle << 102              G4double kinEnergy, 
 96    G4int Z, G4int A)                           << 103              G4int Z, G4double A)
 97 {                                              << 104 {
 98   ComputeCrossSections(aParticle, kinEnergy, Z << 105   cacheDP.SetDefinition(aParticle);
                                                   >> 106   cacheDP.SetKineticEnergy(kinEnergy);
                                                   >> 107   fInelasticXsc = GetZandACrossSection(&cacheDP, Z, G4int(A));
 99   return fInelasticXsc;                           108   return fInelasticXsc;
100 }                                                 109 }
101                                                   110 
102 //////////////////////////////////////////////    111 //////////////////////////////////////////////////////////////////
103                                                   112 
104 G4double G4ComponentGGNuclNuclXsc::GetElasticE << 113 G4double G4ComponentGGNuclNuclXsc::GetElasticElementCrossSection(const G4ParticleDefinition* aParticle,
105          const G4ParticleDefinition* aParticle << 114            G4double kinEnergy, 
106    G4int Z, G4double A)                        << 115            G4int Z, G4double A)
107 {                                              << 116 {
108   ComputeCrossSections(aParticle, kinEnergy, Z << 117   cacheDP.SetDefinition(aParticle);
                                                   >> 118   cacheDP.SetKineticEnergy(kinEnergy);
                                                   >> 119   fInelasticXsc = GetZandACrossSection(&cacheDP, Z, G4int(A));
109   return fElasticXsc;                             120   return fElasticXsc;
110 }                                                 121 }
111                                                   122 
112 //////////////////////////////////////////////    123 ///////////////////////////////////////////////////////////////////
113                                                   124 
114 G4double G4ComponentGGNuclNuclXsc::GetElasticI << 125 G4double G4ComponentGGNuclNuclXsc::GetElasticIsotopeCrossSection(const G4ParticleDefinition* aParticle,
115          const G4ParticleDefinition* aParticle << 126            G4double kinEnergy, 
116    G4int Z, G4int A)                           << 127            G4int Z, G4int A)
117 {                                              << 128 {
118   ComputeCrossSections(aParticle, kinEnergy, Z << 129   cacheDP.SetDefinition(aParticle);
                                                   >> 130   cacheDP.SetKineticEnergy(kinEnergy);
                                                   >> 131   fInelasticXsc = GetZandACrossSection(&cacheDP, Z, A);
119   return fElasticXsc;                             132   return fElasticXsc;
120 }                                                 133 }
121                                                   134 
122 //////////////////////////////////////////////    135 ////////////////////////////////////////////////////////////////
123                                                   136  
124 G4double G4ComponentGGNuclNuclXsc::ComputeQuas << 137 G4double G4ComponentGGNuclNuclXsc::ComputeQuasiElasticRatio(const G4ParticleDefinition* aParticle,
125          const G4ParticleDefinition* aParticle << 138            G4double kinEnergy, 
126    G4int Z, G4int A)                           << 139            G4int Z, G4int A)
127 {                                              << 140 {
128   ComputeCrossSections(aParticle, kinEnergy, Z << 141   cacheDP.SetDefinition(aParticle);
129   return (fInelasticXsc > fProductionXsc)      << 142   cacheDP.SetKineticEnergy(kinEnergy);
130     ? (fInelasticXsc - fProductionXsc)/fInelas << 143   fInelasticXsc = GetZandACrossSection(&cacheDP, Z, A);
131 }                                              << 144   G4double ratio = 0.;
132                                                   145 
133 ////////////////////////////////////////////// << 146   if(fInelasticXsc > 0.)
                                                   >> 147   {
                                                   >> 148     ratio = (fInelasticXsc - fProductionXsc)/fInelasticXsc;
                                                   >> 149     if(ratio < 0.) ratio = 0.;
                                                   >> 150   }
                                                   >> 151   return ratio;
                                                   >> 152 }
134                                                   153  
135 void G4ComponentGGNuclNuclXsc::BuildPhysicsTab << 
136 {}                                             << 
137                                                << 
138 //////////////////////////////////////////////    154 //////////////////////////////////////////////////////////////////////
139                                                   155 
140 void G4ComponentGGNuclNuclXsc::DumpPhysicsTabl << 156 void
                                                   >> 157 G4ComponentGGNuclNuclXsc::CrossSectionDescription(std::ostream& outFile) const
141 {                                                 158 {
142   G4cout << "G4ComponentGGNuclNuclXsc: uses Gl << 159   outFile << "G4ComponentGGNuclNuclXsc calculates total, inelastic and\n"
                                                   >> 160           << "elastic cross sections for nucleus-nucleus collisions using\n"
                                                   >> 161           << "the Glauber model with Gribov corrections.  It is valid for\n"
                                                   >> 162           << "all incident energies above 100 keV./n";
143 }                                                 163 }
144                                                   164 
145 ////////////////////////////////////////////// << 165 /////////////////////////////////////////////////////////////////////
146                                                   166 
147 void G4ComponentGGNuclNuclXsc::Description(std << 167 G4bool 
                                                   >> 168 G4ComponentGGNuclNuclXsc::IsElementApplicable(const G4DynamicParticle* aDP, 
                                                   >> 169                 G4int Z, const G4Material*)
148 {                                                 170 {
149   outFile << "G4ComponentGGNuclNuclXsc calcula << 171   G4bool applicable = false;
150           << "elastic cross sections for nucle << 172   G4double kineticEnergy = aDP->GetKineticEnergy();
151           << "the Glauber model with Gribov co << 173 
152           << "all incident energies above 100  << 174   if (kineticEnergy >= fLowerLimit && Z > 1) applicable = true;
153     << "For the hydrogen target G4HadronNucleo << 175   return applicable;
                                                   >> 176 }
                                                   >> 177 
                                                   >> 178 ///////////////////////////////////////////////////////////////////////////////
                                                   >> 179 //
                                                   >> 180 // Calculates total and inelastic Xsc, derives elastic as total - inelastic 
                                                   >> 181 // accordong to Glauber model with Gribov correction calculated in the dipole 
                                                   >> 182 // approximation on light cone. Gaussian density helps to calculate rest 
                                                   >> 183 // integrals of the model. [1] B.Z. Kopeliovich, nucl-th/0306044 
                                                   >> 184 
                                                   >> 185 
                                                   >> 186 G4double G4ComponentGGNuclNuclXsc::
                                                   >> 187 GetElementCrossSection(const G4DynamicParticle* aParticle, G4int Z,
                                                   >> 188            const G4Material*)
                                                   >> 189 {
                                                   >> 190   G4int A = G4lrint(G4NistManager::Instance()->GetAtomicMassAmu(Z));
                                                   >> 191   return GetZandACrossSection(aParticle, Z, A);
154 }                                                 192 }
155                                                   193 
156 //////////////////////////////////////////////    194 ///////////////////////////////////////////////////////////////////////////////
157 //                                                195 //
158 // Calculates total and inelastic Xsc, derives    196 // Calculates total and inelastic Xsc, derives elastic as total - inelastic 
159 // accordong to Glauber model with Gribov corr    197 // accordong to Glauber model with Gribov correction calculated in the dipole 
160 // approximation on light cone. Gaussian densi    198 // approximation on light cone. Gaussian density of point-like nucleons helps 
161 // to calculate rest integrals of the model. [    199 // to calculate rest integrals of the model. [1] B.Z. Kopeliovich,
162 // nucl-th/0306044 + simplification above         200 // nucl-th/0306044 + simplification above
163                                                   201 
164 void G4ComponentGGNuclNuclXsc::ComputeCrossSec << 
165      const G4ParticleDefinition* aParticle, G4 << 
166      G4int Z, G4int A)                         << 
167 {                                              << 
168   // check cache                               << 
169   if(aParticle == fParticle && fZ == Z && fA = << 
170     { return; }                                << 
171   fParticle = aParticle;                       << 
172   fZ = Z;                                      << 
173   fA = A;                                      << 
174   fEnergy = kinEnergy;                         << 
175   G4Pow* pG4Pow = G4Pow::GetInstance();        << 
176                                                << 
177   G4int pZ = G4lrint(aParticle->GetPDGCharge() << 
178   G4int pA = aParticle->GetBaryonNumber();     << 
179   G4int pL = aParticle->GetNumberOfLambdasInHy << 
180   G4bool pHN = aParticle->IsHypernucleus();    << 
181   G4double cHN(0.88);                          << 
182                                                << 
183   // hydrogen                                  << 
184   if(1 == Z && 1 == A) {                       << 
185     G4double e = kinEnergy*CLHEP::proton_mass_ << 
186     fHadrNucl->ComputeCrossSections( theProton << 
187     fTotalXsc = fHadrNucl->GetTotalGlauberGrib << 
188     fElasticXsc = fHadrNucl->GetElasticGlauber << 
189     fInelasticXsc = fHadrNucl->GetInelasticGla << 
190     fProductionXsc = fHadrNucl->GetProductionG << 
191     fDiffractionXsc = fHadrNucl->GetDiffractio << 
192     return;                                    << 
193   }                                            << 
194   static const G4double cofInelastic = 2.4;    << 
195   static const G4double cofTotal = 2.0;        << 
196                                                   202 
197   G4double pTkin = kinEnergy/(G4double)pA;     << 203 G4double G4ComponentGGNuclNuclXsc::
                                                   >> 204 GetZandACrossSection(const G4DynamicParticle* aParticle,
                                                   >> 205                      G4int tZ, G4int tA)
                                                   >> 206 {
                                                   >> 207   G4double xsection;
                                                   >> 208   G4double sigma;
                                                   >> 209   G4double cofInelastic = 2.4;
                                                   >> 210   G4double cofTotal = 2.0;
                                                   >> 211   G4double nucleusSquare;
                                                   >> 212   G4double cB;
                                                   >> 213   G4double ratio;
                                                   >> 214 
                                                   >> 215   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
                                                   >> 216   G4double pA = aParticle->GetDefinition()->GetBaryonNumber();
                                                   >> 217 
                                                   >> 218   G4double pTkin = aParticle->GetKineticEnergy();  
                                                   >> 219   pTkin /= pA;
                                                   >> 220 
                                                   >> 221   G4double pN = pA - pZ;
                                                   >> 222   if( pN < 0. ) pN = 0.;
198                                                   223 
199   G4int pN = pA - pZ;                          << 224   G4double tN = tA - tZ;
200   G4int tN = A - Z;                            << 225   if( tN < 0. ) tN = 0.;
201                                                   226 
202   G4double tR = G4NuclearRadii::Radius(Z, A);  << 227   G4double tR = GetNucleusRadius( G4double(tZ),G4double(tA) );  
203   G4double pR = G4NuclearRadii::Radius(pZ, pA) << 228   G4double pR = GetNucleusRadius(pZ,pA); 
204                                                << 229 
205   if(pHN)                                      << 230   cB = GetCoulombBarier(aParticle, G4double(tZ), G4double(tA), pR, tR);
206     pR *= std::sqrt( pG4Pow->Z23( pA - pL ) +  << 
207                                                << 
208   G4double cB = ComputeCoulombBarier(aParticle << 
209                                                   231 
210   if ( cB > 0. )                                  232   if ( cB > 0. ) 
211   {                                               233   {
212     G4double sigma = (pZ*Z+pN*tN)*fHNXsc->Hadr << 234     dProton.SetKineticEnergy(pTkin);
213     if(pHN) sigma += pL*A*fHNXsc->HadronNucleo << 235     dNeutron.SetKineticEnergy(pTkin);
214     G4double ppInXsc = fHNXsc->GetInelasticHad << 236 
215                                                << 237     sigma = (pZ*tZ+pN*tN)*hnXsc->GetHadronNucleonXscNS(&dProton, theProton);
216     sigma += (pZ*tN+pN*Z)*fHNXsc->HadronNucleo << 238 
217     G4double npInXsc = fHNXsc->GetInelasticHad << 239     G4double ppInXsc = hnXsc->GetInelasticHadronNucleonXsc();
218                                                << 240 
219     G4double nucleusSquare = cofTotal*CLHEP::p << 241     sigma += (pZ*tN+pN*tZ)*hnXsc->GetHadronNucleonXscNS(&dNeutron, theProton);
220                                                << 242 
221     G4double ratio= sigma/nucleusSquare;       << 243     G4double npInXsc = hnXsc->GetInelasticHadronNucleonXsc();
222     fTotalXsc     = nucleusSquare*G4Log( 1. +  << 244 
223     fInelasticXsc = nucleusSquare*G4Log( 1. +  << 245     // G4cout<<"ppInXsc = "<<ppInXsc/millibarn<<"; npInXsc = "<<npInXsc/millibarn<<G4endl;
224     fElasticXsc   = std::max(fTotalXsc - fInel << 246     // G4cout<<"npTotXsc = "<<hnXsc->GetTotalHadronNucleonXsc()/millibarn<<"; npElXsc = "
                                                   >> 247     //                      <<hnXsc->GetElasticHadronNucleonXsc()/millibarn<<G4endl;
225                                                   248 
                                                   >> 249     nucleusSquare = cofTotal*pi*( pR*pR + tR*tR );   // basically 2piRR
                                                   >> 250 
                                                   >> 251     ratio      = sigma/nucleusSquare;
                                                   >> 252     xsection   = nucleusSquare*G4Log( 1. + ratio );
                                                   >> 253     fTotalXsc  = xsection;
                                                   >> 254     fTotalXsc *= cB;
                                                   >> 255 
                                                   >> 256     fInelasticXsc = nucleusSquare*G4Log( 1. + cofInelastic*ratio )/cofInelastic;
                                                   >> 257 
                                                   >> 258     fInelasticXsc *= cB;
                                                   >> 259     fElasticXsc   = fTotalXsc - fInelasticXsc;
                                                   >> 260 
                                                   >> 261     // if (fElasticXsc < DBL_MIN) fElasticXsc = DBL_MIN;
                                                   >> 262     /*    
226     G4double difratio = ratio/(1.+ratio);         263     G4double difratio = ratio/(1.+ratio);
                                                   >> 264 
227     fDiffractionXsc = 0.5*nucleusSquare*( difr    265     fDiffractionXsc = 0.5*nucleusSquare*( difratio - G4Log( 1. + difratio ) );
                                                   >> 266     */
                                                   >> 267     // production to be checked !!! edit MK xsc
                                                   >> 268 
                                                   >> 269     //sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscMK(theProton, pTkin, theProton) +
                                                   >> 270     //      (pZ*tN+pN*tZ)*GetHadronNucleonXscMK(theProton, pTkin, theNeutron);
                                                   >> 271 
                                                   >> 272     sigma = (pZ*tZ+pN*tN)*ppInXsc + (pZ*tN+pN*tZ)*npInXsc;
                                                   >> 273  
                                                   >> 274     ratio = sigma/nucleusSquare;
                                                   >> 275     fProductionXsc = nucleusSquare*G4Log( 1. + cofInelastic*ratio )/cofInelastic;
228                                                   276 
229     G4double xratio= ((pZ*Z+pN*tN)*ppInXsc + ( << 277     if (fElasticXsc < 0.) fElasticXsc = 0.;
230     fProductionXsc = nucleusSquare*G4Log( 1. + << 
231     fProductionXsc = std::min(fProductionXsc,  << 
232   }                                               278   }
233   else                                            279   else
234   {                                               280   {
235     fInelasticXsc = fTotalXsc = fElasticXsc =  << 281     fInelasticXsc  = 0.;
                                                   >> 282     fTotalXsc      = 0.;
                                                   >> 283     fElasticXsc    = 0.;
                                                   >> 284     fProductionXsc = 0.;
236   }                                               285   }
                                                   >> 286   return fInelasticXsc;   // xsection; 
237 }                                                 287 }
238                                                   288 
239 //////////////////////////////////////////////    289 ///////////////////////////////////////////////////////////////////////////////
                                                   >> 290 //
                                                   >> 291 //
240                                                   292 
241 G4double G4ComponentGGNuclNuclXsc::ComputeCoul << 293 G4double G4ComponentGGNuclNuclXsc::
242                      const G4ParticleDefinitio << 294 GetCoulombBarier(const G4DynamicParticle* aParticle, G4double tZ, G4double tA,
243          G4double pTkin, G4int Z, G4int A,     << 295                  G4double pR, G4double tR)
244          G4double pR, G4double tR)             << 296 {
245 {                                              << 297   G4double ratio;
246   G4int pZ = aParticle->GetPDGCharge()*inve;   << 298   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
247   G4double pM = aParticle->GetPDGMass();       << 299 
248   G4double tM = G4NucleiProperties::GetNuclear << 300   G4double pTkin = aParticle->GetKineticEnergy();
                                                   >> 301   // G4double pPlab = aParticle->GetTotalMomentum();
                                                   >> 302   G4double pM    = aParticle->GetDefinition()->GetPDGMass();
                                                   >> 303   // G4double tM    = tZ*proton_mass_c2 + (tA-tZ)*neutron_mass_c2; // ~ 1% accuracy
                                                   >> 304   G4double tM    = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass( G4int(tZ), G4int(tA) );
249   G4double pElab = pTkin + pM;                    305   G4double pElab = pTkin + pM;
250   G4double totEcm = std::sqrt(pM*pM + tM*tM +  << 306   G4double totEcm  = std::sqrt(pM*pM + tM*tM + 2.*pElab*tM);
251   G4double totTcm = totEcm - pM -tM;           << 307   // G4double pPcm  = pPlab*tM/totEcm;
                                                   >> 308   // G4double pTcm  = std::sqrt(pM*pM + pPcm*pPcm) - pM;
                                                   >> 309   G4double totTcm  = totEcm - pM -tM;
252                                                   310 
253   // 0.5 defines shape of Cross section correc << 311   G4double bC    = fine_structure_const*hbarc*pZ*tZ;
254   // at cB = totTcm it become zero             << 312            bC   /= pR + tR;
255   static const G4double qfact = 0.5*CLHEP::elm << 313            bC   /= 2.;  // 4., 2. parametrisation cof ??? vmg
256   G4double bC = qfact*pZ*Z/(pR + tR);          << 314 
257                                                << 315      // G4cout<<"pTkin = "<<pTkin/GeV<<"; pPlab = "
258   G4double ratio = (totTcm <= bC) ? 0. : 1. -  << 316      // <<pPlab/GeV<<"; bC = "<<bC/GeV<<"; pTcm = "<<pTcm/GeV<<G4endl;
259                                                << 317 
260 #ifdef G4VERBOSE                               << 318   if( totTcm <= bC ) ratio = 0.;
261   if (GetVerboseLevel() > 1) {                 << 319   else             ratio = 1. - bC/totTcm;
262     G4cout << "G4ComponentGGNuclNuclXsc::Compu << 320 
263      << "; pTkin(GeV)=" << pTkin/CLHEP::MeV    << 321   // if(ratio < DBL_MIN) ratio = DBL_MIN;
264      << " totTcm= " << totTcm/CLHEP::MeV<< ";  << 322   if( ratio < 0.) ratio = 0.;
265      << G4endl;                                << 323 
266   }                                            << 324   // G4cout <<"ratio = "<<ratio<<G4endl;
267 #endif                                         << 
268   return ratio;                                   325   return ratio;
269 }                                                 326 }
270                                                   327 
                                                   >> 328 
271 //////////////////////////////////////////////    329 //////////////////////////////////////////////////////////////////////////
272 //                                                330 //
273 // Return single-diffraction/inelastic cross-s    331 // Return single-diffraction/inelastic cross-section ratio
274                                                   332 
275 G4double G4ComponentGGNuclNuclXsc::GetRatioSD( << 333 G4double G4ComponentGGNuclNuclXsc::
276          const G4DynamicParticle* aParticle, G << 334 GetRatioSD(const G4DynamicParticle* aParticle, G4double tA, G4double tZ)
277 {                                                 335 {
278   ComputeCrossSections(aParticle->GetDefinitio << 336   G4double sigma, cofInelastic = 2.4, cofTotal = 2.0, nucleusSquare, ratio;
279                        aParticle->GetKineticEn << 337 
280            G4lrint(tZ), G4lrint(tA));          << 338   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
                                                   >> 339   G4double pA = aParticle->GetDefinition()->GetBaryonNumber();
                                                   >> 340 
                                                   >> 341   G4double pTkin = aParticle->GetKineticEnergy();  
                                                   >> 342   pTkin /= pA;
                                                   >> 343 
                                                   >> 344   G4double pN = pA - pZ;
                                                   >> 345   if( pN < 0. ) pN = 0.;
                                                   >> 346 
                                                   >> 347   G4double tN = tA - tZ;
                                                   >> 348   if( tN < 0. ) tN = 0.;
                                                   >> 349 
                                                   >> 350   G4double tR = GetNucleusRadius(tZ,tA);  
                                                   >> 351   G4double pR = GetNucleusRadius(pZ,pA); 
281                                                   352 
282   return (fInelasticXsc > 0.0) ? fDiffractionX << 353   sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscNS(theProton, pTkin, theProton) +
                                                   >> 354           (pZ*tN+pN*tZ)*GetHadronNucleonXscNS(theProton, pTkin, theNeutron);
                                                   >> 355 
                                                   >> 356   nucleusSquare = cofTotal*pi*( pR*pR + tR*tR );   // basically 2piRR
                                                   >> 357   ratio = sigma/nucleusSquare;
                                                   >> 358   fInelasticXsc = nucleusSquare*G4Log(1. + cofInelastic*ratio)/cofInelastic;
                                                   >> 359   G4double difratio = ratio/(1.+ratio);
                                                   >> 360 
                                                   >> 361   fDiffractionXsc = 0.5*nucleusSquare*( difratio - G4Log( 1. + difratio ) );
                                                   >> 362 
                                                   >> 363   if (fInelasticXsc > 0.) ratio = fDiffractionXsc/fInelasticXsc;
                                                   >> 364   else                    ratio = 0.;
                                                   >> 365 
                                                   >> 366   return ratio; 
283 }                                                 367 }
284                                                   368 
285 //////////////////////////////////////////////    369 //////////////////////////////////////////////////////////////////////////
286 //                                                370 //
287 // Return quasi-elastic/inelastic cross-sectio    371 // Return quasi-elastic/inelastic cross-section ratio
288                                                   372 
289 G4double G4ComponentGGNuclNuclXsc::GetRatioQE( << 373 G4double G4ComponentGGNuclNuclXsc::
290          const G4DynamicParticle* aParticle, G << 374 GetRatioQE(const G4DynamicParticle* aParticle, G4double tA, G4double tZ)
                                                   >> 375 {
                                                   >> 376   G4double sigma, cofInelastic = 2.4, cofTotal = 2.0, nucleusSquare, ratio;
                                                   >> 377 
                                                   >> 378   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
                                                   >> 379   G4double pA = aParticle->GetDefinition()->GetBaryonNumber();
                                                   >> 380 
                                                   >> 381   G4double pTkin = aParticle->GetKineticEnergy();  
                                                   >> 382   pTkin /= pA;
                                                   >> 383 
                                                   >> 384   G4double pN = pA - pZ;
                                                   >> 385   if( pN < 0. ) pN = 0.;
                                                   >> 386 
                                                   >> 387   G4double tN = tA - tZ;
                                                   >> 388   if( tN < 0. ) tN = 0.;
                                                   >> 389 
                                                   >> 390   G4double tR = GetNucleusRadius(tZ,tA);  
                                                   >> 391   G4double pR = GetNucleusRadius(pZ,pA); 
                                                   >> 392 
                                                   >> 393   sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscNS(theProton, pTkin, theProton) +
                                                   >> 394           (pZ*tN+pN*tZ)*GetHadronNucleonXscNS(theProton, pTkin, theNeutron);
                                                   >> 395 
                                                   >> 396   nucleusSquare = cofTotal*pi*( pR*pR + tR*tR );   // basically 2piRR
                                                   >> 397   ratio = sigma/nucleusSquare;
                                                   >> 398   fInelasticXsc = nucleusSquare*G4Log(1. + cofInelastic*ratio)/cofInelastic;
                                                   >> 399 
                                                   >> 400   //  sigma = GetHNinelasticXsc(aParticle, tA, tZ);
                                                   >> 401   ratio = sigma/nucleusSquare;
                                                   >> 402   fProductionXsc = nucleusSquare*G4Log(1. + cofInelastic*ratio)/cofInelastic;
                                                   >> 403 
                                                   >> 404   if (fInelasticXsc > fProductionXsc) ratio = (fInelasticXsc-fProductionXsc)/fInelasticXsc;
                                                   >> 405   else                                ratio = 0.;
                                                   >> 406   if ( ratio < 0. )                   ratio = 0.;
                                                   >> 407 
                                                   >> 408   return ratio; 
                                                   >> 409 }
                                                   >> 410 
                                                   >> 411 ///////////////////////////////////////////////////////////////////////////////
                                                   >> 412 //
                                                   >> 413 // Returns hadron-nucleon Xsc according to differnt parametrisations:
                                                   >> 414 // [2] E. Levin, hep-ph/9710546
                                                   >> 415 // [3] U. Dersch, et al, hep-ex/9910052
                                                   >> 416 // [4] M.J. Longo, et al, Phys.Rev.Lett. 33 (1974) 725 
                                                   >> 417 
                                                   >> 418 G4double 
                                                   >> 419 G4ComponentGGNuclNuclXsc::GetHadronNucleonXsc(const G4DynamicParticle* aParticle, 
                                                   >> 420                                               const G4Element* anElement)
                                                   >> 421 {
                                                   >> 422   G4int At = G4lrint(anElement->GetN());  // number of nucleons 
                                                   >> 423   G4int Zt = G4lrint(anElement->GetZ());  // number of protons
                                                   >> 424   return GetHadronNucleonXsc(aParticle, At, Zt);
                                                   >> 425 }
                                                   >> 426 
                                                   >> 427 
                                                   >> 428 
                                                   >> 429 
                                                   >> 430 ///////////////////////////////////////////////////////////////////////////////
                                                   >> 431 //
                                                   >> 432 // Returns hadron-nucleon Xsc according to differnt parametrisations:
                                                   >> 433 // [2] E. Levin, hep-ph/9710546
                                                   >> 434 // [3] U. Dersch, et al, hep-ex/9910052
                                                   >> 435 // [4] M.J. Longo, et al, Phys.Rev.Lett. 33 (1974) 725 
                                                   >> 436 
                                                   >> 437 G4double 
                                                   >> 438 G4ComponentGGNuclNuclXsc::GetHadronNucleonXsc(const G4DynamicParticle* aParticle, 
                                                   >> 439                                                    G4int At, G4int Zt)
                                                   >> 440 {
                                                   >> 441   G4double xsection = 0.;
                                                   >> 442 
                                                   >> 443   G4double targ_mass = G4ParticleTable::GetParticleTable()->
                                                   >> 444   GetIonTable()->GetIonMass(Zt, At);
                                                   >> 445   targ_mass = 0.939*GeV;  // ~mean neutron and proton ???
                                                   >> 446 
                                                   >> 447   G4double proj_mass = aParticle->GetMass();
                                                   >> 448   G4double proj_momentum = aParticle->GetMomentum().mag();
                                                   >> 449   G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
                                                   >> 450 
                                                   >> 451   sMand /= GeV*GeV;  // in GeV for parametrisation
                                                   >> 452   proj_momentum /= GeV;
                                                   >> 453   const G4ParticleDefinition* pParticle = aParticle->GetDefinition();
                                                   >> 454 
                                                   >> 455   if(pParticle == theNeutron) // as proton ??? 
                                                   >> 456   {
                                                   >> 457     xsection = G4double(At)*(21.70*G4Pow::GetInstance()->powA(sMand,0.0808) + 56.08*G4Pow::GetInstance()->powA(sMand,-0.4525));
                                                   >> 458   } 
                                                   >> 459   else if(pParticle == theProton) 
                                                   >> 460   {
                                                   >> 461     xsection = G4double(At)*(21.70*G4Pow::GetInstance()->powA(sMand,0.0808) + 56.08*G4Pow::GetInstance()->powA(sMand,-0.4525));
                                                   >> 462   } 
                                                   >> 463  
                                                   >> 464   xsection *= millibarn;
                                                   >> 465   return xsection;
                                                   >> 466 }
                                                   >> 467 
                                                   >> 468 
                                                   >> 469 
                                                   >> 470 ///////////////////////////////////////////////////////////////////////////////
                                                   >> 471 //
                                                   >> 472 // Returns hadron-nucleon Xsc according to PDG parametrisation (2005):
                                                   >> 473 // http://pdg.lbl.gov/2006/reviews/hadronicrpp.pdf
                                                   >> 474 //  At = number of nucleons,  Zt = number of protons 
                                                   >> 475 
                                                   >> 476 G4double 
                                                   >> 477 G4ComponentGGNuclNuclXsc::GetHadronNucleonXscPDG(const G4ParticleDefinition* pParticle, 
                                                   >> 478                                                  G4double sMand, 
                                                   >> 479                                                  const G4ParticleDefinition* tParticle)
                                                   >> 480 {
                                                   >> 481   G4double xsection = 0.;
                                                   >> 482   // G4bool pORn = (tParticle == theProton || nucleon == theNeutron  );  
                                                   >> 483   G4bool proton = (tParticle == theProton);
                                                   >> 484   G4bool neutron = (tParticle == theNeutron);
                                                   >> 485 
                                                   >> 486   // General PDG fit constants
                                                   >> 487 
                                                   >> 488   G4double s0   = 5.38*5.38; // in Gev^2
                                                   >> 489   G4double eta1 = 0.458;
                                                   >> 490   G4double eta2 = 0.458;
                                                   >> 491   G4double B    = 0.308;
                                                   >> 492 
                                                   >> 493   // const G4ParticleDefinition* pParticle = aParticle->GetDefinition();
                                                   >> 494   
                                                   >> 495   if(pParticle == theNeutron) // proton-neutron fit 
                                                   >> 496   {
                                                   >> 497     if ( proton )
                                                   >> 498     {
                                                   >> 499       xsection = ( 35.80 + B*G4Pow::GetInstance()->powA(G4Log(sMand/s0),2.) 
                                                   >> 500                   + 40.15*G4Pow::GetInstance()->powA(sMand,-eta1) - 30.*G4Pow::GetInstance()->powA(sMand,-eta2));
                                                   >> 501     }
                                                   >> 502     if ( neutron )
                                                   >> 503     {
                                                   >> 504       xsection = (35.45 + B*G4Pow::GetInstance()->powA(G4Log(sMand/s0),2.) 
                                                   >> 505        + 42.53*G4Pow::GetInstance()->powA(sMand,-eta1) - 33.34*G4Pow::GetInstance()->powA(sMand,-eta2)); // pp for nn
                                                   >> 506     }
                                                   >> 507   } 
                                                   >> 508   else if(pParticle == theProton) 
                                                   >> 509   {
                                                   >> 510     if ( proton )
                                                   >> 511     {
                                                   >> 512       xsection = (35.45 + B*G4Pow::GetInstance()->powA(G4Log(sMand/s0),2.) 
                                                   >> 513                 + 42.53*G4Pow::GetInstance()->powA(sMand,-eta1) - 33.34*G4Pow::GetInstance()->powA(sMand,-eta2));
                                                   >> 514 
                                                   >> 515     }
                                                   >> 516     if ( neutron )
                                                   >> 517     {
                                                   >> 518       xsection = (35.80 + B*G4Pow::GetInstance()->powA(G4Log(sMand/s0),2.) 
                                                   >> 519                   + 40.15*G4Pow::GetInstance()->powA(sMand,-eta1) - 30.*G4Pow::GetInstance()->powA(sMand,-eta2));
                                                   >> 520     }
                                                   >> 521   } 
                                                   >> 522   xsection *= millibarn; // parametrised in mb
                                                   >> 523   return xsection;
                                                   >> 524 }
                                                   >> 525 
                                                   >> 526 
                                                   >> 527 ///////////////////////////////////////////////////////////////////////////////
                                                   >> 528 //
                                                   >> 529 // Returns nucleon-nucleon cross-section based on N. Starkov parametrisation of
                                                   >> 530 // data from mainly http://wwwppds.ihep.su:8001/c5-6A.html database
                                                   >> 531 // projectile nucleon is pParticle with pTkin shooting target nucleon tParticle
                                                   >> 532 
                                                   >> 533 G4double 
                                                   >> 534 G4ComponentGGNuclNuclXsc::GetHadronNucleonXscNS(const G4ParticleDefinition* pParticle, 
                                                   >> 535                                                  G4double pTkin, 
                                                   >> 536                                                  const G4ParticleDefinition* tParticle)
                                                   >> 537 {
                                                   >> 538   G4double xsection(0);
                                                   >> 539   // G4double Delta;   DHW 19 May 2011: variable set but not used
                                                   >> 540   G4double A0, B0;
                                                   >> 541   G4double hpXscv(0);
                                                   >> 542   G4double hnXscv(0);
                                                   >> 543 
                                                   >> 544   G4double targ_mass = tParticle->GetPDGMass();
                                                   >> 545   G4double proj_mass = pParticle->GetPDGMass(); 
                                                   >> 546 
                                                   >> 547   G4double proj_energy   = proj_mass + pTkin; 
                                                   >> 548   G4double proj_momentum = std::sqrt(pTkin*(pTkin+2*proj_mass));
                                                   >> 549 
                                                   >> 550   G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
                                                   >> 551 
                                                   >> 552   sMand         /= GeV*GeV;  // in GeV for parametrisation
                                                   >> 553   proj_momentum /= GeV;
                                                   >> 554   proj_energy   /= GeV;
                                                   >> 555   proj_mass     /= GeV;
                                                   >> 556 
                                                   >> 557   // General PDG fit constants
                                                   >> 558 
                                                   >> 559   //  G4double s0   = 5.38*5.38; // in Gev^2
                                                   >> 560   //  G4double eta1 = 0.458;
                                                   >> 561   //  G4double eta2 = 0.458;
                                                   >> 562   //  G4double B    = 0.308;
                                                   >> 563   
                                                   >> 564   if( proj_momentum >= 373.)
                                                   >> 565   {
                                                   >> 566       return GetHadronNucleonXscPDG(pParticle,sMand,tParticle);
                                                   >> 567   }
                                                   >> 568   else if( proj_momentum >= 10. ) // high energy: pp = nn = np
                                                   >> 569     // if( proj_momentum >= 2.)
                                                   >> 570   {
                                                   >> 571     //  Delta = 1.;    // DHW 19 May 2011: variable set but not used
                                                   >> 572     //  if (proj_energy < 40.) Delta = 0.916+0.0021*proj_energy;
                                                   >> 573 
                                                   >> 574     //AR-12Aug2016  if (proj_momentum >= 10.) {
                                                   >> 575       B0 = 7.5;
                                                   >> 576       A0 = 100. - B0*G4Log(3.0e7);
                                                   >> 577 
                                                   >> 578       xsection = A0 + B0*G4Log(proj_energy) - 11
                                                   >> 579                 + 103*G4Pow::GetInstance()->powA(2*0.93827*proj_energy + proj_mass*proj_mass+
                                                   >> 580                   0.93827*0.93827,-0.165);        //  mb
                                                   >> 581     //AR-12Aug2016  }
                                                   >> 582   }
                                                   >> 583   else // low energy pp = nn != np
                                                   >> 584   {
                                                   >> 585       if(pParticle == tParticle) // pp or nn      // nn to be pp
                                                   >> 586       {
                                                   >> 587         if( proj_momentum < 0.73 )
                                                   >> 588         {
                                                   >> 589           hnXscv = 23 + 50*( G4Pow::GetInstance()->powA( G4Log(0.73/proj_momentum), 3.5 ) );
                                                   >> 590         }
                                                   >> 591         else if( proj_momentum < 1.05  )
                                                   >> 592         {
                                                   >> 593           hnXscv = 23 + 40*(G4Log(proj_momentum/0.73))*
                                                   >> 594                          (G4Log(proj_momentum/0.73));
                                                   >> 595         }
                                                   >> 596         else  // if( proj_momentum < 10.  )
                                                   >> 597         {
                                                   >> 598           hnXscv = 39.0 + 
                                                   >> 599               75*(proj_momentum - 1.2)/(G4Pow::GetInstance()->powA(proj_momentum,3.0) + 0.15);
                                                   >> 600         }
                                                   >> 601         xsection = hnXscv;
                                                   >> 602       }
                                                   >> 603       else  // pn to be np
                                                   >> 604       {
                                                   >> 605         if( proj_momentum < 0.8 )
                                                   >> 606         {
                                                   >> 607           hpXscv = 33+30*G4Pow::GetInstance()->powA(G4Log(proj_momentum/1.3),4.0);
                                                   >> 608         }      
                                                   >> 609         else if( proj_momentum < 1.4 )
                                                   >> 610         {
                                                   >> 611           hpXscv = 33+30*G4Pow::GetInstance()->powA(G4Log(proj_momentum/0.95),2.0);
                                                   >> 612         }
                                                   >> 613         else    // if( proj_momentum < 10.  )
                                                   >> 614         {
                                                   >> 615           hpXscv = 33.3+
                                                   >> 616               20.8*(G4Pow::GetInstance()->powA(proj_momentum,2.0)-1.35)/
                                                   >> 617                  (G4Pow::GetInstance()->powA(proj_momentum,2.50)+0.95);
                                                   >> 618         }
                                                   >> 619         xsection = hpXscv;
                                                   >> 620       }
                                                   >> 621   }
                                                   >> 622   xsection *= millibarn; // parametrised in mb
                                                   >> 623   return xsection;
                                                   >> 624 }
                                                   >> 625 
                                                   >> 626 /////////////////////////////////////////////////////////////////////////////////
                                                   >> 627 //
                                                   >> 628 // Returns hadron-nucleon inelastic cross-section based on FTF-parametrisation 
                                                   >> 629 
                                                   >> 630 G4double 
                                                   >> 631 G4ComponentGGNuclNuclXsc::GetHNinelasticXscVU(const G4DynamicParticle* aParticle, 
                                                   >> 632                                               G4int At, G4int Zt)
                                                   >> 633 {
                                                   >> 634   G4int PDGcode = aParticle->GetDefinition()->GetPDGEncoding();
                                                   >> 635   G4int absPDGcode = std::abs(PDGcode);
                                                   >> 636   G4double Elab = aParticle->GetTotalEnergy();              
                                                   >> 637                           // (s - 2*0.88*GeV*GeV)/(2*0.939*GeV)/GeV;
                                                   >> 638   G4double Plab = aParticle->GetMomentum().mag();            
                                                   >> 639                           // std::sqrt(Elab * Elab - 0.88);
                                                   >> 640 
                                                   >> 641   Elab /= GeV;
                                                   >> 642   Plab /= GeV;
                                                   >> 643 
                                                   >> 644   G4double LogPlab    = G4Log( Plab );
                                                   >> 645   G4double sqrLogPlab = LogPlab * LogPlab;
                                                   >> 646 
                                                   >> 647   //G4cout<<"Plab = "<<Plab<<G4endl;
                                                   >> 648 
                                                   >> 649   G4double NumberOfTargetProtons  = Zt; 
                                                   >> 650   G4double NumberOfTargetNucleons = At;
                                                   >> 651   G4double NumberOfTargetNeutrons = NumberOfTargetNucleons - NumberOfTargetProtons;
                                                   >> 652 
                                                   >> 653   if(NumberOfTargetNeutrons < 0.) NumberOfTargetNeutrons = 0.;
                                                   >> 654 
                                                   >> 655   G4double Xtotal = 0., Xelastic = 0., Xinelastic =0.;
                                                   >> 656 
                                                   >> 657   if( absPDGcode > 1000 )  //------Projectile is baryon --------
                                                   >> 658   {
                                                   >> 659        G4double XtotPP = 48.0 +  0. *G4Pow::GetInstance()->powA(Plab, 0.  ) +
                                                   >> 660                          0.522*sqrLogPlab - 4.51*LogPlab;
                                                   >> 661 
                                                   >> 662        G4double XtotPN = 47.3 +  0. *G4Pow::GetInstance()->powA(Plab, 0.  ) +
                                                   >> 663                          0.513*sqrLogPlab - 4.27*LogPlab;
                                                   >> 664 
                                                   >> 665        G4double XelPP  = 11.9 + 26.9*G4Pow::GetInstance()->powA(Plab,-1.21) +
                                                   >> 666                          0.169*sqrLogPlab - 1.85*LogPlab;
                                                   >> 667 
                                                   >> 668        G4double XelPN  = 11.9 + 26.9*G4Pow::GetInstance()->powA(Plab,-1.21) +
                                                   >> 669                          0.169*sqrLogPlab - 1.85*LogPlab;
                                                   >> 670 
                                                   >> 671        Xtotal          = ( NumberOfTargetProtons  * XtotPP +
                                                   >> 672                            NumberOfTargetNeutrons * XtotPN  );
                                                   >> 673 
                                                   >> 674        Xelastic        = ( NumberOfTargetProtons  * XelPP  +
                                                   >> 675                            NumberOfTargetNeutrons * XelPN   );
                                                   >> 676   }
                                                   >> 677 
                                                   >> 678   Xinelastic = Xtotal - Xelastic;
                                                   >> 679   if(Xinelastic < 0.) Xinelastic = 0.;
                                                   >> 680 
                                                   >> 681   return Xinelastic*= millibarn;
                                                   >> 682 }
                                                   >> 683 
                                                   >> 684 ///////////////////////////////////////////////////////////////////////////////
                                                   >> 685 //
                                                   >> 686 //
                                                   >> 687 
                                                   >> 688 G4double 
                                                   >> 689 G4ComponentGGNuclNuclXsc::GetNucleusRadius(const G4DynamicParticle* , 
                                                   >> 690                                            const G4Element* anElement)
                                                   >> 691 {
                                                   >> 692   G4double At = anElement->GetN();
                                                   >> 693   G4double oneThird = 1.0/3.0;
                                                   >> 694   G4double cubicrAt = G4Pow::GetInstance()->powA (At, oneThird); 
                                                   >> 695 
                                                   >> 696   G4double R;  // = fRadiusConst*cubicrAt;
                                                   >> 697   R = fRadiusConst*cubicrAt;
                                                   >> 698 
                                                   >> 699   G4double meanA  = 21.;
                                                   >> 700   G4double tauA1  = 40.; 
                                                   >> 701   G4double tauA2  = 10.; 
                                                   >> 702   G4double tauA3  = 5.; 
                                                   >> 703 
                                                   >> 704   G4double a1 = 0.85;
                                                   >> 705   G4double b1 = 1. - a1;
                                                   >> 706 
                                                   >> 707   G4double b2 = 0.3;
                                                   >> 708   G4double b3 = 4.;
                                                   >> 709 
                                                   >> 710   if (At > 20.)   // 20.
                                                   >> 711   {
                                                   >> 712     R *= ( a1 + b1*G4Exp( -(At - meanA)/tauA1) ); 
                                                   >> 713   }
                                                   >> 714   else if (At > 3.5)
                                                   >> 715   {
                                                   >> 716     R *= ( 1.0 + b2*( 1. - G4Exp( (At - meanA)/tauA2) ) ); 
                                                   >> 717   }
                                                   >> 718   else 
                                                   >> 719   {
                                                   >> 720     R *= ( 1.0 + b3*( 1. - G4Exp( (At - meanA)/tauA3) ) ); 
                                                   >> 721   }
                                                   >> 722 
                                                   >> 723   return R;
                                                   >> 724 }
                                                   >> 725 
                                                   >> 726 ///////////////////////////////////////////////////////////////////////////////
                                                   >> 727 //
                                                   >> 728 //
                                                   >> 729 
                                                   >> 730 G4double 
                                                   >> 731 G4ComponentGGNuclNuclXsc::GetNucleusRadius(G4double Zt, G4double At)
                                                   >> 732 {
                                                   >> 733   G4double R;
                                                   >> 734   R = GetNucleusRadiusDE(Zt,At);
                                                   >> 735   // R = GetNucleusRadiusRMS(Zt,At);
                                                   >> 736 
                                                   >> 737   return R;
                                                   >> 738 }
                                                   >> 739 
                                                   >> 740 ///////////////////////////////////////////////////////////////////
                                                   >> 741 
                                                   >> 742 G4double 
                                                   >> 743 G4ComponentGGNuclNuclXsc::GetNucleusRadiusGG(G4double At)
                                                   >> 744 {
                                                   >> 745   G4double oneThird = 1.0/3.0;
                                                   >> 746   G4double cubicrAt = G4Pow::GetInstance()->powA (At, oneThird); 
                                                   >> 747 
                                                   >> 748   G4double R;  // = fRadiusConst*cubicrAt;  
                                                   >> 749   R = fRadiusConst*cubicrAt;
                                                   >> 750 
                                                   >> 751   G4double meanA = 20.;
                                                   >> 752   G4double tauA  = 20.;
                                                   >> 753 
                                                   >> 754   if ( At > 20.)   // 20.
                                                   >> 755   {
                                                   >> 756     R *= ( 0.8 + 0.2*G4Exp( -(At - meanA)/tauA) ); 
                                                   >> 757   }
                                                   >> 758   else
                                                   >> 759   {
                                                   >> 760     R *= ( 1.0 + 0.1*( 1. - G4Exp( (At - meanA)/tauA) ) ); 
                                                   >> 761   }
                                                   >> 762 
                                                   >> 763   return R;
                                                   >> 764 }
                                                   >> 765 
                                                   >> 766 /////////////////////////////////////////////////////////////////////////////
                                                   >> 767 //
                                                   >> 768 //
                                                   >> 769 
                                                   >> 770 G4double 
                                                   >> 771 G4ComponentGGNuclNuclXsc::GetNucleusRadiusDE(G4double Z, G4double A)
                                                   >> 772 {
                                                   >> 773   // algorithm from diffuse-elastic
                                                   >> 774 
                                                   >> 775   G4double R, r0, a11, a12, a13, a2, a3;
                                                   >> 776 
                                                   >> 777   a11 = 1.26;  // 1.08, 1.16
                                                   >> 778   a12 = 1.;  // 1.08, 1.16
                                                   >> 779   a13 = 1.12;  // 1.08, 1.16
                                                   >> 780   a2 = 1.1;
                                                   >> 781   a3 = 1.;
                                                   >> 782 
                                                   >> 783   // Special rms radii for light nucleii
                                                   >> 784 
                                                   >> 785   if (A < 50.)
                                                   >> 786   {
                                                   >> 787     if     (std::abs(A-1.) < 0.5)                         return 0.89*fermi; // p
                                                   >> 788     else if(std::abs(A-2.) < 0.5)                         return 2.13*fermi; // d
                                                   >> 789     else if(std::abs(Z-1.) < 0.5 && std::abs(A-3.) < 0.5) return 1.80*fermi; // t
                                                   >> 790 
                                                   >> 791     else if(std::abs(Z-2.) < 0.5 && std::abs(A-3.) < 0.5) return 1.96*fermi; // He3
                                                   >> 792     else if(std::abs(Z-2.) < 0.5 && std::abs(A-4.) < 0.5) return 1.68*fermi; // He4
                                                   >> 793 
                                                   >> 794     else if(std::abs(Z-3.) < 0.5)                         return 2.40*fermi; // Li7
                                                   >> 795     else if(std::abs(Z-4.) < 0.5)                         return 2.51*fermi; // Be9
                                                   >> 796 
                                                   >> 797     else if( 10.  < A && A <= 16. ) r0  = a11*( 1 - G4Pow::GetInstance()->powA(A, -2./3.) )*fermi;   // 1.08*fermi;
                                                   >> 798     else if( 15.  < A && A <= 20. ) r0  = a12*( 1 - G4Pow::GetInstance()->powA(A, -2./3.) )*fermi;
                                                   >> 799     else if( 20.  < A && A <= 30. ) r0  = a13*( 1 - G4Pow::GetInstance()->powA(A, -2./3.) )*fermi;
                                                   >> 800     else                            r0  = a2*fermi;
                                                   >> 801 
                                                   >> 802     R = r0*G4Pow::GetInstance()->powA( A, 1./3. );
                                                   >> 803   }
                                                   >> 804   else
                                                   >> 805   {
                                                   >> 806     r0 = a3*fermi;
                                                   >> 807 
                                                   >> 808     R  = r0*G4Pow::GetInstance()->powA(A, 0.27);
                                                   >> 809   }
                                                   >> 810   return R;
                                                   >> 811 }
                                                   >> 812 
                                                   >> 813 
                                                   >> 814 /////////////////////////////////////////////////////////////////////////////
                                                   >> 815 //
                                                   >> 816 // RMS radii from e-A scattering data
                                                   >> 817 
                                                   >> 818 G4double 
                                                   >> 819 G4ComponentGGNuclNuclXsc::GetNucleusRadiusRMS(G4double Z, G4double A)
291 {                                                 820 {
292   ComputeCrossSections(aParticle->GetDefinitio << 
293                        aParticle->GetKineticEn << 
294            G4lrint(tZ), G4lrint(tA));          << 
295                                                   821 
296   return (fInelasticXsc > 0.0) ? 1.0 - fProduc << 822   if     (std::abs(A-1.) < 0.5)                         return 0.89*fermi; // p
                                                   >> 823   else if(std::abs(A-2.) < 0.5)                         return 2.13*fermi; // d
                                                   >> 824   else if(std::abs(Z-1.) < 0.5 && std::abs(A-3.) < 0.5) return 1.80*fermi; // t
                                                   >> 825 
                                                   >> 826   else if(std::abs(Z-2.) < 0.5 && std::abs(A-3.) < 0.5) return 1.96*fermi; // He3
                                                   >> 827   else if(std::abs(Z-2.) < 0.5 && std::abs(A-4.) < 0.5) return 1.68*fermi; // He4
                                                   >> 828 
                                                   >> 829   else if(std::abs(Z-3.) < 0.5)                         return 2.40*fermi; // Li7
                                                   >> 830   else if(std::abs(Z-4.) < 0.5)                         return 2.51*fermi; // Be9
                                                   >> 831 
                                                   >> 832   else                               return 1.24*G4Pow::GetInstance()->powA(A, 0.28 )*fermi; // A > 9
297 }                                                 833 }
298                                                   834 
                                                   >> 835 
                                                   >> 836 ///////////////////////////////////////////////////////////////////////////////
                                                   >> 837 //
                                                   >> 838 //
                                                   >> 839 
                                                   >> 840 G4double G4ComponentGGNuclNuclXsc::CalculateEcmValue(const G4double mp, 
                                                   >> 841                                                      const G4double mt, 
                                                   >> 842                                                      const G4double Plab)
                                                   >> 843 {
                                                   >> 844   G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
                                                   >> 845   G4double Ecm  = std::sqrt ( mp * mp + mt * mt + 2 * Elab * mt );
                                                   >> 846   // G4double Pcm  = Plab * mt / Ecm;
                                                   >> 847   // G4double KEcm = std::sqrt ( Pcm * Pcm + mp * mp ) - mp;
                                                   >> 848 
                                                   >> 849   return Ecm ; // KEcm;
                                                   >> 850 }
                                                   >> 851 
                                                   >> 852 
                                                   >> 853 ///////////////////////////////////////////////////////////////////////////////
                                                   >> 854 //
                                                   >> 855 //
                                                   >> 856 
                                                   >> 857 G4double G4ComponentGGNuclNuclXsc::CalcMandelstamS(const G4double mp, 
                                                   >> 858                                                    const G4double mt, 
                                                   >> 859                                                    const G4double Plab)
                                                   >> 860 {
                                                   >> 861   G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
                                                   >> 862   G4double sMand  = mp*mp + mt*mt + 2*Elab*mt ;
                                                   >> 863 
                                                   >> 864   return sMand;
                                                   >> 865 }
                                                   >> 866 
                                                   >> 867 //
                                                   >> 868 //
299 //////////////////////////////////////////////    869 ///////////////////////////////////////////////////////////////////////////////
300                                                   870