16 #include <Math/Integrator.h>
29 using namespace genie;
30 using namespace genie::utils;
31 using namespace genie::constants;
57 const InitialState & init_state = interaction -> InitState();
58 const Kinematics & kinematics = interaction -> Kine();
62 const int nu_pdg = init_state.
ProbePdg();
64 const double Q2 = kinematics.
Q2();
65 const double TE = kinematics.
HadSystP4().E();
66 const unsigned int Z = target.
Z();
69 unsigned short nu_i = 3;
70 if(
pdg::IsNuE( TMath::Abs( nu_pdg ) ) ) nu_i = 0;
71 else if (
pdg::IsNuMu( TMath::Abs( nu_pdg ) ) ) nu_i = 1;
72 else if (
pdg::IsNuTau( TMath::Abs( nu_pdg ) ) ) nu_i = 2;
76 const double M = target.
Mass();
79 const double TT = TE - M;
82 const double E2 = E * E;
83 const double Z2 = Z * Z;
84 const double FF2 = FF * FF;
85 const double TTDiff = TT - M;
90 const double num_fact1 = FF2 * Z2;
91 const double num_fact21 =
fDNuMass2 * (TTDiff - 2.*E);
92 const double num_fact22 = 2. * M * (2.*E2 - 2.*TT*E + TT*TTDiff);
93 const double den_fact1 = 1. / (E2);
94 const double den_fact2 = TMath::Power((
fDMediatorMass2 + 2.*TT*M), -2.);
97 const double xsec = const_factor * model_params * num_fact1 *
98 (num_fact21 + num_fact22) * den_fact1 * den_fact2;
122 const Target & target = init_state.
Tgt();
123 if( ! target.
IsNucleus() )
return false ;
138 const double tl = DNu.E()*(M+E) - E*M - 0.5*
fDNuMass2;
139 const double tr = E * DNu.P();
141 if(tl < -1.*tr)
return false;
142 if(tl > tr)
return false;
163 bool good_configuration = true ;
165 double DKineticMixing = 0.;
166 this->
GetParam(
"Dark-KineticMixing", DKineticMixing);
167 fEps2 = DKineticMixing * DKineticMixing;
169 bool force_unitarity = false ;
170 GetParam(
"Dark-Mixing-ForceUnitarity", force_unitarity ) ;
172 unsigned int n_min_mixing = force_unitarity ? 3 : 4 ;
174 std::vector<double> DMixing2s;
178 if ( DMixing2s.size () < n_min_mixing ) {
179 good_configuration = false ;
181 <<
"Not enough mixing elements specified, only specified "
182 << DMixing2s.size() <<
" / " << n_min_mixing ;
186 for(
unsigned int i = 0; i < n_min_mixing ; ++i ) {
187 if ( DMixing2s[i] < 0. ) {
188 good_configuration = false ;
190 <<
"Mixing " << i <<
" non positive: " << DMixing2s[i] ;
196 if ( force_unitarity ) {
199 if ( DMixing2s[3] < 0. ) {
200 good_configuration = false ;
202 <<
"Mixing D4 non positive: " << DMixing2s[3] ;
221 if ( ! good_configuration ) {
222 LOG(
"BertuzzoDNuCOH",
pFATAL ) <<
"Wrong configuration. Exiting" ;
Cross Section Calculation Interface.
const KPhaseSpace & PhaseSpace(void) const
bool IsNeutrino(int pdgc)
Cross Section Integrator Interface.
double Q2(const Interaction *const i)
bool IsDarkNeutralCurrent(void) const
bool IsNucleus(void) const
int GetParamVect(const std::string &comm_name, std::vector< T > &v, bool is_top_call=true) const
Handle to load vectors of parameters.
Generated/set kinematical variables for an event.
const TLorentzVector & HadSystP4(void) const
enum genie::EKinePhaseSpace KinePhaseSpace_t
void Configure(const Registry &config) override
std::array< double, 4 > fMixing2s
Summary information for an interaction.
virtual ~BertuzzoDNuCOHPXSec()
const TLorentzVector & FSLeptonP4(void) const
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
double Integral(const Interaction *i) const override
bool IsCoherentElastic(void) const
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)
bool ValidProcess(const Interaction *i) const override
Can this cross section algorithm handle the input process?
const XSecIntegratorI * fXSecIntegrator
cross section integrator
const UInt_t kISkipKinematicChk
if set, skip kinematic validity checks
A registry. Provides the container for algorithm configuration parameters.
bool IsAboveThreshold(void) const
Checks whether the interaction is above the energy threshold.
bool ValidKinematics(const Interaction *i) const override
Is the input kinematical point a physically allowed one?
const InitialState & InitState(void) const
const ProcessInfo & ProcInfo(void) const
double Q2(bool selected=false) const
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
const Target & Tgt(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 EngelFormFactor * fFF
Engel Form Factor algorithm.
double XSec(const Interaction *i, KinePhaseSpace_t k) const override
Compute the cross section for the input interaction.
const UInt_t kISkipProcessChk
if set, skip process validity checks
Initial State information.
const Algorithm * SubAlg(const RgKey ®istry_key) const