Back to home page

EIC code displayed by LXR

 
 

    


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

0001 #ifndef GPDEVOLUTIONVINNIKOV_H
0002 #define GPDEVOLUTIONVINNIKOV_H
0003 
0004 /**
0005  * @file GPDEvolutionVinnikov.h
0006  * @author Pawel Sznajder (NCBJ)
0007  * @date June 01, 2017
0008  * @version 1.0
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    * @class GPDEvolutionVinnikov
0028    *
0029    * @brief GPD evolution according to Vinnikov routines.
0030    *
0031    * This class makes use of original Vinnikov routines for the GPD evolution. For the reference see Ref. \cite{Vinnikov:2006xw}.
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 &parameters);
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      * Get constant iterator for given std::map<QuarkNonSingletCombination::Type, double> map and key.
0120      * @param map Map.
0121      * @param key Key.
0122      * @param mapName Map name.
0123      * @return Requested const iterator.
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      * Get map containing non-singlet values for given number of active flavors from PartonDistribution object.
0147      * @param nFlavors Number of active flavors.
0148      * @param partonDistribution Input PartonDistribution object.
0149      * @return Map containing non-singlet values.
0150      */
0151     std::map<QuarkNonSingletCombination::Type, double> getNS(const size_t nFlavors, const PartonDistribution& partonDistribution) const;
0152 
0153     /**
0154      * Get singlet value for given number of active flavors from PartonDistribution object.
0155      * @param nFlavors Number of active flavors.
0156      * @param partonDistribution Input PartonDistribution object.
0157      * @return Singlet value.
0158      */
0159     double getS(const size_t nFlavors,
0160             const PartonDistribution& partonDistribution) const;
0161 
0162     /**
0163      * Get value for gluon contribution from PartonDistribution object.
0164      * @param partonDistribution Input PartonDistribution object.
0165      * @return Value for gluon contribution.
0166      */
0167     double getG(const PartonDistribution& partonDistribution) const;
0168 
0169     /**
0170      * Get constant iterator for given std::map<QuarkFlavor::Type, QuarkDistribution> map and key.
0171      * @param map Map.
0172      * @param key Key.
0173      * @param mapName Map name.
0174      * @return Requested const iterator.
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      * Get PartonDistribution object for given number of active flavors from non-singlet, singlet and gluon values.
0182      * @param nFlavors Number of active flavors.
0183      * @param NS Map containing non-singlet values.
0184      * @param S Singlet value.
0185      * @param G Value for gluon contribution.
0186      * @return PartonDistribution object.
0187      */
0188     PartonDistribution getPartonDistribution(const size_t nFlavors, const std::map<QuarkNonSingletCombination::Type, double>& NS, double S, double G) const;
0189 
0190     /**
0191      * Initialize functors for integration.
0192      */
0193     void initFunctorsForIntegrations();
0194 
0195     NumA::FunctionType1D* p_intIntegrateComputeOutputNS; ///< Functor to GPDEvolutionModule::integrateComputeOutputNS.
0196     NumA::FunctionType1D* p_intIntegrateComputeOutputS; ///< Functor to GPDEvolutionModule::integrateComputeOutputS.
0197     NumA::FunctionType1D* p_intIntegrateComputeOutputG; ///< Functor to GPDEvolutionModule::integrateComputeOutputG.
0198 
0199     /**
0200      * Wrapper to integrate GPDEvolutionModule::nonSingletMu2FDerivative.
0201      */
0202     double integrateComputeOutputNS(double MuF2, std::vector<double> par);
0203 
0204     /**
0205      * Wrapper to integrate GPDEvolutionModule::singletMuF2Derivative.
0206      */
0207     double integrateComputeOutputS(double MuF2, std::vector<double> par);
0208 
0209     /**
0210      * Wrapper to integrate GPDEvolutionModule::gluonMuF2Derivative.
0211      */
0212     double integrateComputeOutputG(double MuF2, std::vector<double> par);
0213   };
0214 
0215 } /* namespace PARTONS */
0216 
0217 #endif /* VINNIKOV_EVOLUTION_MODEL_H */