12 #include <Math/Integrator.h>
17 #include "Framework/Conventions/GBuild.h"
32 using namespace genie;
33 using namespace genie::constants;
67 double Q2 = kinematics.
Q2();
69 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__
70 LOG(
"QELCharmXSec",
pDEBUG) <<
"E = " << E <<
", Q2 = " <<
Q2;
74 double MR = this->
MRes (interaction);
75 double MR2 = TMath::Power(MR,2);
77 double Mnuc2 = TMath::Power(Mnuc,2);
79 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__
80 LOG(
"QELCharmXSec",
pDEBUG) <<
"M(RES) = " << MR;
85 double vR = (MR2 - Mnuc2 +
Q2) / (2*Mnuc);
86 double xiR = this->
xiBar(Q2, Mnuc, vR);
89 double Q2_4E2 = Q2/(4*E2);
90 double Q2_2MExiR = Q2/(2*Mnuc*E*xiR);
91 double Z = this->
ZR(interaction);
92 double D = this->
DR(interaction);
94 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__
96 <<
"Z = " << Z <<
", D = " << D <<
". xiR = " << xiR <<
", vR = " << vR;
99 double xsec = Gf*Z*D * (1 - vR_E + Q2_4E2 + Q2_2MExiR) *
100 TMath::Sqrt(vR2 + Q2) / (vR*xiR);
117 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__
119 <<
"dsigma/dQ2(E=" << E <<
", Q2=" << Q2 <<
") = "
120 << xsec / (1E-40*
units::cm2) <<
" x 1E-40 cm^2";
143 const InitialState & init_state = interaction -> InitState();
152 double Q2 = kinematics.
Q2();
154 double Mnuc2 = TMath::Power(Mnuc,2);
155 double MR = this->
MRes(interaction);
156 double DeltaR = this->
ResDM(interaction);
158 double vR_minus = ( TMath::Power(MR-DeltaR,2) - Mnuc2 +
Q2 ) / (2*Mnuc);
159 double vR_plus = ( TMath::Power(MR+DeltaR,2) - Mnuc2 +
Q2 ) / (2*Mnuc);
162 <<
"vR = [plus: " << vR_plus <<
", minus: " << vR_minus <<
"]";
164 double xi_bar_minus = 0.999;
165 double xi_bar_plus = this->
xiBar(Q2, Mnuc, vR_plus);
168 <<
"Integration limits = [" << xi_bar_plus <<
", " << xi_bar_minus <<
"]";
172 ROOT::Math::IBaseFunctionOneDim * integrand =
new
174 ROOT::Math::IntegrationOneDim::Type ig_type =
178 double reltol = 1E-4;
179 int nmaxeval = 100000;
180 ROOT::Math::Integrator ig(*integrand,ig_type,abstol,reltol,nmaxeval);
181 double D = ig.Integral(xi_bar_plus, xi_bar_minus);
192 double xi = (Q2/Mnuc) / (v + TMath::Sqrt(v2+Q2));
193 double xib = xi * ( 1 + (1 + Mo2/(Q2+Mo2))*Mo2/
Q2 );
249 if(!is_exclusive_charm)
return false;
252 if(!proc_info.
IsWeak())
return false;
276 double MR =
this ->
MRes (interaction);
279 double Mnuc2 = TMath::Power(Mnuc,2);
282 double ER = ( TMath::Power(MR+ml,2) - Mnuc2 ) / (2*Mnuc);
284 if(E <= ER)
return false;
332 PDF * pdf,
double Q2,
int nucleon_pdgc) :
333 ROOT::Math::IBaseFunctionOneDim()
336 fQ2 = TMath::Max(0.3, Q2);
337 fPdgC = nucleon_pdgc;
352 if(xin<0 || xin>1)
return 0.;
354 fPDF->Calculate(xin, fQ2);
356 double f = (isP) ? fPDF->DownValence() : fPDF->UpValence();
359 <<
"f(xin = " << xin <<
", Q2 = " << fQ2 <<
") = " << f;
364 ROOT::Math::IBaseFunctionOneDim *
Cross Section Calculation Interface.
ROOT::Math::IntegrationOneDim::Type Integration1DimTypeFromString(string type)
double J(double q0, double q3, double Enu, double ml)
Cross Section Integrator Interface.
double Q2(const Interaction *const i)
ROOT::Math::IBaseFunctionOneDim * Clone(void) const
int HitNucPdg(void) const
void Configure(const Registry &config)
double DoEval(double xin) const
bool IsQuasiElastic(void) const
double HitNucMass(void) const
int CharmHadronPdg(void) const
double MRes(const Interaction *interaction) const
Generated/set kinematical variables for an event.
double ZR(const Interaction *interaction) const
bool ValidKinematics(const Interaction *i) const
Is the input kinematical point a physically allowed one?
const XSecIntegratorI * fXSecIntegrator
const IntegratorI * fIntegrator;
enum genie::EKinePhaseSpace KinePhaseSpace_t
Pure abstract base class. Defines the PDFModelI interface to be implemented by wrapper classes to exi...
Contains minimal information for tagging exclusive processes.
bool IsCharmEvent(void) const
Summary information for an interaction.
double DR(const Interaction *interaction) const
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
static constexpr double cm2
A class encapsulating an enumeration of interaction types (EM, Weak-CC, Weak-NC) and scattering types...
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)
void SetModel(const PDFModelI *model)
double ResDM(const Interaction *interaction) const
virtual ~KovalenkoQELCharmPXSec()
Auxiliary scalar function for the internal integration in Kovalenko QEL charm production cross sectio...
const UInt_t kISkipKinematicChk
if set, skip kinematic validity checks
TParticlePDG * FSPrimLepton(void) const
final state primary lepton
bool ValidProcess(const Interaction *i) const
Can this cross section algorithm handle the input process?
const PDFModelI * fPDFModel
TLorentzVector * HitNucP4Ptr(void) const
static PDGLibrary * Instance(void)
A registry. Provides the container for algorithm configuration parameters.
const UInt_t kIAssumeFreeNucleon
const XclsTag & ExclTag(void) const
bool IsInclusiveCharm(void) const
double Integral(const Interaction *i) const
double Jacobian(const Interaction *const i, KinePhaseSpace_t f, KinePhaseSpace_t t)
double xiBar(double Q2, double Mnuc, double v) const
const InitialState & InitState(void) const
KovQELCharmIntegrand(PDF *pdf, double Q2, int nucleon_pdgc)
double XSec(const Interaction *i, KinePhaseSpace_t k) const
Compute the cross section for the input interaction.
const ProcessInfo & ProcInfo(void) const
TParticlePDG * Find(int pdgc, bool must_exist=true)
double Q2(bool selected=false) const
bool GetParamDef(const RgKey &name, T &p, const T &def) const
const Target & Tgt(void) const
unsigned int NDim(void) const
virtual double Integrate(const XSecAlgorithmI *model, const Interaction *interaction) const =0
double ProbeE(RefFrame_t rf) const
Most commonly used PDG codes. A set of utility functions to handle PDG codes is provided in PDGUtils...
const UInt_t kISkipProcessChk
if set, skip process validity checks
Initial State information.
const Algorithm * SubAlg(const RgKey ®istry_key) const