+ TH1F *hT0Fill = (TH1F *)cdbe->GetObject();
+
+ /* rebin until maximum bin has required minimum entries */
+ Int_t maxBin = hT0Fill->GetMaximumBin();
+ Float_t maxBinContent = hT0Fill->GetBinContent(maxBin);
+ Float_t binWidth = hT0Fill->GetBinWidth(maxBin);
+ while (maxBinContent < 400 && binWidth < 90.) {
+ hT0Fill->Rebin(2);
+ maxBin = hT0Fill->GetMaximumBin();
+ maxBinContent = hT0Fill->GetBinContent(maxBin);
+ binWidth = hT0Fill->GetBinWidth(maxBin);
+ }
+ Float_t maxBinCenter = hT0Fill->GetBinCenter(maxBin);
+
+ /* rough fit of the edge */
+ TF1 *gaus = (TF1 *)gROOT->GetFunction("landau");
+ gaus->SetParameter(1, maxBinCenter);
+ Float_t fitMin = maxBinCenter - 1000.; /* fit from 1 ns before max */
+ Float_t fitMax = maxBinCenter + 1000.; /* fit until 1 ns above max */
+ hT0Fill->Fit("gaus", "q0", "", fitMin, fitMax);
+ /* better fit of the edge */
+ Float_t mean, sigma;
+ for (Int_t istep = 0; istep < 10; istep++) {
+ mean = gaus->GetParameter(1);
+ sigma = gaus->GetParameter(2);
+ fitMin = mean - 2. * sigma;
+ fitMax = mean + 1. * sigma;
+ hT0Fill->Fit("landau", "q", "", fitMin, fitMax);
+ }
+ /* print params */
+ mean = gaus->GetParameter(1);
+ sigma = gaus->GetParameter(2);
+ Float_t meane = gaus->GetParError(1);
+ Float_t sigmae = gaus->GetParError(2);
+ printf("edge fit: mean = %f +- %f ps\n", mean, meane);
+ printf("edge fit: sigma = %f +- %f ps\n", sigma, sigmae);
+
+ hT0Fill->DrawCopy();
+ gaus->Draw("same");
+
+ return hT0Fill;