RosenbluthPXSec.cxx
Go to the documentation of this file.
1 //____________________________________________________________________________
2 /*
3  Copyright (c) 2003-2020, The GENIE Collaboration
4  For the full text of the license visit http://copyright.genie-mc.org
5 
6  Costas Andreopoulos <constantinos.andreopoulos \at cern.ch>
7  University of Liverpool & STFC Rutherford Appleton Laboratory
8 */
9 //____________________________________________________________________________
10 
11 #include <TMath.h>
12 
25 
26 using namespace genie;
27 using namespace genie::utils;
28 using namespace genie::constants;
29 
30 //____________________________________________________________________________
32 XSecAlgorithmI("genie::RosenbluthPXSec")
33 {
34 
35 }
36 //____________________________________________________________________________
38 XSecAlgorithmI("genie::RosenbluthPXSec", config)
39 {
40 
41 }
42 //____________________________________________________________________________
44 {
45  if (fCleanUpfElFFModel) {
46  delete fElFFModel;
47  }
48 }
49 //____________________________________________________________________________
51  const Interaction * interaction, KinePhaseSpace_t kps) const
52 {
53  if(! this -> ValidProcess (interaction) ) return 0.;
54  if(! this -> ValidKinematics (interaction) ) return 0.;
55 
56  // Get interaction information
57  const InitialState & init_state = interaction -> InitState();
58  const Kinematics & kinematics = interaction -> Kine();
59  const Target & target = init_state.Tgt();
60 
61  int nucpdgc = target.HitNucPdg();
62  double E = init_state.ProbeE(kRfHitNucRest);
63  double Q2 = kinematics.Q2();
64  double M = target.HitNucMass();
65 
66  double E2 = E*E;
67  double E3 = E*E2;
68  double M2 = M*M;
69 
70  // Calculate scattering angle
71  //
72  // Q^2 = 4 * E^2 * sin^2 (theta/2) / ( 1 + 2 * (E/M) * sin^2(theta/2) ) =>
73  // sin^2 (theta/2) = MQ^2 / (4ME^2 - 2EQ^2)
74 
75  double sin2_halftheta = M*Q2 / (4*M*E2 - 2*E*Q2);
76  double sin4_halftheta = TMath::Power(sin2_halftheta, 2.);
77  double cos2_halftheta = 1.-sin2_halftheta;
78  //unused double cos_halftheta = TMath::Sqrt(cos2_halftheta);
79  double tan2_halftheta = sin2_halftheta/cos2_halftheta;
80 
81  // Calculate the elastic nucleon form factors
82  fELFF.Calculate(interaction);
83  double Gm = pdg::IsProton(nucpdgc) ? fELFF.Gmp() : fELFF.Gmn();
84  double Ge = pdg::IsProton(nucpdgc) ? fELFF.Gep() : fELFF.Gen();
85  double Ge2 = Ge*Ge;
86  double Gm2 = Gm*Gm;
87 
88  // Calculate tau and the virtual photon polarization (epsilon)
89  double tau = Q2/(4*M2);
90  double epsilon = 1. / (1. + 2.*(1.+tau)*tan2_halftheta);
91 
92  // Calculate the scattered lepton energy
93  double Ep = E / (1. + 2.*(E/M)*sin2_halftheta);
94  double Ep2 = Ep*Ep;
95 
96  // Calculate the Mott cross section dsigma/dOmega
97  double xsec_mott = (0.25 * kAem2 * Ep / E3) * (cos2_halftheta/sin4_halftheta);
98 
99  // Calculate the electron-nucleon elastic cross section dsigma/dOmega
100  double xsec = xsec_mott * (Ge2 + (tau/epsilon)*Gm2) / (1+tau);
101 
102  // Convert dsigma/dOmega --> dsigma/dQ2
103  // xsec *= (kPi/(Ep*E)); // bug introduced in v3.0.6
104  xsec *= (kPi/(Ep2)); // fixed before v3.2
105 
106  // The algorithm computes dxsec/dQ2
107  // Check whether variable tranformation is needed
108  if(kps!=kPSQ2fE) {
109  double J = utils::kinematics::Jacobian(interaction,kPSQ2fE,kps);
110 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__
111  LOG("Rosenbluth", pDEBUG)
112  << "Jacobian for transformation to: "
113  << KinePhaseSpace::AsString(kps) << ", J = " << J;
114 #endif
115  xsec *= J;
116  }
117 
118  // If requested, return the free nucleon xsec even for input nuclear tgt
119  if( interaction->TestBit(kIAssumeFreeNucleon) ) return xsec;
120 
121  // Take into account the number of nucleons/tgt
122  int NNucl = (pdg::IsProton(nucpdgc)) ? target.Z() : target.N();
123  xsec *= NNucl;
124 
125  // Compute & apply nuclear suppression factor
126  // (R(Q2) is adapted from NeuGEN - see comments therein)
127  double R = nuclear::NuclQELXSecSuppression("Default", 0.5, interaction);
128  xsec *= R;
129 
130  return xsec;
131 }
132 //____________________________________________________________________________
134 {
135  double xsec = fXSecIntegrator->Integrate(this,interaction);
136  return xsec;
137 }
138 //____________________________________________________________________________
140 {
141  if(interaction->TestBit(kISkipProcessChk)) return true;
142 
143  const ProcessInfo & proc_info = interaction->ProcInfo();
144 
145  if(!proc_info.IsQuasiElastic()) return false;
146  if(!proc_info.IsEM()) return false;
147 
148  const InitialState & init_state = interaction->InitState();
149 
150  int hitnuc = init_state.Tgt().HitNucPdg();
151  bool is_pn = (pdg::IsProton(hitnuc) || pdg::IsNeutron(hitnuc));
152  if (!is_pn) return false;
153 
154  int probe = init_state.ProbePdg();
155  bool is_chgl = pdg::IsChargedLepton(probe);
156  if (!is_chgl) return false;
157 
158  return true;
159 }
160 //____________________________________________________________________________
162 {
163  Algorithm::Configure(config);
164  this->LoadConfig();
165 }
166 //____________________________________________________________________________
168 {
169  Algorithm::Configure(config);
170  this->LoadConfig();
171 }
172 //____________________________________________________________________________
174 {
175  fElFFModel = 0;
176 
177  // load elastic form factors model
178  fElFFModel = dynamic_cast<const ELFormFactorsModelI *> ( this -> SubAlg("ElasticFormFactorsModel" ) ) ;
179 
180  assert(fElFFModel);
181 
182  fCleanUpfElFFModel = false;
183  bool useFFTE = false ;
184  GetParam( "UseElFFTransverseEnhancement", useFFTE ) ;
185  if( useFFTE ) {
186  const ELFormFactorsModelI* sub_alg = fElFFModel;
187  fElFFModel = dynamic_cast<const ELFormFactorsModelI *> ( this -> SubAlg("TransverseEnhancement") ) ;
188  dynamic_cast<const TransverseEnhancementFFModel*>(fElFFModel)->SetElFFBaseModel( sub_alg );
189  fCleanUpfElFFModel = true;
190  }
192 
193  // load XSec Integrator
195  dynamic_cast<const XSecIntegratorI *> (this->SubAlg("XSec-Integrator"));
196  assert(fXSecIntegrator);
197 }
198 //____________________________________________________________________________
Cross Section Calculation Interface.
Basic constants.
double XSec(const Interaction *i, KinePhaseSpace_t k) const
Compute the cross section for the input interaction.
double J(double q0, double q3, double Enu, double ml)
Definition: MECUtils.cxx:147
THE MAIN GENIE PROJECT NAMESPACE
Definition: AlgCmp.h:25
Cross Section Integrator Interface.
double Q2(const Interaction *const i)
Definition: KineUtils.cxx:1064
int HitNucPdg(void) const
Definition: Target.cxx:304
bool IsQuasiElastic(void) const
Definition: ProcessInfo.cxx:69
double HitNucMass(void) const
Definition: Target.cxx:233
Generated/set kinematical variables for an event.
Definition: Kinematics.h:39
bool IsChargedLepton(int pdgc)
Definition: PDGUtils.cxx:98
enum genie::EKinePhaseSpace KinePhaseSpace_t
double Gen(void) const
Get the computed form factor Gen.
Definition: ELFormFactors.h:56
bool IsNeutron(int pdgc)
Definition: PDGUtils.cxx:338
Summary information for an interaction.
Definition: Interaction.h:56
virtual bool ValidKinematics(const Interaction *i) const
Is the input kinematical point a physically allowed one?
const XSecIntegratorI * fXSecIntegrator
bool IsProton(int pdgc)
Definition: PDGUtils.cxx:333
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
Definition: Messenger.h:96
Pure abstract base class. Defines the ELFormFactorsModelI interface to be implemented by any algorith...
bool ValidProcess(const Interaction *i) const
Can this cross section algorithm handle the input process?
static Config * config
Definition: config.cpp:1054
static const double kAem2
Definition: Constants.h:57
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
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
Definition: Target.h:40
virtual void Configure(const Registry &config)
Definition: Algorithm.cxx:62
int ProbePdg(void) const
Definition: InitialState.h:64
int Z(void) const
Definition: Target.h:68
void Calculate(const Interaction *interaction)
Calculate the form factors for the input interaction using the attached algorithm.
bool IsEM(void) const
void Configure(const Registry &config)
double Gmn(void) const
Get the computed form factor Gmn.
Definition: ELFormFactors.h:59
int N(void) const
Definition: Target.h:69
A registry. Provides the container for algorithm configuration parameters.
Definition: Registry.h:65
const UInt_t kIAssumeFreeNucleon
Definition: Interaction.h:49
E
Definition: 018_def.c:13
Definition: 018_def.c:13
virtual double Integrate(const XSecAlgorithmI *model, const Interaction *interaction) const =0
double Gmp(void) const
Get the computed form factor Gmp.
Definition: ELFormFactors.h:53
double Jacobian(const Interaction *const i, KinePhaseSpace_t f, KinePhaseSpace_t t)
Definition: KineUtils.cxx:130
double Gep(void) const
Get the computed form factor Gep.
Definition: ELFormFactors.h:50
const InitialState & InitState(void) const
Definition: Interaction.h:69
const ProcessInfo & ProcInfo(void) const
Definition: Interaction.h:70
double Q2(bool selected=false) const
Definition: Kinematics.cxx:125
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
const Target & Tgt(void) const
Definition: InitialState.h:66
void SetModel(const ELFormFactorsModelI *model)
Attach an algorithm.
Modification of magnetic form factors to match observed enhancement in transverse cross section of th...
const ELFormFactorsModelI * fElFFModel
double ProbeE(RefFrame_t rf) const
static const double kPi
Definition: Constants.h:37
double Integral(const Interaction *i) const
Root of GENIE utility namespaces.
const UInt_t kISkipProcessChk
if set, skip process validity checks
Definition: Interaction.h:47
double NuclQELXSecSuppression(string kftable, double pmax, const Interaction *in)
Initial State information.
Definition: InitialState.h:48
#define pDEBUG
Definition: Messenger.h:63
const Algorithm * SubAlg(const RgKey &registry_key) const
Definition: Algorithm.cxx:345