54 using namespace genie;
66 int Z = (
int) target.
Z();
67 int A = (
int) target.
A();
77 if (nucA<=0 || nucZ<=0)
return 0;
94 if (nucZ%2==1 && nucA%2==1) delta = 11.2;
95 if (nucZ%2==0 && nucA%2==0) delta = -11.2;
97 double N = (double) (nucA-nucZ);
98 double Z = (double) nucZ;
99 double A = (double) nucA;
102 - b * TMath::Power(A,0.667)
103 - s * TMath::Power(N-Z,2.0)/A
104 - d * TMath::Power(Z,2.0)/TMath::Power(A,0.333)
105 - delta / TMath::Sqrt(A);
136 double Rn = Ro*TMath::Power(1.*A, 0.3333333);
155 if (target.
A() == 2) {
164 int target_pdgc = target.
Pdg();
165 int struck_nucleon_pdgc = target.
HitNucPdg();
166 int final_nucleon_pdgc = struck_nucleon_pdgc;
176 RgKey nuclkey =
"NuclearModel";
194 double numNuci = (is_p_i) ? (
double)tgt->
Z():(double)tgt->
N();
195 kFi = TMath::Power(3*
kPi2*numNuci*
199 double numNucf = (is_p_f) ? (
double)tgt->
Z():(double)tgt->
N();
200 kFf = TMath::Power(3*
kPi2*numNucf*
209 kFf = (struck_nucleon_pdgc==final_nucleon_pdgc) ? kFi :
216 double q2 = kine.
q2();
223 double q2,
double Mn,
double kFi,
double kFf,
double pmax)
249 double magq2 = q2 * (0.25*q2/Mn2 - 1.);
250 double q = TMath::Sqrt(TMath::Max(0.,magq2));
252 double kfa = kFi * 2./
kPi;
253 double kfa2 = TMath::Power(kfa,2);
254 double kFi4 = TMath::Power(kFi,4);
255 double rkf = 1./(1. - kFi/4.);
256 double alpha = 1. - 6.*kfa2;
257 double beta = 2. * rkf * kfa2 * kFi4;
259 double fm_area =
FmArea(alpha,beta,kFi,pmax);
265 double fmi1 =
FmI1(alpha,beta,p1,p2, kFi,kFf,q);
266 double fmi2 =
FmI2(alpha,beta,p2,pmax,kFi,kFf,q);
268 R = 2*
kPi * (fmi1 + 2*fmi2) / fm_area;
270 }
else if (q > kFf && q <= (pmax-kFf)) {
274 double fmi1 =
FmI1(alpha,beta, p1, p2, kFi, kFf,q);
275 double fmi2a =
FmI2(alpha,beta, 0., p1, kFi, kFf,q);
276 double fmi2b =
FmI2(alpha,beta, p2, pmax, kFi, kFf,q);
278 R = 2*
kPi * (fmi1 + 2*(fmi2a+fmi2b)) / fm_area;
280 }
else if (q > (pmax-kFf) && q <= (pmax+kFf)) {
283 double fmi2 =
FmI2(alpha,beta, 0.,p1, kFi,kFf,q);
284 double fmi1 =
FmI1(alpha,beta, p1,pmax,kFi,kFf,q);
286 R = 2*
kPi * (2.*fmi2 + fmi1) / fm_area;
288 }
else if (q > (pmax+kFf)) {
292 LOG(
"Nuclear",
pFATAL) <<
"Illegal input q = " << q;
299 double a,
double b,
double kFi,
double kFf,
double q)
305 double q2 = TMath::Power(q, 2);
306 double a2 = TMath::Power(a, 2);
307 double b2 = TMath::Power(b, 2);
308 double kFi2 = TMath::Power(kFi,2);
309 double kFf2 = TMath::Power(kFf,2);
312 double lg = TMath::Log(b/a);
314 f = -beta * (kFf2-q2)/(4.*q) * (1./a2 - 1./b2) + beta/(2.*q) * lg;
316 }
else if (kFi > b) {
317 double a4 = TMath::Power(a2,2);
318 double b4 = TMath::Power(b2,2);
320 f = - (kFf2-q2) * alpha/(4.*q) * (b2-
a2) + alpha/(8.*q) * (b4-
a4);
323 double a4 = TMath::Power(a2,2);
324 double kFi4 = TMath::Power(kFi2,2);
325 double lg = TMath::Log(b/kFi);
327 f = - alpha*(kFf2-q2)/(4.*q)*(kFi2-
a2) + alpha/(8.*q)*(kFi4 -
a4)
328 - beta*(kFf2-q2)/(4.*q)*(1./kFi2 - 1./b2) + beta/(2.*q)*lg;
331 double integral2 =
FmI2(alpha,beta,a,b,kFi,kFf,q);
332 double integral1 = integral2 +
f;
338 double a,
double b,
double kFi,
double ,
double )
342 double integral2 = 0;
345 integral2 = beta * (1./a - 1./
b);
348 double a3 = TMath::Power(a,3);
349 double b3 = TMath::Power(b,3);
350 integral2 = alpha/3. * (b3 -
a3);
353 double a3 = TMath::Power(a,3);
354 double kFi3 = TMath::Power(kFi,3);
356 integral2 = alpha/3. * (kFi3 -
a3) + beta * (1./kFi - 1./b);
362 double alpha,
double beta,
double kf,
double pmax)
366 double kf3 = TMath::Power(kf,3.);
367 double sum = 4.*
kPi* (alpha * kf3/3. + beta*(1./kf - 1./pmax));
375 double xv = TMath::Min(0.75, x);
376 double xv2 = xv * xv;
377 double xv3 = xv2 * xv;
378 double xv4 = xv3 * xv;
379 double xv5 = xv4 * xv;
380 double xvp = TMath::Power(xv, 14.417);
381 double expaxv = TMath::Exp(-21.94*xv);
387 f= 0.985*(1.+0.422*xv - 2.745*xv2 + 7.570*xv3 - 10.335*xv4 + 5.422*xv5);
391 f *= (1.096 - 0.364*xv - 0.278*expaxv + 2.722*xvp);
401 double c = 1.,
z = 1.;
403 if (A == 27) { c = 3.07;
z = 0.52; }
404 else if (A == 28) { c = 3.07;
z = 0.54; }
405 else if (A == 40) { c = 3.53;
z = 0.54; }
406 else if (A == 56) { c = 4.10;
z = 0.56; }
407 else if (A == 208) { c = 6.62;
z = 0.55; }
409 c = TMath::Power(A,0.35);
z = 0.54;
413 <<
"r= " << r <<
", ring= " << ring;
418 double ap = 1., alf = 1.;
420 if (A == 7) { ap = 1.77; alf = 0.327; }
421 else if (A == 12) { ap = 1.69; alf = 1.08; }
422 else if (A == 14) { ap = 1.76; alf = 1.23; }
423 else if (A == 16) { ap = 1.83; alf = 1.54; }
425 ap=1.75; alf=-0.4+.12*
A;
433 double ap = 1.9/TMath::Sqrt(2.);
443 double r,
double a,
double alf,
double ring)
453 ring = TMath::Min(ring, 0.3*a);
455 double aeval = a + ring;
456 double norm = 1./((5.568 + alf*8.353)*TMath::Power(a,3.));
457 double b = TMath::Power(r/aeval, 2.);
458 double dens = norm * (1. + alf*
b) * TMath::Exp(-b);
461 <<
"r = " << r <<
", norm = " << norm <<
", dens = " << dens
462 <<
", aeval= " << aeval;
468 double r,
double c,
double z,
double ring)
478 <<
"c= " << c <<
", z= " << z <<
",ring= " << ring;
480 ring = TMath::Min(ring, 0.75*c);
482 double ceval = c + ring;
483 double norm = (3./(4.*
kPi*TMath::Power(c,3)))*1./(1.+TMath::Power((
kPi*z/c),2));
484 double dens = norm / (1 + TMath::Exp((r-ceval)/z));
487 <<
"r = " << r <<
", norm = " << norm
488 <<
", dens = " << dens <<
" , ceval= " << ceval;
497 double x = TMath::Power(target.
A(),1/3.0) / target.
Z();
498 return (0.05042772591+x*(-0.11377355795+x*(0.15159890400-0.08825307197*x)));
505 double x = 1.0 / target.
A();
506 return (0.27+x*(-1.12887857491+x*(9.72670908033-39.53095724456*x)));
double DensityGaus(double r, double ap, double alf, double ring=0.)
static NuclearData * Instance(void)
bool IsWeakCC(void) const
static constexpr double hbarc
double beta(double KE, const simb::MCParticle *part)
THE MAIN GENIE PROJECT NAMESPACE
double FmArea(double alpha, double beta, double kf, double pmax)
int HitNucPdg(void) const
double Density(double r, int A, double ring=0.)
double FmI2(double alpha, double beta, double a, double b, double kFi, double kFf, double q)
A singleton class holding all configuration registries built while parsing all loaded XML configurati...
bool IsNucleus(void) const
static FermiMomentumTablePool * Instance(void)
Generated/set kinematical variables for an event.
int SwitchProtonNeutron(int pdgc)
Pure abstract base class. Defines the NuclearModelI interface to be implemented by any physics model ...
A table of Fermi momentum constants.
virtual NuclearModel_t ModelType(const Target &) const =0
double Radius(int A, double Ro=constants::kNucRo)
double RQEFG_generic(double q2, double Mn, double kFi, double kFf, double pmax)
Summary information for an interaction.
double BindEnergy(const Target &target)
double BindEnergyPerNucleon(const Target &target)
double q2(bool selected=false) const
Singleton class to load & serve tables of Fermi momentum constants.
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
const FermiMomentumTable * GetTable(string name)
A class encapsulating an enumeration of interaction types (EM, Weak-CC, Weak-NC) and scattering types...
double BindEnergyPerNucleonParametrization(const Target &target)
const Kinematics & Kine(void) const
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
const Algorithm * GetAlgorithm(const AlgId &algid)
double FmI1(double alpha, double beta, double a, double b, double kFi, double kFf, double q)
Registry * GlobalParameterList(void) const
auto norm(Vector const &v)
Return norm of the specified vector.
static const double kLightSpeed
double BindEnergyLastNucleon(const Target &target)
double DensityWoodsSaxon(double r, double c, double z, double ring=0.)
double FermiMomentumForIsoscalarNucleonParametrization(const Target &target)
TLorentzVector * HitNucP4Ptr(void) const
static AlgFactory * Instance()
A registry. Provides the container for algorithm configuration parameters.
double HitNucPosition(void) const
Target * TgtPtr(void) const
double DeuteriumSuppressionFactor(double Q2)
static constexpr double fermi
InitialState * InitStatePtr(void) const
const InitialState & InitState(void) const
const ProcessInfo & ProcInfo(void) const
double FindClosestKF(int target_pdgc, int nucleon_pdgc) const
double Q2(bool selected=false) const
const Target & Tgt(void) const
The GENIE Algorithm Factory.
double DISNuclFactor(double x, int A)
static const double kPlankConstant
RgAlg GetAlg(RgKey key) const
static AlgConfigPool * Instance()
double NuclQELXSecSuppression(string kftable, double pmax, const Interaction *in)
Initial State information.