ROOT logo
TObjArray *
FitPeak(TH2 *h, Float_t startSigma, Float_t nSigmaMin, Float_t nSigmaMax, const Char_t *name = "hsigma", TF1 *fitFunc = NULL)
{
  /*
   * fit peak
   */

  TH1 *hpy = NULL;
  TH1 *hout[2];
  TH1 *hmean = h->ProjectionX(Form("%s_mean", name));
  hmean->Reset();
  TH1 *hsigma = h->ProjectionX(Form("%s_sigma", name));
  hsigma->Reset();
  for (Int_t i = 0; i < h->GetNbinsX(); i++) {
    hpy = h->ProjectionY("hpy", i + 1, i + 1);
    if (hpy->Integral() <= 0.) {
      delete hpy;
      continue;
    }
    fitFunc = FitPeak(hpy, startSigma, nSigmaMin, nSigmaMax, fitFunc);
    hmean->SetBinContent(i + 1, fitFunc->GetParameter(1));
    hmean->SetBinError(i + 1, fitFunc->GetParError(1));
    hsigma->SetBinContent(i + 1, fitFunc->GetParameter(2));
    hsigma->SetBinError(i + 1, fitFunc->GetParError(2));
    delete hpy;
  }
  //  new TCanvas("cmean");
  //  hmean->DrawClone();
  //  new TCanvas("csigma");
  //  hsigma->DrawClone();
  TObjArray *oa = new TObjArray();
  oa->Add(hmean);
  oa->Add(hsigma);
  return oa;
}

TF1 *
FitPeak(TH1 *h, Float_t startSigma, Float_t nSigmaMin, Float_t nSigmaMax, TF1 *fitFunc = NULL)
{
  /*
   * fit peak
   */

  if (!fitFunc)
    fitFunc = (TF1 *)gROOT->GetFunction("gaus");

  Double_t fitCent = h->GetBinCenter(h->GetMaximumBin());
  Double_t fitMin = fitCent - nSigmaMin * startSigma;
  Double_t fitMax = fitCent + nSigmaMax * startSigma;
  if (fitMin < h->GetXaxis()->GetXmin()) fitMin = h->GetXaxis()->GetXmin();
  if (fitMax > h->GetXaxis()->GetXmax()) fitMax = h->GetXaxis()->GetXmax();
  fitFunc->SetParameter(1, fitCent);
  fitFunc->SetParameter(2, startSigma);
  Int_t fitres = h->Fit(fitFunc, "WWq0", "", fitMin, fitMax);
  if (fitres != 0) return NULL;
  /* refit with better range */
  for (Int_t i = 0; i < 3; i++) {
    fitCent = fitFunc->GetParameter(1);
    fitMin = fitCent - nSigmaMin * fitFunc->GetParameter(2);
    fitMax = fitCent + nSigmaMax * fitFunc->GetParameter(2);
    if (fitMin < h->GetXaxis()->GetXmin()) fitMin = h->GetXaxis()->GetXmin();
    if (fitMax > h->GetXaxis()->GetXmax()) fitMax = h->GetXaxis()->GetXmax();
    fitres = h->Fit(fitFunc, "q0", "", fitMin, fitMax);
    if (fitres != 0) return NULL;
  }
  return fitFunc;
}
 FitPeak.C:1
 FitPeak.C:2
 FitPeak.C:3
 FitPeak.C:4
 FitPeak.C:5
 FitPeak.C:6
 FitPeak.C:7
 FitPeak.C:8
 FitPeak.C:9
 FitPeak.C:10
 FitPeak.C:11
 FitPeak.C:12
 FitPeak.C:13
 FitPeak.C:14
 FitPeak.C:15
 FitPeak.C:16
 FitPeak.C:17
 FitPeak.C:18
 FitPeak.C:19
 FitPeak.C:20
 FitPeak.C:21
 FitPeak.C:22
 FitPeak.C:23
 FitPeak.C:24
 FitPeak.C:25
 FitPeak.C:26
 FitPeak.C:27
 FitPeak.C:28
 FitPeak.C:29
 FitPeak.C:30
 FitPeak.C:31
 FitPeak.C:32
 FitPeak.C:33
 FitPeak.C:34
 FitPeak.C:35
 FitPeak.C:36
 FitPeak.C:37
 FitPeak.C:38
 FitPeak.C:39
 FitPeak.C:40
 FitPeak.C:41
 FitPeak.C:42
 FitPeak.C:43
 FitPeak.C:44
 FitPeak.C:45
 FitPeak.C:46
 FitPeak.C:47
 FitPeak.C:48
 FitPeak.C:49
 FitPeak.C:50
 FitPeak.C:51
 FitPeak.C:52
 FitPeak.C:53
 FitPeak.C:54
 FitPeak.C:55
 FitPeak.C:56
 FitPeak.C:57
 FitPeak.C:58
 FitPeak.C:59
 FitPeak.C:60
 FitPeak.C:61
 FitPeak.C:62
 FitPeak.C:63
 FitPeak.C:64
 FitPeak.C:65
 FitPeak.C:66
 FitPeak.C:67
 FitPeak.C:68