ROOT logo

From $ROOTSYS/tutorials/roostats/StandardFrequentistDiscovery.C

// 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