GENIEGenerator
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
AlvarezRusoCOHPiPDXSec.h
Go to the documentation of this file.
1 //____________________________________________________________________________
2 /*!
3 
4 \class genie::alvarezruso::AlvarezRusoCOHPiPDXsec
5 
6 \brief 5d differential cross section for Alvarez-Ruso Coherent Pion Production xsec
7 
8 \ref
9 
10 \author Steve Dennis
11  University of Warwick, Rutherford Appleton Laboratory
12 
13 \created 05/12/2013
14 
15 \cpright Copyright (c) 2003-2024, The GENIE Collaboration
16  For the full text of the license visit http://copyright.genie-mc.org
17 */
18 //____________________________________________________________________________
19 #ifndef _AR_COH_MULTIDIFF_H_
20 #define _AR_COH_MULTIDIFF_H_
21 
22 #include <TMath.h>
23 #include <Math/SMatrix.h>
24 #include <Math/SVector.h>
25 #include <Math/LorentzVector.h>
26 
31 
32 #include <complex>
33 
34 namespace genie
35 {
36 namespace alvarezruso
37 {
38 
39 class ARWFSolution;
40 
41 enum current_t{kCC, kNC};
42 enum flavour_t{kE, kMu, kTau};
45 
47 {
48  public:
49 
50  AlvarezRusoCOHPiPDXSec(unsigned int Z_, unsigned int A_, const current_t current_,
51  const flavour_t flavour_ = kE, const nutype_t nutype = kNu,
52  const formfactors_t ff_ = kNieves);
54 
55  // 5d cross section per nucleon
56  double DXSec(const double E_nu_, const double E_l_, const double theta_l_,
57  const double phi_l_, const double theta_pi_, const double phi_pi_);
58 
59  void SetDebug(bool debug) { debug_ = debug; };
60 
61  ARConstants & GetConstants(void);
63 
64  int GetSampling() const {
65  return fSampling;
66  }
67 
68  double GetPiMass() const {
69  return fM_pi;
70  }
71  double GetLeptonMass() const {
72  return fM_l;
73  }
74 
75  private:
76  // Fill the ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> >s based on the values from the kinematics
77  void SetKinematics();
78 
79  // Fill values based on the flavour
80  void SetFlavour();
81 
82  // Fill values based on the current
83  void SetCurrent();
84 
85  std::complex<double> DeltaCouplingInMed(ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > delta_momentum,
86  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > pion_momentum, double density_cent);
87  double PiDecayVertex(ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > pion_momentum, double mass);
88  std::complex<double> DeltaPropagatorInMed(ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > delta_momentum);
89  double DeltaWidthPauliBlocked(ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > delta_momentum, double density);
90  double DeltaWidthFree(ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > delta_momentum);
91  std::complex<double> H(unsigned int i, unsigned int j) const;
92  double DifferentialCrossSection();
93  double PionMomentumCM(ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > delta_momentum);
94  double PNVertexFactor(ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > momentum, double mass);
95  double DeltaSelfEnergyRe(double density);
96  double DeltaSelfEnergyIm(double density);
97  double DeltaSelfEnergyConstant(double a, double b, double c, double E);
98  std::complex<double> NucleonPropagator(ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > nucleon_momentum);
99 
100  void NuclearCurrent(ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > q, ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > pdir, ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > pcrs, ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > ppi, std::complex<double> *jPtr);
101 
102  // Fill the wavefunctions
103  void SolveWavefunctions();
104 
105  //______________________________________________________________
106  // Properties
107 
108  bool debug_;
109  // Nucleus
110  unsigned int fZ;
111  unsigned int fA;
112  unsigned int fSampling;
113  // Choice of current
115  // Choice of neutrino flavour
117  // Chocie of initial neutrino type
119  // Choice of form-factor approximation
121  // Constants
123  // Nuclear values
125  // Wavefunction calculator
127 
128  // Kinematics of the event
129  double fE_nu; // initial neutrino energy [GeV]
130  double fE_l; // scattered lepton energy [GeV]
131  double fTheta_l; // scattered lepton angle
132  double fTheta_pi; // pion angle
133  double fPhi; // angle between lepton and pion
134 
135  double fLastE_pi;
136 
137  // Four-momenta of particles and transfers involved
138  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > fQ; // momentum-transfer
139  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > fP_nu; // incoming neutrino
140  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > fP_l; // outgoing lepton/neutrino
141  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > fP_pi; // outgoing pion
142  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > fP_n_i; // incoming (stationary) nucleon
143  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > fP_n_o; // outgoing nucleon
144  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > fP_direct; // intermediary particle (Delta/nucleon) in direct diagrams
145  ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > fP_cross; // intermediary particle (Delta/nucleon) in crossed diagrams
146 
147  // Values and constants which will be used during the running
148  // Get set to one of the mass values above in the constructor
149  double fM_pi; // mass of the pion
150  double fM_l; // mass of the lepton
151  double fg_factor; // Current factor. if(NC) = 1/2 G^2. if(CC) = 1/2 G^2 cos^2(theta_c)
152 
153  // Form factors for PiNDelta decay vertex
158 
159  // Wavefunction
163 
164  std::complex<double> fJ_hadronic[4];
165 };
166 
167 } //namespace alvarezruso
168 } //namespace genie
169 #endif
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > fP_n_i
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > fP_nu
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > fQ
Wave function class for AlvarezRuso Coherent pion production xsec.
double DeltaWidthFree(ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > delta_momentum)
std::complex< double > DeltaPropagatorInMed(ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > delta_momentum)
AlvarezRusoCOHPiPDXSec(unsigned int Z_, unsigned int A_, const current_t current_, const flavour_t flavour_=kE, const nutype_t nutype=kNu, const formfactors_t ff_=kNieves)
double DeltaWidthPauliBlocked(ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > delta_momentum, double density)
double PionMomentumCM(ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > delta_momentum)
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > LorentzVector
static constexpr double b
Definition: Units.h:78
std::complex< double > DeltaCouplingInMed(ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > delta_momentum, ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > pion_momentum, double density_cent)
void NuclearCurrent(ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > q, ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > pdir, ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > pcrs, ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > ppi, std::complex< double > *jPtr)
Abstract base class for Alvarez-Ruso wavefunction solution.
Definition: ARWFSolution.h:32
double PNVertexFactor(ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > momentum, double mass)
double DXSec(const double E_nu_, const double E_l_, const double theta_l_, const double phi_l_, const double theta_pi_, const double phi_pi_)
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > fP_n_o
const double a
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > fP_l
double DeltaSelfEnergyConstant(double a, double b, double c, double E)
std::complex< double > H(unsigned int i, unsigned int j) const
Nucleus class for Alvarez-Ruso Coherent Pion Production xsec.
double PiDecayVertex(ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > pion_momentum, double mass)
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > fP_cross
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > fP_direct
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > fP_pi
std::complex< double > NucleonPropagator(ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > nucleon_momentum)