ROOT logo
// @(#)root/roostats:$Id: NeymanConstruction.h 26805 2009-01-13 17:45:57Z cranmer $
// Author: Kyle Cranmer, Lorenzo Moneta, Gregory Schott, Wouter Verkerke
/*************************************************************************
 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOSTATS_NeymanConstruction
#define ROOSTATS_NeymanConstruction


#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif

#ifndef ROOSTATS_IntervalCalculator
#include "RooStats/IntervalCalculator.h"
#endif

#include "RooStats/TestStatSampler.h"
#include "RooStats/ConfidenceBelt.h"

#include "RooAbsData.h"
#include "RooWorkspace.h"
#include "RooAbsPdf.h"
#include "RooArgSet.h"
#include "TList.h"

class RooAbsData; 

namespace RooStats {

   class ConfInterval; 

 class NeymanConstruction : public IntervalCalculator {

   public:
     NeymanConstruction();
     virtual ~NeymanConstruction();
    
      // Main interface to get a ConfInterval (will be a PointSetInterval)
      virtual ConfInterval* GetInterval() const;
      virtual ConfInterval* GetIntervalUsingList() const;

      // Interface extended with I/O support
      virtual ConfInterval* GetInterval(const char* asciiFilePat) const;

      // Actually generate teh sampling distribution
      virtual TList*        GenSamplingDistribution(const char* asciiFilePat = 0) const; 
      virtual ConfInterval* Run(TList *SamplingList) const;

      // in addition to interface we also need:
      // Set the TestStatSampler (eg. ToyMC or FFT, includes choice of TestStatistic)
      void SetTestStatSampler(TestStatSampler& distCreator) {fTestStatSampler = &distCreator;}
      // fLeftSideTailFraction*fSize defines lower edge of acceptance region.
      // Unified limits use 0, central limits use 0.5, 
      // for upper/lower limits it is 0/1 depends on sign of test statistic w.r.t. parameter
      void SetLeftSideTailFraction(Double_t leftSideFraction = 0.) {fLeftSideFraction = leftSideFraction;} 

      // User-defined set of points to test
      void SetParameterPointsToTest(RooAbsData& pointsToTest) {
	fPointsToTest = &pointsToTest;
        fConfBelt = new ConfidenceBelt("ConfBelt",pointsToTest);
      }
      // This class can make regularly spaced scans based on range stored in RooRealVars.
      // Choose number of steps for a rastor scan (common for each dimension)
      //      void SetNumSteps(Int_t);
      // This class can make regularly spaced scans based on range stored in RooRealVars.
      // Choose number of steps for a rastor scan (specific for each dimension)
      //      void SetNumSteps(map<RooAbsArg, Int_t>)

      // Get the size of the test (eg. rate of Type I error)
      virtual Double_t Size() const {return fSize;}
      // Get the Confidence level for the test
      virtual Double_t ConfidenceLevel()  const {return 1.-fSize;}  
      // set a workspace that owns all the necessary components for the analysis
      virtual void SetWorkspace(RooWorkspace& ws) {fWS = &ws;}

      // Set the DataSet, add to the the workspace if not already there
      virtual void SetData(RooAbsData& data) {      
         if (!fWS) {
            fWS = new RooWorkspace();
            fOwnsWorkspace = true; 
         }
         if (! fWS->data(data.GetName()) ) {
	   RooMsgService::instance().setGlobalKillBelow(RooFit::ERROR) ;
            fWS->import(data);
	    RooMsgService::instance().setGlobalKillBelow(RooFit::DEBUG) ;
         }
         SetData(data.GetName());
      }

      // Set the Pdf, add to the the workspace if not already there
      virtual void SetPdf(RooAbsPdf& pdf) { 	
         if (!fWS) 
            fWS = new RooWorkspace();
         if (! fWS->pdf( pdf.GetName() ))
         {
            RooMsgService::instance().setGlobalKillBelow(RooFit::ERROR) ;
            fWS->import(pdf);
            RooMsgService::instance().setGlobalKillBelow(RooFit::DEBUG) ;
         }
         SetPdf(pdf.GetName());
      }

      // specify the name of the dataset in the workspace to be used
      virtual void SetData(const char* name) {fDataName = name;}
      // specify the name of the PDF in the workspace to be used
      virtual void SetPdf(const char* name) {fPdfName = name;}

      // specify the parameters of interest in the interval
      virtual void SetParameters(RooArgSet& set) {fPOI = &set;}
      // specify the nuisance parameters (eg. the rest of the parameters)
      virtual void SetNuisanceParameters(RooArgSet& set) {fNuisParams = &set;}
      // set the size of the test (rate of Type I error) ( Eg. 0.05 for a 95% Confidence Interval)
      virtual void SetTestSize(Double_t size) {fSize = size;}
      // set the confidence level for the interval (eg. 0.95 for a 95% Confidence Interval)
      virtual void SetConfidenceLevel(Double_t cl) {fSize = 1.-cl;}


      ConfidenceBelt* GetConfidenceBelt() {return fConfBelt;}

      void UseAdaptiveSampling(bool flag=true){fAdaptiveSampling=flag;}

      void SaveBeltToFile(bool flag=true){
	fSaveBeltToFile = flag;
	if(flag) fCreateBelt = true;
      }
      void CreateConfBelt(bool flag=true){fCreateBelt = flag;}
      
   private:

      Double_t fSize; // size of the test (eg. specified rate of Type I error)
      RooWorkspace* fWS; // a workspace that owns all the components to be used by the calculator
      Bool_t fOwnsWorkspace; // flag if this object owns its workspace
      const char* fPdfName; // name of  common PDF in workspace
      const char* fDataName; // name of data set in workspace
      RooArgSet* fPOI; // RooArgSet specifying  parameters of interest for interval
      RooArgSet* fNuisParams;// RooArgSet specifying  nuisance parameters for interval
      TestStatSampler* fTestStatSampler;
      RooAbsData* fPointsToTest;
      Double_t fLeftSideFraction;
      ConfidenceBelt* fConfBelt;
      bool fAdaptiveSampling; // controls use of adaptive sampling algorithm
      bool fSaveBeltToFile; // controls use if ConfidenceBelt should be saved to a TFile
      bool fCreateBelt; // controls use if ConfidenceBelt should be saved to a TFile

   protected:
      ClassDef(NeymanConstruction,1)   // Interface for tools setting limits (producing confidence intervals)
   };
}


#endif
 NeymanConstruction.h:1
 NeymanConstruction.h:2
 NeymanConstruction.h:3
 NeymanConstruction.h:4
 NeymanConstruction.h:5
 NeymanConstruction.h:6
 NeymanConstruction.h:7
 NeymanConstruction.h:8
 NeymanConstruction.h:9
 NeymanConstruction.h:10
 NeymanConstruction.h:11
 NeymanConstruction.h:12
 NeymanConstruction.h:13
 NeymanConstruction.h:14
 NeymanConstruction.h:15
 NeymanConstruction.h:16
 NeymanConstruction.h:17
 NeymanConstruction.h:18
 NeymanConstruction.h:19
 NeymanConstruction.h:20
 NeymanConstruction.h:21
 NeymanConstruction.h:22
 NeymanConstruction.h:23
 NeymanConstruction.h:24
 NeymanConstruction.h:25
 NeymanConstruction.h:26
 NeymanConstruction.h:27
 NeymanConstruction.h:28
 NeymanConstruction.h:29
 NeymanConstruction.h:30
 NeymanConstruction.h:31
 NeymanConstruction.h:32
 NeymanConstruction.h:33
 NeymanConstruction.h:34
 NeymanConstruction.h:35
 NeymanConstruction.h:36
 NeymanConstruction.h:37
 NeymanConstruction.h:38
 NeymanConstruction.h:39
 NeymanConstruction.h:40
 NeymanConstruction.h:41
 NeymanConstruction.h:42
 NeymanConstruction.h:43
 NeymanConstruction.h:44
 NeymanConstruction.h:45
 NeymanConstruction.h:46
 NeymanConstruction.h:47
 NeymanConstruction.h:48
 NeymanConstruction.h:49
 NeymanConstruction.h:50
 NeymanConstruction.h:51
 NeymanConstruction.h:52
 NeymanConstruction.h:53
 NeymanConstruction.h:54
 NeymanConstruction.h:55
 NeymanConstruction.h:56
 NeymanConstruction.h:57
 NeymanConstruction.h:58
 NeymanConstruction.h:59
 NeymanConstruction.h:60
 NeymanConstruction.h:61
 NeymanConstruction.h:62
 NeymanConstruction.h:63
 NeymanConstruction.h:64
 NeymanConstruction.h:65
 NeymanConstruction.h:66
 NeymanConstruction.h:67
 NeymanConstruction.h:68
 NeymanConstruction.h:69
 NeymanConstruction.h:70
 NeymanConstruction.h:71
 NeymanConstruction.h:72
 NeymanConstruction.h:73
 NeymanConstruction.h:74
 NeymanConstruction.h:75
 NeymanConstruction.h:76
 NeymanConstruction.h:77
 NeymanConstruction.h:78
 NeymanConstruction.h:79
 NeymanConstruction.h:80
 NeymanConstruction.h:81
 NeymanConstruction.h:82
 NeymanConstruction.h:83
 NeymanConstruction.h:84
 NeymanConstruction.h:85
 NeymanConstruction.h:86
 NeymanConstruction.h:87
 NeymanConstruction.h:88
 NeymanConstruction.h:89
 NeymanConstruction.h:90
 NeymanConstruction.h:91
 NeymanConstruction.h:92
 NeymanConstruction.h:93
 NeymanConstruction.h:94
 NeymanConstruction.h:95
 NeymanConstruction.h:96
 NeymanConstruction.h:97
 NeymanConstruction.h:98
 NeymanConstruction.h:99
 NeymanConstruction.h:100
 NeymanConstruction.h:101
 NeymanConstruction.h:102
 NeymanConstruction.h:103
 NeymanConstruction.h:104
 NeymanConstruction.h:105
 NeymanConstruction.h:106
 NeymanConstruction.h:107
 NeymanConstruction.h:108
 NeymanConstruction.h:109
 NeymanConstruction.h:110
 NeymanConstruction.h:111
 NeymanConstruction.h:112
 NeymanConstruction.h:113
 NeymanConstruction.h:114
 NeymanConstruction.h:115
 NeymanConstruction.h:116
 NeymanConstruction.h:117
 NeymanConstruction.h:118
 NeymanConstruction.h:119
 NeymanConstruction.h:120
 NeymanConstruction.h:121
 NeymanConstruction.h:122
 NeymanConstruction.h:123
 NeymanConstruction.h:124
 NeymanConstruction.h:125
 NeymanConstruction.h:126
 NeymanConstruction.h:127
 NeymanConstruction.h:128
 NeymanConstruction.h:129
 NeymanConstruction.h:130
 NeymanConstruction.h:131
 NeymanConstruction.h:132
 NeymanConstruction.h:133
 NeymanConstruction.h:134
 NeymanConstruction.h:135
 NeymanConstruction.h:136
 NeymanConstruction.h:137
 NeymanConstruction.h:138
 NeymanConstruction.h:139
 NeymanConstruction.h:140
 NeymanConstruction.h:141
 NeymanConstruction.h:142
 NeymanConstruction.h:143
 NeymanConstruction.h:144
 NeymanConstruction.h:145
 NeymanConstruction.h:146
 NeymanConstruction.h:147
 NeymanConstruction.h:148
 NeymanConstruction.h:149
 NeymanConstruction.h:150
 NeymanConstruction.h:151
 NeymanConstruction.h:152
 NeymanConstruction.h:153
 NeymanConstruction.h:154
 NeymanConstruction.h:155
 NeymanConstruction.h:156
 NeymanConstruction.h:157