GENIEGenerator
Loading...
Searching...
No Matches
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:
[legend]
Collaboration diagram for genie::SuSAv2MECPXSec:
[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.
double Integral (const Interaction *i) const
bool ValidProcess (const Interaction *i) const
 Can this cross section algorithm handle the input process?
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?
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.
virtual AlgStatus_t GetStatus (void) const
 Get algorithm status.
virtual bool AllowReconfig (void) const
virtual AlgCmp_t Compare (const Algorithm *alg) const
 Compare with input algorithm.
virtual void SetId (const AlgId &id)
 Set algorithm ID.
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.

Private Member Functions

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

Private Attributes

double fXSecCCScale
 External scaling factor for this cross section.
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.
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.
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.
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.
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
int AddLowRegistry (Registry *rp, bool owns=true)
 add registry with lowest priority, also update ownership
int MergeTopRegistry (const Registry &r)
int AddTopRegisties (const vector< Registry * > &rs, bool owns=false)
 Add registries with top priority, also udated Ownerships.
Protected Attributes inherited from genie::Algorithm
bool fAllowReconfig
bool fOwnsSubstruc
 true if it owns its substructure (sub-algs,...)
AlgId fID
 algorithm name and configuration set
vector< Registry * > fConfVect
vector< bool > fOwnerships
 ownership for every registry in fConfVect
AlgStatus_t fStatus
 algorithm execution status
AlgMapfOwnedSubAlgMp
 local pool for owned sub-algs (taken out of the factory pool)

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 \at fnal.gov> Fermi National Acclerator Laboratory

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

References:\n 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:\n November 2, 2018
License:\n Copyright (c) 2003-2025, 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() [1/2]

SuSAv2MECPXSec::SuSAv2MECPXSec ( )

Definition at line 28 of file SuSAv2MECPXSec.cxx.

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

References genie::XSecAlgorithmI::XSecAlgorithmI().

◆ SuSAv2MECPXSec() [2/2]

SuSAv2MECPXSec::SuSAv2MECPXSec ( string config)

Definition at line 32 of file SuSAv2MECPXSec.cxx.

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

References genie::XSecAlgorithmI::XSecAlgorithmI().

◆ ~SuSAv2MECPXSec()

SuSAv2MECPXSec::~SuSAv2MECPXSec ( )
virtual

Definition at line 37 of file SuSAv2MECPXSec.cxx.

38{
39}

Member Function Documentation

◆ Configure() [1/2]

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.

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.

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

◆ Configure() [2/2]

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.

◆ Integral()

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.

289{
290 double xsec = fXSecIntegrator->Integrate(this,interaction);
291 return xsec;
292}
const XSecIntegratorI * fXSecIntegrator
GSL numerical integrator.

References fXSecIntegrator.

◆ LoadConfig()

void SuSAv2MECPXSec::LoadConfig ( void )
private

Load algorithm configuration.

Definition at line 413 of file SuSAv2MECPXSec.cxx.

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 LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE,...
Definition Messenger.h:96
virtual const Registry & GetConfig(void) const
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
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
const genie::HadronTensorModelI * fHadronTensorModel
const XSecScaleI * fMECScaleAlg
double fXSecCCScale
External scaling factor for this cross section.
const QvalueShifter * fQvalueShifter

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().

◆ PairRatio()

double SuSAv2MECPXSec::PairRatio ( const Interaction * i,
const std::string & final_state_ratio = "pnFraction" ) const

Definition at line 173 of file SuSAv2MECPXSec.cxx.

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}
#define pWARN
Definition Messenger.h:60
virtual double q0Min() const =0
virtual double qMagMax() const =0
virtual double q0Max() const =0
virtual double qMagMin() const =0
virtual double dSigma_dT_dCosTheta_rosenbluth(const Interaction *interaction, double Q_value) const =0
double Qvalue(const Interaction &interaction) const
bool IsNeutrino(int pdgc)
Definition PDGUtils.cxx:110
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
@ 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
@ kRfLab
Definition RefFrame.h:26
const int kPdgTgtC12
Definition PDGCodes.h:202

References genie::LabFrameHadronTensorI::dSigma_dT_dCosTheta_rosenbluth(), fHadronTensorModel, genie::Interaction::FSPrimLepton(), genie::Kinematics::GetKV(), genie::utils::mec::Getq0q3FromTlCostl(), 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().

