#include <G4ScreeningMottCrossSection.hh>
Public Member Functions | |
G4ScreeningMottCrossSection () | |
virtual | ~G4ScreeningMottCrossSection () |
void | Initialise (const G4ParticleDefinition *, G4double cosThetaLim) |
G4double | GetScreeningAngle () |
void | SetScreeningCoefficient () |
void | SetupParticle (const G4ParticleDefinition *) |
void | SetupKinematic (G4double kinEnergy, G4double Z) |
G4double | NuclearCrossSection () |
G4ThreeVector | GetNewDirection () |
G4double | GetMom2CM () const |
G4double | GetMom2Lab () const |
G4double | GetTrec () const |
G4double | GetScreeningCoefficient () const |
G4double | GetTotalCross () const |
G4double | McFcorrection (G4double) |
G4double | RatioMottRutherford (G4double) |
G4double | FormFactor2ExpHof (G4double) |
G4double | GetScatteringAngle () |
G4double | AngleDistribution (G4double) |
Definition at line 86 of file G4ScreeningMottCrossSection.hh.
G4ScreeningMottCrossSection::G4ScreeningMottCrossSection | ( | ) |
Definition at line 83 of file G4ScreeningMottCrossSection.cc.
References G4NistManager::Instance().
00083 : 00084 cosThetaMin(1.0), 00085 cosThetaMax(-1.0), 00086 alpha(fine_structure_const), 00087 htc2(hbarc_squared), 00088 e2(electron_mass_c2*classic_electr_radius) 00089 { 00090 00091 TotalCross=0; 00092 00093 fNistManager = G4NistManager::Instance(); 00094 particle=0; 00095 00096 spin = mass = mu_rel=0; 00097 tkinLab = momLab2 = invbetaLab2=0; 00098 tkin = mom2 = invbeta2=beta=gamma=0; 00099 00100 Trec=targetZ = targetMass = As =0; 00101 etag = ecut = 0.0; 00102 00103 targetA = 0; 00104 00105 cosTetMinNuc=0; 00106 cosTetMaxNuc=0; 00107 00108 for(G4int i=0 ; i<5; i++){ 00109 for(G4int j=0; j< 6; j++){ 00110 coeffb[i][j]=0; 00111 } 00112 } 00113 00114 00115 00116 00117 } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4ScreeningMottCrossSection::~G4ScreeningMottCrossSection | ( | ) | [virtual] |
Definition at line 393 of file G4ScreeningMottCrossSection.cc.
References FormFactor2ExpHof(), McFcorrection(), G4INCL::Math::pi, and RatioMottRutherford().
Referenced by GetScatteringAngle().
00393 { 00394 00395 00396 G4double total=TotalCross ; 00397 G4double fatt= e2*targetZ/(mu_rel*gamma*beta*beta); 00398 G4double fatt2=fatt*fatt; 00399 total/=fatt2; 00400 00401 G4double R=0; 00402 if (coeffb[0][0]!=0){ 00403 // cout<<" Mott....targetZ "<< targetZ<<endl; 00404 R=RatioMottRutherford(anglein); 00405 } 00406 00407 else if (coeffb[0][0]==0){ 00408 // cout<<" McF.... targetZ "<< targetZ<<endl; 00409 R=McFcorrection(anglein); 00410 } 00411 00412 00413 G4double y=2.*pi*sin(anglein)*R*FormFactor2ExpHof(anglein)/ 00414 ((2*As+2.*pow(sin(anglein/2.),2.))*(2.*As+2.*pow(sin(anglein/2.),2.) )); 00415 00416 return y/total; 00417 00418 }
Definition at line 237 of file G4ScreeningMottCrossSection.cc.
Referenced by AngleDistribution(), and NuclearCrossSection().
00237 { 00238 00239 00240 G4double M=targetMass; 00241 G4double E=tkinLab; 00242 G4double Etot=E+mass; 00243 G4double Tmax=2.*M*E*(E+2.*mass)/(mass*mass+M*M+2.*M*Etot); 00244 G4double T=Tmax*pow(sin(angle/2.),2.); 00245 G4double q2=T*(T+2.*M); 00246 q2/=htc2;//1/cm2 00247 G4double RN=1.27e-13*pow(targetA,0.27)*cm; 00248 G4double xN= (RN*RN*q2); 00249 G4double den=(1.+xN/12.); 00250 G4double FN=1./(den*den); 00251 G4double form2=(FN*FN); 00252 00253 00254 return form2; 00255 00256 //cout<<"..................... form2 "<< form2<<endl; 00257 }
G4double G4ScreeningMottCrossSection::GetMom2CM | ( | ) | const [inline] |
G4double G4ScreeningMottCrossSection::GetMom2Lab | ( | ) | const [inline] |
Definition at line 202 of file G4ScreeningMottCrossSection.hh.
Referenced by G4eSingleCoulombScatteringModel::SampleSecondaries().
G4ThreeVector G4ScreeningMottCrossSection::GetNewDirection | ( | ) |
Definition at line 496 of file G4ScreeningMottCrossSection.cc.
References G4UniformRand, and GetScatteringAngle().
Referenced by G4eSingleCoulombScatteringModel::SampleSecondaries().
00496 { 00497 00498 G4ThreeVector dir(0.0,0.0,1.0); 00499 00500 00501 G4double z1=GetScatteringAngle(); 00502 00503 G4double cost = cos(z1); 00504 G4double sint = sin(z1); 00505 G4double phi = twopi* G4UniformRand(); 00506 G4double dirx = sint*cos(phi); 00507 G4double diry = sint*sin(phi); 00508 G4double dirz = cost; 00509 00510 00511 //.......set Trc 00512 G4double etot=tkinLab+mass; 00513 G4double mass2=targetMass; 00514 Trec=(1.0 - cost)* mass2*(etot*etot - mass*mass )/ 00515 (mass*mass + mass2*mass2+ 2.*mass2*etot); 00516 00517 00518 00519 dir.set(dirx,diry,dirz); 00520 00521 00522 00523 00524 return dir; 00525 00526 }
G4double G4ScreeningMottCrossSection::GetScatteringAngle | ( | ) |
Definition at line 422 of file G4ScreeningMottCrossSection.cc.
References AngleDistribution(), G4UniformRand, and GetScreeningAngle().
Referenced by GetNewDirection().
00423 { 00424 00425 00426 //cout<<" G4ScreeningMottCrossSection::SampleCosineTheta ............."<<endl; 00427 00428 if(cosTetMaxNuc >= cosTetMinNuc) return 0.0; 00429 00430 G4double anglemin=std::acos(cosTetMinNuc); 00431 G4double anglemax= std::acos(cosTetMaxNuc); 00432 00433 const G4double limit = 1.e-9; 00434 if(anglemin < limit) { 00435 anglemin = GetScreeningAngle()/10.; 00436 if(anglemin < limit) { anglemin = limit; } 00437 } 00438 00439 // cout<<"................ tkinLab "<< G4BestUnit(tkinLab,"Energy") << " anglemin= "<<anglemin<<endl; 00440 //cout<<"anglemax= "<<anglemax<<endl; 00441 G4double r =G4UniformRand(); 00442 00443 G4double loganglemin=log10(anglemin); 00444 G4double loganglemax=log10(anglemax); 00445 G4double logdangle=0.01; 00446 00447 G4int bins=(G4int)((loganglemax-loganglemin)/logdangle); 00448 00449 std::vector<G4double> angle; 00450 std::vector<G4double> tet; 00451 std::vector<G4double> dangle; 00452 00453 for(G4int i=0; i<=bins; i++ ){ 00454 tet.push_back(0); 00455 dangle.push_back(0); 00456 angle.push_back(pow(10.,loganglemin+logdangle*i)); 00457 } 00458 00459 00460 G4int dim = tet.size(); 00461 G4double scattangle=0; 00462 G4double y=0; 00463 G4double dy=0; 00464 G4double area=0; 00465 00466 for(G4int i=0; i<dim;i++){ 00467 00468 if(i!=dim-1){ 00469 dangle[i]=(angle[i+1]-angle[i]); 00470 tet[i]=(angle[i+1]+angle[i])/2.; 00471 }else if(i==dim-1){ 00472 break; 00473 } 00474 00475 y+=AngleDistribution(tet[i])*dangle[i]; 00476 dy= y-area ; 00477 area=y; 00478 00479 if(r >=y-dy && r<=y+dy ){ 00480 scattangle= angle[i] +G4UniformRand()*dangle[i]; 00481 //cout<<"y "<<y <<" r "<< r << " y/r "<<y/r << endl; 00482 break; 00483 00484 } 00485 00486 } 00487 00488 00489 return scattangle; 00490 00491 00492 }
G4double G4ScreeningMottCrossSection::GetScreeningAngle | ( | ) |
Definition at line 157 of file G4ScreeningMottCrossSection.cc.
References G4INCL::Math::pi, and SetScreeningCoefficient().
Referenced by GetScatteringAngle(), NuclearCrossSection(), and SetupKinematic().
00157 { 00158 00159 SetScreeningCoefficient(); 00160 00161 //cout<<" As "<<As<<endl; 00162 if(As < 0.0) { As = 0.0; } 00163 else if(As > 1.0) { As = 1.0; } 00164 00165 G4double screenangle=2.*asin(sqrt(As)); 00166 00167 // cout<<" screenangle "<< screenangle <<endl; 00168 00169 if(screenangle>=pi) screenangle=pi; 00170 00171 00172 return screenangle; 00173 00174 }
G4double G4ScreeningMottCrossSection::GetScreeningCoefficient | ( | ) | const [inline] |
G4double G4ScreeningMottCrossSection::GetTotalCross | ( | ) | const [inline] |
Definition at line 225 of file G4ScreeningMottCrossSection.hh.
Referenced by G4eSingleCoulombScatteringModel::SampleSecondaries().
G4double G4ScreeningMottCrossSection::GetTrec | ( | ) | const [inline] |
Definition at line 210 of file G4ScreeningMottCrossSection.hh.
Referenced by G4eSingleCoulombScatteringModel::SampleSecondaries().
void G4ScreeningMottCrossSection::Initialise | ( | const G4ParticleDefinition * | , | |
G4double | cosThetaLim | |||
) |
Definition at line 124 of file G4ScreeningMottCrossSection.cc.
References DBL_MAX, DBL_MIN, and SetupParticle().
Referenced by G4eSingleCoulombScatteringModel::Initialise().
00126 { 00127 00128 SetupParticle(p); 00129 tkin = targetZ = mom2 = DBL_MIN; 00130 ecut = etag = DBL_MAX; 00131 particle = p; 00132 cosThetaMin = CosThetaLim; 00133 00134 }
Definition at line 261 of file G4ScreeningMottCrossSection.cc.
References G4INCL::Math::pi.
Referenced by AngleDistribution(), and NuclearCrossSection().
00261 { 00262 00263 00264 G4double beta2=1./invbeta2; 00265 G4double sintmezzi=std::sin(angle/2.); 00266 G4double sin2tmezzi = sintmezzi*sintmezzi; 00267 G4double R=1.-beta2*sin2tmezzi + targetZ*alpha*beta*pi*sintmezzi*(1.-sintmezzi); 00268 00269 00270 return R; 00271 }
G4double G4ScreeningMottCrossSection::NuclearCrossSection | ( | ) |
Definition at line 303 of file G4ScreeningMottCrossSection.cc.
References FormFactor2ExpHof(), GetScreeningAngle(), McFcorrection(), G4INCL::Math::pi, and RatioMottRutherford().
Referenced by G4eSingleCoulombScatteringModel::ComputeCrossSectionPerAtom().
00304 { 00305 if(cosTetMaxNuc >= cosTetMinNuc) return 0.0; 00306 00307 TotalCross=0; 00308 00309 G4double anglemin =std::acos(cosTetMinNuc); 00310 G4double anglemax =std::acos(cosTetMaxNuc); 00311 00312 const G4double limit = 1.e-9; 00313 if(anglemin < limit) { 00314 anglemin = GetScreeningAngle()/10.; 00315 if(anglemin < limit) { anglemin = limit; } 00316 } 00317 00318 //cout<<" anglemin "<< anglemin <<endl; 00319 00320 G4double loganglemin=log10(anglemin); 00321 G4double loganglemax=log10(anglemax); 00322 G4double logdangle=0.01; 00323 00324 G4int bins=(G4int)((loganglemax-loganglemin)/logdangle); 00325 00326 00327 vector<G4double> angle; 00328 vector<G4double> tet; 00329 vector<G4double> dangle; 00330 vector<G4double> cross; 00331 00332 for(G4int i=0; i<=bins; i++ ){ 00333 tet.push_back(0); 00334 dangle.push_back(0); 00335 angle.push_back(pow(10.,loganglemin+logdangle*i)); 00336 cross.push_back(0); 00337 } 00338 00339 00340 G4int dim = tet.size(); 00341 //cout<<"dim--- "<<dim<<endl; 00342 00343 00344 for(G4int i=0; i<dim;i++){ 00345 00346 if(i!=dim-1){ 00347 dangle[i]=(angle[i+1]-angle[i]); 00348 tet[i]=(angle[i+1]+angle[i])/2.; 00349 }else if(i==dim-1){ 00350 break; 00351 } 00352 00353 00354 G4double R=0; 00355 G4double F2=FormFactor2ExpHof(tet[i]); 00356 00357 if (coeffb[0][0]!=0){ 00358 //cout<<" Mott....targetZ "<< targetZ<<endl; 00359 R=RatioMottRutherford(tet[i]); 00360 } 00361 00362 else if (coeffb[0][0]==0){ 00363 // cout<<" McF.... targetZ "<< targetZ<<endl; 00364 R=McFcorrection(tet[i]); 00365 } 00366 00367 00368 //cout<<"----------------- R "<<R<<" F2 "<<F2<<endl; 00369 00370 00371 // cout<<"angle "<<tet[i] << " F2 "<<F2<<endl; 00372 00373 G4double e4=e2*e2; 00374 G4double den=2.*As+2.*pow(sin(tet[i]/2.),2.); 00375 G4double func=1./(den*den); 00376 00377 G4double fatt= targetZ/(mu_rel*gamma*beta*beta); 00378 G4double sigma=e4*fatt*fatt*func; 00379 cross[i]=F2*R*sigma; 00380 G4double pi2sintet=2.*pi*sin(tet[i]); 00381 00382 TotalCross+=pi2sintet*cross[i]*dangle[i]; 00383 }//end integral 00384 00385 00386 //cout<< "ok ......... TotalCross "<<TotalCross<<endl; 00387 00388 00389 return TotalCross; 00390 00391 }
Definition at line 273 of file G4ScreeningMottCrossSection.cc.
Referenced by AngleDistribution(), and NuclearCrossSection().
00273 { 00274 00275 00276 G4double R=0; 00277 G4double fcost=std::sqrt((1. -cos(angle))); 00278 G4double a[5]; 00279 G4double shift=0.7181228; 00280 G4double beta0= beta -shift; 00281 00282 for(G4int j=0 ;j<=4;j++){ 00283 a[j]=0; 00284 } 00285 00286 for(G4int j=0 ;j<=4;j++){ 00287 for(G4int k=0;k<=5;k++ ){ 00288 a[j]+=coeffb[j][k]*pow(beta0,k); 00289 } 00290 } 00291 00292 for(G4int j=0 ;j<=4 ;j++){ 00293 R+=a[j]* pow(fcost,j); 00294 } 00295 00296 00297 00298 return R; 00299 00300 }
void G4ScreeningMottCrossSection::SetScreeningCoefficient | ( | ) |
Definition at line 136 of file G4ScreeningMottCrossSection.cc.
Referenced by GetScreeningAngle().
00136 { 00137 00138 G4double alpha2=alpha*alpha; 00139 //Bohr radius 00140 G4double a0= Bohr_radius ;//0.529e-8*cm; 00141 //Thomas-Fermi screening length 00142 G4double aU=0.88534*a0/pow(targetZ,1./3.); 00143 G4double twoR2=aU*aU; 00144 00145 G4double factor= 1.13 + 3.76*targetZ*targetZ*invbeta2*alpha2; 00146 As=0.25*(htc2)/(twoR2*mom2)*factor; 00147 00148 00149 00150 00151 //cout<<"0k .........................As "<<As<<endl; 00152 00153 }
Definition at line 177 of file G4ScreeningMottCrossSection.cc.
References G4NistManager::GetAtomicMassAmu(), G4NucleiProperties::GetNuclearMass(), GetScreeningAngle(), and G4MottCoefficients::SetMottCoeff().
Referenced by G4eSingleCoulombScatteringModel::ComputeCrossSectionPerAtom().
00178 { 00179 00180 //...Target 00181 G4int iz = G4int(Z); 00182 G4double A = fNistManager->GetAtomicMassAmu(iz); 00183 G4int ia = G4int(A); 00184 G4double mass2 = G4NucleiProperties::GetNuclearMass(ia, iz); 00185 00186 targetZ = Z; 00187 targetA = fNistManager->GetAtomicMassAmu(iz); 00188 targetMass= mass2; 00189 00190 mottcoeff->SetMottCoeff(targetZ, coeffb); 00191 00192 //cout<<"......... targetA "<< targetA <<endl; 00193 //cout<<"......... targetMass "<< targetMass/MeV <<endl; 00194 00195 // incident particle lab 00196 tkinLab = ekin; 00197 momLab2 = tkinLab*(tkinLab + 2.0*mass); 00198 invbetaLab2 = 1.0 + mass*mass/momLab2; 00199 00200 G4double etot = tkinLab + mass; 00201 G4double ptot = sqrt(momLab2); 00202 G4double m12 = mass*mass; 00203 00204 00205 // relativistic reduced mass from publucation 00206 // A.P. Martynenko, R.N. Faustov, Teoret. mat. Fiz. 64 (1985) 179 00207 00208 //incident particle & target nucleus 00209 G4double Ecm=sqrt(m12 + mass2*mass2 + 2.0*etot*mass2); 00210 mu_rel=mass*mass2/Ecm; 00211 G4double momCM= ptot*mass2/Ecm; 00212 // relative system 00213 mom2 = momCM*momCM; 00214 invbeta2 = 1.0 + mu_rel*mu_rel/mom2; 00215 tkin = momCM*sqrt(invbeta2) - mu_rel;//Ekin of mu_rel 00216 G4double beta2=1./invbeta2; 00217 beta=std::sqrt(beta2) ; 00218 G4double gamma2= 1./(1.-beta2); 00219 gamma=std::sqrt(gamma2); 00220 00221 00222 00223 //......................................................... 00224 00225 00226 G4double screenangle=GetScreeningAngle()/10.; 00227 //cout<<" screenangle [rad] "<<screenangle/rad <<endl; 00228 00229 cosTetMinNuc =min( cosThetaMin ,cos(screenangle)); 00230 cosTetMaxNuc =cosThetaMax; 00231 00232 //cout<<"ok..............mu_rel "<<mu_rel<<endl; 00233 00234 }
void G4ScreeningMottCrossSection::SetupParticle | ( | const G4ParticleDefinition * | ) | [inline] |
Definition at line 184 of file G4ScreeningMottCrossSection.hh.
References G4ParticleDefinition::GetPDGMass(), and G4ParticleDefinition::GetPDGSpin().
Referenced by Initialise(), and G4eSingleCoulombScatteringModel::SetupParticle().
00185 { 00186 particle = p; 00187 mass = particle->GetPDGMass(); 00188 spin = particle->GetPDGSpin(); 00189 if(0.0 != spin) { spin = 0.5; } 00190 tkin = 0.0; 00191 }