StandardFrequentistDiscovery.C: StandardFrequentistDiscovery
// StandardFrequentistDiscovery
/*
StandardFrequentistDiscovery
Author: Sven Kreiss, Kyle Cranmer
date: May 2012
This is a standard demo that can be used with any ROOT file
prepared in the standard way. You specify:
- name for input ROOT file
- name of workspace inside ROOT file that holds model and data
- name of ModelConfig that specifies details for calculator tools
- name of dataset
With default parameters the macro will attempt to run the
standard hist2workspace example and read the ROOT file
that it produces.
*/
#include "TFile.h"
#include "TROOT.h"
#include "TH1F.h"
#include "TF1.h"
#include "TCanvas.h"
#include "TStopwatch.h"
#include "RooWorkspace.h"
#include "RooAbsData.h"
#include "RooRandom.h"
#include "RooRealSumPdf.h"
#include "RooNumIntConfig.h"
#include "RooStats/ModelConfig.h"
#include "RooStats/ToyMCImportanceSampler.h"
#include "RooStats/HypoTestResult.h"
#include "RooStats/HypoTestPlot.h"
#include "RooStats/SamplingDistribution.h"
#include "RooStats/ProfileLikelihoodTestStat.h"
#include "RooStats/SimpleLikelihoodRatioTestStat.h"
#include "RooStats/ProfileLikelihoodCalculator.h"
#include "RooStats/LikelihoodInterval.h"
#include "RooStats/LikelihoodIntervalPlot.h"
#include "RooStats/FrequentistCalculator.h"
#include "TSystem.h"
#include <vector>
using namespace RooFit;
using namespace RooStats;
double StandardFrequentistDiscovery(
const char* infile = "",
const char* workspaceName = "channel1",
const char* modelConfigNameSB = "ModelConfig",
const char* dataName = "obsData",
int toys = 1000,
double poiValueForBackground = 0.0,
double poiValueForSignal = 1.0
) {
// The workspace contains the model for s+b. The b model is "autogenerated"
// by copying s+b and setting the one parameter of interest to zero.
// To keep the script simple, multiple parameters of interest or different
// functional forms of the b model are not supported.
// for now, assume there is only one parameter of interest, and these are
// its values:
/////////////////////////////////////////////////////////////
// First part is just to access a user-defined file
// or create the standard example file if it doesn't exist
////////////////////////////////////////////////////////////
const char* filename = "";
if (!strcmp(infile,"")) {
filename = "results/example_channel1_GammaExample_model.root";
bool fileExist = !gSystem->AccessPathName(filename); // note opposite return code
// if file does not exists generate with histfactory
if (!fileExist) {
#ifdef _WIN32
cout << "HistFactory file cannot be generated on Windows - exit" << endl;
return -1;
#endif
// Normally this would be run on the command line
cout <<"will run standard hist2workspace example"<<endl;
gROOT->ProcessLine(".! prepareHistFactory .");
gROOT->ProcessLine(".! hist2workspace config/example.xml");
cout <<"\n\n---------------------"<<endl;
cout <<"Done creating example input"<<endl;
cout <<"---------------------\n\n"<<endl;
}
}
else
filename = infile;
// Try to open the file
TFile *file = TFile::Open(filename);
// if input file was specified byt not found, quit
if(!file ){
cout <<"StandardRooStatsDemoMacro: Input file " << filename << " is not found" << endl;
return -1;
}
/////////////////////////////////////////////////////////////
// Tutorial starts here
////////////////////////////////////////////////////////////
TStopwatch *mn_t = new TStopwatch;
mn_t->Start();
// get the workspace out of the file
RooWorkspace* w = (RooWorkspace*) file->Get(workspaceName);
if (!w) {
cout << "workspace not found" << endl;
return -1.0;
}
// get the modelConfig out of the file
ModelConfig* mc = (ModelConfig*) w->obj(modelConfigNameSB);
// get the data out of the file
RooAbsData* data = w->data(dataName);
// make sure ingredients are found
if (!data || !mc) {
w->Print();
cout << "data or ModelConfig was not found" << endl;
return -1.0;
}
RooRealVar* firstPOI = (RooRealVar*) mc->GetParametersOfInterest()->first();
firstPOI->setVal(poiValueForSignal);
mc->SetSnapshot(*mc->GetParametersOfInterest());
// create null model
ModelConfig *mcNull = mc->Clone("ModelConfigNull");
firstPOI->setVal(poiValueForBackground);
mcNull->SetSnapshot(*(RooArgSet*)mcNull->GetParametersOfInterest()->snapshot());
// ----------------------------------------------------
// Configure a ProfileLikelihoodTestStat and a SimpleLikelihoodRatioTestStat
// to use simultaneously with ToyMCSampler
ProfileLikelihoodTestStat* plts = new ProfileLikelihoodTestStat(*mc->GetPdf());
plts->SetOneSidedDiscovery(true);
plts->SetVarName( "q_{0}/2" );
// ----------------------------------------------------
// configure the ToyMCImportanceSampler with two test statistics
ToyMCSampler toymcs(*plts, 50);
// Since this tool needs to throw toy MC the PDF needs to be
// extended or the tool needs to know how many entries in a dataset
// per pseudo experiment.
// In the 'number counting form' where the entries in the dataset
// are counts, and not values of discriminating variables, the
// datasets typically only have one entry and the PDF is not
// extended.
if (!mc->GetPdf()->canBeExtended()) {
if (data->numEntries() == 1) {
toymcs.SetNEventsPerToy(1);
} else cout << "Not sure what to do about this model" << endl;
}
// We can use PROOF to speed things along in parallel
// ProofConfig pc(*w, 2, "user@yourfavoriteproofcluster", false);
ProofConfig pc(*w, 2, "", false);
//toymcs.SetProofConfig(&pc); // enable proof
// instantiate the calculator
FrequentistCalculator freqCalc(*data, *mc, *mcNull, &toymcs);
freqCalc.SetToys( toys,toys ); // null toys, alt toys
// Run the calculator and print result
HypoTestResult* freqCalcResult = freqCalc.GetHypoTest();
freqCalcResult->GetNullDistribution()->SetTitle( "b only" );
freqCalcResult->GetAltDistribution()->SetTitle( "s+b" );
freqCalcResult->Print();
double pvalue = freqCalcResult->NullPValue();
// stop timing
mn_t->Stop();
cout << "total CPU time: " << mn_t->CpuTime() << endl;
cout << "total real time: " << mn_t->RealTime() << endl;
// plot
TCanvas* c1 = new TCanvas();
HypoTestPlot *plot = new HypoTestPlot(*freqCalcResult, 100, -0.49, 9.51 );
plot->SetLogYaxis(true);
// add chi2 to plot
int nPOI = 1;
TF1* f = new TF1("f", TString::Format("1*ROOT::Math::chisquared_pdf(2*x,%d,0)",nPOI), 0,20);
f->SetLineColor( kBlack );
f->SetLineStyle( 7 );
plot->AddTF1( f, TString::Format("#chi^{2}(2x,%d)",nPOI) );
plot->Draw();
c1->SaveAs("standard_discovery_output.pdf");
return pvalue;
}
StandardFrequentistDiscovery.C:1 StandardFrequentistDiscovery.C:2 StandardFrequentistDiscovery.C:3 StandardFrequentistDiscovery.C:4 StandardFrequentistDiscovery.C:5 StandardFrequentistDiscovery.C:6 StandardFrequentistDiscovery.C:7 StandardFrequentistDiscovery.C:8 StandardFrequentistDiscovery.C:9 StandardFrequentistDiscovery.C:10 StandardFrequentistDiscovery.C:11 StandardFrequentistDiscovery.C:12 StandardFrequentistDiscovery.C:13 StandardFrequentistDiscovery.C:14 StandardFrequentistDiscovery.C:15 StandardFrequentistDiscovery.C:16 StandardFrequentistDiscovery.C:17 StandardFrequentistDiscovery.C:18 StandardFrequentistDiscovery.C:19 StandardFrequentistDiscovery.C:20 StandardFrequentistDiscovery.C:21 StandardFrequentistDiscovery.C:22 StandardFrequentistDiscovery.C:23 StandardFrequentistDiscovery.C:24 StandardFrequentistDiscovery.C:25 StandardFrequentistDiscovery.C:26 StandardFrequentistDiscovery.C:27 StandardFrequentistDiscovery.C:28 StandardFrequentistDiscovery.C:29 StandardFrequentistDiscovery.C:30 StandardFrequentistDiscovery.C:31 StandardFrequentistDiscovery.C:32 StandardFrequentistDiscovery.C:33 StandardFrequentistDiscovery.C:34 StandardFrequentistDiscovery.C:35 StandardFrequentistDiscovery.C:36 StandardFrequentistDiscovery.C:37 StandardFrequentistDiscovery.C:38 StandardFrequentistDiscovery.C:39 StandardFrequentistDiscovery.C:40 StandardFrequentistDiscovery.C:41 StandardFrequentistDiscovery.C:42 StandardFrequentistDiscovery.C:43 StandardFrequentistDiscovery.C:44 StandardFrequentistDiscovery.C:45 StandardFrequentistDiscovery.C:46 StandardFrequentistDiscovery.C:47 StandardFrequentistDiscovery.C:48 StandardFrequentistDiscovery.C:49 StandardFrequentistDiscovery.C:50 StandardFrequentistDiscovery.C:51 StandardFrequentistDiscovery.C:52 StandardFrequentistDiscovery.C:53 StandardFrequentistDiscovery.C:54 StandardFrequentistDiscovery.C:55 StandardFrequentistDiscovery.C:56 StandardFrequentistDiscovery.C:57 StandardFrequentistDiscovery.C:58 StandardFrequentistDiscovery.C:59 StandardFrequentistDiscovery.C:60 StandardFrequentistDiscovery.C:61 StandardFrequentistDiscovery.C:62 StandardFrequentistDiscovery.C:63 StandardFrequentistDiscovery.C:64 StandardFrequentistDiscovery.C:65 StandardFrequentistDiscovery.C:66 StandardFrequentistDiscovery.C:67 StandardFrequentistDiscovery.C:68 StandardFrequentistDiscovery.C:69 StandardFrequentistDiscovery.C:70 StandardFrequentistDiscovery.C:71 StandardFrequentistDiscovery.C:72 StandardFrequentistDiscovery.C:73 StandardFrequentistDiscovery.C:74 StandardFrequentistDiscovery.C:75 StandardFrequentistDiscovery.C:76 StandardFrequentistDiscovery.C:77 StandardFrequentistDiscovery.C:78 StandardFrequentistDiscovery.C:79 StandardFrequentistDiscovery.C:80 StandardFrequentistDiscovery.C:81 StandardFrequentistDiscovery.C:82 StandardFrequentistDiscovery.C:83 StandardFrequentistDiscovery.C:84 StandardFrequentistDiscovery.C:85 StandardFrequentistDiscovery.C:86 StandardFrequentistDiscovery.C:87 StandardFrequentistDiscovery.C:88 StandardFrequentistDiscovery.C:89 StandardFrequentistDiscovery.C:90 StandardFrequentistDiscovery.C:91 StandardFrequentistDiscovery.C:92 StandardFrequentistDiscovery.C:93 StandardFrequentistDiscovery.C:94 StandardFrequentistDiscovery.C:95 StandardFrequentistDiscovery.C:96 StandardFrequentistDiscovery.C:97 StandardFrequentistDiscovery.C:98 StandardFrequentistDiscovery.C:99 StandardFrequentistDiscovery.C:100 StandardFrequentistDiscovery.C:101 StandardFrequentistDiscovery.C:102 StandardFrequentistDiscovery.C:103 StandardFrequentistDiscovery.C:104 StandardFrequentistDiscovery.C:105 StandardFrequentistDiscovery.C:106 StandardFrequentistDiscovery.C:107 StandardFrequentistDiscovery.C:108 StandardFrequentistDiscovery.C:109 StandardFrequentistDiscovery.C:110 StandardFrequentistDiscovery.C:111 StandardFrequentistDiscovery.C:112 StandardFrequentistDiscovery.C:113 StandardFrequentistDiscovery.C:114 StandardFrequentistDiscovery.C:115 StandardFrequentistDiscovery.C:116 StandardFrequentistDiscovery.C:117 StandardFrequentistDiscovery.C:118 StandardFrequentistDiscovery.C:119 StandardFrequentistDiscovery.C:120 StandardFrequentistDiscovery.C:121 StandardFrequentistDiscovery.C:122 StandardFrequentistDiscovery.C:123 StandardFrequentistDiscovery.C:124 StandardFrequentistDiscovery.C:125 StandardFrequentistDiscovery.C:126 StandardFrequentistDiscovery.C:127 StandardFrequentistDiscovery.C:128 StandardFrequentistDiscovery.C:129 StandardFrequentistDiscovery.C:130 StandardFrequentistDiscovery.C:131 StandardFrequentistDiscovery.C:132 StandardFrequentistDiscovery.C:133 StandardFrequentistDiscovery.C:134 StandardFrequentistDiscovery.C:135 StandardFrequentistDiscovery.C:136 StandardFrequentistDiscovery.C:137 StandardFrequentistDiscovery.C:138 StandardFrequentistDiscovery.C:139 StandardFrequentistDiscovery.C:140 StandardFrequentistDiscovery.C:141 StandardFrequentistDiscovery.C:142 StandardFrequentistDiscovery.C:143 StandardFrequentistDiscovery.C:144 StandardFrequentistDiscovery.C:145 StandardFrequentistDiscovery.C:146 StandardFrequentistDiscovery.C:147 StandardFrequentistDiscovery.C:148 StandardFrequentistDiscovery.C:149 StandardFrequentistDiscovery.C:150 StandardFrequentistDiscovery.C:151 StandardFrequentistDiscovery.C:152 StandardFrequentistDiscovery.C:153 StandardFrequentistDiscovery.C:154 StandardFrequentistDiscovery.C:155 StandardFrequentistDiscovery.C:156 StandardFrequentistDiscovery.C:157 StandardFrequentistDiscovery.C:158 StandardFrequentistDiscovery.C:159 StandardFrequentistDiscovery.C:160 StandardFrequentistDiscovery.C:161 StandardFrequentistDiscovery.C:162 StandardFrequentistDiscovery.C:163 StandardFrequentistDiscovery.C:164 StandardFrequentistDiscovery.C:165 StandardFrequentistDiscovery.C:166 StandardFrequentistDiscovery.C:167 StandardFrequentistDiscovery.C:168 StandardFrequentistDiscovery.C:169 StandardFrequentistDiscovery.C:170 StandardFrequentistDiscovery.C:171 StandardFrequentistDiscovery.C:172 StandardFrequentistDiscovery.C:173 StandardFrequentistDiscovery.C:174 StandardFrequentistDiscovery.C:175 StandardFrequentistDiscovery.C:176 StandardFrequentistDiscovery.C:177 StandardFrequentistDiscovery.C:178 StandardFrequentistDiscovery.C:179 StandardFrequentistDiscovery.C:180 StandardFrequentistDiscovery.C:181 StandardFrequentistDiscovery.C:182 StandardFrequentistDiscovery.C:183 StandardFrequentistDiscovery.C:184 StandardFrequentistDiscovery.C:185 StandardFrequentistDiscovery.C:186 StandardFrequentistDiscovery.C:187 StandardFrequentistDiscovery.C:188 StandardFrequentistDiscovery.C:189 StandardFrequentistDiscovery.C:190 StandardFrequentistDiscovery.C:191 StandardFrequentistDiscovery.C:192 StandardFrequentistDiscovery.C:193 StandardFrequentistDiscovery.C:194 StandardFrequentistDiscovery.C:195 StandardFrequentistDiscovery.C:196 StandardFrequentistDiscovery.C:197 StandardFrequentistDiscovery.C:198 StandardFrequentistDiscovery.C:199 StandardFrequentistDiscovery.C:200 StandardFrequentistDiscovery.C:201 StandardFrequentistDiscovery.C:202 StandardFrequentistDiscovery.C:203 StandardFrequentistDiscovery.C:204 StandardFrequentistDiscovery.C:205 StandardFrequentistDiscovery.C:206 StandardFrequentistDiscovery.C:207 StandardFrequentistDiscovery.C:208 StandardFrequentistDiscovery.C:209 StandardFrequentistDiscovery.C:210 StandardFrequentistDiscovery.C:211 StandardFrequentistDiscovery.C:212 StandardFrequentistDiscovery.C:213 StandardFrequentistDiscovery.C:214 StandardFrequentistDiscovery.C:215 StandardFrequentistDiscovery.C:216 StandardFrequentistDiscovery.C:217