// internal routine to run the inverter HypoTestInverterResult * RooStats::HypoTestInvTool::RunInverter(RooWorkspace * w, const char * modelSBName, const char * modelBName, const char * dataName, int type, int testStatType, bool useCLs, int npoints, double poimin, double poimax, int ntoys, bool useNumberCounting, const char * nuisPriorName ){ std::cout << "Running HypoTestInverter on the workspace " << w->GetName() << std::endl; w->Print(); RooAbsData * data = w->data(dataName); if (!data) { Error("StandardHypoTestDemo","Not existing data %s",dataName); return 0; } else std::cout << "Using data set " << dataName << std::endl; if (mUseVectorStore) { RooAbsData::setDefaultStorageType(RooAbsData::Vector); data->convertToVectorStore() ; } // get models from WS // get the modelConfig out of the file ModelConfig* bModel = (ModelConfig*) w->obj(modelBName); ModelConfig* sbModel = (ModelConfig*) w->obj(modelSBName); if (!sbModel) { Error("StandardHypoTestDemo","Not existing ModelConfig %s",modelSBName); return 0; } // check the model if (!sbModel->GetPdf()) { Error("StandardHypoTestDemo","Model %s has no pdf ",modelSBName); return 0; } if (!sbModel->GetParametersOfInterest()) { Error("StandardHypoTestDemo","Model %s has no poi ",modelSBName); return 0; } if (!sbModel->GetObservables()) { Error("StandardHypoTestInvDemo","Model %s has no observables ",modelSBName); return 0; } if (!sbModel->GetSnapshot() ) { Info("StandardHypoTestInvDemo","Model %s has no snapshot - make one using model poi",modelSBName); sbModel->SetSnapshot( *sbModel->GetParametersOfInterest() ); } // case of no systematics // remove nuisance parameters from model if (noSystematics) { const RooArgSet * nuisPar = sbModel->GetNuisanceParameters(); if (nuisPar && nuisPar->getSize() > 0) { std::cout << "StandardHypoTestInvDemo" << " - Switch off all systematics by setting them constant to their initial values" << std::endl; RooStats::SetAllConstant(*nuisPar); } if (bModel) { const RooArgSet * bnuisPar = bModel->GetNuisanceParameters(); if (bnuisPar) RooStats::SetAllConstant(*bnuisPar); } } if (!bModel || bModel == sbModel) { Info("StandardHypoTestInvDemo","The background model %s does not exist",modelBName); Info("StandardHypoTestInvDemo","Copy it from ModelConfig %s and set POI to zero",modelSBName); bModel = (ModelConfig*) sbModel->Clone(); bModel->SetName(TString(modelSBName)+TString("_with_poi_0")); RooRealVar * var = dynamic_cast<RooRealVar*>(bModel->GetParametersOfInterest()->first()); if (!var) return 0; double oldval = var->getVal(); var->setVal(0); bModel->SetSnapshot( RooArgSet(*var) ); var->setVal(oldval); } else { if (!bModel->GetSnapshot() ) { Info("StandardHypoTestInvDemo","Model %s has no snapshot - make one using model poi and 0 values ",modelBName); RooRealVar * var = dynamic_cast<RooRealVar*>(bModel->GetParametersOfInterest()->first()); if (var) { double oldval = var->getVal(); var->setVal(0); bModel->SetSnapshot( RooArgSet(*var) ); var->setVal(oldval); } else { Error("StandardHypoTestInvDemo","Model %s has no valid poi",modelBName); return 0; } } } // check model has global observables when there are nuisance pdf // for the hybrid case the globobs are not needed if (type != 1 ) { bool hasNuisParam = (sbModel->GetNuisanceParameters() && sbModel->GetNuisanceParameters()->getSize() > 0); bool hasGlobalObs = (sbModel->GetGlobalObservables() && sbModel->GetGlobalObservables()->getSize() > 0); if (hasNuisParam && !hasGlobalObs ) { // try to see if model has nuisance parameters first RooAbsPdf * constrPdf = RooStats::MakeNuisancePdf(*sbModel,"nuisanceConstraintPdf_sbmodel"); if (constrPdf) { Warning("StandardHypoTestInvDemo","Model %s has nuisance parameters but no global observables associated",sbModel->GetName()); Warning("StandardHypoTestInvDemo","\tThe effect of the nuisance parameters will not be treated correctly "); } } } // run first a data fit const RooArgSet * poiSet = sbModel->GetParametersOfInterest(); RooRealVar *poi = (RooRealVar*)poiSet->first(); std::cout << "StandardHypoTestInvDemo : POI initial value: " << poi->GetName() << " = " << poi->getVal() << std::endl; // fit the data first (need to use constraint ) TStopwatch tw; bool doFit = initialFit; if (testStatType == 0 && initialFit == -1) doFit = false; // case of LEP test statistic if (type == 3 && initialFit == -1) doFit = false; // case of Asymptoticcalculator with nominal Asimov double poihat = 0; if (minimizerType.size()==0) minimizerType = ROOT::Math::MinimizerOptions::DefaultMinimizerType(); else ROOT::Math::MinimizerOptions::SetDefaultMinimizer(minimizerType.c_str()); Info("StandardHypoTestInvDemo","Using %s as minimizer for computing the test statistic", ROOT::Math::MinimizerOptions::DefaultMinimizerType().c_str() ); if (doFit) { // do the fit : By doing a fit the POI snapshot (for S+B) is set to the fit value // and the nuisance parameters nominal values will be set to the fit value. // This is relevant when using LEP test statistics Info( "StandardHypoTestInvDemo"," Doing a first fit to the observed data "); RooArgSet constrainParams; if (sbModel->GetNuisanceParameters() ) constrainParams.add(*sbModel->GetNuisanceParameters()); RooStats::RemoveConstantParameters(&constrainParams); tw.Start(); RooFitResult * fitres = sbModel->GetPdf()->fitTo(*data,InitialHesse(false), Hesse(false), Minimizer(minimizerType.c_str(),"Migrad"), Strategy(0), PrintLevel(mPrintLevel), Constrain(constrainParams), Save(true) ); if (fitres->status() != 0) { Warning("StandardHypoTestInvDemo","Fit to the model failed - try with strategy 1 and perform first an Hesse computation"); fitres = sbModel->GetPdf()->fitTo(*data,InitialHesse(true), Hesse(false),Minimizer(minimizerType.c_str(),"Migrad"), Strategy(1), PrintLevel(mPrintLevel+1), Constrain(constrainParams), Save(true) ); } if (fitres->status() != 0) Warning("StandardHypoTestInvDemo"," Fit still failed - continue anyway....."); poihat = poi->getVal(); std::cout << "StandardHypoTestInvDemo - Best Fit value : " << poi->GetName() << " = " << poihat << " +/- " << poi->getError() << std::endl; std::cout << "Time for fitting : "; tw.Print(); //save best fit value in the poi snapshot sbModel->SetSnapshot(*sbModel->GetParametersOfInterest()); std::cout << "StandardHypoTestInvo: snapshot of S+B Model " << sbModel->GetName() << " is set to the best fit value" << std::endl; } // print a message in case of LEP test statistics because it affects result by doing or not doing a fit if (testStatType == 0) { if (!doFit) Info("StandardHypoTestInvDemo","Using LEP test statistic - an initial fit is not done and the TS will use the nuisances at the model value"); else Info("StandardHypoTestInvDemo","Using LEP test statistic - an initial fit has been done and the TS will use the nuisances at the best fit value"); } // build test statistics and hypotest calculators for running the inverter SimpleLikelihoodRatioTestStat slrts(*sbModel->GetPdf(),*bModel->GetPdf()); // null parameters must includes snapshot of poi plus the nuisance values RooArgSet nullParams(*sbModel->GetSnapshot()); if (sbModel->GetNuisanceParameters()) nullParams.add(*sbModel->GetNuisanceParameters()); if (sbModel->GetSnapshot()) slrts.SetNullParameters(nullParams); RooArgSet altParams(*bModel->GetSnapshot()); if (bModel->GetNuisanceParameters()) altParams.add(*bModel->GetNuisanceParameters()); if (bModel->GetSnapshot()) slrts.SetAltParameters(altParams); // ratio of profile likelihood - need to pass snapshot for the alt RatioOfProfiledLikelihoodsTestStat ropl(*sbModel->GetPdf(), *bModel->GetPdf(), bModel->GetSnapshot()); ropl.SetSubtractMLE(false); if (testStatType == 11) ropl.SetSubtractMLE(true); ropl.SetPrintLevel(mPrintLevel); ropl.SetMinimizer(minimizerType.c_str()); ProfileLikelihoodTestStat profll(*sbModel->GetPdf()); if (testStatType == 3) profll.SetOneSided(true); if (testStatType == 4) profll.SetSigned(true); profll.SetMinimizer(minimizerType.c_str()); profll.SetPrintLevel(mPrintLevel); profll.SetReuseNLL(mOptimize); slrts.SetReuseNLL(mOptimize); ropl.SetReuseNLL(mOptimize); if (mOptimize) { profll.SetStrategy(0); ropl.SetStrategy(0); ROOT::Math::MinimizerOptions::SetDefaultStrategy(0); } if (mMaxPoi > 0) poi->setMax(mMaxPoi); // increase limit MaxLikelihoodEstimateTestStat maxll(*sbModel->GetPdf(),*poi); NumEventsTestStat nevtts; AsymptoticCalculator::SetPrintLevel(mPrintLevel); // create the HypoTest calculator class HypoTestCalculatorGeneric * hc = 0; if (type == 0) hc = new FrequentistCalculator(*data, *bModel, *sbModel); else if (type == 1) hc = new HybridCalculator(*data, *bModel, *sbModel); // else if (type == 2 ) hc = new AsymptoticCalculator(*data, *bModel, *sbModel, false, mAsimovBins); // else if (type == 3 ) hc = new AsymptoticCalculator(*data, *bModel, *sbModel, true, mAsimovBins); // for using Asimov data generated with nominal values else if (type == 2 ) hc = new AsymptoticCalculator(*data, *bModel, *sbModel, false ); else if (type == 3 ) hc = new AsymptoticCalculator(*data, *bModel, *sbModel, true ); // for using Asimov data generated with nominal values else { Error("StandardHypoTestInvDemo","Invalid - calculator type = %d supported values are only :\n\t\t\t 0 (Frequentist) , 1 (Hybrid) , 2 (Asymptotic) ",type); return 0; } // set the test statistic TestStatistic * testStat = 0; if (testStatType == 0) testStat = &slrts; if (testStatType == 1 || testStatType == 11) testStat = &ropl; if (testStatType == 2 || testStatType == 3 || testStatType == 4) testStat = &profll; if (testStatType == 5) testStat = &maxll; if (testStatType == 6) testStat = &nevtts; if (testStat == 0) { Error("StandardHypoTestInvDemo","Invalid - test statistic type = %d supported values are only :\n\t\t\t 0 (SLR) , 1 (Tevatron) , 2 (PLR), 3 (PLR1), 4(MLE)",testStatType); return 0; } ToyMCSampler *toymcs = (ToyMCSampler*)hc->GetTestStatSampler(); if (toymcs && (type == 0 || type == 1) ) { // look if pdf is number counting or extended if (sbModel->GetPdf()->canBeExtended() ) { if (useNumberCounting) Warning("StandardHypoTestInvDemo","Pdf is extended: but number counting flag is set: ignore it "); } else { // for not extended pdf if (!useNumberCounting ) { int nEvents = data->numEntries(); Info("StandardHypoTestInvDemo","Pdf is not extended: number of events to generate taken from observed data set is %d",nEvents); toymcs->SetNEventsPerToy(nEvents); } else { Info("StandardHypoTestInvDemo","using a number counting pdf"); toymcs->SetNEventsPerToy(1); } } toymcs->SetTestStatistic(testStat); if (data->isWeighted() && !mGenerateBinned) { Info("StandardHypoTestInvDemo","Data set is weighted, nentries = %d and sum of weights = %8.1f but toy generation is unbinned - it would be faster to set mGenerateBinned to true\n",data->numEntries(), data->sumEntries()); } toymcs->SetGenerateBinned(mGenerateBinned); toymcs->SetUseMultiGen(mOptimize); if (mGenerateBinned && sbModel->GetObservables()->getSize() > 2) { Warning("StandardHypoTestInvDemo","generate binned is activated but the number of ovservable is %d. Too much memory could be needed for allocating all the bins",sbModel->GetObservables()->getSize() ); } // set the random seed if needed if (mRandomSeed >= 0) RooRandom::randomGenerator()->SetSeed(mRandomSeed); } // specify if need to re-use same toys if (reuseAltToys) { hc->UseSameAltToys(); } if (type == 1) { HybridCalculator *hhc = dynamic_cast<HybridCalculator*> (hc); assert(hhc); hhc->SetToys(ntoys,ntoys/mNToysRatio); // can use less ntoys for b hypothesis // remove global observables from ModelConfig (this is probably not needed anymore in 5.32) bModel->SetGlobalObservables(RooArgSet() ); sbModel->SetGlobalObservables(RooArgSet() ); // check for nuisance prior pdf in case of nuisance parameters if (bModel->GetNuisanceParameters() || sbModel->GetNuisanceParameters() ) { // fix for using multigen (does not work in this case) toymcs->SetUseMultiGen(false); ToyMCSampler::SetAlwaysUseMultiGen(false); RooAbsPdf * nuisPdf = 0; if (nuisPriorName) nuisPdf = w->pdf(nuisPriorName); // use prior defined first in bModel (then in SbModel) if (!nuisPdf) { Info("StandardHypoTestInvDemo","No nuisance pdf given for the HybridCalculator - try to deduce pdf from the model"); if (bModel->GetPdf() && bModel->GetObservables() ) nuisPdf = RooStats::MakeNuisancePdf(*bModel,"nuisancePdf_bmodel"); else nuisPdf = RooStats::MakeNuisancePdf(*sbModel,"nuisancePdf_sbmodel"); } if (!nuisPdf ) { if (bModel->GetPriorPdf()) { nuisPdf = bModel->GetPriorPdf(); Info("StandardHypoTestInvDemo","No nuisance pdf given - try to use %s that is defined as a prior pdf in the B model",nuisPdf->GetName()); } else { Error("StandardHypoTestInvDemo","Cannnot run Hybrid calculator because no prior on the nuisance parameter is specified or can be derived"); return 0; } } assert(nuisPdf); Info("StandardHypoTestInvDemo","Using as nuisance Pdf ... " ); nuisPdf->Print(); const RooArgSet * nuisParams = (bModel->GetNuisanceParameters() ) ? bModel->GetNuisanceParameters() : sbModel->GetNuisanceParameters(); RooArgSet * np = nuisPdf->getObservables(*nuisParams); if (np->getSize() == 0) { Warning("StandardHypoTestInvDemo","Prior nuisance does not depend on nuisance parameters. They will be smeared in their full range"); } delete np; hhc->ForcePriorNuisanceAlt(*nuisPdf); hhc->ForcePriorNuisanceNull(*nuisPdf); } } else if (type == 2 || type == 3) { if (testStatType == 3) ((AsymptoticCalculator*) hc)->SetOneSided(true); if (testStatType != 2 && testStatType != 3) Warning("StandardHypoTestInvDemo","Only the PL test statistic can be used with AsymptoticCalculator - use by default a two-sided PL"); } else if (type == 0 || type == 1) ((FrequentistCalculator*) hc)->SetToys(ntoys,ntoys/mNToysRatio); // Get the result RooMsgService::instance().getStream(1).removeTopic(RooFit::NumIntegration); HypoTestInverter calc(*hc); calc.SetConfidenceLevel(0.95); calc.UseCLs(useCLs); calc.SetVerbose(true); // can speed up using proof-lite if (mUseProof && mNWorkers > 1) { ProofConfig pc(*w, mNWorkers, "", kFALSE); toymcs->SetProofConfig(&pc); // enable proof } if (npoints > 0) { if (poimin > poimax) { // if no min/max given scan between MLE and +4 sigma poimin = int(poihat); poimax = int(poihat + 4 * poi->getError()); } std::cout << "Doing a fixed scan in interval : " << poimin << " , " << poimax << std::endl; calc.SetFixedScan(npoints,poimin,poimax); } else { //poi->setMax(10*int( (poihat+ 10 *poi->getError() )/10 ) ); std::cout << "Doing an automatic scan in interval : " << poi->getMin() << " , " << poi->getMax() << std::endl; } tw.Start(); HypoTestInverterResult * r = calc.GetInterval(); std::cout << "Time to perform limit scan \n"; tw.Print(); if (mRebuild) { calc.SetCloseProof(1); tw.Start(); SamplingDistribution * limDist = calc.GetUpperLimitDistribution(true,mNToyToRebuild); std::cout << "Time to rebuild distributions " << std::endl; tw.Print(); if (limDist) { std::cout << "expected up limit " << limDist->InverseCDF(0.5) << " +/- " << limDist->InverseCDF(0.16) << " " << limDist->InverseCDF(0.84) << "\n"; //update r to a new updated result object containing the rebuilt expected p-values distributions // (it will not recompute the expected limit) if (r) delete r; // need to delete previous object since GetInterval will return a cloned copy r = calc.GetInterval(); } else std::cout << "ERROR : failed to re-build distributions " << std::endl; } return r; }
void splitws(string inFolderName, double mass, string channel) { cout << "Splitting workspace in " << channel << endl; int flatInterpCode = 4; int shapeInterpCode = 4; bool do2011 = 0; if (inFolderName.find("2011") != string::npos) do2011 = 1; bool conditionalAsimov = 0; bool doData = 1; //if (inFolderName.find("_blind_") != string::npos) { //conditionalAsimov = 0; //} //else { //conditionalAsimov = 1; //} set<string> channelNames; if (channel == "01j") { channelNames.insert("em_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); } else if (channel == "0j") { channelNames.insert("em_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); } else if (channel == "1j") { channelNames.insert("em_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); } else if (channel == "OF01j") { channelNames.insert("em_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_sscr_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_sscr_1j"+string(!do2011?"_2012":"")); } else if (channel == "OF0j") { channelNames.insert("em_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_sscr_0j"+string(!do2011?"_2012":"")); } else if (channel == "OF1j") { channelNames.insert("em_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_sscr_1j"+string(!do2011?"_2012":"")); } else if (channel == "SF01j") { channelNames.insert("SF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); } else if (channel == "SF0j") { channelNames.insert("SF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); } else if (channel == "SF1j") { channelNames.insert("SF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); } else if (channel == "2j") { channelNames.insert("em_signalLike1_2j"+string(!do2011?"_2012":"")); channelNames.insert("ee_signalLike1_2j"+string(!do2011?"_2012":"")); channelNames.insert("SF_topbox_2j"+string(!do2011?"_2012":"")); } else if (channel == "OF2j") { channelNames.insert("em_signalLike1_2j"+string(!do2011?"_2012":"")); channelNames.insert("SF_topbox_2j"+string(!do2011?"_2012":"")); } else if (channel == "SF2j") { channelNames.insert("ee_signalLike1_2j"+string(!do2011?"_2012":"")); channelNames.insert("SF_topbox_2j"+string(!do2011?"_2012":"")); } else if (channel == "OF") { channelNames.insert("em_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike1_2j"+string(!do2011?"_2012":"")); channelNames.insert("SF_topbox_2j"+string(!do2011?"_2012":"")); } else if (channel == "SF") { channelNames.insert("SF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); channelNames.insert("ee_signalLike1_2j"+string(!do2011?"_2012":"")); channelNames.insert("SF_topbox_2j"+string(!do2011?"_2012":"")); } else { cout << "Channel " << channel << " not defined. Please check!" << endl; exit(1); } // bool fix = 1; stringstream inFileName; inFileName << "workspaces/" << inFolderName << "/" << mass << ".root"; TFile f(inFileName.str().c_str()); RooWorkspace* w = (RooWorkspace*)f.Get("combWS"); if (!w) w = (RooWorkspace*)f.Get("combined"); RooDataSet* data = (RooDataSet*)w->data("combData"); if (!data) data = (RooDataSet*)w->data("obsData"); ModelConfig* mc = (ModelConfig*)w->obj("ModelConfig"); RooRealVar* weightVar = w->var("weightVar"); RooRealVar* mu = (RooRealVar*)mc->GetParametersOfInterest()->first(); if (!mu) mu = w->var("SigXsecOverSM"); const RooArgSet* mc_obs = mc->GetObservables(); const RooArgSet* mc_nuis = mc->GetNuisanceParameters(); const RooArgSet* mc_globs = mc->GetGlobalObservables(); const RooArgSet* mc_poi = mc->GetParametersOfInterest(); RooArgSet nuis = *mc_nuis; RooArgSet antiNuis = *mc_nuis; RooArgSet globs = *mc_globs; RooArgSet antiGlobs = *mc_globs; RooArgSet allParams; RooSimultaneous* simPdf = (RooSimultaneous*)mc->GetPdf(); RooCategory* cat = (RooCategory*)&simPdf->indexCat(); RooArgSet nuis_tmp = nuis; RooArgSet fullConstraints = *simPdf->getAllConstraints(*mc_obs,nuis_tmp,false); vector<string> foundChannels; vector<string> skippedChannels; cout << "Getting constraints" << endl; map<string, RooDataSet*> data_map; map<string, RooAbsPdf*> pdf_map; RooCategory* decCat = new RooCategory("dec_channel","dec_channel"); // int i = 0; TIterator* catItr = cat->typeIterator(); RooCatType* type; RooArgSet allConstraints; while ((type = (RooCatType*)catItr->Next())) { RooAbsPdf* pdf = simPdf->getPdf(type->GetName()); string typeName(type->GetName()); if (channelNames.size() && channelNames.find(typeName) == channelNames.end()) { skippedChannels.push_back(typeName); continue; } cout << "On channel " << type->GetName() << endl; foundChannels.push_back(typeName); decCat->defineType(type->GetName()); // pdf->getParameters(*data)->Print("v"); RooArgSet nuis_tmp1 = nuis; RooArgSet nuis_tmp2 = nuis; RooArgSet* constraints = pdf->getAllConstraints(*mc_obs, nuis_tmp1, true); constraints->Print(); allConstraints.add(*constraints); } catItr->Reset(); while ((type = (RooCatType*)catItr->Next())) { RooAbsPdf* pdf = simPdf->getPdf(type->GetName()); string typeName(type->GetName()); cout << "Considering type " << typeName << endl; if (channelNames.size() && channelNames.find(typeName) == channelNames.end()) continue; cout << "On channel " << type->GetName() << endl; RooArgSet nuis_tmp1 = nuis; RooArgSet nuis_tmp2 = nuis; RooArgSet* constraints = pdf->getAllConstraints(*mc_obs, nuis_tmp1, true); cout << "Adding pdf to map: " << typeName << " = " << pdf->GetName() << endl; pdf_map[typeName] = pdf; RooProdPdf prod("prod","prod",*constraints); RooArgSet* params = pdf->getParameters(*data); antiNuis.remove(*params); antiGlobs.remove(*params); allParams.add(*params); // cout << type->GetName() << endl; } // return; RooArgSet decNuis; TIterator* nuiItr = mc_nuis->createIterator(); TIterator* parItr = allParams.createIterator(); RooAbsArg* nui, *par; while ((par = (RooAbsArg*)parItr->Next())) { nuiItr->Reset(); while ((nui = (RooAbsArg*)nuiItr->Next())) { if (par == nui) decNuis.add(*nui); } } RooArgSet decGlobs; TIterator* globItr = mc_globs->createIterator(); parItr->Reset(); RooAbsArg* glob; while ((par = (RooAbsArg*)parItr->Next())) { globItr->Reset(); while ((glob = (RooAbsArg*)globItr->Next())) { if (par == glob) decGlobs.add(*glob); } } // antiNuis.Print(); // nuis.Print(); // globs.Print(); // i = 0; TList* datalist = data->split(*cat, true); TIterator* dataItr = datalist->MakeIterator(); RooAbsData* ds; while ((ds = (RooAbsData*)dataItr->Next())) { string typeName(ds->GetName()); if (channelNames.size() && channelNames.find(typeName) == channelNames.end()) continue; cout << "Adding dataset to map: " << ds->GetName() << endl; data_map[string(ds->GetName())] = (RooDataSet*)ds; cout << ds->GetName() << endl; } RooSimultaneous* decPdf = new RooSimultaneous("decPdf","decPdf",pdf_map,*decCat); RooArgSet decObs = *decPdf->getObservables(data); // decObs.add(*(RooAbsArg*)weightVar); decObs.add(*(RooAbsArg*)decCat); decObs.Print(); nuis.remove(antiNuis); globs.remove(antiGlobs); // nuis.Print("v"); RooDataSet* decData = new RooDataSet("obsData","obsData",RooArgSet(decObs,*(RooAbsArg*)weightVar),Index(*decCat),Import(data_map),WeightVar(*weightVar)); decData->Print(); RooArgSet poi(*(RooAbsArg*)mu); RooWorkspace decWS("combined"); ModelConfig decMC("ModelConfig",&decWS); decMC.SetPdf(*decPdf); decMC.SetObservables(decObs); decMC.SetNuisanceParameters(decNuis); decMC.SetGlobalObservables(decGlobs); decMC.SetParametersOfInterest(poi); decMC.Print(); decWS.import(*decPdf); decWS.import(decMC); decWS.import(*decData); // decWS.Print(); ModelConfig* mcInWs = (ModelConfig*)decWS.obj("ModelConfig"); decPdf = (RooSimultaneous*)mcInWs->GetPdf(); // setup(mcInWs); // return; mcInWs->GetNuisanceParameters()->Print("v"); mcInWs->GetGlobalObservables()->Print("v"); // decData->tree()->Scan("*"); // Make asimov data RooArgSet funcs = decWS.allFunctions(); TIterator* it = funcs.createIterator(); TObject* tempObj = 0; while((tempObj=it->Next())) { FlexibleInterpVar* flex = dynamic_cast<FlexibleInterpVar*>(tempObj); if(flex) { flex->setAllInterpCodes(flatInterpCode); } PiecewiseInterpolation* piece = dynamic_cast<PiecewiseInterpolation*>(tempObj); if(piece) { piece->setAllInterpCodes(shapeInterpCode); } } RooDataSet* dataInWs = (RooDataSet*)decWS.data("obsData"); makeAsimovData(mcInWs, conditionalAsimov && doData, &decWS, mcInWs->GetPdf(), dataInWs, 0); makeAsimovData(mcInWs, conditionalAsimov && doData, &decWS, mcInWs->GetPdf(), dataInWs, 1); makeAsimovData(mcInWs, conditionalAsimov && doData, &decWS, mcInWs->GetPdf(), dataInWs, 2); system(("mkdir -vp workspaces/"+inFolderName+"_"+channel).c_str()); stringstream outFileName; outFileName << "workspaces/" << inFolderName << "_" << channel << "/" << mass << ".root"; cout << "Exporting" << endl; decWS.writeToFile(outFileName.str().c_str()); cout << "\nIncluded the following channels: " << endl; for (int i=0;i<(int)foundChannels.size();i++) { cout << "-> " << foundChannels[i] << endl; } cout << "\nSkipping the following channels: " << endl; for (int i=0;i<(int)skippedChannels.size();i++) { cout << "-> " << skippedChannels[i] << endl; } cout << "Done" << endl; // decPdf->fitTo(*decData, Hesse(0), Minos(0), PrintLevel(0)); }
void runQ(const char* inFileName, const char* wsName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData", const char* asimov0DataName = "asimovData_0", const char* conditional0Snapshot = "conditionalGlobs_0", const char* asimov1DataName = "asimovData_1", const char* conditional1Snapshot = "conditionalGlobs_1", const char* nominalSnapshot = "nominalGlobs", string smass = "130", string folder = "test") { double mass; stringstream massStr; massStr << smass; massStr >> mass; bool errFast = 0; bool goFast = 1; bool remakeData = 1; bool doRightSided = 1; bool doInj = 0; bool doObs = 1; bool doMedian = 1; TStopwatch timer; timer.Start(); TFile f(inFileName); RooWorkspace* ws = (RooWorkspace*)f.Get(wsName); if (!ws) { cout << "ERROR::Workspace: " << wsName << " doesn't exist!" << endl; return; } ModelConfig* mc = (ModelConfig*)ws->obj(modelConfigName); if (!mc) { cout << "ERROR::ModelConfig: " << modelConfigName << " doesn't exist!" << endl; return; } RooDataSet* data = (RooDataSet*)ws->data(dataName); if (!data) { cout << "ERROR::Dataset: " << dataName << " doesn't exist!" << endl; return; } mc->GetNuisanceParameters()->Print("v"); RooNLLVar::SetIgnoreZeroEntries(1); ROOT::Math::MinimizerOptions::SetDefaultMinimizer("Minuit2"); ROOT::Math::MinimizerOptions::SetDefaultStrategy(0); ROOT::Math::MinimizerOptions::SetDefaultPrintLevel(1); cout << "Setting max function calls" << endl; //ROOT::Math::MinimizerOptions::SetDefaultMaxFunctionCalls(20000); RooMinimizer::SetMaxFunctionCalls(10000); ws->loadSnapshot("conditionalNuis_0"); RooArgSet nuis(*mc->GetNuisanceParameters()); RooRealVar* mu = (RooRealVar*)mc->GetParametersOfInterest()->first(); if (string(mc->GetPdf()->ClassName()) == "RooSimultaneous" && remakeData) { RooSimultaneous* simPdf = (RooSimultaneous*)mc->GetPdf(); double min_mu; data = makeData(data, simPdf, mc->GetObservables(), mu, mass, min_mu); } RooDataSet* asimovData0 = (RooDataSet*)ws->data(asimov0DataName); if (!asimovData0) { cout << "Asimov data doesn't exist! Please, allow me to build one for you..." << endl; makeAsimovData(mc, true, ws, mc->GetPdf(), data, 1); ws->Print(); asimovData0 = (RooDataSet*)ws->data("asimovData_0"); } RooDataSet* asimovData1 = (RooDataSet*)ws->data(asimov1DataName); if (!asimovData1) { cout << "Asimov data doesn't exist! Please, allow me to build one for you..." << endl; makeAsimovData(mc, true, ws, mc->GetPdf(), data, 0); ws->Print(); asimovData1 = (RooDataSet*)ws->data("asimovData_1"); } if (!doRightSided) mu->setRange(0, 40); else mu->setRange(-40, 40); bool old = false; if (old) { mu->setVal(0); RooArgSet poi(*mu); ProfileLikelihoodTestStat_modified asimov_testStat_sig(*mc->GetPdf()); asimov_testStat_sig.SetRightSided(doRightSided); asimov_testStat_sig.SetNuis(&nuis); if (!doInj) asimov_testStat_sig.SetDoAsimov(true, 1); asimov_testStat_sig.SetWorkspace(ws); ProfileLikelihoodTestStat_modified testStat(*mc->GetPdf()); testStat.SetRightSided(doRightSided); testStat.SetNuis(&nuis); testStat.SetWorkspace(ws); //RooMinimizerFcn::SetOverrideEverything(true); double med_sig = 0; double med_testStat_val = 0; //gRandom->SetSeed(1); //RooRandom::randomGenerator()->SetSeed(1); RooNLLVar::SetIgnoreZeroEntries(1); if (asimov1DataName != "" && doMedian) { mu->setVal(0); if (!doInj) mu->setRange(0, 2); ws->loadSnapshot("conditionalNuis_0"); asimov_testStat_sig.SetLoadUncondSnapshot("conditionalNuis_1"); if (string(conditional1Snapshot) != "") ws->loadSnapshot(conditional1Snapshot); med_testStat_val = 2*asimov_testStat_sig.Evaluate(*asimovData1, poi); if (med_testStat_val < 0 && !doInj) { mu->setVal(0); med_testStat_val = 2*asimov_testStat_sig.Evaluate(*asimovData1, poi); // just try again } int sign = med_testStat_val != 0 ? med_testStat_val/fabs(med_testStat_val) : 0; med_sig = sign*sqrt(fabs(med_testStat_val)); if (string(nominalSnapshot) != "") ws->loadSnapshot(nominalSnapshot); if (!doRightSided) mu->setRange(0, 40); else mu->setRange(-40, 40); } RooNLLVar::SetIgnoreZeroEntries(0); //gRandom->SetSeed(1); //RooRandom::randomGenerator()->SetSeed(1); //RooMinimizerFcn::SetOverrideEverything(false); cout << "med test stat: " << med_testStat_val << endl; ws->loadSnapshot("nominalGlobs"); ws->loadSnapshot("conditionalNuis_0"); mu->setVal(0); testStat.SetWorkspace(ws); testStat.SetLoadUncondSnapshot("ucmles"); double obsTestStat_val = doObs ? 2*testStat.Evaluate(*data, poi) : 0; cout << "obs test stat: " << obsTestStat_val << endl; // obsTestStat_val = 2*testStat.Evaluate(*data, poi); // cout << "obs test stat: " << obsTestStat_val << endl; // obsTestStat_val = 2*testStat.Evaluate(*data, poi); // cout << "obs test stat: " << obsTestStat_val << endl; double obs_sig; int sign = obsTestStat_val == 0 ? 0 : obsTestStat_val / fabs(obsTestStat_val); if (!doRightSided && (obsTestStat_val < 0 && obsTestStat_val > -0.1 || mu->getVal() < 0.001)) obs_sig = 0; else obs_sig = sign*sqrt(fabs(obsTestStat_val)); if (obs_sig != obs_sig) //nan, do by hand { cout << "Obs test stat gave nan: try by hand" << endl; mu->setVal(0); mu->setConstant(1); mc->GetPdf()->fitTo(*data, Hesse(0), Minos(0), PrintLevel(-1), Constrain(*mc->GetNuisanceParameters())); mu->setConstant(0); double L_0 = mc->GetPdf()->getVal(); //mu->setVal(0); //mu->setConstant(1); mc->GetPdf()->fitTo(*data, Hesse(0), Minos(0), PrintLevel(-1), Constrain(*mc->GetNuisanceParameters())); //mu->setConstant(0); double L_muhat = mc->GetPdf()->getVal(); cout << "L_0: " << L_0 << ", L_muhat: " << L_muhat << endl; obs_sig = sqrt(-2*TMath::Log(L_0/L_muhat)); //still nan if (obs_sig != obs_sig && fabs(L_0 - L_muhat) < 0.000001) obs_sig = 0; } cout << "obs: " << obs_sig << endl; cout << "Observed significance: " << obs_sig << endl; if (med_sig) { cout << "Median test stat val: " << med_testStat_val << endl; cout << "Median significance: " << med_sig << endl; } f.Close(); stringstream fileName; fileName << "root_files/" << folder << "/" << mass << ".root"; system(("mkdir -vp root_files/" + folder).c_str()); TFile f2(fileName.str().c_str(),"recreate"); // stringstream fileName; // fileName << "results_sig/" << mass << ".root"; // system("mkdir results_sig"); // TFile f(fileName.str().c_str(),"recreate"); TH1D* h_hypo = new TH1D("hypo","hypo",2,0,2); h_hypo->SetBinContent(1, obs_sig); h_hypo->SetBinContent(2, med_sig); f2.Write(); f2.Close(); //mc->GetPdf()->fitTo(*data, PrintLevel(0)); timer.Stop(); timer.Print(); } else { RooAbsPdf* pdf = mc->GetPdf(); RooArgSet nuis_tmp1 = *mc->GetNuisanceParameters(); RooNLLVar* asimov_nll0 = (RooNLLVar*)pdf->createNLL(*asimovData0, Constrain(nuis_tmp1)); RooArgSet nuis_tmp2 = *mc->GetNuisanceParameters(); RooNLLVar* asimov_nll1 = (RooNLLVar*)pdf->createNLL(*asimovData1, Constrain(nuis_tmp2)); RooArgSet nuis_tmp3 = *mc->GetNuisanceParameters(); RooNLLVar* obs_nll = (RooNLLVar*)pdf->createNLL(*data, Constrain(nuis_tmp3)); //do asimov int status; //get sigma_b ws->loadSnapshot(conditional0Snapshot); status = ws->loadSnapshot("conditionalNuis_0"); if (status != 0 && goFast) errFast = 1; mu->setVal(0); mu->setConstant(1); status = goFast ? 0 : minimize(asimov_nll0, ws); if (status < 0) { cout << "Retrying" << endl; //ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll0, ws); if (status >= 0) cout << "Success!" << endl; } double asimov0_nll0 = asimov_nll0->getVal(); mu->setVal(1); ws->loadSnapshot("conditionalNuis_1"); status = minimize(asimov_nll0, ws); if (status < 0) { cout << "Retrying" << endl; //ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll0, ws); if (status >= 0) cout << "Success!" << endl; } double asimov0_nll1 = asimov_nll0->getVal(); double asimov0_q = 2*(asimov0_nll1 - asimov0_nll0); double sigma_b = sqrt(1./asimov0_q); ws->loadSnapshot(nominalSnapshot); //get sigma_sb ws->loadSnapshot(conditional1Snapshot); ws->loadSnapshot("conditionalNuis_0"); mu->setVal(0); mu->setConstant(1); status = minimize(asimov_nll1, ws); if (status < 0) { cout << "Retrying" << endl; //ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll1, ws); if (status >= 0) cout << "Success!" << endl; } double asimov1_nll0 = asimov_nll1->getVal(); mu->setVal(1); status = ws->loadSnapshot("conditionalNuis_1"); if (status != 0 && goFast) errFast = 1; status = goFast ? 0 : minimize(asimov_nll1, ws); if (status < 0) { cout << "Retrying" << endl; //ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll1, ws); if (status >= 0) cout << "Success!" << endl; } double asimov1_nll1 = asimov_nll1->getVal(); double asimov1_q = 2*(asimov1_nll1 - asimov1_nll0); double sigma_sb = sqrt(-1./asimov1_q); ws->loadSnapshot(nominalSnapshot); //do obs mu->setVal(0); status = ws->loadSnapshot("conditionalNuis_0"); if (status != 0 && goFast) errFast = 1; mu->setConstant(1); status = goFast ? 0 : minimize(obs_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(obs_nll, ws); if (status >= 0) cout << "Success!" << endl; } double obs_nll0 = obs_nll->getVal(); status = ws->loadSnapshot("conditionalNuis_1"); if (status != 0 && goFast) errFast = 1; mu->setVal(1); status = goFast ? 0 : minimize(obs_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(obs_nll, ws); if (status >= 0) cout << "Success!" << endl; } double obs_nll1 = obs_nll->getVal(); double obs_q = 2*(obs_nll1 - obs_nll0); double Zobs = (1./sigma_b/sigma_b - obs_q) / (2./sigma_b); double Zexp = (1./sigma_b/sigma_b - asimov1_q) / (2./sigma_b); double pb_obs = 1-ROOT::Math::gaussian_cdf(Zobs); double pb_exp = 1-ROOT::Math::gaussian_cdf(Zexp); cout << "asimov0_q = " << asimov0_q << endl; cout << "asimov1_q = " << asimov1_q << endl; cout << "obs_q = " << obs_q << endl; cout << "sigma_b = " << sigma_b << endl; cout << "sigma_sb = " << sigma_sb << endl; cout << "Z obs = " << Zobs << endl; cout << "Z exp = " << Zexp << endl; f.Close(); stringstream fileName; fileName << "root_files/" << folder << "/" << mass << ".root"; system(("mkdir -vp root_files/" + folder).c_str()); TFile f2(fileName.str().c_str(),"recreate"); TH1D* h_hypo = new TH1D("hypo_tev","hypo_tev",2,0,2); h_hypo->SetBinContent(1, pb_obs); h_hypo->SetBinContent(2, pb_exp); f2.Write(); f2.Close(); stringstream fileName3; fileName3 << "root_files/" << folder << "_llr/" << mass << ".root"; system(("mkdir -vp root_files/" + folder + "_llr").c_str()); TFile f3(fileName3.str().c_str(),"recreate"); TH1D* h_hypo3 = new TH1D("hypo_llr","hypo_llr",7,0,7); h_hypo3->SetBinContent(1, -obs_q); h_hypo3->SetBinContent(2, -asimov1_q); h_hypo3->SetBinContent(3, -asimov0_q); h_hypo3->SetBinContent(4, -asimov0_q-2*2/sigma_b); h_hypo3->SetBinContent(5, -asimov0_q-1*2/sigma_b); h_hypo3->SetBinContent(6, -asimov0_q+1*2/sigma_b); h_hypo3->SetBinContent(7, -asimov0_q+2*2/sigma_b); f3.Write(); f3.Close(); timer.Stop(); timer.Print(); } }
void OneSidedFrequentistUpperLimitWithBands(const char* infile = "", const char* workspaceName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData") { double confidenceLevel=0.95; int nPointsToScan = 20; int nToyMC = 200; // ------------------------------------------------------- // First part is just to access a user-defined file // or create the standard example file if it doesn't exist const char* filename = ""; if (!strcmp(infile,"")) { filename = "results/example_combined_GaussExample_model.root"; bool fileExist = !gSystem->AccessPathName(filename); // note opposite return code // if file does not exists generate with histfactory if (!fileExist) { #ifdef _WIN32 cout << "HistFactory file cannot be generated on Windows - exit" << endl; return; #endif // Normally this would be run on the command line cout <<"will run standard hist2workspace example"<<endl; gROOT->ProcessLine(".! prepareHistFactory ."); gROOT->ProcessLine(".! hist2workspace config/example.xml"); cout <<"\n\n---------------------"<<endl; cout <<"Done creating example input"<<endl; cout <<"---------------------\n\n"<<endl; } } else filename = infile; // Try to open the file TFile *file = TFile::Open(filename); // if input file was specified byt not found, quit if(!file ){ cout <<"StandardRooStatsDemoMacro: Input file " << filename << " is not found" << endl; return; } // ------------------------------------------------------- // Now get the data and workspace // get the workspace out of the file RooWorkspace* w = (RooWorkspace*) file->Get(workspaceName); if(!w){ cout <<"workspace not found" << endl; return; } // get the modelConfig out of the file ModelConfig* mc = (ModelConfig*) w->obj(modelConfigName); // get the modelConfig out of the file RooAbsData* data = w->data(dataName); // make sure ingredients are found if(!data || !mc){ w->Print(); cout << "data or ModelConfig was not found" <<endl; return; } // ------------------------------------------------------- // Now get the POI for convenience // you may want to adjust the range of your POI RooRealVar* firstPOI = (RooRealVar*) mc->GetParametersOfInterest()->first(); /* firstPOI->setMin(0);*/ /* firstPOI->setMax(10);*/ // -------------------------------------------- // Create and use the FeldmanCousins tool // to find and plot the 95% confidence interval // on the parameter of interest as specified // in the model config // REMEMBER, we will change the test statistic // so this is NOT a Feldman-Cousins interval FeldmanCousins fc(*data,*mc); fc.SetConfidenceLevel(confidenceLevel); /* fc.AdditionalNToysFactor(0.25); // degrade/improve sampling that defines confidence belt*/ /* fc.UseAdaptiveSampling(true); // speed it up a bit, don't use for expected limits*/ fc.SetNBins(nPointsToScan); // set how many points per parameter of interest to scan fc.CreateConfBelt(true); // save the information in the belt for plotting // ------------------------------------------------------- // Feldman-Cousins is a unified limit by definition // but the tool takes care of a few things for us like which values // of the nuisance parameters should be used to generate toys. // so let's just change the test statistic and realize this is // no longer "Feldman-Cousins" but is a fully frequentist Neyman-Construction. /* ProfileLikelihoodTestStatModified onesided(*mc->GetPdf());*/ /* fc.GetTestStatSampler()->SetTestStatistic(&onesided);*/ /* ((ToyMCSampler*) fc.GetTestStatSampler())->SetGenerateBinned(true); */ ToyMCSampler* toymcsampler = (ToyMCSampler*) fc.GetTestStatSampler(); ProfileLikelihoodTestStat* testStat = dynamic_cast<ProfileLikelihoodTestStat*>(toymcsampler->GetTestStatistic()); testStat->SetOneSided(true); // Since this tool needs to throw toy MC the PDF needs to be // extended or the tool needs to know how many entries in a dataset // per pseudo experiment. // In the 'number counting form' where the entries in the dataset // are counts, and not values of discriminating variables, the // datasets typically only have one entry and the PDF is not // extended. if(!mc->GetPdf()->canBeExtended()){ if(data->numEntries()==1) fc.FluctuateNumDataEntries(false); else cout <<"Not sure what to do about this model" <<endl; } // We can use PROOF to speed things along in parallel // However, the test statistic has to be installed on the workers // so either turn off PROOF or include the modified test statistic // in your `$ROOTSYS/roofit/roostats/inc` directory, // add the additional line to the LinkDef.h file, // and recompile root. if (useProof) { ProofConfig pc(*w, nworkers, "", false); toymcsampler->SetProofConfig(&pc); // enable proof } if(mc->GetGlobalObservables()){ cout << "will use global observables for unconditional ensemble"<<endl; mc->GetGlobalObservables()->Print(); toymcsampler->SetGlobalObservables(*mc->GetGlobalObservables()); } // Now get the interval PointSetInterval* interval = fc.GetInterval(); ConfidenceBelt* belt = fc.GetConfidenceBelt(); // print out the interval on the first Parameter of Interest cout << "\n95% interval on " <<firstPOI->GetName()<<" is : ["<< interval->LowerLimit(*firstPOI) << ", "<< interval->UpperLimit(*firstPOI) <<"] "<<endl; // get observed UL and value of test statistic evaluated there RooArgSet tmpPOI(*firstPOI); double observedUL = interval->UpperLimit(*firstPOI); firstPOI->setVal(observedUL); double obsTSatObsUL = fc.GetTestStatSampler()->EvaluateTestStatistic(*data,tmpPOI); // Ask the calculator which points were scanned RooDataSet* parameterScan = (RooDataSet*) fc.GetPointsToScan(); RooArgSet* tmpPoint; // make a histogram of parameter vs. threshold TH1F* histOfThresholds = new TH1F("histOfThresholds","", parameterScan->numEntries(), firstPOI->getMin(), firstPOI->getMax()); histOfThresholds->GetXaxis()->SetTitle(firstPOI->GetName()); histOfThresholds->GetYaxis()->SetTitle("Threshold"); // loop through the points that were tested and ask confidence belt // what the upper/lower thresholds were. // For FeldmanCousins, the lower cut off is always 0 for(Int_t i=0; i<parameterScan->numEntries(); ++i){ tmpPoint = (RooArgSet*) parameterScan->get(i)->clone("temp"); //cout <<"get threshold"<<endl; double arMax = belt->GetAcceptanceRegionMax(*tmpPoint); double poiVal = tmpPoint->getRealValue(firstPOI->GetName()) ; histOfThresholds->Fill(poiVal,arMax); } TCanvas* c1 = new TCanvas(); c1->Divide(2); c1->cd(1); histOfThresholds->SetMinimum(0); histOfThresholds->Draw(); c1->cd(2); // ------------------------------------------------------- // Now we generate the expected bands and power-constraint // First: find parameter point for mu=0, with conditional MLEs for nuisance parameters RooAbsReal* nll = mc->GetPdf()->createNLL(*data); RooAbsReal* profile = nll->createProfile(*mc->GetParametersOfInterest()); firstPOI->setVal(0.); profile->getVal(); // this will do fit and set nuisance parameters to profiled values RooArgSet* poiAndNuisance = new RooArgSet(); if(mc->GetNuisanceParameters()) poiAndNuisance->add(*mc->GetNuisanceParameters()); poiAndNuisance->add(*mc->GetParametersOfInterest()); w->saveSnapshot("paramsToGenerateData",*poiAndNuisance); RooArgSet* paramsToGenerateData = (RooArgSet*) poiAndNuisance->snapshot(); cout << "\nWill use these parameter points to generate pseudo data for bkg only" << endl; paramsToGenerateData->Print("v"); RooArgSet unconditionalObs; unconditionalObs.add(*mc->GetObservables()); unconditionalObs.add(*mc->GetGlobalObservables()); // comment this out for the original conditional ensemble double CLb=0; double CLbinclusive=0; // Now we generate background only and find distribution of upper limits TH1F* histOfUL = new TH1F("histOfUL","",100,0,firstPOI->getMax()); histOfUL->GetXaxis()->SetTitle("Upper Limit (background only)"); histOfUL->GetYaxis()->SetTitle("Entries"); for(int imc=0; imc<nToyMC; ++imc){ // set parameters back to values for generating pseudo data // cout << "\n get current nuis, set vals, print again" << endl; w->loadSnapshot("paramsToGenerateData"); // poiAndNuisance->Print("v"); RooDataSet* toyData = 0; // now generate a toy dataset if(!mc->GetPdf()->canBeExtended()){ if(data->numEntries()==1) toyData = mc->GetPdf()->generate(*mc->GetObservables(),1); else cout <<"Not sure what to do about this model" <<endl; } else{ // cout << "generating extended dataset"<<endl; toyData = mc->GetPdf()->generate(*mc->GetObservables(),Extended()); } // generate global observables // need to be careful for simpdf // RooDataSet* globalData = mc->GetPdf()->generate(*mc->GetGlobalObservables(),1); RooSimultaneous* simPdf = dynamic_cast<RooSimultaneous*>(mc->GetPdf()); if(!simPdf){ RooDataSet *one = mc->GetPdf()->generate(*mc->GetGlobalObservables(), 1); const RooArgSet *values = one->get(); RooArgSet *allVars = mc->GetPdf()->getVariables(); *allVars = *values; delete allVars; delete values; delete one; } else { //try fix for sim pdf TIterator* iter = simPdf->indexCat().typeIterator() ; RooCatType* tt = NULL; while((tt=(RooCatType*) iter->Next())) { // Get pdf associated with state from simpdf RooAbsPdf* pdftmp = simPdf->getPdf(tt->GetName()) ; // Generate only global variables defined by the pdf associated with this state RooArgSet* globtmp = pdftmp->getObservables(*mc->GetGlobalObservables()) ; RooDataSet* tmp = pdftmp->generate(*globtmp,1) ; // Transfer values to output placeholder *globtmp = *tmp->get(0) ; // Cleanup delete globtmp ; delete tmp ; } } // globalData->Print("v"); // unconditionalObs = *globalData->get(); // mc->GetGlobalObservables()->Print("v"); // delete globalData; // cout << "toy data = " << endl; // toyData->get()->Print("v"); // get test stat at observed UL in observed data firstPOI->setVal(observedUL); double toyTSatObsUL = fc.GetTestStatSampler()->EvaluateTestStatistic(*toyData,tmpPOI); // toyData->get()->Print("v"); // cout <<"obsTSatObsUL " <<obsTSatObsUL << "toyTS " << toyTSatObsUL << endl; if(obsTSatObsUL < toyTSatObsUL) // not sure about <= part yet CLb+= (1.)/nToyMC; if(obsTSatObsUL <= toyTSatObsUL) // not sure about <= part yet CLbinclusive+= (1.)/nToyMC; // loop over points in belt to find upper limit for this toy data double thisUL = 0; for(Int_t i=0; i<parameterScan->numEntries(); ++i){ tmpPoint = (RooArgSet*) parameterScan->get(i)->clone("temp"); double arMax = belt->GetAcceptanceRegionMax(*tmpPoint); firstPOI->setVal( tmpPoint->getRealValue(firstPOI->GetName()) ); // double thisTS = profile->getVal(); double thisTS = fc.GetTestStatSampler()->EvaluateTestStatistic(*toyData,tmpPOI); // cout << "poi = " << firstPOI->getVal() // << " max is " << arMax << " this profile = " << thisTS << endl; // cout << "thisTS = " << thisTS<<endl; if(thisTS<=arMax){ thisUL = firstPOI->getVal(); } else{ break; } } /* // loop over points in belt to find upper limit for this toy data double thisUL = 0; for(Int_t i=0; i<histOfThresholds->GetNbinsX(); ++i){ tmpPoint = (RooArgSet*) parameterScan->get(i)->clone("temp"); cout <<"---------------- "<<i<<endl; tmpPoint->Print("v"); cout << "from hist " << histOfThresholds->GetBinCenter(i+1) <<endl; double arMax = histOfThresholds->GetBinContent(i+1); // cout << " threhold from Hist = aMax " << arMax<<endl; // double arMax2 = belt->GetAcceptanceRegionMax(*tmpPoint); // cout << "from scan arMax2 = "<< arMax2 << endl; // not the same due to TH1F not TH1D // cout << "scan - hist" << arMax2-arMax << endl; firstPOI->setVal( histOfThresholds->GetBinCenter(i+1)); // double thisTS = profile->getVal(); double thisTS = fc.GetTestStatSampler()->EvaluateTestStatistic(*toyData,tmpPOI); // cout << "poi = " << firstPOI->getVal() // << " max is " << arMax << " this profile = " << thisTS << endl; // cout << "thisTS = " << thisTS<<endl; // NOTE: need to add a small epsilon term for single precision vs. double precision if(thisTS<=arMax + 1e-7){ thisUL = firstPOI->getVal(); } else{ break; } } */ histOfUL->Fill(thisUL); // for few events, data is often the same, and UL is often the same // cout << "thisUL = " << thisUL<<endl; delete toyData; } histOfUL->Draw(); c1->SaveAs("one-sided_upper_limit_output.pdf"); // if you want to see a plot of the sampling distribution for a particular scan point: /* SamplingDistPlot sampPlot; int indexInScan = 0; tmpPoint = (RooArgSet*) parameterScan->get(indexInScan)->clone("temp"); firstPOI->setVal( tmpPoint->getRealValue(firstPOI->GetName()) ); toymcsampler->SetParametersForTestStat(tmpPOI); SamplingDistribution* samp = toymcsampler->GetSamplingDistribution(*tmpPoint); sampPlot.AddSamplingDistribution(samp); sampPlot.Draw(); */ // Now find bands and power constraint Double_t* bins = histOfUL->GetIntegral(); TH1F* cumulative = (TH1F*) histOfUL->Clone("cumulative"); cumulative->SetContent(bins); double band2sigDown, band1sigDown, bandMedian, band1sigUp,band2sigUp; for(int i=1; i<=cumulative->GetNbinsX(); ++i){ if(bins[i]<RooStats::SignificanceToPValue(2)) band2sigDown=cumulative->GetBinCenter(i); if(bins[i]<RooStats::SignificanceToPValue(1)) band1sigDown=cumulative->GetBinCenter(i); if(bins[i]<0.5) bandMedian=cumulative->GetBinCenter(i); if(bins[i]<RooStats::SignificanceToPValue(-1)) band1sigUp=cumulative->GetBinCenter(i); if(bins[i]<RooStats::SignificanceToPValue(-2)) band2sigUp=cumulative->GetBinCenter(i); } cout << "-2 sigma band " << band2sigDown << endl; cout << "-1 sigma band " << band1sigDown << " [Power Constraint)]" << endl; cout << "median of band " << bandMedian << endl; cout << "+1 sigma band " << band1sigUp << endl; cout << "+2 sigma band " << band2sigUp << endl; // print out the interval on the first Parameter of Interest cout << "\nobserved 95% upper-limit "<< interval->UpperLimit(*firstPOI) <<endl; cout << "CLb strict [P(toy>obs|0)] for observed 95% upper-limit "<< CLb <<endl; cout << "CLb inclusive [P(toy>=obs|0)] for observed 95% upper-limit "<< CLbinclusive <<endl; delete profile; delete nll; }
void StandardHypoTestDemo(const char* infile = "", const char* workspaceName = "combined", const char* modelSBName = "ModelConfig", const char* modelBName = "", const char* dataName = "obsData", int calcType = 0, // 0 freq 1 hybrid, 2 asymptotic int testStatType = 3, // 0 LEP, 1 TeV, 2 LHC, 3 LHC - one sided int ntoys = 5000, bool useNC = false, const char * nuisPriorName = 0) { /* Other Parameter to pass in tutorial apart from standard for filename, ws, modelconfig and data type = 0 Freq calculator type = 1 Hybrid calculator type = 2 Asymptotic calculator testStatType = 0 LEP = 1 Tevatron = 2 Profile Likelihood = 3 Profile Likelihood one sided (i.e. = 0 if mu < mu_hat) ntoys: number of toys to use useNumberCounting: set to true when using number counting events nuisPriorName: name of prior for the nnuisance. This is often expressed as constraint term in the global model It is needed only when using the HybridCalculator (type=1) If not given by default the prior pdf from ModelConfig is used. extra options are available as global paramwters of the macro. They major ones are: generateBinned generate binned data sets for toys (default is false) - be careful not to activate with a too large (>=3) number of observables nToyRatio ratio of S+B/B toys (default is 2) printLevel */ // disable - can cause some problems //ToyMCSampler::SetAlwaysUseMultiGen(true); SimpleLikelihoodRatioTestStat::SetAlwaysReuseNLL(true); ProfileLikelihoodTestStat::SetAlwaysReuseNLL(true); RatioOfProfiledLikelihoodsTestStat::SetAlwaysReuseNLL(true); //RooRandom::randomGenerator()->SetSeed(0); // to change minimizers // ROOT::Math::MinimizerOptions::SetDefaultStrategy(0); // ROOT::Math::MinimizerOptions::SetDefaultMinimizer("Minuit2"); // ROOT::Math::MinimizerOptions::SetDefaultTolerance(1); ///////////////////////////////////////////////////////////// // First part is just to access a user-defined file // or create the standard example file if it doesn't exist //////////////////////////////////////////////////////////// const char* filename = ""; if (!strcmp(infile,"")) filename = "results/example_combined_GaussExample_model.root"; else filename = infile; // Check if example input file exists TFile *file = TFile::Open(filename); // if input file was specified byt not found, quit if(!file && strcmp(infile,"")){ cout <<"file not found" << endl; return; } // if default file not found, try to create it if(!file ){ // Normally this would be run on the command line cout <<"will run standard hist2workspace example"<<endl; gROOT->ProcessLine(".! prepareHistFactory ."); gROOT->ProcessLine(".! hist2workspace config/example.xml"); cout <<"\n\n---------------------"<<endl; cout <<"Done creating example input"<<endl; cout <<"---------------------\n\n"<<endl; } // now try to access the file again file = TFile::Open(filename); if(!file){ // if it is still not there, then we can't continue cout << "Not able to run hist2workspace to create example input" <<endl; return; } ///////////////////////////////////////////////////////////// // Tutorial starts here //////////////////////////////////////////////////////////// // get the workspace out of the file RooWorkspace* w = (RooWorkspace*) file->Get(workspaceName); if(!w){ cout <<"workspace not found" << endl; return; } w->Print(); // get the modelConfig out of the file ModelConfig* sbModel = (ModelConfig*) w->obj(modelSBName); // get the modelConfig out of the file RooAbsData* data = w->data(dataName); // make sure ingredients are found if(!data || !sbModel){ w->Print(); cout << "data or ModelConfig was not found" <<endl; return; } // make b model ModelConfig* bModel = (ModelConfig*) w->obj(modelBName); // case of no systematics // remove nuisance parameters from model if (noSystematics) { const RooArgSet * nuisPar = sbModel->GetNuisanceParameters(); if (nuisPar && nuisPar->getSize() > 0) { std::cout << "StandardHypoTestInvDemo" << " - Switch off all systematics by setting them constant to their initial values" << std::endl; RooStats::SetAllConstant(*nuisPar); } if (bModel) { const RooArgSet * bnuisPar = bModel->GetNuisanceParameters(); if (bnuisPar) RooStats::SetAllConstant(*bnuisPar); } } if (!bModel ) { Info("StandardHypoTestInvDemo","The background model %s does not exist",modelBName); Info("StandardHypoTestInvDemo","Copy it from ModelConfig %s and set POI to zero",modelSBName); bModel = (ModelConfig*) sbModel->Clone(); bModel->SetName(TString(modelSBName)+TString("B_only")); RooRealVar * var = dynamic_cast<RooRealVar*>(bModel->GetParametersOfInterest()->first()); if (!var) return; double oldval = var->getVal(); var->setVal(0); //bModel->SetSnapshot( RooArgSet(*var, *w->var("lumi")) ); bModel->SetSnapshot( RooArgSet(*var) ); var->setVal(oldval); } if (!sbModel->GetSnapshot() || poiValue > 0) { Info("StandardHypoTestDemo","Model %s has no snapshot - make one using model poi",modelSBName); RooRealVar * var = dynamic_cast<RooRealVar*>(sbModel->GetParametersOfInterest()->first()); if (!var) return; double oldval = var->getVal(); if (poiValue > 0) var->setVal(poiValue); //sbModel->SetSnapshot( RooArgSet(*var, *w->var("lumi") ) ); sbModel->SetSnapshot( RooArgSet(*var) ); if (poiValue > 0) var->setVal(oldval); //sbModel->SetSnapshot( *sbModel->GetParametersOfInterest() ); } // part 1, hypothesis testing SimpleLikelihoodRatioTestStat * slrts = new SimpleLikelihoodRatioTestStat(*bModel->GetPdf(), *sbModel->GetPdf()); // null parameters must includes snapshot of poi plus the nuisance values RooArgSet nullParams(*bModel->GetSnapshot()); if (bModel->GetNuisanceParameters()) nullParams.add(*bModel->GetNuisanceParameters()); slrts->SetNullParameters(nullParams); RooArgSet altParams(*sbModel->GetSnapshot()); if (sbModel->GetNuisanceParameters()) altParams.add(*sbModel->GetNuisanceParameters()); slrts->SetAltParameters(altParams); ProfileLikelihoodTestStat * profll = new ProfileLikelihoodTestStat(*bModel->GetPdf()); RatioOfProfiledLikelihoodsTestStat * ropl = new RatioOfProfiledLikelihoodsTestStat(*bModel->GetPdf(), *sbModel->GetPdf(), sbModel->GetSnapshot()); ropl->SetSubtractMLE(false); if (testStatType == 3) profll->SetOneSidedDiscovery(1); profll->SetPrintLevel(printLevel); // profll.SetReuseNLL(mOptimize); // slrts.SetReuseNLL(mOptimize); // ropl.SetReuseNLL(mOptimize); AsymptoticCalculator::SetPrintLevel(printLevel); HypoTestCalculatorGeneric * hypoCalc = 0; // note here Null is B and Alt is S+B if (calcType == 0) hypoCalc = new FrequentistCalculator(*data, *sbModel, *bModel); else if (calcType == 1) hypoCalc= new HybridCalculator(*data, *sbModel, *bModel); else if (calcType == 2) hypoCalc= new AsymptoticCalculator(*data, *sbModel, *bModel); if (calcType == 0) ((FrequentistCalculator*)hypoCalc)->SetToys(ntoys, ntoys/nToysRatio); if (calcType == 1) ((HybridCalculator*)hypoCalc)->SetToys(ntoys, ntoys/nToysRatio); if (calcType == 2 ) { if (testStatType == 3) ((AsymptoticCalculator*) hypoCalc)->SetOneSidedDiscovery(true); if (testStatType != 2 && testStatType != 3) Warning("StandardHypoTestDemo","Only the PL test statistic can be used with AsymptoticCalculator - use by default a two-sided PL"); } // check for nuisance prior pdf in case of nuisance parameters if (calcType == 1 && (bModel->GetNuisanceParameters() || sbModel->GetNuisanceParameters() )) { RooAbsPdf * nuisPdf = 0; if (nuisPriorName) nuisPdf = w->pdf(nuisPriorName); // use prior defined first in bModel (then in SbModel) if (!nuisPdf) { Info("StandardHypoTestDemo","No nuisance pdf given for the HybridCalculator - try to deduce pdf from the model"); if (bModel->GetPdf() && bModel->GetObservables() ) nuisPdf = RooStats::MakeNuisancePdf(*bModel,"nuisancePdf_bmodel"); else nuisPdf = RooStats::MakeNuisancePdf(*sbModel,"nuisancePdf_sbmodel"); } if (!nuisPdf ) { if (bModel->GetPriorPdf()) { nuisPdf = bModel->GetPriorPdf(); Info("StandardHypoTestDemo","No nuisance pdf given - try to use %s that is defined as a prior pdf in the B model",nuisPdf->GetName()); } else { Error("StandardHypoTestDemo","Cannnot run Hybrid calculator because no prior on the nuisance parameter is specified or can be derived"); return; } } assert(nuisPdf); Info("StandardHypoTestDemo","Using as nuisance Pdf ... " ); nuisPdf->Print(); const RooArgSet * nuisParams = (bModel->GetNuisanceParameters() ) ? bModel->GetNuisanceParameters() : sbModel->GetNuisanceParameters(); RooArgSet * np = nuisPdf->getObservables(*nuisParams); if (np->getSize() == 0) { Warning("StandardHypoTestDemo","Prior nuisance does not depend on nuisance parameters. They will be smeared in their full range"); } delete np; ((HybridCalculator*)hypoCalc)->ForcePriorNuisanceAlt(*nuisPdf); ((HybridCalculator*)hypoCalc)->ForcePriorNuisanceNull(*nuisPdf); } // hypoCalc->ForcePriorNuisanceAlt(*sbModel->GetPriorPdf()); // hypoCalc->ForcePriorNuisanceNull(*bModel->GetPriorPdf()); ToyMCSampler * sampler = (ToyMCSampler *)hypoCalc->GetTestStatSampler(); if (sampler && (calcType == 0 || calcType == 1) ) { // look if pdf is number counting or extended if (sbModel->GetPdf()->canBeExtended() ) { if (useNC) Warning("StandardHypoTestDemo","Pdf is extended: but number counting flag is set: ignore it "); } else { // for not extended pdf if (!useNC) { int nEvents = data->numEntries(); Info("StandardHypoTestDemo","Pdf is not extended: number of events to generate taken from observed data set is %d",nEvents); sampler->SetNEventsPerToy(nEvents); } else { Info("StandardHypoTestDemo","using a number counting pdf"); sampler->SetNEventsPerToy(1); } } if (data->isWeighted() && !generateBinned) { Info("StandardHypoTestDemo","Data set is weighted, nentries = %d and sum of weights = %8.1f but toy generation is unbinned - it would be faster to set generateBinned to true\n",data->numEntries(), data->sumEntries()); } if (generateBinned) sampler->SetGenerateBinned(generateBinned); // set the test statistic if (testStatType == 0) sampler->SetTestStatistic(slrts); if (testStatType == 1) sampler->SetTestStatistic(ropl); if (testStatType == 2 || testStatType == 3) sampler->SetTestStatistic(profll); } HypoTestResult * htr = hypoCalc->GetHypoTest(); htr->SetPValueIsRightTail(true); htr->SetBackgroundAsAlt(false); htr->Print(); // how to get meaningfull CLs at this point? delete sampler; delete slrts; delete ropl; delete profll; if (calcType != 2) { HypoTestPlot * plot = new HypoTestPlot(*htr,100); plot->SetLogYaxis(true); plot->Draw(); } else { std::cout << "Asymptotic results " << std::endl; } // look at expected significances // found median of S+B distribution if (calcType != 2) { SamplingDistribution * altDist = htr->GetAltDistribution(); HypoTestResult htExp("Expected Result"); htExp.Append(htr); // find quantiles in alt (S+B) distribution double p[5]; double q[5]; for (int i = 0; i < 5; ++i) { double sig = -2 + i; p[i] = ROOT::Math::normal_cdf(sig,1); } std::vector<double> values = altDist->GetSamplingDistribution(); TMath::Quantiles( values.size(), 5, &values[0], q, p, false); for (int i = 0; i < 5; ++i) { htExp.SetTestStatisticData( q[i] ); double sig = -2 + i; std::cout << " Expected p -value and significance at " << sig << " sigma = " << htExp.NullPValue() << " significance " << htExp.Significance() << " sigma " << std::endl; } } else { // case of asymptotic calculator for (int i = 0; i < 5; ++i) { double sig = -2 + i; // sigma is inverted here double pval = AsymptoticCalculator::GetExpectedPValues( htr->NullPValue(), htr->AlternatePValue(), -sig, false); std::cout << " Expected p -value and significance at " << sig << " sigma = " << pval << " significance " << ROOT::Math::normal_quantile_c(pval,1) << " sigma " << std::endl; } } }
result fit_toy(RooWorkspace* wspace, int n, const RooArgSet* globals) { RooRandom::randomGenerator()->SetSeed(0); // TFile f(filename); // RooWorkspace *wspace = (RooWorkspace*)f.Get("combined"); ModelConfig* model = (ModelConfig*)wspace->obj("ModelConfig"); RooAbsPdf* pdf; pdf = model->GetPdf(); RooAbsPdf* top_constraint = (RooAbsPdf*)wspace->obj("top_ratio_constraint"); RooAbsPdf* vv_constraint = (RooAbsPdf*)wspace->obj("vv_ratio_constraint"); RooAbsPdf* top_vv_constraint_sf = (RooAbsPdf*)wspace->obj("top_vv_ratio_sf_constraint"); RooAbsPdf* top_vv_constraint_of = (RooAbsPdf*)wspace->obj("top_vv_ratio_of_constraint"); // generate constraint global observables RooRealVar *nom_top_ratio = (RooRealVar*)wspace->obj("nom_top_ratio"); nom_top_ratio->setRange(0, 100); RooRealVar *nom_vv_ratio = (RooRealVar*)wspace->obj("nom_vv_ratio"); nom_vv_ratio->setRange(0,100); RooRealVar *nom_top_vv_ratio_sf = (RooRealVar*)wspace->obj("nom_top_vv_ratio_sf"); nom_top_vv_ratio_sf->setRange(0,100); RooRealVar *nom_top_vv_ratio_of = (RooRealVar*)wspace->obj("nom_top_vv_ratio_of"); nom_top_vv_ratio_of->setRange(0,100); RooDataSet *nom_top_generated = top_constraint->generateSimGlobal(RooArgSet(*nom_top_ratio), 1); nom_top_ratio->setVal(((RooRealVar*)nom_top_generated->get(0)->find("nom_top_ratio"))->getVal()); RooDataSet *nom_vv_generated = vv_constraint->generateSimGlobal(RooArgSet(*nom_vv_ratio), 1); nom_vv_ratio->setVal(((RooRealVar*)nom_vv_generated->get(0)->find("nom_vv_ratio"))->getVal()); RooDataSet *nom_top_vv_sf_generated = top_vv_constraint_sf->generateSimGlobal(RooArgSet(*nom_top_vv_ratio_sf), 1); nom_top_vv_ratio_sf->setVal(((RooRealVar*)nom_top_vv_sf_generated->get(0)->find("nom_top_vv_ratio_sf"))->getVal()); RooDataSet *nom_top_vv_of_generated = top_vv_constraint_of->generateSimGlobal(RooArgSet(*nom_top_vv_ratio_of), 1); nom_top_vv_ratio_of->setVal(((RooRealVar*)nom_top_vv_of_generated->get(0)->find("nom_top_vv_ratio_of"))->getVal()); NumEventsTestStat* dummy = new NumEventsTestStat(*pdf); ToyMCSampler* mc = new ToyMCSampler(*dummy, 1); mc->SetPdf(*pdf); mc->SetObservables(*model->GetObservables()); mc->SetGlobalObservables(*globals); mc->SetNuisanceParameters(*model->GetNuisanceParameters()); mc->SetParametersForTestStat(*model->GetParametersOfInterest()); mc->SetNEventsPerToy(n); RooArgSet constr; constr.add(*(model->GetNuisanceParameters())); RemoveConstantParameters(&constr); RooDataSet* toy_data = (RooDataSet*)mc->GenerateToyData(*const_cast<RooArgSet*>(model->GetSnapshot())); RooFitResult *res = pdf->fitTo(*toy_data, Constrain(constr), PrintLevel(0), Save(), Range("fitRange"), InitialHesse(), ExternalConstraints(RooArgSet(*top_constraint, *vv_constraint, *top_vv_constraint_sf, *top_vv_constraint_of))); result yield = get_results(wspace, res); yield.of.generated_sum.val = toy_data->sumEntries("(channelCat==channelCat::of) & (obs_x_of>120)"); yield.sf.generated_sum.val = toy_data->sumEntries("(channelCat==channelCat::sf) & (obs_x_sf>120)"); delete mc; delete dummy; // f.Close(); return yield; }
void PlotAll(TString wsname) { char* binLabels[19] = {"60","70","80","90","100","110","120","130","140","150","160","170","180","190","200","250","300","400","1000"}; //get the stuff from the workspace: TFile* file=TFile::Open(wsname); RooWorkspace* ws = (RooWorkspace*)file->Get("combined"); ModelConfig *mc = (ModelConfig*)ws->obj("ModelConfig"); RooAbsData *data = ws->data("obsData"); RooSimultaneous* simPdf=(RooSimultaneous*)(mc->GetPdf()); RooAbsReal* nll=simPdf->createNLL(*data); // FPT 0 ************************************** // EM channel RooCategory* chanCat = (RooCategory*) (&simPdf->indexCat()); TIterator* iterat = chanCat->typeIterator() ; RooCatType* ttype = (RooCatType*)iterat->Next(); RooAbsPdf *pdf_stateEM = simPdf->getPdf(ttype->GetName()) ; RooArgSet *obstmpEM = pdf_stateEM->getObservables( *mc->GetObservables() ) ; // get EM data RooAbsData *dataEM = data->reduce(Form("%s==%s::%s",chanCat->GetName(),chanCat->GetName(),ttype->GetName())); RooRealVar *obsEM = ((RooRealVar*) obstmpEM->first()); TString chanName1(ttype->GetName()); // create data histogram TH1* hdataEM = dataEM->createHistogram("Data "+chanName1,*obsEM); // set errors to gaussian for (int ib=0 ; ib<hdataEM->GetNbinsX()+1 ; ib++) hdataEM->SetBinError(ib, sqrt(hdataEM->GetBinContent(ib))); double EMnorm = pdf_stateEM->expectedEvents(*obsEM); //**************************** // ME channel ttype = (RooCatType*)iterat->Next(); RooAbsPdf* pdf_stateME = simPdf->getPdf(ttype->GetName()) ; RooArgSet* obstmpME = pdf_stateME->getObservables( *mc->GetObservables() ) ; // get ME data RooAbsData *dataME = data->reduce(Form("%s==%s::%s",chanCat->GetName(),chanCat->GetName(),ttype->GetName())); RooRealVar* obsME = ((RooRealVar*) obstmpME->first()); TString chanName2(ttype->GetName()); // create data histogram TH1* hdataME = dataME->createHistogram("Data "+chanName2,*obsME); // set errors to gaussian for (int ib=0 ; ib<hdataME->GetNbinsX()+1 ; ib++) hdataME->SetBinError(ib, sqrt(hdataME->GetBinContent(ib))); // get initial BG histogram //TH1* h_initial_BG_EM = pdf_stateEM->createHistogram("initial_BG_EM",*obsEM); //TH1* h_initial_BG_ME = pdf_stateME->createHistogram("initial_BG_ME",*obsME); double MEnorm = pdf_stateME->expectedEvents(*obsME); cout << "EM expected events = " << EMnorm << ", ME expected events = " << MEnorm << "." << endl; //h_initial_BG_EM->Scale(EMnorm); //h_initial_BG_ME->Scale(MEnorm); // get initial gammas int nbins = hdataEM->GetNbinsX(); double InitGamma[nbins]; for (int i=0; i<nbins; i++) { TString varname = "gamma_B0_l1pt0_bin_"+NumberToString(i); InitGamma[i] = ws->var(varname)->getVal(); cout << "initial gamma"+NumberToString(i)+" = " << InitGamma[i] << endl; } double InitFpt = ws->var("fl1pt_l1pt0")->getVal(); cout << "initial fpt_l1pt0 = " << InitFpt << endl; // DO THE GLOBAL FIT minimize(nll); // get final BG histograms TH1* h_final_BG_EM = pdf_stateEM->createHistogram("final_BG_EM",*obsEM); TH1* h_final_BG_ME = pdf_stateME->createHistogram("final_BG_ME",*obsME); h_final_BG_EM->Scale(EMnorm); h_final_BG_ME->Scale(MEnorm); // uncertainty bands TH1D* BuncertaintyEM = new TH1D("BuncertaintyEM","BuncertaintyEM",nbins,0,nbins); TH1D* BuncertaintyME = new TH1D("BuncertaintyME","BuncertaintyME",nbins,0,nbins); for (int i=1; i<=nbins; i++){ double sigbEM = h_final_BG_EM->GetBinError(i); double bEM = h_final_BG_EM->GetBinContent(i); BuncertaintyEM->SetBinError(i,sigbEM); BuncertaintyEM->SetBinContent(i,bEM); double sigbME = h_final_BG_ME->GetBinError(i); double bME = h_final_BG_ME->GetBinContent(i); BuncertaintyME->SetBinError(i,sigbME); BuncertaintyME->SetBinContent(i,bME); } //BuncertaintyEM->SetFillStyle(3004); BuncertaintyEM->SetFillColor(kGreen-9); BuncertaintyEM->SetLineColor(kBlack); BuncertaintyEM->SetLineStyle(2); //BuncertaintyME->SetFillStyle(3004); BuncertaintyME->SetFillColor(kBlue-9); BuncertaintyME->SetLineColor(kBlack); BuncertaintyME->SetLineStyle(2); // get gammas after fit double FinalGamma[nbins]; //TH1* h_initBG_times_gamma = (TH1*)h_initial_BG_EM->Clone("initBGEM_times_gamma"); for (int i=0; i<nbins; i++) { TString varname = "gamma_B0_l1pt0_bin_"+NumberToString(i); FinalGamma[i] = ws->var(varname)->getVal(); cout << "Final gamma in bin "+NumberToString(i)+" = " << FinalGamma[i] << endl; // h_initBG_times_gamma->SetBinContent(i+1,h_initial_BG_EM->GetBinContent(i+1)*FinalGamma[i]); } //double FinalFpt = ws->var("fl1pt_l1pt0")->getVal(); // get final alpha (pull) RooRealVar* alphaVar = ws->var("alpha_l1ptsys_l1pt0"); double alpha, alphaErr; if (alphaVar != NULL) { alpha = ws->var("alpha_l1ptsys_l1pt0")->getVal(); alphaErr = ws->var("alpha_l1ptsys_l1pt0")->getError(); } //FOR UNCONSTRAINED FPT - get final fpts double FinalFpt[5]; double FinalFptErr[5]; for (int k=0; k<5; k++){ TString varname = "fl1pt_l1pt"+NumberToString(k); FinalFpt[k] = ws->var(varname)->getVal(); FinalFptErr[k] = ws->var(varname)->getError(); cout << varname << " = " << FinalFpt[k] << " +- " << FinalFptErr[k] << endl; } // get POI value double mu = ws->var("mu_BR_htm")->getVal(); double muErr = ws->var("mu_BR_htm")->getError(); // Draw TCanvas* c1 = new TCanvas("BG and Data "+chanName1+" "+chanName2,"BG and Data "+chanName1+" "+chanName2,600,600); BuncertaintyEM->Draw("E3 sames"); BuncertaintyME->Draw("E3 sames"); //h_initial_BG_EM->SetLineColor(kGreen+2); h_initial_BG_EM->SetLineStyle(2); h_initial_BG_EM->Draw("sames"); hdataEM->SetLineColor(kGreen+2); hdataEM->SetMarkerStyle(20); hdataEM->SetMarkerColor(kGreen+2); hdataEM->Draw("e1 sames"); //h_initial_BG_ME->SetLineColor(kBlue); h_initial_BG_ME->SetLineStyle(2); h_initial_BG_ME->Draw("sames"); hdataME->SetLineColor(kBlue); hdataME->SetMarkerStyle(20); hdataME->SetMarkerColor(kBlue); hdataME->Draw("e1 sames"); h_final_BG_EM->SetLineColor(kGreen+2); h_final_BG_EM->SetLineWidth(2); h_final_BG_EM->Draw("sames"); h_final_BG_ME->SetLineColor(kBlue); h_final_BG_ME->SetLineWidth(2); h_final_BG_ME->Draw("sames"); TLegend* leg = new TLegend(0.5,0.45,0.85,0.65); leg->SetFillColor(kWhite); leg->SetBorderSize(1); leg->SetLineColor(0); //leg->SetTextFont(14); leg->SetTextSize(.03); leg->AddEntry(hdataME,"DATA #mue","lep"); leg->AddEntry(hdataEM,"DATA e#mu","lep"); //leg->AddEntry(h_initial_BG_ME,"Initial #mue PDF","l"); //leg->AddEntry(h_initial_BG_EM,"Initial e#mu PDF","l"); leg->AddEntry(h_final_BG_ME,"#mue PDF = #gamma_{i}B_{i} + #muS_{i}","l"); leg->AddEntry(h_final_BG_EM,"e#mu PDF = f(1+#alpha#sigma)(#gamma_{i}B_{i}+#muW_{i})","l"); leg->Draw(); cout << " ********************* Fit Values **************************** " << endl; if (alphaVar != NULL){cout << "alpha = " << alpha << " +- " << alphaErr << endl;} cout << "mu = " << mu << " +- " << muErr << endl; TString WriteDownAlphaValue; TString WriteDownMuValue; WriteDownAlphaValue = "Fpt0 = "; WriteDownMuValue = "#mu = "; WriteDownAlphaValue += Form("%4.4f",FinalFpt[0]); WriteDownAlphaValue += "#pm"; WriteDownAlphaValue += Form("%4.4f",FinalFptErr[0]); WriteDownMuValue += Form("%4.4f",mu); WriteDownMuValue += "#pm"; WriteDownMuValue += Form("%4.4f",muErr); TLatex *texl = new TLatex(12,25,WriteDownAlphaValue); texl->SetTextAlign(22); texl->SetTextSize(0.03); TLatex *texl2 = new TLatex(12,23,WriteDownMuValue); texl2->SetTextAlign(22); texl2->SetTextSize(0.03); texl->Draw(); texl2->Draw(); //FPT 1 *********************************** ttype = (RooCatType*)iterat->Next(); RooAbsPdf *pdf_stateEM1 = simPdf->getPdf(ttype->GetName()) ; RooArgSet *obstmpEM1 = pdf_stateEM1->getObservables( *mc->GetObservables() ) ; RooAbsData *dataEM1 = data->reduce(Form("%s==%s::%s",chanCat->GetName(),chanCat->GetName(),ttype->GetName())); RooRealVar *obsEM1 = ((RooRealVar*) obstmpEM1->first()); TString chanName11(ttype->GetName()); TH1* hdataEM1 = dataEM1->createHistogram("Data "+chanName11,*obsEM1); for (int ib=0 ; ib<hdataEM1->GetNbinsX()+1 ; ib++) hdataEM1->SetBinError(ib, sqrt(hdataEM1->GetBinContent(ib))); double EMnorm1 = pdf_stateEM1->expectedEvents(*obsEM1); ttype = (RooCatType*)iterat->Next(); RooAbsPdf* pdf_stateME1 = simPdf->getPdf(ttype->GetName()) ; RooArgSet* obstmpME1 = pdf_stateME1->getObservables( *mc->GetObservables() ) ; RooAbsData *dataME1 = data->reduce(Form("%s==%s::%s",chanCat->GetName(),chanCat->GetName(),ttype->GetName())); RooRealVar* obsME1 = ((RooRealVar*) obstmpME1->first()); TString chanName21(ttype->GetName()); TH1* hdataME1 = dataME1->createHistogram("Data "+chanName21,*obsME1); for (int ib=0 ; ib<hdataME1->GetNbinsX()+1 ; ib++) hdataME1->SetBinError(ib, sqrt(hdataME1->GetBinContent(ib))); double MEnorm1 = pdf_stateME1->expectedEvents(*obsME1); TH1* h_final_BG_EM1 = pdf_stateEM1->createHistogram("final_BG_EM1",*obsEM1); TH1* h_final_BG_ME1 = pdf_stateME1->createHistogram("final_BG_ME1",*obsME1); h_final_BG_EM1->Scale(EMnorm1); h_final_BG_ME1->Scale(MEnorm1); TH1D* BuncertaintyEM1 = new TH1D("BuncertaintyEM1","BuncertaintyEM1",nbins,0,nbins); TH1D* BuncertaintyME1 = new TH1D("BuncertaintyME1","BuncertaintyME1",nbins,0,nbins); for (int i=1; i<=nbins; i++){ double sigbEM = h_final_BG_EM1->GetBinError(i); double bEM = h_final_BG_EM1->GetBinContent(i); BuncertaintyEM1->SetBinError(i,sigbEM); BuncertaintyEM1->SetBinContent(i,bEM); double sigbME = h_final_BG_ME1->GetBinError(i); double bME = h_final_BG_ME1->GetBinContent(i); BuncertaintyME1->SetBinError(i,sigbME); BuncertaintyME1->SetBinContent(i,bME); } BuncertaintyEM1->SetFillColor(kGreen-9); BuncertaintyEM1->SetLineColor(kBlack); BuncertaintyEM1->SetLineStyle(2); BuncertaintyME1->SetFillColor(kBlue-9); BuncertaintyME1->SetLineColor(kBlack); BuncertaintyME1->SetLineStyle(2); double FinalGamma1[nbins]; for (int i=0; i<nbins; i++) { TString varname = "gamma_B0_l1pt1_bin_"+NumberToString(i); FinalGamma1[i] = ws->var(varname)->getVal(); cout << "Final gamma in bin "+NumberToString(i)+" = " << FinalGamma1[i] << endl; } TCanvas* c2 = new TCanvas("BG and Data "+chanName11+" "+chanName21,"BG and Data "+chanName11+" "+chanName21,600,600); BuncertaintyEM1->Draw("E3 sames"); BuncertaintyME1->Draw("E3 sames"); hdataEM1->SetLineColor(kGreen+2); hdataEM1->SetMarkerStyle(20); hdataEM1->SetMarkerColor(kGreen+2); hdataEM1->Draw("e1 sames"); hdataME1->SetLineColor(kBlue); hdataME1->SetMarkerStyle(20); hdataME1->SetMarkerColor(kBlue); hdataME1->Draw("e1 sames"); h_final_BG_EM1->SetLineColor(kGreen+2); h_final_BG_EM1->SetLineWidth(2); h_final_BG_EM1->Draw("sames"); h_final_BG_ME1->SetLineColor(kBlue); h_final_BG_ME1->SetLineWidth(2); h_final_BG_ME1->Draw("sames"); leg->Draw(); cout << " ********************* Fit Values **************************** " << endl; cout << "mu = " << mu << " +- " << muErr << endl; TString WriteDownAlphaValue1; WriteDownAlphaValue1 = "Fpt1 = "; WriteDownAlphaValue1 += Form("%4.4f",FinalFpt[1]); WriteDownAlphaValue1 += "#pm"; WriteDownAlphaValue1 += Form("%4.4f",FinalFptErr[1]); TLatex *texl11 = new TLatex(12,25,WriteDownAlphaValue1); texl11->SetTextAlign(22); texl11->SetTextSize(0.03); texl11->Draw(); texl2->Draw(); }
void StandardHistFactoryPlotsWithCategories(const char* infile = "", const char* workspaceName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData"){ double nSigmaToVary=5.; double muVal=0; bool doFit=false; // ------------------------------------------------------- // First part is just to access a user-defined file // or create the standard example file if it doesn't exist const char* filename = ""; if (!strcmp(infile,"")) { filename = "results/example_combined_GaussExample_model.root"; bool fileExist = !gSystem->AccessPathName(filename); // note opposite return code // if file does not exists generate with histfactory if (!fileExist) { #ifdef _WIN32 cout << "HistFactory file cannot be generated on Windows - exit" << endl; return; #endif // Normally this would be run on the command line cout <<"will run standard hist2workspace example"<<endl; gROOT->ProcessLine(".! prepareHistFactory ."); gROOT->ProcessLine(".! hist2workspace config/example.xml"); cout <<"\n\n---------------------"<<endl; cout <<"Done creating example input"<<endl; cout <<"---------------------\n\n"<<endl; } } else filename = infile; // Try to open the file TFile *file = TFile::Open(filename); // if input file was specified byt not found, quit if(!file ){ cout <<"StandardRooStatsDemoMacro: Input file " << filename << " is not found" << endl; return; } // ------------------------------------------------------- // Tutorial starts here // ------------------------------------------------------- // get the workspace out of the file RooWorkspace* w = (RooWorkspace*) file->Get(workspaceName); if(!w){ cout <<"workspace not found" << endl; return; } // get the modelConfig out of the file ModelConfig* mc = (ModelConfig*) w->obj(modelConfigName); // get the modelConfig out of the file RooAbsData* data = w->data(dataName); // make sure ingredients are found if(!data || !mc){ w->Print(); cout << "data or ModelConfig was not found" <<endl; return; } // ------------------------------------------------------- // now use the profile inspector RooRealVar* obs = (RooRealVar*)mc->GetObservables()->first(); TList* list = new TList(); RooRealVar * firstPOI = dynamic_cast<RooRealVar*>(mc->GetParametersOfInterest()->first()); firstPOI->setVal(muVal); // firstPOI->setConstant(); if(doFit){ mc->GetPdf()->fitTo(*data); } // ------------------------------------------------------- mc->GetNuisanceParameters()->Print("v"); int nPlotsMax = 1000; cout <<" check expectedData by category"<<endl; RooDataSet* simData=NULL; RooSimultaneous* simPdf = NULL; if(strcmp(mc->GetPdf()->ClassName(),"RooSimultaneous")==0){ cout <<"Is a simultaneous PDF"<<endl; simPdf = (RooSimultaneous *)(mc->GetPdf()); } else { cout <<"Is not a simultaneous PDF"<<endl; } if(doFit) { RooCategory* channelCat = (RooCategory*) (&simPdf->indexCat()); TIterator* iter = channelCat->typeIterator() ; RooCatType* tt = NULL; tt=(RooCatType*) iter->Next(); RooAbsPdf* pdftmp = ((RooSimultaneous*)mc->GetPdf())->getPdf(tt->GetName()) ; RooArgSet* obstmp = pdftmp->getObservables(*mc->GetObservables()) ; obs = ((RooRealVar*)obstmp->first()); RooPlot* frame = obs->frame(); cout <<Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())<<endl; cout << tt->GetName() << " " << channelCat->getLabel() <<endl; data->plotOn(frame,MarkerSize(1),Cut(Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())),DataError(RooAbsData::None)); Double_t normCount = data->sumEntries(Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())) ; pdftmp->plotOn(frame,LineWidth(2.),Normalization(normCount,RooAbsReal::NumEvent)) ; frame->Draw(); cout <<"expected events = " << mc->GetPdf()->expectedEvents(*data->get()) <<endl; return; } int nPlots=0; if(!simPdf){ TIterator* it = mc->GetNuisanceParameters()->createIterator(); RooRealVar* var = NULL; while( (var = (RooRealVar*) it->Next()) != NULL){ RooPlot* frame = obs->frame(); frame->SetYTitle(var->GetName()); data->plotOn(frame,MarkerSize(1)); var->setVal(0); mc->GetPdf()->plotOn(frame,LineWidth(1.)); var->setVal(1); mc->GetPdf()->plotOn(frame,LineColor(kRed),LineStyle(kDashed),LineWidth(1)); var->setVal(-1); mc->GetPdf()->plotOn(frame,LineColor(kGreen),LineStyle(kDashed),LineWidth(1)); list->Add(frame); var->setVal(0); } } else { RooCategory* channelCat = (RooCategory*) (&simPdf->indexCat()); // TIterator* iter = simPdf->indexCat().typeIterator() ; TIterator* iter = channelCat->typeIterator() ; RooCatType* tt = NULL; while(nPlots<nPlotsMax && (tt=(RooCatType*) iter->Next())) { cout << "on type " << tt->GetName() << " " << endl; // Get pdf associated with state from simpdf RooAbsPdf* pdftmp = simPdf->getPdf(tt->GetName()) ; // Generate observables defined by the pdf associated with this state RooArgSet* obstmp = pdftmp->getObservables(*mc->GetObservables()) ; // obstmp->Print(); obs = ((RooRealVar*)obstmp->first()); TIterator* it = mc->GetNuisanceParameters()->createIterator(); RooRealVar* var = NULL; while(nPlots<nPlotsMax && (var = (RooRealVar*) it->Next())){ TCanvas* c2 = new TCanvas("c2"); RooPlot* frame = obs->frame(); frame->SetName(Form("frame%d",nPlots)); frame->SetYTitle(var->GetName()); cout <<Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())<<endl; cout << tt->GetName() << " " << channelCat->getLabel() <<endl; data->plotOn(frame,MarkerSize(1),Cut(Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())),DataError(RooAbsData::None)); Double_t normCount = data->sumEntries(Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())) ; if(strcmp(var->GetName(),"Lumi")==0){ cout <<"working on lumi"<<endl; var->setVal(w->var("nominalLumi")->getVal()); var->Print(); } else{ var->setVal(0); } // w->allVars().Print("v"); // mc->GetNuisanceParameters()->Print("v"); // pdftmp->plotOn(frame,LineWidth(2.)); // mc->GetPdf()->plotOn(frame,LineWidth(2.),Slice(*channelCat,tt->GetName()),ProjWData(*data)); //pdftmp->plotOn(frame,LineWidth(2.),Slice(*channelCat,tt->GetName()),ProjWData(*data)); normCount = pdftmp->expectedEvents(*obs); pdftmp->plotOn(frame,LineWidth(2.),Normalization(normCount,RooAbsReal::NumEvent)) ; if(strcmp(var->GetName(),"Lumi")==0){ cout <<"working on lumi"<<endl; var->setVal(w->var("nominalLumi")->getVal()+0.05); var->Print(); } else{ var->setVal(nSigmaToVary); } // pdftmp->plotOn(frame,LineColor(kRed),LineStyle(kDashed),LineWidth(2)); // mc->GetPdf()->plotOn(frame,LineColor(kRed),LineStyle(kDashed),LineWidth(2.),Slice(*channelCat,tt->GetName()),ProjWData(*data)); //pdftmp->plotOn(frame,LineColor(kRed),LineStyle(kDashed),LineWidth(2.),Slice(*channelCat,tt->GetName()),ProjWData(*data)); normCount = pdftmp->expectedEvents(*obs); pdftmp->plotOn(frame,LineWidth(2.),LineColor(kRed),LineStyle(kDashed),Normalization(normCount,RooAbsReal::NumEvent)) ; if(strcmp(var->GetName(),"Lumi")==0){ cout <<"working on lumi"<<endl; var->setVal(w->var("nominalLumi")->getVal()-0.05); var->Print(); } else{ var->setVal(-nSigmaToVary); } // pdftmp->plotOn(frame,LineColor(kGreen),LineStyle(kDashed),LineWidth(2)); // mc->GetPdf()->plotOn(frame,LineColor(kGreen),LineStyle(kDashed),LineWidth(2),Slice(*channelCat,tt->GetName()),ProjWData(*data)); //pdftmp->plotOn(frame,LineColor(kGreen),LineStyle(kDashed),LineWidth(2),Slice(*channelCat,tt->GetName()),ProjWData(*data)); normCount = pdftmp->expectedEvents(*obs); pdftmp->plotOn(frame,LineWidth(2.),LineColor(kGreen),LineStyle(kDashed),Normalization(normCount,RooAbsReal::NumEvent)) ; // set them back to normal if(strcmp(var->GetName(),"Lumi")==0){ cout <<"working on lumi"<<endl; var->setVal(w->var("nominalLumi")->getVal()); var->Print(); } else{ var->setVal(0); } list->Add(frame); // quit making plots ++nPlots; frame->Draw(); c2->SaveAs(Form("%s_%s_%s.pdf",tt->GetName(),obs->GetName(),var->GetName())); delete c2; } } } // ------------------------------------------------------- // now make plots TCanvas* c1 = new TCanvas("c1","ProfileInspectorDemo",800,200); if(list->GetSize()>4){ double n = list->GetSize(); int nx = (int)sqrt(n) ; int ny = TMath::CeilNint(n/nx); nx = TMath::CeilNint( sqrt(n) ); c1->Divide(ny,nx); } else c1->Divide(list->GetSize()); for(int i=0; i<list->GetSize(); ++i){ c1->cd(i+1); list->At(i)->Draw(); } }
void StandardTestStatDistributionDemo(const char* infile = "", const char* workspaceName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData"){ // the number of toy MC used to generate the distribution int nToyMC = 1000; // The parameter below is needed for asymptotic distribution to be chi-square, // but set to false if your model is not numerically stable if mu<0 bool allowNegativeMu=true; ///////////////////////////////////////////////////////////// // First part is just to access a user-defined file // or create the standard example file if it doesn't exist //////////////////////////////////////////////////////////// const char* filename = ""; if (!strcmp(infile,"")) { filename = "results/example_combined_GaussExample_model.root"; bool fileExist = !gSystem->AccessPathName(filename); // note opposite return code // if file does not exists generate with histfactory if (!fileExist) { #ifdef _WIN32 cout << "HistFactory file cannot be generated on Windows - exit" << endl; return; #endif // Normally this would be run on the command line cout <<"will run standard hist2workspace example"<<endl; gROOT->ProcessLine(".! prepareHistFactory ."); gROOT->ProcessLine(".! hist2workspace config/example.xml"); cout <<"\n\n---------------------"<<endl; cout <<"Done creating example input"<<endl; cout <<"---------------------\n\n"<<endl; } } else filename = infile; // Try to open the file TFile *file = TFile::Open(filename); // if input file was specified byt not found, quit if(!file ){ cout <<"StandardRooStatsDemoMacro: Input file " << filename << " is not found" << endl; return; } ///////////////////////////////////////////////////////////// // Now get the data and workspace //////////////////////////////////////////////////////////// // get the workspace out of the file RooWorkspace* w = (RooWorkspace*) file->Get(workspaceName); if(!w){ cout <<"workspace not found" << endl; return; } // get the modelConfig out of the file ModelConfig* mc = (ModelConfig*) w->obj(modelConfigName); // get the modelConfig out of the file RooAbsData* data = w->data(dataName); // make sure ingredients are found if(!data || !mc){ w->Print(); cout << "data or ModelConfig was not found" <<endl; return; } mc->Print(); ///////////////////////////////////////////////////////////// // Now find the upper limit based on the asymptotic results //////////////////////////////////////////////////////////// RooRealVar* firstPOI = (RooRealVar*) mc->GetParametersOfInterest()->first(); ProfileLikelihoodCalculator plc(*data,*mc); LikelihoodInterval* interval = plc.GetInterval(); double plcUpperLimit = interval->UpperLimit(*firstPOI); delete interval; cout << "\n\n--------------------------------------"<<endl; cout <<"Will generate sampling distribution at " << firstPOI->GetName() << " = " << plcUpperLimit <<endl; int nPOI = mc->GetParametersOfInterest()->getSize(); if(nPOI>1){ cout <<"not sure what to do with other parameters of interest, but here are their values"<<endl; mc->GetParametersOfInterest()->Print("v"); } ///////////////////////////////////////////// // create thte test stat sampler ProfileLikelihoodTestStat ts(*mc->GetPdf()); // to avoid effects from boundary and simplify asymptotic comparison, set min=-max if(allowNegativeMu) firstPOI->setMin(-1*firstPOI->getMax()); // temporary RooArgSet RooArgSet poi; poi.add(*mc->GetParametersOfInterest()); // create and configure the ToyMCSampler ToyMCSampler sampler(ts,nToyMC); sampler.SetPdf(*mc->GetPdf()); sampler.SetObservables(*mc->GetObservables()); sampler.SetGlobalObservables(*mc->GetGlobalObservables()); if(!mc->GetPdf()->canBeExtended() && (data->numEntries()==1)){ cout << "tell it to use 1 event"<<endl; sampler.SetNEventsPerToy(1); } firstPOI->setVal(plcUpperLimit); // set POI value for generation sampler.SetParametersForTestStat(*mc->GetParametersOfInterest()); // set POI value for evaluation if (useProof) { ProofConfig pc(*w, nworkers, "",false); sampler.SetProofConfig(&pc); // enable proof } firstPOI->setVal(plcUpperLimit); RooArgSet allParameters; allParameters.add(*mc->GetParametersOfInterest()); allParameters.add(*mc->GetNuisanceParameters()); allParameters.Print("v"); SamplingDistribution* sampDist = sampler.GetSamplingDistribution(allParameters); SamplingDistPlot plot; plot.AddSamplingDistribution(sampDist); plot.GetTH1F(sampDist)->GetYaxis()->SetTitle(Form("f(-log #lambda(#mu=%.2f) | #mu=%.2f)",plcUpperLimit,plcUpperLimit)); plot.SetAxisTitle(Form("-log #lambda(#mu=%.2f)",plcUpperLimit)); TCanvas* c1 = new TCanvas("c1"); c1->SetLogy(); plot.Draw(); double min = plot.GetTH1F(sampDist)->GetXaxis()->GetXmin(); double max = plot.GetTH1F(sampDist)->GetXaxis()->GetXmax(); TF1* f = new TF1("f",Form("2*ROOT::Math::chisquared_pdf(2*x,%d,0)",nPOI),min,max); f->Draw("same"); c1->SaveAs("standard_test_stat_distribution.pdf"); }