1 #ifndef __KVMULTIGAUSSISOTOPEFIT_H
2 #define __KVMULTIGAUSSISOTOPEFIT_H
9 #include "KVNumberList.h"
11 #include <KVNameValueList.h>
70 return p[0] +
p[1] *
x[0] +
p[2] *
x[0] *
x[0];
88 double background =
TMath::Exp(
p[fit_param_index::bkg_cst] +
p[fit_param_index::bkg_slp] *
x[0]);
89 for (
int i = 1; i <= Ng; ++i) {
92 &
p[fit_param_index::pidvsA_a0]),
p[fit_param_index::gauss_wid],
kTRUE);
96 int get_gauss_norm_index(
int ig)
const
100 int get_mass_index(
int ig,
int ng)
const
104 int total_number_parameters(
int ng)
const
110 double PIDmin, PIDmax;
111 std::vector<int> Alist;
112 std::vector<double> PIDlist;
113 double min_sigma = 1.e-2;
114 double max_sigma = 1.e-1;
116 double evaluate_gaussian(
int i,
double pid)
const
119 return GetGaussianNorm(i) *
TMath::Gaus(pid, GetCentroid(i), GetGaussianWidth(i), kTRUE);
121 std::optional<double> get_total_fit_for_pid(
double PID)
const;
134 double pidvsa_a0,
double pidvsa_a1,
double pidvsa_a2);
137 void ReleaseCentroids()
145 double GetPIDvsAfit_a0()
const
150 double GetPIDvsAfit_a1()
const
155 double GetPIDvsAfit_a2()
const
163 static void UnDrawGaussian(
int z,
int a,
TVirtualPad* pad = gPad)
167 auto old_fit = pad->FindObject(get_name_of_isotope_gaussian(z, a));
168 if (old_fit)
delete old_fit;
170 static void UnDrawAnyGaussian(
int z,
TVirtualPad* pad = gPad)
174 TIter it(pad->GetListOfPrimitives());
177 while ((ob = it())) {
179 if (obname.
BeginsWith(get_root_name_of_isotope_gaussian(z))) to_delete.
Add(ob);
183 void DrawFitWithGaussians(
Option_t* opt =
"")
const;
185 int GetIsotopeWithMaxYield()
const
189 std::map<double, int> yields;
190 for (
int i = 1; i <= Niso; ++i) yields[GetGaussianNorm(i)] = Alist[i - 1];
193 auto it = yields.rbegin();
196 int GetIsotopeIndexWithMaxYield()
const
200 std::map<double, int> yields;
201 for (
int i = 1; i <= Niso; ++i) yields[GetGaussianNorm(i)] = i;
204 auto it = yields.rbegin();
207 std::optional<int> GetMostProbableA(
double PID,
double& P)
const;
208 std::optional<double> GetMeanA(
double PID)
const;
209 std::optional<std::map<int, double> > GetADistribution(
double PID)
const;
210 std::optional<int> GetA(
double PID,
double& P)
const;
211 double GetProbability(
int A,
double PID)
const;
212 double GetInterpolatedA(
double PID)
const
217 auto a = GetPIDvsAfit_a2();
218 auto b = GetPIDvsAfit_a1();
219 auto c = GetPIDvsAfit_a0() - PID;
223 static TString get_name_of_multifit(
int z)
225 return Form(
"multigauss_fit_Z=%d", z);
227 static TString get_name_of_isotope_gaussian(
int z,
int a)
229 return Form(
"gauss_fit_Z=%d_A=%d", z, a);
231 static TString get_root_name_of_isotope_gaussian(
int z)
233 return Form(
"gauss_fit_Z=%d_", z);
236 double GetBackgroundConstant()
const
241 double GetBackgroundSlope()
const
246 double GetCentroid(
int i)
const
249 assert(i > 0 && i <= Niso);
252 +
GetParameter(fit_param_index::pidvsA_a2) * Alist[i - 1]) * Alist[i - 1];
254 double GetPIDFromInterpolatedA(
double interpA)
261 +
GetParameter(fit_param_index::pidvsA_a2) * interpA) * interpA;
263 int GetNGaussians()
const
268 double GetGaussianWidth(
int)
const
273 int GetGaussianA(
int i)
const
278 double GetGaussianNorm(
int i)
const
281 assert(i > 0 && i <= Niso);
284 void SetGaussianNorm(
int i,
double v)
287 assert(i > 0 && i <= Niso);
291 void SetFitRange(
double min,
double max);
293 double GetPIDmin()
const
297 double GetPIDmax()
const
302 double GetMinSigma()
const
306 double GetMaxSigma()
const
310 void SetSigmaLimits(
double smin,
double smax)
314 SetParLimits(fit_param_index::gauss_wid, min_sigma, max_sigma);
316 void PositiveBkgSlope(
bool yes =
true);
#define ClassDefOverride(name, id)
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
char * Form(const char *fmt,...)
Extended TList class which owns its objects by default.
Function for fitting PID mass spectra.
double FitFunc(double *x, double *p)
double centroid_fit(double *x, double *p)
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
Strings used to represent a set of ranges of values.
void Add(TObject *obj) override
virtual Double_t GetParameter(const TString &name) const
virtual void SetParLimits(Int_t ipar, Double_t parmin, Double_t parmax)
virtual void SetParameter(const TString &name, Double_t value)
virtual const char * GetName() const
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
Double_t Gaus(Double_t x, Double_t mean=0, Double_t sigma=1, Bool_t norm=kFALSE)
Double_t Sqrt(Double_t x)