Hi,
I have two histograms that can be modeled with two different functions that depend on the same parameter. I would like to fit both histograms simultaneously, trying to estimate the (common) parameter. Is there any smart way of doing this?
I could make a third histogram that would contain the two histograms, well separated by an offset, and try to fit that 3rd histogram to the sum of the two functions (separated by the same offset). But this is not very smart, is it…
Thanks.
–Christos
Hi,
Define your own objective function in TVirtualFitter in which
the function is calculated with the appropriate function.
eddy
Ok, but then how do I define the object/histogram to be fit? Would that be just the sum of the histograms (shifted in the x-direction), as I said in my first post?
–Christos
Ok, here a some pseudo code. The array par contains all parameters
to be fitted. Let’s say you want to fit a Gaussian line shape to
each of the two histograms. You know that the width of
the Gaussians should be identical:
h1 = par[0]; p1 = par[1]; w1 = par[2];
h2 = par[3]; p2 = par[4]; w2 = par[2];
//__________________________________________________________
void FitChisquare(Int_t &nrPar,Double_t *grad,Double_t &chiSquare,
Double_t *par,Int_t flag)
{
const TMyFit *fit = (TMyFit *) gMinuit->GetObjectFit();
const TH1D *h1d = fit->GetH1();
const TH1D *h2d = fit->GetH2();
const TF1 *f1 = fit->GetF1();
const TF1 *f2 = fit->GetF2();
Double_t chiSquare = 0;
gaussPar[0] = par[0];
gaussPar[1] = par[1];
gaussPar[2] = par[2];
for (Int_t i = 1; i < h1d->GetNbinsX(); i++)
{
const Double_t xval = h1d->GetBincenter(i);
const Double_t yval = h1d->GetBinContent(i);
const Double_t yerr = h1d->GetBinError(i);
const Double_t yfun = f1->EvalPar(xval,gaussPar);
chiSquare += (yval-yfun)*(yval-yfun)/yerr/yerr;
}
gaussPar[0] = par[3];
gaussPar[1] = par[4];
gaussPar[2] = par[2];
for (Int_t i = 1; i < h2d->GetNbinsX(); i++)
{
const Double_t xval = h2d->GetBincenter(i);
const Double_t yval = h2d->GetBinContent(i);
const Double_t yerr = h2d->GetBinError(i);
const Double_t yfun = f2->EvalPar(xval,gaussPar);
chiSquare += (yval-yfun)*(yval-yfun)/yerr/yerr;
}
}