GENIEGenerator
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | Private Member Functions | Private Attributes | List of all members
genie::SuSAv2MECPXSec Class Reference

Computes the SuSAv2-MEC model differential cross section. Uses precomputed hadron tensor tables. Is a concrete implementation of the XSecAlgorithmI interface. More...

#include <SuSAv2MECPXSec.h>

Inheritance diagram for genie::SuSAv2MECPXSec:
Inheritance graph
[legend]
Collaboration diagram for genie::SuSAv2MECPXSec:
Collaboration graph
[legend]

Public Member Functions

 SuSAv2MECPXSec ()
 
 SuSAv2MECPXSec (string config)
 
virtual ~SuSAv2MECPXSec ()
 
double XSec (const Interaction *i, KinePhaseSpace_t k) const
 Compute the cross section for the input interaction. More...
 
double Integral (const Interaction *i) const
 
bool ValidProcess (const Interaction *i) const
 Can this cross section algorithm handle the input process? More...
 
void Configure (const Registry &config)
 
void Configure (string config)
 
double PairRatio (const Interaction *i, const std::string &final_state_ratio="pnFraction") const
 
- Public Member Functions inherited from genie::XSecAlgorithmI
virtual ~XSecAlgorithmI ()
 
virtual bool ValidKinematics (const Interaction *i) const
 Is the input kinematical point a physically allowed one? More...
 
- Public Member Functions inherited from genie::Algorithm
virtual ~Algorithm ()
 
virtual void FindConfig (void)
 
virtual const RegistryGetConfig (void) const
 
RegistryGetOwnedConfig (void)
 
virtual const AlgIdId (void) const
 Get algorithm ID. More...
 
virtual AlgStatus_t GetStatus (void) const
 Get algorithm status. More...
 
virtual bool AllowReconfig (void) const
 
virtual AlgCmp_t Compare (const Algorithm *alg) const
 Compare with input algorithm. More...
 
virtual void SetId (const AlgId &id)
 Set algorithm ID. More...
 
virtual void SetId (string name, string config)
 
const AlgorithmSubAlg (const RgKey &registry_key) const
 
void AdoptConfig (void)
 
void AdoptSubstructure (void)
 
virtual void Print (ostream &stream) const
 Print algorithm info. More...
 

Private Member Functions

void LoadConfig (void)
 Load algorithm configuration. More...
 
double Qvalue (const Interaction &interaction) const
 

Private Attributes

double fXSecCCScale
 External scaling factor for this cross section. More...
 
double fXSecNCScale
 
double fXSecEMScale
 
const genie::HadronTensorModelIfHadronTensorModel
 
string fKFTable
 
double fEbHe
 
double fEbLi
 
double fEbC
 
double fEbO
 
double fEbMg
 
double fEbAr
 
double fEbCa
 
double fEbFe
 
double fEbNi
 
double fEbSn
 
double fEbAu
 
double fEbPb
 
const XSecIntegratorIfXSecIntegrator
 GSL numerical integrator. More...
 
const XSecScaleIfMECScaleAlg
 
const QvalueShifterfQvalueShifter
 

Additional Inherited Members

- Static Public Member Functions inherited from genie::Algorithm
static string BuildParamVectKey (const std::string &comm_name, unsigned int i)
 
static string BuildParamVectSizeKey (const std::string &comm_name)
 
static string BuildParamMatKey (const std::string &comm_name, unsigned int i, unsigned int j)
 
static string BuildParamMatRowSizeKey (const std::string &comm_name)
 
static string BuildParamMatColSizeKey (const std::string &comm_name)
 
- Protected Member Functions inherited from genie::XSecAlgorithmI
 XSecAlgorithmI ()
 
 XSecAlgorithmI (string name)
 
 XSecAlgorithmI (string name, string config)
 
- Protected Member Functions inherited from genie::Algorithm
 Algorithm ()
 
 Algorithm (string name)
 
 Algorithm (string name, string config)
 
void Initialize (void)
 
void DeleteConfig (void)
 
void DeleteSubstructure (void)
 
RegistryExtractLocalConfig (const Registry &in) const
 
RegistryExtractLowerConfig (const Registry &in, const string &alg_key) const
 Split an incoming configuration Registry into a block valid for the sub-algo identified by alg_key. More...
 
template<class T >
bool GetParam (const RgKey &name, T &p, bool is_top_call=true) const
 
template<class T >
bool GetParamDef (const RgKey &name, T &p, const T &def) const
 
