ROOT logo
// @(#)root/roostats:$Id$
// Author: Kyle Cranmer, Sven Kreiss   23/05/10
/*************************************************************************
 * 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_HybridCalculatorGeneric
#define ROOSTATS_HybridCalculatorGeneric


#ifndef ROOT_Rtypes
#include "Rtypes.h" // necessary for TNamed
#endif

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

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

#ifndef ROOSTATS_TestStatistic
#include "RooStats/TestStatistic.h"
#endif

#ifndef ROOSTATS_TestStatSampler
#include "RooStats/TestStatSampler.h"
#endif

#ifndef ROOSTATS_SamplingDistribution
#include "RooStats/SamplingDistribution.h"
#endif

#ifndef ROOSTATS_HypoTestResult
#include "RooStats/HypoTestResult.h"
#endif

namespace RooStats {

   class HybridCalculatorGeneric: public HypoTestCalculator {

   public:
      HybridCalculatorGeneric(
                        const RooAbsData &data,
                        const ModelConfig &altModel,
                        const ModelConfig &nullModel,
                        TestStatSampler* sampler=0
      );


      ~HybridCalculatorGeneric();


   public:

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

      // set the model for the null hypothesis (only B)
      virtual void SetNullModel(const ModelConfig &nullModel) { fNullModel = &nullModel; }
      const ModelConfig* GetNullModel(void) const { return fNullModel; }
      // set the model for the alternate hypothesis  (S+B)
      virtual void SetAlternateModel(const ModelConfig &altModel) { fAltModel = &altModel; }
      const ModelConfig* GetAlternateModel(void) const { return fAltModel; }
      // Set the DataSet
      virtual void SetData(RooAbsData &data) { fData = &data; }

      // Override the distribution used for marginalizing nuisance parameters that is infered from ModelConfig
      virtual void ForcePriorNuisanceNull(RooAbsPdf& priorNuisance) { fPriorNuisanceNull = &priorNuisance; }
      virtual void ForcePriorNuisanceAlt(RooAbsPdf& priorNuisance) { fPriorNuisanceAlt = &priorNuisance; }

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

   protected:
      // should return zero (to be used later for conditional flow)
      virtual int PreNullHook(double /*obsTestStat*/) const { return 0; }
      virtual int PreAltHook(double /*obsTestStat*/) const { return 0; }

   private:
      void SetupSampler(const ModelConfig& model) const;
      void SetAdaptiveLimits(Double_t obsTestStat, Bool_t forNull) const;
      SamplingDistribution* GenerateSamplingDistribution(
         ModelConfig *thisModel,
         double obsTestStat,
         RooAbsPdf *impDens=NULL,
         const RooArgSet *impSnapshot=NULL
      ) const;

      const ModelConfig *fAltModel;
      const ModelConfig *fNullModel;
      const RooAbsData *fData;
      RooAbsPdf *fPriorNuisanceNull;
      RooAbsPdf *fPriorNuisanceAlt;
      TestStatSampler *fTestStatSampler;
      TestStatSampler *fDefaultSampler;
      TestStatistic *fDefaultTestStat;

   protected:
   ClassDef(HybridCalculatorGeneric,1)
};
}

