ROOT logo
// @(#)root/roostats:$Id: HybridCalculator.h 31741 2009-12-09 17:27:53Z moneta $

/*************************************************************************
 * Project: RooStats                                                     *
 * Package: RooFit/RooStats                                              *
 * Authors:                                                              *
 *   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_HybridCalculator
#define ROOSTATS_HybridCalculator

#ifndef ROOSTATS_HypoTestCalculator
#include "RooStats/HypoTestCalculator.h"
#endif

#include <vector>


#ifndef ROOSTATS_HybridResult
#include "RooStats/HybridResult.h"
#endif

#ifndef ROOSTATS_ModelConfig
#include "RooStats/ModelConfig.h"
#endif

class TH1; 

namespace RooStats {

   class HybridResult; 

   class HybridCalculator : public HypoTestCalculator , public TNamed {

   public:


      /// Dummy Constructor with only name 
      explicit HybridCalculator(const char *name = 0);
      
      /// Constructor for HybridCalculator from pdf instances but without a data-set
      HybridCalculator(RooAbsPdf& sb_model,
                       RooAbsPdf& b_model,
                       RooArgList& observables,
                       const RooArgSet* nuisance_parameters = 0,
                       RooAbsPdf* prior_pdf = 0,
                       bool GenerateBinned = false, int testStatistics = 1, int ntoys = 1000 );

      /// Constructor for HybridCalculator using  a data set and pdf instances
      HybridCalculator(RooAbsData& data, 
                       RooAbsPdf& sb_model,
                       RooAbsPdf& b_model,
                       const RooArgSet* nuisance_parameters = 0,
                       RooAbsPdf* prior_pdf = 0,
                       bool GenerateBinned = false, int testStatistics = 1, int ntoys = 1000 );


      /// Constructor passing a ModelConfig for the SBmodel and a ModelConfig for the B Model
      HybridCalculator(RooAbsData& data, 
                       const ModelConfig& sb_model, 
                       const ModelConfig& b_model,
                       bool GenerateBinned = false, int testStatistics = 1, int ntoys = 1000 );


   public: 

      /// Destructor of HybridCalculator
      virtual ~HybridCalculator();

      /// inherited methods from HypoTestCalculator interface
      virtual HybridResult* GetHypoTest() const;

      // inherited setter methods from HypoTestCalculator


      // set the model for the null hypothesis (only B)
      virtual void SetNullModel(const ModelConfig & );
      // set the model for the alternate hypothesis  (S+B)
      virtual void SetAlternateModel(const ModelConfig & );


      // Set a common PDF for both the null and alternate
      virtual void SetCommonPdf(RooAbsPdf & pdf) { fSbModel = &pdf; }
      // Set the PDF for the null (only B)
      virtual void SetNullPdf(RooAbsPdf& pdf) { fBModel = &pdf; }
      // Set the PDF for the alternate hypothesis ( i.e. S+B)
      virtual void SetAlternatePdf(RooAbsPdf& pdf) { fSbModel = &pdf;  }

      // Set the DataSet
      virtual void SetData(RooAbsData& data) { fData = &data; }

      // set parameter values for the null if using a common PDF
      virtual void SetNullParameters(const RooArgSet& ) { } // not needed
      // set parameter values for the alternate if using a common PDF
      virtual void SetAlternateParameters(const RooArgSet&) {}  // not needed

      // additional methods specific for HybridCalculator
      // set a  prior pdf for the nuisance parameters 
      void SetNuisancePdf(RooAbsPdf & prior_pdf) {          
         fPriorPdf = &prior_pdf; 
         fUsePriorPdf = true; // if set by default turn it on
      } 
      
      // set the nuisance parameters to be marginalized
      void SetNuisanceParameters(const RooArgSet & params) { fNuisanceParameters = &params; }

      // set number of toy MC (Default is 1000)
      void SetNumberOfToys(unsigned int ntoys) { fNToys = ntoys; }
      unsigned int GetNumberOfToys() { return fNToys; }

      // return number of toys used
      unsigned int GetNumberOfToys() const { return fNToys; }

      // control use of the pdf for the nuisance parameter and marginalize them
      void UseNuisance(bool on = true) { fUsePriorPdf = on; }

      // control to use bin data generation 
      void SetGenerateBinned(bool on = true) { fGenerateBinned = on; }

      /// set the desired test statistics:
      /// index=1 : 2 * log( L_sb / L_b )  (DEFAULT)
      /// index=2 : number of generated events
      /// index=3 : profiled likelihood ratio
      /// if the index is different to any of those values, the default is used
      void SetTestStatistic(int index);

      HybridResult* Calculate(TH1& data, unsigned int nToys, bool usePriors) const;
      HybridResult* Calculate(RooAbsData& data, unsigned int nToys, bool usePriors) const;
      HybridResult* Calculate(unsigned int nToys, bool usePriors) const;
      void PrintMore(const char* options) const;


   private:

      void RunToys(std::vector<double>& bVals, std::vector<double>& sbVals, unsigned int nToys, bool usePriors) const;

      // check input parameters before performing the calculation
      bool DoCheckInputs() const; 

      unsigned int fTestStatisticsIdx; // Index of the test statistics to use
      unsigned int fNToys;            // number of Toys MC
      RooAbsPdf* fSbModel; // The pdf of the signal+background model
      RooAbsPdf* fBModel; // The pdf of the background model
      mutable RooArgList* fObservables; // Collection of the observables of the model
      const RooArgSet* fNuisanceParameters;   // Collection of the nuisance parameters in the model
      RooAbsPdf* fPriorPdf;   // Prior PDF of the nuisance parameters
      RooAbsData * fData;     // pointer to the data sets 
      bool fGenerateBinned;   //Flag to control binned generation
      bool  fUsePriorPdf;               // use a prior for nuisance parameters  

//       TString fSbModelName;   // name of pdf of the signal+background model
//       TString fBModelName;   // name of pdf of the background model
//       TString fPriorPdfName;   // name of pdf of the background model
//       TString fDataName;      // name of the dataset in the workspace

   protected:
      ClassDef(HybridCalculator,1)  // Hypothesis test calculator using a Bayesian-frequentist hybrid method
   };
}

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