]>
Commit | Line | Data |
---|---|---|
59e49925 | 1 | TObjArray * |
2 | FitPeak(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 | ||
37 | TF1 * | |
38 | FitPeak(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 | } |