HybridCalculatorGeneric.cxx

Go to the documentation of this file.
00001 // @(#)root/roostats:$Id$
00002 // Author: Kyle Cranmer, Sven Kreiss   23/05/10
00003 /*************************************************************************
00004  * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
00005  * All rights reserved.                                                  *
00006  *                                                                       *
00007  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00008  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00009  *************************************************************************/
00010 
00011 /**
00012 Same purpose as HybridCalculatorOriginal, but different implementation.
00013 
00014 This is the "generic" version that works with any TestStatSampler. The
00015 HybridCalculator derives from this class but explicitly uses the
00016 ToyMCSampler as its TestStatSampler.
00017 */
00018 
00019 #include "RooStats/HybridCalculatorGeneric.h"
00020 #include "RooStats/HybridPlot.h"
00021 
00022 #include "RooStats/ToyMCSampler.h"
00023 #include "RooStats/RatioOfProfiledLikelihoodsTestStat.h"
00024 
00025 #include "RooAddPdf.h"
00026 
00027 
00028 ClassImp(RooStats::HybridCalculatorGeneric)
00029 
00030 using namespace RooStats;
00031 
00032 
00033 //___________________________________
00034 HybridCalculatorGeneric::HybridCalculatorGeneric(
00035                                      const RooAbsData &data,
00036                                      const ModelConfig &altModel,
00037                                      const ModelConfig &nullModel,
00038                                      TestStatSampler *sampler
00039                                      ) :
00040    fAltModel(&altModel),
00041    fNullModel(&nullModel),
00042    fData(&data),
00043    fPriorNuisanceNull(0),
00044    fPriorNuisanceAlt(0),
00045    fTestStatSampler(sampler),
00046    fDefaultSampler(0),
00047    fDefaultTestStat(0)
00048 {
00049    // Constructor. When test stat sampler is not provided
00050    // uses ToyMCSampler and RatioOfProfiledLikelihoodsTestStat
00051    // and nToys = 1000.
00052    // User can : GetTestStatSampler()->SetNToys( # )
00053    if(!sampler){
00054       fDefaultTestStat
00055          = new RatioOfProfiledLikelihoodsTestStat(*nullModel.GetPdf(),
00056                                                   *altModel.GetPdf(),
00057                                                   altModel.GetSnapshot());
00058 
00059       fDefaultSampler = new ToyMCSampler(*fDefaultTestStat, 1000);
00060       fTestStatSampler = fDefaultSampler;
00061    }
00062 }
00063 
00064 //_____________________________________________________________
00065 void HybridCalculatorGeneric::SetupSampler(const ModelConfig& model) const {
00066    // common setup for both models
00067    fNullModel->LoadSnapshot();
00068    fTestStatSampler->SetObservables(*fNullModel->GetObservables());
00069    fTestStatSampler->SetParametersForTestStat(*fNullModel->GetParametersOfInterest());
00070 
00071    // for this model
00072    model.LoadSnapshot();
00073    fTestStatSampler->SetSamplingDistName(model.GetName());
00074    fTestStatSampler->SetPdf(*model.GetPdf());
00075    fTestStatSampler->SetGlobalObservables(*model.GetGlobalObservables());
00076    fTestStatSampler->SetNuisanceParameters(*model.GetNuisanceParameters());
00077 
00078    if( (&model == fNullModel) && fPriorNuisanceNull){
00079      // Setup Priors for ad hoc Hybrid
00080      fTestStatSampler->SetPriorNuisance(fPriorNuisanceNull);
00081    } else if( (&model == fAltModel) && fPriorNuisanceAlt){
00082      // Setup Priors for ad hoc Hybrid
00083      fTestStatSampler->SetPriorNuisance(fPriorNuisanceAlt);
00084    } else if(model.GetNuisanceParameters()==NULL ||
00085              model.GetNuisanceParameters()->getSize()==0){
00086      oocoutI((TObject*)0,InputArguments)
00087        << "No nuisance parameters specified and no prior forced, reduces to simple hypothesis testing with no uncertainty" << endl;
00088    } else{
00089      // TODO principled case:
00090      // must create posterior from Model.PriorPdf and Model.Pdf
00091 
00092      // Note, we do not want to use "prior" for nuisance parameters:
00093      // fTestStatSampler->SetPriorNuisance(const_cast<RooAbsPdf*>(model.GetPriorPdf()));
00094 
00095      oocoutE((TObject*)0,InputArguments)  << "infering posterior from ModelConfig is not yet implemented" << endl;
00096    }
00097 }
00098 
00099 //____________________________________________________
00100 HybridCalculatorGeneric::~HybridCalculatorGeneric()  {
00101    //  if(fPriorNuisanceNull) delete fPriorNuisanceNull;
00102    //  if(fPriorNuisanceAlt)  delete fPriorNuisanceAlt;
00103    if(fDefaultSampler)    delete fDefaultSampler;
00104    if(fDefaultTestStat)   delete fDefaultTestStat;
00105 }
00106 
00107 //____________________________________________________
00108 HypoTestResult* HybridCalculatorGeneric::GetHypoTest() const {
00109 
00110    // several possibilities:
00111    // no prior nuisance given and no nuisance parameters: ok
00112    // no prior nuisance given but nuisance parameters: error
00113    // prior nuisance given for some nuisance parameters:
00114    //   - nuisance parameters are constant, so they don't float in test statistic
00115    //   - nuisance parameters are floating, so they do float in test statistic
00116 
00117    // TODO skreiss: really necessary?
00118    const_cast<ModelConfig*>(fNullModel)->GuessObsAndNuisance(*fData);
00119    const_cast<ModelConfig*>(fAltModel)->GuessObsAndNuisance(*fData);
00120 
00121    if( (fNullModel->GetNuisanceParameters()
00122         && fNullModel->GetNuisanceParameters()->getSize()>0
00123         && !fPriorNuisanceNull)
00124      || (fAltModel->GetNuisanceParameters()
00125          && fAltModel->GetNuisanceParameters()->getSize()>0
00126          && !fPriorNuisanceAlt)
00127        ){
00128      oocoutE((TObject*)0,InputArguments)  << "Must ForceNuisancePdf, inferring posterior from ModelConfig is not yet implemented" << endl;
00129      return 0;
00130    }
00131 
00132    if(   (!fNullModel->GetNuisanceParameters() && fPriorNuisanceNull)
00133       || (!fAltModel->GetNuisanceParameters()  && fPriorNuisanceAlt)
00134       || (fNullModel->GetNuisanceParameters()  && fNullModel->GetNuisanceParameters()->getSize()==0 && fPriorNuisanceNull)
00135        || (fAltModel->GetNuisanceParameters()  && fAltModel->GetNuisanceParameters()->getSize()>0   && !fPriorNuisanceAlt)
00136        ){
00137      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;
00138      return 0;
00139    }
00140 
00141 
00142    // get a big list of all variables for convenient switching
00143    RooArgSet *nullParams = fNullModel->GetPdf()->getParameters(*fData);
00144    RooArgSet *altParams = fAltModel->GetPdf()->getParameters(*fData);
00145    // save all parameters so we can set them back to what they were
00146    RooArgSet *bothParams = fNullModel->GetPdf()->getParameters(*fData);
00147    bothParams->add(*altParams,false);
00148    RooArgSet *saveAll = (RooArgSet*) bothParams->snapshot();
00149 
00150 
00151    // evaluate test statistic on data
00152    RooArgSet nullP(*fNullModel->GetSnapshot());
00153    double obsTestStat = fTestStatSampler->EvaluateTestStatistic(*const_cast<RooAbsData*>(fData), nullP);
00154    oocoutP((TObject*)0,Generation) << "Test Statistic on data: " << obsTestStat << endl;
00155 
00156    // Generate sampling distribution for null
00157    SetupSampler(*fNullModel);
00158    if(PreNullHook(obsTestStat) != 0) {
00159       oocoutE((TObject*)0,Generation) << "PreNullHook did not return 0." << endl;
00160    }
00161    RooArgSet poiNull(*fNullModel->GetParametersOfInterest());
00162    SamplingDistribution* samp_null = fTestStatSampler->GetSamplingDistribution(poiNull);
00163 
00164    // set parameters back
00165    *bothParams = *saveAll;
00166 
00167    // Generate sampling distribution for alternate
00168    SetupSampler(*fAltModel);
00169    if(PreAltHook(obsTestStat) != 0) {
00170       oocoutE((TObject*)0,Generation) << "PreAltHook did not return 0." << endl;
00171    }
00172    RooArgSet poiAlt(*fAltModel->GetParametersOfInterest());
00173    SamplingDistribution* samp_alt = fTestStatSampler->GetSamplingDistribution(poiAlt);
00174 
00175 
00176    string resultname = "HybridCalculator_result";
00177    HypoTestResult* res = new HypoTestResult(resultname.c_str());
00178    res->SetPValueIsRightTail(fTestStatSampler->GetTestStatistic()->PValueIsRightTail());
00179    res->SetTestStatisticData(obsTestStat);
00180    res->SetAltDistribution(samp_alt);
00181    res->SetNullDistribution(samp_null);
00182 
00183    *bothParams = *saveAll;
00184    delete bothParams;
00185    delete saveAll;
00186    delete altParams;
00187    delete nullParams;
00188 
00189    return res;
00190 }
00191 
00192 
00193 
00194 

Generated on Tue Jul 5 15:14:34 2011 for ROOT_528-00b_version by  doxygen 1.5.1