GAM2CFFStandard.h 9.97 KB
Newer Older
Pawel Sznajder's avatar
Pawel Sznajder committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef GAM2_CFF_STANDARD_H
#define GAM2_CFF_STANDARD_H

/**
 * @file GAM2CFFStandard.h
 * @author Bryan BERTHOU (SPhN / CEA Saclay)
 * @author Hervé MOUTARDE (SPhN / CEA Saclay)
 * @author Hervé MOUTARDE (SPhN / CEA Saclay)
 * @date September 08, 2014
 * @version 1.0
 */

#include <complex>
#include <map>
#include <string>
#include <vector>

#include "../../../beans/automation/BaseObjectData.h"
#include "GAM2ConvolCoeffFunctionModule.h"

Pawel Sznajder's avatar
improve    
Pawel Sznajder committed
21
22
23
#include "../../../../../include/algorithm/LiSK/lisk.hpp"


Pawel Sznajder's avatar
Pawel Sznajder committed
24
25
26
27
28
29
30
31
32
namespace NumA {
class FunctionType1D;
} /* namespace NumA */
namespace PARTONS {
class PartonDistribution;
} /* namespace PARTONS */

namespace PARTONS {

Pawel Sznajder's avatar
Pawel Sznajder committed
33
34
35
36
37
38
39
40
struct GAM2CFFStandardIntegrationParameters {

    NumA::FunctionType1D* m_pIntegrator;
    std::vector<double> m_parameters;
};

double GAM2CFFStandardIntegrationFunction(double x, void* p);

Pawel Sznajder's avatar
Pawel Sznajder committed
41
42
43
/**
 * @class GAM2CFFStandard
 *
Oskar Grocholski's avatar
Oskar Grocholski committed
44
45
46
47
48
49
50
 * Class used to compute CFF for photoproduction of diphoton
 * Used formulas are presented in
 * https://arxiv.org/pdf/2108.03426.pdf
 * (called the NLO paper),
 * in some cases we refer also to:
 * https://arxiv.org/pdf/2108.03426.pdf
 * (OG's MSc thesis)
Pawel Sznajder's avatar
Pawel Sznajder committed
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 *
 * Available CFF types: H, E, Ht, Et.
 */
class GAM2CFFStandard: public GAM2ConvolCoeffFunctionModule {
public:

    static const unsigned int classId; ///< Unique ID to automatically register the class in the registry.

    /**
     * Constructor.
     * See BaseObject::BaseObject and ModuleObject::ModuleObject for more details.
     * @param className Name of last child class.
     */
    GAM2CFFStandard(const std::string &className);

    virtual GAM2CFFStandard* clone() const;

    /**
     * Default destructor.
     */
    virtual ~GAM2CFFStandard();

    virtual void resolveObjectDependencies();

    void prepareSubModules(
            const std::map<std::string, BaseObjectData>& subModulesData);

    // ##### GETTERS & SETTERS #####

    /**
     * Get alphaS module.
     */
    RunningAlphaStrongModule* getRunningAlphaStrongModule() const;

    /**
     * Set alphaS module.
     */
    void setRunningAlphaStrongModule(
            RunningAlphaStrongModule* pRunningAlphaStrongModule);

91
92
93
94
95
96
97
98
99
100
101
102
103
protected:
    /**
     * Copy constructor.
     * @param other
     */
    GAM2CFFStandard(const GAM2CFFStandard &other);

    virtual void initModule();
    virtual void isModuleWellConfigured();

    virtual std::complex<double> computeUnpolarized();
    virtual std::complex<double> computePolarized();

104
105
    double m_CF;                     ///< ( Nc^2 - 1 ) / ( 2 Nc ) (colour)
    double m_alphaSOver2Pi;
106
107


108
109
private:

Pawel Sznajder's avatar
improve    
Pawel Sznajder committed
110
111
112
    LiSK::LiSK<std::complex<double> > m_lisk;

