// @(#)root/roostats:$Id$
// 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_FeldmanCousins
#define ROOSTATS_FeldmanCousins


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

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

#include "RooStats/ToyMCSampler.h"
#include "RooStats/ConfidenceBelt.h"
#include "RooStats/PointSetInterval.h"

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

class RooAbsData; 

namespace RooStats {

   class ConfInterval; 

/**

   \ingroup Roostats

The FeldmanCousins class (like the Feldman-Cousins technique) is essentially a specific configuration
 of the more general NeymanConstruction.  It is a concrete implementation of the IntervalCalculator interface that, which uses the NeymanConstruction in a particular way.  As the name suggests, it returns a ConfidenceInterval.  In particular, it produces a RooStats::PointSetInterval, which is a concrete implementation of the ConfInterval interface.  

The Neyman Construction is not a uniquely defined statistical technique, it requires that one specify an ordering rule 
or ordering principle, which is usually incoded by choosing a specific test statistic and limits of integration 
(corresponding to upper/lower/central limits).  As a result, this class must be configured with the corresponding
information before it can produce an interval.  

In the case of the Feldman-Cousins approach, the ordering principle is the likelihood ratio -- motivated
by the Neyman-Pearson lemma.  When nuisance parameters are involved, the profile likelihood ratio is the natural generalization.  One may either choose to perform the construction over the full space of the nuisance parameters, or restrict the nusiance parameters to their conditional MLE (eg. profiled values). 

*/

   
   class FeldmanCousins : public IntervalCalculator {

   public:

     //     FeldmanCousins();

     /// Common constructor
     FeldmanCousins(RooAbsData& data, ModelConfig& model);

     virtual ~FeldmanCousins();
    
      /// Main interface to get a ConfInterval (will be a PointSetInterval)
      virtual PointSetInterval* GetInterval() const;

      /// 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 the DataSet
      virtual void SetData(RooAbsData& /*data*/) {  
	std::cout << "DEPRECATED, set data in constructor" << std::endl;
      }    
      /// Set the Pdf
      virtual void SetPdf(RooAbsPdf& /*pdf*/) { 
	std::cout << "DEPRECATED, use ModelConfig" << std::endl;
      }	

      /// specify the parameters of interest in the interval
      virtual void SetParameters(const RooArgSet& /*set*/) { 
	std::cout << "DEPRECATED, use ModelConfig" << std::endl;
      }

      /// specify the nuisance parameters (eg. the rest of the parameters)
      virtual void SetNuisanceParameters(const RooArgSet& /*set*/) {
	std::cout << "DEPRECATED, use ModelConfig" << std::endl;
      }

      /// User-defined set of points to test
      void SetParameterPointsToTest(RooAbsData& pointsToTest) {
	fPointsToTest = &pointsToTest;
      }

      /// User-defined set of points to test
      void SetPOIPointsToTest(RooAbsData& poiToTest) {
	fPOIToTest = &poiToTest;
      }

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

      virtual void SetModel(const ModelConfig &); 

      RooAbsData* GetPointsToScan() {
	if(!fPointsToTest) CreateParameterPoints();	  
	return fPointsToTest;
      }

      ConfidenceBelt* GetConfidenceBelt() {return fConfBelt;}

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

      void AdditionalNToysFactor(double fact){fAdditionalNToysFactor = fact;}

      void SetNBins(Int_t bins) {fNbins = bins;}

      void FluctuateNumDataEntries(bool flag=true){fFluctuateData = flag;}

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

      /// Returns instance of TestStatSampler. Use to change properties of
      /// TestStatSampler, e.g. GetTestStatSampler.SetTestSize(Double_t size);
      TestStatSampler* GetTestStatSampler() const;

      
   private:

      /// initializes fPointsToTest data member (mutable)
      void CreateParameterPoints() const;

      /// initializes fTestStatSampler data member (mutable)
      void CreateTestStatSampler() const;

      Double_t fSize; // size of the test (eg. specified rate of Type I error)
      ModelConfig &fModel;
      RooAbsData & fData; // data set 

      /*
      RooAbsPdf * fPdf; // common PDF
      RooArgSet fPOI; // RooArgSet specifying  parameters of interest for interval
      RooArgSet fNuisParams;// RooArgSet specifying  nuisance parameters for interval
      RooArgSet fObservables;// RooArgSet specifying  nuisance parameters for interval
      */

      mutable ToyMCSampler* fTestStatSampler; // the test statistic sampler
      mutable RooAbsData* fPointsToTest; // points to perform the construction
      mutable RooAbsData* fPOIToTest; // value of POI points to perform the construction
      mutable ConfidenceBelt* fConfBelt;
      Bool_t fAdaptiveSampling; // controls use of adaptive sampling algorithm
      Double_t fAdditionalNToysFactor; // give user ability to ask for more toys
      Int_t fNbins; // number of samples per variable
      Bool_t fFluctuateData;  // tell ToyMCSampler to fluctuate number of entries in dataset
      Bool_t fDoProfileConstruction; // instead of full construction over nuisance parametrs, do profile
      Bool_t fSaveBeltToFile; // controls use if ConfidenceBelt should be saved to a TFile
      Bool_t fCreateBelt; // controls use if ConfidenceBelt should be saved to a TFile

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


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