2D fitting with crystal ball function and get pull graph

dear roofitters:
i wanna use crystalball function to construct four pdfs(cbx1,cbx2,cby1,cby2) and dataset to do 2d fitting,then i try to use pull to examine the accuracy
but my pull got too high std dev and idk if i fit the pdf with wrong way,my code is here

#include <TH2.h>
#include <TStyle.h>
#include <TCanvas.h>
#include <RooRealVar.h>
#include <RooCBShape.h>
#include <RooProdPdf.h>
#include <RooExtendPdf.h>
#include <RooAddPdf.h>
#include <RooDataSet.h>
#include <RooFitResult.h>
#include <TRandom3.h>
#include <TDatime.h>
#include <TH1F.h>
#include <TF1.h>

using namespace RooFit;

void b1() {
    TDatime* startime = new TDatime();
    Int_t today = startime->GetDay();
    Int_t clock = startime->GetTime();
    Int_t seed = clock + today;
    RooRandom::randomGenerator()->SetSeed(seed);

    TCanvas* c1 = new TCanvas("c1", "c1");
    c1->SetGrid();

    TH1F* meanx1pull = new TH1F("meanx1pull", "meanx1pull", 200, -10, 10);
    TH1F* meanx2pull = new TH1F("meanx2pull", "meanx2pull", 200, -10, 10);
    TH1F* meany1pull = new TH1F("meany1pull", "meany1pull", 200, -10, 10);
    TH1F* meany2pull = new TH1F("meany2pull", "meany2pull", 200, -10, 10);
    float mylow = 2.95, myhigh = 3.05;
    float mymean = 3.0, mywidth = 0.005;
    TH1F* massdiff = new TH1F("massdiff", "massdiff", 200, -0.001, 0.001);
    TH1F* masspull = new TH1F("masspull", "masspull", 200, -10, 10);

    for (int j = 0; j < 500; j++) {
        RooRealVar x1("x1", "x1", mylow, myhigh);
        RooRealVar meanx1("meanx1", "meanx1", 3.0, 2.97, 3.03);
        RooRealVar sigmax1("sigmax1", "sigmax1", 0.005, 0.004, 0.006);
        RooRealVar alphax1("alphax1", "alphax1", 1.5, 1.1, 1.9);
        RooRealVar nx1("nx1", "nx1", 1.0, 0.7, 1.3);

        RooCBShape cbx1("cbx1", "cbx1", x1, meanx1, sigmax1, alphax1, nx1);

        RooRealVar x2("x2", "x2", mylow, myhigh);
        RooRealVar meanx2("meanx2", "meanx2", 3.0967, 2.9, 3.2);
        RooRealVar sigmax2("sigmax2", "sigmax2", 0.002, 0.001, 0.003);
        RooRealVar alphax2("alphax2", "alphax2", 1.5, 1.2, 1.8);
        RooRealVar nx2("nx2", "nx2", 1.0, 0.8, 1.2);

        RooCBShape cbx2("cbx2", "cbx2", x2, meanx2, sigmax2, alphax2, nx2);

        RooRealVar y1("y1", "y1", mylow, myhigh);
        RooRealVar meany1("meany1", "meany1", 3.0, 2.97, 3.03);
        RooRealVar sigmay1("sigmay1", "sigmay1", 0.005, 0.004, 0.006);
        RooRealVar alphay1("alphay1", "alphay1", 1.5, 1.2, 1.8);
        RooRealVar ny1("ny1", "ny1", 1.0, 0.8, 1.2);

        RooCBShape cby1("cby1", "cby1", y1, meany1, sigmay1, alphay1, ny1);

        RooRealVar y2("y2", "y2", mylow, myhigh);
        RooRealVar meany2("meany2", "meany2", 3.0967, 2.9, 3.2);
        RooRealVar sigmay2("sigmay2", "sigmay2", 0.002, 0.001, 0.003);
        RooRealVar alphay2("alphay2", "alphay2", 1.5, 1.1, 1.9);
        RooRealVar ny2("ny2", "ny2", 1.0, 0.7, 1.3);

        RooCBShape cby2("cby2", "cby2", y2, meany2, sigmay2, alphay2, ny2);

        RooProdPdf x1y1("x1y1", "x1y1", cbx1, cby1);
        RooProdPdf x1y2("x1y2", "x1y2", cbx1, cby2);
        RooProdPdf x2y1("x2y1", "x2y1", cbx2, cby1);

        RooRealVar nx1y1("nx1y1", "nx1y1", 100, 0, 50000);
        RooRealVar nx1y2("nx1y2", "nx1y2", 100, 0, 50000);
        RooRealVar nx2y1("nx2y1", "nx2y1", 100, 0, 50000);

        RooExtendPdf sig1("sig1", "sig1", x1y1, nx1y1);
        RooExtendPdf sig2("sig2", "sig2", x1y2, nx1y2);
        RooExtendPdf sig3("sig3", "sig3", x2y1, nx2y1);

        RooAddPdf total("total", "total", RooArgList(x1y1, x1y2, x2y1), RooArgList(nx1y1, nx1y2, nx2y1));

        RooDataSet* dataset = x1y1.generate(RooArgSet(x1, y1), 1500);
        RooDataSet* dataset1 = x1y2.generate(RooArgSet(x1, y2), 1000);
        RooDataSet* dataset2 = x2y1.generate(RooArgSet(x2, y1), 1000);
        dataset->append(*dataset1);
        dataset->append(*dataset2);
        RooFitResult* result = total.fitTo(*dataset, Save());
        masspull->Fill((meanx1.getVal() - 3.0) / meanx1.getError());
    }

    c1->cd();
    masspull->Draw();
    masspull->Fit("gaus");
}
![4e4c3c706d2736f9ff435075e03f8200|652x500](upload://uLhfxwFXdzgYHITqEvKYP7hfsyh.png)

best thank for your help
cheers

Thank you for your question @Lcszjie
Let me add @moneta in the loop.

Cheers,
Devajith

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.