// @(#)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; 

   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