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