#include <fstream>
#include <cstring>
#include <algorithm>
#include <apfel/apfelxx.h>
#include <LHAPDF/LHAPDF.h>
int main(int argc, char* argv[])
{
if (argc < 8 || strcmp(argv[1], "--help") == 0)
{
std::cout << "\nInvalid Parameters:" << std::endl;
std::cout << "Syntax: ./PlotTMDs <configuration file> <output file> <pdf/ff> <flavour ID> <Scale in GeV> <value of x> <parameters file>\n" << std::endl;
exit(-10);
}
const YAML::Node config = YAML::LoadFile(argv[1]);
const std::string output = std::string(argv[2]);
const std::string pf = argv[3];
LHAPDF::PDF* dist = LHAPDF::mkPDF(config[pf + "set"]["name"].as<std::string>(), config[pf + "set"]["member"].as<int>());
const auto RotDists = [&] (double const& x, double const& mu) -> std::map<int,double> { return apfel::PhysToQCDEv(dist->xfxQ(x, mu)); };
std::vector<double> Thresholds;
std::vector<double> bThresholds;
const double Ci = config["TMDscales"]["Ci"].as<double>();
for (auto const& v : dist->flavors())
if (v > 0 && v < 7)
{
Thresholds.push_back(dist->quarkThreshold(v));
bThresholds.push_back(Ci * 2 * exp(- apfel::emc) / dist->quarkThreshold(v));
}
sort(bThresholds.begin(), bThresholds.end());
apfel::SetVerbosityLevel(0);
std::vector<apfel::SubGrid> vsg;
for (auto const& sg : config["xgrid" + pf])
vsg.push_back({sg[0].as<int>(), sg[1].as<double>(), sg[2].as<int>()});
const apfel::Grid g{vsg};
const auto EvolvedDists = [=,&g] (double const& mu) -> apfel::Set<apfel::Distribution>
{
return apfel::Set<apfel::Distribution>{apfel::EvolutionBasisQCD{apfel::NF(mu, Thresholds)}, DistributionMap(g, RotDists, mu)};
};
const apfel::TabulateObject<apfel::Set<apfel::Distribution>> TabDists{EvolvedDists, 100, dist->qMin(), dist->qMax(), 3, Thresholds};
const int pto = config["PerturbativeOrder"].as<int>();
const auto Alphas = [&] (double const& mu) -> double{ return dist->alphasQ(mu); };
const auto CollDists = [&] (double const& mu) -> apfel::Set<apfel::Distribution> { return TabDists.Evaluate(mu); };
std::function<apfel::Set<apfel::Distribution>(double const&, double const&, double const&)> EvTMDs;
if (pf == "pdf")
EvTMDs = BuildTmdPDFs(apfel::InitializeTmdObjects(g, Thresholds), CollDists, Alphas, pto, Ci);
else if (pf == "ff")
EvTMDs = BuildTmdFFs(apfel::InitializeTmdObjects(g, Thresholds), CollDists, Alphas, pto, Ci);
else
throw std::runtime_error("[PlotTMDs]: Unknown distribution prefix");
const std::function<double(
double const&,
double const&)> bs =
NangaParbat::bstarMap.at(config[
"bstar"].as<std::string>());
const int ifl = std::stoi(argv[4]);
const double Q = std::stoi(argv[5]);
const double Q2 = Q * Q;
const double x = std::stod(argv[6]);
apfel::DoubleExponentialQuadrature DEObj{};
const int nqT = 100;
const double qTmin = Q * 1e-4;
const double qTmax = Q * 2;
const double qTstp = exp( log( qTmax / qTmin ) / ( nqT - 1 ) );
std::vector<double> qTv;
for (double qT = qTmin; qT <= qTmax * ( 1 + 1e-5 ); qT *= qTstp)
qTv.push_back(qT);
const YAML::Node parfile = YAML::LoadFile(argv[7]);
const std::vector<std::vector<double>> pars = parfile["Parameters"].as<std::vector<std::vector<double>>>();
apfel::Timer t;
std::vector<std::vector<double>> tmds(pars.size(), std::vector<double>(qTv.size()));
for (int ip = 0; ip < (int) pars.size(); ip++)
{
const auto xFb = [&] (
double const& bT) ->
double {
return bT * QCDEvToPhys(EvTMDs(bs(bT, Q), Q, Q2).GetObjects()).at(ifl).Evaluate(x) * NPFunc->
Evaluate(x, bT, Q2, (pf ==
"pdf" ? 0 : 1)); };
const apfel::TabulateObject<double> TabxFb{xFb, 300, 0.0001, 10, 3, bThresholds, [] (double const& x)->double{ return log(x); }, [] (double const& x)->double{ return exp(x); }};
const std::function<double(double const&)> txFb = [&] (double const& bT) -> double{ return TabxFb.Evaluate(bT); };
for (int iqT = 0; iqT < (int) qTv.size(); iqT++)
tmds[ip][iqT] = DEObj.transform(txFb, qTv[iqT]);
}
t.stop();
YAML::Emitter out;
out.SetFloatPrecision(8);
out.SetDoublePrecision(8);
out << YAML::BeginMap;
out << YAML::Key << "Flavour index" << YAML::Value << ifl;
out << YAML::Key << "Scale" << YAML::Value << Q;
out << YAML::Key << "Bjorken x" << YAML::Value << x;
out << YAML::Key << "qT" << YAML::Value << YAML::Flow << qTv;
out << YAML::Key << "TMD" << YAML::Value << YAML::Flow << tmds;
out << YAML::EndMap;
std::ofstream fout(output);
fout << out.c_str() << std::endl;
fout.close();
delete dist;
return 0;
}
Mother class that implements the main feautures of a functional parameterisation of non-perturbative ...
Definition: parameterisation.h:20
virtual void SetParameters(std::vector< double > const &pars)
Function that sets the free parameters of the parameterisation.
Definition: parameterisation.h:41
virtual double Evaluate(double const &x, double const &b, double const &zeta, int const &ifunc) const
Virtual function that returns the value of one of the functions.
Definition: parameterisation.h:52
const std::map< std::string, std::function< double(double const &, double const &)> > bstarMap
Map of available b* star functions.
Definition: bstar.h:33
Parameterisation * GetParametersation(std::string const &name)
Utility function that returns a pointer to a NangaParbat::Parameterisation object pointing to a speci...