◆ Qvalue()

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.

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}
const Target & Tgt(void) const
int ProbePdg(void) const
const ProcessInfo & ProcInfo(void) const
Definition Interaction.h:70
const InitialState & InitState(void) const
Definition Interaction.h:69
bool IsEM(void) const
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

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().

◆ ValidProcess()

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.

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 IsMEC(void) const
bool IsChargedLepton(int pdgc)
Definition PDGUtils.cxx:101
const UInt_t kISkipProcessChk
if set, skip process validity checks
Definition Interaction.h:47

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().

◆ XSec()

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.

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 ) {
141 FermiMomentumTablePool * kftp = FermiMomentumTablePool::Instance();
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}
#define pDEBUG
Definition Messenger.h:63
const FermiMomentumTable * GetTable(string name)
static FermiMomentumTablePool * Instance(void)
double FindClosestKF(int target_pdgc, int nucleon_pdgc) const
static string AsString(KinePhaseSpace_t kps)
bool IsWeakNC(void) const
bool ValidProcess(const Interaction *i) const
Can this cross section algorithm handle the input process?
static const double kMinQ2Limit
Definition Controls.h:41
int IonPdgCodeToZ(int pdgc)
Definition PDGUtils.cxx:55
double Q2(const Interaction *const i)
const int kPdgClusterNP
Definition PDGCodes.h:215
const int kPdgProton
Definition PDGCodes.h:81

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::FermiMomentumTablePool::GetTable(), 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::HadronTensorI::qMagMax(), genie::HadronTensorI::qMagMin(), Qvalue(), genie::InitialState::Tgt(), and ValidProcess().

Member Data Documentation

◆ fEbAr

double genie::SuSAv2MECPXSec::fEbAr
private

Definition at line 86 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

◆ fEbAu

double genie::SuSAv2MECPXSec::fEbAu
private

Definition at line 91 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig().

◆ fEbC

double genie::SuSAv2MECPXSec::fEbC
private

Definition at line 83 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

◆ fEbCa

double genie::SuSAv2MECPXSec::fEbCa
private

Definition at line 87 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig().

◆ fEbFe

double genie::SuSAv2MECPXSec::fEbFe
private

Definition at line 88 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

◆ fEbHe

double genie::SuSAv2MECPXSec::fEbHe
private

Definition at line 81 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

◆ fEbLi

double genie::SuSAv2MECPXSec::fEbLi
private

Definition at line 82 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

◆ fEbMg

double genie::SuSAv2MECPXSec::fEbMg
private

Definition at line 85 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

◆ fEbNi

double genie::SuSAv2MECPXSec::fEbNi
private

Definition at line 89 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig().

◆ fEbO

double genie::SuSAv2MECPXSec::fEbO
private

Definition at line 84 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

◆ fEbPb

double genie::SuSAv2MECPXSec::fEbPb
private

Definition at line 92 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

◆ fEbSn

double genie::SuSAv2MECPXSec::fEbSn
private

Definition at line 90 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

◆ fHadronTensorModel

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

Definition at line 75 of file SuSAv2MECPXSec.h.

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

◆ fKFTable

string genie::SuSAv2MECPXSec::fKFTable
private

Definition at line 78 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and XSec().

◆ fMECScaleAlg

const XSecScaleI* genie::SuSAv2MECPXSec::fMECScaleAlg
private

Definition at line 97 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and XSec().

◆ fQvalueShifter

const QvalueShifter* genie::SuSAv2MECPXSec::fQvalueShifter
private

Definition at line 98 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and Qvalue().

◆ fXSecCCScale

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().

◆ fXSecEMScale

double genie::SuSAv2MECPXSec::fXSecEMScale
private

Definition at line 73 of file SuSAv2MECPXSec.h.

Referenced by LoadConfig(), and XSec().

◆ fXSecIntegrator

const XSecIntegratorI* genie::SuSAv2MECPXSec::fXSecIntegrator
private

GSL numerical integrator.

Definition at line 95 of file SuSAv2MECPXSec.h.

Referenced by Integral(), and LoadConfig().

◆ fXSecNCScale

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: