Commit b8346ad4 authored by Valerio Bertone's avatar Valerio Bertone
Browse files

First implementation of collinear-distribution evolution through APFEL implemented

parent ab660101
......@@ -48,26 +48,29 @@ add_definitions(${QT_DEFINITIONS})
# find libraries: additional modules
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
# find libraries: SFML
find_package(SFML COMPONENTS system REQUIRED)
# find libraries: CLN
find_package(CLN REQUIRED)
# find libraries: ElementaryUtils
find_package(ElementaryUtils REQUIRED)
# find libraries: NumA++
find_package(NumA++ REQUIRED)
# find libraries: SFML
find_package(SFML COMPONENTS system REQUIRED)
# find libraries: CLN
find_package(CLN REQUIRED)
# find libraries: GSL
find_package(GSL REQUIRED)
# find libraries: Apfel++
find_package(Apfel++ REQUIRED)
# find libraries: LHAPDF
find_package(LHAPDF REQUIRED)
# directories containing headers
include_directories(${QT_INCLUDE_DIRS} ${SFML_INCLUDE_DIR} ${CLN_INCLUDE_DIR} ${ElementaryUtils_INCLUDE_DIR} ${NumA++_INCLUDE_DIR} ${LHAPDF_INCLUDE_DIR})
include_directories(${QT_INCLUDE_DIRS} ${SFML_INCLUDE_DIR} ${CLN_INCLUDE_DIR} ${ElementaryUtils_INCLUDE_DIR} ${NumA++_INCLUDE_DIR} ${Apfel++_INCLUDE_DIR} ${LHAPDF_INCLUDE_DIR})
include_directories(include)
# FINALIZE ==================================================================================
......@@ -111,6 +114,8 @@ target_link_libraries(
${GSL_LIBRARIES}
${Apfel++_LIBRARIES}
${LHAPDF_LIBRARIES}
Qt5::Core
......
# APFEL++
find_program(Apfel++_CONFIG apfelxx-config REQUIRED)
if (Apfel++_CONFIG)
exec_program(${Apfel++_CONFIG}
ARGS --cppflags
OUTPUT_VARIABLE Apfel++_CXX_FLAGS
)
set(Apfel++_CXX_FLAGS ${Apfel++_CXX_FLAGS} CACHE STRING INTERNAL)
exec_program(${Apfel++_CONFIG}
ARGS --ldflags
OUTPUT_VARIABLE Apfel++_LIBRARIES
)
set(Apfel++_LIBRARIES ${Apfel++_LIBRARIES} CACHE STRING INTERNAL)
exec_program(${Apfel++_CONFIG}
ARGS --version
OUTPUT_VARIABLE Apfel++_VERSION
)
set(Apfel++_VERSION ${Apfel++_VERSION} CACHE STRING INTERNAL)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Apfel++ REQUIRED_VARS Apfel++_LIBRARIES VERSION_VAR Apfel++_VERSION)
endif(Apfel++_CONFIG)
......@@ -26,7 +26,7 @@ function(_cl_get_version _out_major _out_minor _out_patch _cl_version_h)
message(FATAL_ERROR "failed to determine CL_VERSION_PATCHLEVEL, "
"expected a number, got ${${_out_patch}}")
endif()
message(STATUS "found CLN [${_cl_version_h}], version ${${_out_major}}.${${_out_minor}}.${${_out_patch}}")
#message(STATUS "found CLN [${_cl_version_h}], version ${${_out_major}}.${${_out_minor}}.${${_out_patch}}")
set(${_out_major} ${${_out_major}} PARENT_SCOPE)
set(${_out_minor} ${${_out_minor}} PARENT_SCOPE)
set(${_out_patch} ${${_out_patch}} PARENT_SCOPE)
......@@ -74,6 +74,7 @@ if (CLN_INCLUDE_DIR)
endif()
endif()
set(CMAKE_REQUIRED_QUIET TRUE)
# Check if the version embedded into the library is the same as the one in the headers.
if (CLN_INCLUDE_DIR AND CLN_LIBRARIES AND NOT CMAKE_CROSSCOMPILING)
include(CheckCXXSourceRuns)
......
......@@ -36,7 +36,7 @@ else (ElementaryUtils_INCLUDE_DIR AND ElementaryUtils_LIBRARIES)
PATH_SUFFIXES lib/PARTONS lib64/PARTONS bin/PARTONS lib lib64 bin)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(ElementaryUtils DEFAULT_MSG ElementaryUtils_INCLUDE_DIR ElementaryUtils_LIBRARIES)
find_package_handle_standard_args(ElementaryUtils DEFAULT_MSG ElementaryUtils_LIBRARIES)
endif(ElementaryUtils_INCLUDE_DIR AND ElementaryUtils_LIBRARIES)
......@@ -11,4 +11,12 @@ if (LHAPDF_CONFIG)
OUTPUT_VARIABLE LHAPDF_LIBRARIES
)
set(LHAPDF_LIBRARIES ${LHAPDF_LIBRARIES} CACHE STRING INTERNAL)
exec_program(${LHAPDF_CONFIG}
ARGS --version
OUTPUT_VARIABLE LHAPDF_VERSION
)
set(LHAPDF_VERSION ${LHAPDF_VERSION} CACHE STRING INTERNAL)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LHAPDF REQUIRED_VARS LHAPDF_LIBRARIES VERSION_VAR LHAPDF_VERSION)
endif(LHAPDF_CONFIG)
......@@ -40,7 +40,7 @@ else (NumA++_INCLUDE_DIR AND NumA++_LIBRARIES)
PATH_SUFFIXES lib/PARTONS lib64/PARTONS bin/PARTONS lib lib64 bin)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(NumA++ DEFAULT_MSG NumA++_INCLUDE_DIR NumA++_LIBRARIES)
find_package_handle_standard_args(NumA++ DEFAULT_MSG NumA++_LIBRARIES)
endif(NumA++_INCLUDE_DIR AND NumA++_LIBRARIES)
......@@ -365,5 +365,6 @@ endif()
# handle success
if(SFML_FOUND AND NOT SFML_FIND_QUIETLY)
message(STATUS "Found SFML ${SFML_VERSION_MAJOR}.${SFML_VERSION_MINOR}.${SFML_VERSION_PATCH} in ${SFML_INCLUDE_DIR}")
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SFML REQUIRED_VARS SFML_LIBRARIES VERSION_VAR SFML_VERSION_MINOR)
endif()
......@@ -34,7 +34,7 @@ class CollinearDistributionKinematic: public Kinematic {
public:
static const std::string COLLINEAR_DISTRIBUTION_KNEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
static const std::string COLLINEAR_DISTRIBUTION_KINEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
/**
* Parameter name to set variable \f$x\f$ via configuration methods.
......
......@@ -30,7 +30,7 @@ class DVCSConvolCoeffFunctionKinematic: public ConvolCoeffFunctionKinematic {
public:
static const std::string DVCS_CONVOL_COEFF_FUNCTION_KNEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
static const std::string DVCS_CONVOL_COEFF_FUNCTION_KINEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
/**
* Default constructor.
......
......@@ -30,7 +30,7 @@ class TCSConvolCoeffFunctionKinematic: public ConvolCoeffFunctionKinematic {
public:
static const std::string TCS_CONVOL_COEFF_FUNCTION_KNEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
static const std::string TCS_CONVOL_COEFF_FUNCTION_KINEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
/**
* Default constructor.
......
......@@ -34,7 +34,7 @@ class GPDKinematic: public Kinematic {
public:
static const std::string GPD_KNEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
static const std::string GPD_KINEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
/**
* Parameter name to set variable \f$x\f$ via configuration methods.
......
......@@ -33,7 +33,7 @@ class GPDSubtractionConstantKinematic: public Kinematic {
public:
static const std::string GPD_SUBTRACTION_CONSTANT_KNEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
static const std::string GPD_SUBTRACTION_CONSTANT_KINEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
/**
* Parameter name to set variable \f$t\f$ via configuration methods.
......
......@@ -30,7 +30,7 @@ class DVCSObservableKinematic: public ObservableKinematic {
public:
static const std::string DVCS_OBSERVABLE_KNEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
static const std::string DVCS_OBSERVABLE_KINEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
/**
* Parameter name to set variable \f$x_{B}\f$ via configuration methods.
......
......@@ -30,7 +30,7 @@ class TCSObservableKinematic: public ObservableKinematic {
public:
static const std::string TCS_OBSERVABLE_KNEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
static const std::string TCS_OBSERVABLE_KINEMATIC_CLASS_NAME; ///< Type of the kinematic in XML automation.
/**
* Parameter name to set variable \f$Q^{2}'\f$ via configuration methods.
......
......@@ -19,15 +19,9 @@
#include "../../ModuleObject.h"
namespace PARTONS {
class CollinearDistributionKinematic;
} /* namespace PARTONS */
namespace PARTONS {
class CollinearDistributionKinematic;
class CollinearDistributionResult;
} /* namespace PARTONS */
namespace PARTONS {
class CollinearDistributionEvolutionModule;
/**
......@@ -52,27 +46,26 @@ public:
virtual void resolveObjectDependencies();
virtual void run();
void virtual configure(const ElemUtils::Parameters &parameters);
virtual void prepareSubModules(
const std::map<std::string, BaseObjectData>& subModulesData);
virtual void prepareSubModules(const std::map<std::string, BaseObjectData>& subModulesData);
/**
* Virtual method, computes collinear distribution with some input parameters.
*
* @param kinematic collinear distribution kinematics object.
* @param colldistType H, Ht, E, Et, ... or ALL. See CollinearDistributionType for more details.
* @param colldistType. See CollinearDistributionType for more details.
* @param evolution Boolean to use evolution.
*
* @return PartonDistribution object.
* Contains results for each flavor of partons.
*/
virtual PartonDistribution compute(const CollinearDistributionKinematic &kinematic,
CollinearDistributionType::Type colldistType);
virtual PartonDistribution compute(const CollinearDistributionKinematic &kinematic, CollinearDistributionType::Type colldistType);
/**
* Virtual method, computes collinear distribution with some input parameters.
*
* @param kinematic collinear distribution kinematics object.
* @param colldistType H, Ht, E, Et, ... or ALL. See CollinearDistributionType for more details.
* @param colldistType. See CollinearDistributionType for more
* details.
*
* @return PartonDistribution object.
* Contains results for each flavor of partons.
......@@ -102,11 +95,6 @@ public:
// ##### GETTERS & SETTERS #####
/**
* Get reference factorization scale used by the collinear distribution model before evolution.
*/
double getMuF2Ref() const;
/**
* Set underlying collinear distribution Evolution module.
*/
......@@ -135,33 +123,25 @@ protected:
* @param kinematic Kinematics to be set.
*/
virtual void setKinematics(const CollinearDistributionKinematic& kinematic);
virtual void initModule();
virtual void isModuleWellConfigured();
/**
* Set current collinear distribution type to be computed.
*/
void setCurrentCollinearDistributionType(CollinearDistributionType::Type colldistType);
virtual void initModule();
virtual void isModuleWellConfigured();
/**
* List of collinear distribution types that can be computed by the child class.
* Needs to be set in the constructor of the child class, with the corresponding methods to be used.
*/
std::map<CollinearDistributionType::Type, PartonDistribution (CollinearDistributionModule::*)()> m_listCollinearDistributionComputeTypeAvailable;
/**
* Iterator.
*/
std::map<CollinearDistributionType::Type, PartonDistribution (CollinearDistributionModule::*)()>::iterator m_it;
double m_x; ///< Longitudinal momentum fraction of the active parton.
double m_MuF2; ///< Factorization scale squared.
double m_MuR2; ///< Renormalization scale squared.
CollinearDistributionType::Type m_currentCollinearDistributionComputeType; ///< Current collinear distribution type.
double m_MuF2_ref; ///< Reference factorization scale used by the collinear distribution model before evolution.
CollinearDistributionEvolutionModule* m_pCollinearDistributionEvolutionModule; ///< Pointer to the underlying collinear distribution Evolution module.
};
......
#ifndef COLLINEAR_DISTRIBUTION_EVOLUTION_APFEL_H
#define COLLINEAR_DISTRIBUTION_EVOLUTION_APFEL_H
/**
* @file CollinearDistributionEvolutionApfel.h
* @author Valerio BERTONE (CEA Saclay)
* @date July 27, 2020
* @version 1.0
*/
#include "CollinearDistributionEvolutionModule.h"
#include "../../../../../include/partons/modules/collinear_distribution/CollinearDistributionModule.h"
#include <apfel/apfelxx.h>
namespace PARTONS {
class RunningAlphaStrongModule;
/**
* @class CollinearDistributionEvolutionApfel
*/
class CollinearDistributionEvolutionApfel: public CollinearDistributionEvolutionModule {
public:
/**
* Settable parameters
*/
static const std::string PARAM_NAME_THRESHOLDS;
static const std::string PARAM_NAME_MASSES;
static const std::string PARAM_NAME_SUBGRID_NODES;
static const std::string PARAM_NAME_SUBGRID_LOWER_BOUNDS;
static const std::string PARAM_NAME_SUBGRID_INTER_DEGREES;
static const std::string PARAM_NAME_TAB_NODES;
static const std::string PARAM_NAME_TAB_LOWER_BOUND;
static const std::string PARAM_NAME_TAB_UPPER_BOUND;
static const std::string PARAM_NAME_TAB_INTER_DEGREE;
/**
* Unique ID to automatically register the class in the registry.
*/
static const unsigned int classId;
/**
* Constructor.
* @param className Name of class.
*/
CollinearDistributionEvolutionApfel(const std::string &className);
/**
* Destructor.
*/
virtual ~CollinearDistributionEvolutionApfel();
virtual CollinearDistributionEvolutionApfel* clone() const;
virtual std::string toString() const;
virtual void resolveObjectDependencies();
virtual void configure(const ElemUtils::Parameters &parameters);
virtual void prepareSubModules(const std::map<std::string, BaseObjectData>& subModulesData);
// ##### GETTERS & SETTERS #####
void setThresholds(const std::vector<double>& thresholds);
void setMasses(const std::vector<double>& masses);
void setSubgridNodes(const std::vector<int>& subgridNodes);
void setSubgridLowerBounds(const std::vector<double>& subgridLowerBounds);
void setSubgridInterDegrees(const std::vector<int>& subgridInterDegrees);
void setTabNodes(const int& tabNodes);
void setTabLowerBound(const double& tabLowerBound);
void setTabUpperBound(const double& tabUpperBound);
void setTabInterDegree(const int& tabInterDegree);
std::vector<double> getThresholds() const;
std::vector<double> getMasses() const;
std::vector<int> getSubgridNodes() const;
std::vector<double> getSubgridLowerBounds() const;
std::vector<int> getSubgridInterDegrees() const;
int getTabNodes() const;
double getTabLowerBound() const;
double getTabUpperBound() const;
int getTabInterDegree() const;
protected:
/**
* Copy constructor.
* @param other Object to be copied.
*/
CollinearDistributionEvolutionApfel(const CollinearDistributionEvolutionApfel &other);
virtual void initModule();
virtual void isModuleWellConfigured();
virtual PartonDistribution compute(CollinearDistributionModule* pCollinearDistributionModule);
std::function<std::map<int, double>(double const&)> initialScaleDistributions(CollinearDistributionModule* pCollinearDistributionModule);
private:
std::vector<double> m_thresholds;
std::vector<double> m_masses;
std::vector<int> m_subgridNodes;
std::vector<double> m_subgridLowerBounds;
std::vector<int> m_subgridInterDegrees;
int m_tabNodes;
double m_tabLowerBound;
double m_tabUpperBound;
int m_tabInterDegree;
std::unique_ptr<apfel::Grid> m_g;
std::unique_ptr<apfel::TabulateObject<apfel::Set<apfel::Operator>>> m_tabulatedOps;
};
} /* namespace PARTONS */
#endif /* COLLINEAR_DISTRIBUTION_EVOLUTION_APFEL_H */
......@@ -8,26 +8,14 @@
* @version 1.0
*/
#include <ElementaryUtils/parameters/Parameters.h>
#include <NumA/linear_algebra/matrix/MatrixD.h>
#include <stddef.h>
#include <map>
#include <string>
#include <vector>
#include "../../../beans/automation/BaseObjectData.h"
#include "../../../ModuleObject.h"
#include "../../../beans/collinear_distribution/CollinearDistributionType.h"
#include "../../../beans/collinear_distribution/CollinearDistributionKinematic.h"
#include "../../../beans/parton_distribution/PartonDistribution.h"
#include "../../../beans/parton_distribution/QuarkDistribution.h"
#include "../../../beans/PerturbativeQCDOrderType.h"
#include "../../../beans/QuarkFlavor.h"
#include "../../../beans/QuarkNonSingletCombination.h"
#include "../../../ModuleObject.h"
#include "../../MathIntegratorModule.h"
namespace PARTONS {
class ActiveFlavorsThresholdsModule;
class CollinearDistributionModule;
class RunningAlphaStrongModule;
......@@ -38,10 +26,15 @@ class RunningAlphaStrongModule;
*
* This class acts as an abstract (mother) class for modules implementing collinear distribution evolution.
*/
class CollinearDistributionEvolutionModule: public ModuleObject, public MathIntegratorModule {
class CollinearDistributionEvolutionModule: public ModuleObject {
public:
/**
* Settable parameters
*/
static const std::string PARAM_NAME_MUF2_REF;
/**
* Type of module name used by the automatization.
*/
......@@ -59,59 +52,29 @@ public:
virtual ~CollinearDistributionEvolutionModule();
virtual CollinearDistributionEvolutionModule* clone() const = 0;
virtual void configure(const ElemUtils::Parameters &parameters);
virtual std::string toString() const;
virtual void resolveObjectDependencies();
virtual void prepareSubModules(
const std::map<std::string, BaseObjectData>& subModulesData);
virtual void configure(const ElemUtils::Parameters &parameters);
virtual void prepareSubModules(const std::map<std::string, BaseObjectData>& subModulesData);
/**
* Evaluate PartonDistribution.
* @param x Longitudinal momentum of active parton.
* @param MuF2 Factorization scale squared (in \f$GeV^{2}\f$).
* @param MuR2 Renormalization scale squared (in \f$GeV^{2}\f$).
* @param pCollinearDistributionModule Pointer to collinear distribution module to be evaluated.
* @param colldistType Type of CollinearDistribution.
* @return Evaluated result encapsulated in PartonDistribution object.
*/
PartonDistribution compute(double x, double MuF2,
double MuR2, CollinearDistributionModule* pCollinearDistributionModule, CollinearDistributionType::Type colldistType);
PartonDistribution compute(const CollinearDistributionKinematic &kinematic, CollinearDistributionModule* pCollinearDistributionModule);
// GETTERS and SETTERS
// ##### GETTERS & SETTERS #####
/**
* Get pQCD order assumed in the calculation.
*/
PerturbativeQCDOrderType::Type getQcdOrderType() const;
/**
* Set pQCD order assumed in the calculation.
*/
void setQcdOrderType(PerturbativeQCDOrderType::Type qcdOrderType);
void setMuF2_ref(const double& MuF2_ref);
void setPertOrder(const PerturbativeQCDOrderType::Type& pertOrder);
void setCollinearDistributionType(CollinearDistributionType::Type type);
void setRunningAlphaStrongModule(RunningAlphaStrongModule* runningAlphaStrongModule);
/**
* Set pointer to RunningAlphaStrongModule object.
*/
double getMuF2_ref() const;
double getMuF_ref() const;
PerturbativeQCDOrderType::Type getPertOrder() const;
CollinearDistributionType::Type getCollinearDistributionType() const;
RunningAlphaStrongModule* getRunningAlphaStrongModule() const;
/**
* Set pointer to RunningAlphaStrongModule object.
*/
void setRunningAlphaStrongModule(
RunningAlphaStrongModule* runningAlphaStrongModule);
/**
* Get pointer to ActiveFlavorsThresholdsModule object.
*/
ActiveFlavorsThresholdsModule* getActiveFlavorsModule() const;
/**
* Set pointer to ActiveFlavorsThresholdsModule object.
*/
void setActiveFlavorsModule(
ActiveFlavorsThresholdsModule* activeFlavorsModule);
protected:
/**
......@@ -120,148 +83,29 @@ protected:
*/
CollinearDistributionEvolutionModule(const CollinearDistributionEvolutionModule &other);
virtual void isModuleWellConfigured();
virtual void initModule();
virtual void isModuleWellConfigured();
/**
* Precompute (in particular set initial variables).
* @param x Longitudinal momentum of active parton.
* @param MuF2 Factorization scale squared (in \f$GeV^{2}\f$).
* @param MuR2 Renormalization scale squared (in \f$GeV^{2}\f$).
* @param pCollinearDistributionModule Pointer to collinear distribution module to be evaluated.
* @param colldistType Type of CollinearDistribution.
*/
void preCompute(double x, double MuF2, double MuR2,
CollinearDistributionModule* pCollinearDistributionModule, CollinearDistributionType::Type colldistType);
/**
* Evaluate change of non-singlet for given factorization scale squared.
* @param MuF2 Factorization scale squared.
* @param quarkNonSingletCombination Type of non-singlet combinations.
* @return Evaluated change of non-singlet distibution.
*/
virtual double nonSingletMu2FDerivative(double MuF2,
QuarkNonSingletCombination::Type quarkNonSingletCombination) = 0;
virtual void setKinematics(const CollinearDistributionKinematic& kinematic);
virtual CollinearDistributionKinematic getKinematics() const;
/**
* Evaluate change of singlet for given factorization scale squared.
* @param MuF2 Factorization scale squared.
* @return Evaluated change of singlet distibution.
*/
virtual double singletMuF2Derivative(double MuF2) = 0;
virtual PartonDistribution compute(CollinearDistributionModule* pCollinearDistributionModule) = 0;
/**
* Evaluate change of gluon distribution for given factorization scale squared.
* @param MuF2 Factorization scale squared.
* @return Evaluated change of gluon distibution.
* Attributes
*/
virtual double gluonMuF2Derivative(double MuF2) = 0;
CollinearDistributionModule* m_pCollinearDistributionModule; ///< Pointer to collinear distribution module.
double m_x; ///< Longitudinal momentum of active parton.
double m_MuF2; ///< Factorization scale squared (in \f$GeV^{2}\f$).
double m_MuR2; ///< Renormalization scale squared (in \f$GeV^{2}\f$).
double m_MuF2_ref; ///< Reference factorization scale squared (in \f$GeV^{2}\f$).