1 #include "KVMultiGaussIsotopeFit.h"
19 std::optional<double> KVMultiGaussIsotopeFit::get_total_fit_for_pid(
double PID)
const
31 auto total =
Eval(PID);
42 KVMultiGaussIsotopeFit::KVMultiGaussIsotopeFit(
int z,
int Ngauss,
double PID_min,
double PID_max,
const KVNumberList& alist, std::vector<double> pidlist)
46 PIDmin{PID_min}, PIDmax{PID_max},
47 Alist{alist.GetArray()},
51 FixParameter(0, Niso);
52 SetParLimits(fit_param_index::bkg_cst, -10., 25.);
53 SetParameter(fit_param_index::bkg_cst, 4.);
54 SetParName(fit_param_index::bkg_cst,
"Norm");
55 PositiveBkgSlope(
false);
56 SetParName(fit_param_index::bkg_slp,
"Bkg. slope");
57 SetParName(fit_param_index::gauss_wid,
"Sigma");
58 SetParLimits(fit_param_index::gauss_wid, min_sigma, max_sigma);
59 SetParameter(fit_param_index::gauss_wid, 0.1);
62 for (
int ig = 1; ig <= Niso; ++ig) {
63 SetParName(get_gauss_norm_index(ig),
Form(
"Norm. A=%d", Alist[ig - 1]));
64 SetParLimits(get_gauss_norm_index(ig), 1.e-3, 1.e+06);
65 SetParameter(get_gauss_norm_index(ig), 1.);
66 SetParName(get_mass_index(ig, Niso),
Form(
"A_%d", ig));
67 FixParameter(get_mass_index(ig, Niso), Alist[ig - 1]);
69 #if ROOT_VERSION_CODE >= ROOT_VERSION(6,24,0)
70 pid_vs_a.
AddPoint(Alist[ig - 1], PIDlist[ig - 1]);
72 pid_vs_a.
SetPoint(pid_vs_a.
GetN(), Alist[ig - 1], PIDlist[ig - 1]);
78 centroidFit.SetParLimits(0, -50, 50);
79 centroidFit.SetParameter(0, 0);
80 centroidFit.SetParLimits(1, 1.e-2, 5.);
81 centroidFit.SetParameter(1, 1.e-1);
82 centroidFit.SetParLimits(2, -2.e-2, 1.);
83 centroidFit.SetParameter(2, 1.e-3);
84 pid_vs_a.
Fit(¢roidFit,
"N");
86 for (
int i = 0; i < 3; ++i) {
87 FixParameter(fit_param_index::pidvsA_a0 + i, centroidFit.GetParameter(i));
88 SetParName(fit_param_index::pidvsA_a0 + i,
Form(
"PIDvsA_a%d", i));
103 KVMultiGaussIsotopeFit::KVMultiGaussIsotopeFit(
int z,
int Ngauss,
double PID_min,
double PID_max,
104 const KVNumberList& alist,
double bkg_cst,
double bkg_slp,
105 double gaus_wid,
double pidvsa_a0,
double pidvsa_a1,
double pidvsa_a2)
109 PIDmin{PID_min}, PIDmax{PID_max},
110 Alist{alist.GetArray()}
116 SetParameter(0, Niso);
117 SetParameter(fit_param_index::bkg_cst, bkg_cst);
118 SetParameter(fit_param_index::bkg_slp, bkg_slp);
119 SetParameter(fit_param_index::gauss_wid, gaus_wid);
120 SetParameter(fit_param_index::pidvsA_a0, pidvsa_a0);
121 SetParameter(fit_param_index::pidvsA_a1, pidvsa_a1);
122 SetParameter(fit_param_index::pidvsA_a2, pidvsa_a2);
124 SetParName(fit_param_index::bkg_cst,
"Norm");
125 SetParName(fit_param_index::bkg_slp,
"Bkg. slope");
126 SetParName(fit_param_index::gauss_wid,
"Sigma");
128 for (
int ig = 1; ig <= Niso; ++ig) {
129 SetParName(get_gauss_norm_index(ig),
Form(
"Norm. A=%d", Alist[ig - 1]));
130 SetParName(get_mass_index(ig, Niso),
Form(
"A_%d", ig));
131 FixParameter(get_mass_index(ig, Niso), Alist[ig - 1]);
133 for (
int i = 0; i < 3; ++i)
134 SetParName(fit_param_index::pidvsA_a0 + i,
Form(
"PIDvsA_a%d", i));
146 KVMultiGaussIsotopeFit::KVMultiGaussIsotopeFit(
int Z,
const KVNameValueList& fitparams)
148 fitparams.GetDoubleValue(
"PIDmax"), fitparams.GetStringValue(
"Alist"),
149 fitparams.GetDoubleValue(
"Bkg_cst"), fitparams.GetDoubleValue(
"Bkg_slp"),
150 fitparams.GetDoubleValue(
"GausWid"),
151 fitparams.GetDoubleValue(
"PIDvsA_a0"),
152 fitparams.GetDoubleValue(
"PIDvsA_a1"),
153 fitparams.GetDoubleValue(
"PIDvsA_a2"))
156 for (
int ig = 1; ig <= fitparams.
GetIntValue(
"Ng"); ++ig)
165 void KVMultiGaussIsotopeFit::UnDraw(
TVirtualPad* pad)
const
169 auto old_fit = pad->
FindObject(get_name_of_multifit(Z));
170 if (old_fit)
delete old_fit;
171 for (
auto a : Alist) {
172 UnDrawGaussian(Z, a, pad);
181 void KVMultiGaussIsotopeFit::DrawFitWithGaussians(
Option_t* opt)
const
187 TF1 fgaus(
"fgaus",
"gausn", PIDmin, PIDmax);
191 for (
auto& a : Alist) {
192 fgaus.SetParameters(GetGaussianNorm(ig), GetCentroid(ig), GetGaussianWidth(ig));
195 fgaus.SetLineWidth(2);
196 fgaus.SetLineStyle(9);
197 fgaus.DrawCopy(
"same")->SetName(get_name_of_isotope_gaussian(Z, a));
215 std::optional<int> KVMultiGaussIsotopeFit::GetMostProbableA(
double PID,
double& P)
const
227 auto total = get_total_fit_for_pid(PID);
230 std::map<double, int> probabilities;
232 for (
auto& a : Alist) {
233 probabilities[evaluate_gaussian(ig, PID) / *total] =
a;
238 auto it = probabilities.rbegin();
256 std::optional<double> KVMultiGaussIsotopeFit::GetMeanA(
double PID)
const
268 auto total = get_total_fit_for_pid(PID);
272 double amean(0), totprob(0);
273 for (
auto& a : Alist) {
274 auto weight = evaluate_gaussian(ig, PID) / *total;
279 return totprob > 0 ? amean / totprob : -1.;
295 std::optional<std::map<int, double>> KVMultiGaussIsotopeFit::GetADistribution(
double PID)
const
307 auto total = get_total_fit_for_pid(PID);
310 std::map<int, double> Adist;
312 for (
auto& a : Alist) {
313 Adist[
a] = evaluate_gaussian(ig, PID) / *total;
342 std::optional<int> KVMultiGaussIsotopeFit::GetA(
double PID,
double& P)
const
364 auto total = get_total_fit_for_pid(PID);
370 for (
auto& a : Alist) {
371 auto w = evaluate_gaussian(ig, PID) / *total;
392 double KVMultiGaussIsotopeFit::GetProbability(
int A,
double PID)
const
399 auto it = std::find(std::begin(Alist), std::end(Alist), A);
400 if (it != std::end(Alist)) {
401 int ig = std::distance(std::begin(Alist), it);
402 return evaluate_gaussian(ig, PID) /
Eval(PID);
414 void KVMultiGaussIsotopeFit::SetFitRange(
double min,
double max)
430 void KVMultiGaussIsotopeFit::PositiveBkgSlope(
bool yes)
Option_t Option_t SetLineWidth
Option_t Option_t SetLineColor
R__EXTERN TRandom * gRandom
char * Form(const char *fmt,...)
Function for fitting PID mass spectra.
double centroid_fit(double *x, double *p)
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
Int_t GetIntValue(const Char_t *name) const
Double_t GetDoubleValue(const Char_t *name) const
Strings used to represent a set of ranges of values.
static const TArrayI & GetPalette()
virtual void SetRange(Double_t xmin, Double_t xmax)
virtual void SetParLimits(Int_t ipar, Double_t parmin, Double_t parmax)
virtual TF1 * DrawCopy(Option_t *option="") const
virtual Double_t Eval(Double_t x, Double_t y=0, Double_t z=0, Double_t t=0) const
virtual void SetParameter(const TString &name, Double_t value)
virtual void AddPoint(Double_t x, Double_t y)
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Axis_t xmin=0, Axis_t xmax=0)
virtual void SetName(const char *name)
virtual TObject * FindObject(const char *name) const
virtual Double_t Uniform(Double_t x1, Double_t x2)
double min(double x, double y)
double max(double x, double y)