Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 // Geant4 Header : G4AntiNuclElastic 27 // Geant4 Header : G4AntiNuclElastic 28 // 28 // 29 // 29 // 30 30 31 #include "G4AntiNuclElastic.hh" 31 #include "G4AntiNuclElastic.hh" 32 32 33 #include "G4PhysicalConstants.hh" 33 #include "G4PhysicalConstants.hh" 34 #include "G4SystemOfUnits.hh" 34 #include "G4SystemOfUnits.hh" 35 #include "G4ParticleTable.hh" 35 #include "G4ParticleTable.hh" 36 #include "G4ParticleDefinition.hh" 36 #include "G4ParticleDefinition.hh" 37 #include "G4IonTable.hh" 37 #include "G4IonTable.hh" 38 #include "Randomize.hh" 38 #include "Randomize.hh" 39 #include "G4AntiProton.hh" 39 #include "G4AntiProton.hh" 40 #include "G4AntiNeutron.hh" 40 #include "G4AntiNeutron.hh" 41 #include "G4AntiDeuteron.hh" 41 #include "G4AntiDeuteron.hh" 42 #include "G4AntiAlpha.hh" 42 #include "G4AntiAlpha.hh" 43 #include "G4AntiTriton.hh" 43 #include "G4AntiTriton.hh" 44 #include "G4AntiHe3.hh" 44 #include "G4AntiHe3.hh" 45 #include "G4Proton.hh" 45 #include "G4Proton.hh" 46 #include "G4Neutron.hh" 46 #include "G4Neutron.hh" 47 #include "G4Deuteron.hh" 47 #include "G4Deuteron.hh" 48 #include "G4Alpha.hh" 48 #include "G4Alpha.hh" 49 #include "G4Pow.hh" 49 #include "G4Pow.hh" 50 #include "G4Exp.hh" 50 #include "G4Exp.hh" 51 #include "G4Log.hh" 51 #include "G4Log.hh" 52 52 53 #include "G4NucleiProperties.hh" 53 #include "G4NucleiProperties.hh" 54 #include "G4CrossSectionDataSetRegistry.hh" 54 #include "G4CrossSectionDataSetRegistry.hh" 55 55 56 G4AntiNuclElastic::G4AntiNuclElastic() 56 G4AntiNuclElastic::G4AntiNuclElastic() 57 : G4HadronElastic("AntiAElastic") 57 : G4HadronElastic("AntiAElastic") 58 { 58 { 59 //V.Ivanchenko commented out 59 //V.Ivanchenko commented out 60 //SetMinEnergy( 0.1*GeV ); 60 //SetMinEnergy( 0.1*GeV ); 61 //SetMaxEnergy( 10.*TeV ); 61 //SetMaxEnergy( 10.*TeV ); 62 62 63 theAProton = G4AntiProton::AntiProton( 63 theAProton = G4AntiProton::AntiProton(); 64 theANeutron = G4AntiNeutron::AntiNeutro 64 theANeutron = G4AntiNeutron::AntiNeutron(); 65 theADeuteron = G4AntiDeuteron::AntiDeute 65 theADeuteron = G4AntiDeuteron::AntiDeuteron(); 66 theATriton = G4AntiTriton::AntiTriton( 66 theATriton = G4AntiTriton::AntiTriton(); 67 theAAlpha = G4AntiAlpha::AntiAlpha(); 67 theAAlpha = G4AntiAlpha::AntiAlpha(); 68 theAHe3 = G4AntiHe3::AntiHe3(); 68 theAHe3 = G4AntiHe3::AntiHe3(); 69 69 70 theProton = G4Proton::Proton(); 70 theProton = G4Proton::Proton(); 71 theNeutron = G4Neutron::Neutron(); 71 theNeutron = G4Neutron::Neutron(); 72 theDeuteron = G4Deuteron::Deuteron(); 72 theDeuteron = G4Deuteron::Deuteron(); 73 theAlpha = G4Alpha::Alpha(); 73 theAlpha = G4Alpha::Alpha(); 74 74 75 G4CrossSectionDataSetRegistry* reg = G4Cross 75 G4CrossSectionDataSetRegistry* reg = G4CrossSectionDataSetRegistry::Instance(); 76 cs = static_cast<G4ComponentAntiNuclNuclearX 76 cs = static_cast<G4ComponentAntiNuclNuclearXS*>(reg->GetComponentCrossSection("AntiAGlauber")); 77 if(!cs) { cs = new G4ComponentAntiNuclNuclea 77 if(!cs) { cs = new G4ComponentAntiNuclNuclearXS(); } 78 78 79 fParticle = 0; 79 fParticle = 0; 80 fWaveVector = 0.; 80 fWaveVector = 0.; 81 fBeta = 0.; 81 fBeta = 0.; 82 fZommerfeld = 0.; 82 fZommerfeld = 0.; 83 fAm = 0.; 83 fAm = 0.; 84 fTetaCMS = 0.; 84 fTetaCMS = 0.; 85 fRa = 0.; 85 fRa = 0.; 86 fRef = 0.; 86 fRef = 0.; 87 fceff = 0.; 87 fceff = 0.; 88 fptot = 0.; 88 fptot = 0.; 89 fTmax = 0.; 89 fTmax = 0.; 90 fThetaLab = 0.; 90 fThetaLab = 0.; 91 } 91 } 92 92 93 ////////////////////////////////////////////// 93 ///////////////////////////////////////////////////////////////////////// 94 G4AntiNuclElastic::~G4AntiNuclElastic() 94 G4AntiNuclElastic::~G4AntiNuclElastic() 95 {} 95 {} 96 96 97 ////////////////////////////////////////////// 97 //////////////////////////////////////////////////////////////////////// 98 // sample momentum transfer in the CMS system 98 // sample momentum transfer in the CMS system 99 G4double G4AntiNuclElastic::SampleInvariantT(c 99 G4double G4AntiNuclElastic::SampleInvariantT(const G4ParticleDefinition* particle, 100 G4double Plab, G4int Z, G4int 100 G4double Plab, G4int Z, G4int A) 101 { 101 { 102 G4double T; 102 G4double T; 103 G4double Mproj = particle->GetPDGMass(); 103 G4double Mproj = particle->GetPDGMass(); 104 G4LorentzVector Pproj(0.,0.,Plab,std::sqrt(P 104 G4LorentzVector Pproj(0.,0.,Plab,std::sqrt(Plab*Plab+Mproj*Mproj)); 105 G4double ctet1 = GetcosTeta1(Plab, A); 105 G4double ctet1 = GetcosTeta1(Plab, A); 106 106 107 G4double energy=Pproj.e()-Mproj; 107 G4double energy=Pproj.e()-Mproj; 108 108 109 const G4ParticleDefinition* theParticle = pa 109 const G4ParticleDefinition* theParticle = particle; 110 110 111 G4ParticleDefinition * theTargetDef = 0; << 111 G4ParticleDefinition * theDef = 0; 112 112 113 if (Z == 1 && A == 1) theTargetDef = th << 113 if(Z == 1 && A == 1) theDef = theProton; 114 else if (Z == 1 && A == 2) theTargetDef = th << 114 else if (Z == 1 && A == 2) theDef = theDeuteron; 115 else if (Z == 1 && A == 3) theTargetDef = G4 << 115 else if (Z == 1 && A == 3) theDef = G4Triton::Triton(); 116 else if (Z == 2 && A == 3) theTargetDef = G4 << 116 else if (Z == 2 && A == 3) theDef = G4He3::He3(); 117 else if (Z == 2 && A == 4) theTargetDef = th << 117 else if (Z == 2 && A == 4) theDef = theAlpha; 118 118 119 119 120 G4double TargMass =G4NucleiProperties::GetNu 120 G4double TargMass =G4NucleiProperties::GetNuclearMass(A,Z); 121 121 122 //transform to CMS 122 //transform to CMS 123 123 124 G4LorentzVector lv(0.0,0.0,0.0,TargMass); 124 G4LorentzVector lv(0.0,0.0,0.0,TargMass); 125 lv += Pproj; 125 lv += Pproj; 126 G4double S = lv.mag2()/(GeV*GeV); 126 G4double S = lv.mag2()/(GeV*GeV); 127 127 128 G4ThreeVector bst = lv.boostVector(); 128 G4ThreeVector bst = lv.boostVector(); 129 Pproj.boost(-bst); 129 Pproj.boost(-bst); 130 130 131 G4ThreeVector p1 = Pproj.vect(); 131 G4ThreeVector p1 = Pproj.vect(); 132 G4double ptot = p1.mag(); 132 G4double ptot = p1.mag(); 133 133 134 fbst = bst; 134 fbst = bst; 135 fptot= ptot; 135 fptot= ptot; 136 fTmax = 4.0*ptot*ptot; // In (MeV/c)^2 << 136 fTmax = 4.0*ptot*ptot; 137 137 138 if(Plab < (std::abs(particle->GetBaryonNumbe << 138 if(Plab < (std::abs(particle->GetBaryonNumber())*100)*MeV) // Uzhi 24 Nov. 2011 139 {return fTmax*G4UniformRand();} << 139 {return fTmax*G4UniformRand();} // Uzhi 24 Nov. 2011 140 140 141 // Calculation of NN collision properties << 142 G4double PlabPerN = Plab/std::abs(theParticl << 143 G4double NucleonMass = 0.5*( theProton->GetP << 144 G4double PrNucleonMass(0.); // Projectile a << 145 if( std::abs(theParticle->GetBaryonNumber()) << 146 else << 147 G4double energyPerN = std::sqrt( sqr(PlabPer << 148 energyPerN -= PrNucleonMass; << 149 //--- << 150 << 151 G4double Z1 = particle->GetPDGCharge(); 141 G4double Z1 = particle->GetPDGCharge(); 152 G4double Z2 = Z; 142 G4double Z2 = Z; 153 143 154 G4double beta = CalculateParticleBeta(partic 144 G4double beta = CalculateParticleBeta(particle, ptot); 155 G4double n = CalculateZommerfeld( beta, Z1 145 G4double n = CalculateZommerfeld( beta, Z1, Z2 ); 156 G4double Am = CalculateAm( ptot, n, Z2 ); 146 G4double Am = CalculateAm( ptot, n, Z2 ); 157 fWaveVector = ptot; // /hbarc; 147 fWaveVector = ptot; // /hbarc; 158 148 159 G4LorentzVector Fproj(0.,0.,0.,0.); 149 G4LorentzVector Fproj(0.,0.,0.,0.); 160 const G4double mevToBarn = 0.38938e+6; << 150 G4double XsCoulomb = sqr(n/fWaveVector)*pi*(1+ctet1)/(1.+Am)/(1.+2.*Am-ctet1); 161 G4double XsCoulomb = mevToBarn*sqr(n/fWaveVe << 151 XsCoulomb=XsCoulomb*0.38938e+6; >> 152 >> 153 G4double XsElastHad =cs->GetElasticElementCrossSection(particle, energy, Z, (G4double)A); >> 154 G4double XstotalHad =cs->GetTotalElementCrossSection(particle, energy, Z, (G4double)A); 162 155 163 G4double XsElastHadronic =cs->GetElasticElem << 156 XsElastHad/=millibarn; XstotalHad/=millibarn; 164 G4double XsTotalHadronic =cs->GetTotalElemen << 165 157 166 XsElastHadronic/=millibarn; XsTotalHadronic/ << 158 G4double CoulombProb = XsCoulomb/(XsCoulomb+XsElastHad); 167 159 168 G4double CoulombProb = XsCoulomb/(XsCoulomb << 160 // G4cout<<" XselastHadron " << XsElastHad << " XsCol "<< XsCoulomb <<G4endl; >> 161 // G4cout <<" XsTotal" << XstotalHad <<G4endl; >> 162 // G4cout<<"XsInel"<< XstotalHad-XsElastHad<<G4endl; 169 163 170 if(G4UniformRand() < CoulombProb) 164 if(G4UniformRand() < CoulombProb) 171 { // Simulation of Coulomb scattering 165 { // Simulation of Coulomb scattering 172 166 173 G4double phi = twopi * G4UniformRand(); << 167 G4double phi = twopi * G4UniformRand(); 174 G4double Ksi = G4UniformRand(); << 168 G4double Ksi = G4UniformRand(); 175 169 176 G4double par1 = 2.*(1.+Am)/(1.+ctet1); << 170 G4double par1 = 2.*(1.+Am)/(1.+ctet1); 177 171 178 // ////sample ThetaCMS in Coulomb part << 172 // ////sample ThetaCMS in Coulomb part 179 173 180 G4double cosThetaCMS = (par1*ctet1- Ksi*(1 << 174 G4double cosThetaCMS = (par1*ctet1- Ksi*(1.+2.*Am))/(par1-Ksi); 181 175 182 G4double PtZ=ptot*cosThetaCMS; << 176 G4double PtZ=ptot*cosThetaCMS; 183 Fproj.setPz(PtZ); << 177 Fproj.setPz(PtZ); 184 G4double PtProjCMS = ptot*std::sqrt(1.0 - << 178 G4double PtProjCMS = ptot*std::sqrt(1.0 - cosThetaCMS*cosThetaCMS); 185 G4double PtX= PtProjCMS * std::cos(phi); << 179 G4double PtX= PtProjCMS * std::cos(phi); 186 G4double PtY= PtProjCMS * std::sin(phi); << 180 G4double PtY= PtProjCMS * std::sin(phi); 187 Fproj.setPx(PtX); << 181 Fproj.setPx(PtX); 188 Fproj.setPy(PtY); << 182 Fproj.setPy(PtY); 189 Fproj.setE(std::sqrt(PtX*PtX+PtY*PtY+PtZ*P << 183 Fproj.setE(std::sqrt(PtX*PtX+PtY*PtY+PtZ*PtZ+Mproj*Mproj)); 190 T = -(Pproj-Fproj).mag2(); << 184 T = -(Pproj-Fproj).mag2(); 191 } << 185 } else 192 else << 193 { << 194 // Simulation of strong interaction scatte << 195 186 196 G4double Qmax = 2.*ptot/197.33; // in fm << 187 { >> 188 ///////Simulation of strong interaction scattering//////////////////////////// 197 189 198 G4double Amag = 1.0; // A1 in Majora << 190 // G4double Qmax = 2.*ptot*197.33; // in fm^-1 199 G4double SlopeMag = 0.5; // A2 in Majora << 191 G4double Qmax = 2.*3.0*197.33; // in fm^-1 200 << 192 G4double Amag = 70*70; // A1 in Magora funct:A1*exp(-q*A2) 201 G4double sig_pbarp = cs->GetAntiHadronNucl << 193 G4double SlopeMag = 2.*3.0; // A2 in Magora funct:A1*exp(-q*A2) 202 << 194 203 fRa = 1.113*G4Pow::GetInstance()->Z13(A) - << 195 G4double sig_pbarp= cs->GetAntiHadronNucleonTotCrSc(particle,energy); 204 0.227/G4Pow::GetInstance()->Z13(A); << 196 205 if(A == 3) fRa=1.81; << 197 fRa = 1.113*G4Pow::GetInstance()->Z13(A) - 206 if(A == 4) fRa=1.37; << 198 0.227/G4Pow::GetInstance()->Z13(A); >> 199 if(A == 3) fRa=1.81; >> 200 if(A == 4) fRa=1.37; 207 201 208 if((A>=12.) && (A<27) ) fRa=fRa*0.85; << 202 if((A>=12.) && (A<27) ) fRa=fRa*0.85; 209 if((A>=27.) && (A<48) ) fRa=fRa*0.90; << 203 if((A>=27.) && (A<48) ) fRa=fRa*0.90; 210 if((A>=48.) && (A<65) ) fRa=fRa*0.95; << 204 if((A>=48.) && (A<65) ) fRa=fRa*0.95; 211 << 205 212 G4double Ref2 = XsTotalHadronic/10./2./pi; << 206 G4double Ref2 = 0; 213 G4double ceff2 = 0.0; << 207 G4double ceff2 =0; 214 G4double rho = 0.0; << 208 G4double rho = 0; 215 << 209 if ((theParticle == theAProton) || (theParticle == theANeutron)) 216 if ((theParticle == theAProton) || (thePa << 210 { 217 { << 211 if(theDef == theProton) 218 if(theTargetDef == theProton) << 212 { 219 { << 213 // G4double Mp2=sqr(theDef->GetPDGMass()/GeV ); 220 // Determination of the real part of P << 214 221 if(Plab < 610.) << 215 // change 30 October 222 { rho = 1.3347-10.342*Plab/1000.+22.27 << 216 223 13.634*Plab/1000.*Plab/1000.*P << 217 if(Plab < 610.) 224 if((Plab < 5500.)&&(Plab >= 610.) ) << 218 { rho = 1.3347-10.342*Plab/1000.+22.277*Plab/1000.*Plab/1000.- 225 { rho = 0.22; } << 219 13.634*Plab/1000.*Plab/1000.*Plab/1000. ;} 226 if((Plab >= 5500.)&&(Plab < 12300.) ) << 220 if((Plab < 5500.)&&(Plab >= 610.) ) 227 { rho = -0.32; } << 221 { rho = 0.22; } 228 if( Plab >= 12300.) << 222 if((Plab >= 5500.)&&(Plab < 12300.) ) 229 { rho = 0.135-2.26/(std::sqrt(S)) ;} << 223 { rho = -0.32; } 230 Ref2 = 0.35 + 0.9/std::sqrt(std::sqrt << 224 if( Plab >= 12300.) 231 ceff2 = 0.375 - 2./S + 0.44/(sqr(S-4.) << 225 { rho = 0.135-2.26/(std::sqrt(S)) ;} 232 Ref2 =Ref2*Ref2; << 226 233 ceff2 = ceff2*ceff2; << 227 Ref2 = 0.35 + 0.9/std::sqrt(std::sqrt(S-4.*0.88))+0.04*G4Log(S) ; 234 } << 228 ceff2 = 0.375 - 2./S + 0.44/(sqr(S-4.)+1.5) ; 235 << 229 236 if( (Z==1)&&(A==2) ) << 230 /* 237 { << 231 Ref2=0.8/std::sqrt(std::sqrt(S-4.*Mp2)) + 0.55; 238 Ref2 = fRa*fRa - 0.28 + 0.019 * sig_pb << 232 if(S>1000.) Ref2=0.62+0.02*G4Log(S) ; 239 ceff2 = 0.297 + 7.853e-04*sig_pbarp + << 233 ceff2 = 0.035/(sqr(S-4.3)+0.4) + 0.085 * G4Log(S) ; 240 } << 234 if(S>1000.) ceff2 = 0.005 * G4Log(S) + 0.29; 241 if( (Z==1)&&(A==3) ) << 235 */ 242 { << 236 243 Ref2 = fRa*fRa - 1.36 + 0.025 * sig_pb << 237 Ref2=Ref2*Ref2; 244 ceff2 = 0.149 + 7.091e-04*sig_pbarp + << 238 ceff2 = ceff2*ceff2; 245 } << 239 246 if( (Z==2)&&(A==3) ) << 240 SlopeMag = 0.5; // Uzhi 247 { << 241 Amag= 1.; // Uzhi 248 Ref2 = fRa*fRa - 1.36 + 0.025 * sig_pb << 242 } 249 ceff2 = 0.149 + 7.091e-04*sig_pbarp + << 243 250 } << 244 if(Z>2) 251 if( (Z==2)&&(A==4) ) << 245 { Ref2 = fRa*fRa +2.48*0.01*sig_pbarp*fRa - 2.23e-6*sig_pbarp*sig_pbarp*fRa*fRa; 252 { << 246 ceff2 = 0.16+3.3e-4*sig_pbarp+0.35*G4Exp(-0.03*sig_pbarp); 253 Ref2 = fRa*fRa -0.46 +0.03*sig_pbarp - << 247 } 254 ceff2= 0.078 + 6.657e-4*sig_pbarp + 0. << 248 if( (Z==2)&&(A==4) ) 255 } << 249 { Ref2 = fRa*fRa -0.46 +0.03*sig_pbarp - 2.98e-6*sig_pbarp*sig_pbarp; 256 if(Z>2) << 250 ceff2= 0.078 + 6.657e-4*sig_pbarp + 0.3359*G4Exp(-0.03*sig_pbarp); 257 { << 251 } 258 Ref2 = fRa*fRa +2.48*0.01*sig_pbarp*fR << 252 if( (Z==1)&&(A==3) ) 259 ceff2 = 0.16+3.3e-4*sig_pbarp+0.35*G4E << 253 { Ref2 = fRa*fRa - 1.36 + 0.025 * sig_pbarp - 3.69e-7 * sig_pbarp*sig_pbarp; 260 } << 254 ceff2 = 0.149 + 7.091e-04*sig_pbarp + 0.3743*G4Exp(-0.03*sig_pbarp); 261 } // End of if ((theParticle == theAProto << 255 } 262 << 256 if( (Z==2)&&(A==3) ) 263 if (theParticle == theADeuteron) << 257 { Ref2 = fRa*fRa - 1.36 + 0.025 * sig_pbarp - 3.69e-7 * sig_pbarp*sig_pbarp; 264 { << 258 ceff2 = 0.149 + 7.091e-04*sig_pbarp + 0.3743*G4Exp(-0.03*sig_pbarp); 265 if(theTargetDef == theProton) << 259 } 266 { << 260 if( (Z==1)&&(A==2) ) 267 ceff2 = 0.297 + 7.853e-04*sig_pbarp + << 261 { 268 } << 262 Ref2 = fRa*fRa - 0.28 + 0.019 * sig_pbarp + 2.06e-6 * sig_pbarp*sig_pbarp; 269 if(theTargetDef == theDeuteron) << 263 ceff2 = 0.297 + 7.853e-04*sig_pbarp + 0.2899*G4Exp(-0.03*sig_pbarp); 270 { << 264 } 271 ceff2 = 0.65 + 3.0e-4*sig_pbarp + 0.55 << 265 } 272 } << 266 273 if( (theTargetDef == G4Triton::Triton()) << 267 if (theParticle == theADeuteron) 274 { << 268 { 275 ceff2 = 0.57 + 2.5e-4*sig_pbarp + 0.65 << 269 sig_pbarp= cs->GetAntiHadronNucleonTotCrSc(particle,energy/2.); 276 } << 270 Ref2 = XstotalHad/10./2./pi ; 277 if(theTargetDef == theAlpha) << 271 if(Z>2) 278 { << 272 { 279 ceff2 = 0.40 + 3.5e-4 *sig_pbarp + 0.4 << 273 ceff2 = 0.38 + 2.0e-4 *sig_pbarp + 0.5 * G4Exp(-0.03*sig_pbarp); 280 } << 274 } 281 if(Z>2) << 275 if(theDef == theProton) 282 { << 276 { 283 ceff2 = 0.38 + 2.0e-4 *sig_pbarp + 0.5 << 277 ceff2 = 0.297 + 7.853e-04*sig_pbarp + 0.2899*G4Exp(-0.03*sig_pbarp); 284 } << 278 } 285 } << 279 if(theDef == theDeuteron) 286 << 280 { 287 if( (theParticle ==theAHe3) || (theParticl << 281 ceff2 = 0.65 + 3.0e-4*sig_pbarp + 0.55 * G4Exp(-0.03*sig_pbarp); 288 { << 282 } 289 if(theTargetDef == theProton) << 283 if( (theDef == G4Triton::Triton()) || (theDef == G4He3::He3() ) ) 290 { << 284 { 291 ceff2 = 0.149 + 7.091e-04*sig_pbarp + << 285 ceff2 = 0.57 + 2.5e-4*sig_pbarp + 0.65 * G4Exp(-0.02*sig_pbarp); 292 } << 286 } 293 if(theTargetDef == theDeuteron) << 287 if(theDef == theAlpha) 294 { << 288 { 295 ceff2 = 0.57 + 2.5e-4*sig_pbarp + 0.65 << 289 ceff2 = 0.40 + 3.5e-4 *sig_pbarp + 0.45 * G4Exp(-0.02*sig_pbarp); 296 } << 297 if( (theTargetDef == G4Triton::Triton()) << 298 { << 299 ceff2 = 0.39 + 2.7e-4*sig_pbarp + 0.7 << 300 } << 301 if(theTargetDef == theAlpha) << 302 { << 303 ceff2 = 0.24 + 3.5e-4*sig_pbarp + 0.75 << 304 } << 305 if(Z>2) << 306 { << 307 ceff2 = 0.26 + 2.2e-4*sig_pbarp + 0.33 << 308 } << 309 } << 310 << 311 if ( (theParticle == theAAlpha) || (ceff2 << 312 { << 313 if(theTargetDef == theProton) << 314 { << 315 ceff2= 0.078 + 6.657e-4*sig_pbarp + 0. << 316 } << 317 if(theTargetDef == theDeuteron) << 318 { << 319 ceff2 = 0.40 + 3.5e-4 *sig_pbarp + 0.4 << 320 } << 321 if( (theTargetDef == G4Triton::Triton()) << 322 { << 323 ceff2 = 0.24 + 3.5e-4*sig_pbarp + 0.75 << 324 } << 325 if(theTargetDef == theAlpha) << 326 { << 327 ceff2 = 0.17 + 3.5e-4*sig_pbarp + 0.45 << 328 } << 329 if(Z>2) << 330 { << 331 ceff2 = 0.22 + 2.0e-4*sig_pbarp + 0.2 << 332 } << 333 } << 334 << 335 fRef=std::sqrt(Ref2); << 336 fceff = std::sqrt(ceff2); << 337 << 338 G4double Q = 0.0 ; << 339 G4double BracFunct; << 340 << 341 const G4int maxNumberOfLoops = 10000; << 342 G4int loopCounter = 0; << 343 do << 344 { << 345 Q = -G4Log(1.-(1.- G4Exp(-SlopeMag * Qma << 346 G4double x = fRef * Q; << 347 BracFunct = ( ( sqr(BesselOneByArg(x))+s << 348 * sqr(DampFactor(pi*fceff*Q))) /(Ama << 349 BracFunct = BracFunct * Q; << 350 } << 351 while ( (G4UniformRand()>BracFunct) && << 352 ++loopCounter < maxNumberOfLoops ) << 353 if ( loopCounter >= maxNumberOfLoops ) { << 354 fTetaCMS = 0.0; << 355 return 0.0; << 356 } 290 } >> 291 } 357 292 358 T= sqr(Q); << 293 if( (theParticle ==theAHe3) || (theParticle ==theATriton) ) 359 T*=3.893913e+4; // fm^(-2) -> MeV^2 << 294 { >> 295 sig_pbarp = cs->GetAntiHadronNucleonTotCrSc(particle,energy/3.); >> 296 Ref2 = XstotalHad/10./2./pi ; >> 297 if(Z>2) >> 298 { >> 299 ceff2 = 0.26 + 2.2e-4*sig_pbarp + 0.33*G4Exp(-0.03*sig_pbarp); >> 300 } >> 301 if(theDef == theProton) >> 302 { >> 303 ceff2 = 0.149 + 7.091e-04*sig_pbarp + 0.3743*G4Exp(-0.03*sig_pbarp); >> 304 } >> 305 if(theDef == theDeuteron) >> 306 { >> 307 ceff2 = 0.57 + 2.5e-4*sig_pbarp + 0.65 * G4Exp(-0.02*sig_pbarp); >> 308 } >> 309 if( (theDef == G4Triton::Triton()) || (theDef == G4He3::He3() ) ) >> 310 { >> 311 ceff2 = 0.39 + 2.7e-4*sig_pbarp + 0.7 * G4Exp(-0.02*sig_pbarp); >> 312 } >> 313 if(theDef == theAlpha) >> 314 { >> 315 ceff2 = 0.24 + 3.5e-4*sig_pbarp + 0.75 * G4Exp(-0.03*sig_pbarp); >> 316 } >> 317 } >> 318 >> 319 >> 320 if (theParticle == theAAlpha) >> 321 { >> 322 sig_pbarp = cs->GetAntiHadronNucleonTotCrSc(particle,energy/3.); >> 323 Ref2 = XstotalHad/10./2./pi ; >> 324 if(Z>2) >> 325 { >> 326 ceff2 = 0.22 + 2.0e-4*sig_pbarp + 0.2 * G4Exp(-0.03*sig_pbarp); >> 327 } >> 328 if(theDef == theProton) >> 329 { >> 330 ceff2= 0.078 + 6.657e-4*sig_pbarp + 0.3359*G4Exp(-0.03*sig_pbarp); >> 331 } >> 332 if(theDef == theDeuteron) >> 333 { >> 334 ceff2 = 0.40 + 3.5e-4 *sig_pbarp + 0.45 * G4Exp(-0.02*sig_pbarp); >> 335 } >> 336 if( (theDef == G4Triton::Triton()) || (theDef == G4He3::He3() ) ) >> 337 { >> 338 ceff2 = 0.24 + 3.5e-4*sig_pbarp + 0.75 * G4Exp(-0.03*sig_pbarp); >> 339 } >> 340 if(theDef == theAlpha) >> 341 { >> 342 ceff2 = 0.17 + 3.5e-4*sig_pbarp + 0.45 * G4Exp(-0.03*sig_pbarp); >> 343 } >> 344 } 360 345 361 } // End of simulation of strong interactio << 346 fRef=std::sqrt(Ref2); >> 347 fceff = std::sqrt(ceff2); >> 348 // G4cout<<" Ref "<<fRef<<" c_eff "<<fceff<< " rho "<< rho<<G4endl; 362 349 363 return T; << 350 >> 351 G4double Q = 0.0 ; >> 352 G4double BracFunct; >> 353 const G4int maxNumberOfLoops = 10000; >> 354 G4int loopCounter = 0; >> 355 do >> 356 { >> 357 Q = -G4Log(1.-(1.- G4Exp(-SlopeMag * Qmax))* G4UniformRand() )/SlopeMag; >> 358 G4double x = fRef * Q; >> 359 BracFunct = ( ( sqr(BesselOneByArg(x))+sqr(rho/2. * BesselJzero(x)) ) >> 360 * sqr(DampFactor(pi*fceff*Q))) /(Amag*G4Exp(-SlopeMag*Q)); >> 361 >> 362 BracFunct = BracFunct * Q * sqr(sqr(fRef)); >> 363 } >> 364 while ( (G4UniformRand()>BracFunct) && >> 365 ++loopCounter < maxNumberOfLoops ); /* Loop checking, 10.08.2015, A.Ribon */ >> 366 if ( loopCounter >= maxNumberOfLoops ) { >> 367 fTetaCMS = 0.0; >> 368 return 0.0; >> 369 } >> 370 >> 371 T= sqr(Q); >> 372 T*=3.893913e+4; // fm -> MeV^2 >> 373 } >> 374 >> 375 // VI: 29.04.2019 unnecessary computation of trigonometry >> 376 /* >> 377 G4double cosTet=1.0-T/(2.*ptot*ptot); >> 378 if(cosTet > 1.0 ) cosTet= 1.; // Uzhi 30 Nov. >> 379 if(cosTet < -1.0 ) cosTet=-1.; // Uzhi 30 Nov. >> 380 fTetaCMS=std::acos(cosTet); >> 381 */ >> 382 return T; 364 } 383 } 365 384 366 ////////////////////////////////////////////// 385 ///////////////////////////////////////////////////////////////////// 367 // Sample of Theta in CMS 386 // Sample of Theta in CMS 368 G4double G4AntiNuclElastic::SampleThetaCMS(co 387 G4double G4AntiNuclElastic::SampleThetaCMS(const G4ParticleDefinition* p, G4double plab, 369 388 G4int Z, G4int A) 370 { 389 { 371 G4double T; 390 G4double T; 372 T = SampleInvariantT( p, plab, Z, A); 391 T = SampleInvariantT( p, plab, Z, A); 373 392 374 // NaN finder 393 // NaN finder 375 if(!(T < 0.0 || T >= 0.0)) 394 if(!(T < 0.0 || T >= 0.0)) 376 { 395 { 377 if (verboseLevel > 0) 396 if (verboseLevel > 0) 378 { 397 { 379 G4cout << "G4DiffuseElastic:WARNING: A = 398 G4cout << "G4DiffuseElastic:WARNING: A = " << A 380 << " mom(GeV)= " << plab/GeV 399 << " mom(GeV)= " << plab/GeV 381 << " S-wave will be sampled" 400 << " S-wave will be sampled" 382 << G4endl; 401 << G4endl; 383 } 402 } 384 T = G4UniformRand()*fTmax; 403 T = G4UniformRand()*fTmax; 385 404 386 } 405 } 387 406 388 if(fptot > 0.) << 407 if(fptot > 0.) // Uzhi 24 Nov. 2011 389 { 408 { 390 G4double cosTet=1.0-T/(2.*fptot*fptot); 409 G4double cosTet=1.0-T/(2.*fptot*fptot); 391 if(cosTet > 1.0 ) cosTet= 1.; << 410 if(cosTet > 1.0 ) cosTet= 1.; // Uzhi 30 Nov. 392 if(cosTet < -1.0 ) cosTet=-1.; << 411 if(cosTet < -1.0 ) cosTet=-1.; // Uzhi 30 Nov. 393 fTetaCMS=std::acos(cosTet); 412 fTetaCMS=std::acos(cosTet); 394 return fTetaCMS; 413 return fTetaCMS; 395 } else << 414 } else // Uzhi 24 Nov. 2011 396 { << 415 { // Uzhi 24 Nov. 2011 397 return 2.*G4UniformRand()-1.; << 416 return 2.*G4UniformRand()-1.; // Uzhi 24 Nov. 2011 398 } << 417 } // Uzhi 24 Nov. 2011 399 } 418 } 400 419 401 420 402 ////////////////////////////////////////////// 421 ///////////////////////////////////////////////////////////////////// 403 // Sample of Theta in Lab System 422 // Sample of Theta in Lab System 404 G4double G4AntiNuclElastic::SampleThetaLab(co 423 G4double G4AntiNuclElastic::SampleThetaLab(const G4ParticleDefinition* p, G4double plab, 405 424 G4int Z, G4int A) 406 { 425 { 407 G4double T; 426 G4double T; 408 T = SampleInvariantT( p, plab, Z, A); 427 T = SampleInvariantT( p, plab, Z, A); 409 428 410 // NaN finder 429 // NaN finder 411 if(!(T < 0.0 || T >= 0.0)) 430 if(!(T < 0.0 || T >= 0.0)) 412 { 431 { 413 if (verboseLevel > 0) 432 if (verboseLevel > 0) 414 { 433 { 415 G4cout << "G4DiffuseElastic:WARNING: A = 434 G4cout << "G4DiffuseElastic:WARNING: A = " << A 416 << " mom(GeV)= " << plab/GeV 435 << " mom(GeV)= " << plab/GeV 417 << " S-wave will be sampled" 436 << " S-wave will be sampled" 418 << G4endl; 437 << G4endl; 419 } 438 } 420 T = G4UniformRand()*fTmax; 439 T = G4UniformRand()*fTmax; 421 } 440 } 422 441 423 G4double phi = G4UniformRand()*twopi; 442 G4double phi = G4UniformRand()*twopi; 424 443 425 G4double cost(1.); 444 G4double cost(1.); 426 if(fTmax > 0.) {cost = 1. - 2.0*T/fTmax;} << 445 if(fTmax > 0.) {cost = 1. - 2.0*T/fTmax;} // Uzhi 24 Nov. 2011 427 446 428 G4double sint; 447 G4double sint; 429 if( cost >= 1.0 ) 448 if( cost >= 1.0 ) 430 { 449 { 431 cost = 1.0; 450 cost = 1.0; 432 sint = 0.0; 451 sint = 0.0; 433 } 452 } 434 else if( cost <= -1.0) 453 else if( cost <= -1.0) 435 { 454 { 436 cost = -1.0; 455 cost = -1.0; 437 sint = 0.0; 456 sint = 0.0; 438 } 457 } 439 else 458 else 440 { 459 { 441 sint = std::sqrt((1.0-cost)*(1.0+cost)); 460 sint = std::sqrt((1.0-cost)*(1.0+cost)); 442 } 461 } 443 462 444 G4double m1 = p->GetPDGMass(); 463 G4double m1 = p->GetPDGMass(); 445 G4ThreeVector v(sint*std::cos(phi),sint*std: 464 G4ThreeVector v(sint*std::cos(phi),sint*std::sin(phi),cost); 446 v *= fptot; 465 v *= fptot; 447 G4LorentzVector nlv(v.x(),v.y(),v.z(),std::s 466 G4LorentzVector nlv(v.x(),v.y(),v.z(),std::sqrt(fptot*fptot + m1*m1)); 448 467 449 nlv.boost(fbst); 468 nlv.boost(fbst); 450 469 451 G4ThreeVector np = nlv.vect(); 470 G4ThreeVector np = nlv.vect(); 452 G4double theta = np.theta(); 471 G4double theta = np.theta(); 453 fThetaLab = theta; 472 fThetaLab = theta; 454 473 455 return theta; 474 return theta; 456 } 475 } 457 476 458 ////////////////////////////////////////////// 477 //////////////////////////////////////////////////////////////////// 459 // Calculation of Damp factor 478 // Calculation of Damp factor 460 G4double G4AntiNuclElastic::DampFactor(G4doub 479 G4double G4AntiNuclElastic::DampFactor(G4double x) 461 { 480 { 462 G4double df; 481 G4double df; 463 G4double f3 = 6.; // first factorials 482 G4double f3 = 6.; // first factorials 464 483 465 if( std::fabs(x) < 0.01 ) 484 if( std::fabs(x) < 0.01 ) 466 { 485 { 467 df=1./(1.+x*x/f3); 486 df=1./(1.+x*x/f3); 468 } 487 } 469 else 488 else 470 { 489 { 471 df = x/std::sinh(x); 490 df = x/std::sinh(x); 472 } 491 } 473 return df; 492 return df; 474 } 493 } 475 494 476 495 477 ////////////////////////////////////////////// 496 ///////////////////////////////////////////////////////////////////////////////// 478 // Calculation of particle velocity Beta 497 // Calculation of particle velocity Beta 479 498 480 G4double G4AntiNuclElastic::CalculateParticle 499 G4double G4AntiNuclElastic::CalculateParticleBeta( const G4ParticleDefinition* particle, 481 G4double mom 500 G4double momentum ) 482 { 501 { 483 G4double mass = particle->GetPDGMass(); 502 G4double mass = particle->GetPDGMass(); 484 G4double a = momentum/mass; 503 G4double a = momentum/mass; 485 fBeta = a/std::sqrt(1+a*a); 504 fBeta = a/std::sqrt(1+a*a); 486 505 487 return fBeta; 506 return fBeta; 488 } 507 } 489 508 490 509 491 ////////////////////////////////////////////// 510 /////////////////////////////////////////////////////////////////////////////////// 492 // Calculation of parameter Zommerfeld 511 // Calculation of parameter Zommerfeld 493 512 494 G4double G4AntiNuclElastic::CalculateZommerfe 513 G4double G4AntiNuclElastic::CalculateZommerfeld( G4double beta, G4double Z1, G4double Z2 ) 495 { 514 { 496 fZommerfeld = fine_structure_const*Z1*Z2/bet 515 fZommerfeld = fine_structure_const*Z1*Z2/beta; 497 516 498 return fZommerfeld; 517 return fZommerfeld; 499 } 518 } 500 519 501 ////////////////////////////////////////////// 520 //////////////////////////////////////////////////////////////////////////////////// 502 // 521 // 503 G4double G4AntiNuclElastic::CalculateAm( G4dou 522 G4double G4AntiNuclElastic::CalculateAm( G4double momentum, G4double n, G4double Z) 504 { 523 { 505 G4double k = momentum/hbarc; 524 G4double k = momentum/hbarc; 506 G4double ch = 1.13 + 3.76*n*n; 525 G4double ch = 1.13 + 3.76*n*n; 507 G4double zn = 1.77*k/G4Pow::GetInstance()-> 526 G4double zn = 1.77*k/G4Pow::GetInstance()->A13(Z)*Bohr_radius; 508 G4double zn2 = zn*zn; 527 G4double zn2 = zn*zn; 509 fAm = ch/zn2; 528 fAm = ch/zn2; 510 529 511 return fAm; 530 return fAm; 512 } 531 } 513 532 514 ////////////////////////////////////////////// 533 ///////////////////////////////////////////////////////////// 515 // 534 // 516 // Bessel J0 function based on rational approx 535 // Bessel J0 function based on rational approximation from 517 // J.F. Hart, Computer Approximations, New Yor 536 // J.F. Hart, Computer Approximations, New York, Willey 1968, p. 141 518 537 519 G4double G4AntiNuclElastic::BesselJzero(G4doub 538 G4double G4AntiNuclElastic::BesselJzero(G4double value) 520 { 539 { 521 G4double modvalue, value2, fact1, fact2, arg 540 G4double modvalue, value2, fact1, fact2, arg, shift, bessel; 522 541 523 modvalue = std::fabs(value); 542 modvalue = std::fabs(value); 524 543 525 if ( value < 8.0 && value > -8.0 ) 544 if ( value < 8.0 && value > -8.0 ) 526 { 545 { 527 value2 = value*value; 546 value2 = value*value; 528 547 529 fact1 = 57568490574.0 + value2*(-13362590 548 fact1 = 57568490574.0 + value2*(-13362590354.0 530 + value2*( 65161964 549 + value2*( 651619640.7 531 + value2*(-11214424 550 + value2*(-11214424.18 532 + value2*( 77392.33 551 + value2*( 77392.33017 533 + value2*(-184.9052 552 + value2*(-184.9052456 ) ) ) ) ); 534 553 535 fact2 = 57568490411.0 + value2*( 10295329 554 fact2 = 57568490411.0 + value2*( 1029532985.0 536 + value2*( 9494680. 555 + value2*( 9494680.718 537 + value2*(59272.648 556 + value2*(59272.64853 538 + value2*(267.85327 557 + value2*(267.8532712 539 + value2*1.0 558 + value2*1.0 ) ) ) ); 540 559 541 bessel = fact1/fact2; 560 bessel = fact1/fact2; 542 } 561 } 543 else 562 else 544 { 563 { 545 arg = 8.0/modvalue; 564 arg = 8.0/modvalue; 546 565 547 value2 = arg*arg; 566 value2 = arg*arg; 548 567 549 shift = modvalue-0.785398164; 568 shift = modvalue-0.785398164; 550 569 551 fact1 = 1.0 + value2*(-0.1098628627e-2 570 fact1 = 1.0 + value2*(-0.1098628627e-2 552 + value2*(0.2734510407e-4 571 + value2*(0.2734510407e-4 553 + value2*(-0.2073370639e-5 572 + value2*(-0.2073370639e-5 554 + value2*0.2093887211e-6 ) 573 + value2*0.2093887211e-6 ) ) ); 555 fact2 = -0.1562499995e-1 + value2*(0.143048 574 fact2 = -0.1562499995e-1 + value2*(0.1430488765e-3 556 + value2*(-0.691 575 + value2*(-0.6911147651e-5 557 + value2*(0.7621 576 + value2*(0.7621095161e-6 558 - value2*0.93494 577 - value2*0.934945152e-7 ) ) ); 559 578 560 bessel = std::sqrt(0.636619772/modvalue)*( 579 bessel = std::sqrt(0.636619772/modvalue)*(std::cos(shift)*fact1 - arg*std::sin(shift)*fact2); 561 } 580 } 562 return bessel; 581 return bessel; 563 } 582 } 564 583 565 584 566 ////////////////////////////////////////////// 585 ////////////////////////////////////////////////////////////////////////////// 567 // Bessel J1 function based on rational approx 586 // Bessel J1 function based on rational approximation from 568 // J.F. Hart, Computer Approximations, New Yor 587 // J.F. Hart, Computer Approximations, New York, Willey 1968, p. 141 569 588 570 G4double G4AntiNuclElastic::BesselJone(G4doub 589 G4double G4AntiNuclElastic::BesselJone(G4double value) 571 { 590 { 572 G4double modvalue, value2, fact1, fact2, arg 591 G4double modvalue, value2, fact1, fact2, arg, shift, bessel; 573 592 574 modvalue = std::fabs(value); 593 modvalue = std::fabs(value); 575 594 576 if ( modvalue < 8.0 ) 595 if ( modvalue < 8.0 ) 577 { 596 { 578 value2 = value*value; 597 value2 = value*value; 579 fact1 = value*(72362614232.0 + value2*(-7 598 fact1 = value*(72362614232.0 + value2*(-7895059235.0 580 + value2*( 2 599 + value2*( 242396853.1 581 + value2*(-2 600 + value2*(-2972611.439 582 + value2*( 1 601 + value2*( 15704.48260 583 + value2*(-3 602 + value2*(-30.16036606 ) ) ) ) ) ); 584 603 585 fact2 = 144725228442.0 + value2*(23005351 604 fact2 = 144725228442.0 + value2*(2300535178.0 586 + value2*(18583304 605 + value2*(18583304.74 587 + value2*(99447.43 606 + value2*(99447.43394 588 + value2*(376.9991 607 + value2*(376.9991397 589 + value2*1.0 608 + value2*1.0 ) ) ) ); 590 bessel = fact1/fact2; 609 bessel = fact1/fact2; 591 } 610 } 592 else 611 else 593 { 612 { 594 arg = 8.0/modvalue; 613 arg = 8.0/modvalue; 595 value2 = arg*arg; 614 value2 = arg*arg; 596 615 597 shift = modvalue - 2.356194491; 616 shift = modvalue - 2.356194491; 598 617 599 fact1 = 1.0 + value2*( 0.183105e-2 618 fact1 = 1.0 + value2*( 0.183105e-2 600 + value2*(-0.3516396496e-4 619 + value2*(-0.3516396496e-4 601 + value2*(0.2457520174e-5 620 + value2*(0.2457520174e-5 602 + value2*(-0.240337019e-6 621 + value2*(-0.240337019e-6 ) ) ) ); 603 622 604 fact2 = 0.04687499995 + value2*(-0.2002690 623 fact2 = 0.04687499995 + value2*(-0.2002690873e-3 605 + value2*( 0.8449199 624 + value2*( 0.8449199096e-5 606 + value2*(-0.8822898 625 + value2*(-0.88228987e-6 607 + value2*0.105787412 626 + value2*0.105787412e-6 ) ) ); 608 627 609 bessel = std::sqrt( 0.636619772/modvalue)* 628 bessel = std::sqrt( 0.636619772/modvalue)*(std::cos(shift)*fact1 - arg*std::sin(shift)*fact2); 610 if (value < 0.0) bessel = -bessel; 629 if (value < 0.0) bessel = -bessel; 611 } 630 } 612 return bessel; 631 return bessel; 613 } 632 } 614 633 615 ////////////////////////////////////////////// 634 //////////////////////////////////////////////////////////////////////////////// 616 // return J1(x)/x with special case for small 635 // return J1(x)/x with special case for small x 617 G4double G4AntiNuclElastic::BesselOneByArg(G4d 636 G4double G4AntiNuclElastic::BesselOneByArg(G4double x) 618 { 637 { 619 G4double x2, result; 638 G4double x2, result; 620 639 621 if( std::fabs(x) < 0.01 ) 640 if( std::fabs(x) < 0.01 ) 622 { 641 { 623 x *= 0.5; 642 x *= 0.5; 624 x2 = x*x; 643 x2 = x*x; 625 result = (2.- x2 + x2*x2/6.)/4.; 644 result = (2.- x2 + x2*x2/6.)/4.; 626 } 645 } 627 else 646 else 628 { 647 { 629 result = BesselJone(x)/x; 648 result = BesselJone(x)/x; 630 } 649 } 631 return result; 650 return result; 632 } 651 } 633 652 634 ////////////////////////////////////////////// 653 ///////////////////////////////////////////////////////////////////////////////// 635 // return angle from which Coulomb scattering 654 // return angle from which Coulomb scattering is calculated 636 G4double G4AntiNuclElastic::GetcosTeta1(G4doub 655 G4double G4AntiNuclElastic::GetcosTeta1(G4double plab, G4int A) 637 { 656 { 638 657 639 // G4double p0 =G4LossTableManager::Instance() 658 // G4double p0 =G4LossTableManager::Instance()->FactorForAngleLimit()*CLHEP::hbarc/CLHEP::fermi; 640 G4double p0 = 1.*hbarc/fermi; 659 G4double p0 = 1.*hbarc/fermi; 641 //G4double cteta1 = 1.0 - p0*p0/2.0 * pow(A,2. 660 //G4double cteta1 = 1.0 - p0*p0/2.0 * pow(A,2./3.)/(plab*plab); 642 G4double cteta1 = 1.0 - p0*p0/2.0 * G4Pow::G 661 G4double cteta1 = 1.0 - p0*p0/2.0 * G4Pow::GetInstance()->Z23(A)/(plab*plab); 643 ////////////////// 662 ////////////////// 644 if(cteta1 < -1.) cteta1 = -1.0; 663 if(cteta1 < -1.) cteta1 = -1.0; 645 return cteta1; 664 return cteta1; 646 } 665 } 647 666 648 667 649 668 650 669 651 670 652 671 653 672 654 673