GENIEGenerator
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
LabFrameHadronTensorI.h
Go to the documentation of this file.
1 //____________________________________________________________________________
2 /*!
3 
4 \class genie::LabFrameHadronTensorI
5 
6 \brief Abstract interface for an object that computes the elements
7  (\f$W^{xx}\f$, \f$W^{0z}\f$, etc.) and structure functions
8  (\f$W_1\f$, \f$W_2\f$, etc.) of
9  the hadron tensor \f$W^{\mu\nu}\f$ defined according to the
10  conventions of the Valencia model.
11 
12 \details For (anti)neutrino projectiles, the hadron tensor \f$W^{\mu\nu}\f$
13  is defined as in equations (8) and (9) of
14 
15  J. Nieves, J. E. Amaro, and M. Valverde,
16  "Inclusive Quasi-Elastic Charged-Current Neutrino-Nucleus Reactions,"
17  Phys. Rev. C 70, 055503 (2004)
18  https://doi.org/10.1103/PhysRevC.70.055503
19  https://arxiv.org/abs/nucl-th/0408005v3
20 
21  Note that the associated erratum includes an important correction
22  in the formula for the differential cross section:
23 
24  J. Nieves, J. E. Amaro, and M. Valverde,
25  "Erratum: Inclusive quasielastic charged-current neutrino-nucleus
26  reactions [Phys. Rev. C 70, 055503 (2004)],"
27  Phys. Rev. C. 72, 019902 (2005)
28  http://doi.org/10.1103/PhysRevC.72.019902
29 
30  The calculation is carried out in the lab frame (i.e., the frame
31  where the target nucleus has initial 4-momentum
32  \f$P^\mu = (M_i, \overrightarrow{0})\f$) with the 3-momentum
33  transfer \f$\overrightarrow{q}\f$ chosen to lie along the
34  z axis, i.e., \f$q = (q^0, |\overrightarrow{q}|
35  \overrightarrow{u}_z)\f$. With this choice of frame, the only
36  nonzero elements are \f$W^{00}\f$, \f$W^{0z} = (W^{z0})^*\f$,
37  \f$W^{xx} = W^{yy}\f$, \f$W^{xy} = (W^{yx})^*\f$, and \f$W^{zz}\f$.
38 
39  For an electron projectile, the hadron tensor is defined as in
40  equation (83) of
41 
42  A. Gil, J. Nieves, and E. Oset,
43  "Many-body approach to the inclusive \f$(e,e^\prime)\f$ reaction
44  from the quasielastic to the \f$\Delta\f$ excitation region,"
45  Nuclear Physics A 627, 543-598 (1997)
46  http://doi.org/10.1016/S0375-9474(97)00513-7
47 
48  It is evaluated in the same reference frame as the neutrino case.
49 
50 \author Steven Gardiner <gardiner \at fnal.gov>
51  Fermi National Accelerator Laboratory
52 
53 \created August 23, 2018
54 
55 \cpright Copyright (c) 2003-2024, The GENIE Collaboration
56  For the full text of the license visit http://copyright.genie-mc.org
57  or see $GENIE/LICENSE
58 */
59 //____________________________________________________________________________
60 
61 #ifndef VALENCIA_HADRON_TENSORI_H
62 #define VALENCIA_HADRON_TENSORI_H
63 
64 // standard library includes
65 #include <complex>
66 
67 // GENIE includes
71 
72 namespace genie {
73 
75 
76 public:
77 
78  inline virtual ~LabFrameHadronTensorI() {}
79 
80  /// \name Tensor elements
81  /// \brief Functions that return the elements of the tensor. Since it is
82  /// Hermitian, only ten elements are independent. Although a return type of
83  /// std::complex<double> is used for all elements, note that hermiticity
84  /// implies that the diagonal elements must be real.
85  /// \param[in] q0 The energy transfer \f$q^0\f$ in the lab frame (GeV)
86  /// \param[in] q_mag The magnitude of the 3-momentum transfer
87  /// \f$\left|\overrightarrow{q}\right|\f$ in the lab frame (GeV)
88  /// \retval std::complex<double> The value of the hadronic tensor element
89  /// @{
90 
91  /// The tensor element \f$W^{0x}\f$
92  inline virtual std::complex<double> tx(double /*q0*/, double /*q_mag*/) const
93  { return std::complex<double>(0., 0.); }
94 
95  /// The tensor element \f$W^{0y}\f$
96  inline virtual std::complex<double> ty(double /*q0*/, double /*q_mag*/) const
97  { return std::complex<double>(0., 0.); }
98 
99  /// The tensor element \f$W^{x0} = (W^{0x})^*\f$
100  inline virtual std::complex<double> xt(double q0, double q_mag) const
101  { return std::conj( this->tx(q0, q_mag) ); }
102 
103  /// The tensor element \f$W^{xz}\f$
104  inline virtual std::complex<double> xz(double /*q0*/, double /*q_mag*/) const
105  { return std::complex<double>(0., 0.); }
106 
107  /// The tensor element \f$W^{y0} = (W^{0y})^*\f$
108  inline virtual std::complex<double> yt(double q0, double q_mag) const
109  { return std::conj( this->ty(q0, q_mag) ); }
110 
111  /// The tensor element \f$W^{yx} = (W^{xy})^*\f$
112  inline virtual std::complex<double> yx(double q0, double q_mag) const
113  { return std::conj( this->xy(q0, q_mag) ); }
114 
115  /// The tensor element \f$W^{yy}\f$
116  inline virtual std::complex<double> yy(double q0, double q_mag) const
117  { return this->xx(q0, q_mag); }
118 
119  /// The tensor element \f$W^{yz}\f$
120  inline virtual std::complex<double> yz(double /*q0*/, double /*q_mag*/) const
121  { return std::complex<double>(0., 0.); }
122 
123  /// The tensor element \f$W^{z0} = (W^{0z})^*\f$
124  inline virtual std::complex<double> zt(double q0, double q_mag) const
125  { return std::conj( this->tz(q0, q_mag) ); }
126 
127  /// The tensor element \f$W^{zx} = (W^{xz})^*\f$
128  inline virtual std::complex<double> zx(double q0, double q_mag) const
129  { return std::conj( this->xz(q0, q_mag) ); }
130 
131  /// The tensor element \f$W^{zy} = (W^{yz})^*\f$
132  inline virtual std::complex<double> zy(double q0, double q_mag) const
133  { return std::conj( this->yz(q0, q_mag) ); }
134 
135  /// @}
136 
137  /// \name Structure functions
138  /// \param[in] q0 The energy transfer \f$q^0\f$ in the lab frame (GeV)
139  /// \param[in] q_mag The magnitude of the 3-momentum transfer
140  /// \f$\left|\overrightarrow{q}\right|\f$ in the lab frame (GeV)
141  /// \param[in] Mi The mass of the target nucleus \f$M_i\f$ (GeV)
142  /// @{
143 
144  /// The structure function \f$W_1 = \frac{ W^{xx} }{ 2M_i }\f$
145  virtual double W1(double q0, double q_mag, double Mi) const = 0;
146 
147  /// The structure function \f$W_2 = \frac{ 1 }{ 2M_i }
148  /// \left( W^{00} + W^{xx} + \frac{ (q^0)^2 }
149  /// { \left|\overrightarrow{q}\right|^2 } ( W^{zz} - W^{xx} )
150  /// - 2\frac{ q^0 }{ \left|\overrightarrow{q}\right| }\Re W^{0z}
151  /// \right) \f$
152  virtual double W2(double q0, double q_mag, double Mi) const = 0;
153 
154  /// The structure function \f$ W_3 = -i \frac{ W^{xy} }
155  /// { \left|\overrightarrow{q}\right| } \f$
156  virtual double W3(double q0, double q_mag, double Mi) const = 0;
157 
158  /// The structure function \f$ W_4 = \frac{ M_i }
159  /// { 2 \left|\overrightarrow{q}\right|^2 } ( W^{zz} - W^{xx} ) \f$
160  virtual double W4(double q0, double q_mag, double Mi) const = 0;
161 
162  /// The structure function \f$ W_5 = \frac{ 1 }
163  /// { \left|\overrightarrow{q}\right| }
164  /// \left( \Re W^{0z} - \frac{ q^0 }{ \left|\overrightarrow{q}\right| }
165  /// ( W^{zz} - W^{xx} ) \right) \f$
166  virtual double W5(double q0, double q_mag, double Mi) const = 0;
167 
168  /// The structure function \f$ W_6 = \frac{ \Im W^{0z} }
169  /// { \left|\overrightarrow{q}\right| } \f$
170  virtual double W6(double q0, double q_mag, double Mi) const = 0;
171  /// @}
172 
173  virtual double contraction(const Interaction* interaction,
174  double Q_value) const /*override*/;
175 
176  /// \copybrief contraction(const Interaction*)
177  /// \param[in] probe_pdg The PDG code for the incident projectile
178  /// \param[in] E_probe The lab frame energy of the incident projectile (GeV)
179  /// \param[in] m_probe The mass of the incident projectile (GeV)
180  /// \param[in] Tl The lab frame kinetic energy of the final state lepton (GeV)
181  /// \param[in] cos_l The angle between the direction of the incident
182  /// neutrino and the final state lepton (radians)
183  /// \param[in] ml The mass of the final state lepton (GeV)
184  /// \param[in] Q_value The Q-value that should be used to correct
185  /// the energy transfer \f$q_0\f$ (GeV)
186  /// \returns The tensor contraction \f$L_{\mu\nu}W^{\mu\nu}\f$ (GeV)
187  virtual double contraction(int probe_pdg, double E_probe, double m_probe,
188  double Tl, double cos_l, double ml, double Q_value) const;
189 
190  /// Computes the differential cross section \f$\frac{ d^2\sigma } { dT_\ell
191  /// d\cos(\theta^\prime) }\f$ for the reaction represented by this hadron
192  /// tensor
193  /// \param[in] interaction An Interaction object storing information about
194  /// the initial and final states
195  /// \param[in] Q_value The Q-value that should be used to correct
196  /// the energy transfer \f$q_0\f$ (GeV)
197  /// \returns The differential cross section (GeV<sup>-3</sup>)
198  virtual double dSigma_dT_dCosTheta(const Interaction* interaction,
199  double Q_value) const = 0;
200 
201  /// \copybrief dSigma_dT_dCosTheta(const Interaction*, double)
202  /// \param[in] probe_pdg The PDG code for the incident projectile
203  /// \param[in] E_probe The lab frame energy of the incident projectile (GeV)
204  /// \param[in] m_probe The mass of the incident projectile (GeV)
205  /// \param[in] Tl The lab frame kinetic energy of the final state lepton (GeV)
206  /// \param[in] cos_l The angle between the direction of the incident
207  /// neutrino and the final state lepton (radians)
208  /// \param[in] ml The mass of the final state lepton (GeV)
209  /// \param[in] Q_value The Q-value that should be used to correct
210  /// the energy transfer \f$q_0\f$ (GeV)
211  /// \returns The differential cross section (GeV<sup>-3</sup>)
212  virtual double dSigma_dT_dCosTheta(int probe_pdg, double E_probe,
213  double m_probe, double Tl, double cos_l, double ml, double Q_value)
214  const /*override*/ = 0;
215 
216 
217  //As above but using the rosenbluth formalism: should give the same result!
218  virtual double dSigma_dT_dCosTheta_rosenbluth(const Interaction* interaction,
219  double Q_value) const = 0;
220  virtual double dSigma_dT_dCosTheta_rosenbluth(int probe_pdg, double E_probe,
221  double m_probe, double Tl, double cos_l, double ml, double Q_value)
222  const /*override*/ = 0;
223 
224 protected:
225 
227 
228  inline LabFrameHadronTensorI(int Z, int A) : HadronTensorI(Z, A) {}
229 
230 }; // class LabFrameHadronTensorI
231 
232 } // genie namespace
233 #endif
virtual double dSigma_dT_dCosTheta(const Interaction *interaction, double Q_value) const =0
virtual std::complex< double > tx(double, double) const
The tensor element .
virtual double dSigma_dT_dCosTheta_rosenbluth(const Interaction *interaction, double Q_value) const =0
Abstract interface for an object that computes the elements ( , , etc.) and structure functions ( ...
virtual double W1(double q0, double q_mag, double Mi) const =0
The structure function .
virtual std::complex< double > yz(double, double) const
The tensor element .
virtual std::complex< double > ty(double, double) const
The tensor element .
virtual std::complex< double > yt(double q0, double q_mag) const
The tensor element .
virtual double W4(double q0, double q_mag, double Mi) const =0
virtual std::complex< double > zy(double q0, double q_mag) const
The tensor element .
Summary information for an interaction.
Definition: Interaction.h:56
virtual double W2(double q0, double q_mag, double Mi) const =0
virtual std::complex< double > xy(double q0, double q_mag) const =0
The tensor element .
int A() const
Mass number of the target nucleus.
Abstract interface for an object that computes the elements a hadron tensor . Also computes the contr...
Definition: HadronTensorI.h:95
virtual std::complex< double > tz(double q0, double q_mag) const =0
The tensor element .
virtual std::complex< double > zx(double q0, double q_mag) const
The tensor element .
virtual std::complex< double > yx(double q0, double q_mag) const
The tensor element .
virtual std::complex< double > yy(double q0, double q_mag) const
The tensor element .
virtual double contraction(const Interaction *interaction, double Q_value) const
int pdg() const
PDG code of the target nucleus.
virtual std::complex< double > xt(double q0, double q_mag) const
The tensor element .
virtual std::complex< double > zt(double q0, double q_mag) const
The tensor element .
virtual double W3(double q0, double q_mag, double Mi) const =0
virtual double W5(double q0, double q_mag, double Mi) const =0
int Z() const
Atomic number of the target nucleus.
virtual double W6(double q0, double q_mag, double Mi) const =0
virtual std::complex< double > xz(double, double) const
The tensor element .
virtual std::complex< double > xx(double q0, double q_mag) const =0
The tensor element .