GENIEGenerator
Loading...
Searching...
No Matches
SuSAv2MECPXSec.cxx
Go to the documentation of this file.
1//_________________________________________________________________________
2/*
3 Copyright (c) 2003-2025, The GENIE Collaboration
4 For the full text of the license visit http://copyright.genie-mc.org
5 or see $GENIE/LICENSE
6
7 For the class documentation see the corresponding header file.
8*/
9//_________________________________________________________________________
10
24
25using namespace genie;
26
27//_________________________________________________________________________
29{
30}
31//_________________________________________________________________________
33 : XSecAlgorithmI("genie::SuSAv2MECPXSec", config)
34{
35}
36//_________________________________________________________________________
40//_________________________________________________________________________
41double SuSAv2MECPXSec::XSec(const Interaction* interaction,
42 KinePhaseSpace_t kps) const
43{
44 // Don't try to do the calculation if we've been handed an interaction that
45 // doesn't make sense
46 if ( !this->ValidProcess(interaction) ) return 0.;
47
48 // Get the hadron tensor for the selected nuclide. Check the probe PDG code
49 // to know whether to use the tensor for CC neutrino scattering or for
50 // electron scattering
51 int target_pdg = interaction->InitState().Tgt().Pdg();
52 int probe_pdg = interaction->InitState().ProbePdg();
53 int A_request = pdg::IonPdgCodeToA(target_pdg);
54 int Z_request = pdg::IonPdgCodeToZ(target_pdg);
55 bool need_to_scale = false;
56
58 if ( pdg::IsNeutrino(probe_pdg) || pdg::IsAntiNeutrino(probe_pdg) ) {
59 tensor_type = kHT_MEC_FullAll;
60 //pn_tensor_type = kHT_MEC_Fullpn;
61 //tensor_type = kHT_MEC_FullAll_wImag;
62 //pn_tensor_type = kHT_MEC_FullAll_wImag;
63 }
64 else {
65 // If the probe is not a neutrino, assume that it's an electron
66 // For the moment all electron interactions are pp final state
67 tensor_type = kHT_MEC_EM;
68 //pn_tensor_type = kHT_MEC_EM;
69 }
70
71 // Currently we only have the relative pair contributions for C12.
72 int tensor_pdg = kPdgTgtC12;
73 if(tensor_pdg != target_pdg) need_to_scale = true;
74
75 // The SuSAv2-MEC hadron tensors are defined using the same conventions
76 // as the Valencia MEC model, so we can use the same sort of tensor
77 // object to describe them.
78 const LabFrameHadronTensorI* tensor
79 = dynamic_cast<const LabFrameHadronTensorI*>( fHadronTensorModel->GetTensor(tensor_pdg,
80 tensor_type) );
81
82 // If retrieving the tensor failed, complain and return zero
83 if ( !tensor ) {
84 LOG("SuSAv2MEC", pWARN) << "Failed to load a hadronic tensor for the"
85 " nuclide " << tensor_pdg;
86 return 0.;
87 }
88
89 // Check that the input kinematical point is within the range
90 // in which hadron tensors are known (for chosen target)
91 double Ev = interaction->InitState().ProbeE(kRfLab);
92 double Tl = interaction->Kine().GetKV(kKVTl);
93 double costl = interaction->Kine().GetKV(kKVctl);
94 double ml = interaction->FSPrimLepton()->Mass();
95 double Q0 = 0.;
96 double Q3 = 0.;
97
98 // The Q-Value essentially corrects q0 to account for nuclear
99 // binding energy in the Valencia model but this effect is already
100 // in Guille's tensors so its set it to 0.
101 // However, additional corrections may be necessary:
102 double Delta_Q_value = Qvalue( * interaction ) ;
103
104 genie::utils::mec::Getq0q3FromTlCostl(Tl, costl, Ev, ml, Q0, Q3);
105
106 double Q0min = tensor->q0Min();
107 double Q0max = tensor->q0Max();
108 double Q3min = tensor->qMagMin();
109 double Q3max = tensor->qMagMax();
110 if (Q0-Delta_Q_value < Q0min || Q0-Delta_Q_value > Q0max || Q3 < Q3min || Q3 > Q3max) {
111 return 0.0;
112 }
113
114 // *** Enforce the global Q^2 cut (important for EM scattering) ***
115 // Choose the appropriate minimum Q^2 value based on the interaction
116 // mode (this is important for EM interactions since the differential
117 // cross section blows up as Q^2 --> 0)
118 double Q2min = genie::controls::kMinQ2Limit; // CC/NC limit
119 if ( interaction->ProcInfo().IsEM() ) Q2min = genie::utils::kinematics
120 ::electromagnetic::kMinQ2Limit; // EM limit
121
122 // Neglect shift due to binding energy. The cut is on the actual
123 // value of Q^2, not the effective one to use in the tensor contraction.
124 double Q2 = Q3*Q3 - Q0*Q0;
125 if ( Q2 < Q2min ) return 0.;
126
127 // By default, we will compute the full cross-section. If a {p,n} hit
128 // dinucleon was set we will calculate the cross-section for that
129 // component only
130
131 bool pn = (interaction->InitState().Tgt().HitNucPdg() == kPdgClusterNP);
132
133 // Compute the cross section using the hadron tensor
134 double xsec = tensor->dSigma_dT_dCosTheta_rosenbluth(interaction, Delta_Q_value);
135
136 // This scaling should be okay-ish for the total xsec, but it misses
137 // the energy shift. To get this we should really just build releveant
138 // hadron tensors but there may be some ways to approximate it.
139 // For more details see Guille's thesis: https://idus.us.es/xmlui/handle/11441/74826
140 if ( need_to_scale ) {
142 const FermiMomentumTable * kft = kftp->GetTable(fKFTable);
143 double KF_tgt = kft->FindClosestKF(target_pdg, kPdgProton);
144 double KF_ten = kft->FindClosestKF(tensor_pdg, kPdgProton);
145 LOG("SuSAv2MEC", pDEBUG) << "KF_tgt = " << KF_tgt;
146 LOG("SuSAv2MEC", pDEBUG) << "KF_ten = " << KF_ten;
147 double A_ten = pdg::IonPdgCodeToA(tensor_pdg);
148 double scaleFact = (A_request/A_ten)*(KF_tgt/KF_ten)*(KF_tgt/KF_ten);
149 xsec *= scaleFact;
150 }
151
152 // Apply given overall scaling factor
153
154 const ProcessInfo& proc_info = interaction->ProcInfo();
155 if( proc_info.IsWeakCC() ) xsec *= fXSecCCScale;
156 else if( proc_info.IsWeakNC() ) xsec *= fXSecNCScale;
157 else if( proc_info.IsEM() ) xsec *= fXSecEMScale;
158
159 // Scale given a scaling algorithm:
160 if( fMECScaleAlg ) xsec *= fMECScaleAlg->GetScaling( * interaction ) ;
161
162 if ( kps != kPSTlctl ) {
163 LOG("SuSAv2MEC", pWARN)
164 << "Doesn't support transformation from "
167 xsec = 0.;
168 }
169
170 return xsec;
171}
172//_________________________________________________________________________
173double SuSAv2MECPXSec::PairRatio(const Interaction* interaction,
174 const std::string& final_state_ratio) const
175{
176
177 // Currently we only have the relative pair contributions for C12.
178 // We hope to add mode later, but for the moment assume the relative
179 // contributions are A-independant.
180
181 int probe_pdg = interaction->InitState().ProbePdg();
182
183 HadronTensorType_t tensor_type = kHT_Undefined;
184 HadronTensorType_t pn_tensor_type = kHT_Undefined;
185 HadronTensorType_t pp_tensor_type = kHT_Undefined;
186
187 if ( pdg::IsNeutrino(probe_pdg) || pdg::IsAntiNeutrino(probe_pdg) ) {
188 tensor_type = kHT_MEC_FullAll;
189 pn_tensor_type = kHT_MEC_Fullpn;
190 }
191 else {
192 // If the probe is not a neutrino, assume that it's an electron
193 // For the moment all electron interactions are pp final state
194 tensor_type = kHT_MEC_EM;
195 pn_tensor_type = kHT_MEC_EM_pn;
196 pp_tensor_type = kHT_MEC_EM_pp;
197 }
198
199 // The SuSAv2-MEC hadron tensors are defined using the same conventions
200 // as the Valencia MEC model, so we can use the same sort of tensor
201 // object to describe them.
202 const LabFrameHadronTensorI* tensor
203 = dynamic_cast<const LabFrameHadronTensorI*>( fHadronTensorModel->GetTensor(kPdgTgtC12,
204 tensor_type) );
205
206 const LabFrameHadronTensorI* tensor_pn
207 = dynamic_cast<const LabFrameHadronTensorI*>( fHadronTensorModel->GetTensor(kPdgTgtC12,
208 pn_tensor_type) );
209
210 const LabFrameHadronTensorI* tensor_pp
211 = dynamic_cast<const LabFrameHadronTensorI*>( fHadronTensorModel->GetTensor(kPdgTgtC12,
212 pp_tensor_type) );
213
214 // If retrieving the tensor failed, complain and return zero
215 if ( !tensor ) {
216 LOG("SuSAv2MEC", pWARN) << "Failed to load a hadronic tensor for the"
217 " nuclide " << kPdgTgtC12;
218 return 0.;
219 }
220
221 if ( !tensor_pn ) {
222 LOG("SuSAv2MEC", pWARN) << "Failed to load pn hadronic tensor for the"
223 " nuclide " << kPdgTgtC12;
224 return 0.;
225 }
226
227 if ( !tensor_pp && interaction->ProcInfo().IsEM() ) {
228 LOG("SuSAv2MEC", pWARN) << "Failed to load pp hadronic tensor for the"
229 " nuclide " << kPdgTgtC12;
230 return 0.;
231 }
232
233 // Check that the input kinematical point is within the range
234 // in which hadron tensors are known (for chosen target)
235 double Ev = interaction->InitState().ProbeE(kRfLab);
236 double Tl = interaction->Kine().GetKV(kKVTl);
237 double costl = interaction->Kine().GetKV(kKVctl);
238 double ml = interaction->FSPrimLepton()->Mass();
239 double Q0 = 0.;
240 double Q3 = 0.;
241
242 genie::utils::mec::Getq0q3FromTlCostl(Tl, costl, Ev, ml, Q0, Q3);
243
244 double Q0min = tensor->q0Min();
245 double Q0max = tensor->q0Max();
246 double Q3min = tensor->qMagMin();
247 double Q3max = tensor->qMagMax();
248 if (Q0 < Q0min || Q0 > Q0max || Q3 < Q3min || Q3 > Q3max) {
249 return 1.0;
250 }
251
252 // The Q-Value essentially corrects q0 to account for nuclear
253 // binding energy in the Valencia model but this effect is already
254 // in Guille's tensors so its set it to 0.
255 // However, additional corrections may be necessary:
256 double Delta_Q_value = Qvalue( * interaction ) ;
257
258 // Compute the cross section using the hadron tensor
259 double xsec_all = tensor->dSigma_dT_dCosTheta_rosenbluth(interaction, Delta_Q_value);
260
261 double ratio;
262
263 if (final_state_ratio == "pnFraction") { // pnFraction will be calculated by default
264 double xsec_pn = tensor_pn->dSigma_dT_dCosTheta_rosenbluth(interaction, Delta_Q_value);
265
266 //hadron tensor precision can sometimes lead to 0 xsec_pn but finite xsec
267 //seems to cause issues downstream ...
268 if(xsec_pn==0) xsec_pn = 0.00001*xsec_all;
269
270 double pn_ratio = (1e10*xsec_pn)/(1e10*xsec_all);
271
272 ratio = pn_ratio;
273
274 } else if (final_state_ratio == "ppFraction") {
275 double xsec_pp = tensor_pp->dSigma_dT_dCosTheta_rosenbluth(interaction, Delta_Q_value);
276
277 if(xsec_pp==0) xsec_pp = 0.00001*xsec_all;
278
279 double pp_ratio = (1e10*xsec_pp)/(1e10*xsec_all);
280
281 ratio = pp_ratio;
282
283 }
284
285 return ratio;
286}
287//_________________________________________________________________________
288double SuSAv2MECPXSec::Integral(const Interaction* interaction) const
289{
290 double xsec = fXSecIntegrator->Integrate(this,interaction);
291 return xsec;
292}
293//_________________________________________________________________________
294bool SuSAv2MECPXSec::ValidProcess(const Interaction* interaction) const
295{
296 if ( interaction->TestBit(kISkipProcessChk) ) return true;
297
298 const ProcessInfo& proc_info = interaction->ProcInfo();
299 if ( !proc_info.IsMEC() ) {
300 return false;
301 }
302
303 int probe = interaction->InitState().ProbePdg();
304
305 bool is_nu = pdg::IsNeutrino( probe );
306 bool is_nub = pdg::IsAntiNeutrino( probe );
307 bool is_chgl = pdg::IsChargedLepton( probe );
308
309 bool prc_ok = ( proc_info.IsWeakCC() && (is_nu || is_nub) )
310 || ( proc_info.IsEM() && is_chgl );
311
312 if ( !prc_ok ) return false;
313
314 return true;
315}
316//_________________________________________________________________________
317double SuSAv2MECPXSec::Qvalue(const Interaction & interaction ) const
318{
319 // Get the hadron tensor for the selected nuclide. Check the probe PDG code
320 // to know whether to use the tensor for CC neutrino scattering or for
321 // electron scattering
322 int target_pdg = interaction.InitState().Tgt().Pdg();
323 int probe_pdg = interaction.InitState().ProbePdg();
324 int tensor_pdg = kPdgTgtC12;
325 int A_request = pdg::IonPdgCodeToA(target_pdg);
326
327 double Eb_tgt=0;
328 double Eb_ten=0;
329
330 /// \todo Add more hadron tensors so this scaling is not so terrible
331 // At the moment all we have is Carbon so this is all just a place holder ...
332 if ( A_request == 4 ) {
333 Eb_tgt=fEbHe; Eb_ten=fEbC;
334 // This is for helium 4, but use carbon tensor, may not be ideal ...
335 }
336 else if (A_request < 9) {
337 Eb_tgt=fEbLi; Eb_ten=fEbC;
338 }
339 else if (A_request >= 9 && A_request < 15) {
340 Eb_tgt=fEbC; Eb_ten=fEbC;
341 }
342 else if(A_request >= 15 && A_request < 22) {
343 //tensor_pdg = kPdgTgtO16;
344 // Oxygen tensor has some issues - xsec @ 50 GeV = 45.2835 x 1E-38 cm^2
345 // This is ~ 24 times higher than C
346 // I think it's just a missing scale factor but I need to check.
347 Eb_tgt=fEbO; Eb_ten=fEbC;
348 }
349 else if(A_request >= 22 && A_request < 40) {
350 Eb_tgt=fEbMg; Eb_ten=fEbC;
351 }
352 else if(A_request >= 40 && A_request < 56) {
353 Eb_tgt=fEbAr; Eb_ten=fEbC;
354 }
355 else if(A_request >= 56 && A_request < 119) {
356 Eb_tgt=fEbFe; Eb_ten=fEbC;
357 }
358 else if(A_request >= 119 && A_request < 206) {
359 Eb_tgt=fEbSn; Eb_ten=fEbC;
360 }
361 else if(A_request >= 206) {
362 Eb_tgt=fEbPb; Eb_ten=fEbC;
363 }
364
365 // SD: The Q-Value essentially corrects q0 to account for nuclear
366 // binding energy in the Valencia model but this effect is already
367 // in Guille's tensors so I'll set it to 0.
368 // However, if I want to scale I need to account for the altered
369 // binding energy. To first order I can use the Delta_Q_value for this.
370 // But this is 2p2h - so binding energy counts twice - use 2*1p1h
371 // value (although what should be done here is still not clear).
372
373 double Delta_Q_value = 2*(Eb_tgt-Eb_ten);
374
375 // Apply Qvalue relative shift if needed:
376 if( fQvalueShifter ) {
377 // We have the option to add an additional shift on top of the binding energy correction
378 // The QvalueShifter, is a relative shift to the Q_value.
379 // The Q_value was already taken into account in the hadron tensor. Here we recalculate it
380 // to get the right absolute shift.
381 double tensor_Q_value = genie::utils::mec::Qvalue(tensor_pdg,probe_pdg);
382 double total_Q_value = tensor_Q_value + Delta_Q_value ;
383 double Q_value_shift = total_Q_value * fQvalueShifter -> Shift( interaction.InitState().Tgt() ) ;
384 Delta_Q_value += Q_value_shift ;
385 }
386
387 // We apply an extra Q-value shift here to account for differences between
388 // the 12C EM MEC tensors currently in use (which have a "baked in" Q-value
389 // already incorporated) and the treatment in Guille's thesis. Differences
390 // between the two lead to a few-tens-of-MeV shift in the energy transfer
391 // distribution for EM MEC. The shift is done in terms of the binding energy
392 // value associated with the original tensor (Eb_ten). Corrections for
393 // scaling to a different target are already handled above.
394 // - S. Gardiner, 1 July 2020
395 bool isEM = interaction.ProcInfo().IsEM();
396 if ( isEM ) Delta_Q_value -= 2. * Eb_ten;
397
398 return Delta_Q_value ;
399}
400//_________________________________________________________________________
402{
403 Algorithm::Configure(config);
404 this->LoadConfig();
405}
406//____________________________________________________________________________
407void SuSAv2MECPXSec::Configure(std::string config)
408{
409 Algorithm::Configure(config);
410 this->LoadConfig();
411}
412//_________________________________________________________________________
414{
415 bool good_config = true ;
416 // Cross section scaling factor
417 GetParamDef("MEC-CC-XSecScale", fXSecCCScale, 1.) ;
418 GetParamDef("MEC-NC-XSecScale", fXSecNCScale, 1.) ;
419 GetParamDef("MEC-EM-XSecScale", fXSecEMScale, 1.) ;
420
421 fHadronTensorModel = dynamic_cast<const HadronTensorModelI*> ( this->SubAlg("HadronTensorAlg") );
422 if( !fHadronTensorModel ) {
423 good_config = false ;
424 LOG("SuSAv2MECPXSec", pERROR) << "The required HadronTensorAlg does not exist. AlgoID is : " << SubAlg("HadronTensorAlg")->Id();
425 }
426
427 fXSecIntegrator = dynamic_cast<const XSecIntegratorI*> (this->SubAlg("NumericalIntegrationAlg"));
428 if( !fXSecIntegrator ) {
429 good_config = false ;
430 LOG("SuSAv2MECPXSec", pERROR) << "The required NumericalIntegrationAlg does not exist. AlgId is : " << SubAlg("NumericalIntegrationAlg")->Id() ;
431 }
432
433 //Fermi momentum tables for scaling
434 this->GetParam( "FermiMomentumTable", fKFTable);
435
436 //binding energy lookups for scaling
437 this->GetParam( "RFG-NucRemovalE@Pdg=1000020040", fEbHe );
438 this->GetParam( "RFG-NucRemovalE@Pdg=1000030060", fEbLi );
439 this->GetParam( "RFG-NucRemovalE@Pdg=1000060120", fEbC );
440 this->GetParam( "RFG-NucRemovalE@Pdg=1000080160", fEbO );
441 this->GetParam( "RFG-NucRemovalE@Pdg=1000120240", fEbMg );
442 this->GetParam( "RFG-NucRemovalE@Pdg=1000180400", fEbAr );
443 this->GetParam( "RFG-NucRemovalE@Pdg=1000200400", fEbCa );
444 this->GetParam( "RFG-NucRemovalE@Pdg=1000260560", fEbFe );
445 this->GetParam( "RFG-NucRemovalE@Pdg=1000280580", fEbNi );
446 this->GetParam( "RFG-NucRemovalE@Pdg=1000501190", fEbSn );
447 this->GetParam( "RFG-NucRemovalE@Pdg=1000791970", fEbAu );
448 this->GetParam( "RFG-NucRemovalE@Pdg=1000822080", fEbPb );
449
450 // Read optional MECScaleVsW:
451 fMECScaleAlg = nullptr;
452 if( GetConfig().Exists("MECScaleAlg") ) {
453 fMECScaleAlg = dynamic_cast<const XSecScaleI *> ( this->SubAlg("MECScaleAlg") );
454 if( !fMECScaleAlg ) {
455 good_config = false ;
456 LOG("Susav2MECPXSec", pERROR) << "The required MECScaleAlg cannot be casted. AlgID is : " << SubAlg("MECScaleAlg")->Id() ;
457 }
458 }
459
460 // Read optional QvalueShifter:
461 fQvalueShifter = nullptr;
462 if( GetConfig().Exists("QvalueShifterAlg") ) {
463 fQvalueShifter = dynamic_cast<const QvalueShifter *> ( this->SubAlg("QvalueShifterAlg") );
464 if( !fQvalueShifter ) {
465 good_config = false ;
466 LOG("SuSAv2MECPXSec", pERROR) << "The required QvalueShifterAlg does not exist. AlgId is : " << SubAlg("QvalueShifterAlg")->Id() ;
467 }
468 }
469
470 if( ! good_config ) {
471 LOG("SuSAv2MECPXSec", pERROR) << "Configuration has failed.";
472 exit(78) ;
473 }
474
475}
#define pERROR
Definition Messenger.h:59
#define pDEBUG
Definition Messenger.h:63
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE,...
Definition Messenger.h:96
#define pWARN
Definition Messenger.h:60
Most commonly used PDG codes. A set of utility functions to handle PDG codes is provided in PDGUtils.
virtual const Registry & GetConfig(void) const
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
virtual void Configure(const Registry &config)
Definition Algorithm.cxx:62
bool GetParamDef(const RgKey &name, T &p, const T &def) const
const Algorithm * SubAlg(const RgKey &registry_key) const
virtual const AlgId & Id(void) const
Get algorithm ID.
Definition Algorithm.h:98
Singleton class to load & serve tables of Fermi momentum constants.
const FermiMomentumTable * GetTable(string name)
static FermiMomentumTablePool * Instance(void)
A table of Fermi momentum constants.
double FindClosestKF(int target_pdgc, int nucleon_pdgc) const
virtual double q0Min() const =0
virtual double qMagMax() const =0
virtual double q0Max() const =0
virtual double qMagMin() const =0
Creates hadron tensor objects for use in cross section calculations.
const Target & Tgt(void) const
int ProbePdg(void) const
double ProbeE(RefFrame_t rf) const
Summary information for an interaction.
Definition Interaction.h:56
const Kinematics & Kine(void) const
Definition Interaction.h:71
const ProcessInfo & ProcInfo(void) const
Definition Interaction.h:70
TParticlePDG * FSPrimLepton(void) const
final state primary lepton
const InitialState & InitState(void) const
Definition Interaction.h:69
static string AsString(KinePhaseSpace_t kps)
double GetKV(KineVar_t kv) const
Abstract interface for an object that computes the elements ( , , etc.) and structure functions ( ,...
virtual double dSigma_dT_dCosTheta_rosenbluth(const Interaction *interaction, double Q_value) const =0
A class encapsulating an enumeration of interaction types (EM, Weak-CC, Weak-NC) and scattering types...
Definition ProcessInfo.h:46
bool IsWeakNC(void) const
bool IsWeakCC(void) const
bool IsEM(void) const
bool IsMEC(void) const
A registry. Provides the container for algorithm configuration parameters.
Definition Registry.h:65
const genie::HadronTensorModelI * fHadronTensorModel
bool ValidProcess(const Interaction *i) const
Can this cross section algorithm handle the input process?
const XSecScaleI * fMECScaleAlg
double Integral(const Interaction *i) const
double PairRatio(const Interaction *i, const std::string &final_state_ratio="pnFraction") const
const XSecIntegratorI * fXSecIntegrator
GSL numerical integrator.
void LoadConfig(void)
Load algorithm configuration.
double fXSecCCScale
External scaling factor for this cross section.
void Configure(const Registry &config)
double Qvalue(const Interaction &interaction) const
const QvalueShifter * fQvalueShifter
double XSec(const Interaction *i, KinePhaseSpace_t k) const
Compute the cross section for the input interaction.
int Pdg(void) const
Definition Target.h:71
Cross Section Integrator Interface.
This class is responsible to compute a scaling factor for the XSec.
Definition XSecScaleI.h:25
static const double kMinQ2Limit
Definition Controls.h:41
bool IsNeutrino(int pdgc)
Definition PDGUtils.cxx:110
bool IsChargedLepton(int pdgc)
Definition PDGUtils.cxx:101
int IonPdgCodeToZ(int pdgc)
Definition PDGUtils.cxx:55
bool IsAntiNeutrino(int pdgc)
Definition PDGUtils.cxx:118
int IonPdgCodeToA(int pdgc)
Definition PDGUtils.cxx:63
double Qvalue(int targetpdg, int nupdg)
Definition MECUtils.cxx:164
bool Getq0q3FromTlCostl(double Tl, double costl, double Enu, double ml, double &q0, double &q3)
Definition MECUtils.cxx:121
THE MAIN GENIE PROJECT NAMESPACE
Definition AlgCmp.h:25
const int kPdgClusterNP
Definition PDGCodes.h:215
const int kPdgProton
Definition PDGCodes.h:81
@ kHT_MEC_EM_pn
@ kHT_MEC_FullAll
@ kHT_MEC_EM_pp
@ kHT_MEC_Fullpn
@ kHT_Undefined
enum genie::HadronTensorType HadronTensorType_t
@ kKVTl
Definition KineVar.h:38
@ kKVctl
Definition KineVar.h:39
enum genie::EKinePhaseSpace KinePhaseSpace_t
@ kRfLab
Definition RefFrame.h:26
const int kPdgTgtC12
Definition PDGCodes.h:202
const UInt_t kISkipProcessChk
if set, skip process validity checks
Definition Interaction.h:47