KaliVeda
Toolkit for HIC analysis
KVMultiGaussIsotopeFit.h
1 #ifndef __KVMULTIGAUSSISOTOPEFIT_H
2 #define __KVMULTIGAUSSISOTOPEFIT_H
3 
4 #include <optional>
5 #include "TF1.h"
6 #include "TVirtualPad.h"
7 #include "TColor.h"
8 #include "TArrayI.h"
9 #include "KVNumberList.h"
10 #include "KVList.h"
11 #include "KVNameValueList.h"
12 
51 class KVMultiGaussIsotopeFit : public TF1
52 {
53  enum fit_param_index {
54  bkg_cst = 1,
55  bkg_slp = 2,
56  gauss_wid = 3,
57  pidvsA_a0 = 4,
58  pidvsA_a1 = 5,
59  pidvsA_a2 = 6
60  };
61 
62  double centroid_fit(double* x, double* p);
63 
64  double FitFunc(double* x, double* p);
65 
66  int get_gauss_norm_index(int ig) const
67  {
68  return 6 + ig;
69  }
70  int get_mass_index(int ig, int ng) const
71  {
72  return 6 + ng + ig;
73  }
74  int total_number_parameters(int ng) const
75  {
76  return 7 + 2 * ng;
77  }
78  int Z;
79  int Niso;
80  double PIDmin, PIDmax;
81  std::vector<int> Alist;
82  std::vector<double> PIDlist;
83  double min_sigma = 1.e-2; // lower limit for width of gaussians
84  double max_sigma = 1.e-1; // upper limit for width of gaussians
85 
86  double evaluate_gaussian(int i, double pid) const
87  {
90  }
91  std::optional<double> get_total_fit_for_pid(double PID) const;
92 
93  template<typename VecType, typename PutInMapFunc, typename PutInVecFunc>
94  std::vector<VecType> get_yield_ranked(PutInMapFunc put_in_map, PutInVecFunc put_in_vector) const
95  {
96  std::map<double, int> yields;
97  for (int i = 1; i <= Niso; ++i) yields[GetGaussianNorm(i)] = put_in_map(i);
100  std::vector<VecType> vec;
101  for(auto it = yields.rbegin();it!=yields.rend();++it)
102  vec.push_back(put_in_vector(it));
103  return vec;
104  }
105 
106 public:
107 
109  KVMultiGaussIsotopeFit(int z, std::vector<int> alist)
110  : TF1(),
111  Z{z},
112  Alist{alist}
113  {
115  }
116  KVMultiGaussIsotopeFit(int z, int Ngauss, double PID_min, double PID_max, const KVNumberList& alist, std::vector<double> pidlist);
117  KVMultiGaussIsotopeFit(int z, int Ngauss, double PID_min, double PID_max, const KVNumberList& alist,
118  double bkg_cst, double bkg_slp, double gaus_wid,
119  double pidvsa_a0, double pidvsa_a1, double pidvsa_a2);
121 
122  auto GetZ() const
123  {
124  return Z;
125  }
126  std::vector<int> GetAlist() const
127  {
129  return Alist;
130  }
131  void SetAlist(const std::vector<int> alist)
132  {
133  Alist = alist;
134  }
135  std::vector<double> GetPIDlist() const
136  {
138  return PIDlist;
139  }
140  void SetPIDlist(const std::vector<double> pidlist)
141  {
142  PIDlist = pidlist;
143  }
145 
146  void FitCentroids();
147  void ReleaseCentroids();
148 
149  double GetPIDvsAfit_a0() const
150  {
152  return GetParameter(fit_param_index::pidvsA_a0);
153  }
154  double GetPIDvsAfit_a1() const
155  {
157  return GetParameter(fit_param_index::pidvsA_a1);
158  }
159  double GetPIDvsAfit_a2() const
160  {
162  return GetParameter(fit_param_index::pidvsA_a2);
163  }
164 
165  void UnDraw(TVirtualPad* pad = gPad) const;
166 
167  static void UnDrawGaussian(int z, int a, TVirtualPad* pad = gPad)
168  {
170 
171  auto old_fit = pad->FindObject(get_name_of_isotope_gaussian(z, a));
172  if (old_fit) delete old_fit;
173  }
174  static void UnDrawAnyGaussian(int z, TVirtualPad* pad = gPad);
175 
176  void DrawFitWithGaussians(Option_t* opt="", const TString& fit_title = "") const;
177 
179  {
181  return GetIsotopesRankedByYield()[0];
182  }
183  std::vector<int> GetIsotopesRankedByYield() const
184  {
186  return get_yield_ranked<int>([this](int i){ return Alist[i-1]; },
187  [](auto it){ return it->second; });
188  }
189  std::vector<double> GetRankedYields() const
190  {
192 
193  return get_yield_ranked<double>([this](int i){ return Alist[i-1]; },
194  [](auto it){ return it->first; });
195  }
196  std::vector<int> GetIsotopeIndicesRankedByYield() const
197  {
199 
200  return get_yield_ranked<int>([this](int i){ return i; },
201  [](auto it){ return it->second; });
202  }
204  {
206  return GetIsotopeIndicesRankedByYield()[0];
207  }
208  std::optional<int> GetMostProbableA(double PID, double& P) const;
209  std::optional<double> GetMeanA(double PID) const;
210  std::optional<std::map<int, double> > GetADistribution(double PID) const;
211  std::optional<int> GetA(double PID, double& P) const;
212  double GetProbability(int A, double PID) const;
213  double GetInterpolatedA(double PID) const;
214 
216  {
217  return Form("multigauss_fit_Z=%d", z);
218  }
220  {
221  return Form("gauss_fit_Z=%d_A=%d", z, a);
222  }
224  {
225  return Form("gauss_fit_Z=%d_", z);
226  }
227 
228  double GetBackgroundConstant() const
229  {
231  return GetParameter(fit_param_index::bkg_cst);
232  }
233  double GetBackgroundSlope() const
234  {
236  return GetParameter(fit_param_index::bkg_slp);
237  }
238  double GetCentroid(int i) const;
239  double GetPIDFromInterpolatedA(double interpA);
240  int GetNGaussians() const
241  {
243  return Niso;
244  }
245  double GetGaussianWidth(int) const
246  {
248  return GetParameter(fit_param_index::gauss_wid);
249  }
250  int GetGaussianA(int i) const
251  {
253  return Alist[i - 1];
254  }
255  double GetGaussianNorm(int i) const
256  {
258  assert(i > 0 && i <= Niso);
259  return GetParameter(get_gauss_norm_index(i));
260  }
261  void SetGaussianNorm(int i, double v)
262  {
264  assert(i > 0 && i <= Niso);
265  SetParameter(get_gauss_norm_index(i), v);
266  }
267 
268  void SetFitRange(double min, double max);
269 
270  double GetPIDmin() const
271  {
272  return PIDmin;
273  }
274  double GetPIDmax() const
275  {
276  return PIDmax;
277  }
278 
279  double GetMinSigma() const
280  {
281  return min_sigma;
282  }
283  double GetMaxSigma() const
284  {
285  return max_sigma;
286  }
287  void SetSigmaLimits(double smin, double smax)
288  {
289  min_sigma = smin;
290  max_sigma = smax;
291  SetParLimits(fit_param_index::gauss_wid, min_sigma, max_sigma);
292  }
293  void PositiveBkgSlope(bool yes = true);
295 
296  ClassDefOverride(KVMultiGaussIsotopeFit, 1) //Function for fitting PID mass spectrum
297 };
298 
299 #endif
constexpr Bool_t kTRUE
const char Option_t
#define ClassDefOverride(name, id)
winID h TVirtualViewer3D TVirtualGLPainter p
char * Form(const char *fmt,...)
Function for fitting PID mass spectra.
static TString get_name_of_isotope_gaussian(int z, int a)
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
std::optional< double > GetMeanA(double PID) const
KVMultiGaussIsotopeFit(int z, std::vector< int > alist)
void SetSigmaLimits(double smin, double smax)
std::vector< double > GetRankedYields() 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.
std::vector< double > GetPIDlist() const
void SetFitRange(double min, double max)
Change range of fit.
std::optional< int > GetA(double PID, double &P) const
void SetPIDlist(const std::vector< double > pidlist)
void SetAlist(const std::vector< int > alist)
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 GetGaussianNorm(int i) const
void ReleaseCentroids()
Release the constraint on the positions of the centroids.
std::vector< int > GetAlist() const
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)
std::vector< int > GetIsotopesRankedByYield() const
std::vector< int > GetIsotopeIndicesRankedByYield() const
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
Strings used to represent a set of ranges of values.
Definition: KVNumberList.h:86
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)
Double_t x[n]
Double_t Gaus(Double_t x, Double_t mean=0, Double_t sigma=1, Bool_t norm=kFALSE)
v
TArc a