46    GlobalChi2(  ROOT::Math::IMultiGenFunction & f1,
 
   47                 ROOT::Math::IMultiGenFunction & f2) :
 
   48       fChi2_1(&f1), fChi2_2(&f2) {}
 
   52    double operator() (
const double *par)
 const {
 
   54       for (
int i = 0; i < 2; ++i) p1[i] = par[iparB[i] ];
 
   57       for (
int i = 0; i < 5; ++i) p2[i] = par[iparSB[i] ];
 
   59       return (*fChi2_1)(p1) + (*fChi2_2)(p2);
 
   62    const  ROOT::Math::IMultiGenFunction * fChi2_1;
 
   63    const  ROOT::Math::IMultiGenFunction * fChi2_2;
 
   68    TH1D * hB = 
new TH1D(
"hB",
"histo B",100,0,100);
 
   69    TH1D * hSB = 
new TH1D(
"hSB",
"histo S+B",100, 0,100);
 
   71    TF1 * fB = 
new TF1(
"fB",
"expo",0,100);
 
   72    fB->SetParameters(1,-0.05);
 
   75    TF1 * fS = 
new TF1(
"fS",
"gaus",0,100);
 
   76    fS->SetParameters(1,30,5);
 
   78    hSB->FillRandom(
"fB",2000);
 
   79    hSB->FillRandom(
"fS",1000);
 
   83    TF1 * fSB = 
new TF1(
"fSB",
"expo + gaus(2)",0,100);
 
   85    ROOT::Math::WrappedMultiTF1 wfB(*fB,1);
 
   86    ROOT::Math::WrappedMultiTF1 wfSB(*fSB,1);
 
   88    ROOT::Fit::DataOptions opt;
 
   89    ROOT::Fit::DataRange rangeB;
 
   91    rangeB.SetRange(10,90);
 
   92    ROOT::Fit::BinData dataB(opt,rangeB);
 
   93    ROOT::Fit::FillData(dataB, hB);
 
   95    ROOT::Fit::DataRange rangeSB;
 
   96    rangeSB.SetRange(10,50);
 
   97    ROOT::Fit::BinData dataSB(opt,rangeSB);
 
   98    ROOT::Fit::FillData(dataSB, hSB);
 
  100    ROOT::Fit::Chi2Function chi2_B(dataB, wfB);
 
  101    ROOT::Fit::Chi2Function chi2_SB(dataSB, wfSB);
 
  103    GlobalChi2 globalChi2(chi2_B, chi2_SB);
 
  105    ROOT::Fit::Fitter fitter;
 
  108    double par0[Npar] = { 5,5,-0.1,100, 30,10};
 
  111    fitter.Config().SetParamsSettings(6,par0);
 
  113    fitter.Config().ParSettings(4).Fix();
 
  115    fitter.Config().ParSettings(2).SetLimits(-10,-1.E-4);
 
  116    fitter.Config().ParSettings(3).SetLimits(0,10000);
 
  117    fitter.Config().ParSettings(3).SetStepSize(5);
 
  119    fitter.Config().MinimizerOptions().SetPrintLevel(0);
 
  120    fitter.Config().SetMinimizer(
"Minuit2",
"Migrad");
 
  124    fitter.FitFCN(6,globalChi2,0,dataB.Size()+dataSB.Size(),
true);
 
  125    ROOT::Fit::FitResult result = fitter.Result();
 
  126    result.Print(std::cout);
 
  128    TCanvas * c1 = 
new TCanvas(
"Simfit",
"Simultaneous fit of two histograms",
 
  132    gStyle->SetOptFit(1111);
 
  134    fB->SetFitResult( result, iparB);
 
  135    fB->SetRange(rangeB().first, rangeB().second);
 
  136    fB->SetLineColor(kBlue);
 
  137    hB->GetListOfFunctions()->Add(fB);
 
  141    fSB->SetFitResult( result, iparSB);
 
  142    fSB->SetRange(rangeSB().first, rangeSB().second);
 
  143    fSB->SetLineColor(kRed);
 
  144    hSB->GetListOfFunctions()->Add(fSB);