17bool
TGRSIFunctions::CheckParameterErrors(const TFitResultPtr& fitres, std::
string opt)
26 if(fitres.Get() ==
nullptr) { return true; }
27 std::transform(opt.begin(), opt.end(), opt.begin(), [](
unsigned char c) { return std::tolower(c); });
28 bool quiet = (opt.find(
'q') != std::string::npos);
29 bool verbose = (opt.find(
'v') != std::string::npos);
30 if(quiet && verbose) {
31 std::cout <<
"Don't know how to be quiet and verbose at once (" << opt <<
"), going to be verbose!" << std::endl;
37 auto covarianceMatrix = fitres->GetCovarianceMatrix();
39 if(covarianceMatrix.GetNrows() !=
static_cast<Int_t
>(fitres->NPar()) || covarianceMatrix.GetNcols() !=
static_cast<Int_t
>(fitres->NPar())) { return false; }
40 for(
unsigned int i = 0; i < fitres->NPar(); ++i) {
41 if(std::fabs(fitres->ParError(i) - TMath::Sqrt(covarianceMatrix[i][i])) > 0.1) {
43 std::cout <<
RED <<
"Parameter " << i <<
" = " << fitres->GetParameterName(i) <<
" is at or close to the limit, error is " << fitres->ParError(i) <<
", and square root of diagonal is " << TMath::Sqrt(covarianceMatrix[i][i]) <<
RESET_COLOR << std::endl;
49 std::cout <<
GREEN <<
"Parameter " << i <<
" = " << fitres->GetParameterName(i) <<
" is not close to the limit, error is " << fitres->ParError(i) <<
", and square root of diagonal is " << TMath::Sqrt(covarianceMatrix[i][i]) <<
RESET_COLOR << std::endl;
60 Double_t x = time[0] - par[0];
61 Double_t e = exp(-x / par[1]);
66 s += par[6] * (1 - exp(-x / par[2])) * e;
67 s += par[7] * (1 - exp(-x / par[3])) * e;
68 s += par[8] * (1 - exp(-x / par[4])) * e;
77 for(Int_t i = 0; i <= order; i++) {
78 result += par[i] * TMath::Power(x[0] - par[order + 1], i);
94 Double_t height = par[0];
95 Double_t centroid = par[1];
96 Double_t sigma = par[2];
97 Double_t step = par[5];
99 return TMath::Abs(step) * height / 100. * TMath::Erfc((x - centroid) / (TMath::Sqrt(2.) * sigma));
104 return StepFunction(dim, par) + PolyBg(dim, &par[6], 2);
110 return Gaus(dim, par) + SkewedGaus(dim, par);
116 double result = Gaus(dim, par) + SkewedGaus(dim, par) + StepFunction(dim, par) + PolyBg(dim, &par[6], 2);
117 if(std::isfinite(result)) {
return result; }
124 int nPeaks =
static_cast<int>(par[0] + 0.5);
125 double result = PolyBg(dim, &par[1], 2);
126 for(
int i = 0; i < nPeaks; i++) {
127 std::array<Double_t, 6> tmpPar;
128 tmpPar[0] = par[6 * i + 5];
129 tmpPar[1] = par[6 * i + 6];
130 tmpPar[2] = par[6 * i + 7];
131 tmpPar[3] = par[6 * i + 8];
132 tmpPar[4] = par[6 * i + 9];
133 tmpPar[5] = par[6 * i + 10];
134 result += PhotoPeak(dim, tmpPar.data()) + StepFunction(dim, tmpPar.data());
151 Double_t height = par[0];
152 Double_t centroid = par[1];
153 Double_t sigma = par[2];
154 Double_t relHeight = par[4];
156 return height * (1. - relHeight / 100.) * TMath::Gaus(x, centroid, sigma);
172 Double_t height = par[0];
173 Double_t centroid = par[1];
174 Double_t sigma = par[2];
175 Double_t beta = par[3];
176 Double_t relHeight = par[4];
181 return relHeight * height / 100. * (TMath::Exp((x - centroid) / beta)) *
182 (TMath::Erfc(((x - centroid) / (TMath::Sqrt(2.) * sigma)) + sigma / (TMath::Sqrt(2.) * beta)));
191 double result = par[1] + dim[0] * par[2];
192 for(
int i = 0; i < par[0]; i++) {
193 std::array<Double_t, 5> tmpPar;
194 tmpPar[0] = par[5 * i + 3];
195 tmpPar[1] = par[5 * i + 4];
196 tmpPar[2] = par[5 * i + 5];
197 tmpPar[3] = par[5 * i + 6];
198 tmpPar[4] = par[5 * i + 7];
199 result += SkewedGaus(dim, tmpPar.data());
215 return par[0] * (TMath::Exp((x[0] - par[1]) / par[3])) *
216 (TMath::Erfc(((x[0] - par[1]) / (TMath::Sqrt(2.) * par[2])) + par[2] / (TMath::Sqrt(2.) * par[3])));
225 double result = par[1] + dim[0] * par[2];
226 for(
int i = 0; i < static_cast<int>(par[0] + 0.5); i++) {
227 std::array<Double_t, 4> tmpPar;
228 tmpPar[0] = par[4 * i + 3];
229 tmpPar[1] = par[4 * i + 4];
230 tmpPar[2] = par[4 * i + 5];
231 tmpPar[3] = par[4 * i + 6];
246 for(
int i = 0; i < 10; i++) {
247 dy = 5 * pars[3] / 10.;
249 y = x[0] - 2.5 * pars[3] + dy * i;
253 for(
int n = 0; n < static_cast<int>(pars[0] + 0.5); n++) {
255 spec += pars[3 * n + 4] * TMath::Landau(-y, -pars[3 * n + 5], pars[3 * n + 6]) /
256 TMath::Landau(0, 0, 100);
259 gaus = TMath::Gaus(-x[0], -y, pars[3]) /
260 sqrt(2 * TMath::Pi() * pars[3] * pars[3]);
261 conv += gaus * spec * dy;
275 for(
int i = 0; i < 50; i++) {
276 dy = 8 * pars[3] / 50.;
277 y = x[0] - 4 * pars[3] + dy * i;
279 spec = pars[1] + pars[2] * y;
280 for(
int n = 0; n < static_cast<int>(pars[0] + 0.5); n++) {
281 spec += pars[3 * n + 4] * TMath::Landau(-y, -pars[3 * n + 5], pars[3 * n + 6]) / TMath::Landau(0, 0, 100);
284 gaus = TMath::Gaus(-x[0], -y, pars[3]) / sqrt(2 * TMath::Pi() * pars[3] * pars[3]);
285 conv += gaus * spec * dy;
299 double result = par[1] + dim[0] * par[2];
300 for(
int i = 0; i < static_cast<int>(par[0] + 0.5); i++) {
301 amp = par[3 * i + 3];
302 mean = par[3 * i + 4];
303 sigma = par[3 * i + 5];
304 result += amp * TMath::Gaus(dim[0], mean, sigma);
323 if(par.size() < (nChain * 3)) {
324 std::cout <<
"not enough parameters passed to function" << std::endl;
328 Double_t totalActivity = 0.;
332 for(UInt_t n = 0; n < nChain; n++) {
334 Double_t firstterm = 1.;
336 for(UInt_t j = 0; j < n - 1; j++) {
337 firstterm *= par[1 + 3 * j];
339 Double_t secondterm = 0.;
340 for(UInt_t i = 0; i < n; i++) {
342 for(UInt_t j = i; j < n; j++) {
344 for(UInt_t p = i; p < n; p++) {
346 denom *= par[1 + 3 * p] - par[1 + 3 * j];
349 sum += par[0 + 3 * i] / par[1 + 3 * i] * TMath::Exp(-par[1 + 3 * j] * dim[0]) / denom;
353 par[2 + 3 * n] = par[1 + 3 * n] * firstterm * secondterm;
354 totalActivity += par[2 + 3 * n];
356 return totalActivity;
365 return dim[0] / (1. - dim[0] * deadtime / (binWidth * 1000000.));
374 return function / (1. + function * deadtime / (binWidth * 1000000.));
380 Double_t val = p[0] * (1 + p[1] * ::ROOT::Math::legendre(2, x[0]) + p[2] * ::ROOT::Math::legendre(4, x[0]));
383 std::cout <<
"Mathmore feature of ROOT is missing, " << __PRETTY_FUNCTION__ <<
" will always return 1!" << std::endl;
391 for(
int i = 0; i < 9; ++i) {
392 sum += par[i] * TMath::Power(TMath::Log(dim[0]), i);
395 return TMath::Exp(sum);
408 return TMath::Sqrt(TMath::Pi()) * par[0] * par[3] / 2 * TMath::Exp(par[3] / 2 * (2 * par[1] + par[3] * TMath::Power(par[2], 2) - 2 * x[0])) * TMath::Erfc((par[1] + par[3] * TMath::Power(par[2], 2) - x[0]) / (TMath::Sqrt(2) * par[2])) + par[4];
422 return TMath::Sqrt(TMath::Pi()) * par[0] * par[3] / 2 * TMath::Exp(par[3] / 2 * (2 * par[1] + par[3] * TMath::Power(par[2], 2) - 2 * x[0])) * TMath::Erfc((par[1] + par[3] * TMath::Power(par[2], 2) - x[0]) / (TMath::Sqrt(2) * par[2])) + TMath::Sqrt(TMath::Pi()) * par[4] * par[5] / 2 * TMath::Exp(par[5] / 2 * (2 * par[1] + par[5] * TMath::Power(par[2], 2) - 2 * x[0])) * TMath::Erfc((par[1] + par[5] * TMath::Power(par[2], 2) - x[0]) / (TMath::Sqrt(2) * par[2]));
431 if(2 * j1 != floor(2 * j1) ||
432 2 * j2 != floor(2 * j2) ||
433 2 * j != floor(2 * j) ||
434 2 * m1 != floor(2 * m1) ||
435 2 * m2 != floor(2 * m2) ||
436 2 * m != floor(2 * m)) {
442 if((j1 - m1) != floor(j1 - m1)) {
445 if((j2 - m2) != floor(j2 - m2)) {
448 if(j - m != floor(j - m)) {
451 if(j > (j1 + j2) || j < abs(j1 - j2)) {
464 double term1 = TMath::Sqrt((((2 * j + 1) / TMath::Factorial(
static_cast<Int_t
>(j1 + j2 + j + 1))) * TMath::Factorial(
static_cast<Int_t
>(j2 + j - j1)) * TMath::Factorial(
static_cast<Int_t
>(j + j1 - j2)) * TMath::Factorial(
static_cast<Int_t
>(j1 + j2 - j)) * TMath::Factorial(
static_cast<Int_t
>(j1 + m1)) * TMath::Factorial(
static_cast<Int_t
>(j1 - m1)) * TMath::Factorial(
static_cast<Int_t
>(j2 + m2)) * TMath::Factorial(
static_cast<Int_t
>(j2 - m2)) * TMath::Factorial(
static_cast<Int_t
>(j + m)) * TMath::Factorial(
static_cast<Int_t
>(j - m))));
466 for(
int k = 0; k <= 99; k++) {
467 if((j1 + j2 - j - k < 0) || (j1 - m1 - k < 0) || (j2 + m2 - k < 0)) {
471 if((j - j1 - m2 + k < 0) || (j - j2 + m1 + k < 0)) {
473 const auto a1 =
static_cast<Int_t
>(j - j1 - m2);
474 const auto a2 =
static_cast<Int_t
>(j - j2 + m1);
475 k = TMath::Max(-TMath::Min(a1, a2) - 1, k);
477 double term = TMath::Factorial(
static_cast<Int_t
>(j1 + j2 - j - k)) * TMath::Factorial(
static_cast<Int_t
>(j - j1 - m2 + k)) * TMath::Factorial(
static_cast<Int_t
>(j - j2 + m1 + k)) * TMath::Factorial(
static_cast<Int_t
>(j1 - m1 - k)) * TMath::Factorial(
static_cast<Int_t
>(j2 + m2 - k)) * TMath::Factorial(k);
494 return TMath::Power(-1.,
static_cast<int>(a + b + d + c)) * ::ROOT::Math::wigner_6j(
static_cast<int>(2 * a),
static_cast<int>(2 * b),
static_cast<int>(2 * e),
static_cast<int>(2 * d),
static_cast<int>(2 * c),
static_cast<int>(2 * f));
496 std::cout <<
"Mathmore feature of ROOT is missing, " << __PRETTY_FUNCTION__ <<
" will always return 1!" << std::endl;
511 return TMath::Power((-1), (jf - ji - 1)) * TMath::Power((2 * L1 + 1) * (2 * L2 + 1) * (2 * ji + 1), (1. / 2.)) * cg * w;
518 double f1 =
F(k, ji, L1, L1, jf);
519 double f2 =
F(k, ji, L1, L2, jf);
520 double f3 =
F(k, ji, L2, L2, jf);
522 return (1. / (1. + TMath::Power(delta, 2))) * (f1 + 2 * delta * f2 + delta * delta * f3);
527 double f1 =
F(k, jf, L1, L1, ji);
528 double f2 =
F(k, jf, L1, L2, ji);
529 double f3 =
F(k, jf, L2, L2, ji);
530 return (1. / (1. + TMath::Power(delta, 2))) * (f1 + TMath::Power((-1), L1 + L2) * 2 * delta * f2 + delta * delta * f3);
535 return B(2, j2, j1, l1a, l1b, delta1) *
A(2, j3, j2, l2a, l2b, delta2);
540 return B(4, j2, j1, l1a, l1b, delta1) *
A(4, j3, j2, l2a, l2b, delta2);
NamespaceImp(GRootFunctions) Double_t GRootFunctions
Double_t MultiPhotoPeakBG(Double_t *dim, Double_t *par)
Double_t MultiSkewedGausWithBG(Double_t *dim, Double_t *par)
Double_t MultiSkewedGausWithBG2(Double_t *dim, Double_t *par)
double F(double k, double jf, double L1, double L2, double ji)
Double_t MultiGausWithBG(Double_t *dim, Double_t *par)
Double_t StepFunction(Double_t *dim, Double_t *par)
double CalculateA2(double j1, double j2, double j3, double l1a, double l1b, double l2a, double l2b, double delta1, double delta2)
Double_t PhotoPeak(Double_t *dim, Double_t *par)
Double_t LegendrePolynomial(Double_t *x, Double_t *p)
Double_t CsIFitFunction(Double_t *time, Double_t *par)
Double_t Bateman(std::vector< Double_t > &dim, std::vector< Double_t > &par, UInt_t nChain=1, Double_t SecondsPerBin=1.0)
Double_t LanGausHighRes(Double_t *x, Double_t *pars)
double CalculateA4(double j1, double j2, double j3, double l1a, double l1b, double l2a, double l2b, double delta1, double delta2)
double RacahW(double a, double b, double c, double d, double e, double f)
Double_t PhotoPeakBG(Double_t *dim, Double_t *par)
Double_t ConvolutedDecay(Double_t *x, Double_t *par)
Double_t DeadTimeAffect(Double_t function, Double_t deadtime, Double_t binWidth=1.0)
Double_t PolyBg(Double_t *x, Double_t *par, Int_t order)
double B(double k, double ji, double jf, double L1, double L2, double delta)
Double_t SkewedGaus2(Double_t *x, Double_t *par)
Double_t DeadTimeCorrect(Double_t *dim, Double_t deadtime, Double_t binWidth=1.0)
double A(double k, double ji, double jf, double L1, double L2, double delta)
Double_t StepBG(Double_t *dim, Double_t *par)
double ClebschGordan(double j1, double m1, double j2, double m2, double j, double m)
Double_t Gaus(Double_t *dim, Double_t *par)
Double_t PhotoEfficiency(Double_t *dim, Double_t *par)
Double_t SkewedGaus(Double_t *dim, Double_t *par)
Double_t ConvolutedDecay2(Double_t *x, Double_t *par)
Double_t LanGaus(Double_t *x, Double_t *pars)