int main() { typedef funct::Product<funct::Parameter, funct::BreitWigner>::type FitFunction; typedef fit::HistoChiSquare<FitFunction> ChiSquared; try { funct::Parameter yield("Yield", 1000); funct::Parameter mass("Mass", 91.2); funct::Parameter gamma("Gamma", 2.50); funct::BreitWigner bw(mass, gamma); FitFunction f = yield * bw; TF1 startFun = root::tf1("startFun", f, 0, 200, yield, mass, gamma); TH1D histo("histo", "Z mass (GeV/c)", 200, 0, 200); histo.FillRandom("startFun", yield); ChiSquared chi2(f, &histo, 80, 120); fit::RootMinuit<ChiSquared> minuit(chi2, true); minuit.addParameter(yield, 100, 0, 10000); minuit.addParameter(mass, 2, 70, 120); minuit.addParameter(gamma, 1, 0, 5); minuit.minimize(); minuit.migrad(); } catch(std::exception & err){ std::cerr << "Exception caught:\n" << err.what() << std::endl; return 1; } return 0; }
void FitterUtilsSimultaneousExpOfPolyTimesX::fit(bool wantplot, bool constPartReco, double fracPartReco_const, ofstream& out, TTree* t, bool update, string plotsfile) { //***************Get the PDFs from the workspace TFile fw(workspacename.c_str()); RooWorkspace* workspace = (RooWorkspace*)fw.Get("workspace"); RooRealVar *B_plus_M = workspace->var("B_plus_M"); RooRealVar *misPT = workspace->var("misPT"); RooRealVar *l1Kee = workspace->var("l1Kee"); RooRealVar *l2Kee = workspace->var("l2Kee"); RooRealVar *l3Kee = workspace->var("l3Kee"); RooRealVar *l4Kee = workspace->var("l4Kee"); RooRealVar *l5Kee = workspace->var("l5Kee"); RooRealVar *l1KeeGen = workspace->var("l1KeeGen"); RooRealVar *l2KeeGen = workspace->var("l2KeeGen"); RooRealVar *l3KeeGen = workspace->var("l3KeeGen"); RooRealVar *l4KeeGen = workspace->var("l4KeeGen"); RooRealVar *l5KeeGen = workspace->var("l5KeeGen"); RooRealVar *fractionalErrorJpsiLeak = workspace->var("fractionalErrorJpsiLeak"); RooRealVar l1Kemu(*l1Kee); l1Kemu.SetName("l1Kemu"); l1Kemu.SetTitle("l1Kemu"); RooRealVar l2Kemu(*l2Kee); l2Kemu.SetName("l2Kemu"); l2Kemu.SetTitle("l2Kemu"); RooRealVar l3Kemu(*l3Kee); l3Kemu.SetName("l3Kemu"); l3Kemu.SetTitle("l3Kemu"); RooRealVar l4Kemu(*l4Kee); l4Kemu.SetName("l4Kemu"); l4Kemu.SetTitle("l4Kemu"); RooRealVar l5Kemu(*l5Kee); l5Kemu.SetName("l5Kemu"); l5Kemu.SetTitle("l5Kemu"); RooHistPdf *histPdfSignalZeroGamma = (RooHistPdf *) workspace->pdf("histPdfSignalZeroGamma"); RooHistPdf *histPdfSignalOneGamma = (RooHistPdf *) workspace->pdf("histPdfSignalOneGamma"); RooHistPdf *histPdfSignalTwoGamma = (RooHistPdf *) workspace->pdf("histPdfSignalTwoGamma"); RooHistPdf *histPdfPartReco = (RooHistPdf *) workspace->pdf("histPdfPartReco"); RooHistPdf *histPdfJpsiLeak(0); if(nGenJpsiLeak>0) histPdfJpsiLeak = (RooHistPdf *) workspace->pdf("histPdfJpsiLeak"); //Here set in the Kemu PDF the parameters that have to be shared RooExpOfPolyTimesX* combPDF = new RooExpOfPolyTimesX("combPDF", "combPDF", *B_plus_M, *misPT, *l1Kee, *l2Kee, *l3Kee, *l4Kee, *l5Kee); RooExpOfPolyTimesX* KemuPDF = new RooExpOfPolyTimesX("kemuPDF", "kemuPDF", *B_plus_M, *misPT, l1Kemu, *l2Kee, *l3Kee, *l4Kee, *l5Kee); RooWorkspace* workspaceGen = (RooWorkspace*)fw.Get("workspaceGen"); RooDataSet* dataGenSignalZeroGamma = (RooDataSet*)workspaceGen->data("dataGenSignalZeroGamma"); RooDataSet* dataGenSignalOneGamma = (RooDataSet*)workspaceGen->data("dataGenSignalOneGamma"); RooDataSet* dataGenSignalTwoGamma = (RooDataSet*)workspaceGen->data("dataGenSignalTwoGamma"); RooDataSet* dataGenPartReco = (RooDataSet*)workspaceGen->data("dataGenPartReco"); RooDataSet* dataGenComb = (RooDataSet*)workspaceGen->data("dataGenComb"); RooDataSet* dataGenKemu = (RooDataSet*)workspaceGen->data("dataGenKemu"); RooDataSet* dataGenJpsiLeak(0); if(nGenJpsiLeak>0) dataGenJpsiLeak = (RooDataSet*)workspaceGen->data("dataGenJpsiLeak"); if(wantplot) { //**************Must get the datasets RooDataSet* dataSetSignalZeroGamma = (RooDataSet*)workspace->data("dataSetSignalZeroGamma"); RooDataSet* dataSetSignalOneGamma = (RooDataSet*)workspace->data("dataSetSignalOneGamma"); RooDataSet* dataSetSignalTwoGamma = (RooDataSet*)workspace->data("dataSetSignalTwoGamma"); RooDataSet* dataSetPartReco = (RooDataSet*)workspace->data("dataSetPartReco"); RooDataSet* dataSetComb = (RooDataSet*)workspace->data("dataSetComb"); RooDataSet* dataSetJpsiLeak = (RooDataSet*)workspace->data("dataSetJpsiLeak"); //**************Plot all the different components cout<<"dataGenSignalZeroGamma: "<<dataGenSignalZeroGamma<<endl; PlotShape(*dataSetSignalZeroGamma, *dataGenSignalZeroGamma, *histPdfSignalZeroGamma, plotsfile, "cSignalZeroGamma", *B_plus_M, *misPT); PlotShape(*dataSetSignalOneGamma, *dataGenSignalOneGamma, *histPdfSignalOneGamma, plotsfile, "cSignalOneGamma", *B_plus_M, *misPT); PlotShape(*dataSetSignalTwoGamma, *dataGenSignalTwoGamma, *histPdfSignalTwoGamma, plotsfile, "cSignalTwoGamma", *B_plus_M, *misPT); PlotShape(*dataSetPartReco, *dataGenPartReco, *histPdfPartReco, plotsfile, "cPartReco", *B_plus_M, *misPT); PlotShape(*dataSetComb, *dataGenComb, *combPDF, plotsfile, "cComb", *B_plus_M, *misPT); if(nGenJpsiLeak>1) PlotShape(*dataSetJpsiLeak, *dataGenJpsiLeak, *histPdfJpsiLeak, plotsfile, "cJpsiLeak", *B_plus_M, *misPT); } //***************Merge datasets RooDataSet* dataGenTot(dataGenPartReco); dataGenTot->append(*dataGenSignalZeroGamma); dataGenTot->append(*dataGenSignalOneGamma); dataGenTot->append(*dataGenSignalTwoGamma); dataGenTot->append(*dataGenComb); if(nGenJpsiLeak>0) dataGenTot->append(*dataGenJpsiLeak); //**************Create index category and join samples RooCategory category("category", "category"); category.defineType("Kee"); category.defineType("Kemu"); RooDataSet dataGenSimultaneous("dataGenSimultaneous", "dataGenSimultaneous", RooArgSet(*B_plus_M, *misPT), Index(category), Import("Kee", *dataGenTot), Import("Kemu", *dataGenKemu)); //**************Prepare fitting function RooRealVar nSignal("nSignal", "#signal events", 1.*nGenSignal, nGenSignal-7*sqrt(nGenSignal), nGenSignal+7*sqrt(nGenSignal)); RooRealVar nPartReco("nPartReco", "#nPartReco", 1.*nGenPartReco, nGenPartReco-7*sqrt(nGenPartReco), nGenPartReco+7*sqrt(nGenPartReco)); RooRealVar nComb("nComb", "#nComb", 1.*nGenComb, nGenComb-7*sqrt(nGenComb), nGenComb+7*sqrt(nGenComb)); RooRealVar nKemu("nKemu", "#nKemu", 1.*nGenKemu, nGenKemu-7*sqrt(nGenKemu), nGenKemu+7*sqrt(nGenKemu)); RooRealVar nJpsiLeak("nJpsiLeak", "#nJpsiLeak", 1.*nGenJpsiLeak, nGenJpsiLeak-7*sqrt(nGenJpsiLeak), nGenJpsiLeak+7*sqrt(nGenJpsiLeak)); RooRealVar fracZero("fracZero", "fracZero",0.5,0,1); RooRealVar fracOne("fracOne", "fracOne",0.5, 0,1); RooFormulaVar fracPartReco("fracPartReco", "nPartReco/nSignal", RooArgList(nPartReco,nSignal)); RooFormulaVar fracOneRec("fracOneRec", "(1-fracZero)*fracOne", RooArgList(fracZero, fracOne)); RooAddPdf histPdfSignal("histPdfSignal", "histPdfSignal", RooArgList(*histPdfSignalZeroGamma, *histPdfSignalOneGamma, *histPdfSignalTwoGamma), RooArgList(fracZero, fracOneRec)); RooArgList pdfList(histPdfSignal, *histPdfPartReco, *combPDF); RooArgList yieldList(nSignal, nPartReco, nComb); if(nGenJpsiLeak>0) { pdfList.add(*histPdfJpsiLeak); yieldList.add(nJpsiLeak); } RooAddPdf totPdf("totPdf", "totPdf", pdfList, yieldList); RooExtendPdf totKemuPdf("totKemuPdf", "totKemuPdf", *KemuPDF, nKemu); //**************** Prepare simultaneous PDF RooSimultaneous simPdf("simPdf", "simPdf", category); simPdf.addPdf(totPdf, "Kee"); simPdf.addPdf(totKemuPdf, "Kemu"); //**************** Constrain the fraction of zero and one photon int nGenSignalZeroGamma(floor(nGenFracZeroGamma*nGenSignal)); int nGenSignalOneGamma(floor(nGenFracOneGamma*nGenSignal)); int nGenSignalTwoGamma(floor(nGenSignal-nGenSignalZeroGamma-nGenSignalOneGamma)); RooRealVar fracZeroConstMean("fracZeroConstMean", "fracZeroConstMean", nGenSignalZeroGamma*1./nGenSignal); RooRealVar fracZeroConstSigma("fracZeroConstSigma", "fracZeroConstSigma", sqrt(nGenSignalZeroGamma)/nGenSignal); RooGaussian fracZeroConst("fracZeroConst", "fracZeroConst", fracZero, fracZeroConstMean, fracZeroConstSigma); RooRealVar fracOneConstMean("fracOneConstMean", "fracOneConstMean", nGenSignalOneGamma*1./nGenSignal/(1-fracZeroConstMean.getVal())); RooRealVar fracOneConstSigma("fracOneConstSigma", "fracOneConstSigma", sqrt(nGenSignalOneGamma)/nGenSignal/(1-fracZeroConstMean.getVal())); RooGaussian fracOneConst("fracOneConst", "fracOneConst", fracOne, fracOneConstMean, fracOneConstSigma); RooRealVar fracPartRecoMean("fracPartRecoMean", "fracPartRecoMean", nGenPartReco/(1.*nGenSignal)); RooRealVar fracPartRecoSigma("fracPartRecoSigma", "fracPartRecoSigma", fracPartReco_const*fracPartRecoMean.getVal()); RooGaussian fracPartRecoConst("fracPartRecoConst", "fracPartRecoConst", fracPartReco, fracPartRecoMean, fracPartRecoSigma); RooRealVar JpsiLeakMean("JpsiLeakMean", "JpsiLeakMean", nGenJpsiLeak); RooRealVar JpsiLeakSigma("JpsiLeakSigma", "JpsiLeakSigma", nGenJpsiLeak*fractionalErrorJpsiLeak->getVal()); RooGaussian JpsiLeakConst("JpsiLeakConst", "JpsiLeakConst", nJpsiLeak, JpsiLeakMean, JpsiLeakSigma); //**************** fit RooAbsReal::defaultIntegratorConfig()->setEpsAbs(1e-8) ; RooAbsReal::defaultIntegratorConfig()->setEpsRel(1e-8) ; initiateParams(nGenSignalZeroGamma, nGenSignalOneGamma, nGenSignalTwoGamma, nKemu, nSignal, nPartReco, nComb, fracZero, fracOne, nJpsiLeak, constPartReco, fracPartRecoSigma, *l1Kee, *l2Kee, *l3Kee, *l4Kee, *l5Kee, l1Kemu, l2Kemu, l3Kemu, l4Kemu, l5Kemu, *l1KeeGen, *l2KeeGen, *l3KeeGen, *l4KeeGen, *l5KeeGen); RooArgSet constraints(fracZeroConst, fracOneConst); if (constPartReco) constraints.add(fracPartRecoConst); if(nGenJpsiLeak>0) constraints.add(JpsiLeakConst); RooAbsReal* nll = simPdf.createNLL(dataGenSimultaneous, Extended(), ExternalConstraints(constraints)); RooMinuit minuit(*nll); minuit.setStrategy(2); int migradRes(1); int hesseRes(4); vector<int> migradResVec; vector<int> hesseResVec; double edm(10); int nrefit(0); RooFitResult* fitRes(0); vector<RooFitResult*> fitResVec; bool hasConverged(false); for(int i(0); (i<15) && !hasConverged ; ++i) { initiateParams(nGenSignalZeroGamma, nGenSignalOneGamma, nGenSignalTwoGamma, nKemu, nSignal, nPartReco, nComb, fracZero, fracOne, nJpsiLeak, constPartReco, fracPartRecoSigma, *l1Kee, *l2Kee, *l3Kee, *l4Kee, *l5Kee, l1Kemu, l2Kemu, l3Kemu, l4Kemu, l5Kemu, *l1KeeGen, *l2KeeGen, *l3KeeGen, *l4KeeGen, *l5KeeGen); cout<<"FITTING: starting with nsignal = "<<nSignal.getValV()<<" refit nbr. "<<i<<endl; //if(fitRes != NULL && fitRes != 0) delete fitRes; migradRes = minuit.migrad(); hesseRes = minuit.hesse(); fitRes = minuit.save(); edm = fitRes->edm(); fitResVec.push_back(fitRes); migradResVec.push_back(migradRes); hesseResVec.push_back(hesseRes); if( migradRes == 0 && hesseRes == 0 && edm < 1e-3 ) hasConverged = true; ++nrefit; cout<<"Fitting nbr "<<i<<" done. Hesse: "<<hesseRes<<" migrad: "<<migradRes<<" edm: "<<edm<<" minNll: "<<fitRes->minNll()<<endl; } if(!hasConverged) { double minNll(1e20); int minIndex(-1); for(unsigned int i(0); i<fitResVec.size(); ++i) { if( fitResVec.at(i)->minNll() < minNll) { minIndex = i; minNll = fitResVec[i]->minNll(); } } migradRes = migradResVec.at(minIndex); hesseRes = hesseResVec.at(minIndex); cout<<"Fit not converged, choose fit "<<minIndex<<". Hesse: "<<hesseRes<<" migrad: "<<migradRes<<" edm: "<<edm<<" minNll: "<<fitRes->minNll()<<endl; } fillTreeResult(t, fitRes, update, migradRes, hesseRes, hasConverged); for(unsigned int i(0); i<fitResVec.size(); ++i) delete fitResVec.at(i); //totPdf.fitTo(*dataGenTot, Extended(), Save(), Warnings(false)); //*************** output fit status int w(12); out<<setw(w)<<migradRes<<setw(w)<<hesseRes<<setw(w)<<edm<<setw(w)<<nrefit<<endl; if(wantplot) plot_fit_result(plotsfile, totPdf, *dataGenTot); if(wantplot) plot_kemu_fit_result(plotsfile, totKemuPdf, *dataGenKemu); fw.Close(); //delete and return delete nll; delete workspace; delete workspaceGen; delete combPDF; delete KemuPDF; }
void FitterUtils::fit(bool wantplot, bool constPartReco, double fracPartReco_const, ofstream& out, TTree* t, bool update, string plotsfile) { //***************Get the PDFs from the workspace TFile fw(workspacename.c_str()); RooWorkspace* workspace = (RooWorkspace*)fw.Get("workspace"); RooRealVar *B_plus_M = workspace->var("B_plus_M"); RooRealVar *misPT = workspace->var("misPT"); RooRealVar *T = workspace->var("T"); RooRealVar *n = workspace->var("n"); RooRealVar *expoConst = workspace->var("expoConst"); RooRealVar *trueExp = workspace->var("trueExp"); RooRealVar *fractionalErrorJpsiLeak = workspace->var("fractionalErrorJpsiLeak"); cout<<"VALUE OF T IN FIT: "<<T->getVal()<<" +- "<<T->getError()<<endl; cout<<"VALUE OF n IN FIT: "<<n->getVal()<<" +- "<<n->getError()<<endl; RooHistPdf *histPdfSignalZeroGamma = (RooHistPdf *) workspace->pdf("histPdfSignalZeroGamma"); RooHistPdf *histPdfSignalOneGamma = (RooHistPdf *) workspace->pdf("histPdfSignalOneGamma"); RooHistPdf *histPdfSignalTwoGamma = (RooHistPdf *) workspace->pdf("histPdfSignalTwoGamma"); RooHistPdf *histPdfPartReco = (RooHistPdf *) workspace->pdf("histPdfPartReco"); RooHistPdf *histPdfJpsiLeak(0); if(nGenJpsiLeak>0) histPdfJpsiLeak = (RooHistPdf *) workspace->pdf("histPdfJpsiLeak"); RooAbsPdf *combPDF; if (fit2D) { combPDF = new RooPTMVis("combPDF", "combPDF", *misPT, *B_plus_M, *T, *n, *expoConst); } else { combPDF = new RooExponential("combPDF", "combPDF", *B_plus_M, *expoConst); } expoConst->setVal(trueExp->getVal()); RooWorkspace* workspaceGen = (RooWorkspace*)fw.Get("workspaceGen"); RooDataSet* dataGenSignalZeroGamma = (RooDataSet*)workspaceGen->data("dataGenSignalZeroGamma"); RooDataSet* dataGenSignalOneGamma = (RooDataSet*)workspaceGen->data("dataGenSignalOneGamma"); RooDataSet* dataGenSignalTwoGamma = (RooDataSet*)workspaceGen->data("dataGenSignalTwoGamma"); RooDataSet* dataGenPartReco = (RooDataSet*)workspaceGen->data("dataGenPartReco"); RooDataSet* dataGenComb = (RooDataSet*)workspaceGen->data("dataGenComb"); RooDataSet* dataGenJpsiLeak(0); if(nGenJpsiLeak>0) dataGenJpsiLeak = (RooDataSet*)workspaceGen->data("dataGenJpsiLeak"); if(wantplot) { //**************Must get the datasets RooDataSet* dataSetSignalZeroGamma = (RooDataSet*)workspace->data("dataSetSignalZeroGamma"); RooDataSet* dataSetSignalOneGamma = (RooDataSet*)workspace->data("dataSetSignalOneGamma"); RooDataSet* dataSetSignalTwoGamma = (RooDataSet*)workspace->data("dataSetSignalTwoGamma"); RooDataSet* dataSetPartReco = (RooDataSet*)workspace->data("dataSetPartReco"); RooDataSet* dataSetComb = (RooDataSet*)workspace->data("dataSetComb"); RooDataSet* dataSetJpsiLeak = (RooDataSet*)workspace->data("dataSetJpsiLeak"); //**************Plot all the different components cout<<"dataGenSignalZeroGamma: "<<dataGenSignalZeroGamma<<endl; PlotShape(*dataSetSignalZeroGamma, *dataGenSignalZeroGamma, *histPdfSignalZeroGamma, plotsfile, "cSignalZeroGamma", *B_plus_M, *misPT); PlotShape(*dataSetSignalOneGamma, *dataGenSignalOneGamma, *histPdfSignalOneGamma, plotsfile, "cSignalOneGamma", *B_plus_M, *misPT); PlotShape(*dataSetSignalTwoGamma, *dataGenSignalTwoGamma, *histPdfSignalTwoGamma, plotsfile, "cSignalTwoGamma", *B_plus_M, *misPT); PlotShape(*dataSetPartReco, *dataGenPartReco, *histPdfPartReco, plotsfile, "cPartReco", *B_plus_M, *misPT); PlotShape(*dataSetComb, *dataGenComb, *combPDF, plotsfile, "cComb", *B_plus_M, *misPT); if(nGenJpsiLeak>1) PlotShape(*dataSetJpsiLeak, *dataGenJpsiLeak, *histPdfJpsiLeak, plotsfile, "cJpsiLeak", *B_plus_M, *misPT); } //***************Merge datasets RooDataSet* dataGenTot(dataGenPartReco); dataGenTot->append(*dataGenSignalZeroGamma); dataGenTot->append(*dataGenSignalOneGamma); dataGenTot->append(*dataGenSignalTwoGamma); dataGenTot->append(*dataGenComb); if(nGenJpsiLeak>0) dataGenTot->append(*dataGenJpsiLeak); //**************Prepare fitting function RooRealVar nSignal("nSignal", "#signal events", 1.*nGenSignal, nGenSignal-7*sqrt(nGenSignal), nGenSignal+7*sqrt(nGenSignal)); RooRealVar nPartReco("nPartReco", "#nPartReco", 1.*nGenPartReco, nGenPartReco-7*sqrt(nGenPartReco), nGenPartReco+7*sqrt(nGenPartReco)); RooRealVar nComb("nComb", "#nComb", 1.*nGenComb, nGenComb-7*sqrt(nGenComb), nGenComb+7*sqrt(nGenComb)); RooRealVar nJpsiLeak("nJpsiLeak", "#nJpsiLeak", 1.*nGenJpsiLeak, nGenJpsiLeak-7*sqrt(nGenJpsiLeak), nGenJpsiLeak+7*sqrt(nGenJpsiLeak)); RooRealVar fracZero("fracZero", "fracZero",0.5,0,1); RooRealVar fracOne("fracOne", "fracOne",0.5, 0,1); RooFormulaVar fracPartReco("fracPartReco", "nPartReco/nSignal", RooArgList(nPartReco,nSignal)); RooFormulaVar fracOneRec("fracOneRec", "(1-fracZero)*fracOne", RooArgList(fracZero, fracOne)); RooAddPdf histPdfSignal("histPdfSignal", "histPdfSignal", RooArgList(*histPdfSignalZeroGamma, *histPdfSignalOneGamma, *histPdfSignalTwoGamma), RooArgList(fracZero, fracOneRec)); RooArgList pdfList(histPdfSignal, *histPdfPartReco, *combPDF); RooArgList yieldList(nSignal, nPartReco, nComb); if(nGenJpsiLeak>0) { pdfList.add(*histPdfJpsiLeak); yieldList.add(nJpsiLeak); } RooAddPdf totPdf("totPdf", "totPdf", pdfList, yieldList); //**************** Constrain the fraction of zero and one photon int nGenSignalZeroGamma(floor(nGenFracZeroGamma*nGenSignal)); int nGenSignalOneGamma(floor(nGenFracOneGamma*nGenSignal)); int nGenSignalTwoGamma(floor(nGenSignal-nGenSignalZeroGamma-nGenSignalOneGamma)); RooRealVar fracZeroConstMean("fracZeroConstMean", "fracZeroConstMean", nGenSignalZeroGamma*1./nGenSignal); RooRealVar fracZeroConstSigma("fracZeroConstSigma", "fracZeroConstSigma", sqrt(nGenSignalZeroGamma)/nGenSignal); RooGaussian fracZeroConst("fracZeroConst", "fracZeroConst", fracZero, fracZeroConstMean, fracZeroConstSigma); RooRealVar fracOneConstMean("fracOneConstMean", "fracOneConstMean", nGenSignalOneGamma*1./nGenSignal/(1-fracZeroConstMean.getVal())); RooRealVar fracOneConstSigma("fracOneConstSigma", "fracOneConstSigma", sqrt(nGenSignalOneGamma)/nGenSignal/(1-fracZeroConstMean.getVal())); RooGaussian fracOneConst("fracOneConst", "fracOneConst", fracOne, fracOneConstMean, fracOneConstSigma); RooRealVar fracPartRecoMean("fracPartRecoMean", "fracPartRecoMean", nGenPartReco/(1.*nGenSignal)); RooRealVar fracPartRecoSigma("fracPartRecoSigma", "fracPartRecoSigma", fracPartReco_const*fracPartRecoMean.getVal()); RooGaussian fracPartRecoConst("fracPartRecoConst", "fracPartRecoConst", fracPartReco, fracPartRecoMean, fracPartRecoSigma); RooRealVar JpsiLeakMean("JpsiLeakMean", "JpsiLeakMean", nGenJpsiLeak); RooRealVar JpsiLeakSigma("JpsiLeakSigma", "JpsiLeakSigma", nGenJpsiLeak*fractionalErrorJpsiLeak->getVal()); RooGaussian JpsiLeakConst("JpsiLeakConst", "JpsiLeakConst", nJpsiLeak, JpsiLeakMean, JpsiLeakSigma); //Extra TEST CONSTRAINT //RooRealVar combConstMean("combConstMean", "combConstMean", nGenComb); //RooRealVar combConstSigma("combConstSigma", "combConstSigma", 7.7); //RooGaussian combConst("combConst", "combConst", nComb, combConstMean, combConstSigma); //**************** fit RooAbsReal::defaultIntegratorConfig()->setEpsAbs(1e-8) ; RooAbsReal::defaultIntegratorConfig()->setEpsRel(1e-8) ; RooArgSet *par_set = totPdf.getParameters(dataGenTot); initiateParams(nGenSignalZeroGamma, nGenSignalOneGamma, nGenSignalTwoGamma, *trueExp, nSignal, nPartReco, nComb, fracZero, fracOne, *expoConst, nJpsiLeak, constPartReco, fracPartRecoSigma); RooArgSet constraints(fracZeroConst, fracOneConst); if (constPartReco) constraints.add(fracPartRecoConst); if(nGenJpsiLeak>0) constraints.add(JpsiLeakConst); RooAbsReal* nll = totPdf.createNLL(*dataGenTot, Extended(), ExternalConstraints(constraints)); RooMinuit minuit(*nll); minuit.setStrategy(2); int migradRes(1); int hesseRes(4); vector<int> migradResVec; vector<int> hesseResVec; double edm(10); int nrefit(0); RooFitResult* fitRes(0); vector<RooFitResult*> fitResVec; bool hasConverged(false); for(int i(0); (i<10) && !hasConverged ; ++i) { initiateParams(nGenSignalZeroGamma, nGenSignalOneGamma, nGenSignalTwoGamma, *trueExp, nSignal, nPartReco, nComb, fracZero, fracOne, *expoConst, nJpsiLeak, constPartReco, fracPartRecoSigma); cout<<"FITTING: starting with nsignal = "<<nSignal.getValV()<<" refit nbr. "<<i<<endl; //if(fitRes != NULL && fitRes != 0) delete fitRes; migradRes = minuit.migrad(); hesseRes = minuit.hesse(); fitRes = minuit.save(); edm = fitRes->edm(); fitResVec.push_back(fitRes); migradResVec.push_back(migradRes); hesseResVec.push_back(hesseRes); if( migradRes == 0 && hesseRes == 0 && edm < 1e-4 ) hasConverged = true; ++nrefit; cout<<"Fitting nbr "<<i<<" done. Hesse: "<<hesseRes<<" migrad: "<<migradRes<<" edm: "<<edm<<" minNll: "<<fitRes->minNll()<<endl; } if(!hasConverged) { double minNll(1e20); int minIndex(-1); for(unsigned int i(0); i<fitResVec.size(); ++i) { if( fitResVec.at(i)->minNll() < minNll) { minIndex = i; minNll = fitResVec[i]->minNll(); } } migradRes = migradResVec.at(minIndex); hesseRes = hesseResVec.at(minIndex); cout<<"Fit not converged, choose fit "<<minIndex<<". Hesse: "<<hesseRes<<" migrad: "<<migradRes<<" edm: "<<edm<<" minNll: "<<fitRes->minNll()<<endl; } fillTreeResult(t, fitRes, update, migradRes, hesseRes, hasConverged); for(unsigned int i(0); i<fitResVec.size(); ++i) delete fitResVec.at(i); //totPdf.fitTo(*dataGenTot, Extended(), Save(), Warnings(false)); //*************** output fit status int w(12); out<<setw(w)<<migradRes<<setw(w)<<hesseRes<<setw(w)<<edm<<setw(w)<<nrefit<<endl; if(wantplot) plot_fit_result(plotsfile, totPdf, *dataGenTot); fw.Close(); //delete and return delete nll; delete par_set; delete workspace; delete workspaceGen; delete combPDF; }
Double_t TT_surface::Use_Minuit(Int_t factor) { Int_t problems=0; for (Int_t i_w=0;i_w<f_N_w;i_w++) { Double_t w_min=f_w_min+i_w*(f_w_max-f_w_min)/f_N_w; Double_t w_max=f_w_min+(i_w+1)*(f_w_max-f_w_min)/f_N_w; Double_t ws=(i_w) *(f_w_max-f_w_min)/f_N_w + f_w_min; Double_t p_lep=sqrt(pow(f_Enu-ws,2)-pow(f_params->f_m_lep,2)); Double_t ws_qbold_min=f_Enu-p_lep; Double_t ws_qbold_max=f_Enu+p_lep; for (Int_t i_qbold=0;i_qbold<f_N_qbold;i_qbold++) { for (Int_t i_cth_p=0;i_cth_p<f_N_cth_p;i_cth_p++) { for (Int_t i_phi_p=0;i_phi_p<f_N_phi_p;i_phi_p++) { Double_t qbold_min=ws_qbold_min+ i_qbold *(ws_qbold_max-ws_qbold_min)/f_N_qbold; Double_t qbold_max=ws_qbold_min+(i_qbold+1)*(ws_qbold_max-ws_qbold_min)/f_N_qbold; Double_t cth_p_min=f_cth_p_min+ i_cth_p *(f_cth_p_max-f_cth_p_min)/f_N_cth_p; Double_t cth_p_max=f_cth_p_min+(i_cth_p+1)*(f_cth_p_max-f_cth_p_min)/f_N_cth_p; Double_t phi_p_min=f_phi_p_min+ i_phi_p *(f_phi_p_max-f_phi_p_min)/f_N_phi_p; Double_t phi_p_max=f_phi_p_min+(i_phi_p+1)*(f_phi_p_max-f_phi_p_min)/f_N_phi_p; for (Int_t trial=0;trial<factor;trial++) { //static? Double_t vstart[4]; Double_t step[4]; Double_t lower[4]; Double_t upper[4]; vstart[0]=0.0922963; vstart[1]=0.3128; vstart[2]=0.470622; vstart[3]=0.715178; //vstart[0]=f_rand.Uniform(w_min,w_max); //vstart[1]=f_rand.Uniform(qbold_min,qbold_max); //vstart[2]=f_rand.Uniform(cth_p_min,cth_p_max); //vstart[3]=f_rand.Uniform(phi_p_min,phi_p_max); lower[0]=w_min; upper[0]=w_max; lower[1]=qbold_min; upper[1]=qbold_max; lower[2]=cth_p_min; upper[2]=cth_p_max; lower[3]=phi_p_min; upper[3]=phi_p_max; //vstart[0]=0.5; //vstart[1]=0.5; //vstart[2]=0.5; //vstart[3]=0.5; // //lower[0]=0.0; //upper[0]=1.0; //lower[1]=0.0; //upper[1]=1.0; //lower[2]=0.0; //upper[2]=1.0; //lower[3]=0.0; //upper[3]=1.0; for (Int_t iStep=0;iStep<4;iStep++) { step[iStep]=(upper[iStep]-lower[iStep])/2.0; //printf("step[%d]=%8.6g\n",iStep,step[iStep]); } TMinuit minuit(4); minuit.SetFCN(Minuit_FCN); Double_t arglist[10]; Int_t ierflg = 0; arglist[0]=-1; minuit.mnexcm("SET PRI",arglist,1,ierflg); arglist[0] = 1.0; minuit.mnexcm("SET ERR", arglist ,1,ierflg); minuit.mnparm(0, "w", vstart[0],step[0],lower[0],upper[0],ierflg); minuit.mnparm(1, "q_bold", vstart[1],step[1],lower[1],upper[1],ierflg); minuit.mnparm(2, "cth_p", vstart[2],step[2],lower[2],upper[2],ierflg); minuit.mnparm(3, "phi_p", vstart[3],step[3],lower[3],upper[3],ierflg); // Now ready for minimization step arglist[0] = 500; arglist[1] = 1.0e-1; minuit.mnexcm("MIGRAD", arglist ,2,ierflg); // Print results Double_t amin,edm,errdef; Int_t nvpar,nparx,icstat; minuit.mnstat(amin,edm,errdef,nvpar,nparx,icstat); minuit.mnprin(3,amin); } } } } } return (problems+0.0)/pow(f_N_var*factor,f_N_dims); }
int main(int argc, char *argv[]){ SetStyle(); bool use_mc(false); char opt(' '); while(( opt=getopt(argc, argv, "m") )!=-1){ switch(opt){ case 'm': use_mc=true; break; default: break; } } {TTree crap;} std::vector<std::string> observed_names(0), signal_names; signal_names.push_back("raw_plots_and_values/SMS-TChiHH_2b2b_2J_mChargino-400_mLSP-1_TuneZ2star_8TeV-madgraph-tauola_Summer12-START53_V19_FSIM-v1_AODSIM_UCSB1871_v71_SyncSkim.root"); if(use_mc){ observed_names.push_back("raw_plots_and_values/BJets_HT-1000ToInf_8TeV-madgraph_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1895_v71_SyncSkim.root");//6 observed_names.push_back("raw_plots_and_values/BJets_HT-250To500_8TeV-madgraph_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1893_v71_SyncSkim.root");//7 observed_names.push_back("raw_plots_and_values/BJets_HT-500To1000_8TeV-madgraph_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1894_v71_SyncSkim.root");//8 observed_names.push_back("raw_plots_and_values/TTJets_FullLeptMGDecays_8TeV-madgraph-tauola_Summer12_DR53X-PU_S10_START53_V7C-v2_AODSIM_UCSB1883_v71_SyncSkim.root");//9 observed_names.push_back("raw_plots_and_values/TTJets_SemiLeptMGDecays_8TeV-madgraph-tauola_Summer12_DR53X-PU_S10_START53_V7C-v1_AODSIM_UCSB1884_v71_SyncSkim.root");//10 observed_names.push_back("raw_plots_and_values/TTJets_HadronicMGDecays_8TeV-madgraph_Summer12_DR53X-PU_S10_START53_V7A_ext-v1_AODSIM_UCSB1880_v71_SyncSkim.root");//11 observed_names.push_back("raw_plots_and_values/TTH_HToBB_M-125_8TeV-pythia6_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1855_v71_SyncSkim.root");//12 observed_names.push_back("raw_plots_and_values/TTWJets_8TeV-madgraph_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1857_v71_SyncSkim.root");//13 observed_names.push_back("raw_plots_and_values/TTZJets_8TeV-madgraph_v2_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1856_v71_SyncSkim.root");//14 observed_names.push_back("raw_plots_and_values/Tbar_s-channel_TuneZ2star_8TeV-powheg-tauola_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1864_v71_SyncSkim.root");//15 observed_names.push_back("raw_plots_and_values/Tbar_t-channel_TuneZ2star_8TeV-powheg-tauola_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1865_v71_SyncSkim.root");//16 observed_names.push_back("raw_plots_and_values/Tbar_tW-channel-DR_TuneZ2star_8TeV-powheg-tauola_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1866_v71_SyncSkim.root");//17 observed_names.push_back("raw_plots_and_values/T_s-channel_TuneZ2star_8TeV-powheg-tauola_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1860_v71_SyncSkim.root");//18 observed_names.push_back("raw_plots_and_values/T_t-channel_TuneZ2star_8TeV-powheg-tauola_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1861_v71_SyncSkim.root");//19 observed_names.push_back("raw_plots_and_values/T_tW-channel-DR_TuneZ2star_8TeV-powheg-tauola_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1862_v71_SyncSkim.root");//20 observed_names.push_back("raw_plots_and_values/W2JetsToLNu_TuneZ2Star_8TeV-madgraph_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1877_v71_SyncSkim.root");//21 observed_names.push_back("raw_plots_and_values/W3JetsToLNu_TuneZ2Star_8TeV-madgraph_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1878_v71_SyncSkim.root");//22 observed_names.push_back("raw_plots_and_values/W4JetsToLNu_TuneZ2Star_8TeV-madgraph_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1879_v71_SyncSkim.root");//23 observed_names.push_back("raw_plots_and_values/ZJetsToNuNu_100_HT_200_TuneZ2Star_8TeV_madgraph_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1887_v71_SyncSkim.root");//24 observed_names.push_back("raw_plots_and_values/ZJetsToNuNu_200_HT_400_TuneZ2Star_8TeV_madgraph_ext_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1889_v71_SyncSkim.root");//25 observed_names.push_back("raw_plots_and_values/ZJetsToNuNu_200_HT_400_TuneZ2Star_8TeV_madgraph_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1888_v71_SyncSkim.root");//26 observed_names.push_back("raw_plots_and_values/ZJetsToNuNu_400_HT_inf_TuneZ2Star_8TeV_madgraph_ext_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1891_v71_SyncSkim.root");//27 observed_names.push_back("raw_plots_and_values/ZJetsToNuNu_400_HT_inf_TuneZ2Star_8TeV_madgraph_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1890_v71_SyncSkim.root");//28 observed_names.push_back("raw_plots_and_values/WH_WToLNu_HToBB_M-125_8TeV-powheg-herwigpp_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1858_v71_SyncSkim.root");//29 observed_names.push_back("raw_plots_and_values/ZH_ZToBB_HToBB_M-125_8TeV-powheg-herwigpp_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1868_v71_SyncSkim.root");//30 observed_names.push_back("raw_plots_and_values/WW_TuneZ2star_8TeV_pythia6_tauola_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1874_v71_SyncSkim.root");//31 observed_names.push_back("raw_plots_and_values/ZZ_TuneZ2star_8TeV_pythia6_tauola_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1876_v71_SyncSkim.root");//32 observed_names.push_back("raw_plots_and_values/WbbJetsToLNu_Massive_TuneZ2star_8TeV-madgraph-pythia6_tauola_Summer12_DR53X-PU_S10_START53_V7A-v1_AODSIM_UCSB1859_v71_SyncSkim.root");//33 }else{ observed_names.push_back("raw_plots_and_values/MET_Run2012A-13Jul2012-v1_AOD_UCSB1852_v71_SyncSkim.root");//0 observed_names.push_back("raw_plots_and_values/MET_Run2012B-13Jul2012-v1_AOD_UCSB1853_v71_SyncSkim.root");//1 observed_names.push_back("raw_plots_and_values/MET_Run2012C-24Aug2012-v1_AOD_UCSB1854_v71_SyncSkim.root");//2 observed_names.push_back("raw_plots_and_values/MET_Run2012C-PromptReco-v2_AOD_UCSB1867_v71_SyncSkim.root");//3 observed_names.push_back("raw_plots_and_values/MET_Run2012D-PromptReco-v1_AOD_UCSB1869_v71_SyncSkim.root");//4 observed_names.push_back("raw_plots_and_values/MET_Run2012D-PromptReco-v1_AOD_UCSB1870_v71_SyncSkim.root");//5 } std::vector<TFile*> observed_files(0), signal_files(0); GetFiles(observed_files, observed_names); GetFiles(signal_files, signal_names); std::vector<TTree*> observed_trees(0), signal_trees(0); GetTrees(observed_trees, observed_files); GetTrees(signal_trees, signal_files); WeightCalculator weightCalc(19399.0); std::vector<double> observed_weights(0), signal_weights; GetWeights(observed_weights, observed_names, weightCalc); GetWeights(signal_weights, signal_names, weightCalc); std::vector<ABCDCount> observed_counts(0), signal_counts; GetCounts(observed_counts, observed_trees, observed_weights); GetCounts(signal_counts, signal_trees, signal_weights); KillTrees(observed_trees); KillTrees(signal_trees); KillFiles(observed_files); KillFiles(signal_files); ABCDCalculator abcd_calculator(observed_counts, signal_counts); const unsigned int num_params(abcd_calculator.GetNumberOfParameters()); TMinuit minuit(num_params); minuit.SetPrintLevel(1); double strategy[1]={2.0}; int useless(0); minuit.mnexcm("SET STR", strategy, 1, useless); MinuitFunctor<ABCDCalculator>::SetFunctor(&abcd_calculator); MinuitFunctor<ABCDCalculator>::SetNumParams(num_params); minuit.SetFCN(MinuitFunctor<ABCDCalculator>::Function); minuit.SetMaxIterations(std::numeric_limits<int32_t>::max()); std::cout << "before" << std::endl; for(unsigned int i(0); i<num_params; ++i){ SetParameter(i, num_params, minuit); } std::cout << "middle" << std::endl; minuit.Migrad(); minuit.Migrad(); minuit.Migrad(); minuit.mnmnos(); minuit.mnmnos(); minuit.mnmnos(); std::cout << "after" << std::endl; }