00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
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    
00050    
00051    
00052    
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    
00067    fNullModel->LoadSnapshot();
00068    fTestStatSampler->SetObservables(*fNullModel->GetObservables());
00069    fTestStatSampler->SetParametersForTestStat(*fNullModel->GetParametersOfInterest());
00070 
00071    
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      
00080      fTestStatSampler->SetPriorNuisance(fPriorNuisanceNull);
00081    } else if( (&model == fAltModel) && fPriorNuisanceAlt){
00082      
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      
00090      
00091 
00092      
00093      
00094 
00095      oocoutE((TObject*)0,InputArguments)  << "infering posterior from ModelConfig is not yet implemented" << endl;
00096    }
00097 }
00098 
00099 
00100 HybridCalculatorGeneric::~HybridCalculatorGeneric()  {
00101    
00102    
00103    if(fDefaultSampler)    delete fDefaultSampler;
00104    if(fDefaultTestStat)   delete fDefaultTestStat;
00105 }
00106 
00107 
00108 HypoTestResult* HybridCalculatorGeneric::GetHypoTest() const {
00109 
00110    
00111    
00112    
00113    
00114    
00115    
00116 
00117    
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    
00143    RooArgSet *nullParams = fNullModel->GetPdf()->getParameters(*fData);
00144    RooArgSet *altParams = fAltModel->GetPdf()->getParameters(*fData);
00145    
00146    RooArgSet *bothParams = fNullModel->GetPdf()->getParameters(*fData);
00147    bothParams->add(*altParams,false);
00148    RooArgSet *saveAll = (RooArgSet*) bothParams->snapshot();
00149 
00150 
00151    
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    
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    
00165    *bothParams = *saveAll;
00166 
00167    
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