template<class T >
int GetParamVect (const std::string &comm_name, std::vector< T > &v, bool is_top_call=true) const
 Handle to load vectors of parameters. More...
 
int GetParamVectKeys (const std::string &comm_name, std::vector< RgKey > &k, bool is_top_call=true) const
 
template<class T >
int GetParamMat (const std::string &comm_name, TMatrixT< T > &mat, bool is_top_call=true) const
 Handle to load matrix of parameters. More...
 
template<class T >
int GetParamMatSym (const std::string &comm_name, TMatrixTSym< T > &mat, bool is_top_call=true) const
 
int GetParamMatKeys (const std::string &comm_name, std::vector< RgKey > &k, bool is_top_call=true) const
 
int AddTopRegistry (Registry *rp, bool owns=true)
 add registry with top priority, also update ownership More...
 
int AddLowRegistry (Registry *rp, bool owns=true)
 add registry with lowest priority, also update ownership More...
 
int MergeTopRegistry (const Registry &r)
 
int AddTopRegisties (const vector< Registry * > &rs, bool owns=false)
 Add registries with top priority, also udated Ownerships. More...
 
- Protected Attributes inherited from genie::Algorithm
bool fAllowReconfig
 
bool fOwnsSubstruc
 true if it owns its substructure (sub-algs,...) More...
 
AlgId fID
 algorithm name and configuration set More...
 
vector< Registry * > fConfVect
 
vector< bool > fOwnerships
 ownership for every registry in fConfVect More...
 
AlgStatus_t fStatus
 algorithm execution status More...
 
AlgMapfOwnedSubAlgMp
 local pool for owned sub-algs (taken out of the factory pool) More...
 

Detailed Description

Computes the SuSAv2-MEC model differential cross section. Uses precomputed hadron tensor tables. Is a concrete implementation of the XSecAlgorithmI interface.

Author
Steven Gardiner <gardiner fnal.gov> Fermi National Acclerator Laboratory

Stephen Dolan <stephen.joseph.dolan cern.ch> European Organization for Nuclear Research (CERN)

References:
G.D. Megias et al., "Meson-exchange currents and quasielastic predictions for charged-current neutrino-12C scattering in the superscaling approach," PRD 91 (2015) 073004
Created:
November 2, 2018
License:
Copyright (c) 2003-2024, The GENIE Collaboration For the full text of the license visit http://copyright.genie-mc.org or see $GENIE/LICENSE

Definition at line 40 of file SuSAv2MECPXSec.h.

Constructor & Destructor Documentation

SuSAv2MECPXSec::SuSAv2MECPXSec ( )

Definition at line 28 of file SuSAv2MECPXSec.cxx.

28  : XSecAlgorithmI("genie::SuSAv2MECPXSec")
29 {
30 }
SuSAv2MECPXSec::SuSAv2MECPXSec ( string  config)

Definition at line 32 of file SuSAv2MECPXSec.cxx.

33  : XSecAlgorithmI("genie::SuSAv2MECPXSec", config)
34 {
35 }
SuSAv2MECPXSec::~SuSAv2MECPXSec ( )
virtual

Definition at line 37 of file SuSAv2MECPXSec.cxx.

38 {
39 }

Member Function Documentation

void SuSAv2MECPXSec::Configure ( const Registry config)
virtual

Configure the algorithm with an external registry The registry is merged with the top level registry if it is owned, Otherwise a copy of it is added with the highest priority

Reimplemented from genie::Algorithm.

Definition at line 401 of file SuSAv2MECPXSec.cxx.

References genie::Algorithm::Configure(), and LoadConfig().

402 {
403  Algorithm::Configure(config);
404  this->LoadConfig();
405 }
virtual void Configure(const Registry &config)
Definition: Algorithm.cxx:62
void LoadConfig(void)
Load algorithm configuration.
void genie::SuSAv2MECPXSec::Configure ( string  config)
virtual

Configure the algorithm from the AlgoConfigPool based on param_set string given in input An algorithm contains a vector of registries coming from different xml configuration files, which are loaded according a very precise prioriy This methods will load a number registries in order of priority: 1) "Tunable" parameter set from CommonParametes. This is loaded with the highest prioriry and it is designed to be used for tuning procedure Usage not expected from the user. 2) For every string defined in "CommonParame" the corresponding parameter set will be loaded from CommonParameter.xml 3) parameter set specified by the config string and defined in the xml file of the algorithm 4) if config is not "Default" also the Default parameter set from the same xml file will be loaded Effectively this avoids the repetion of a parameter when it is not changed in the requested configuration

