GENIEGenerator
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
RosenbluthPXSec.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 
6  Costas Andreopoulos <c.andreopoulos \at cern.ch>
7  University of Liverpool
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  const ProcessInfo & proc_info = interaction->ProcInfo();
61 
62  int nucpdgc = target.HitNucPdg();
63  double E = init_state.ProbeE(kRfHitNucRest);
64  double Q2 = kinematics.Q2();
65  double M = target.HitNucMass();
66 
67  double E2 = E*E;
68  double E3 = E*E2;
69  double M2 = M*M;
70 
71  // Calculate scattering angle
72  //
73  // Q^2 = 4 * E^2 * sin^2 (theta/2) / ( 1 + 2 * (E/M) * sin^2(theta/2) ) =>
74  // sin^2 (theta/2) = MQ^2 / (4ME^2 - 2EQ^2)
75 
76  double sin2_halftheta = M*Q2 / (4*M*E2 - 2*E*Q2);
77  double sin4_halftheta = TMath::Power(sin2_halftheta, 2.);
78  double cos2_halftheta = 1.-sin2_halftheta;
79  //unused double cos_halftheta = TMath::Sqrt(cos2_halftheta);
80  double tan2_halftheta = sin2_halftheta/cos2_halftheta;
81 
82  // Calculate the elastic nucleon form factors
83  fELFF.Calculate(interaction);
84  double Gm = pdg::IsProton(nucpdgc) ? fELFF.Gmp() : fELFF.Gmn();
85  double Ge = pdg::IsProton(nucpdgc) ? fELFF.Gep() : fELFF.Gen();
86  double Ge2 = Ge*Ge;
87  double Gm2 = Gm*Gm;
88 
89  // Calculate tau and the virtual photon polarization (epsilon)
90  double tau = Q2/(4*M2);
91  double epsilon = 1. / (1. + 2.*(1.+tau)*tan2_halftheta);
92 
93  // Calculate the scattered lepton energy
94  double Ep = E / (1. + 2.*(E/M)*sin2_halftheta);
95  double Ep2 = Ep*Ep;
96 
97  // Calculate the Mott cross section dsigma/dOmega
98  double xsec_mott = (0.25 * kAem2 * Ep / E3) * (cos2_halftheta/sin4_halftheta);
99 
100  // Calculate the electron-nucleon elastic cross section dsigma/dOmega
101  double xsec = xsec_mott * (Ge2 + (tau/epsilon)*Gm2) / (1+tau);
102 
103  // Convert dsigma/dOmega --> dsigma/dQ2
104  // xsec *= (kPi/(Ep*E)); // bug introduced in v3.0.6
105  xsec *= (kPi/(Ep2)); // fixed before v3.2
106 
107  // The algorithm computes dxsec/dQ2
108  // Check whether variable tranformation is needed
109  if(kps!=kPSQ2fE) {
110  double J = utils::kinematics::Jacobian(interaction,kPSQ2fE,kps);
111 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__
112  LOG("Rosenbluth", pDEBUG)
113  << "Jacobian for transformation to: "
114  << KinePhaseSpace::AsString(kps) << ", J = " << J;
115 #endif
116  xsec *= J;
117  }
118 
119  // If requested, return the free nucleon xsec even for input nuclear tgt
120  if( interaction->TestBit(kIAssumeFreeNucleon) ) return xsec;
121 
122  // Take into account the number of nucleons/tgt
123  int NNucl = (pdg::IsProton(nucpdgc)) ? target.Z() : target.N();
124  xsec *= NNucl;
125 
126  // Compute & apply nuclear suppression factor
127  // (R(Q2) is adapted from NeuGEN - see comments therein)
128  double R = nuclear::NuclQELXSecSuppression("Default", 0.5, interaction);
129  xsec *= R;
130 
131  // Apply given overall scaling factor
132  xsec *= fXSecEMScale ;
133 
134  return xsec;
135 }
136 //____________________________________________________________________________
137 double RosenbluthPXSec::Integral(const Interaction * interaction) const
138 {
139  double xsec = fXSecIntegrator->Integrate(this,interaction);
140  return xsec;
141 }
142 //____________________________________________________________________________
143 bool RosenbluthPXSec::ValidProcess(const Interaction * interaction) const
144 {
145  if(interaction->TestBit(kISkipProcessChk)) return true;
146 
147  const ProcessInfo & proc_info = interaction->ProcInfo();
148 
149  if(!proc_info.IsQuasiElastic()) return false;
150  if(!proc_info.IsEM()) return false;
151 
152  const InitialState & init_state = interaction->InitState();
153 
154  int hitnuc = init_state.Tgt().HitNucPdg();
155  bool is_pn = (pdg::IsProton(hitnuc) || pdg::IsNeutron(hitnuc));
156  if (!is_pn) return false;
157 
158  int probe = init_state.ProbePdg();
159  bool is_chgl = pdg::IsChargedLepton(probe);
160  if (!is_chgl) return false;
161 
162  return true;
163 }
164 //____________________________________________________________________________
166 {
167  Algorithm::Configure(config);
168  this->LoadConfig();
169 }
170 //____________________________________________________________________________
171 void RosenbluthPXSec::Configure(string config)
172 {
173  Algorithm::Configure(config);
174  this->LoadConfig();
175 }
176 //____________________________________________________________________________
178 {
179  fElFFModel = 0;
180 
181  // Cross section scaling factor
182  GetParam( "QEL-EM-XSecScale", fXSecEMScale ) ;
183 
184  // load elastic form factors model
185  fElFFModel = dynamic_cast<const ELFormFactorsModelI *> ( this -> SubAlg("ElasticFormFactorsModel" ) ) ;
186 
187  assert(fElFFModel);
188 
189  fCleanUpfElFFModel = false;
190  bool useFFTE = false ;
191  GetParam( "UseElFFTransverseEnhancement", useFFTE ) ;
192  if( useFFTE ) {
193  const ELFormFactorsModelI* sub_alg = fElFFModel;
194  fElFFModel = dynamic_cast<const ELFormFactorsModelI *> ( this -> SubAlg("TransverseEnhancement") ) ;
195  dynamic_cast<const TransverseEnhancementFFModel*>(fElFFModel)->SetElFFBaseModel( sub_alg );
196  fCleanUpfElFFModel = true;
197  }
199 
200  // load XSec Integrator
202  dynamic_cast<const XSecIntegratorI *> (this->SubAlg("XSec-Integrator"));
203  assert(fXSecIntegrator);
204 }
205 //____________________________________________________________________________
Cross Section Calculation Interface.
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
Cross Section Integrator Interface.
double Q2(const Interaction *const i)
Definition: KineUtils.cxx:1077
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:101
enum genie::EKinePhaseSpace KinePhaseSpace_t
double Gen(void) const
Get the computed form factor Gen.
Definition: ELFormFactors.h:56
const double epsilon
bool IsNeutron(int pdgc)
Definition: PDGUtils.cxx:341
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:336
#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 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
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...
virtual double Integrate(const XSecAlgorithmI *model, const Interaction *interaction) const =0
const ELFormFactorsModelI * fElFFModel
double ProbeE(RefFrame_t rf) const
double Integral(const Interaction *i) const
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