1 #include "KVMultiGaussIsotopeFit.h"
17 double KVMultiGaussIsotopeFit::centroid_fit(
double* x,
double* p)
28 return p[0] +
p[1] *
x[0] +
p[2] *
x[0] *
x[0];
46 double KVMultiGaussIsotopeFit::FitFunc(
double* x,
double* p)
61 double background =
TMath::Exp(p[fit_param_index::bkg_cst] + p[fit_param_index::bkg_slp] * x[0]);
62 for (
int i = 1; i <= Ng; ++i) {
64 p[get_gauss_norm_index(i)] *
TMath::Gaus(x[0], centroid_fit(&p[get_mass_index(i, Ng)],
65 &p[fit_param_index::pidvsA_a0]), p[fit_param_index::gauss_wid], kTRUE);
84 std::optional<double> KVMultiGaussIsotopeFit::get_total_fit_for_pid(
double PID)
const
96 auto total =
Eval(PID);
117 PIDmin{PID_min}, PIDmax{PID_max},
118 Alist{alist.GetArray()},
134 SetParName(fit_param_index::bkg_slp,
"Bkg. slope");
135 SetParName(fit_param_index::gauss_wid,
"Sigma");
136 SetParLimits(fit_param_index::gauss_wid, min_sigma, max_sigma);
139 for (
int ig = 1; ig <= Niso; ++ig) {
140 SetParName(get_gauss_norm_index(ig),
Form(
"Norm. A=%d", Alist[ig - 1]));
162 SetParLimits(fit_param_index::gauss_wid, min_sigma, max_sigma);
163 for (
int ig = 1; ig <= Niso; ++ig)
185 const KVNumberList& alist,
double bkg_cst,
double bkg_slp,
186 double gaus_wid,
double pidvsa_a0,
double pidvsa_a1,
double pidvsa_a2)
190 PIDmin{PID_min}, PIDmax{PID_max},
191 Alist{alist.GetArray()}
214 SetParName(fit_param_index::bkg_slp,
"Bkg. slope");
215 SetParName(fit_param_index::gauss_wid,
"Sigma");
219 for (
int i = 0; i < 3; ++i)
220 SetParName(fit_param_index::pidvsA_a0 + i,
Form(
"PIDvsA_a%d", i));
234 fitparams.GetDoubleValue(
"PIDmax"), fitparams.GetStringValue(
"Alist"),
235 fitparams.GetDoubleValue(
"Bkg_cst"), fitparams.GetDoubleValue(
"Bkg_slp"),
236 fitparams.GetDoubleValue(
"GausWid"),
237 fitparams.GetDoubleValue(
"PIDvsA_a0"),
238 fitparams.GetDoubleValue(
"PIDvsA_a1"),
239 fitparams.GetDoubleValue(
"PIDvsA_a2"))
242 for (
int ig = 1; ig <= fitparams.
GetIntValue(
"Ng"); ++ig)
254 for (
int ig = 1; ig <= Niso; ++ig) {
255 SetParName(get_gauss_norm_index(ig),
Form(
"Norm. A=%d", Alist[ig - 1]));
268 for (
int ig = 1; ig <= Niso; ++ig) {
269 #if ROOT_VERSION_CODE >= ROOT_VERSION(6,24,0)
270 pid_vs_a.
AddPoint(Alist[ig - 1], PIDlist[ig - 1]);
272 pid_vs_a.
SetPoint(pid_vs_a.
GetN(), Alist[ig - 1], PIDlist[ig - 1]);
275 TF1 centroidFit(
"centroidFit",
this, &KVMultiGaussIsotopeFit::centroid_fit, 0., 100., 3);
282 pid_vs_a.
Fit(¢roidFit,
"N");
283 for (
int i = 0; i < 3; ++i) {
285 SetParName(fit_param_index::pidvsA_a0 + i,
Form(
"PIDvsA_a%d", i));
312 if (old_fit)
delete old_fit;
313 for (
auto a : Alist) {
330 while ((ob = it())) {
354 ff->SetTitle(fit_title);
355 TF1 fgaus(
"fgaus",
"gausn", PIDmin, PIDmax);
359 for (
auto&
a : Alist) {
397 auto total = get_total_fit_for_pid(PID);
400 std::map<double, int> probabilities;
402 for (
auto&
a : Alist) {
403 probabilities[evaluate_gaussian(ig, PID) / *total] =
a;
408 auto it = probabilities.rbegin();
438 auto total = get_total_fit_for_pid(PID);
442 double amean(0), totprob(0);
443 for (
auto&
a : Alist) {
444 auto weight = evaluate_gaussian(ig, PID) / *total;
449 return totprob > 0 ? amean / totprob : -1.;
477 auto total = get_total_fit_for_pid(PID);
480 std::map<int, double> Adist;
482 for (
auto&
a : Alist) {
483 Adist[
a] = evaluate_gaussian(ig, PID) / *total;
534 auto total = get_total_fit_for_pid(PID);
540 for (
auto&
a : Alist) {
541 auto w = evaluate_gaussian(ig, PID) / *total;
569 auto it = std::find(std::begin(Alist), std::end(Alist), A);
570 if (it != std::end(Alist)) {
571 int ig = std::distance(std::begin(Alist), it);
572 return evaluate_gaussian(ig, PID) /
Eval(PID);
602 assert(i > 0 && i <= Niso);
605 +
GetParameter(fit_param_index::pidvsA_a2) * Alist[i - 1]) * Alist[i - 1];
622 +
GetParameter(fit_param_index::pidvsA_a2) * interpA) * interpA;
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t b
R__EXTERN TRandom * gRandom
char * Form(const char *fmt,...)
Extended TList class which owns its objects by default.
Function for fitting PID mass spectra.
static TString get_name_of_isotope_gaussian(int z, int a)
double GetPIDvsAfit_a1() const
static TString get_name_of_multifit(int z)
double GetGaussianWidth(int) const
static TString get_root_name_of_isotope_gaussian(int z)
static void UnDrawAnyGaussian(int z, TVirtualPad *pad=gPad)
Remove the graphical representation of any gaussian for this Z from the given pad.
void DrawFitWithGaussians(Option_t *opt="", const TString &fit_title="") const
double GetCentroid(int i) const
void InitializeParameterLimitsForNewFit()
std::optional< double > GetMeanA(double PID) const
std::optional< std::map< int, double > > GetADistribution(double PID) const
void PositiveBkgSlope(bool yes=true)
void UpdateGaussianCentroidParameters()
Required in case the attribution of masses to the gaussians changes.
void SetFitRange(double min, double max)
Change range of fit.
double GetPIDvsAfit_a2() const
std::optional< int > GetA(double PID, double &P) const
void SetGaussianNorm(int i, double v)
double GetInterpolatedA(double PID) const
double GetPIDFromInterpolatedA(double interpA)
std::optional< int > GetMostProbableA(double PID, double &P) const
double GetProbability(int A, double PID) const
double GetPIDvsAfit_a0() const
double GetGaussianNorm(int i) const
void ReleaseCentroids()
Release the constraint on the positions of the centroids.
void UnDraw(TVirtualPad *pad=gPad) const
Remove the graphical representation of this fit from the given pad.
static void UnDrawGaussian(int z, int a, TVirtualPad *pad=gPad)
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.
void Add(TObject *obj) override
virtual void SetLineStyle(Style_t lstyle)
virtual void SetLineWidth(Width_t lwidth)
virtual void SetLineColor(Color_t lcolor)
static const TArrayI & GetPalette()
virtual Double_t GetParameter(const TString &name) const
virtual void SetRange(Double_t xmin, Double_t xmax)
virtual void SetNpx(Int_t npx=100)
virtual void SetParLimits(Int_t ipar, Double_t parmin, Double_t parmax)
virtual void SetParName(Int_t ipar, const char *name)
virtual TF1 * DrawCopy(Option_t *option="") const
virtual void SetParameters(const Double_t *params)
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 FixParameter(Int_t ipar, 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 const char * GetName() const
virtual TObject * FindObject(const char *name) const
virtual Double_t Uniform(Double_t x1, Double_t x2)
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
virtual TList * GetListOfPrimitives() const=0
double min(double x, double y)
double max(double x, double y)
Double_t Gaus(Double_t x, Double_t mean=0, Double_t sigma=1, Bool_t norm=kFALSE)
Double_t Sqrt(Double_t x)