ROOT logo
// @(#)root/roostats:$Id: HybridCalculator.cxx 39513 2011-05-31 17:49:43Z moneta $
// 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.             *
 *************************************************************************/

/**
Same purpose as HybridCalculatorOriginal, but different implementation.
*/

#include "RooStats/HybridCalculator.h"
#include "RooStats/ToyMCSampler.h"


ClassImp(RooStats::HybridCalculator)

using namespace RooStats;



int HybridCalculator::CheckHook(void) const {
   if( (fNullModel->GetNuisanceParameters()
        && fNullModel->GetNuisanceParameters()->getSize()>0
        && !fPriorNuisanceNull)
    || (fAltModel->GetNuisanceParameters()
        && fAltModel->GetNuisanceParameters()->getSize()>0
        && !fPriorNuisanceAlt)
   ){
      oocoutE((TObject*)0,InputArguments)  << "Must ForceNuisancePdf, inferring posterior from ModelConfig is not yet implemented" << endl;
      return -1; // error
   }

   if(    (!fNullModel->GetNuisanceParameters() && fPriorNuisanceNull)
       || (!fAltModel->GetNuisanceParameters()  && fPriorNuisanceAlt)
       || (fNullModel->GetNuisanceParameters()  && fNullModel->GetNuisanceParameters()->getSize()==0 && fPriorNuisanceNull)
       || (fAltModel->GetNuisanceParameters()  && fAltModel->GetNuisanceParameters()->getSize()>0   && !fPriorNuisanceAlt)
   ){
      oocoutE((TObject*)0,InputArguments)  << "Nuisance PDF specified, but the pdf doesn't know which parameters are the nuisance parameters.  Must set nuisance parameters in the ModelConfig" << endl;
      return -1; // error
   }

   return 0; // ok
}


int HybridCalculator::PreNullHook(RooArgSet* /*parameterPoint*/, double obsTestStat) const {

   // ****** any TestStatSampler ********

   if(fPriorNuisanceNull) {
      // Setup Priors for ad hoc Hybrid
      fTestStatSampler->SetPriorNuisance(fPriorNuisanceNull);
   } else if(
      fNullModel->GetNuisanceParameters()==NULL ||
      fNullModel->GetNuisanceParameters()->getSize()==0
   ) {
      oocoutI((TObject*)0,InputArguments)
       << "No nuisance parameters specified and no prior forced, reduces "
       << "to simple hypothesis testing with no uncertainty" << endl;
   } else {
      // TODO principled case:
      // must create posterior from Model.PriorPdf and Model.Pdf

      // Note, we do not want to use "prior" for nuisance parameters:
      // fTestStatSampler->SetPriorNuisance(const_cast<RooAbsPdf*>(model.GetPriorPdf()));

      oocoutE((TObject*)0,InputArguments) << "inferring posterior from ModelConfig is not yet implemented" << endl;
   }



   // ***** ToyMCSampler specific *******

   // check whether TestStatSampler is a ToyMCSampler
   ToyMCSampler *toymcs = dynamic_cast<ToyMCSampler*>(GetTestStatSampler());
   if(toymcs) {
      oocoutI((TObject*)0,InputArguments) << "Using a ToyMCSampler. Now configuring for Null." << endl;

      // variable number of toys
      if(fNToysNull) toymcs->SetNToys(fNToysNull);

      // adaptive sampling
      if(fNToysNullTail) {
         oocoutI((TObject*)0,InputArguments) << "Adaptive Sampling" << endl;
         if(GetTestStatSampler()->GetTestStatistic()->PValueIsRightTail()) {
            toymcs->SetToysRightTail(fNToysNullTail, obsTestStat);
         }else{
            toymcs->SetToysLeftTail(fNToysNullTail, obsTestStat);
         }
      }else{
         toymcs->SetToysBothTails(0, 0, obsTestStat); // disable adaptive sampling
      }

      // importance sampling
      if(fNullImportanceDensity) {
         oocoutI((TObject*)0,InputArguments) << "Importance Sampling" << endl;
         toymcs->SetImportanceDensity(fNullImportanceDensity);
         if(fNullImportanceSnapshot) toymcs->SetImportanceSnapshot(*fNullImportanceSnapshot);
      }else{
         toymcs->SetImportanceDensity(NULL);       // disable importance sampling
      }
      GetNullModel()->LoadSnapshot();
   }

   return 0;
}


int HybridCalculator::PreAltHook(RooArgSet* /*parameterPoint*/, double obsTestStat) const {

   // ****** any TestStatSampler ********

   if(fPriorNuisanceAlt){
     // Setup Priors for ad hoc Hybrid
     fTestStatSampler->SetPriorNuisance(fPriorNuisanceAlt);
   } else if (
      fAltModel->GetNuisanceParameters()==NULL ||
      fAltModel->GetNuisanceParameters()->getSize()==0
   ) {
      oocoutI((TObject*)0,InputArguments)
         << "No nuisance parameters specified and no prior forced, reduces "
         << "to simple hypothesis testing with no uncertainty" << endl;
   } else {
      // TODO principled case:
      // must create posterior from Model.PriorPdf and Model.Pdf

      // Note, we do not want to use "prior" for nuisance parameters:
      // fTestStatSampler->SetPriorNuisance(const_cast<RooAbsPdf*>(model.GetPriorPdf()));

      oocoutE((TObject*)0,InputArguments) << "inferring posterior from ModelConfig is not yet implemented" << endl;
   }



   // ***** ToyMCSampler specific *******

   // check whether TestStatSampler is a ToyMCSampler
   ToyMCSampler *toymcs = dynamic_cast<ToyMCSampler*>(GetTestStatSampler());
   if(toymcs) {
      oocoutI((TObject*)0,InputArguments) << "Using a ToyMCSampler. Now configuring for Alt." << endl;

      // variable number of toys
      if(fNToysAlt) toymcs->SetNToys(fNToysAlt);

      // adaptive sampling
      if(fNToysAltTail) {
         oocoutI((TObject*)0,InputArguments) << "Adaptive Sampling" << endl;
         if(GetTestStatSampler()->GetTestStatistic()->PValueIsRightTail()) {
            toymcs->SetToysLeftTail(fNToysAltTail, obsTestStat);
         }else{
            toymcs->SetToysRightTail(fNToysAltTail, obsTestStat);
         }
      }else{
         toymcs->SetToysBothTails(0, 0, obsTestStat); // disable adaptive sampling
      }


      // importance sampling
      if(fAltImportanceDensity) {
         oocoutI((TObject*)0,InputArguments) << "Importance Sampling" << endl;
         toymcs->SetImportanceDensity(fAltImportanceDensity);
         if(fAltImportanceSnapshot) toymcs->SetImportanceSnapshot(*fAltImportanceSnapshot);
      }else{
         toymcs->SetImportanceDensity(NULL);       // disable importance sampling
      }
   }

   return 0;
}




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