12 #include <Math/Integrator.h> 15 #include "Framework/Conventions/GBuild.h" 23 using namespace genie;
50 const InitialState & init_state = interaction -> InitState();
56 double y = interaction->
Kine().
y();
61 double ymax = 1 + re + r*re / (1+re);
64 ymax = TMath::Min(ymax,1-e);
66 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 68 <<
"sig0 = " << sig0 <<
", r = " << r <<
", re = " << re;
70 <<
"allowed y: [" << ymin <<
", " << ymax <<
"]";
73 if(y<ymin || y>ymax)
return 0;
75 double xsec = 2 * sig0 * ( 1 - r + (
kAem/
kPi) *
Fa(re,r,y) );
77 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 79 <<
"dxsec[1-loop]/dy (Ev = " << E <<
", y = " << y <<
") = " << xsec;
93 int Ne = init_state.
Tgt().
Z();
120 fa = (1-
r) * ( TMath::Log(y2/rre) * TMath::Log(1-r_y) +
121 TMath::Log(y_r) * TMath::Log(1-y) -
124 this->
Li2( (r-y) / (1-y) ) +
125 1.5 * (1-
r) * TMath::Log(1-r)
129 0.5*(1+3*r) * ( this->
Li2( (1-r_y) / (1-r) ) -
130 this->
Li2( (y-r) / (1-r) ) -
131 TMath::Log(y_r) * TMath::Log( (y-r) / (1-r) )
136 this->
P(2,r,y) * TMath::Log(r) -
137 this->
P(3,r,y) * TMath::Log(re) +
138 this->
P(4,r,y) * TMath::Log(y) +
139 this->
P(5,r,y) * TMath::Log(1-y) +
140 this->
P(6,r,y) * (1 - r_y) * TMath::Log(1-r_y);
150 for(
int k = kmin;
k <= kmax;
k++) {
151 double c = this->
C(i,
k,r);
152 double yk = TMath::Power(y,
k);
160 double epsilon = 1
e-2;
161 double tmin = epsilon;
162 double tmax = 1. - epsilon;
164 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 166 <<
"Summing BardinIMDRadCorIntegrand in [" << tmin<<
", " << tmax<<
"]";
169 ROOT::Math::IBaseFunctionOneDim * integrand =
new 175 double reltol = 1
E-4;
176 int nmaxeval = 100000;
177 ROOT::Math::Integrator ig(*integrand,ig_type,abstol,reltol,nmaxeval);
178 double li2 = ig.Integral(tmin, tmax);
180 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 181 LOG(
"BardinIMD",
pDEBUG) <<
"Li2(z = " << z <<
")" << li2;
193 if (k == -3)
return -0.19444444*TMath::Power(r,3.);
194 else if (k == -2)
return (0.083333333+0.29166667*r)*TMath::Power(r,2.);
195 else if (k == -1)
return -0.58333333*r - 0.5*TMath::Power(r,2.) - TMath::Power(r,3.)/6.;
196 else if (k == 0)
return -1.30555560 + 3.125*r + 0.375*TMath::Power(r,2.);
197 else if (k == 1)
return -0.91666667 - 0.25*
r;
198 else if (k == 2)
return 0.041666667;
201 }
else if ( i == 2 ) {
203 if (k == -3)
return 0.;
204 else if (k == -2)
return 0.5*TMath::Power(r,2.);
205 else if (k == -1)
return 0.5*r - 2*TMath::Power(r,2.);
206 else if (k == 0)
return 0.25 - 0.75*r + 1.5*TMath::Power(r,2);
207 else if (k == 1)
return 0.5;
208 else if (k == 2)
return 0.;
211 }
else if ( i == 3 ) {
213 if (k == -3)
return 0.16666667*TMath::Power(r,3.);
214 else if (k == -2)
return 0.25*TMath::Power(r,2.)*(1-
r);
215 else if (k == -1)
return r-0.5*TMath::Power(r,2.);
216 else if (k == 0)
return 0.66666667;
217 else if (k == 1)
return 0.;
218 else if (k == 2)
return 0.;
221 }
else if ( i == 4 ) {
223 if (k == -3)
return 0.;
224 else if (k == -2)
return TMath::Power(r,2.);
225 else if (k == -1)
return r*(1-4.*
r);
226 else if (k == 0)
return 1.5*TMath::Power(r,2.);
227 else if (k == 1)
return 1.;
228 else if (k == 2)
return 0.;
231 }
else if ( i == 5 ) {
233 if (k == -3)
return 0.16666667*TMath::Power(r,3.);
234 else if (k == -2)
return -0.25*TMath::Power(r,2.)*(1+
r);
235 else if (k == -1)
return 0.5*r*(1+3*
r);
236 else if (k == 0)
return -1.9166667+2.25*r-1.5*TMath::Power(r,2);
237 else if (k == 1)
return -0.5;
238 else if (k == 2)
return 0.;
241 }
else if ( i == 6 ) {
243 if (k == -3)
return 0.;
244 else if (k == -2)
return 0.16666667*TMath::Power(r,2.);
245 else if (k == -1)
return -0.25*r*(r+0.33333333);
246 else if (k == 0)
return 1.25*(r+0.33333333);
247 else if (k == 1)
return 0.5;
248 else if (k == 2)
return 0.;
280 ROOT::Math::IBaseFunctionOneDim()
297 if(xin<=0)
return 0.;
298 if(xin*
fZ >= 1.)
return 0.;
299 double f = TMath::Log(1.-
fZ*xin)/xin;
303 ROOT::Math::IBaseFunctionOneDim *
Cross Section Calculation Interface.
void Configure(const Registry &config)
~BardinIMDRadCorIntegrand()
ROOT::Math::IntegrationOneDim::Type Integration1DimTypeFromString(string type)
double J(double q0, double q3, double Enu, double ml)
THE MAIN GENIE PROJECT NAMESPACE
Cross Section Integrator Interface.
enum genie::EKinePhaseSpace KinePhaseSpace_t
static const double kElectronMass
double y(bool selected=false) const
double DoEval(double xin) const
virtual ~BardinIMDRadCorPXSec()
Summary information for an interaction.
virtual bool ValidKinematics(const Interaction *i) const
Is the input kinematical point a physically allowed one?
double P(int i, double r, double y) const
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
double C(int i, int k, double r) const
static const double kElectronMass2
unsigned int NDim(void) const
static const double kMuonMass2
const Kinematics & Kine(void) const
virtual void Configure(const Registry &config)
double XSec(const Interaction *i, KinePhaseSpace_t k) const
Compute the cross section for the input interaction.
double Li2(double z) const
A registry. Provides the container for algorithm configuration parameters.
const XSecIntegratorI * fXSecIntegrator
differential x-sec integrator
double Fa(double re, double r, double y) const
virtual double Integrate(const XSecAlgorithmI *model, const Interaction *interaction) const =0
ROOT::Math::IBaseFunctionOneDim * Clone(void) const
double Jacobian(const Interaction *const i, KinePhaseSpace_t f, KinePhaseSpace_t t)
bool ValidProcess(const Interaction *i) const
Can this cross section algorithm handle the input process?
const Target & Tgt(void) const
BardinIMDRadCorIntegrand(double z)
double ProbeE(RefFrame_t rf) const
const UInt_t kISkipProcessChk
if set, skip process validity checks
double Integral(const Interaction *i) const
Initial State information.
const UInt_t kIAssumeFreeElectron
const Algorithm * SubAlg(const RgKey ®istry_key) const