// // ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // // // G4 Tools program: Glauber Hadron-Nuclear Cross Sections // ..................................................... // Created: M.V. Kossov, CERN/ITEP(Moscow), 20-Jan-2005 // //===================================================================== //#define debug //#define bestest //#define integrcs #define eldiffcs #include "globals.hh" #include #include #include #include "G4ios.hh" #include "G4QBesIKJY.hh" #include "G4QPDGCode.hh" #include "G4NucleiPropertiesTable.hh" #include "G4NucleiProperties.hh" //#include // Integrated cross-sections G4double TotalCrSec, InelCrSec, ProdCrSec, ElasticCrSec, QuasyElasticCrSec; // Parameters of hadron-nucleon interaction G4double HadrTot, HadrSlope, HadrReIm, DDSect2, DDSect3, Tot00; // CHIPS parameters of hadron-proton & hadron-neutron interaction (Re/Im is common) G4double HadrTElN, HadrTElP, HadrSlpN, HadrSlpP, HadrPexN, HadrPexP; // CHIPS Parameters (only for protons, nn is necessary for neutrons np+nn) void CHIPSParameters(G4int iPDG, G4double HadrMoment) // HadrMoment is in MeV { G4double p=HadrMoment/GeV; // Momentum in GeV G4double p2=p*p; // Squared momentum in GeV^2 G4double sp=std::sqrt(p); G4double p2s=p2*sp; G4double p3=p2*p; G4double p4=p2*p2; G4double p5=p4*p; G4double lp=std::log(p); G4double d2=(lp-5.)*(lp-5.); G4double p8=p4*p4; if (iPDG==2212) { HadrTElN=12./(p2s+.05*p+.0001/sp)+.35/p+(6.75+.14*d2+19./p)/(1.+.6/p4); // pn (mb) HadrTElP=2.91/(p2s+.0024)+(6.75+.14*d2+23./p)/(1.+.4/p4); // pp (mb) HadrSlpN=(7.2+4.32/(p8+.012*p3))/(1.+2.5/p4); // pn (GeV^-2) HadrSlpP=8.*std::pow(p,.055)/(1.+3.64/p4); // pp (GeV^-2) HadrPexN=(6.75+.14*d2+13./p)/(1.+.14/p4)+.6/(p4+.00013); // pn (mb/sr) HadrPexP=(74.+3.*d2)/(1.+3.4/p5)+(.2/p2+17.*p)/(p4+.001*sp); // pn (mb/sr) HadrReIm=-.54+.0954*lp+.975/(p2+.09865/p); // no unit (the same for pp & pn) //G4cout<<"CHIPSPar:p="<252) G4Exception("G4GCS: This nucleus is too heavy for the model !!!"); //if(HadrEnergy-MassH<1.) G4Exception("Kin energy is too small for the model (T>1 GeV)"); CalculateParameters(hPDG, HadrMom); CalculateIntegralCS(A, HadrEnergy); CalculateNuclearParameters(A); G4double Q2 = aQ2/1000/1000; // in GeV^2 //MassN = A*0.938; // @@ This is bad! G4double MassN = A*0.9315; // @@ Atomic Unit is bad too G4double MassN2 = MassN*MassN; G4double S = (MassN+MassN)*HadrEnergy+MassN2+MassH2;// Mondelststam s G4double EcmH = (S-MassN2+MassH2)/2/std::sqrt(S); // CM energy of a hadron G4double CMMom = std::sqrt(EcmH*EcmH-MassH2); // CM momentum G4double Stot = HadrTot*mb2G2; // in GeV^-2 G4double Bhad = HadrSlope; // in GeV^-2 G4double Asq = 1+HadrReIm*HadrReIm; // |M|^2/(ImM)^2 G4double Rho2 = std::sqrt(Asq); // M/ImM G4double R12 = R1*R1; G4double R22 = R2*R2; G4double R12B = R12+Bhad+Bhad; G4double R22B = R22+Bhad+Bhad; G4double R12Ap = R12+20; G4double R22Ap = R22+20; G4double R13Ap = R12*R1/R12Ap; G4double R23Ap = R22*R2/R22Ap*Pnucl; G4double R23dR13 = R23Ap/R13Ap; G4double R12Apd = 2./R12Ap; G4double R22Apd = 2./R22Ap; G4double R122Apd = (R12Apd+R22Apd)/2; G4double dR0H = dR0*HadrEnergy/4; G4double DDSec1p = DDSect2+DDSect3*std::log(dR0H/R1); G4double DDSec2p = DDSect2+DDSect3*std::log(dR0H/std::sqrt((R12+R22)/2)); G4double DDSec3p = DDSect2+DDSect3*std::log(dR0H/R2); G4double Norm = (R12*R1-Pnucl*R22*R2)*Aeff; // Some questionable norming G4double R13 = R12*R1/R12B; G4double R23 = Pnucl*R22*R2/R22B; G4double norFac = Stot/twopi/Norm; // totCS (in GeV^-2) is used G4double Unucl = norFac*R13; G4double UnuclScr = norFac*R13Ap; G4double SinFi = HadrReIm/Rho2; G4double FiH = std::asin(SinFi); G4double N = -1.; G4double N2 = R23/R13; G4double ImElA0 = 0.; G4double ReElA0 = 0.; G4double Tot1 = 0.; for(G4int i=1; i<=A; i++) // @@ Make separately for n and p { N *= -Unucl*(A-i+1)*Rho2/i; G4double N4 = 1.; G4double Prod1 = std::exp(-Q2*R12B/i/4)*R12B/i; G4double medTot = R12B/i; for(G4int l=1; l<=i; l++) { G4double exp1 = l/R22B+(i-l)/R12B; N4 *= -(i-l+1)*N2/l; G4double Nexp = N4/exp1; Prod1 += Nexp*std::exp(-Q2/exp1/4); medTot += Nexp; } G4double FiHi = FiH*i; G4double nCos = N*std::cos(FiHi); ReElA0 += Prod1*N*std::sin(FiHi); ImElA0 += Prod1*nCos; Tot1 += medTot*nCos; if(std::abs(Prod1*N/ImElA0) < eps) break; } ImElA0 *= piMG; // The amplitude in mb ReElA0 *= piMG; // The amplitude in mb Tot1 *= piMG+piMG; G4double N1p = 1.; G4double R13Ap1 = DDSec1p*R13Ap*R13Ap/2; G4double R22Ap1 = DDSec2p*R13Ap*R23Ap; G4double R23Ap1 = DDSec3p*R23Ap*R23Ap*R22Ap/2; G4double R13Ap2 = R13Ap1*R12Ap/4; G4double R22Ap2 = R22Ap1/R122Apd/2; G4double R23Ap2 = R23Ap1*R22Ap/4; G4double Q28 = Q2/8; G4double Q24 = Q28+Q28; G4double Din1 = R13Ap2*std::exp(-Q28*R12Ap)-R22Ap2*std::exp(-(Q28+Q28)/R122Apd)+ R23Ap2*std::exp(-Q28*R22Ap); // i=0 start value G4double DTot1 = R13Ap2-R22Ap2+R23Ap2; // i=0 start value if (A<96) { for(G4int i=1; i252) G4Exception("G4GCS: This nucleus is too heavy for the model !!!"); //if(HadrEnergy-MassH<1.) G4Exception("Kin energy is too small for the model (T>1 GeV)"); CalculateParameters(hPDG, HadrMom); CalculateIntegralCS(A, HadrEnergy); CalculateNuclearParameters(A); G4double Q2 = aQ2/1000/1000; // in GeV^2 //G4doubleMassN = A*0.938; // @@ This is bad! G4double MassN = A*0.9315; // @@ Atomic Unit is bad too if(G4NucleiPropertiesTable::IsInTable(Z,A)) MassN=G4NucleiProperties::GetNuclearMass(A,Z)/1000.; // Geant4 NuclearMass G4double MassN2 = MassN*MassN; G4double S = (MassN+MassN)*HadrEnergy+MassN2+MassH2;// Mondelststam s G4double EcmH = (S-MassN2+MassH2)/2/std::sqrt(S); // CM energy of a hadron G4double CMMom = std::sqrt(EcmH*EcmH-MassH2); // CM momentum G4double Stot = HadrTot*mb2G2; // in GeV^-2 G4double Bhad = HadrSlope; // in GeV^-2 G4double Asq = 1+HadrReIm*HadrReIm; // |M|^2/(ImM)^2 G4double Rho2 = std::sqrt(Asq); // M/ImM G4double R12 = R1*R1; G4double R22 = R2*R2; G4double R12B = R12+Bhad+Bhad; // Slope is used G4double R22B = R22+Bhad+Bhad; // Slope is used G4double Norm = (R12*R1-Pnucl*R22*R2)*Aeff; // Some questionable norming G4double R13 = R12*R1/R12B; // Slope is used G4double R23 = Pnucl*R22*R2/R22B; // Slope is used G4double norFac = Stot/twopi/Norm; // totCS (in GeV^-2) is used G4double Unucl = norFac*R13; G4double SinFi = HadrReIm/Rho2; G4double FiH = std::asin(SinFi); G4double N = -1.; G4double N2 = R23/R13; // Slope is used G4double ImElA0 = 0.; G4double ReElA0 = 0.; G4double Tot1 = 0.; for(G4int i=1; i<=A; i++) { N *= -Unucl*(A-i+1)*Rho2/i; G4double N4 = 1.; G4double Prod1 = std::exp(-Q2*R12B/i/4)*R12B/i; // Slope is used G4double medTot = R12B/i; // Slope is used for(G4int l=1; l<=i; l++) { G4double exp1 = l/R22B+(i-l)/R12B; // Slope is used N4 *= -(i-l+1)*N2/l; // Slope is used G4double Nexp = N4/exp1; Prod1 += Nexp*std::exp(-Q2/exp1/4); medTot += Nexp; } G4double FiHi = FiH*i; G4double nCos = N*std::cos(FiHi); ReElA0 += Prod1*N*std::sin(FiHi); ImElA0 += Prod1*nCos; Tot1 += medTot*nCos; if(std::abs(Prod1*N/ImElA0) < eps) break; } ImElA0 *= piMG; // The amplitude in mb ReElA0 *= piMG; // The amplitude in mb Tot1 *= piMG+piMG; G4double Corr0 = Tot00/Tot1; ImElA0 *= Corr0; return (ReElA0*ReElA0+ImElA0*ImElA0)*CMMom*CMMom*mb2G2/4/pi2; } // End of DiffElasticCS G4double CHIPS_Tb(G4int A, G4double b) // T(b) in fm-2 { static G4int Am=0; // Associative memory value A static G4double B=0.; // Effective edge static G4double C=0.; // Normalization factor static G4double D=0.; // Slope parameter if(A!=Am) { B=.0008*A*A; // no units D=.42*std::pow(A,-.26); // fm^-2 C=A*D/pi/std::log(1.+B); // fm^-2 } G4double E=B*std::exp(-D*b*b); return C*E/(1.+E); // T(b) in fm^-2 } G4double Thickness(G4int A, G4double b, G4double R) // T(b) in fm^-2 {// ========================================== // rAmax=2.5 is a GlobStatConstPar static const G4double bTh = .545; // Surface thicknes static const G4double bTh2 = bTh*bTh; // SquaredSurface thicknes G4double b2 = b*b; // Squared impact parameter G4double dr = rAmax*R/(NptB-1); // Step of integration in z G4double R2 = R*R; // Working parameter G4double Norm = .75/pi/R2/R/(1.+bTh2*pi2/R2); // Corrected Volume (?) G4double r = -dr; // Pre value for the radius G4double SumZ = 0.; // Prototype of the result //G4double SumN = 0.; // is not used for(G4int k=0; k252) G4Exception("G4GCS: This nucleus is too heavy for the model !!!"); //if(HadrEnergy-MassH<1.) G4Exception("Kin energy is too small for the model (T>1 GeV)"); G4double Re = std::pow(A, 0.33333333); G4double Re2 = Re*Re; CalculateParameters(hPDG, HadrMom); G4double Q2 = aQ2/1000/1000; // GeV // Individual corrections for nuclei which had data if (A==208) r0 = 1.125; else if(A==90) r0 = 1.12; else if(A==64) r0 = 1.1; else if(A==58) r0 = 1.09; else if(A==48) r0 = 1.07; else if(A==40) r0 = 1.15; else if(A==28) r0 = 0.93; else if(A==16) r0 = 0.92; else if(A==12) r0 = 0.80; else r0 = 1.16*(1.-1.16/Re2); // For other nuclei which have not been tested G4double MassN = mN; // A * AtomicUnit(GeV) G4double MassN2 = MassN*MassN; G4double S = (MassN+MassN)*HadrEnergy+MassN2+MassH2; // Mondelstam S G4double EcmH = (S-MassN2+MassH2)/2/std::sqrt(S); // Hadron CM Energy G4double CMMom = std::sqrt(EcmH*EcmH-MassH2); // CM momentum G4double rAfm = r0*Re; // Nuclear radius G4double rAGeV = rAfm*s2G10; // Big integration radius G4double stepB = rAmax*rAGeV/(NptB-1); // dr step of integration G4double hTotG2 = HadrTot*mb2G2; G4double ReSum = 0.; G4double ImSum = 0.; G4double ValB = -stepB; for(G4int i=0; i 320.) break; Integ += ValS*std::exp(-(ValS*ValS+ValB2)/dHS)*QI0(FunS)*Thick[j]; } G4double InExp = -hTotG2*Integ*stepB/dHS; G4double expB = std::exp(InExp); G4double HRIE = HadrReIm*InExp; ReIntegrand[i] = (1.-expB*std::cos(HRIE)); ImIntegrand[i] = expB*std::sin(HRIE); } InCoh = 0.; // incohirent (quasi-elastic) ValB = -stepB; for(G4int k=0; k