2 HistoUtils_weightedmean(TH1 *h1, TH1 *h2)
5 TH1 *ho = (TH1 *)h1->Clone("ho");
7 Double_t val1, val2, w1, w2, mean, meane;
8 for (Int_t i = 0; i < ho->GetNbinsX(); i++) {
9 val1 = h1->GetBinContent(i + 1);
10 w1 = 1. / (h1->GetBinError(i + 1) * h1->GetBinError(i + 1));
11 val2 = h2->GetBinContent(i + 1);
12 w2 = 1. / (h2->GetBinError(i + 1) * h2->GetBinError(i + 1));
14 if (val1 == 0 && val2 == 0) continue;
16 mean = (w1 * val1 + w2 * val2) / (w1 + w2);
17 meane = TMath::Sqrt(1. / (w1 + w2));
19 ho->SetBinContent(i + 1, mean);
20 ho->SetBinError(i + 1, meane);
26 //__________________________________________________________________
29 HistoUtils_smartdifference(TH1 *hnum, TH1 *hden)
32 TH1 *hr = (TH1 *)hnum->Clone("hr");
35 for (Int_t i = 0; i < hr->GetNbinsX(); i++) {
36 if (hnum->GetBinError(i + 1) <= 0.) continue;
37 ref = hden->Interpolate(hr->GetBinCenter(i + 1));
38 if (ref <= 0.) continue;
39 hr->SetBinContent(i + 1, (hnum->GetBinContent(i + 1) - ref) / ref);
40 hr->SetBinError(i + 1, hnum->GetBinError(i + 1) / ref);
45 //__________________________________________________________________
48 HistoUtils_smartratio(TH1 *hnum, TGraph *hden)
51 TH1 *hr = (TH1 *)hnum->Clone("hr");
54 for (Int_t i = 0; i < hr->GetNbinsX(); i++) {
55 if (hnum->GetBinError(i + 1) <= 0.) continue;
56 ref = hden->Eval(hr->GetBinCenter(i + 1));
57 if (ref <= 0.) continue;
58 hr->SetBinContent(i + 1, hnum->GetBinContent(i + 1) / ref);
59 hr->SetBinError(i + 1, hnum->GetBinError(i + 1) / ref);
64 //__________________________________________________________________
66 HistoUtils_drawthemall(const Char_t *filename, Int_t sleepms)
68 TFile *f1 = TFile::Open(filename);
69 TList *l1 = f1->GetListOfKeys();
72 for (Int_t i = 0; i < l1->GetEntries(); i++) {
73 name = l1->At(i)->GetName();
77 gSystem->Sleep(sleepms);
82 //__________________________________________________________________
84 HistoUtils_autoratio(const Char_t *f1name, const Char_t *f2name, const Char_t *outname)
87 TFile *f1 = TFile::Open(f1name);
88 TFile *f2 = TFile::Open(f2name);
89 TFile *fo = TFile::Open(outname, "RECREATE");
90 TList *l1 = f1->GetListOfKeys();
95 for (Int_t i = 0; i < l1->GetEntries(); i++) {
96 name = l1->At(i)->GetName();
97 h1 = (TH1D *)f1->Get(name);
98 h2 = (TH1D *)f2->Get(name);
99 if (!h1 || !h2) continue;
113 //__________________________________________________________________
115 HistoUtils_autosystematics(const Char_t *f1name, const Char_t *f2name, const Char_t *outname)
118 TFile *f1 = TFile::Open(f1name);
119 TFile *f2 = TFile::Open(f2name);
120 if (!f1 || !f1->IsOpen() || !f2 || !f2->IsOpen()) return;
121 TFile *fo = TFile::Open(outname, "RECREATE");
122 TList *l1 = f1->GetListOfKeys();
127 for (Int_t i = 0; i < l1->GetEntries(); i++) {
128 name = l1->At(i)->GetName();
129 h1 = (TH1D *)f1->Get(name);
130 h2 = (TH1D *)f2->Get(name);
131 if (!h1 || !h2) continue;
134 Double_t val1, val2, vald, vale1, vale2, valde;
135 for (Int_t ii = 0; ii < hd->GetNbinsX(); ii++) {
136 val1 = h1->GetBinContent(ii + 1);
137 vale1 = h1->GetBinError(ii + 1);
138 val2 = h2->GetBinContent(ii + 1);
139 vale2 = h2->GetBinError(ii + 1);
140 if (val2 == 0.) continue;
141 vald = (val1 - val2) / val2;
142 valde = TMath::Sqrt(TMath::Abs((vale1 * vale1 - vale2 * vale2))) / val2;
143 hd->SetBinContent(ii + 1, vald);
144 hd->SetBinError(ii + 1, valde);
158 //__________________________________________________________________
161 HistoUtils_ratio(const Char_t *f1name, const Char_t *f2name, const Char_t *h1name, const Char_t *h2name)
164 if (!f2name) f2name = f1name;
165 TFile *f1 = TFile::Open(f1name);
166 TFile *f2 = TFile::Open(f2name);
168 if (!h2name) h2name = h1name;
169 TH1 *h1 = (TH1 *)f1->Get(h1name);
170 TH1 *h2 = (TH1 *)f2->Get(h2name);
172 TH1 *hr = h1->Clone("hr");
180 //__________________________________________________________________
183 HistoUtils_systematics(const Char_t *f1name, const Char_t *f2name, const Char_t *h1name, const Char_t *h2name)
186 if (!f2name) f2name = f1name;
187 TFile *f1 = TFile::Open(f1name);
188 TFile *f2 = TFile::Open(f2name);
190 if (!h2name) h2name = h1name;
191 TH1 *h1 = (TH1 *)f1->Get(h1name);
192 TH1 *h2 = (TH1 *)f2->Get(h2name);
194 TH1 *hd = h1->Clone("hd");
195 Double_t val1, val2, vald, vale1, vale2, valde;
196 for (Int_t i = 0; i < h1->GetNbinsX(); i++) {
197 val1 = h1->GetBinContent(i + 1);
198 vale1 = h1->GetBinError(i + 1);
199 val2 = h2->GetBinContent(i + 1);
200 vale2 = h2->GetBinError(i + 1);
201 if (val2 == 0.) continue;
202 vald = (val1 - val2) / val2;
203 valde = TMath::Sqrt(TMath::Abs((vale1 * vale1 - vale2 * vale2))) / val2;
204 hd->SetBinContent(i + 1, vald);
205 hd->SetBinError(i + 1, valde);
212 //__________________________________________________________________
214 HistoUtils_BinLogX(TH1 *h)
216 TAxis *axis = h->GetXaxis();
217 Int_t bins = axis->GetNbins();
218 Axis_t from = axis->GetXmin();
219 Axis_t to = axis->GetXmax();
220 Axis_t width = (to - from) / bins;
221 Axis_t *new_bins = new Axis_t[bins + 1];
222 for (int i = 0; i <= bins; i++) new_bins[i] = TMath::Power(10, from + i * width);
223 axis->Set(bins, new_bins);
227 //__________________________________________________________________
229 HistoUtils_BinNormX(TH1 *h)
231 TAxis *axis = h->GetXaxis();
232 Int_t bins = axis->GetNbins();
235 for (Int_t i = 0; i < bins; i++) {
236 c = h->GetBinContent(i + 1);
237 ec = h->GetBinError(i + 1);
238 w = axis->GetBinWidth(i + 1);
241 h->SetBinContent(i + 1, c);
242 h->SetBinError(i + 1, ec);
246 //__________________________________________________________________
249 HistoUtils_FitPeak(TF1 *fitFunc, TH2 *h, Float_t startSigma, Float_t nSigmaMin, Float_t nSigmaMax, Int_t minIntegral = 100., const Char_t *basename = "hParam", Bool_t monitor = kFALSE)
252 /* gaus function if not specified */
254 fitFunc = (TF1*)gROOT->GetFunction("gaus");
256 /* prepare output histos */
257 TObjArray *outArray = new TObjArray();
258 Int_t npars = fitFunc->GetNpar();
259 TH1D *hpx = h->ProjectionX("hpx");
261 for (Int_t ipar = 0; ipar < npars; ipar++) {
262 hParam = new TH1D(*hpx);
263 hParam->SetName(Form("%s_%d", basename, ipar));
265 outArray->Add(hParam);
268 /* loop over x-bins */
269 for (Int_t ibin = 0; ibin < hpx->GetNbinsX(); ibin++) {
272 if (hpx->GetBinContent(ibin + 1) < minIntegral) continue;
274 TH1D *hpy = h->ProjectionY("hpy", ibin + 1, ibin + 1);
276 if (HistoUtils_FitPeak(fitFunc, hpy, startSigma, nSigmaMin, nSigmaMax) != 0) {
280 /* setup output histos */
281 for (Int_t ipar = 0; ipar < npars; ipar++) {
282 hParam = (TH1D *)outArray->At(ipar);
283 hParam->SetBinContent(ibin + 1, fitFunc->GetParameter(ipar));
284 hParam->SetBinError(ibin + 1, fitFunc->GetParError(ipar));
288 hpy->SetMarkerStyle(20);
289 hpy->SetMarkerColor(4);
291 fitFunc->Draw("same");
301 /* return output array */
305 //__________________________________________________________________
308 HistoUtils_FitPeak(TF1 *fitFunc, TH1 *h, Float_t startSigma, Float_t nSigmaMin, Float_t nSigmaMax)
311 Double_t fitCent = h->GetBinCenter(h->GetMaximumBin());
312 Double_t fitMin = fitCent - nSigmaMin * startSigma;
313 Double_t fitMax = fitCent + nSigmaMax * startSigma;
314 if (fitMin < h->GetXaxis()->GetXmin()) fitMin = h->GetXaxis()->GetXmin();
315 if (fitMax > h->GetXaxis()->GetXmax()) fitMax = h->GetXaxis()->GetXmax();
316 fitFunc->SetParameter(1, fitCent);
317 fitFunc->SetParameter(2, startSigma);
318 Int_t fitres = h->Fit(fitFunc, "WWq0", "", fitMin, fitMax);
319 if (fitres != 0) return fitres;
320 /* refit with better range */
321 for (Int_t i = 0; i < 3; i++) {
322 fitCent = fitFunc->GetParameter(1);
323 fitMin = fitCent - nSigmaMin * fitFunc->GetParameter(2);
324 fitMax = fitCent + nSigmaMax * fitFunc->GetParameter(2);
325 if (fitMin < h->GetXaxis()->GetXmin()) fitMin = h->GetXaxis()->GetXmin();
326 if (fitMax > h->GetXaxis()->GetXmax()) fitMax = h->GetXaxis()->GetXmax();
327 fitres = h->Fit(fitFunc, "q0", "", fitMin, fitMax);
328 if (fitres != 0) return fitres;
334 //__________________________________________________________________
337 HistoUtils_Function2Profile(TF1 *fin, TProfile *p, Int_t ntry = 10000)
340 TF1 *f = new TF1(*fin);
341 Int_t npars = f->GetNpar();
344 for (Int_t ipar = 0; ipar < npars; ipar++) {
345 par[ipar] = f->GetParameter(ipar);
346 pare[ipar] = f->GetParError(ipar);
350 for (Int_t ibin = 0; ibin < p->GetNbinsX(); ibin++) {
351 for (Int_t itry = 0; itry < ntry; itry++) {
352 for (Int_t ipar = 0; ipar < npars; ipar++)
353 f->SetParameter(ipar, gRandom->Gaus(par[ipar], pare[ipar]));
354 x = gRandom->Uniform(p->GetXaxis()->GetBinLowEdge(ibin + 1), p->GetXaxis()->GetBinUpEdge(ibin + 1));
355 p->Fill(x, f->Eval(x));