    double gslIntegrationWrapper(NumA::FunctionType1D* functor, NumA::FunctionType1D* functorSym, NumA::FunctionType1D* functorSymConst,
Pawel Sznajder's avatar
Pawel Sznajder committed
113
            const std::vector<double>& range, std::vector<double>& params) ;
Pawel Sznajder's avatar
Pawel Sznajder committed
114

115
116
    RunningAlphaStrongModule *m_pRunningAlphaStrongModule; ///< Related alphaS module.

117
118
    NumA::FunctionType1D* m_pConvol_NLO_V_Re;
    NumA::FunctionType1D* m_pConvol_NLO_V_Im;
Pawel Sznajder's avatar
improve    
Pawel Sznajder committed
119
120
121
122
    NumA::FunctionType1D* m_pConvol_NLO_V_Re_Sym;
    NumA::FunctionType1D* m_pConvol_NLO_V_Im_Sym;
    NumA::FunctionType1D* m_pConvol_NLO_V_Re_Sym_Const;
    NumA::FunctionType1D* m_pConvol_NLO_V_Im_Sym_Const;
123

124
125
126
127
128
129
130
131
132
    double m_quark_diagonal_V;
    double m_quark_diagonal_A;

    double computeCubedChargeAveragedGPD(
            const PartonDistribution &partonDistribution);