Reimplemented from genie::Algorithm.

double SuSAv2MECPXSec::Integral ( const Interaction i) const
virtual

Integrate the model over the kinematic phase space available to the input interaction (kinematical cuts can be included)

Implements genie::XSecAlgorithmI.

Definition at line 288 of file SuSAv2MECPXSec.cxx.

References fXSecIntegrator, and genie::XSecIntegratorI::Integrate().

289 {
290  double xsec = fXSecIntegrator->Integrate(this,interaction);
291  return xsec;
292 }
const XSecIntegratorI * fXSecIntegrator
GSL numerical integrator.
virtual double Integrate(const XSecAlgorithmI *model, const Interaction *interaction) const =0
void SuSAv2MECPXSec::LoadConfig ( void  )
private

Load algorithm configuration.

Definition at line 413 of file SuSAv2MECPXSec.cxx.

References fEbAr, fEbAu, fEbC, fEbCa, fEbFe, fEbHe, fEbLi, fEbMg, fEbNi, fEbO, fEbPb, fEbSn, fHadronTensorModel, fKFTable, fMECScaleAlg, fQvalueShifter, fXSecCCScale, fXSecEMScale, fXSecIntegrator, fXSecNCScale, genie::Algorithm::GetConfig(), genie::Algorithm::GetParam(), genie::Algorithm::GetParamDef(), genie::Algorithm::Id(), LOG, pERROR, and genie::Algorithm::SubAlg().

Referenced by Configure().

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
Cross Section Integrator Interface.
const genie::HadronTensorModelI * fHadronTensorModel
This class is responsible to compute a scaling factor for the XSec.
Definition: XSecScaleI.h:25
const XSecIntegratorI * fXSecIntegrator
GSL numerical integrator.
virtual const Registry & GetConfig(void) const
Definition: Algorithm.cxx:246
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
Definition: Messenger.h:96
virtual const AlgId & Id(void) const
Get algorithm ID.
Definition: Algorithm.h:98
double fXSecCCScale
External scaling factor for this cross section.
const QvalueShifter * fQvalueShifter
Creates hadron tensor objects for use in cross section calculations.
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 XSecScaleI * fMECScaleAlg
const Algorithm * SubAlg(const RgKey &registry_key) const
Definition: Algorithm.cxx:345
double SuSAv2MECPXSec::PairRatio ( const Interaction i,
const std::string &  final_state_ratio = "pnFraction" 
) const

Definition at line 173 of file SuSAv2MECPXSec.cxx.

