//============================================================================= /** * @file DoAsymptoticErrFit.C * @brief Do a fit to weighted data using AsymptoticError and show * that it crashes * * @author Tim-Philip Huecking, * * Created: * @date 20-05-27 (TPH) * * Changed: * */ //============================================================================= // system includes // ROOT includes // local includes // system includes #include // ROOT includes #include #include // local includes #include "modelBuilder.C" //#include "Config.C" RooDataSet* getSWeightedData(ModelBuilder& model, RooDataSet* data); void compareFitRes(RooFitResult* withMinos, RooFitResult* noMinos); void DoAsymptoticErrFit() { RooTrace::active(kTRUE); RooTrace::verbose(kTRUE); // Model parameters are stored in Configurator Configurator cfg{}; cfg.prntModelPars(); // Build a model with 3 variables: // - mass (bkg: Exponential, sig: Gaussian) // - vexex (bkg: Exponential, sig: Exponential) // - vgg (bkg: Gaussian, sig: Gaussian) ModelBuilder model{cfg}; bool useRandomSeed = false; model.buildFullModel(useRandomSeed); // generate a data set model.m_pdfFull->Print(); model.m_nSigFit->Print(); model.m_nBkgFit->Print(); RooDataSet* data = model.m_pdfFull->generate(RooArgList( *model.m_mass.get(), *model.m_vgg.get() , *model.m_vexex.get()), Extended(kTRUE)); // Get a data set weighted with the signal sWeights RooDataSet *sigSwData = getSWeightedData(model, data); // Now fit the signal Gaussian of vgg to it model.m_pdfExtVggSig->Print(); RooTrace::dump(); cout << "\n---- USE SUMWERROR ----\n" << endl; RooFitResult* wFitSumW2 = model.m_pdfExtVggSig->fitTo( *sigSwData , Extended(kTRUE), AsymptoticError(kFALSE), SumW2Error(kTRUE) , PrintLevel(0), Verbose(kFALSE), Save(kTRUE), Minos(kFALSE)); cout << "\n\t => IF YOU CAN READ THIS, SUMW2ERROR WORKED\n" << endl; cout << "\n---- USE ASYMPTOTICERROR----\n" << endl; RooFitResult* wFitAsymVxx = model.m_pdfExtVexexSig->fitTo(*sigSwData , Extended(kTRUE), AsymptoticError(kTRUE), SumW2Error(kFALSE) , PrintLevel(0), Verbose(kFALSE), Save(kFALSE), Minos(kFALSE)); RooFitResult* wFitAsym = model.m_pdfExtVggSig->fitTo( *sigSwData , Extended(kTRUE), AsymptoticError(kTRUE), SumW2Error(kFALSE) , PrintLevel(0), Verbose(kFALSE), Save(kTRUE), Minos(kFALSE)); return; } RooDataSet* getSWeightedData(ModelBuilder& model, RooDataSet* data) { // Do a fit in the discriminating variable, as it is needed for // sPlot method //RooFitResult* discrRes = model.m_pdfMassSum->fitTo(*data //, Extended(kTRUE), Save(kTRUE), Verbose(kFALSE), Minos(kFALSE)); // add sWeights to data set auto splot = new RooStats::SPlot("splot", "splot"); splot->SetSData(data); splot->AddSWeight( model.m_pdfMassSum.get() //model.m_pdfFull.get() , RooArgList(*model.m_nSigFit.get(), *model.m_nBkgFit.get()) , RooArgSet{}, kFALSE); data->Print(); delete splot; // now perform a fit to weighted events // Therefore create a data set weighted with signal sWeights auto sigSwData = new RooDataSet("sigSwData" , "Data weighted with signal sWeights", RooArgSet(*data->get()) , Import(*data), WeightVar("nSigFit_sw")); return sigSwData; }