void Initialize(const char* infile , const char* workspaceName, const char* modelConfigName, const char* ObsDataName) { // Load workspace, model and data TFile *file = TFile::Open(infile); if (!file) { cout << "The file " << infile << " is not found/created, will stop here." << endl; return; } if(!(RooWorkspace*) file->Get(workspaceName)){ cout <<"workspace not found" << endl; return; } w = (RooWorkspace*) file->Get(workspaceName); mc = (ModelConfig*) w->obj(modelConfigName); data = w->data(ObsDataName); w->SetName("w"); w->SetTitle("w"); // save snapshot before any fit has been done RooSimultaneous* pdf = (RooSimultaneous*) w->pdf("simPdf"); RooArgSet* params = (RooArgSet*) pdf->getParameters(*data) ; if(!w->loadSnapshot("snapshot_paramsVals_initial")) w->saveSnapshot("snapshot_paramsVals_initial",*params); else cout << endl << " Snapshot 'snapshot_paramsVals_initial' already exists in workspace, will not overwrite it" << endl; if(!data || !mc){ w->Print(); cout << "data or ModelConfig was not found" <<endl; return; } }
RooSimultaneous *SignalPDFs(TString url="EventSummaries.root",TString chSelector="") { gStyle->SetOptStat(0); TCanvas *c = new TCanvas("signalpdfs","Signal PDFs"); //the mass points typedef std::pair<TString,Float_t> MassPoint_t; std::vector<MassPoint_t> MassPointCollection; MassPointCollection.push_back( MassPoint_t("TTJets_mass_161v5",161.5) ); MassPointCollection.push_back( MassPoint_t("TTJets_mass_163v5",163.5) ); // MassPointCollection.push_back( MassPoint_t("TTJets_mass_166v5",166.5) ); MassPointCollection.push_back( MassPoint_t("TTJets_mass_169v5",169.5) ); MassPointCollection.push_back( MassPoint_t("TTJets", 172.5) ); MassPointCollection.push_back( MassPoint_t("TTJets_mass_175v5",175.5) ); MassPointCollection.push_back( MassPoint_t("TTJets_mass_178v5",178.5) ); MassPointCollection.push_back( MassPoint_t("TTJets_mass181v5", 181.5) ); MassPointCollection.push_back( MassPoint_t("TTJets_mass184v5", 184.5) ); std::map<std::string,TH1*> hmap; //get pdfs from file RooCategory sample("signal","") ; TFile *f = TFile::Open(url); for(size_t ipt=0; ipt<MassPointCollection.size(); ipt++) { TString sName("m"); sName += (ipt+1); TString tname=MassPointCollection[ipt].first + "/data"; TTree *t = (TTree *) f->Get(tname); if(t==0) continue; t->Draw("evmeasurements[0]>>hmass(80,100,500)","evmeasurements[0]>0" + chSelector); TH1D *h = (TH1D*) gDirectory->Get("hmass"); if(h==0) continue; h = (TH1D *) h->Clone(sName); h->SetDirectory(0); h->GetYaxis()->SetTitle("Events / (5 GeV/c^{2})"); h->GetXaxis()->SetTitle("Mass [GeV/c^{2}]"); h->GetXaxis()->SetTitleOffset(0.8); h->GetYaxis()->SetTitleOffset(0.8); char titbuf[20]; sprintf(titbuf,"m=%3.1lf",MassPointCollection[ipt].second); h->SetTitle(titbuf); sample.defineType(TString(sName)); hmap[sName.Data()] = h; } f->Close(); delete c; // divide the binned data in categories according to the generated top quark mass RooRealVar mass("m","Mass", 100, 500); RooDataHist combData("combData", "combined data",mass, sample, hmap ); //the parameters to fit and the variable RooRealVar g_mean_slope("#mu_{G}(slope)","g_mean_slope",0.01,0.,1.); RooRealVar g_mean_shift("#mu_{G}(intercept)","g_mean_shift",162,100,180); RooRealVar g_sigma_slope("#sigma_{G}(slope)","g_sigma_slope",0.01,0.,1.); RooRealVar g_sigma_shift("#sigma_{G}(intercept)","g_sigma_shift",10,0.,25); RooRealVar l_mean_slope("mpv_{L}(slope)","l_mean_slope",0.,0.,1.);//1,0,10); RooRealVar l_mean_shift("mpv_{L}(intercept)","l_mean_shift",212,150,250); RooRealVar l_sigma_slope("#sigma_{L}(slope)","l_sigma_slope",0.,0.,1.);//1,0,10); RooRealVar l_sigma_shift("#sigma_{L}(intercept)","l_sigma_shift",10,0,25); RooRealVar massfrac_slope("#alpha(slope)","massfrac_slope",0,0,0.01); RooRealVar massfrac_shift("#alpha(intercept)","massfrac_shift",0.38,0.,1.); //build the prototype pdf RooRealVar topmass( "mtop","mtop",100,300); RooFormulaVar g_mean( "g_mean", "(@0-172)*@1+@2", RooArgSet(topmass,g_mean_slope,g_mean_shift)); RooFormulaVar g_sigma( "g_sigma", "(@0-172)*@1+@2", RooArgSet(topmass,g_sigma_slope,g_sigma_shift)); RooGaussian gaus("gaus", "Mass component 1", mass, g_mean, g_sigma); RooFormulaVar l_mean( "l_mean", "(@0-172)*@1+@2", RooArgSet(topmass,l_mean_slope,l_mean_shift)); RooFormulaVar l_sigma( "l_sigma", "(@0-172)*@1+@2", RooArgSet(topmass,l_sigma_slope,l_sigma_shift)); RooLandau lan("lan", "Mass component 2", mass, l_mean, l_sigma); RooFormulaVar massfrac( "#alpha", "(@0-172)*@1+@2", RooArgSet(topmass,massfrac_slope,massfrac_shift)); RooAddPdf massmodel("model","Model",RooArgList(lan,gaus),massfrac); //RooNumConvPdf massmodel("model","Model",topmass,lan,gaus); //now split per categories RooSimPdfBuilder builder(massmodel) ; RooArgSet* config = builder.createProtoBuildConfig() ; config->setStringValue("physModels","model"); // Name of the PDF we are going to work with config->setStringValue("splitCats","signal"); // Category used to differentiate sub-datasets config->setStringValue("model","signal : mtop"); // Prescription to taylor PDF parameters mtop for each subset in signal RooSimultaneous* simPdf = builder.buildPdf(*config,&combData) ; config = simPdf->getParameters(combData); for(size_t ipt=0; ipt<MassPointCollection.size(); ipt++) { TString sName("m"); sName+=(ipt+1); Float_t imass=MassPointCollection[ipt].second; (((RooRealVar &)(*config)["mtop_"+sName])).setRange(imass,imass); (((RooRealVar &)(*config)["mtop_"+sName])).setVal(imass); } //fit to data simPdf->fitTo(combData,Range(100.,400.)); //display for(size_t ipt=0; ipt<MassPointCollection.size(); ipt++) { if(ipt%5==0) { TString name("SignalPDFs_"); name+=ipt; c = new TCanvas(name,name); c->SetBorderSize(0); c->SetFillStyle(0); c->SetFillColor(0); c->SetWindowSize(1750,350); c->Clear(); c->Divide(5,1); } TPad *p = (TPad *)c->cd(ipt%5+1); p->SetGridx(); p->SetGridy(); TString procName("m"); procName += (ipt+1); char buf[100]; sprintf(buf,"m_{t}=%3.1lf GeV/c^{2}",MassPointCollection[ipt].second); RooPlot* frame = mass.frame(Title(buf)); RooDataSet* dataslice = (RooDataSet *)combData.reduce("signal==signal::"+procName); dataslice->plotOn(frame,DataError(RooAbsData::SumW2)); RooCategory newCat(procName,procName); simPdf->plotOn(frame,Slice(newCat),ProjWData(mass,*dataslice)); frame->GetYaxis()->SetTitleOffset(1.0); frame->GetYaxis()->SetTitle("Events"); frame->GetXaxis()->SetTitleOffset(0.8); frame->GetXaxis()->SetTitle("Reconstructed Mass [GeV/c^{2}]"); frame->Draw(); TPaveText *pt = new TPaveText(0.75,0.85,0.97,0.95,"brNDC"); pt->SetBorderSize(0); pt->SetFillColor(0); pt->SetFillStyle(0); char buf2[50]; sprintf(buf2,"%3.1lf GeV/c^{2}",MassPointCollection[ipt].second); pt->AddText(buf2); pt->Draw(); } return simPdf; }