References genie::LabFrameHadronTensorI::dSigma_dT_dCosTheta_rosenbluth(), fHadronTensorModel, genie::Interaction::FSPrimLepton(), genie::Kinematics::GetKV(), genie::utils::mec::Getq0q3FromTlCostl(), genie::HadronTensorModelI::GetTensor(), genie::Interaction::InitState(), genie::pdg::IsAntiNeutrino(), genie::ProcessInfo::IsEM(), genie::pdg::IsNeutrino(), genie::kHT_MEC_EM, genie::kHT_MEC_EM_pn, genie::kHT_MEC_EM_pp, genie::kHT_MEC_FullAll, genie::kHT_MEC_Fullpn, genie::kHT_Undefined, genie::Interaction::Kine(), genie::kKVctl, genie::kKVTl, genie::kPdgTgtC12, genie::kRfLab, LOG, genie::InitialState::ProbeE(), genie::InitialState::ProbePdg(), genie::Interaction::ProcInfo(), pWARN, genie::HadronTensorI::q0Max(), genie::HadronTensorI::q0Min(), genie::HadronTensorI::qMagMax(), genie::HadronTensorI::qMagMin(), and Qvalue().

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 }
virtual const HadronTensorI * GetTensor(int tensor_pdg, HadronTensorType_t type) const =0
bool IsNeutrino(int pdgc)
Definition: PDGUtils.cxx:110
const genie::HadronTensorModelI * fHadronTensorModel
virtual double dSigma_dT_dCosTheta_rosenbluth(const Interaction *interaction, double Q_value) const =0
Abstract interface for an object that computes the elements ( , , etc.) and structure functions ( ...
enum genie::HadronTensorType HadronTensorType_t
virtual double q0Max() const =0
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
Definition: Messenger.h:96
bool IsAntiNeutrino(int pdgc)
Definition: PDGUtils.cxx:118
bool Getq0q3FromTlCostl(double Tl, double costl, double Enu, double ml, double &q0, double &q3)
Definition: MECUtils.cxx:121
#define pWARN
Definition: Messenger.h:60
virtual double qMagMax() const =0
virtual double q0Min() const =0
double Qvalue(const Interaction &interaction) const
const int kPdgTgtC12
Definition: PDGCodes.h:202
virtual double qMagMin() const =0
double SuSAv2MECPXSec::Qvalue ( const Interaction interaction) const
private
Todo:
Add more hadron tensors so this scaling is not so terrible

Definition at line 317 of file SuSAv2MECPXSec.cxx.

References fEbAr, fEbC, fEbFe, fEbHe, fEbLi, fEbMg, fEbO, fEbPb, fEbSn, fQvalueShifter, genie::Interaction::InitState(), genie::pdg::IonPdgCodeToA(), genie::ProcessInfo::IsEM(), genie::kPdgTgtC12, genie::Target::Pdg(), genie::InitialState::ProbePdg(), genie::Interaction::ProcInfo(), genie::utils::mec::Qvalue(), and genie::InitialState::Tgt().

Referenced by PairRatio(), and XSec().

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 }
int Pdg(void) const
Definition: Target.h:71
int IonPdgCodeToA(int pdgc)
Definition: PDGUtils.cxx:63
double Qvalue(int targetpdg, int nupdg)
Definition: MECUtils.cxx:164
int ProbePdg(void) const
Definition: InitialState.h:64
bool IsEM(void) const
const QvalueShifter * fQvalueShifter
const int kPdgTgtC12
Definition: PDGCodes.h:202
const InitialState & InitState(void) const
Definition: Interaction.h:69
const ProcessInfo & ProcInfo(void) const
Definition: Interaction.h:70
const Target & Tgt(void) const
Definition: InitialState.h:66
bool SuSAv2MECPXSec::ValidProcess ( const Interaction i) const
virtual

Can this cross section algorithm handle the input process?

Implements genie::XSecAlgorithmI.

Definition at line 294 of file SuSAv2MECPXSec.cxx.

References genie::Interaction::InitState(), genie::pdg::IsAntiNeutrino(), genie::pdg::IsChargedLepton(), genie::ProcessInfo::IsEM(), genie::ProcessInfo::IsMEC(), genie::pdg::IsNeutrino(), genie::ProcessInfo::IsWeakCC(), genie::kISkipProcessChk, genie::InitialState::ProbePdg(), and genie::Interaction::ProcInfo().

Referenced by XSec().

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 }
bool IsWeakCC(void) const
bool IsNeutrino(int pdgc)
Definition: PDGUtils.cxx:110
bool IsChargedLepton(int pdgc)
Definition: PDGUtils.cxx:101
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
bool IsMEC(void) const
bool IsEM(void) const
const UInt_t kISkipProcessChk
if set, skip process validity checks
Definition: Interaction.h:47
double SuSAv2MECPXSec::XSec ( const Interaction i,
KinePhaseSpace_t  k 
) const
virtual

Compute the cross section for the input interaction.

Implements genie::XSecAlgorithmI.

Definition at line 41 of file SuSAv2MECPXSec.cxx.

