12#include <Math/Integrator.h>
17#include "Framework/Conventions/GBuild.h"
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) :
333ROOT::Math::IBaseFunctionOneDim()
336 fQ2 = TMath::Max(0.3, Q2);
337 fPdgC = nucleon_pdgc;
352 if(xin<0 || xin>1)
return 0.;
356 double f = (isP) ?
fPDF->DownValence() :
fPDF->UpValence();
359 <<
"f(xin = " << xin <<
", Q2 = " <<
fQ2 <<
") = " << f;
364ROOT::Math::IBaseFunctionOneDim *
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE,...
Most commonly used PDG codes. A set of utility functions to handle PDG codes is provided in PDGUtils.
virtual void Configure(const Registry &config)
bool GetParamDef(const RgKey &name, T &p, const T &def) const
const Algorithm * SubAlg(const RgKey ®istry_key) const
Initial State information.
const Target & Tgt(void) const
double ProbeE(RefFrame_t rf) const
Summary information for an interaction.
const XclsTag & ExclTag(void) const
const Kinematics & Kine(void) const
const ProcessInfo & ProcInfo(void) const
TParticlePDG * FSPrimLepton(void) const
final state primary lepton
const InitialState & InitState(void) const
Generated/set kinematical variables for an event.
double Q2(bool selected=false) const
const XSecIntegratorI * fXSecIntegrator
const IntegratorI * fIntegrator;
bool ValidKinematics(const Interaction *i) const
Is the input kinematical point a physically allowed one?
double ZR(const Interaction *interaction) const
const PDFModelI * fPDFModel
double DR(const Interaction *interaction) const
double Integral(const Interaction *i) const
bool ValidProcess(const Interaction *i) const
Can this cross section algorithm handle the input process?
double xiBar(double Q2, double Mnuc, double v) const
virtual ~KovalenkoQELCharmPXSec()
double MRes(const Interaction *interaction) const
double ResDM(const Interaction *interaction) const
void Configure(const Registry &config)
double XSec(const Interaction *i, KinePhaseSpace_t k) const
Compute the cross section for the input interaction.
Pure abstract base class. Defines the PDFModelI interface to be implemented by wrapper classes to exi...
void SetModel(const PDFModelI *model)
static PDGLibrary * Instance(void)
TParticlePDG * Find(int pdgc, bool must_exist=true)
A class encapsulating an enumeration of interaction types (EM, Weak-CC, Weak-NC) and scattering types...
bool IsQuasiElastic(void) const
A registry. Provides the container for algorithm configuration parameters.
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
int HitNucPdg(void) const
TLorentzVector * HitNucP4Ptr(void) const
double HitNucMass(void) const
Cross Section Integrator Interface.
Contains minimal information for tagging exclusive processes.
bool IsInclusiveCharm(void) const
bool IsCharmEvent(void) const
int CharmHadronPdg(void) const
Auxiliary scalar function for the internal integration in Kovalenko QEL charm production cross sectio...
KovQELCharmIntegrand(PDF *pdf, double Q2, int nucleon_pdgc)
double DoEval(double xin) const
ROOT::Math::IBaseFunctionOneDim * Clone(void) const
unsigned int NDim(void) const
static constexpr double cm2
ROOT::Math::IntegrationOneDim::Type Integration1DimTypeFromString(string type)
double Jacobian(const Interaction *const i, KinePhaseSpace_t f, KinePhaseSpace_t t)
THE MAIN GENIE PROJECT NAMESPACE
enum genie::EKinePhaseSpace KinePhaseSpace_t
const UInt_t kISkipKinematicChk
if set, skip kinematic validity checks
const UInt_t kISkipProcessChk
if set, skip process validity checks
const UInt_t kIAssumeFreeNucleon