#endif
 HybridCalculatorGeneric.h:1
 HybridCalculatorGeneric.h:2
 HybridCalculatorGeneric.h:3
 HybridCalculatorGeneric.h:4
 HybridCalculatorGeneric.h:5
 HybridCalculatorGeneric.h:6
 HybridCalculatorGeneric.h:7
 HybridCalculatorGeneric.h:8
 HybridCalculatorGeneric.h:9
 HybridCalculatorGeneric.h:10
 HybridCalculatorGeneric.h:11
 HybridCalculatorGeneric.h:12
 HybridCalculatorGeneric.h:13
 HybridCalculatorGeneric.h:14
 HybridCalculatorGeneric.h:15
 HybridCalculatorGeneric.h:16
 HybridCalculatorGeneric.h:17
 HybridCalculatorGeneric.h:18
 HybridCalculatorGeneric.h:19
 HybridCalculatorGeneric.h:20
 HybridCalculatorGeneric.h:21
 HybridCalculatorGeneric.h:22
 HybridCalculatorGeneric.h:23
 HybridCalculatorGeneric.h:24
 HybridCalculatorGeneric.h:25
 HybridCalculatorGeneric.h:26
 HybridCalculatorGeneric.h:27
 HybridCalculatorGeneric.h:28
 HybridCalculatorGeneric.h:29
 HybridCalculatorGeneric.h:30
 HybridCalculatorGeneric.h:31
 HybridCalculatorGeneric.h:32
 HybridCalculatorGeneric.h:33
 HybridCalculatorGeneric.h:34
 HybridCalculatorGeneric.h:35
 HybridCalculatorGeneric.h:36
 HybridCalculatorGeneric.h:37
 HybridCalculatorGeneric.h:38
 HybridCalculatorGeneric.h:39
 HybridCalculatorGeneric.h:40
 HybridCalculatorGeneric.h:41
 HybridCalculatorGeneric.h:42
 HybridCalculatorGeneric.h:43
 HybridCalculatorGeneric.h:44
 HybridCalculatorGeneric.h:45
 HybridCalculatorGeneric.h:46
 HybridCalculatorGeneric.h:47
 HybridCalculatorGeneric.h:48
 HybridCalculatorGeneric.h:49
 HybridCalculatorGeneric.h:50
 HybridCalculatorGeneric.h:51
 HybridCalculatorGeneric.h:52
 HybridCalculatorGeneric.h:53
 HybridCalculatorGeneric.h:54
 HybridCalculatorGeneric.h:55
 HybridCalculatorGeneric.h:56
 HybridCalculatorGeneric.h:57
 HybridCalculatorGeneric.h:58
 HybridCalculatorGeneric.h:59
 HybridCalculatorGeneric.h:60
 HybridCalculatorGeneric.h:61
 HybridCalculatorGeneric.h:62
 HybridCalculatorGeneric.h:63
 HybridCalculatorGeneric.h:64
 HybridCalculatorGeneric.h:65
 HybridCalculatorGeneric.h:66
 HybridCalculatorGeneric.h:67
 HybridCalculatorGeneric.h:68
 HybridCalculatorGeneric.h:69
 HybridCalculatorGeneric.h:70
 HybridCalculatorGeneric.h:71
 HybridCalculatorGeneric.h:72
 HybridCalculatorGeneric.h:73
 HybridCalculatorGeneric.h:74
 HybridCalculatorGeneric.h:75
 HybridCalculatorGeneric.h:76
 HybridCalculatorGeneric.h:77
 HybridCalculatorGeneric.h:78
 HybridCalculatorGeneric.h:79
 HybridCalculatorGeneric.h:80
 HybridCalculatorGeneric.h:81
 HybridCalculatorGeneric.h:82
 HybridCalculatorGeneric.h:83
 HybridCalculatorGeneric.h:84
 HybridCalculatorGeneric.h:85
 HybridCalculatorGeneric.h:86
 HybridCalculatorGeneric.h:87
 HybridCalculatorGeneric.h:88
 HybridCalculatorGeneric.h:89
 HybridCalculatorGeneric.h:90
 HybridCalculatorGeneric.h:91
 HybridCalculatorGeneric.h:92
 HybridCalculatorGeneric.h:93
 HybridCalculatorGeneric.h:94
 HybridCalculatorGeneric.h:95
 HybridCalculatorGeneric.h:96
 HybridCalculatorGeneric.h:97
 HybridCalculatorGeneric.h:98
 HybridCalculatorGeneric.h:99
 HybridCalculatorGeneric.h:100
 HybridCalculatorGeneric.h:101
 HybridCalculatorGeneric.h:102
 HybridCalculatorGeneric.h:103
 HybridCalculatorGeneric.h:104
 HybridCalculatorGeneric.h:105
 HybridCalculatorGeneric.h:106
 HybridCalculatorGeneric.h:107
 HybridCalculatorGeneric.h:108
 HybridCalculatorGeneric.h:109
 HybridCalculatorGeneric.h:110