Back to home page

EIC code displayed by LXR

 
 

    


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

0001 #ifndef DVCS_PROCESS_BMJ12_H
0002 #define DVCS_PROCESS_BMJ12_H
0003 
0004 /**
0005  * @file DVCSProcessBMJ12.h
0006  * @author Nabil CHOUIKA (SPhN / CEA Saclay)
0007  * @date 07 October 2015
0008  * @version 1.0
0009  */
0010 
0011 #include <complex>
0012 #include <string>
0013 #include <vector>
0014 
0015 #include "../../../beans/gpd/GPDType.h"
0016 #include "../../../utils/type/PhysicalType.h"
0017 #include "DVCSProcessModule.h"
0018 
0019 namespace PARTONS {
0020 
0021 /**
0022  * @class DVCSProcessBMJ12
0023  *
0024  * Module for the DVCS process using the Belitsky-Müller set of formulas.
0025  *
0026  * Code based on the published papers:
0027  * - arxiv:hep-ph/0112108 @cite Belitsky2001ns for the BH amplitude ;
0028  * - arxiv:1212.6674 @cite Belitsky2012ch for the DVCS amplitude and interference.
0029  */
0030 class DVCSProcessBMJ12: public DVCSProcessModule {
0031 public:
0032     static const unsigned int classId; ///< Unique ID to automatically register the class in the registry.
0033 
0034     /**
0035      * Constructor.
0036      * See BaseObject::BaseObject and ModuleObject::ModuleObject for more details.
0037      *
0038      * @param className name of child class.
0039      */
0040     DVCSProcessBMJ12(const std::string &className);
0041     /**
0042      * Default destructor.
0043      */
0044     virtual ~DVCSProcessBMJ12();
0045 
0046     virtual DVCSProcessBMJ12* clone() const;
0047 
0048 protected:
0049     /**
0050      * Copy constructor.
0051      *
0052      * Used by the factory.
0053      *
0054      * @param other
0055      */
0056     DVCSProcessBMJ12(const DVCSProcessBMJ12& other);
0057 
0058     virtual void initModule();
0059     virtual void isModuleWellConfigured();
0060 
0061     // Cross sections
0062     virtual PhysicalType<double> CrossSectionBH();
0063     virtual PhysicalType<double> CrossSectionVCS();
0064     virtual PhysicalType<double> CrossSectionInterf();
0065 
0066 private:
0067 
0068     // The vectors here are actually static arrays, DO NOT PUSH BACK OR POP BACK.
0069     // Use them as arrays! Size fixed in the constructor.
0070 
0071     double m_phi1BMK; ///< Angle small phi of BMK (between electron and outgoing proton).
0072     double m_phi2BMK; ///< Angle small phi of BMK (between target polarization and outgoing proton).
0073     double m_PhiBMK; ///< Angle capital Phi of BMK (between electron and target polarization).
0074     double m_theta; ///< Polarization angle of target.
0075     double m_Lambda; ///< Longitudinal polarization of target.
0076     double m_lambda; ///< Lepton helicity.
0077     double m_phaseSpace; ///< Phase-space factor.
0078 
0079     double m_xB2; ///< Square of xB.
0080     std::vector<double> m_Q; ///< Square root of virtuality Q2.
0081                              ///< m_Q[0] = Q, m_Q[1] = Q^2, etc...
0082     std::vector<double> m_xBtQ2;
0083     std::vector<double> m_M; ///< Proton mass.
0084                              ///< m_M[0] = M, m_M[1] = M^2, etc...
0085     std::vector<double> m_yBMJ; ///< Lepton energy fraction.
0086                                 ///< m_y[0] = y, m_y[1] = y^2, etc...
0087     std::vector<double> m_epsilonBMJ; ///<
0088                                       ///< m_epsilon[0] = epsilon, m_epsilon[1] = epsilon^2, etc...
0089     std::vector<double> m_epsroot; ///< sqrt(1+epsilon^2)
0090     std::vector<double> m_K, m_Kt; ///< Kinematical factors K and K tilde.
0091                                    ///< m_K[0] = K, m_K[1] = K^2, etc...
0092     std::vector<double> m_Delta2; ///< Mandelstam variable t.
0093                                   ///< m_Delta2[0] = t, m_Delta2[1] = Delta^4 = t^2, etc...
0094 
0095                                   //@{
0096     double m_P1, m_P2; ///< Lepton propagators.
0097     //@}
0098 
0099     void defineAngles(const NumA::Vector3D &targetPolarization); ///< Defines the BMK angles. Conversion to the BMK convention.
0100 
0101     double m_F1, m_F2; ///< Dirac and Pauli form factors.
0102     void computeFormFactors(); ///< Compute F1 and F2 form factors.
0103 
0104     /* Bethe Heitler coeffs (BMK2002) */
0105     /** Fourier coeffs of the BH squared amplitude.
0106      *  1st index: [0]=unp, [1]=LP, [2]=TP. \n
0107      *  2nd index: [0]=c0, [1]=c1, [2]=c2.
0108      */
0109     std::vector<std::vector<double> > m_cBH;
0110 
0111     double m_s1BHTP; ///< BH Fourier coeff s1 TP.
0112 
0113     void computeFourierCoeffsBH(); ///< Computes c_BH and s_BH.
0114 
0115     /* VCS coeffs (BMJ2012) */
0116     /** Fourier coeffs (cosinus) of the VCS squared amplitude.
0117      *  1st index: [0]=unp, [1]=LP, [2]=TP. \n
0118      *  2nd index: [0]=c0, [1]=c1, [2]=c2.
0119      */
0120     std::vector<std::vector<double> > m_cVCS;
0121     /** Fourier coeffs (sinus) of the VCS squared amplitude.
0122      *  1st index: [0]=unp, [1]=LP, [2]=TP. \n
0123      *  2nd index: [0]=0., [1]=s1, [2]=s2.
0124      */
0125     std::vector<std::vector<double> > m_sVCS;
0126 
0127     void computeFourierCoeffsVCS(); ///< Computes c_VCS and s_VCS.
0128 
0129     /* Interference coeffs (BMJ2012) */
0130     /** Fourier coeffs (cosinus) of the Interference term.
0131      *  1st index: [0]=unp, [1]=LP, [2]=TP. \n
0132      *  2nd index: [0]=c0, [1]=c1, [2]=c2, [3]=c3.
0133      */
0134     std::vector<std::vector<double> > m_cI;
0135     /** Fourier coeffs (sinus) of the Interference term.
0136      *  1st index: [0]=unp, [1]=LP, [2]=TP. \n
0137      *  2nd index: [0]=0., [1]=s1, [2]=s2, [3]=s3.
0138      */
0139     std::vector<std::vector<double> > m_sI;
0140     //@{
0141     /** Angular coeffs @f$ C_ab(n) @f$, @f$ dC_ab(n) @f$, @f$ S_ab(n) @f$, @f$ dS_ab(n) @f$ ..
0142      * 1st index: [0]=C++, [1]=C-+, [2]=C0+. \n
0143      * 2nd index: [0]=not, [1]=V, [2]=A. \n
0144      * 3rd index: n
0145      */
0146     std::vector<std::vector<std::vector<double> > > m_C, m_S, m_dC, m_dS;
0147     //@}
0148 
0149     void computeAngularCoeffsInterf(); ///< Computes C_ab(n), S_ab(n), etc.
0150     void computeFourierCoeffsInterf(); ///< Computes c_I and s_I.
0151 
0152     /** Coefficients used for computing F+b and F0+.
0153      * 1st index: [0] = F++, [1] = F+-, [2] = F0+. \n
0154      * 2nd index: [0]: F coeff, [1]: FT coeff, [2]: FLT coeff.
0155      */
0156     std::vector<std::vector<double> > m_cF;
0157 
0158     /** Array that stores the CFFs F+b and F0+.
0159      * 1st index: [0] = H, [1] = E, [2] = Ht, [3] = Et. \n
0160      * 2nd index: [0] = F++, [1] = F+-, [2] = F0+.
0161      */
0162     std::vector<std::vector<std::complex<double> > > m_CFF;
0163 
0164     /** Method that gives F+b and F0+ already calculated.
0165      */
0166     std::complex<double> CFF(GPDType::Type F, int a, int b);
0167 
0168     void computeCFFs(); ///< Computes CFFS F+b and F0+.
0169 
0170     //@{
0171     /** Method that gives the VCS coefficient bilinear in the CFFs.
0172      *
0173      * @param S 0=unp, 1=LP, 2=TP+, 3=TP-
0174      */
0175     std::complex<double> C_VCS(unsigned int S, int a1, int b1, int a2, int b2);
0176     std::complex<double> C_VCS(unsigned int S, int a1, int b1, int a2, int b2,
0177             int a3, int b3);
0178     std::complex<double> C_VCS(unsigned int S, int a1, int b1, int a2, int b2,
0179             int a3, int b3, int a4, int b4);
0180     //@}
0181 
0182     /** Method that gives the Interference coefficient linear in the CFFs.
0183      *
0184      * @param S 0=unp, 1=LP, 2=TP+, 3=TP-.
0185      * @param VA can be "V" or "A" or "".
0186      */
0187     std::complex<double> C_I(unsigned int S, int a, int b,
0188             const std::string& VA);
0189     /** Method that gives the "effective" linear combinations of CFFs.
0190      * Corresponds to Eqs. (68-69) but multiplied by the coefficient @f$ C_{ab}(n) @f$
0191      * to avoid divisions by zero.
0192      * @param S 0=unp, 1=LP, 2=TP+, 3=TP-.
0193      * @param n
0194      * @param a
0195      * @param b
0196      * @return @f$ {\cal C}_{ab,S}(n|Fab) \times C_{ab}(n) @f$
0197      */
0198     std::complex<double> C_I(unsigned int S, unsigned int n, int a, int b);
0199     /** Method that gives the "effective" linear combinations of CFFs.
0200      * Corresponds to Eqs. (68-69) but multiplied by the coefficient @f$ S_{ab}(n) @f$
0201      * to avoid divisions by zero.
0202      * @param S 0=unp, 1=LP, 2=TP+, 3=TP-.
0203      * @param n
0204      * @param a
0205      * @param b
0206      * @return @f$ {\cal S}_{ab,S}(n|Fab) \times S_{ab}(n) @f$
0207      */
0208     std::complex<double> S_I(unsigned int S, unsigned int n, int a, int b);
0209 
0210     double SqrAmplBH(double beamHelicity, double beamCharge,
0211             NumA::Vector3D targetPolarization); ///< Returns the squared amplitude of Bethe Heitler process.
0212     double SqrAmplVCS(double beamHelicity, double beamCharge,
0213             NumA::Vector3D targetPolarization); ///< Returns the squared amplitude of VCS process.
0214     double SqrAmplInterf(double beamHelicity, double beamCharge,
0215             NumA::Vector3D targetPolarization); ///< Returns the interference term of the squared amplitude.
0216 };
0217 
0218 } /* namespace PARTONS */
0219 
0220 #endif /* DVCS_PROCESS_BMJ12_H */