GENIEGenerator
Loading...
Searching...
No Matches
RosenbluthPXSec.cxx
Go to the documentation of this file.
1//____________________________________________________________________________
2/*
3 Copyright (c) 2003-2025, 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
26using namespace genie;
27using namespace genie::utils;
28using namespace genie::constants;
29
30//____________________________________________________________________________
32XSecAlgorithmI("genie::RosenbluthPXSec")
33{
34
35}
36//____________________________________________________________________________
38XSecAlgorithmI("genie::RosenbluthPXSec", config)
39{
40
41}
42//____________________________________________________________________________
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//____________________________________________________________________________
137double RosenbluthPXSec::Integral(const Interaction * interaction) const
138{
139 double xsec = fXSecIntegrator->Integrate(this,interaction);
140 return xsec;
141}
142//____________________________________________________________________________
143bool 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//____________________________________________________________________________
170//____________________________________________________________________________
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 }
198 fELFF.SetModel(fElFFModel);
199
200 // load XSec Integrator
202 dynamic_cast<const XSecIntegratorI *> (this->SubAlg("XSec-Integrator"));
203 assert(fXSecIntegrator);
204}
205//____________________________________________________________________________
#define pDEBUG
Definition Messenger.h:63
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE,...
Definition Messenger.h:96
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
virtual void Configure(const Registry &config)
Definition Algorithm.cxx:62
const Algorithm * SubAlg(const RgKey &registry_key) const
Pure abstract base class. Defines the ELFormFactorsModelI interface to be implemented by any algorith...
Initial State information.
const Target & Tgt(void) const
int ProbePdg(void) const
double ProbeE(RefFrame_t rf) const
Summary information for an interaction.
Definition Interaction.h:56
const ProcessInfo & ProcInfo(void) const
Definition Interaction.h:70
const InitialState & InitState(void) const
Definition Interaction.h:69
static string AsString(KinePhaseSpace_t kps)
Generated/set kinematical variables for an event.
Definition Kinematics.h:39
A class encapsulating an enumeration of interaction types (EM, Weak-CC, Weak-NC) and scattering types...
Definition ProcessInfo.h:46
bool IsQuasiElastic(void) const
bool IsEM(void) const
A registry. Provides the container for algorithm configuration parameters.
Definition Registry.h:65
double XSec(const Interaction *i, KinePhaseSpace_t k) const
Compute the cross section for the input interaction.
const XSecIntegratorI * fXSecIntegrator
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)
const ELFormFactorsModelI * fElFFModel
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
Definition Target.h:40
int HitNucPdg(void) const
Definition Target.cxx:304
int N(void) const
Definition Target.h:69
int Z(void) const
Definition Target.h:68
double HitNucMass(void) const
Definition Target.cxx:233
Modification of magnetic form factors to match observed enhancement in transverse cross section of th...
virtual bool ValidKinematics(const Interaction *i) const
Is the input kinematical point a physically allowed one?
Cross Section Integrator Interface.
const double epsilon
Basic constants.
bool IsProton(int pdgc)
Definition PDGUtils.cxx:336
bool IsChargedLepton(int pdgc)
Definition PDGUtils.cxx:101
bool IsNeutron(int pdgc)
Definition PDGUtils.cxx:341
Simple functions for loading and reading nucleus dependent keys from config files.
Kinematical utilities.
double Jacobian(const Interaction *const i, KinePhaseSpace_t f, KinePhaseSpace_t t)
double NuclQELXSecSuppression(string kftable, double pmax, const Interaction *in)
Root of GENIE utility namespaces.
THE MAIN GENIE PROJECT NAMESPACE
Definition AlgCmp.h:25
enum genie::EKinePhaseSpace KinePhaseSpace_t
@ kRfHitNucRest
Definition RefFrame.h:30
const UInt_t kISkipProcessChk
if set, skip process validity checks
Definition Interaction.h:47
const UInt_t kIAssumeFreeNucleon
Definition Interaction.h:49