Hello Experts and community,
I want to use a sPlot in RooFit and I get an error I can’t seem to tackle. The code is compiled but I call the sPlot in my macro I get:
[#0] ERROR:Eval -- SPlot Error: covariance matrix is singular; I can't invert it!
In this example I try to do a Gauss+Crystall Ball fit for Jpsi, and fit a functional form to the background.
So my Macro has the following form:
RooRealVar x("x", "m_{#mu#mu}", vec_hist_signal.at(i_histogram)->GetXaxis()->GetXmin(), vec_hist_signal.at(i_histogram)->GetXaxis()->GetXmax(), "GeV");
//::: Let's fit MC first
RooDataHist tempDataSet_MC("tempDataSet_MC", "", RooArgList(x), vec_hist_signal.at(i_histogram));
//::: Crystall Ball and Gauss components
RooRealVar mean("mean", "#mu", 3.1, 3.05, 3.15);
RooRealVar sigma("sigma", "#sigma", 0.05, 0.0001, 0.5);
RooRealVar alpha("a", "#alpha", 2, 0.5, 4);
RooRealVar eta("e", "#eta", 10, 0, 100);
RooCBShape tempCB_MC("tempCB_MC", "Crystal-Ball", x, mean, sigma, alpha, eta);
RooRealVar sigma_gauss("sigma_gauss", "#sigma_{gauss}", 1, 0.05, 1);
RooGaussian tempGauss_MC("tempGauss_MC", "Gauss", x, mean, sigma_gauss);
RooRealVar sigma_add("sigma_add", "#sigma_{add}", 0.05, 0.0001, 0.5);
RooRealVar alpha_add("a", "#alpha_{add}", 2, 0.5, 4);
RooRealVar eta_add("e", "#eta_{add}", 10, 0, 100);
RooCBShape tempCB_MC_add("tempCB_MC_add", "Crystal-Ball", x, mean, sigma_add, alpha_add, eta_add);
RooRealVar frac_1("frac_1", "frac_1", 0.7, 0.6, 1.);
signal_model = new RooAddPdf("tempModel_MC", "Crystal Ball + Gaussian", tempCB_MC, tempGauss_MC, frac_1);
signal_model->fitTo(tempDataSet_MC);
frac_1.setConstant(kTRUE);
sigma_gauss.setConstant(kTRUE);
alpha.setConstant(kTRUE);
eta.setConstant(kTRUE);
//::: Move on to data!
double Estimated_Bkg_Yield = 0.5 * (vec_hist_data.at(i_histogram)->GetBinContent(1) + vec_hist_data.at(i_histogram)->GetBinContent(vec_hist_data.at(i_histogram)->GetNbinsX())) * vec_hist_data.at(i_histogram)->GetNbinsX();
double Estimated_Sig_Yield = vec_hist_data.at(i_histogram)->Integral() - Estimated_Bkg_Yield;
RooDataHist tempDataSet_Data("tempDataSet_Data", "", RooArgList(x), vec_hist_data.at(i_histogram));
RooRealVar tempBkgYield("tempBkgYield", "Exponential Coefficient", Estimated_Bkg_Yield, 0, 10000000);
RooRealVar tempSigYield("tempSigYield", "Signal Coefficient", Estimated_Sig_Yield, 0, 10000000);
RooAbsPdf *background_pdf = nullptr;
//::: In case we fit the background with an exponential p.d.f.
RooRealVar t("t", "#tau", -1, -10, 0,"");
background_pdf = new RooExponential("background_pdf", "Exponential", x, t);
//::: The actual Fit
RooAddPdf tempModel("tempModel", "Complete Model", RooArgList(*background_pdf, *signal_model), RooArgList(tempBkgYield, tempSigYield));
tempModel.fitTo(tempDataSet_Data);
background_pdf->fillHistogram(vec_hist_bkg.at(i_histogram), RooArgList(x), tempBkgYield.getVal());
tempModel.Print();
//***** sPlot************
RooMsgService::instance().setSilentMode(true);
std::cout << "\n\n------------------------------------------\nThe dataset before creating sWeights:\n";
vec_roo_data_set.at(i_histogram).Print();
RooMsgService::instance().setGlobalKillBelow(RooFit::ERROR);
// Now we use the SPlot class to add SWeights for the isolation variable to
// our data set based on fitting the yields to the invariant mass variable
RooStats::SPlot sData{"sData", "An SPlot", vec_roo_data_set.at(i_histogram), &tempModel, RooArgList(tempBkgYield, tempSigYield)}; //Is it Correct with &??????????// ASK EMILIEN
Thank you