1 #include "PixInitFunc.hh"
23 double PIF_err(
double *x,
double *par) {
24 return par[3]*(TMath::Erf((x[0]-par[0])/par[1])+par[2]);
27 double PIF_weibullCdf(
double *x,
double *par) {
28 if (par[1] < 0)
return 0.;
29 if (par[2] < 0)
return 0.;
30 return par[0]*(1 - TMath::Exp(-TMath::Power(x[0]/par[1], par[2])));
35 const double xCut = TMath::Pi()/2. - 0.0005;
36 const double tanXCut = TMath::Tan(xCut);
38 double PIF_gpTanPol( Double_t *x, Double_t *par) {
39 if (par[0]*x[0] - par[4] > xCut)
return tanXCut + (x[0] - (xCut + par[4])/par[0])* 1e8;
40 double result = TMath::Tan(par[0]*x[0] - par[4]) + par[1]*x[0]*x[0]*x[0] + par[5]*x[0]*x[0] + par[2]*x[0] + par[3];
46 double PIF_gpTanH( Double_t *x, Double_t *par) {
47 return par[3] + par[2] * TMath::TanH(par[0]*x[0] - par[1]);
54 PixInitFunc::PixInitFunc() {
59 PixInitFunc::~PixInitFunc() {
64 void PixInitFunc::resetLimits() {
65 for (
int i = 0; i < 20; ++i) {
73 void PixInitFunc::limitPar(
int ipar,
double lo,
double hi) {
81 TF1* PixInitFunc::gpTanPol(TH1 *h) {
83 double lo = h->GetBinLowEdge(1);
84 double hi = h->FindLastBinAbove(0.9*h->GetMaximum());
85 hi = h->GetBinLowEdge(h->GetNbinsX()+1);
87 TF1* f = (TF1*)gROOT->FindObject(
"PIF_gpTanPol");
89 f =
new TF1(
"PIF_gpTanPol", PIF_gpTanPol, lo, hi, 6);
94 f->ReleaseParameter(0);
95 f->ReleaseParameter(1);
96 f->ReleaseParameter(2);
97 f->ReleaseParameter(3);
98 f->ReleaseParameter(4);
99 f->ReleaseParameter(5);
103 int ilo = h->FindFirstBinAbove(0);
104 double xlo = h->GetBinCenter(ilo);
105 double ylo = h->GetBinContent(ilo);
107 int iup = h->FindFirstBinAbove(0.8*h->GetMaximum());
108 double xup = h->GetBinCenter(iup);
109 double yup = h->GetBinContent(iup);
112 if (ilo != iup && (TMath::Abs(xup - xlo) > 1e-5)) slope = (yup-ylo)/(xup-xlo);
114 f->SetParameter(2, slope);
115 f->SetParameter(3, yup - slope*xup);
117 double par0 = (TMath::Pi()/2. - 1.4) / h->GetBinCenter(h->FindLastBinAbove(0.));
118 f->SetParameter(0, par0);
119 f->FixParameter(1, 0.);
120 f->SetParameter(4, -1.4);
122 if (xup > 0.) f->SetParameter(5, (yup - (TMath::Tan(f->GetParameter(0)*xup - f->GetParameter(4))
123 + f->GetParameter(1)*xup*xup*xup + slope*xup + f->GetParameter(3)))/(xup*xup));
124 else f->SetParameter(5, 0.);
138 TF1* PixInitFunc::gpTanH(TH1 *h) {
144 TF1* f = (TF1*)gROOT->FindObject(
"PIF_gpTanH");
146 f =
new TF1(
"PIF_gpTanH", PIF_gpTanH, lo, hi, 4);
150 f->ReleaseParameter(0);
151 f->ReleaseParameter(1);
152 f->ReleaseParameter(2);
153 f->ReleaseParameter(3);
157 f->SetParameter(0, 1.4e-3);
158 f->SetParLimits(0, 1.e-3, 2.e-3);
160 f->SetParameter(1, 0.8);
161 f->SetParLimits(1, 0., 20.);
163 double middle = h->GetMaximum() - h->GetMinimum();
164 double step = h->GetMaximum() - middle;
166 f->SetParameter(2, middle);
167 f->SetParLimits(2, 0., 2*middle);
169 f->SetParameter(3, step);
176 TF1* PixInitFunc::weibullCdf(TH1 *h) {
179 double hi = h->FindLastBinAbove(0.9*h->GetMaximum());
180 double lo = h->GetBinLowEdge(1);
182 for (
int i = 3; i < h->GetNbinsX(); ++i) {
183 if (h->GetBinContent(i-2) < 1 && h->GetBinContent(i-1) < 1 && h->GetBinContent(i) < 1) {
184 lo = h->GetBinLowEdge(i-2);
190 TF1* f = (TF1*)gROOT->FindObject(
"PIF_weibullCdf");
192 f =
new TF1(
"PIF_weibullCdf", PIF_weibullCdf, h->GetBinLowEdge(1), h->GetBinLowEdge(h->GetNbinsX()+1), 3);
193 f->SetParNames(
"norm",
"scale",
"shape");
197 f->ReleaseParameter(0);
198 f->ReleaseParameter(1);
199 f->ReleaseParameter(2);
200 f->ReleaseParameter(3);
204 f->SetParameter(0, h->GetMaximum());
205 f->SetParameter(1, h->GetBinCenter(h->FindFirstBinAbove(0.5*h->GetMaximum())));
206 f->SetParameter(2, 1.5);
213 TF1* PixInitFunc::errScurve(TH1 *h) {
219 int ibin(-1), jbin(-1);
220 double hmax(h->GetMaximum());
221 for (
int i = STARTBIN; i <= h->GetNbinsX(); ++i) {
222 if (h->GetBinContent(i) > 0) {
229 for (
int i = STARTBIN; i < h->GetNbinsX(); ++i) {
230 if (h->GetBinContent(i) > 0.9*hmax && h->GetBinContent(i+1) > 0.9*hmax) {
236 int plateauWidth = h->FindLastBinAbove(0.9*hmax) - jbin;
237 double hi = h->GetBinLowEdge(jbin + 0.7*plateauWidth);
239 double lo = h->GetBinLowEdge(1);
242 for (
int i = 3; i < h->GetNbinsX(); ++i) {
243 if (h->GetBinLowEdge(i-2) > hi)
break;
244 if (h->GetBinContent(i-2) < 1 && h->GetBinContent(i-1) < 1 && h->GetBinContent(i) < 1) {
245 lo = h->GetBinLowEdge(i-2);
251 lo = lo + 0.6*(h->GetBinLowEdge(ibin) - lo);
255 TF1* f = (TF1*)gROOT->FindObject(
"PIF_err");
257 f =
new TF1(
"PIF_err", PIF_err, h->GetBinLowEdge(1), h->GetBinLowEdge(h->GetNbinsX()+1), 4);
258 f->SetParNames(
"step",
"slope",
"floor",
"plateau");
262 f->ReleaseParameter(0);
263 f->ReleaseParameter(1);
264 f->ReleaseParameter(2);
265 f->ReleaseParameter(3);
269 f->SetParameter(0, h->GetBinCenter(0.5*(ibin+jbin)));
270 f->SetParameter(1, 2.0/(h->GetBinLowEdge(jbin) - h->GetBinLowEdge(ibin)));
278 f->FixParameter(0, h->GetBinCenter(jbin));
279 f->FixParameter(1, 1.e2);
282 f->FixParameter(2, 1.);
283 f->FixParameter(3, 0.5*h->GetMaximum());
288 TF1* PixInitFunc::xrayScan(TH1 *h) {
291 double lo = h->GetBinCenter(h->FindFirstBinAbove(0.));
292 double hi = h->GetBinCenter(h->FindLastBinAbove(0.9*h->GetMaximum()));
293 double hmax = h->GetMaximum();
296 double threshold(-1.), plateau(-1), width(-1.);
297 for (
int i = h->FindBin(lo); i < h->GetNbinsX(); i += 5) {
298 if (h->GetBinCenter(i) > hi - 10.)
break;
299 h->Fit(
"pol0",
"qr",
"", h->GetBinCenter(i), hi);
300 pol0 = h->GetFunction(
"pol0")->GetParameter(0);
303 double a = pol0/hmax;
304 if (a > 0.5 && threshold < 0) {
305 threshold = h->GetBinCenter(i);
310 width = 0.5*(threshold - lo);
318 TF1* f = (TF1*)gROOT->FindObject(
"PIF_err");
320 f =
new TF1(
"PIF_err", PIF_err, h->GetBinLowEdge(1), h->GetBinLowEdge(h->GetNbinsX()+1), 4);
321 f->SetParNames(
"step",
"slope",
"floor",
"plateau");
325 f->ReleaseParameter(0);
326 f->ReleaseParameter(1);
327 f->ReleaseParameter(2);
328 f->ReleaseParameter(3);
332 f->SetParameter(0, threshold);
333 f->SetParameter(1, width);
334 f->SetParameter(2, 1.);
335 f->SetParameter(3, 0.5*plateau);
343 void PixInitFunc::initExpo(
double &p0,
double &p1, TH1 *h) {
345 int EDG(4), NB(EDG+1);
346 int lbin(1), hbin(h->GetNbinsX()+1);
348 lbin = h->FindBin(fLo);
349 hbin = h->FindBin(fHi);
352 double dx = h->GetBinLowEdge(hbin) - h->GetBinLowEdge(lbin);
353 double ylo = h->Integral(lbin, lbin+EDG)/NB;
354 double yhi = h->Integral(hbin-EDG, hbin)/NB;
356 if (ylo > 0 && yhi > 0) {
357 p1 = (TMath::Log(yhi) - TMath::Log(ylo))/dx;
358 p0 = ylo/TMath::Exp(p1*fLo);
375 void PixInitFunc::initPol1(
double &p0,
double &p1, TH1 *h) {
377 int EDG(4), NB(EDG+1);
378 int lbin(1), hbin(h->GetNbinsX()+1);
380 lbin = h->FindBin(fLo);
381 hbin = h->FindBin(fHi);
384 double dx = h->GetBinLowEdge(hbin) - h->GetBinLowEdge(lbin);
385 double ylo = h->Integral(lbin, lbin+EDG)/NB;
386 double yhi = h->Integral(hbin-EDG, hbin)/NB;