    void computeDiagonalGPD_V();
    void computeDiagonalGPD_A();

133
134
    void initFunctorsForIntegrations(); ///< Initialize functors.

135
   // double exampleIntegration(double x, std::vector<double> params); ///< Exemplary integration.
136

Oskar Grocholski's avatar
Oskar Grocholski committed
137
    // Trace \mathcal{A}, NLO paper, Eq. (21)
138
139
    double A(double, std::vector<double>, std::vector<double>, std::vector<double>);

Oskar Grocholski's avatar
Oskar Grocholski committed
140
    // LO amplitude for single photons permutation, NLO paper, Eq. (20)
141
142
143
    std::complex<double> M0(double, double, double,
            std::vector<double>, std::vector<double>, std::vector<double>);

Oskar Grocholski's avatar
Oskar Grocholski committed
144
145
    // Sum of finite parts of amplitudes 2.L/R and 3.L/R, NLO paper, Eqs. (26)-(29)
    // NOTE: the factorization scale dependent term is included in the collinear part!
146
147
    std::complex<double> M23LR(double, double, double,
            std::vector<double>, std::vector<double>, std::vector<double>);
148

Pawel Sznajder's avatar
Pawel Sznajder committed
149
    // M3M amplitude, NLO paper, Eq. (30)
150
151
152
    std::complex <double> M3M(double, double, double,
                              std::vector<double>, std::vector<double>, std::vector<double>);

Oskar Grocholski's avatar
Oskar Grocholski committed
153
154
155
156
    // Trace structures in amplitudes 4.L and 5.L,
    // NLO paper, Eqs. (43)-(44), see also the Mathematica notebook Traces
    // Tr_4/5L_Fnab is the trace multiplying the function F_nab (see NLO paper)

157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
    double Tr_4L_F210(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_4L_F201(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_4L_F211(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_4L_F220(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_4L_F221(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_4L_F100(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_4L_F110(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_4L_G(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_5L_F201(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_5L_F210(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_5L_F211(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_5L_F220(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_5L_F221(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_5L_F100(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_5L_F110(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    double Tr_5L_G(double xi, double s, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);

Oskar Grocholski's avatar
Oskar Grocholski committed
174
    // Functions F_nab
175
176
177
178
179
180
181
182

    std::complex<double> F100(std::complex<double> a, std::complex<double> b, std::complex<double> c);
    std::complex<double> F110(std::complex<double> a, std::complex<double> b, std::complex<double> c);
    std::complex<double> F210(std::complex<double> a, std::complex<double> b, std::complex<double> c);
    std::complex<double> F211(std::complex<double> a, std::complex<double> b, std::complex<double> c);
    std::complex<double> F220(std::complex<double> a, std::complex<double> b, std::complex<double> c);
    std::complex<double> F221(std::complex<double> a, std::complex<double> b, std::complex<double> c);
    std::complex<double> G(std::complex<double> a, std::complex<double> b, std::complex<double> c);
Pawel Sznajder's avatar
improve    
Pawel Sznajder committed
183
    std::complex<double> GNew(double x, double xi, const std::vector<double>& beta);
Oskar Grocholski's avatar
Oskar Grocholski committed
184
185
    std::complex<double> F201New(double x, double xi, const std::vector<double>& beta);
    std::complex<double> F210New(double x, double xi, const std::vector<double>& beta);
186
187
    std::complex<double> F110New(double x, double xi, const std::vector<double>& beta);
    std::complex<double> F100New(double x, double xi, const std::vector<double>& beta);
188

189
190


Oskar Grocholski's avatar
Oskar Grocholski committed
191
192
193
    // Amplitudes 4.L/R and 5.L/R, NLO paper, Eqs. (43)-(44)
    // For .R amplitudes, see the comment below Eq. (44) in the NLO paper
    // ATTENTION! Terms from the last lines of (43)-(44) are included in M_scale
194
195
196
197
198

    std::complex<double> M4L(double s, double x, double xi,
                      std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    std::complex<double> M5L(double s, double x, double xi,
                      std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
199
200
201
202
    std::complex<double> M4R(double s, double x, double xi,
                      std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
    std::complex<double> M5R(double s, double x, double xi,
                      std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
Pawel Sznajder's avatar
Pawel Sznajder committed
203

Oskar Grocholski's avatar
Oskar Grocholski committed
204
205
    // Artefact of using a different definition of the hard scale in OG's MSc thesis,
    // see the comment after Eq. (44) in NLO paper
206
207
    std::complex<double> M_scale(double s, double x, double xi,
            std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
Pawel Sznajder's avatar
Pawel Sznajder committed
208

Oskar Grocholski's avatar
Oskar Grocholski committed
209
210
211
212
213
    // The collinear term.
    // For now, it implements formulas (3.105)-(3.106) from OG's MSc thesis
    // In particular, it is the contribution from the single permutation of photons!
    // Do not mistake it with Eq. (40) in NLO paper.
    // TODO re-write it so that it implements Eq. (40) from NLO paper
214
215
    std::complex<double> Ccoll(double s, double x, double xi,
            std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
Pawel Sznajder's avatar
Pawel Sznajder committed
216

217
    // Vector NLO amplitude - a single permutation of photons
Oskar Grocholski's avatar
Oskar Grocholski committed
218
    // See the description at the beginning of IV.A in NLO paper
219
    std::complex<double> NLO_V_permutation(double s, double x, double xi, std::vector<double> beta, std::vector<double> ee, std::vector<double> ek);
Pawel Sznajder's avatar
Pawel Sznajder committed
220

221
    // The full NLO vector amplitude
222
223
224
225
    std::complex<double> Convol_NLO_V(double x, std::vector<double> params);

    double Convol_NLO_V_Re(double x, std::vector<double> params);
    double Convol_NLO_V_Im(double x, std::vector<double> params);
Pawel Sznajder's avatar
improve    
Pawel Sznajder committed
226
227
228
229
    double Convol_NLO_V_Re_Sym(double x, std::vector<double> params);
    double Convol_NLO_V_Im_Sym(double x, std::vector<double> params);
    double Convol_NLO_V_Re_Sym_Const(double x, std::vector<double> params);
    double Convol_NLO_V_Im_Sym_Const(double x, std::vector<double> params);
230

Pawel Sznajder's avatar
Pawel Sznajder committed
231
232
233
234
235
236

};

} /* namespace PARTONS */

#endif /* GAM2_CFF_STANDARD_H */