21 using namespace genie;
54 const InitialState & init_state = interaction -> InitState();
57 const bool isProt = target.
IsProton();
59 const double q2 = kine.
q2();
66 const double Ee = Ev + ( (q2 - mn2 + mp2) / (2.000*mp) );
68 * (isProt ? 1.000 : -1.000);
69 const double sMinusMp2 = 2.000*mp*Ev;
71 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 72 LOG(
"StrumiaVissani",
pDEBUG) <<
"*** Ev = " << Ev
75 <<
", s-u = " << sMinusU
76 <<
", s-Mp2 = " << sMinusMp2;
79 double xsec =
dSigDt(sMinusU, sMinusMp2, q2);
80 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 81 LOG(
"StrumiaVissani",
pDEBUG) <<
"*** dSdt = " << xsec;
88 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 89 LOG(
"StrumiaVissani",
pDEBUG) <<
"*** rad.corr. = " << rdcf
90 <<
", fin.st.cor. = " << fscf
91 <<
", xsec = " << xsec;
99 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 100 LOG(
"StrumiaVissani",
pDEBUG) <<
"*** Jacobian = " <<
J;
104 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 105 LOG(
"StrumiaVissani",
pDEBUG) <<
"*** xsec = " << xsec;
114 assert(interaction!=0);
131 const InitialState & init_state = interaction -> InitState();
136 LOG(
"StrumiaVissani",
pERROR) <<
"*** Should be IBD processes either nu_e + n or anu_e + p!";
144 const InitialState & init_state = interaction -> InitState();
148 LOG(
"StrumiaVissani",
pERROR) <<
"*** Ev=" << Ev
149 <<
" is too large for VLE QEL!";
176 const double cosCab = TMath::Cos(cab);
190 GetParam(
"AnomMagnMoment-P", mup );
191 GetParam(
"AnomMagnMoment-N", mun );
197 fEpsilon = TMath::Power(10.000, -1.000 * static_cast<double>(epmag) );
199 LOG(
"StrumiaVissani",
pINFO) <<
"*** USING: cos2(Cabibbo)=" 215 const double sMinusMnuc,
216 const double t)
const 226 const double denom = (2.000 *
kPi) * sMinusMnuc*sMinusMnuc;
227 assert(TMath::Abs(denom) >
fEpsilon);
229 return ( (numer / denom) *
MtxElm(sMinusU, t) );
233 const double t)
const 246 const double t2 = t *
t;
248 const double fdenomB = 1.000 - (t /
fMv2);
249 const double fdenom = (1.000 - t4m)*fdenomB*fdenomB;
250 const double g1denom = 1.000 - (t /
fMa2);
252 assert(TMath::Abs(fdenom) >
fEpsilon);
253 assert(TMath::Abs(g1denom) >
fEpsilon);
254 assert(TMath::Abs(g2denom) >
fEpsilon);
258 const double g1 =
fg1of0 / (g1denom*g1denom);
261 const double f12 = f1 *
f1;
262 const double f124 = 4.000 * f12;
263 const double f22 = f2 *
f2;
264 const double g12 = g1 * g1;
265 const double g124 = 4.000 * g12;
266 const double g22 = g2 *
g2;
269 const double g1cFsumR = g1 * (f1+
f2);
270 const double f1cf2 = f1 *
f2;
271 const double g1cg2 = g1 *
g2;
272 const double f1cf2R8 = f1cf2 * 8.000;
275 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 276 LOG(
"StrumiaVissani",
pDEBUG) <<
"*** t = " << t
284 const double mat =
MAterm(t, t2, f124, f22, g124,
285 g224meM2, f1cf2R8, g1cg2R16me, g1cFsumR);
286 const double mbt =
MBterm(t, f1cf2, g1cg2, g1cFsumR, f22);
287 const double mct =
MCterm(t, f124, f22, g124);
289 const double M2 = mat - (sMinusU * (mbt - (sMinusU * mct)));
290 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 291 LOG(
"StrumiaVissani",
pDEBUG) <<
"*** Matrix element = " << (M2 / 16.000)
292 <<
" [16A=" << mat <<
"] [16B=" << mbt
293 <<
"] [16C=" << mct <<
"]";
296 return ( M2 / 16.000 );
304 const double g224meM2,
305 const double f1cf2R8,
306 const double g1cg2R16me,
307 const double g1cFsumR)
328 r2 += g224meM2 * tmme2;
336 return ( r1 - r2 - r3 );
342 const double g1cFsumR,
348 double bterm = 16.000 * t * g1cFsumR;
371 double rc = 6.000 + (1.500 * TMath::Log(
kProtonMass / (2.000*Ee)));
385 const double eta = 2.000*
kPi*
kAem 387 const double expn = TMath::Exp(-1.000 * eta);
388 assert(expn < 1.000);
389 return ( eta / (1.000 - expn) );
Cross Section Calculation Interface.
const KPhaseSpace & PhaseSpace(void) const
double J(double q0, double q3, double Enu, double ml)
THE MAIN GENIE PROJECT NAMESPACE
Cross Section Integrator Interface.
static const double kNucleonMass
bool IsNeutron(void) const
static double MAterm(const double t, const double t2, const double f124, const double f22, const double g124, const double g224meM2, const double f1cf2R8, const double g1cg2R16me, const double g1cFsumR)
double RadiativeCorr(const double Ee) const
bool IsNuN(void) const
is neutrino + neutron?
static double MCterm(const double t, const double f124, const double f22, const double g124)
virtual ~StrumiaVissaniIBDPXSec()
Generated/set kinematical variables for an event.
bool IsInverseBetaDecay(void) const
static double MBterm(const double t, const double f1cf2, const double g1cg2, const double g1cFsumR, const double f22)
ClassImp(StrumiaVissaniIBDPXSec) StrumiaVissaniIBDPXSec
static const double k4EleMass2
enum genie::EKinePhaseSpace KinePhaseSpace_t
An implementation of the neutrino - (free) nucleon [inverse beta decay] cross section, valid from the threshold energy (1.806MeV) up to hundreds of MeV. Currently cut off at 1/2 nucleon mass. Based on the Strumia/Vissani paper Phys.Lett.B564:42-54,2003.
static const double kElectronMass
Summary information for an interaction.
double q2(bool selected=false) const
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
double FinalStateCorr(const double Ee) const
static const double kElectronMass2
const Kinematics & Kine(void) const
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
virtual void Configure(const Registry &config)
static const double kNeutronMass
double MtxElm(const double sMinusU, const double t) const
static const double kNucMassDiff
double Integral(const Interaction *i) const
bool ValidKinematics(const Interaction *i) const
Is the input kinematical point a physically allowed one?
static const double kNucMassDiff2
static const double kNucleonMass2
const UInt_t kISkipKinematicChk
if set, skip kinematic validity checks
static const double k4NucMass2
bool ValidProcess(const Interaction *i) const
Can this cross section algorithm handle the input process?
double dSigDt(const double sMinusU, const double sMinusMnuc, const double t) const
A registry. Provides the container for algorithm configuration parameters.
bool IsNuBarP(void) const
is anti-neutrino + proton?
virtual double Integrate(const XSecAlgorithmI *model, const Interaction *interaction) const =0
bool IsAboveThreshold(void) const
Checks whether the interaction is above the energy threshold.
double Jacobian(const Interaction *const i, KinePhaseSpace_t f, KinePhaseSpace_t t)
double XSec(const Interaction *i, KinePhaseSpace_t k) const
Compute the cross section for the input interaction.
const ProcessInfo & ProcInfo(void) const
void Configure(const Registry &config)
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
const Target & Tgt(void) const
static const double kProtonMass2
static const double kNeutronMass2
bool IsProton(void) const
double ProbeE(RefFrame_t rf) const
static const double kProtonMass
const XSecIntegratorI * fXSecIntegrator
const UInt_t kISkipProcessChk
if set, skip process validity checks
Initial State information.
static const double kPionMass2
const Algorithm * SubAlg(const RgKey ®istry_key) const