References genie::KinePhaseSpace::AsString(), genie::LabFrameHadronTensorI::dSigma_dT_dCosTheta_rosenbluth(), fHadronTensorModel, genie::FermiMomentumTable::FindClosestKF(), fKFTable, fMECScaleAlg, genie::Interaction::FSPrimLepton(), fXSecCCScale, fXSecEMScale, fXSecNCScale, genie::Kinematics::GetKV(), genie::utils::mec::Getq0q3FromTlCostl(), genie::XSecScaleI::GetScaling(), genie::FermiMomentumTablePool::GetTable(), genie::HadronTensorModelI::GetTensor(), genie::Target::HitNucPdg(), genie::Interaction::InitState(), genie::FermiMomentumTablePool::Instance(), genie::pdg::IonPdgCodeToA(), genie::pdg::IonPdgCodeToZ(), genie::pdg::IsAntiNeutrino(), genie::ProcessInfo::IsEM(), genie::pdg::IsNeutrino(), genie::ProcessInfo::IsWeakCC(), genie::ProcessInfo::IsWeakNC(), genie::kHT_MEC_EM, genie::kHT_MEC_FullAll, genie::kHT_Undefined, genie::Interaction::Kine(), genie::kKVctl, genie::kKVTl, genie::controls::kMinQ2Limit, genie::kPdgClusterNP, genie::kPdgProton, genie::kPdgTgtC12, genie::kPSTlctl, genie::kRfLab, LOG, pDEBUG, genie::Target::Pdg(), genie::InitialState::ProbeE(), genie::InitialState::ProbePdg(), genie::Interaction::ProcInfo(), pWARN, genie::HadronTensorI::q0Max(), genie::HadronTensorI::q0Min(), genie::utils::kinematics::Q2(), genie::HadronTensorI::qMagMax(), genie::HadronTensorI::qMagMin(), Qvalue(), genie::InitialState::Tgt(), and ValidProcess().

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 }
virtual const HadronTensorI * GetTensor(int tensor_pdg, HadronTensorType_t type) const =0
bool IsWeakCC(void) const
bool IsNeutrino(int pdgc)
Definition: PDGUtils.cxx:110
double Q2(const Interaction *const i)
Definition: KineUtils.cxx:1077
const genie::HadronTensorModelI * fHadronTensorModel
const int kPdgClusterNP
Definition: PDGCodes.h:215
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
Abstract interface for an object that computes the elements ( , , etc.) and structure functions ( ...
A table of Fermi momentum constants.
enum genie::HadronTensorType HadronTensorType_t
virtual double q0Max() const =0
static const double kMinQ2Limit
Definition: Controls.h:41
bool IsWeakNC(void) const
Singleton class to load &amp; serve tables of Fermi momentum constants.
#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
bool Getq0q3FromTlCostl(double Tl, double costl, double Enu, double ml, double &q0, double &q3)
Definition: MECUtils.cxx:121
#define pWARN
Definition: Messenger.h:60
virtual double qMagMax() const =0
virtual double q0Min() const =0
bool IsEM(void) const
double Qvalue(const Interaction &interaction) const
double fXSecCCScale
External scaling factor for this cross section.
virtual double GetScaling(const Interaction &) const =0
const int kPdgTgtC12
Definition: PDGCodes.h:202
bool ValidProcess(const Interaction *i) const
Can this cross section algorithm handle the input process?
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
const XSecScaleI * fMECScaleAlg
#define pDEBUG
Definition: Messenger.h:63

Member Data Documentation

double genie::SuSAv2MECPXSec::fEbAr
private

Definition at line 86 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

double genie::SuSAv2MECPXSec::fEbAu
private

Definition at line 91 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig().

double genie::SuSAv2MECPXSec::fEbC
private

Definition at line 83 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

double genie::SuSAv2MECPXSec::fEbCa
private

Definition at line 87 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig().

double genie::SuSAv2MECPXSec::fEbFe
private

Definition at line 88 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

double genie::SuSAv2MECPXSec::fEbHe
private

Definition at line 81 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

double genie::SuSAv2MECPXSec::fEbLi
private

Definition at line 82 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

double genie::SuSAv2MECPXSec::fEbMg
private

Definition at line 85 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

double genie::SuSAv2MECPXSec::fEbNi
private

Definition at line 89 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig().

double genie::SuSAv2MECPXSec::fEbO
private

Definition at line 84 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

double genie::SuSAv2MECPXSec::fEbPb
private

Definition at line 92 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

double genie::SuSAv2MECPXSec::fEbSn
private

Definition at line 90 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

const genie::HadronTensorModelI* genie::SuSAv2MECPXSec::fHadronTensorModel
private

Definition at line 75 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), PairRatio(), and XSec().

string genie::SuSAv2MECPXSec::fKFTable
private

Definition at line 78 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and XSec().

const XSecScaleI* genie::SuSAv2MECPXSec::fMECScaleAlg
private

Definition at line 97 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and XSec().

const QvalueShifter* genie::SuSAv2MECPXSec::fQvalueShifter
private

Definition at line 98 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

double genie::SuSAv2MECPXSec::fXSecCCScale
private

External scaling factor for this cross section.

Definition at line 71 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and XSec().

double genie::SuSAv2MECPXSec::fXSecEMScale
private

Definition at line 73 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and XSec().

const XSecIntegratorI* genie::SuSAv2MECPXSec::fXSecIntegrator
private

GSL numerical integrator.

Definition at line 95 of file SuSAv2MECPXSec.h.

Referenced by Integral(), and LoadConfig().

double genie::SuSAv2MECPXSec::fXSecNCScale
private

Definition at line 72 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and XSec().


The documentation for this class was generated from the following files: