File indexing completed on 2026-06-02 08:51:45
0001 #ifndef GPDEVOLUTIONVINNIKOV_H
0002 #define GPDEVOLUTIONVINNIKOV_H
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <ElementaryUtils/parameters/Parameters.h>
0012 #include <NumA/linear_algebra/matrix/MatrixD.h>
0013 #include <NumA/integration/one_dimension/Integrator1D.h>
0014 #include <stddef.h>
0015 #include <map>
0016 #include <string>
0017 #include <vector>
0018
0019 #include "../../active_flavors_thresholds/ActiveFlavorsThresholdsModule.h"
0020 #include "../../../beans/QuarkNonSingletCombination.h"
0021 #include "../../MathIntegratorModule.h"
0022 #include "GPDEvolutionModule.h"
0023
0024 namespace PARTONS {
0025
0026
0027
0028
0029
0030
0031
0032
0033 class GPDEvolutionVinnikov: public GPDEvolutionModule, public MathIntegratorModule {
0034
0035 public:
0036
0037 static const std::string PARAM_NAME_GRID_SIZE;
0038
0039 static const unsigned int classId;
0040
0041 GPDEvolutionVinnikov(const std::string &className);
0042 virtual ~GPDEvolutionVinnikov();
0043 virtual GPDEvolutionVinnikov* clone() const;
0044 virtual void configure(const ElemUtils::Parameters ¶meters);
0045 virtual void resolveObjectDependencies();
0046
0047 size_t getGridSize() const;
0048 void setGridSize(size_t gridSize);
0049
0050 protected:
0051
0052 GPDEvolutionVinnikov(const GPDEvolutionVinnikov& other);
0053
0054 virtual void isModuleWellConfigured();
0055 virtual void initModule();
0056 virtual PartonDistribution compute(GPDModule* pGPDModule, const GPDType::Type &type);
0057
0058 virtual double nonSingletMu2FDerivative(double MuF2, QuarkNonSingletCombination::Type quarkNonSingletCombination);
0059 virtual double singletMuF2Derivative(double MuF2);
0060 virtual double gluonMuF2Derivative(double MuF2);
0061
0062 void computeMuF2DerivativeNS(double MuF2, double MuF2Last, QuarkNonSingletCombination::Type quarkNonSingletCombination);
0063 void computeMuF2DerivativeSG(double MuF2, double MuF2Last);
0064
0065 private:
0066
0067 std::map<QuarkNonSingletCombination::Type, std::vector<double> > m_NS;
0068 std::vector<double> m_S;
0069 std::vector<double> m_G;
0070
0071 std::map<QuarkNonSingletCombination::Type, std::vector<double> > m_NSDiff;
0072 std::vector<double> m_SDiff;
0073 std::vector<double> m_GDiff;
0074
0075 std::map<QuarkNonSingletCombination::Type, std::vector<double> > m_NSEvolved;
0076 std::vector<double> m_SEvolved;
0077 std::vector<double> m_GEvolved;
0078
0079 std::map<QuarkNonSingletCombination::Type, bool> m_NSEvoledForFirstTime;
0080 bool m_SEvoledForFirstTime;
0081 bool m_GEvoledForFirstTime;
0082
0083 std::map<QuarkNonSingletCombination::Type, double> m_NSResultLast;
0084 double m_SResultLast;
0085 double m_GResultLast;
0086
0087 std::map<QuarkNonSingletCombination::Type, double> m_NSMuF2Last;
0088 double m_SMuF2Last;
0089 double m_GMuF2Last;
0090
0091 std::vector<double> m_NSXGrid;
0092 std::vector<double> m_SXGrid;
0093
0094 void clearVectors(bool lastKinematicsDifferent);
0095
0096 void checkIfGridsValid();
0097 void checkIfResultValid(const double x, double& value);
0098 void checkEvolutionDirection(const double MuF2, const double MuF2Last) const;
0099
0100 size_t m_gridSize;
0101 double m_xiLast;
0102 double m_tLast;
0103 double m_MuR2Last;
0104 size_t m_nFlavors;
0105 size_t m_nFlavors_ref;
0106
0107 GPDModule* m_pGPDModule;
0108 PartonDistribution m_PartonDistributionAtMuF2_ref;
0109
0110 static const double N_C;
0111 static const double C_F;
0112 static const double N_F;
0113 static const double B_0;
0114 static const double C_A;
0115 static const double T_R;
0116 std::map<size_t, NumA::MatrixD> conversionMatrices;
0117
0118
0119
0120
0121
0122
0123
0124
0125 inline std::map<QuarkNonSingletCombination::Type, double>::const_iterator findInQuarkNonSingletCombinationMap(
0126 const std::map<QuarkNonSingletCombination::Type, double>& map,
0127 QuarkNonSingletCombination::Type key,
0128 const std::string& mapName) const;
0129
0130 double conv_int_ns(int const ix, double const xi, int const n, const std::vector<double>& gpd, const std::vector<double>& x);
0131
0132 double conv_int_qq(int const ix, double const xi, int const n, const std::vector<double>& gpd, const std::vector<double>& x);
0133 double conv_int_gg(int const ix, double const xi, int const n, const std::vector<double>& gpd, const std::vector<double>& x);
0134 double conv_int_gq(int const ix, double const xi, int const n, const std::vector<double>& gpd, const std::vector<double>& x);
0135 double conv_int_qg(int const ix, double const xi, int const n, const std::vector<double>& gpd, const std::vector<double>& x);
0136
0137 double conv_int_qq_pol(int const ix, double const xi, int const n, const std::vector<double>& gpd, const std::vector<double>& x);
0138 double conv_int_gg_pol(int const ix, double const xi, int const n, const std::vector<double>& gpd, const std::vector<double>& x);
0139 double conv_int_gq_pol(int const ix, double const xi, int const n, const std::vector<double>& gpd, const std::vector<double>& x);
0140 double conv_int_qg_pol(int const ix, double const xi, int const n, const std::vector<double>& gpd, const std::vector<double>& x);
0141
0142 int gpd_grid_ns(int const n, double const xi, std::vector<double>& x);
0143 int gpd_grid_s(int const n, double const xi, std::vector<double>& x);
0144
0145
0146
0147
0148
0149
0150
0151 std::map<QuarkNonSingletCombination::Type, double> getNS(const size_t nFlavors, const PartonDistribution& partonDistribution) const;
0152
0153
0154
0155
0156
0157
0158
0159 double getS(const size_t nFlavors,
0160 const PartonDistribution& partonDistribution) const;
0161
0162
0163
0164
0165
0166
0167 double getG(const PartonDistribution& partonDistribution) const;
0168
0169
0170
0171
0172
0173
0174
0175
0176 inline std::map<QuarkFlavor::Type, QuarkDistribution>::const_iterator findInQuarkFlavorMap(
0177 const std::map<QuarkFlavor::Type, QuarkDistribution>& map,
0178 QuarkFlavor::Type key, const std::string& mapName) const;
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188 PartonDistribution getPartonDistribution(const size_t nFlavors, const std::map<QuarkNonSingletCombination::Type, double>& NS, double S, double G) const;
0189
0190
0191
0192
0193 void initFunctorsForIntegrations();
0194
0195 NumA::FunctionType1D* p_intIntegrateComputeOutputNS;
0196 NumA::FunctionType1D* p_intIntegrateComputeOutputS;
0197 NumA::FunctionType1D* p_intIntegrateComputeOutputG;
0198
0199
0200
0201
0202 double integrateComputeOutputNS(double MuF2, std::vector<double> par);
0203
0204
0205
0206
0207 double integrateComputeOutputS(double MuF2, std::vector<double> par);
0208
0209
0210
0211
0212 double integrateComputeOutputG(double MuF2, std::vector<double> par);
0213 };
0214
0215 }
0216
0217 #endif