//____________________________________ void DoHypothesisTest(RooWorkspace* wks){ // Use a RooStats ProfileLikleihoodCalculator to do the hypothesis test. ModelConfig model; model.SetWorkspace(*wks); model.SetPdf("model"); //plc.SetData("data"); ProfileLikelihoodCalculator plc; plc.SetData( *(wks->data("data") )); // here we explicitly set the value of the parameters for the null. // We want no signal contribution, eg. mu = 0 RooRealVar* mu = wks->var("mu"); // RooArgSet* nullParams = new RooArgSet("nullParams"); // nullParams->addClone(*mu); RooArgSet poi(*mu); RooArgSet * nullParams = (RooArgSet*) poi.snapshot(); nullParams->setRealValue("mu",0); //plc.SetNullParameters(*nullParams); plc.SetModel(model); // NOTE: using snapshot will import nullparams // in the WS and merge with existing "mu" // model.SetSnapshot(*nullParams); //use instead setNuisanceParameters plc.SetNullParameters( *nullParams); // We get a HypoTestResult out of the calculator, and we can query it. HypoTestResult* htr = plc.GetHypoTest(); cout << "-------------------------------------------------" << endl; cout << "The p-value for the null is " << htr->NullPValue() << endl; cout << "Corresponding to a signifcance of " << htr->Significance() << endl; cout << "-------------------------------------------------\n\n" << endl; }
std::pair<float,float> ComputeLimitForADataset(float m0, RooDataSet* CurrentDataset, REGION region, REGION NonRegion, TString& modelName, RooWorkspace *ws, const char* tag) { ws->var("m0")->setVal(m0); ws->var("m0")->setConstant(1); m0 = float(ws->var("m0")->getVal()); RooRealVar *mu = ws->var(Concatenate("nSig",GetRegion(region))); RooArgSet *poi = new RooArgSet(*mu); RooArgSet *nullParams = (RooArgSet*) poi->snapshot(); nullParams->setRealValue(Concatenate("nSig",GetRegion(region)), 0); RooStats::ModelConfig *model = new RooStats::ModelConfig(); model->SetWorkspace(*ws); model->SetPdf(*ws->pdf(modelName)); model->SetParametersOfInterest(*mu); model->SetObservables(RooArgSet(*ws->var("inv"))); model->SetSnapshot(*mu); RooStats::ModelConfig *nullModel; nullModel = model->Clone(modelName+"BgOnly"); float oldval = ws->var(Concatenate("nSig",GetRegion(region)))->getVal(); ws->var(Concatenate("nSig",GetRegion(region)))->setVal(0); ws->var(Concatenate("nSig",GetRegion(region)))->setConstant(1); nullModel->SetSnapshot(RooArgSet(*ws->var(Concatenate("nSig",GetRegion(region))))); ws->var(Concatenate("nSig",GetRegion(region)))->setConstant(0); ws->var(Concatenate("nSig",GetRegion(region)))->setVal(oldval); nullModel->SetWorkspace(*ws); nullModel->SetParametersOfInterest(*nullParams); RooAbsData *data = CurrentDataset; float UpperLimit,Signif; ComputeUpperLimit(data,model,UpperLimit,Signif,mu,nullParams,ws,region,tag); delete poi; poi=0; delete model; model=0; return make_pair(UpperLimit,Signif); }
double RunHypoTest(char *smwwFileName, char *ttbarFileName, char *wp3jetsFileName, char *wp4jetsFileName, char *opsFileName, char *outputFileName, double lambda) { TFile *smwwFile = new TFile(smwwFileName); TFile *ttbarFile = new TFile(ttbarFileName); TFile *wp3jetsFile = new TFile(wp3jetsFileName); TFile *wp4jetsFile = new TFile(wp4jetsFileName); TFile *opsFile = new TFile(opsFileName); TFile *outputFile = new TFile(outputFileName, "UPDATE"); TH1F *smww = (TH1F*)smwwFile->Get(WW_MASS_HISTOGRAM_NAME); TH1F *ttbar = (TH1F*)ttbarFile->Get(WW_MASS_HISTOGRAM_NAME); TH1F *wp3jets = (TH1F*)wp3jetsFile->Get(WW_MASS_HISTOGRAM_NAME); TH1F *wp4jets = (TH1F*)wp4jetsFile->Get(WW_MASS_HISTOGRAM_NAME); //Histogram of ww-scattering with effective operator contributions TH1F *ops = (TH1F*)opsFile->Get(WW_MASS_HISTOGRAM_NAME); RooRealVar *mww = new RooRealVar("mww", "M_{WW}", 600, 2500, "GeV"); RooDataHist smData("smData", "smData", RooArgList(*mww), smww); RooDataHist opsData("opsData", "opsData", RooArgList(*mww), ops); RooDataHist ttbarData("ttbarData", "ttbarData", RooArgList(*mww), ttbar); RooDataHist wp3jetsData("wp3jetsData", "wp3jetsData", RooArgList(*mww), wp3jets); RooDataHist wp4jetsData("wp4jetsData", "wp4jetsData", RooArgList(*mww), wp4jets); /* RooAbsPdf *opsModel; if (lambda == 400) { opsModel = SpecialCaseModel(&opsData, mww, (char*)"ops"); } else { opsModel = MakeModel(&opsData, mww, (char*)"ops"); }*/ RooAbsPdf *opsModel = MakeModel(&opsData, mww, (char*)"ops"); //RooPlot *xframe = mww->frame(); //opsData.plotOn(xframe); //opsModel->plotOn(xframe); //printf("Chi-squared for lambda = %f: = %f\n", lambda, xframe->chiSquare("opsModel", "opsData", 3)); RooAbsPdf *smModel = MakeModelNoSignal(&smData, mww, (char*)"sm"); RooAbsPdf *ttbarModel = MakeModelNoSignal(&ttbarData, mww, (char*)"ttbar"); RooAbsPdf *wp3jetsModel = MakeModelNoSignal(&wp3jetsData, mww, (char*)"wp3jets"); RooAbsPdf *wp4jetsModel = MakeModelNoSignal(&wp4jetsData, mww, (char*)"wp4jets"); TCanvas *canvas = new TCanvas(opsFileName); RooPlot *frame = mww->frame(); frame->SetTitle(""); //smData.plotOn(frame, RooFit::LineColor(kBlack), RooFit::Name("smData")); //smModel->plotOn(frame, RooFit::LineColor(kBlue), RooFit::Name("smModel")); //ttbarModel->plotOn(frame, RooFit::LineColor(kRed), RooFit::Name("ttbarModel")); //wp3jetsModel->plotOn(frame, RooFit::LineColor(kYellow), RooFit::Name("wpjetsModel")); opsData.plotOn(frame); opsModel->plotOn(frame, RooFit::LineColor(kBlue), RooFit::Name("opsModel")); //leg->AddEntry(frame->findObject("smModel"), "SM Model", "lep"); //leg->AddEntry(frame->findObject("ttbarModel"), "TTBar Model", "lep"); //leg->AddEntry(frame->findObject("wp3jetsModel"), "WP3Jets Model", "lep"); //leg->AddEntry(frame->findObject("opsModel"), "Effective Operator Model", "lep"); frame->Draw(); canvas->Write(); Double_t ww_x = WW_CROSS_SECTION * smww->GetEntries(); Double_t ttbar_x = TTBAR_CROSS_SECTION * ttbar->GetEntries(); Double_t wp3jets_x = WP3JETS_CROSS_SECTION * wp3jets->GetEntries(); Double_t wp4jets_x = WP4JETS_CROSS_SECTION * wp4jets->GetEntries(); Double_t ttbar_weight = ttbar_x/(ttbar_x + wp3jets_x + wp4jets_x + ww_x); Double_t wp3jets_weight = wp3jets_x/(wp3jets_x + ttbar_x + ww_x); Double_t wp4jets_weight = wp4jets_x/(wp4jets_x + ttbar_x + ww_x); RooRealVar *ttbarWeight = new RooRealVar("ttbarWeight", "ttbarWeight", 0.0, 1.0, ttbar_weight); RooRealVar *wp3jetsWeight = new RooRealVar("wp3jetsWeight", "wp3jetsWeight", 0.0, 1.0, wp3jets_weight); RooRealVar *wp4jetsWeight = new RooRealVar("wp4jetsWeight", "wp4jetsWeight", 0.0, 1.0, wp4jets_weight); ttbarWeight->setConstant(); wp3jetsWeight->setConstant(); wp4jetsWeight->setConstant(); RooRealVar *mu = new RooRealVar("mu", "mu", 0.0, 1.0, ""); RooAddPdf *wwModel = new RooAddPdf("wwModel", "u*effective_ww + (1-u)*SM_WW", RooArgList(*opsModel, *smModel), RooArgList(*mu), kTRUE); RooAddPdf *model = new RooAddPdf("model", "Full model", RooArgList(*ttbarModel, *wp3jetsModel, *wp4jetsModel, *wwModel), RooArgList(*ttbarWeight, *wp3jetsWeight, *wp4jetsWeight), kTRUE); //Generate data under the alternate hypothesis mu->setVal(1.0); int nTestSetEvents = WW_CROSS_SECTION * TOTAL_INTEGRATED_LUMINOSITY; RooAbsData *generatedData = model->generate(*mww, nTestSetEvents); TCanvas *canvas2 = new TCanvas("CombinedModels"); RooPlot *frame2 = mww->frame(); //wwModel->plotOn(frame2, RooFit::LineColor(kRed), RooFit::Name("wwModel")); //generatedData->plotOn(frame2); mu->setVal(0.0); model->plotOn(frame2, RooFit::LineColor(kBlue), RooFit::Name("nullModel")); mu->setVal(1.0); model->plotOn(frame2, RooFit::LineColor(kRed), RooFit::Name("altModel")); TLegend *leg2 = new TLegend(0.65,0.73,0.86,0.87); //leg->AddEntry(frame2->findObject("wwModel"), "SM WW Scattering model with background", // "lep"); leg2->AddEntry(frame2->findObject("nullModel"), "SM + Background", "lep"); leg2->AddEntry(frame2->findObject("altModel"), "Effective Operator + Background", "lep"); frame2->SetTitle(""); frame2->GetXaxis()->SetTitle("M_{WW} (GeV)"); frame2->GetYaxis()->SetTitle(""); frame2->Draw(); leg2->Draw(); canvas2->Write(); outputFile->Close(); RooArgSet poi(*mu); RooArgSet *nullParams = (RooArgSet*) poi.snapshot(); nullParams->setRealValue("mu", 0.0); RooStats::ProfileLikelihoodCalculator plc(*generatedData, *model, poi, 0.05, nullParams); RooStats::HypoTestResult* htr = plc.GetHypoTest(); std::cerr << "P Value = " << htr->NullPValue() << "\n"; return htr->Significance(); }