Skip to content

[RF] Different behaviour of multi-range fit in RooAddPdf and RooProdPdf #16673

Open
@wangyanqi191025

Description

@wangyanqi191025

Check duplicate issues.

  • Checked for duplicates

Description

When I use RooFit to do multi-range fit, different behaviour in RooAddPdf and RooProdPdf (with the same pdf) is got. When make workspace, people usually add some constrain pdfs to RooAddPdf to form RooProdPdf. However, the fit result is different, even if I just add the RooAddPdf into the RooProdPdf without changing the pdf form.

This different behaviour exists in ROOT v6.28/00, and still exists in ROOT v6.32/02. However, in ROOT v6.26/08, the fit results of RooAddPdf and RooProdPdf are the same, which is expected.

I make a reproducer script, in which RooAddpdf and RooProdPdf have the same pdf.

In ROOT v6.26/08, RooAddpdf and RooProdPdf fit give the same Nbkg, which is expected.
RooFitMacro_6_26_08_centos7_gcc11
In ROOT v6.32/02, it gives different Nbkg.
RooFitMacro_6_32_02

Reproducer

#include "RooRealVar.h"
#include "RooExponential.h"
#include "RooGaussian.h"
#include "RooAddPdf.h"
#include "RooProdPdf.h"
#include "RooDataSet.h"
#include "RooPlot.h"
#include "RooExtendPdf.h"
#include "RooFitResult.h"
 
#include "TCanvas.h"

int RooFitMacroA()
{
    using namespace RooFit;
    
    RooRealVar x("x", "x", 0, 100);
    RooRealVar alpha("alpha", "alpha", -0.04, -0.1, -0.0);
    RooExponential model("model", "Exponential model", x, alpha);
    
    // Define side band regions and full range

    x.setRange("LEFT", 0, 20);
    x.setRange("RIGHT", 60, 100);
    x.setRange("BLIND",20,60);
    x.setRange("FULL", 0, 100);
    std::unique_ptr<RooDataSet> data{model.generate(x, 10000)};
    
    RooRealVar Nsig("Nsig", "Number of signal events", 1000, 0, 2000);
    RooRealVar Nbkg("Nbkg", "Number of background events", 10000, 0, 20000);
    
    RooRealVar mean("mean", "Mean of signal model", 40.);
    RooRealVar width("width", "Width of signal model", 5.);
    RooGaussian sig("sig", "Signal model", x, mean, width);
    
    // RooAddPdf pdfadd("pdfadd", "NSig*signal + NBkg*background", {sig, model}, {Nsig, Nbkg});
    RooAddPdf pdfadd("pdfadd", "NBkg*background", {model}, {Nbkg});
    RooProdPdf pdfprod("pdfprod", "pdfprod", RooArgSet(pdfadd));
    
    pdfadd.Print();
    pdfprod.Print();

    TCanvas* c = new TCanvas("c", "c", 1400, 1000);
    c->Divide(2,2);

    c->cd(1);
    RooPlot* frame1 = x.frame();
    pdfadd.plotOn(frame1);
    pdfadd.paramOn(frame1,Label("RooAddPdf"));
    frame1->Draw();

    c->cd(2);
    RooPlot* frame2 = x.frame();
    pdfprod.plotOn(frame2);
    pdfprod.paramOn(frame2,Label("RooProdPdf"));
    frame2->Draw();

    c->cd(3);
    RooPlot* frame3 = x.frame();
    RooFitResult* status3 = pdfadd.fitTo(*data,Range("LEFT,RIGHT"),Save());
    status3->Print();
    data->plotOn(frame3);
    pdfadd.plotOn(frame3);
    pdfadd.paramOn(frame3,Label("RooAddPdf_fitted"));
    frame3->Draw();

    c->cd(4);
    RooPlot* frame4 = x.frame();
    RooFitResult* status4 = pdfprod.fitTo(*data,Range("LEFT,RIGHT"),Save());
    status4->Print();
    data->plotOn(frame4);
    pdfprod.plotOn(frame4);
    pdfprod.paramOn(frame4,Label("RooProdPdf_fitted"));
    frame4->Draw();

    c->Draw();
    c->SaveAs("RooFitMacro.png");

    pdfadd.Print();
    status3->Print();
    pdfprod.Print();
    status4->Print();

    return 0;
}

RooFitMacroA.cpp.zip

just unzip and run as "root RooFitMacroA.cpp"

ROOT version

on lxplus
ROOT v6.26.04-x86_64-centos7-gcc11-opt - no observed (same result)
ROOT v6.26.08-x86_64-centos7-gcc11-opt - no observed (same result)
ROOT v6.28.00-x86_64-centos7-gcc11-opt - observed (different result)
ROOT v6.32.02-x86_64-el9-gcc13-opt - observed (different result)

Installation method

on lxplus, 'setupATLAS', lsetup "root ..."

Operating system

Linux centos7 and EL9

Additional context

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions