Import Geant4 4.1.0 source tree
This commit is contained in:
@@ -21,12 +21,13 @@
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
// $Id: G4ElectroNuclearCrossSection.hh,v 1.6 2001/11/30 14:58:04 stesting Exp $
|
||||
// GEANT4 tag $Name: geant4-04-00 $
|
||||
// $Id: G4ElectroNuclearCrossSection.hh,v 1.7 2002/05/22 11:48:44 mkossov Exp $
|
||||
// GEANT4 tag $Name: geant4-04-01 $
|
||||
//
|
||||
//
|
||||
// GEANT4 physics class: G4ElectroNuclearCrossSection -- header file
|
||||
// M.V. Kossov, ITEP(Moscow), 24-OCT-01
|
||||
// The last update: M.V. Kossov, CERN/ITEP (Moscow) 17-May-02
|
||||
//
|
||||
|
||||
#ifndef G4ElectroNuclearCrossSection_h
|
||||
@@ -65,32 +66,42 @@ public:
|
||||
}
|
||||
|
||||
G4double GetCrossSection(const G4DynamicParticle* aParticle, const G4Element* anElement,
|
||||
G4double temperature=0.);
|
||||
G4double T=0.);
|
||||
|
||||
G4double GetEffectivePhotonEnergy();
|
||||
G4double GetEquivalentPhotonEnergy();
|
||||
|
||||
G4double GetVirtualFactor(G4double nu, G4double Q2);
|
||||
|
||||
G4double GetEquivalentPhotonQ2(G4double nu);
|
||||
|
||||
void BuildPhysicsTable(const G4ParticleDefinition&) {}
|
||||
|
||||
void DumpPhysicsTable(const G4ParticleDefinition&) {}
|
||||
|
||||
private:
|
||||
G4int GetFunctions(G4double a, G4double* y, G4double* z);
|
||||
G4double LinearFit(G4double X, G4int N, const G4double* XN, const G4double* YN);
|
||||
G4int GetFunctions(G4double a, G4double* x, G4double* y, G4double* z);
|
||||
//G4double LinearFit(G4double X, G4int N, const G4double* XN, const G4double* YN);
|
||||
G4double ThresholdEnergy(G4int Z, G4int N);
|
||||
G4double HighEnergyPhi(G4double lE);
|
||||
G4double HighEnergyFun(G4double lE);
|
||||
G4double HighEnergyJ1(G4double lE);
|
||||
G4double HighEnergyJ2(G4double lE);
|
||||
G4double HighEnergyJ3(G4double lE);
|
||||
G4double SolveTheEquation(G4double f);
|
||||
G4double Fun(G4double x);
|
||||
G4double DFun(G4double x);
|
||||
|
||||
// Body
|
||||
private:
|
||||
static G4int lastN; // The last N of calculated nucleus
|
||||
static G4int lastZ; // The last Z of calculated nucleus
|
||||
static G4int lastF; // Last used in the cross section TheFirstBin
|
||||
static G4double* lastPhi; // Pointer to the last array of the Phi function
|
||||
static G4double* lastFun; // Pointer to the last array of the Fun function
|
||||
static G4double* lastJ1; // Pointer to the last array of the J1 function
|
||||
static G4double* lastJ2; // Pointer to the last array of the J2 function
|
||||
static G4double* lastJ3; // Pointer to the last array of the J3 function
|
||||
static G4int lastL; // Last used in the cross section TheLastBin
|
||||
static G4double lastLE; // Last used in the cross section TheLogE
|
||||
static G4double lastE; // Last used in the cross section Energy
|
||||
static G4double lastTH; // Last value of the Energy Threshold
|
||||
static G4double lastSig; // Last value of the Cross Section
|
||||
static G4double lastG; // Last value of gamma=lnE-ln(me)
|
||||
static G4double lastH; // Last value of the High energy A-dependence
|
||||
};
|
||||
|
||||
@@ -128,59 +139,68 @@ inline G4double G4ElectroNuclearCrossSection::ThresholdEnergy(G4int Z, G4int N)
|
||||
return dN;
|
||||
}
|
||||
|
||||
inline G4double G4ElectroNuclearCrossSection::DFun(G4double x)
|
||||
inline G4double G4ElectroNuclearCrossSection::DFun(G4double x) // Original PhoNuc cross section
|
||||
{
|
||||
static const G4double f21=.75;
|
||||
static const G4double f22=.78;
|
||||
static const G4double f23=.9;
|
||||
G4double f2=1.;
|
||||
if (lastH<.005) f2=f21;
|
||||
else if(lastH<0.01) f2=f22;
|
||||
else if(lastH<0.07) f2=f23;
|
||||
return (lastLE-x)*(0.0116*exp(0.16*x)+f2*exp(-0.26*x));
|
||||
static const G4double shd=1.0734; // HE PomShadowing(D)
|
||||
static const G4double poc=0.0375; // HE Pomeron coefficient
|
||||
static const G4double pos=16.5; // HE Pomeron shift
|
||||
static const G4double reg=.11; // HE Reggeon slope
|
||||
static const G4double mel=0.5109989; // Mass of electron in MeV
|
||||
static const G4double lmel=log(mel); // Log of electron mass
|
||||
G4double lE=lastG+lmel;
|
||||
return poc*(lE-pos)+shd*exp(-reg*lE);
|
||||
}
|
||||
|
||||
inline G4double G4ElectroNuclearCrossSection::Fun(G4double x)
|
||||
{return (lastLE*HighEnergyPhi(x)-HighEnergyFun(x));}
|
||||
|
||||
inline G4double G4ElectroNuclearCrossSection::HighEnergyPhi(G4double lEn)
|
||||
inline G4double G4ElectroNuclearCrossSection::Fun(G4double x) // Integrated PhoNuc cross section
|
||||
{
|
||||
static const G4double le=log(2000.);
|
||||
static const G4double c1=0.16;
|
||||
static const G4double f1=.0116/c1;
|
||||
static const G4double e1=exp(c1*le);
|
||||
static const G4double c2=-0.26;
|
||||
static const G4double f21=.75/c2;
|
||||
static const G4double f22=.78/c2;
|
||||
static const G4double f23=.9/c2;
|
||||
static const G4double f24=1./c2;
|
||||
static const G4double e2=exp(c2*le);
|
||||
G4double f2=f24;
|
||||
if (lastH<.005) f2=f21;
|
||||
else if(lastH<0.01) f2=f22;
|
||||
else if(lastH<0.07) f2=f23;
|
||||
return f1*(exp(c1*lEn)-e1)+f2*(exp(c2*lEn)-e2);
|
||||
static const G4double mel=0.5109989; // Mass of electron in MeV
|
||||
static const G4double lmel=log(mel); // Log of electron mass
|
||||
G4double dlg1=lastG+lastG-1.;
|
||||
G4double lgoe=lastG/lastE;
|
||||
G4double lE=lastG+lmel;
|
||||
G4double HE2=HighEnergyJ2(lE);
|
||||
return dlg1*HighEnergyJ1(lE)-lgoe*(HE2+HE2-HighEnergyJ3(lE)/lastE);
|
||||
}
|
||||
|
||||
inline G4double G4ElectroNuclearCrossSection::HighEnergyFun(G4double lEn)
|
||||
inline G4double G4ElectroNuclearCrossSection::HighEnergyJ1(G4double lEn)
|
||||
{
|
||||
static const G4double le=log(2000.);
|
||||
static const G4double c1=0.16;
|
||||
static const G4double f1=.0116/c1/c1;
|
||||
static const G4double e1=(c1*le-1.)*exp(c1*le);
|
||||
static const G4double c2=-0.26;
|
||||
static const G4double f21=.75/c2/c2;
|
||||
static const G4double f22=.78/c2/c2;
|
||||
static const G4double f23=.9/c2/c2;
|
||||
static const G4double f24=1./c2/c2;
|
||||
static const G4double e2=(c2*le-1.)*exp(c2*le);
|
||||
G4double f2=f24;
|
||||
if (lastH<.005) f2=f21;
|
||||
else if(lastH<0.01) f2=f22;
|
||||
else if(lastH<0.07) f2=f23;
|
||||
G4double h1=c1*lEn;
|
||||
G4double h2=c2*lEn;
|
||||
return f1*((h1-1.)*exp(h1)-e1)+f2*((h2-1.)*exp(h2)-e2);
|
||||
static const G4double le=log(50000.); // log(E0)
|
||||
static const G4double le2=le*le; // log(E0)^2
|
||||
static const G4double a=.0375; // a
|
||||
static const G4double ha=a*.5; // a/2
|
||||
static const G4double ab=a*16.5; // a*b
|
||||
static const G4double d=0.11; // d
|
||||
static const G4double cd=1.0734/d; // c/d
|
||||
static const G4double ele=exp(-d*le); // E0^(-d)
|
||||
return ha*(lEn*lEn-le2)-ab*(lEn-le)-cd*(exp(-d*lEn)-ele);
|
||||
}
|
||||
|
||||
inline G4double G4ElectroNuclearCrossSection::HighEnergyJ2(G4double lEn)
|
||||
{
|
||||
static const G4double e=50000.; // E0
|
||||
static const G4double le=log(e); // log(E0)
|
||||
static const G4double le1=(le-1.)*e; // (log(E0)-1)*E0
|
||||
static const G4double a=.0375; // a
|
||||
static const G4double ab=a*16.5; // a*b
|
||||
static const G4double d=1.-0.11; // 1-d
|
||||
static const G4double cd=1.0734/d; // c/(1-d)
|
||||
static const G4double ele=exp(d*le); // E0^(1-d)
|
||||
return a*((lEn-1.)*lastE-le1)-ab*(lastE-e)+cd*(exp(d*lEn)-ele);
|
||||
}
|
||||
|
||||
inline G4double G4ElectroNuclearCrossSection::HighEnergyJ3(G4double lEn)
|
||||
{
|
||||
static const G4double e=50000.; // E0
|
||||
static const G4double le=log(e); // log(E0)
|
||||
static const G4double e2=e*e; // E0^2
|
||||
static const G4double leh=(le-.5)*e2; // (log(E0)-.5)*E0^2
|
||||
static const G4double ha=.0375*.5; // a/2
|
||||
static const G4double hab=ha*16.5; // a*b/2
|
||||
static const G4double d=2.-.11; // 2-d
|
||||
static const G4double cd=1.0734/d; // c/(2-d)
|
||||
static const G4double ele=exp(d*le); // E0^(2-d)
|
||||
G4double lastE2=lastE*lastE;
|
||||
return ha*((lEn-.5)*lastE2-leh)-hab*(lastE2-e2)+cd*(exp(d*lEn)-ele);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
//
|
||||
//
|
||||
// $Id: G4HadronCrossSections.hh,v 1.7 2001/10/04 20:00:18 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-04-00 $
|
||||
// GEANT4 tag $Name: geant4-04-01 $
|
||||
//
|
||||
//
|
||||
// GEANT4 Hadron physics class -- header file
|
||||
|
||||
@@ -21,12 +21,13 @@
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
// $Id: G4PhotoNuclearCrossSection.hh,v 1.5 2001/11/26 22:04:34 stesting Exp $
|
||||
// GEANT4 tag $Name: geant4-04-00 $
|
||||
// $Id: G4PhotoNuclearCrossSection.hh,v 1.6 2002/05/22 11:48:45 mkossov Exp $
|
||||
// GEANT4 tag $Name: geant4-04-01 $
|
||||
//
|
||||
//
|
||||
// GEANT4 physics class: G4PhotoNuclearCrossSection -- header file
|
||||
// M.V. Kossov, ITEP(Moscow), 24-OCT-01
|
||||
// Created: M.V. Kossov, CERN/ITEP(Moscow), 10-OCT-01
|
||||
// The last update: M.V. Kossov, CERN/ITEP (Moscow) 17-May-02
|
||||
//
|
||||
|
||||
#ifndef G4PhotoNuclearCrossSection_h
|
||||
@@ -63,7 +64,7 @@ public:
|
||||
}
|
||||
|
||||
G4double GetCrossSection(const G4DynamicParticle* aParticle, const G4Element* anElement,
|
||||
G4double temperature=0.);
|
||||
G4double T=0.);
|
||||
//{
|
||||
// return theHadronCrossSections->GetInelasticCrossSection(aParticle,
|
||||
// anElement);
|
||||
@@ -74,190 +75,25 @@ public:
|
||||
void DumpPhysicsTable(const G4ParticleDefinition&) {}
|
||||
|
||||
private:
|
||||
G4double GetGDRc1(G4int Z, G4int N);
|
||||
G4double GetGDRp1(G4int Z, G4int N);
|
||||
G4double GetGDRt1(G4int Z, G4int N);
|
||||
G4double GetGDRs1(G4int Z, G4int N);
|
||||
G4double GetGDRc2(G4int Z, G4int N);
|
||||
G4double GetGDRp2(G4int Z, G4int N);
|
||||
G4double GetGDRt2(G4int Z, G4int N);
|
||||
G4double GetGDRs2(G4int Z, G4int N);
|
||||
G4double GetQDAmp(G4int Z, G4int N);
|
||||
G4double GetDelAm(G4int Z, G4int N);
|
||||
G4double GetDelWd(G4int Z, G4int N);
|
||||
G4double GetDelPs(G4int Z, G4int N);
|
||||
G4double GetDelTh(G4int Z, G4int N);
|
||||
G4double GetDelSl(G4int Z, G4int N);
|
||||
G4double GetRopAm(G4int Z, G4int N);
|
||||
G4double GetRopWd(G4int Z, G4int N);
|
||||
G4double GetRopPs(G4int Z, G4int N);
|
||||
G4double LinearFit(G4double X, G4int N, const G4double* XN, const G4double* YN);
|
||||
G4int GetFunctions(G4double a, G4double* y, G4double* z);
|
||||
//G4double LinearFit(G4double X, G4int N, const G4double* XN, const G4double* YN);
|
||||
G4double EquLinearFit(G4double X, G4int N,const G4double X0,const G4double XD, const G4double* Y);
|
||||
G4double ThresholdEnergy(G4int Z, G4int N);
|
||||
|
||||
// Body
|
||||
//private:
|
||||
private:
|
||||
static G4int lastN; // The last N of calculated nucleus
|
||||
static G4int lastZ; // The last Z of calculated nucleus
|
||||
static G4double lastSig; // Last value of the Cross Section
|
||||
static G4double* lastGDR; // Pointer to the last array of GDR cross sections
|
||||
static G4double* lastHEN; // Pointer to the last array of HEn cross sections
|
||||
static G4double lastE; // Last used in the cross section Energy
|
||||
static G4double lastTH; // Last value of the Energy Threshold (A-dependent)
|
||||
static G4double lastSP; // Last value of the ShadowingPomeron (A-dependent)
|
||||
|
||||
//G4HadronCrossSections* theHadronCrossSections;
|
||||
};
|
||||
|
||||
// Calculate the logAmplitude of the 1-st GDR maximum
|
||||
inline G4double G4PhotoNuclearCrossSection::GetGDRc1(G4int Z, G4int N)
|
||||
{
|
||||
static const G4int nN=13;
|
||||
static G4double X[nN]={0.693,1.386,1.792,1.946,2.197,2.485,2.773,3.296,3.689,4.152,4.777,5.334,
|
||||
5.472};
|
||||
static G4double Y[nN]={4.2,13.9,13.9,13.6,20.5,28.2,28.7,28.5,29.,28.4,28.15,27.8,25.9};
|
||||
|
||||
return LinearFit(log(G4double(Z+N)), nN, X, Y);
|
||||
}
|
||||
|
||||
// Calculate the A-power of the 1-st GDR maximum
|
||||
inline G4double G4PhotoNuclearCrossSection::GetGDRp1(G4int Z, G4int N)
|
||||
{
|
||||
G4double p=8.;
|
||||
G4int A=Z+N;
|
||||
if(A<12) p=6.;
|
||||
if(A< 8) p=4.;
|
||||
if(A< 4) p=2.;
|
||||
return p;
|
||||
}
|
||||
|
||||
// Calculate the Threshold of the 1-st GDR maximum
|
||||
inline G4double G4PhotoNuclearCrossSection::GetGDRt1(G4int Z, G4int N)
|
||||
{
|
||||
static const G4int nN=13;
|
||||
static G4double X[nN]={0.693,1.386,1.792,1.946,2.197,2.485,2.773,3.296,3.689,4.152,4.777,5.334,
|
||||
5.472};
|
||||
static G4double Y[nN]={1.4,3.13,3.08,2.9,3.09,3.09,3.09,3.02,2.98,2.9,2.745,2.585,2.42};
|
||||
|
||||
return LinearFit(log(G4double(Z+N)), nN, X, Y);
|
||||
}
|
||||
|
||||
// Calculate the Slope of the 1-st GDR maximum
|
||||
inline G4double G4PhotoNuclearCrossSection::GetGDRs1(G4int Z, G4int N)
|
||||
{
|
||||
static const G4int nN=13;
|
||||
static G4double X[nN]={0.693,1.386,1.792,1.946,2.197,2.485,2.773,3.296,3.689,4.152,4.777,5.334,
|
||||
5.472};
|
||||
static G4double Y[nN]={.12,.12,.12,.12,.06,.03,.03,.06,.05,.065,.06,.059,.061};
|
||||
|
||||
return LinearFit(log(G4double(Z+N)), nN, X, Y);
|
||||
}
|
||||
|
||||
// Calculate the logAmplitude of the 2-nd GDR maximum
|
||||
inline G4double G4PhotoNuclearCrossSection::GetGDRc2(G4int Z, G4int N)
|
||||
{
|
||||
static const G4int nN=13;
|
||||
static G4double X[nN]={0.693,1.386,1.792,1.946,2.197,2.485,2.773,3.296,3.689,4.152,4.777,5.334,
|
||||
5.472};
|
||||
static G4double Y[nN]={1.85,7.5,6.3,8.2,12.35,15.8,16.1,16.2,16.8,17.1,16.1,15.5,16.6};
|
||||
|
||||
return LinearFit(log(G4double(Z+N)), nN, X, Y);
|
||||
}
|
||||
|
||||
// Calculate the A-power of the 2-nd GDR maximum
|
||||
inline G4double G4PhotoNuclearCrossSection::GetGDRp2(G4int Z, G4int N)
|
||||
{
|
||||
G4double p=4.;
|
||||
G4int A=Z+N;
|
||||
if(A<12) p=3.;
|
||||
if(A< 8) p=2.;
|
||||
if(A< 4) p=1.;
|
||||
return p;
|
||||
}
|
||||
|
||||
// Calculate the Threshold of the 2-nd GDR maximum
|
||||
inline G4double G4PhotoNuclearCrossSection::GetGDRt2(G4int Z, G4int N)
|
||||
{
|
||||
static const G4int nN=13;
|
||||
static G4double X[nN]={0.693,1.386,1.792,1.946,2.197,2.485,2.773,3.296,3.689,4.152,4.777,5.334,
|
||||
5.472};
|
||||
static G4double Y[nN]={1.4,3.22,3.11,3.39,3.48,3.34,3.46,3.35,3.4,3.22,3.09,3.05,2.6};
|
||||
|
||||
return LinearFit(log(G4double(Z+N)), nN, X, Y);
|
||||
}
|
||||
|
||||
// Calculate the Slope of the 2-nd GDR maximum
|
||||
inline G4double G4PhotoNuclearCrossSection::GetGDRs2(G4int Z, G4int N)
|
||||
{
|
||||
static const G4int nN=13;
|
||||
static G4double X[nN]={0.693,1.386,1.792,1.946,2.197,2.485,2.773,3.296,3.689,4.152,4.777,5.334,
|
||||
5.472};
|
||||
static G4double Y[nN]={.12,.094,.09,.088,.14,.082,.079,.074,.071,.065,.061,.058,.05};
|
||||
|
||||
return LinearFit(log(G4double(Z+N)), nN, X, Y);
|
||||
}
|
||||
|
||||
// Calculate the Amplitude of the QuasiDeuteron region [exp/(1+exp)]
|
||||
inline G4double G4PhotoNuclearCrossSection::GetQDAmp(G4int Z, G4int N)
|
||||
{
|
||||
G4double A=Z+N;
|
||||
G4double lnA=log(A);
|
||||
return exp(-1.7+lnA*0.84)/(1.+exp(7*(2.38-lnA)));
|
||||
}
|
||||
|
||||
// Calculate the Amplitude of the Delta Resonance [.41*(Z+N)]
|
||||
inline G4double G4PhotoNuclearCrossSection::GetDelAm(G4int Z, G4int N)
|
||||
{
|
||||
G4double A=Z+N;
|
||||
return .41*A;
|
||||
}
|
||||
|
||||
// Calculate the Width of the Delta Resonance [11.9-ln(A)*1.24]
|
||||
inline G4double G4PhotoNuclearCrossSection::GetDelWd(G4int Z, G4int N)
|
||||
{
|
||||
G4double A=Z+N;
|
||||
G4double lnA=log(A);
|
||||
return 11.9-lnA*1.24;
|
||||
}
|
||||
|
||||
// Calculate the Position of the Delta Resonance [5.84-.09/(1+.003*A*A)]
|
||||
inline G4double G4PhotoNuclearCrossSection::GetDelPs(G4int Z, G4int N)
|
||||
{
|
||||
G4double A=Z+N;
|
||||
return 5.84-.09/(1+.003*A*A);
|
||||
}
|
||||
|
||||
// Calculate the Threshold of the Delta Resonance [5.13-.00075*A]
|
||||
inline G4double G4PhotoNuclearCrossSection::GetDelTh(G4int Z, G4int N)
|
||||
{
|
||||
G4double A=Z+N;
|
||||
return 5.13-0.00075*A;
|
||||
}
|
||||
|
||||
// Calculate the Threshold of the Delta Resonance [.04->.09]
|
||||
inline G4double G4PhotoNuclearCrossSection::GetDelSl(G4int Z, G4int N)
|
||||
{
|
||||
G4double A=Z+N;
|
||||
if(A<7) return .04;
|
||||
return .09;
|
||||
}
|
||||
|
||||
// Calculate the Amplitude of the Roper Resonance [-2.+ln(A)*0.84]
|
||||
inline G4double G4PhotoNuclearCrossSection::GetRopAm(G4int Z, G4int N)
|
||||
{
|
||||
G4double A=Z+N;
|
||||
G4double lnA=log(A);
|
||||
return exp(-2.+lnA*0.84);
|
||||
}
|
||||
|
||||
// Calculate the Width of the Roper Resonance [.1+1.65*ln(A)]
|
||||
inline G4double G4PhotoNuclearCrossSection::GetRopWd(G4int Z, G4int N)
|
||||
{
|
||||
G4double A=Z+N;
|
||||
G4double lnA=log(A);
|
||||
return .1+1.65*lnA;
|
||||
}
|
||||
|
||||
// Calculate the Position of the Roper Resonance [6.46+.061*ln(A)]
|
||||
inline G4double G4PhotoNuclearCrossSection::GetRopPs(G4int Z, G4int N)
|
||||
{
|
||||
G4double A=Z+N;
|
||||
G4double lnA=log(A);
|
||||
return 6.46+.061*lnA;
|
||||
}
|
||||
|
||||
|
||||
// Gives the threshold energy for different nuclei (min of p- and n-threshold)
|
||||
inline G4double G4PhotoNuclearCrossSection::ThresholdEnergy(G4int Z, G4int N)
|
||||
{
|
||||
@@ -276,16 +112,26 @@ inline G4double G4PhotoNuclearCrossSection::ThresholdEnergy(G4int Z, G4int N)
|
||||
//G4double mT= G4QPDGCode(111).GetNuclMass(Z,N,0);
|
||||
G4double mT= 0.;
|
||||
if(G4NucleiPropertiesTable::IsInTable(Z,A)) mT=G4NucleiProperties::GetNuclearMass(A,Z);
|
||||
else return 0.; // If it is not in the Table of Stable Nuclei, then the Threshold=0
|
||||
else
|
||||
{
|
||||
G4cerr<<"G4PhotoNucCrossSect.hh::ThreshEn:Z="<<Z<<",A="<<A<<" element isn't in G4NucPr"<<G4endl;
|
||||
return 0.; // If it is not in the Table of Stable Nuclei, then the Threshold=inf
|
||||
}
|
||||
// ---------
|
||||
G4double mP= infEn;
|
||||
//if(Z) mP= G4QPDGCode(111).GetNuclMass(Z-1,N,0);
|
||||
if(Z&&G4NucleiPropertiesTable::IsInTable(Z-1,A-1)) mP=G4NucleiProperties::GetNuclearMass(A-1,Z-1);
|
||||
else return infEn;
|
||||
else
|
||||
{
|
||||
G4cerr<<"G4PhotoNucCrossSect.hh::ThrEn:Z="<<Z-1<<",A="<<A-1<<" element isn't in G4NucP"<<G4endl;
|
||||
}
|
||||
G4double mN= infEn;
|
||||
//if(N) mN= G4QPDGCode(111).GetNuclMass(Z,N-1,0);
|
||||
if(N&&G4NucleiPropertiesTable::IsInTable(Z,A-1)) mN=G4NucleiProperties::GetNuclearMass(A-1,Z);
|
||||
else return infEn;
|
||||
else
|
||||
{
|
||||
G4cerr<<"G4PhotoNucCrossSect.hh::ThreshEn:Z="<<Z<<",A="<<A-1<<" element isn't in G4NuP"<<G4endl;
|
||||
}
|
||||
G4double dP= mP+mProt-mT;
|
||||
G4double dN= mN+mNeut-mT;
|
||||
if(dP<dN)dN=dP;
|
||||
|
||||
@@ -0,0 +1,202 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * DISCLAIMER *
|
||||
// * *
|
||||
// * The following disclaimer summarizes all the specific disclaimers *
|
||||
// * of contributors to this software. The specific disclaimers,which *
|
||||
// * govern, are listed with their locations in: *
|
||||
// * http://cern.ch/geant4/license *
|
||||
// * *
|
||||
// * 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. *
|
||||
// * *
|
||||
// * This code implementation is the intellectual property of the *
|
||||
// * GEANT4 collaboration. *
|
||||
// * By copying, distributing or modifying the Program (or any work *
|
||||
// * based on the Program) you indicate your acceptance of this *
|
||||
// * statement, and all its terms. *
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
#ifndef G4ProjectileFragmentCrossSection_h
|
||||
#define G4ProjectileFragmentCrossSection_h 1
|
||||
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
|
||||
// Implements Physical Review C61, 034607 (2000)
|
||||
// Rewrite starting from EPAX Version 2
|
||||
|
||||
class G4ProjectileFragmentCrossSection
|
||||
{
|
||||
public:
|
||||
G4ProjectileFragmentCrossSection()
|
||||
{
|
||||
p_S[1] = -2.38; // scale factor for xsect in barn
|
||||
p_S[2] = 0.27;
|
||||
|
||||
p_P[1] = -2.5840E+00; // slope of mass yield curve
|
||||
p_P[2] = -7.5700E-03;
|
||||
|
||||
p_Delta[1] = -1.0870E+00; // centroid rel. to beta-stability
|
||||
p_Delta[2] = +3.0470E-02;
|
||||
p_Delta[3] = +2.1353E-04;
|
||||
p_Delta[4] = +7.1350E+01;
|
||||
|
||||
p_R[1] = +0.885E+00; // width parameter R
|
||||
p_R[2] = -9.8160E-03;
|
||||
|
||||
p_Un[1] = 1.65; // slope par. n-rich ride of Z distr.
|
||||
|
||||
p_Up[1] = 1.7880; // slope par. p-rich ride of Z distr.
|
||||
p_Up[2] = +4.7210E-03;
|
||||
p_Up[3] = -1.3030E-05;
|
||||
|
||||
p_mn[1] = 0.400; // memory effect n-rich projectiles
|
||||
p_mn[2] = 0.600;
|
||||
|
||||
p_mp[1] = -10.25; // memory effect p-rich projectiles
|
||||
p_mp[2] = +10.1;
|
||||
|
||||
corr_d[1] = -25.0; // correction close to proj.: centroid dzp
|
||||
corr_d[2] = 0.800;
|
||||
corr_r[1] = +20.0; // correction close to proj.: width R
|
||||
corr_r[2] = 0.820;
|
||||
corr_y[1] = 200.0; // correction close to proj.: Yield_a
|
||||
corr_y[2] = 0.90;
|
||||
}
|
||||
|
||||
inline G4double doit(G4double Ap, G4double Zp, G4double At, G4double Zt, G4double A, G4double Z)
|
||||
{
|
||||
// calculate mass yield
|
||||
G4double Ap13 = pow(Ap, 1./3.);
|
||||
G4double At13 = pow(At, 1./3.);
|
||||
G4double S = p_S[2] * (At13 + Ap13 + p_S[1]);
|
||||
// cout << "debug0 "<<S<<" "<<At13<<" "<<Ap13<<" "<<p_S[1]<<" "<<p_S[2]<<endl;
|
||||
G4double p = exp(p_P[2]*Ap + p_P[1]);
|
||||
G4double yield_a = p * S * exp(-p * (Ap - A));
|
||||
cout << "debug1 "<<yield_a<<endl;
|
||||
// modification close to projectile
|
||||
G4double f_mod_y=1.0;
|
||||
if (A/Ap > corr_y[2])
|
||||
{
|
||||
f_mod_y=corr_y[1]*pow(A/Ap-corr_y[2], 2) + 1.0;
|
||||
}
|
||||
yield_a= yield_a * f_mod_y;
|
||||
cout << "debug1 "<<yield_a<<endl;
|
||||
|
||||
// calculate maximum of charge dispersion zprob
|
||||
G4double zbeta = A/(1.98+0.0155*pow(A, (2./3.)));
|
||||
G4double zbeta_p = Ap/(1.98+0.0155*pow(Ap, (2./3.)));
|
||||
G4double delta;
|
||||
if(A > p_Delta[4])
|
||||
{
|
||||
delta = p_Delta[1] + p_Delta[2]*A;
|
||||
}
|
||||
else
|
||||
{
|
||||
delta = p_Delta[3]*A*A;
|
||||
}
|
||||
|
||||
// modification close to projectile
|
||||
G4double f_mod=1.0;
|
||||
if(A/Ap > corr_d[2])
|
||||
{
|
||||
f_mod = corr_d[1]*pow(A/Ap-corr_d[2], 2) + 1.0;
|
||||
}
|
||||
delta = delta*f_mod;
|
||||
G4double zprob = zbeta+delta;
|
||||
|
||||
// correction for proton- and neutron-rich projectiles
|
||||
G4double dq;
|
||||
if((Zp-zbeta_p)>0)
|
||||
{
|
||||
dq = exp(p_mp[1] + G4double(A)/G4double(Ap)*p_mp[2]);
|
||||
cout << "dq "<<A<<" "<<Ap<<" "<<p_mp[1]
|
||||
<<" "<<p_mp[2]<<" "<<dq<<" "<<p_mp[1] + A/Ap*p_mp[2]<<endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
dq = p_mn[1]*pow(A/Ap, 2.0) + p_mn[2]*pow(A/Ap, 4.0);
|
||||
}
|
||||
zprob = zprob + dq * (Zp-zbeta_p);
|
||||
|
||||
// small corr. since Xe-129 and Pb-208 are not on Z_beta line
|
||||
zprob = zprob + 0.0020*A;
|
||||
cout <<"zprob "<<A<<" "<<dq<<" "<<Zp<<" "<<zbeta_p
|
||||
<<" "<<zbeta<<" "<<delta<<endl;
|
||||
|
||||
// calculate width parameter R
|
||||
G4double r = exp(p_R[1] + p_R[2]*A);
|
||||
|
||||
// modification close to projectile
|
||||
f_mod=1.0;
|
||||
if (A/Ap > corr_r[2])
|
||||
{
|
||||
f_mod = corr_r[1]*Ap*pow(A/Ap-corr_r[2], 4.0)+1.0;
|
||||
}
|
||||
r = r*f_mod;
|
||||
|
||||
// change width according to dev. from beta-stability
|
||||
if ((Zp-zbeta_p) < 0.0)
|
||||
{
|
||||
r=r*(1.0-0.0833*abs(Zp-zbeta_p));
|
||||
}
|
||||
|
||||
// calculate slope parameters u_n, u_p
|
||||
G4double u_n = p_Un[1];
|
||||
G4double u_p = p_Up[1] + p_Up[2]*A + p_Up[3]*A*A;
|
||||
|
||||
// calculate charge dispersion
|
||||
G4double expo, fract;
|
||||
if((zprob-Z) > 0)
|
||||
{
|
||||
// neutron-rich
|
||||
expo = -r*pow(abs(zprob-Z), u_n);
|
||||
fract = exp(expo)*sqrt(r/3.14159);
|
||||
}
|
||||
else
|
||||
{
|
||||
// proton-rich
|
||||
expo = -r*pow(abs(zprob-Z), u_p);
|
||||
fract = exp(expo)*sqrt(r/3.14159);
|
||||
cout << "1 "<<expo<<" "<<r<<" "<<zprob<<" "<<Z<<" "<<u_p<<endl;
|
||||
// go to exponential slope
|
||||
G4double dfdz = 1.2 + 0.647*pow(A/2.,0.3);
|
||||
G4double z_exp = zprob + dfdz * log(10.) / (2.*r);
|
||||
if( Z>z_exp )
|
||||
{
|
||||
expo = -r*pow(abs(zprob-z_exp), u_p);
|
||||
fract = exp(expo)*sqrt(r/3.14159)
|
||||
/ pow(pow(10, dfdz), Z-z_exp);
|
||||
}
|
||||
}
|
||||
|
||||
cout << "debug "<<fract<<" "<<yield_a<<endl;
|
||||
G4double epaxv2=fract*yield_a;
|
||||
return epaxv2;
|
||||
}
|
||||
|
||||
void testMe()
|
||||
{
|
||||
G4ProjectileFragmentCrossSection i;
|
||||
cout << i.doit(58, 28, 9, 4, 49, 28) << endl;
|
||||
// Sigma = 9.800163E-13 b
|
||||
}
|
||||
private:
|
||||
G4double p_S[3];
|
||||
G4double p_P[3];
|
||||
G4double p_Delta[5];
|
||||
G4double p_R[3];
|
||||
G4double p_Un[2];
|
||||
G4double p_Up[4];
|
||||
G4double p_mn[3];
|
||||
G4double p_mp[3];
|
||||
G4double corr_d[3];
|
||||
G4double corr_r[3];
|
||||
G4double corr_y[3];
|
||||
};
|
||||
#endif
|
||||
Reference in New Issue
Block a user