]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/SPECTRA/PiKaPr/TOF/pPb502/macros/FitPeak.C
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / PiKaPr / TOF / pPb502 / macros / FitPeak.C
CommitLineData
59e49925 1TObjArray *
2FitPeak(TH2 *h, Float_t startSigma, Float_t nSigmaMin, Float_t nSigmaMax, const Char_t *name = "hsigma", TF1 *fitFunc = NULL)
3{
4 /*
5 * fit peak
6 */
7
8 TH1 *hpy = NULL;
9 TH1 *hout[2];
10 TH1 *hmean = h->ProjectionX(Form("%s_mean", name));
11 hmean->Reset();
12 TH1 *hsigma = h->ProjectionX(Form("%s_sigma", name));
13 hsigma->Reset();
14 for (Int_t i = 0; i < h->GetNbinsX(); i++) {
15 hpy = h->ProjectionY("hpy", i + 1, i + 1);
16 if (hpy->Integral() <= 0.) {
17 delete hpy;
18 continue;
19 }
20 fitFunc = FitPeak(hpy, startSigma, nSigmaMin, nSigmaMax, fitFunc);
21 hmean->SetBinContent(i + 1, fitFunc->GetParameter(1));
22 hmean->SetBinError(i + 1, fitFunc->GetParError(1));
23 hsigma->SetBinContent(i + 1, fitFunc->GetParameter(2));
24 hsigma->SetBinError(i + 1, fitFunc->GetParError(2));
25 delete hpy;
26 }
27 // new TCanvas("cmean");
28 // hmean->DrawClone();
29 // new TCanvas("csigma");
30 // hsigma->DrawClone();
31 TObjArray *oa = new TObjArray();
32 oa->Add(hmean);
33 oa->Add(hsigma);
34 return oa;
35}
36
37TF1 *
38FitPeak(TH1 *h, Float_t startSigma, Float_t nSigmaMin, Float_t nSigmaMax, TF1 *fitFunc = NULL)
39{
40 /*
41 * fit peak
42 */
43
44 if (!fitFunc)
45 fitFunc = (TF1 *)gROOT->GetFunction("gaus");
46
47 Double_t fitCent = h->GetBinCenter(h->GetMaximumBin());
48 Double_t fitMin = fitCent - nSigmaMin * startSigma;
49 Double_t fitMax = fitCent + nSigmaMax * startSigma;
50 if (fitMin < h->GetXaxis()->GetXmin()) fitMin = h->GetXaxis()->GetXmin();
51 if (fitMax > h->GetXaxis()->GetXmax()) fitMax = h->GetXaxis()->GetXmax();
52 fitFunc->SetParameter(1, fitCent);
53 fitFunc->SetParameter(2, startSigma);
54 Int_t fitres = h->Fit(fitFunc, "WWq0", "", fitMin, fitMax);
55 if (fitres != 0) return NULL;
56 /* refit with better range */
57 for (Int_t i = 0; i < 3; i++) {
58 fitCent = fitFunc->GetParameter(1);
59 fitMin = fitCent - nSigmaMin * fitFunc->GetParameter(2);
60 fitMax = fitCent + nSigmaMax * fitFunc->GetParameter(2);
61 if (fitMin < h->GetXaxis()->GetXmin()) fitMin = h->GetXaxis()->GetXmin();
62 if (fitMax > h->GetXaxis()->GetXmax()) fitMax = h->GetXaxis()->GetXmax();
63 fitres = h->Fit(fitFunc, "q0", "", fitMin, fitMax);
64 if (fitres != 0) return NULL;
65 }
66 return fitFunc;
67}