Back to home page

EIC code displayed by LXR

 
 

    


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

0001 #ifndef DDVCS_PROCESS_DMSW22_H
0002 #define DDVCS_PROCESS_DMSW22_H
0003 
0004 #include <complex>
0005 #include <string>
0006 
0007 #include "../../../utils/type/PhysicalType.h"
0008 #include "DDVCSProcessModule.h"
0009 
0010 namespace PARTONS {
0011 
0012 /**
0013  * @class DDVCSProcessDMSW22
0014  *
0015  * @brief Evaluation of differential cross-section for DDVCS process.
0016  *
0017  * See 2303.13668 [hep-ph] as a reference.
0018  */
0019 class DDVCSProcessDMSW22: public DDVCSProcessModule {
0020 public:
0021 
0022     static const unsigned int classId; ///< Unique ID to automatically register the class in the registry.
0023 
0024     /**
0025      * Constructor.
0026      * See BaseObject::BaseObject and ModuleObject::ModuleObject for more details.
0027      *
0028      * @param className name of child class.
0029      */
0030     DDVCSProcessDMSW22(const std::string &className);
0031 
0032     /**
0033      * Destructor.
0034      */
0035     virtual ~DDVCSProcessDMSW22();
0036 
0037     virtual DDVCSProcessDMSW22* clone() const;
0038 
0039 protected:
0040 
0041     /**
0042      * Copy constructor.
0043      */
0044     DDVCSProcessDMSW22(const DDVCSProcessDMSW22& other);
0045 
0046     virtual void initModule();
0047     virtual void isModuleWellConfigured();
0048 
0049     virtual PhysicalType<double> CrossSectionBH();
0050     virtual PhysicalType<double> CrossSectionVCS();
0051     virtual PhysicalType<double> CrossSectionInterf();
0052 
0053 private:
0054 
0055     //Amplitudes:
0056     std::complex<double> ampliBH1(int s2, int s1, int sl, int s);
0057     std::complex<double> ampliBH1crossed(int s2, int s1, int sl, int s);
0058     std::complex<double> ampliBH2(int s2, int s1, int sl, int s);
0059     std::complex<double> ampliBH2crossed(int s2, int s1, int sl, int s);
0060     std::complex<double> ampliVCS(int s2, int s1, int sl, int s);
0061 
0062     //Cross-sections:
0063     double crossSectionBH(int targetPolariz);
0064     double crossSectionVCS(int targetPolariz);
0065     double crossSectionInterf(int targetPolariz);
0066 
0067     //Auxiliary functions:
0068     std::complex<double> sKS(const double r1[4], const double r2[4]) const;
0069     std::complex<double> tKS(const double r1[4], const double r2[4]) const;
0070     std::complex<double> fFunction(int lambda, double k0[4], double k1[4],
0071             int lambdaPrime, double k2[4], double k3[4]) const;
0072     std::complex<double> gFunction(int lambda, double L[4], double R[4],
0073             double k[4]) const;
0074     std::complex<double> Yfunction(int s2, int s1) const;
0075     std::complex<double> Zfunction(int s2, int s1) const;
0076     std::complex<double> J2function(int s2, int s1) const;
0077     double MinkProd(const double p[4], const double q[4]) const;
0078     std::complex<double> jFunction(int mu, int helic, double p1[4],
0079             double p2[4]) const;
0080     std::complex<double> J15plus(int s2, int s1) const;
0081     std::complex<double> J25plus(int s2, int s1) const;
0082     double LCperp(int mu, int nu) const; //Levi-Civita tensor for (mu, nu) in {1, 2}
0083     std::complex<double> Flong(int h1, int s1) const;
0084 
0085     void computeInternalVariables(double Mnucleon);
0086 
0087     //Everything needed to compute the light-like vectors r1, r2, rPrime1 & rPrime2 for proton momenta p1 = r1+r2 (incoming) and p2 = rPrime1+rPrime2 (outgoing)
0088     double m_DMSW_r1[4];
0089     double m_DMSW_r2[4];
0090     double m_DMSW_p[4];
0091     double m_DMSW_rPrime1[4];
0092     double m_DMSW_rPrime2[4];
0093     double m_DMSW_rPrime1_tMin[4]; // for t = tMin
0094     double m_DMSW_rPrime2_tMin[4]; // for t = tMin
0095     double m_DMSW_pPrim[4];
0096     double m_DMSW_pPrim_tMin[4]; //for t = tMin
0097     double m_DMSW_epsilon2; //squared of the epsilon variable define in paragraph above eq 8 in BM2003
0098     double m_DMSW_Q2Bar; //Q2 is the squared of the incoming and outgoing photon momenta's average
0099     double m_DMSW_Q2Bar_tMin; //Q2 at t = tMin
0100 
0101     double m_DMSW_cosTheta_e;
0102     double m_DMSW_sinTheta_e;
0103     double m_DMSW_cosGamma;
0104     double m_DMSW_sinGamma;
0105     double m_DMSW_sinGamma_tMin;
0106     double m_DMSW_cosGamma_tMin;
0107 
0108     //Other momenta
0109     double m_DMSW_y; //y = p1*q1/(p1*k): paragraph below eq 6 in BM2003
0110     double m_DMSW_k[4]; //incoming electron's momentum in TRF-II, eq 20 in BM2003
0111     double m_DMSW_k_tMin[4]; // for t = tMin
0112     double m_DMSW_Delta[4]; // p2 - p1
0113     double m_DMSW_qPrim[4]; // outgoing-photon 4-vector in TRF-II, above eq 19 in BM2003
0114     double m_DMSW_q[4]; // incoming-photon 4-vector in TRF-II, eq 19 in BM2003
0115     double m_DMSW_qPrim_tMin[4]; // for t = tMin
0116     double m_DMSW_q_tMin[4]; // for t = tMin
0117     double m_DMSW_kPrime[4]; //outgoin-electron momentum in TRF-II frame
0118     double m_DMSW_lminus[4]; //4-momentum of muon, eq 23 in BM2003
0119     double m_DMSW_lplus[4]; //4-momentum of anti-muon
0120     double m_DMSW_kPrime_tMin[4]; // for t = tMin
0121     double m_DMSW_lminus_tMin[4]; // for t = tMin
0122     double m_DMSW_lplus_tMin[4]; // for t = tMin
0123     double m_DMSW_nminus[4]; //light-like vector such that for a vector v, we call vPlus = m_DMSW_nminus * v
0124     double m_DMSW_nplus[4]; //light-like vector such that for a vector v, we call vMinus = m_DMSW_nplus * v
0125     double m_DMSW_nminus_tMin[4]; //for t = tMin
0126     double m_DMSW_nplus_tMin[4]; // for t = tMin
0127     double m_DMSW_nBM[4]; //light-like vector n from BM2000 and BM2003 papers. Also for a 4-vector v we name vPlusBM = m_DMSW_nBM * v
0128     double m_DMSW_nstarBM[4]; //light-like vector n^\star from BM2000 and BM2003 papers. Also for a 4-vector v we name vMinusBM = m_DMSW_nstarBM * v
0129     double m_DMSW_HATnBM[4]; // m_DMSW_HATnBM = m_DMSW_Q2 * m_DMSW_nBM
0130     double m_DMSW_nBM_tMin[4]; // for t = tMin
0131     double m_DMSW_nstarBM_tMin[4]; //for t = tMin
0132     double m_DMSW_HATnBM_tMin[4]; // for t = tMin
0133     double m_DMSW_k0[4]; //k0 vector defined in KS1985 (eq 3.10)
0134     double m_DMSW_pBar[4];
0135     double m_DMSW_pBar_tMin[4]; // for t = tMin
0136 
0137     //tMin value, eq 22 in BM2003
0138     double m_DMSW_tMin;
0139 
0140     //Levi-Civita tensor in 4 dimensions with upper indices. I am choosing LCtensor[0][1][2][3] = \epsilon^{0123} = +1
0141     double m_DMSW_LCtensor[4][4][4][4];
0142 
0143     //Minkowsky metric in 4 dimensions with lower indices, metric = diag(1, -1, -1, -1)
0144     double m_DMSW_metric_[4][4];
0145 
0146     //EM form factors for proton
0147     double m_DMSW_F1;
0148     double m_DMSW_F2;
0149 
0150     //Nucleon mass and electron charge in absolute value
0151     double m_DMSW_Mnucleon;
0152     double m_DMSW_charge_e;
0153 
0154     //eta, xi and pq variables
0155     double m_DMSW_rho; //xi variable in eq 29 from BM2003
0156     double m_DMSW_rho_tMin; // for t = tMin
0157     double m_DMSW_2pBarqBar; //pq = Q2/xi as in eq 29 from BM2003
0158     double m_DMSW_2pBarqBar_tMin; // for t = tMin
0159 
0160     //lepton angles in TRF-II frame (user provides them in BDP frame), and Jacobian relating them:
0161     double m_DMSW_phiL;
0162     double m_DMSW_thetaL;
0163     double m_DMSW_jac; // d(xsec)/(... dm_DMSW_thetalBDP dm_DMSW_philBDP) = (1/jac) * d(xsec)/(... d m_DMSW_thetal d m_DMSW_phil)
0164 
0165     //phi in TRF-I frame
0166     double m_DMSW_phi;
0167 
0168     //spin vector angles in TRF-II:
0169     double m_DMSW_thetaS;
0170     double m_DMSW_phiS;
0171 
0172     //CFFs
0173     std::complex<double> m_cffH;
0174     std::complex<double> m_cffE;
0175     std::complex<double> m_cffHt;
0176     std::complex<double> m_cffEt;
0177     std::complex<double> m_cffHL;
0178     std::complex<double> m_cffEL;
0179 };
0180 
0181 } /* namespace PARTONS */
0182 
0183 #endif /* DDVCS_PROCESS_DMSW22_H */
0184