GENIEGenerator
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
HadronTensorI.h
Go to the documentation of this file.
1 //____________________________________________________________________________
2 /*!
3 
4 \class genie::HadronTensorI
5 
6 \brief Abstract interface for an object that computes the elements
7  a hadron tensor \f$W^{\mu\nu}\f$. Also computes the contraction
8  of the hadron tensor with the lepton tensor
9  \f$L_{\mu\nu}W^{\mu\nu}\f$ for one or more kinds of projectile
10  (e.g., neutrinos, electrons)
11 
12 \author Steven Gardiner <gardiner \at fnal.gov>
13  Liang Liu <liangliu \at fnal.gov>
14  Fermi National Accelerator Laboratory
15 
16 \created August 23, 2018
17 
18 \cpright Copyright (c) 2003-2024, The GENIE Collaboration
19  For the full text of the license visit http://copyright.genie-mc.org
20  or see $GENIE/LICENSE
21 
22 */
23 //____________________________________________________________________________
24 
25 #ifndef HADRON_TENSORI_H
26 #define HADRON_TENSORI_H
27 
28 // standard library includes
29 #include <complex>
30 
31 // GENIE includes
34 
35 namespace genie {
36 
37 /// Enumerated type that describes the physics represented by a particular
38 /// hadron tensor
39 /// \todo Document enum values
40 typedef enum HadronTensorType {
54 
58 
62 
66 
70 
74 
78 
82 
86 
89 
92 }
94 
96 
97 public:
98 
99  inline virtual ~HadronTensorI() {}
100 
101  /// \name Tensor elements
102  /// \brief Functions that return the elements of the tensor.
103  /// \param[in] q0 The energy transfer \f$q^0\f$ in the lab frame (GeV)
104  /// \param[in] q_mag The magnitude of the 3-momentum transfer
105  /// \f$\left|\overrightarrow{q}\right|\f$ in the lab frame (GeV)
106  /// \retval std::complex<double> The value of the hadronic tensor element
107  /// @{
108 
109  /// The tensor element \f$W^{00}\f$
110  virtual std::complex<double> tt(double q0, double q_mag) const = 0;
111 
112  /// The tensor element \f$W^{0x}\f$
113  virtual std::complex<double> tx(double q0, double q_mag) const = 0;
114 
115  /// The tensor element \f$W^{0y}\f$
116  virtual std::complex<double> ty(double q0, double q_mag) const = 0;
117 
118  /// The tensor element \f$W^{0z}\f$
119  virtual std::complex<double> tz(double q0, double q_mag) const = 0;
120 
121  /// The tensor element \f$W^{x0} = (W^{0x})^*\f$
122  virtual std::complex<double> xt(double q0, double q_mag) const = 0;
123 
124  /// The tensor element \f$W^{xx}\f$
125  virtual std::complex<double> xx(double q0, double q_mag) const = 0;
126 
127  /// The tensor element \f$W^{xy}\f$
128  virtual std::complex<double> xy(double q0, double q_mag) const = 0;
129 
130  /// The tensor element \f$W^{xz}\f$
131  virtual std::complex<double> xz(double q0, double q_mag) const = 0;
132 
133  /// The tensor element \f$W^{y0} = (W^{0y})^*\f$
134  virtual std::complex<double> yt(double q0, double q_mag) const = 0;
135 
136  /// The tensor element \f$W^{yx} = (W^{xy})^*\f$
137  virtual std::complex<double> yx(double q0, double q_mag) const = 0;
138 
139  /// The tensor element \f$W^{yy}\f$
140  virtual std::complex<double> yy(double q0, double q_mag) const = 0;
141 
142  /// The tensor element \f$W^{yz}\f$
143  virtual std::complex<double> yz(double q0, double q_mag) const = 0;
144 
145  /// The tensor element \f$W^{z0} = (W^{0z})^*\f$
146  virtual std::complex<double> zt(double q0, double q_mag) const = 0;
147 
148  /// The tensor element \f$W^{zx} = (W^{xz})^*\f$
149  virtual std::complex<double> zx(double q0, double q_mag) const = 0;
150 
151  /// The tensor element \f$W^{zy} = (W^{yz})^*\f$
152  virtual std::complex<double> zy(double q0, double q_mag) const = 0;
153 
154  /// The tensor element \f$W^{zz}\f$
155  virtual std::complex<double> zz(double q0, double q_mag) const = 0;
156  /// @}
157 
158  /// Computes the contraction \f$L_{\mu\nu}W^{\mu\nu}\f$ of the hadron tensor
159  /// with the appropriate lepton tensor for a given type of projectile
160  /// (e.g., neutrino, electron)
161  /// \param[in] interaction An Interaction object storing information about the
162  /// initial and final states
163  /// \param[in] Q_value The Q-value that should be used to correct
164  /// the energy transfer \f$q_0\f$ (GeV)
165  /// \returns The tensor contraction \f$L_{\mu\nu}W^{\mu\nu}\f$ (GeV)
166  virtual double contraction(const Interaction* interaction,
167  double Q_value) const = 0;
168 
169  /// PDG code of the target nucleus
170  inline int pdg() const { return fTargetPDG; }
171 
172  /// Atomic number of the target nucleus
173  inline int Z() const { return genie::pdg::IonPdgCodeToZ(fTargetPDG); }
174 
175  /// Mass number of the target nucleus
176  inline int A() const { return genie::pdg::IonPdgCodeToA(fTargetPDG); }
177 
178  /// Set the target nucleus PDG code
179  inline void set_pdg(int pdg) { fTargetPDG = pdg; }
180 
181  /// The minimum value of the energy transfer \f$q^0\f$ for which this
182  /// hadron tensor may be used to compute cross sections
183  virtual double q0Min() const = 0;
184 
185  /// The maximum value of the energy transfer \f$q^0\f$ for which this
186  /// hadron tensor may be used to compute cross sections
187  virtual double q0Max() const = 0;
188 
189  /// The minimum value of the magnitude of the 3-momentum transfer
190  /// \f$\left|\overrightarrow{q}\right|\f$ for which this
191  /// hadron tensor may be used to compute cross sections
192  virtual double qMagMin() const = 0;
193 
194  /// The maximum value of the magnitude of the 3-momentum transfer
195  /// \f$\left|\overrightarrow{q}\right|\f$ for which this
196  /// hadron tensor may be used to compute cross sections
197  virtual double qMagMax() const = 0;
198 
199 protected:
200 
201  inline HadronTensorI(int pdg = 0) : fTargetPDG(pdg) {}
202 
203  inline HadronTensorI(int Z, int A)
204  : fTargetPDG( genie::pdg::IonPdgCode(A, Z) ) {}
205 
206  ///< PDG code for the target nucleus represented by the tensor
208 
209 }; // class HadronTensorI
210 
211 } // genie namespace
212 #endif
virtual std::complex< double > zz(double q0, double q_mag) const =0
The tensor element .
HadronTensorType
Definition: HadronTensorI.h:40
virtual std::complex< double > zy(double q0, double q_mag) const =0
The tensor element .
virtual std::complex< double > zt(double q0, double q_mag) const =0
The tensor element .
virtual std::complex< double > zx(double q0, double q_mag) const =0
The tensor element .
HadronTensorI(int Z, int A)
PDG code for the target nucleus represented by the tensor.
int IonPdgCodeToA(int pdgc)
Definition: PDGUtils.cxx:63
virtual std::complex< double > ty(double q0, double q_mag) const =0
The tensor element .
enum genie::HadronTensorType HadronTensorType_t
virtual double contraction(const Interaction *interaction, double Q_value) const =0
virtual double q0Max() const =0
virtual ~HadronTensorI()
Definition: HadronTensorI.h:99
virtual std::complex< double > tx(double q0, double q_mag) const =0
The tensor element .
Summary information for an interaction.
Definition: Interaction.h:56
virtual std::complex< double > xy(double q0, double q_mag) const =0
The tensor element .
int A() const
Mass number of the target nucleus.
virtual std::complex< double > yx(double q0, double q_mag) const =0
The tensor element .
Abstract interface for an object that computes the elements a hadron tensor . Also computes the contr...
Definition: HadronTensorI.h:95
virtual std::complex< double > yt(double q0, double q_mag) const =0
The tensor element .
virtual std::complex< double > tz(double q0, double q_mag) const =0
The tensor element .
virtual double qMagMax() const =0
virtual double q0Min() const =0
void set_pdg(int pdg)
Set the target nucleus PDG code.
virtual std::complex< double > yy(double q0, double q_mag) const =0
The tensor element .
int pdg() const
PDG code of the target nucleus.
virtual std::complex< double > xt(double q0, double q_mag) const =0
The tensor element .
int IonPdgCode(int A, int Z)
Definition: PDGUtils.cxx:71
int Z() const
Atomic number of the target nucleus.
int IonPdgCodeToZ(int pdgc)
Definition: PDGUtils.cxx:55
virtual double qMagMin() const =0
HadronTensorI(int pdg=0)
virtual std::complex< double > yz(double q0, double q_mag) const =0
The tensor element .
virtual std::complex< double > tt(double q0, double q_mag) const =0
The tensor element .
virtual std::complex< double > xx(double q0, double q_mag) const =0
The tensor element .
virtual std::complex< double > xz(double q0, double q_mag) const =0
The tensor element .