Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-06-02 08:51:48

0001 #ifndef DVCS_PROCESS_VGG99_H
0002 #define DVCS_PROCESS_VGG99_H
0003 
0004 /**
0005  * @file DVCSProcessVGG99.h
0006  * @author  Michel Guidal (IPNO)
0007  * @author Pawel Sznajder (IPNO)
0008  * @version 1.0
0009  */
0010 
0011 #include <NumA/linear_algebra/matrix_complex/MatrixComplex4D.h>
0012 #include <NumA/linear_algebra/vector_complex/VectorComplex3D.h>
0013 #include <NumA/linear_algebra/vector_complex/VectorComplex4D.h>
0014 #include <complex>
0015 #include <string>
0016 
0017 #include "../../../utils/type/PhysicalType.h"
0018 #include "DVCSProcessModule.h"
0019 
0020 namespace PARTONS {
0021 
0022 /**
0023  * @class DVCSProcessVGG99
0024  *
0025  * VGG process model for DVCS.
0026  *
0027  * For the reference see:
0028  * - Prog. Part. Nucl. Phys. 47, 401 (2001)
0029  * - Phys. Rev. Lett. 80 5064 (1998).
0030  * - Phys. Rev. D 60, 094017 (1999).
0031  * - Phys. Rev. D 72, 054013 (2005).
0032  *
0033  * Module based on the original code received from M. Guidal as a private communication.
0034  */
0035 class DVCSProcessVGG99: public DVCSProcessModule {
0036 
0037 public:
0038 
0039     static const unsigned int classId; ///< Unique ID to automatically register the class in the registry.
0040 
0041     /**
0042      * Constructor.
0043      * See BaseObject::BaseObject and ModuleObject::ModuleObject for more details.
0044      *
0045      * @param className name of child class.
0046      */
0047     DVCSProcessVGG99(const std::string &className);
0048 
0049     /**
0050      * Default destructor.
0051      */
0052     virtual ~DVCSProcessVGG99();
0053     virtual DVCSProcessVGG99* clone() const;
0054 
0055 protected:
0056 
0057     /** Copy constructor.
0058      @param other Object to be copied.
0059      */
0060     DVCSProcessVGG99(const DVCSProcessVGG99& other);
0061 
0062     virtual void initModule();
0063     virtual void isModuleWellConfigured();
0064 
0065     virtual PhysicalType<double> CrossSectionBH();
0066     virtual PhysicalType<double> CrossSectionVCS();
0067     virtual PhysicalType<double> CrossSectionInterf();
0068 
0069 private:
0070 
0071     //TYPES
0072 
0073     typedef NumA::VectorComplex3D momentum3;
0074     typedef NumA::VectorComplex4D momentum4;
0075     typedef NumA::VectorComplex4D spinor;
0076     typedef NumA::MatrixComplex4D spinorMatrix;
0077 
0078     /** Orientation of spinor.
0079      */
0080     enum SpinorOrientation {
0081         UNDEFINED = 0, x = 1, y = 2, z = 3
0082     };
0083 
0084     //INTERNAL VARIABLES
0085     double m_target_polarization; ///< Target polarization.
0086     double m_target_polarizationL; ///< Longitudinal component of target polarization.
0087     double m_target_polarizationT; ///< Transverse component of target polarization.
0088     double m_target_polarizationT_x; ///< Transverse x component of target polarization.
0089     double m_target_polarizationT_y; ///< Transverse y component of target polarization.
0090     SpinorOrientation m_proton_spinor_orientation; ///< Orientation of target spinor.
0091 
0092     double m_nu; ///< Kinematic variable nu.
0093     double m_y; ///< Kinematic variable y.
0094     double m_s; ///< Kinematic variable s.
0095     double m_xi; ///< Kinematic variable xi.
0096 
0097     double k_in_mom; ///< Momentum of incoming lepton.
0098     double k_out_mom; ///< Momentum of outgoing lepton.
0099     double q_in_mom; ///< Momentum of incoming photon.
0100     double q_out_mom; ///< Momentum of outgoing photon.
0101     double k_in_en; ///< Energy of incoming lepton.
0102     double k_out_en; ///< Energy of outgoing lepton.
0103     double q_in_en; ///< Energy of incoming photon.
0104     double q_out_en; ///< Energy of outgoing photon.
0105     double p_in_en; ///< Energy of incoming proton.
0106     double p_out_en; ///< Energy of outgoing proton.
0107 
0108     momentum3 k_in; ///< Momentum vector of incoming lepton.
0109     momentum3 k_out; ///< Momentum vector of outgoing lepton.
0110     momentum3 q_in; ///< Momentum vector of incoming photon.
0111     momentum3 q_out; ///< Momentum vector of outgoing photon.
0112     momentum3 p_in; ///< Momentum vector of incoming proton.
0113     momentum3 p_out; ///< Momentum vector of outgoing proton.
0114 
0115     momentum4 k4_in; ///< Four vector of incomming lepton.
0116     momentum4 k4_out; ///< Four vector of outgoing lepton.
0117     momentum4 q4_in; ///< Four vector of incomming photon.
0118     momentum4 q4_out; ///< Four vector of outgoing photon.
0119     momentum4 p4_in; ///< Four vector of incomming proton.
0120     momentum4 p4_out; ///< Four vector of outgoing proton.
0121 
0122     double an_th_q_out; ///< Polar angle of outgoing photon.
0123     double an_phi_q_out; ///< Azimuthal angle of outgoing photon.
0124 
0125     /** Used to fill internal variables.
0126      */
0127     void fillInternalVariables(NumA::Vector3D targetPolarization);
0128 
0129     //ALGEBRA
0130 
0131     /** Initialize four vector from energy and momentum.
0132      * @param a Input energy.
0133      * @param b Input momentum vector.
0134      */
0135     NumA::VectorComplex4D V4ini(std::complex<double> a,
0136             NumA::VectorComplex3D b);
0137 
0138     /** Positive-energy Dirac spinor.
0139      * @param p Momentum vector.
0140      * @param mass Mass.
0141      * @param sproj Spin projection.
0142      */
0143     NumA::VectorComplex4D spinor_pos(NumA::VectorComplex3D p, double mass,
0144             double sproj);
0145 
0146     /** Contravariant Dirac matrices as 4 by 4 matrices in spinor space (convention Bjorken and Drell 1964).
0147      * @param mu Dimension index.
0148      */
0149     NumA::MatrixComplex4D dirac_gamma(int mu);
0150 
0151     /** Gamma5 matrix.
0152      */
0153     NumA::MatrixComplex4D dirac_gamma5();
0154 
0155     /** Metric signature.
0156      * @param mu, nu Dimension indices.
0157      */
0158     double metric(int mu, int nu);
0159 
0160     /** Elements of three Pauli matrices for given index element (up/left: ++, u/r:+-, d/l: -+, d/r:--).
0161      * @param row Row of matrix.
0162      * @param col Column of matrix.
0163      */
0164     NumA::VectorComplex3D pauli(double row, double col);
0165 
0166     /** Dirac adjoint.
0167      * @param a Input dirac spinor.
0168      */
0169     NumA::VectorComplex4D spinor_adj(NumA::VectorComplex4D a);
0170 
0171     /** Spinor|gamma|spinor product.
0172      * @param l Spinor left.
0173      * @param m Gamma matrix.
0174      * @param r Spinor right.
0175      */
0176     std::complex<double> spinleft_mat_spinright(NumA::VectorComplex4D l,
0177             NumA::MatrixComplex4D m, NumA::VectorComplex4D r);
0178 
0179     /** Contraction of four vector with gamma matrix.
0180      * @param a Input four vector.
0181      */
0182     NumA::MatrixComplex4D fvec_slash(NumA::VectorComplex4D a);
0183 
0184     /** Contraction of two four vectors.
0185      * @param a, b Input four vectors.
0186      */
0187     std::complex<double> V4mul(NumA::VectorComplex4D a,
0188             NumA::VectorComplex4D b);
0189 
0190     /** Complex number inverse.
0191      * @param z Complex number to be inverted.
0192      */
0193     std::complex<double> Cinv(std::complex<double> z);
0194 
0195     /** Helicity spinor for a particle with momentum, mass 0 and helicity +/-.
0196      * @param p Input momentum.
0197      * @param hel Input helicity.
0198      */
0199     NumA::VectorComplex4D spinor_hel(momentum3 p, double hel);
0200 
0201     /** Polar angle for given vector.
0202      * @param t Input vector.
0203      */
0204     double polar_angle(NumA::VectorComplex3D t);
0205 
0206     /** Azimuthal angle for given vector.
0207      * @param t Input vector.
0208      */
0209     double azimut_angle(NumA::VectorComplex3D t);
0210 
0211     /** Contravariant tensor sigma in spinor space (convention Bjorken and Drell 1964).
0212      * @param mu, nu Dimension indices.
0213      */
0214     NumA::MatrixComplex4D dirac_sigma(int mu, int nu);
0215 
0216     /** Unit spinor matrix.
0217      */
0218     NumA::MatrixComplex4D unit_spinor_mat();
0219 
0220     /** Vector set via magnitude, polar and azimuthal angles.
0221      * @param magn Magnitude.
0222      * @param th Polar angle.
0223      * @param phi Azimuthal angle.
0224      */
0225     NumA::VectorComplex3D Vpolar(double magn, double th, double phi);
0226 
0227     /** Antisymmetric epsilon.
0228      * @param ka, la, mu, nu Indices.
0229      */
0230     double antisymm_epsilon(int ka, int la, int mu, int nu);
0231 
0232     //PHYSICS
0233 
0234     /** Calculate cross section.
0235      * @param beamHelicity Beam helicity.
0236      * @param beamCharge Beam charge.
0237      * @param targetPolarization Target polarization.
0238      * @param mechanism Mechanism (0 - BH, 1 - DVCS, 2 - INT).
0239      */
0240     double CrossSectionMechanism(double beamHelicity, double beamCharge,
0241             NumA::Vector3D targetPolarization, int mechanism);
0242 
0243     /** Calculate cross section for specific helicities.
0244      * @param leptcharge Beam charge.
0245      * @param mechanism Mechanism (0 - BH, 1 - DVCS, 2 - INT).
0246      * @param el_hel Beam helicity.
0247      * @param sp_in Target helicity.
0248      */
0249     double v_compton_doublepol_cross_inv(double leptcharge, int mechanism,
0250             double el_hel, double sp_in);
0251 
0252     /** Gamma_NN electromagnetic vertex.
0253      * @param mu Dimension index.
0254      * @param q Four momentum of virtual photon.
0255      */
0256     NumA::MatrixComplex4D gamma_NN_vertex(int mu, NumA::VectorComplex4D q);
0257 
0258     /**  Amplitude for BH process.
0259      * @param mu Dimension index.
0260      * @param el_hel Beam helicity.
0261      * @param sp_in Target helicity (incoming proton).
0262      * @param sp_out (outgoing proton).
0263      */
0264     std::complex<double> AmplitudeBH(int mu, double el_hel, double sp_in,
0265             double sp_out);
0266 
0267     /**  Amplitude for DVCS process.
0268      * @param mu Dimension index.
0269      * @param el_hel Beam helicity.
0270      * @param sp_in Target helicity (incoming proton).
0271      * @param sp_out (outgoing proton).
0272      */
0273     std::complex<double> AmplitudeDVCS(int mu, double el_hel, double sp_in,
0274             double sp_out);
0275 
0276     /** Amplitude for the reaction.
0277      * @param mu, nu Dimension indices.
0278      * @param sp_in Target helicity (incoming proton).
0279      * @param sp_out (outgoing proton).
0280      */
0281     std::complex<double> J_DVCS(int mu, int nu, double sp_in, double sp_out);
0282 
0283     /** Matrix element for the reaction.
0284      * @param leptcharge Beam charge.
0285      * @param mechanism Mechanism (0 - BH, 1 - DVCS, 2 - INT).
0286      * @param mu Dimension index.
0287      * @param el_hel Beam helicity.
0288      * @param sp_in Target helicity (incoming proton).
0289      * @param sp_out (outgoing proton).
0290      */
0291     std::complex<double> v_compton_t_matrix_hel(double leptcharge,
0292             int mechanism, int mu, double el_hel, double sp_in, double sp_out);
0293 
0294     /** Squared amplitude for the reaction.
0295      * @param leptcharge Beam charge.
0296      * @param mechanism Mechanism (0 - BH, 1 - DVCS, 2 - INT).
0297      * @param el_hel Beam helicity.
0298      * @param sp_in Target helicity.
0299      */
0300     double v_compton_doublepol_sqrampl(double leptcharge, int mechanism,
0301             double el_hel, double sp_in);
0302 };
0303 
0304 } /* namespace PARTONS */
0305 
0306 #endif /* DVCS_PROCESS_VGG99_H */