86 ClassImp(RooStats::HybridCalculatorOriginal);
88 using namespace RooStats;
93 HybridCalculatorOriginal::HybridCalculatorOriginal(
const char *name) :
98 fNuisanceParameters(0),
101 fGenerateBinned(false),
102 fUsePriorPdf(false), fTmpDoExtended(true)
106 SetNumberOfToys(1000);
115 HybridCalculatorOriginal::HybridCalculatorOriginal( RooAbsPdf& sbModel,
117 RooArgList& observables,
118 const RooArgSet* nuisance_parameters,
119 RooAbsPdf* priorPdf ,
125 fNuisanceParameters(nuisance_parameters),
128 fGenerateBinned(GenerateBinned),
134 fObservables =
new RooArgList(observables);
141 SetTestStatistic(testStatistics);
142 SetNumberOfToys(numToys);
144 if (priorPdf) UseNuisance(
true);
156 HybridCalculatorOriginal::HybridCalculatorOriginal( RooAbsData & data,
159 const RooArgSet* nuisance_parameters,
167 fNuisanceParameters(nuisance_parameters),
170 fGenerateBinned(GenerateBinned),
176 SetTestStatistic(testStatistics);
177 SetNumberOfToys(numToys);
179 if (priorPdf) UseNuisance(
true);
188 HybridCalculatorOriginal::HybridCalculatorOriginal( RooAbsData& data,
189 const ModelConfig& sbModel,
190 const ModelConfig& bModel,
194 fSbModel(sbModel.GetPdf()),
195 fBModel(bModel.GetPdf()),
197 fNuisanceParameters((sbModel.GetNuisanceParameters()) ? sbModel.GetNuisanceParameters() : bModel.GetNuisanceParameters()),
198 fPriorPdf((sbModel.GetPriorPdf()) ? sbModel.GetPriorPdf() : bModel.GetPriorPdf()),
200 fGenerateBinned(GenerateBinned),
205 if (fPriorPdf) UseNuisance(
true);
207 SetTestStatistic(testStatistics);
208 SetNumberOfToys(numToys);
214 HybridCalculatorOriginal::~HybridCalculatorOriginal()
216 if (fObservables)
delete fObservables;
222 void HybridCalculatorOriginal::SetNullModel(
const ModelConfig& model)
224 fBModel = model.GetPdf();
226 if (!fPriorPdf) fPriorPdf = model.GetPriorPdf();
227 if (!fNuisanceParameters) fNuisanceParameters = model.GetNuisanceParameters();
233 void HybridCalculatorOriginal::SetAlternateModel(
const ModelConfig& model)
235 fSbModel = model.GetPdf();
236 fPriorPdf = model.GetPriorPdf();
237 fNuisanceParameters = model.GetNuisanceParameters();
247 void HybridCalculatorOriginal::SetTestStatistic(
int index)
249 fTestStatisticsIdx = index;
255 HybridResult* HybridCalculatorOriginal::Calculate(TH1& data,
unsigned int nToys,
bool usePriors)
const
259 TString dataHistName = GetName(); dataHistName +=
"_roodatahist";
260 RooDataHist dataHist(dataHistName,
"Data distribution as RooDataHist converted from TH1",*fObservables,&data);
262 HybridResult* result = Calculate(dataHist,nToys,usePriors);
270 HybridResult* HybridCalculatorOriginal::Calculate(RooAbsData& data,
unsigned int nToys,
bool usePriors)
const
273 double testStatData = 0;
274 if ( fTestStatisticsIdx==2 ) {
276 double nEvents = data.sumEntries();
277 testStatData = nEvents;
278 }
else if ( fTestStatisticsIdx==3 ) {
280 if ( fTmpDoExtended ) {
281 RooNLLVar sb_nll(
"sb_nll",
"sb_nll",*fSbModel,data,RooFit::CloneData(
false),RooFit::Extended());
282 fSbModel->fitTo(data,RooFit::Hesse(
false),RooFit::Strategy(0),RooFit::Extended());
283 double sb_nll_val = sb_nll.getVal();
284 RooNLLVar b_nll(
"b_nll",
"b_nll",*fBModel,data,RooFit::CloneData(
false),RooFit::Extended());
285 fBModel->fitTo(data,RooFit::Hesse(
false),RooFit::Strategy(0),RooFit::Extended());
286 double b_nll_val = b_nll.getVal();
287 double m2lnQ = 2*(sb_nll_val-b_nll_val);
288 testStatData = m2lnQ;
290 RooNLLVar sb_nll(
"sb_nll",
"sb_nll",*fSbModel,data,RooFit::CloneData(
false));
291 fSbModel->fitTo(data,RooFit::Hesse(
false),RooFit::Strategy(0));
292 double sb_nll_val = sb_nll.getVal();
293 RooNLLVar b_nll(
"b_nll",
"b_nll",*fBModel,data,RooFit::CloneData(
false));
294 fBModel->fitTo(data,RooFit::Hesse(
false),RooFit::Strategy(0));
295 double b_nll_val = b_nll.getVal();
296 double m2lnQ = 2*(sb_nll_val-b_nll_val);
297 testStatData = m2lnQ;
299 }
else if ( fTestStatisticsIdx==1 ) {
301 if ( fTmpDoExtended ) {
302 RooNLLVar sb_nll(
"sb_nll",
"sb_nll",*fSbModel,data,RooFit::Extended());
303 RooNLLVar b_nll(
"b_nll",
"b_nll",*fBModel,data,RooFit::Extended());
304 double m2lnQ = 2*(sb_nll.getVal()-b_nll.getVal());
305 testStatData = m2lnQ;
307 RooNLLVar sb_nll(
"sb_nll",
"sb_nll",*fSbModel,data);
308 RooNLLVar b_nll(
"b_nll",
"b_nll",*fBModel,data);
309 double m2lnQ = 2*(sb_nll.getVal()-b_nll.getVal());
310 testStatData = m2lnQ;
314 std::cout <<
"Test statistics has been evaluated for data\n";
316 HybridResult* result = Calculate(nToys,usePriors);
317 result->SetDataTestStatistics(testStatData);
324 HybridResult* HybridCalculatorOriginal::Calculate(
unsigned int nToys,
bool usePriors)
const
326 std::vector<double> bVals;
327 bVals.reserve(nToys);
329 std::vector<double> sbVals;
330 sbVals.reserve(nToys);
332 RunToys(bVals,sbVals,nToys,usePriors);
334 HybridResult* result;
336 TString name =
"HybridResult_" + TString(GetName() );
338 if ( fTestStatisticsIdx==2 )
339 result =
new HybridResult(name,sbVals,bVals,
false);
341 result =
new HybridResult(name,sbVals,bVals);
349 void HybridCalculatorOriginal::RunToys(std::vector<double>& bVals, std::vector<double>& sbVals,
unsigned int nToys,
bool usePriors)
const
351 std::cout <<
"HybridCalculatorOriginal: run " << nToys <<
" toy-MC experiments\n";
352 std::cout <<
"with test statistics index: " << fTestStatisticsIdx <<
"\n";
353 if (usePriors) std::cout <<
"marginalize nuisance parameters \n";
360 assert(fNuisanceParameters);
363 std::vector<double> parameterValues;
365 int nParameters = (fNuisanceParameters) ? fNuisanceParameters->getSize() : 0;
366 RooArgList parametersList(
"parametersList");
367 if (usePriors && nParameters>0) {
368 parametersList.add(*fNuisanceParameters);
369 parameterValues.resize(nParameters);
370 for (
int iParameter=0; iParameter<nParameters; iParameter++) {
371 RooRealVar* oneParam = (RooRealVar*) parametersList.at(iParameter);
372 parameterValues[iParameter] = oneParam->getVal();
378 RooArgSet originalSbParams;
379 RooArgSet originalBParams;
380 if (fTestStatisticsIdx == 3) {
381 RooArgSet * sbparams = fSbModel->getParameters(*fObservables);
382 RooArgSet * bparams = fBModel->getParameters(*fObservables);
383 if (sbparams) originalSbParams.addClone(*sbparams);
384 if (bparams) originalBParams.addClone(*bparams);
392 for (
unsigned int iToy=0; iToy<nToys; iToy++) {
397 std::cout <<
"....... toy number " << iToy <<
" / " << nToys << std::endl;
401 if (usePriors && nParameters>0) {
403 RooDataSet* tmpValues = (RooDataSet*) fPriorPdf->generate(*fNuisanceParameters,1);
404 for (
int iParameter=0; iParameter<nParameters; iParameter++) {
405 RooRealVar* oneParam = (RooRealVar*) parametersList.at(iParameter);
406 oneParam->setVal(tmpValues->get()->getRealValue(oneParam->GetName()));
415 bData =
static_cast<RooAbsData*
> (fBModel->generateBinned(*fObservables,RooFit::Extended()));
417 if ( fTmpDoExtended ) bData =
static_cast<RooAbsData*
> (fBModel->generate(*fObservables,RooFit::Extended()));
418 else bData =
static_cast<RooAbsData*
> (fBModel->generate(*fObservables,1));
422 bool bIsEmpty =
false;
426 RooDataSet* bDataDummy=
new RooDataSet(
"bDataDummy",
"empty dataset",*fObservables);
427 bData =
static_cast<RooAbsData*
>(
new RooDataHist (
"bDataEmpty",
"",*fObservables,*bDataDummy));
434 sbData =
static_cast<RooAbsData*
> (fSbModel->generateBinned(*fObservables,RooFit::Extended()));
436 if ( fTmpDoExtended ) sbData =
static_cast<RooAbsData*
> (fSbModel->generate(*fObservables,RooFit::Extended()));
437 else sbData =
static_cast<RooAbsData*
> (fSbModel->generate(*fObservables,1));
441 bool sbIsEmpty =
false;
445 RooDataSet* sbDataDummy=
new RooDataSet(
"sbDataDummy",
"empty dataset",*fObservables);
446 sbData =
static_cast<RooAbsData*
>(
new RooDataHist (
"sbDataEmpty",
"",*fObservables,*sbDataDummy));
451 if (usePriors && nParameters>0) {
452 for (
int iParameter=0; iParameter<nParameters; iParameter++) {
453 RooRealVar* oneParam = (RooRealVar*) parametersList.at(iParameter);
454 oneParam->setVal(parameterValues[iParameter]);
459 for (
int hypoTested=0; hypoTested<=1; hypoTested++) {
460 RooAbsData* dataToTest = sbData;
461 bool dataIsEmpty = sbIsEmpty;
462 if ( hypoTested==1 ) { dataToTest = bData; dataIsEmpty = bIsEmpty; }
464 if ( fTestStatisticsIdx==2 ) {
466 if ( !dataIsEmpty ) nEvents = dataToTest->numEntries();
467 if ( hypoTested==0 ) sbVals.push_back(nEvents);
468 else bVals.push_back(nEvents);
469 }
else if ( fTestStatisticsIdx==3 ) {
470 if ( fTmpDoExtended ) {
471 RooNLLVar sb_nll(
"sb_nll",
"sb_nll",*fSbModel,*dataToTest,RooFit::CloneData(
false),RooFit::Extended());
472 fSbModel->fitTo(*dataToTest,RooFit::PrintLevel(-1), RooFit::Hesse(
false),RooFit::Strategy(0),RooFit::Extended());
473 double sb_nll_val = sb_nll.getVal();
474 RooNLLVar b_nll(
"b_nll",
"b_nll",*fBModel,*dataToTest,RooFit::CloneData(
false),RooFit::Extended());
475 fBModel->fitTo(*dataToTest,RooFit::PrintLevel(-1),RooFit::Hesse(
false),RooFit::Strategy(0),RooFit::Extended());
476 double b_nll_val = b_nll.getVal();
477 double m2lnQ = -2*(b_nll_val-sb_nll_val);
478 if ( hypoTested==0 ) sbVals.push_back(m2lnQ);
479 else bVals.push_back(m2lnQ);
481 RooNLLVar sb_nll(
"sb_nll",
"sb_nll",*fSbModel,*dataToTest,RooFit::CloneData(
false));
482 fSbModel->fitTo(*dataToTest,RooFit::PrintLevel(-1), RooFit::Hesse(
false),RooFit::Strategy(0));
483 double sb_nll_val = sb_nll.getVal();
484 RooNLLVar b_nll(
"b_nll",
"b_nll",*fBModel,*dataToTest,RooFit::CloneData(
false));
485 fBModel->fitTo(*dataToTest,RooFit::PrintLevel(-1), RooFit::Hesse(
false),RooFit::Strategy(0));
486 double b_nll_val = b_nll.getVal();
487 double m2lnQ = -2*(b_nll_val-sb_nll_val);
488 if ( hypoTested==0 ) sbVals.push_back(m2lnQ);
489 else bVals.push_back(m2lnQ);
491 }
else if ( fTestStatisticsIdx==1 ) {
492 if ( fTmpDoExtended ) {
493 RooNLLVar sb_nll(
"sb_nll",
"sb_nll",*fSbModel,*dataToTest,RooFit::CloneData(
false),RooFit::Extended());
494 RooNLLVar b_nll(
"b_nll",
"b_nll",*fBModel,*dataToTest,RooFit::CloneData(
false),RooFit::Extended());
495 double m2lnQ = -2*(b_nll.getVal()-sb_nll.getVal());
496 if ( hypoTested==0 ) sbVals.push_back(m2lnQ);
497 else bVals.push_back(m2lnQ);
499 RooNLLVar sb_nll(
"sb_nll",
"sb_nll",*fSbModel,*dataToTest,RooFit::CloneData(
false));
500 RooNLLVar b_nll(
"b_nll",
"b_nll",*fBModel,*dataToTest,RooFit::CloneData(
false));
501 double m2lnQ = -2*(b_nll.getVal()-sb_nll.getVal());
502 if ( hypoTested==0 ) sbVals.push_back(m2lnQ);
503 else bVals.push_back(m2lnQ);
513 if (fTestStatisticsIdx == 3) {
514 RooArgSet * sbparams = fSbModel->getParameters(*fObservables);
516 assert(originalSbParams.getSize() == sbparams->getSize());
517 *sbparams = originalSbParams;
520 RooArgSet * bparams = fBModel->getParameters(*fObservables);
522 assert(originalBParams.getSize() == bparams->getSize());
523 *bparams = originalBParams;
534 if (usePriors && nParameters>0) {
535 for (
int iParameter=0; iParameter<nParameters; iParameter++) {
536 RooRealVar* oneParam = (RooRealVar*) parametersList.at(iParameter);
537 oneParam->setVal(parameterValues[iParameter]);
547 void HybridCalculatorOriginal::PrintMore(
const char* options)
const
551 std::cout <<
"Signal plus background model:\n";
552 fSbModel->Print(options);
556 std::cout <<
"\nBackground model:\n";
557 fBModel->Print(options);
561 std::cout <<
"\nObservables:\n";
562 fObservables->Print(options);
565 if (fNuisanceParameters) {
566 std::cout <<
"\nParameters being integrated:\n";
567 fNuisanceParameters->Print(options);
571 std::cout <<
"\nPrior PDF model for integration:\n";
572 fPriorPdf->Print(options);
581 HybridResult* HybridCalculatorOriginal::GetHypoTest()
const {
585 if (!DoCheckInputs())
return 0;
586 RooAbsData * treeData =
dynamic_cast<RooAbsData *
> (fData);
588 std::cerr <<
"Error in HybridCalculatorOriginal::GetHypoTest - invalid data type - return NULL" << std::endl;
591 bool usePrior = (fUsePriorPdf && fPriorPdf );
592 return Calculate( *treeData, fNToys, usePrior);
596 bool HybridCalculatorOriginal::DoCheckInputs()
const {
598 std::cerr <<
"Error in HybridCalculatorOriginal - data have not been set" << std::endl;
603 if (!fObservables && fData->get() ) fObservables =
new RooArgList( *fData->get() );
605 std::cerr <<
"Error in HybridCalculatorOriginal - no observables" << std::endl;
610 std::cerr <<
"Error in HybridCalculatorOriginal - S+B pdf has not been set " << std::endl;
615 std::cerr <<
"Error in HybridCalculatorOriginal - B pdf has not been set" << std::endl;
618 if (fUsePriorPdf && !fNuisanceParameters) {
619 std::cerr <<
"Error in HybridCalculatorOriginal - nuisance parameters have not been set " << std::endl;
622 if (fUsePriorPdf && !fPriorPdf) {
623 std::cerr <<
"Error in HybridCalculatorOriginal - prior pdf has not been set " << std::endl;