GENIEGenerator
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SuSAv2MECPXSec.cxx
Go to the documentation of this file.
1 //_________________________________________________________________________
2 /*
3  Copyright (c) 2003-2024, 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 
25 using namespace genie;
26 
27 //_________________________________________________________________________
28 SuSAv2MECPXSec::SuSAv2MECPXSec() : XSecAlgorithmI("genie::SuSAv2MECPXSec")
29 {
30 }
31 //_________________________________________________________________________
33  : XSecAlgorithmI("genie::SuSAv2MECPXSec", config)
34 {
35 }
36 //_________________________________________________________________________
38 {
39 }
40 //_________________________________________________________________________
41 double 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 
57  HadronTensorType_t tensor_type = kHT_Undefined;
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 "
165  << KinePhaseSpace::AsString(kPSTlctl) << " to "
166  << KinePhaseSpace::AsString(kps);
167  xsec = 0.;
168  }
169 
170  return xsec;
171 }
172 //_________________________________________________________________________
173 double 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
204  tensor_type) );
205 
206  const LabFrameHadronTensorI* tensor_pn
208  pn_tensor_type) );
209 
210  const LabFrameHadronTensorI* tensor_pp
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 //_________________________________________________________________________
288 double SuSAv2MECPXSec::Integral(const Interaction* interaction) const
289 {
290  double xsec = fXSecIntegrator->Integrate(this,interaction);
291  return xsec;
292 }
293 //_________________________________________________________________________
294 bool 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 //_________________________________________________________________________
317 double 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 //____________________________________________________________________________
407 void 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 }
Cross Section Calculation Interface.
virtual const HadronTensorI * GetTensor(int tensor_pdg, HadronTensorType_t type) const =0
bool IsWeakCC(void) const
bool IsNeutrino(int pdgc)
Definition: PDGUtils.cxx:110
#define pERROR
Definition: Messenger.h:59
Cross Section Integrator Interface.
double Q2(const Interaction *const i)
Definition: KineUtils.cxx:1077
int HitNucPdg(void) const
Definition: Target.cxx:304
const genie::HadronTensorModelI * fHadronTensorModel
const int kPdgClusterNP
Definition: PDGCodes.h:215
This class is responsible to compute a scaling factor for the XSec.
Definition: XSecScaleI.h:25
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
int IonPdgCodeToA(int pdgc)
Definition: PDGUtils.cxx:63
static FermiMomentumTablePool * Instance(void)
virtual double dSigma_dT_dCosTheta_rosenbluth(const Interaction *interaction, double Q_value) const =0
const XSecIntegratorI * fXSecIntegrator
GSL numerical integrator.
bool IsChargedLepton(int pdgc)
Definition: PDGUtils.cxx:101
Abstract interface for an object that computes the elements ( , , etc.) and structure functions ( ...
A table of Fermi momentum constants.
enum genie::HadronTensorType HadronTensorType_t
enum genie::EKinePhaseSpace KinePhaseSpace_t
virtual double q0Max() const =0
virtual const Registry & GetConfig(void) const
Definition: Algorithm.cxx:246
static const double kMinQ2Limit
Definition: Controls.h:41
double Qvalue(int targetpdg, int nupdg)
Definition: MECUtils.cxx:164
Summary information for an interaction.
Definition: Interaction.h:56
bool IsWeakNC(void) const
Singleton class to load &amp; serve tables of Fermi momentum constants.
double Integral(const Interaction *i) const
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
Definition: Messenger.h:96
const FermiMomentumTable * GetTable(string name)
static string AsString(KinePhaseSpace_t kps)
A class encapsulating an enumeration of interaction types (EM, Weak-CC, Weak-NC) and scattering types...
Definition: ProcessInfo.h:46
bool IsAntiNeutrino(int pdgc)
Definition: PDGUtils.cxx:118
const Kinematics & Kine(void) const
Definition: Interaction.h:71
virtual void Configure(const Registry &config)
Definition: Algorithm.cxx:62
int ProbePdg(void) const
Definition: InitialState.h:64
bool Getq0q3FromTlCostl(double Tl, double costl, double Enu, double ml, double &q0, double &q3)
Definition: MECUtils.cxx:121
void LoadConfig(void)
Load algorithm configuration.
double GetKV(KineVar_t kv) const
Definition: Kinematics.cxx:323
#define pWARN
Definition: Messenger.h:60
virtual double qMagMax() const =0
void Configure(const Registry &config)
virtual double q0Min() const =0
TParticlePDG * FSPrimLepton(void) const
final state primary lepton
bool IsMEC(void) const
bool IsEM(void) const
double Qvalue(const Interaction &interaction) const
virtual const AlgId & Id(void) const
Get algorithm ID.
Definition: Algorithm.h:98
A registry. Provides the container for algorithm configuration parameters.
Definition: Registry.h:65
double fXSecCCScale
External scaling factor for this cross section.
virtual double GetScaling(const Interaction &) const =0
const QvalueShifter * fQvalueShifter
const int kPdgTgtC12
Definition: PDGCodes.h:202
bool ValidProcess(const Interaction *i) const
Can this cross section algorithm handle the input process?
const InitialState & InitState(void) const
Definition: Interaction.h:69
const ProcessInfo & ProcInfo(void) const
Definition: Interaction.h:70
Creates hadron tensor objects for use in cross section calculations.
int IonPdgCodeToZ(int pdgc)
Definition: PDGUtils.cxx:55
virtual double qMagMin() const =0
const int kPdgProton
Definition: PDGCodes.h:81
double FindClosestKF(int target_pdgc, int nucleon_pdgc) const
bool GetParamDef(const RgKey &name, T &p, const T &def) const
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
const Target & Tgt(void) const
Definition: InitialState.h:66
double PairRatio(const Interaction *i, const std::string &final_state_ratio="pnFraction") const
const XSecScaleI * fMECScaleAlg
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
Definition: Interaction.h:47
#define pDEBUG
Definition: Messenger.h:63
const Algorithm * SubAlg(const RgKey &registry_key) const
Definition: Algorithm.cxx:345