Nanga Parbat 1.1.0
A TMD fitting framework
PV19x.h
Go to the documentation of this file.
1//
2// Authors: Valerio Bertone: valerio.bertone@cern.ch
3// Alessandro Bacchetta: alessandro.bacchetta@unipv.it
4
5#pragma once
6
8
9#include <math.h>
10
11namespace NangaParbat
12{
18 {
19 public:
20
21 PV19x(): Parameterisation{"PV19x", 2, std::vector<double> {0, 0, 0, 0, 0, 0, 0, 0, 0}} {};
22
23 double Evaluate(double const& x, double const& b, double const& zeta, int const& ifunc) const
24 {
25 if (ifunc < 0 || ifunc >= this->_nfuncs)
26 throw std::runtime_error("[PV19x::Evaluate]: function index out of range");
27
28 // If the value of 'x' exceeds one returns zero
29 if (x >= 1)
30 return 0;
31
32 // Free parameters
33 const double g2 = this->_pars[0];
34 const double N1 = this->_pars[1];
35 const double alpha = this->_pars[2];
36 const double sigma = this->_pars[3];
37 const double lambda = this->_pars[4];
38 const double N1B = this->_pars[5];
39 const double alphaB = this->_pars[6];
40 const double sigmaB = this->_pars[7];
41 const double g2B = this->_pars[8];
42
43 // x-dependent bits
44 const double g1 = N1 * exp( - pow(log(x / alpha), 2) / 2 / pow(sigma, 2) ) / x / sigma;
45 const double g1B = N1B * exp( - pow(log(x / alphaB), 2) / 2 / pow(sigmaB, 2) ) / x / sigmaB;
46
47 // bT-dependent bits
48 const double b2 = b * b;
49
50 // zeta-dependent bit (i.e. non perturbative evolution)
51 const double NPevol = exp( - ( g2 + g2B * b2 ) * b2 * log(zeta / _Q02) / 4 );
52
53 return ( ( 1 - lambda ) / ( 1 + g1 / 4 * b2 ) + lambda * exp( - g1B / 4 * b2 ) ) * NPevol;
54 };
55
56 double Derive(double const& x, double const& b, double const& zeta, int const& ifunc, int const& ipar) const
57 {
58 // Free parameters
59 const double g2 = this->_pars[0];
60 const double N1 = this->_pars[1];
61 const double alpha = this->_pars[2];
62 const double sigma = this->_pars[3];
63 const double lambda = this->_pars[4];
64 const double N1B = this->_pars[5];
65 const double alphaB = this->_pars[6];
66 const double sigmaB = this->_pars[7];
67 const double g2B = this->_pars[8];
68
69 // x-dependent bits
70 const double lnx = log(x / alpha);
71 const double lnxB = log(x / alphaB);
72 const double g1 = N1 * exp( - pow(lnx, 2) / 2 / pow(sigma, 2) ) / x / sigma;
73 const double g1B = N1B * exp( - pow(lnxB, 2) / 2 / pow(sigmaB, 2) ) / x / sigmaB;
74
75 // bT-dependent bits
76 const double b2 = b * b;
77
78 // zeta-dependent bit (i.e. non perturbative evolution)
79 const double lnz = log(zeta / _Q02);
80 const double NPevol = exp( - ( g2 + g2B * b2 ) * b2 * lnz / 4 );
81
82 // Derivative
83 double der = 0;
84
85 // Derivative w.r.t. "g2"
86 if (ipar == 0)
87 {
88 const double fNP = ( ( 1 - lambda ) / ( 1 + g1 / 4 * b2 ) + lambda * exp( - g1B / 4 * b2 ) ) * NPevol;
89 der = - lnz * b2 * fNP / 4;
90 }
91 // Derivative w.r.t. "N1"
92 else if (ipar == 1)
93 {
94 const double dfNbdg1 = - b2 * ( 1 - lambda ) / pow(1 + g1 / 4 * b2, 2) * NPevol / 4;
95 der = g1 / N1 * dfNbdg1;
96 }
97 // Derivative w.r.t. "alpha"
98 else if (ipar == 2)
99 {
100 const double dfNbdg1 = - b2 * ( 1 - lambda ) / pow(1 + g1 / 4 * b2, 2) * NPevol / 4;
101 der = lnx * g1 * dfNbdg1 / alpha / pow(sigma, 2);
102 }
103 // Derivative w.r.t. "sigma"
104 else if (ipar == 3)
105 {
106 const double dfNbdg1 = - b2 * ( 1 - lambda ) / pow(1 + g1 / 4 * b2, 2) * NPevol / 4;
107 der = ( pow(lnx, 2) - pow(sigma, 2) ) * g1 * dfNbdg1 / pow(sigma, 3);
108 }
109 // Derivative w.r.t. "lambda"
110 else if (ipar == 4)
111 {
112 der = ( - 1 / ( 1 + g1 / 4 * b2 ) + exp( - g1B / 4 * b2 ) ) * NPevol;
113 }
114 // Derivative w.r.t. "N1B"
115 else if (ipar == 5)
116 {
117 const double dfNbdg1B = - b2 * lambda * exp( - g1B / 4 * b2 ) * NPevol / 4;
118 der = g1B / N1B * dfNbdg1B;
119 }
120 // Derivative w.r.t. "alphaB"
121 else if (ipar == 6)
122 {
123 const double dfNbdg1B = - b2 * lambda * exp( - g1B / 4 * b2 ) * NPevol / 4;
124 der = lnxB * g1B * dfNbdg1B / alphaB / pow(sigmaB, 2);
125 }
126 // Derivative w.r.t. "sigmaB"
127 else if (ipar == 7)
128 {
129 const double dfNbdg1B = - b2 * lambda * exp( - g1B / 4 * b2 ) * NPevol / 4;
130 der = (pow(lnxB, 2) - pow(sigmaB, 2) ) * g1B * dfNbdg1B / pow(sigmaB, 3);
131 }
132 // Derivative w.r.t. "g2B"
133 else if (ipar == 8)
134 {
135 const double fNP = ( ( 1 - lambda ) / ( 1 + g1 / 4 * b2 ) + lambda * exp( - g1B / 4 * b2 ) ) * NPevol;
136 der = - lnz * b2 * b2 * fNP / 4;
137 }
138
139 return der;
140 };
141
142 std::string LatexFormula() const
143 {
144 std::string formula;
145 formula = R"delimiter($$f_{\rm NP}(x,\zeta, b_T)= \Biggl(
146\frac{1-\lambda}{1 + g_1(x) b_T^2/4} + \lambda \exp \left(-g_{1B}(x) b_T^2 / 4 \right)\Biggr) \exp\left[- g_2 \log\left(\frac{\zeta}{Q_0^2}\right) b_T^2/4 - g_{2B} \log\left(\frac{\zeta}{Q_0^2}\right) b_T^4/4 \right]$$)delimiter";
147 formula += R"delimiter($$g_1(x) = \frac{N_1}{x\sigma} \exp\left[ - \frac{\ln^2\left(\frac{x}{\alpha}\right)}{2 \sigma^2} \right]$$)delimiter";
148 formula += R"delimiter($$g_{1B}(x) = \frac{N_{1B}}{x\sigma_B} \exp\left[ - \frac{\ln^2\left(\frac{x}{\alpha_B}\right)}{2 \sigma_B^2} \right]$$)delimiter";
149 formula += R"delimiter($$Q_0^2 = 1\;{\rm GeV}^2$$)delimiter";
150 return formula;
151 };
152
153 std::vector<std::string> GetParameterNames() const
154 {
155 return {R"delimiter($g_2$)delimiter",
156 R"delimiter($N_1$)delimiter",
157 R"delimiter($\alpha$)delimiter",
158 R"delimiter($\sigma$)delimiter",
159 R"delimiter($\lambda$)delimiter",
160 R"delimiter($N_{1B}$)delimiter",
161 R"delimiter($\alpha_B$)delimiter",
162 R"delimiter($\sigma_B$)delimiter",
163 R"delimiter($g_{2B}$)delimiter"};
164 };
165
166 std::string GetDescription() const
167 {
168 return "Parameterisation used for the Pavia 2019 TMD analysis.";
169 };
170
171 private:
172 const double _Q02 = 1;
173 };
174}
Pavia 2019 parameterisation derived from the "Parameterisation" mother class.
Definition: PV19x.h:18
PV19x()
Definition: PV19x.h:21
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: PV19x.h:23
std::string LatexFormula() const
Virtual function that returns a string with the formula of the non-perturbative function(s) in LaTex ...
Definition: PV19x.h:142
std::string GetDescription() const
Virtual function that returns a short description of the parametrisation.
Definition: PV19x.h:166
std::vector< std::string > GetParameterNames() const
Virtual function that returns a vector of strings containing the names of the parameters in LaTex for...
Definition: PV19x.h:153
double Derive(double const &x, double const &b, double const &zeta, int const &ifunc, int const &ipar) const
Virtual function that returns the value of the derivative of one of the functions.
Definition: PV19x.h:56
Mother class that implements the main feautures of a functional parameterisation of non-perturbative ...
Definition: parameterisation.h:20
Definition: bstar.h:12