45 Bool_t RooStats::ProfileLikelihoodTestStat::fgAlwaysReuseNll = kTRUE ;
47 void RooStats::ProfileLikelihoodTestStat::SetAlwaysReuseNLL(Bool_t flag) { fgAlwaysReuseNll = flag ; }
56 Double_t RooStats::ProfileLikelihoodTestStat::EvaluateProfileLikelihood(
int type, RooAbsData& data, RooArgSet& paramsOfInterest) {
58 if( fDetailedOutputEnabled && fDetailedOutput ) {
59 delete fDetailedOutput;
62 if( fDetailedOutputEnabled && !fDetailedOutput ) {
63 fDetailedOutput =
new RooArgSet();
71 double initial_mu_value = 0;
72 RooRealVar* firstPOI =
dynamic_cast<RooRealVar*
>( paramsOfInterest.first());
73 if (firstPOI) initial_mu_value = firstPOI->getVal();
75 if (fPrintLevel > 1) {
76 cout <<
"POIs: " << endl;
77 paramsOfInterest.Print(
"v");
80 RooFit::MsgLevel msglevel = RooMsgService::instance().globalKillBelow();
81 if (fPrintLevel < 3) RooMsgService::instance().setGlobalKillBelow(RooFit::FATAL);
84 Bool_t reuse=(fReuseNll || fgAlwaysReuseNll) ;
86 Bool_t created(kFALSE) ;
87 if (!reuse || fNll==0) {
88 RooArgSet* allParams = fPdf->getParameters(data);
89 RooStats::RemoveConstantParameters(allParams);
92 fNll = fPdf->createNLL(data, RooFit::CloneData(kFALSE),RooFit::Constrain(*allParams),
93 RooFit::GlobalObservables(fGlobalObs), RooFit::ConditionalObservables(fConditionalObs), RooFit::Offset(fLOffset));
95 if (fPrintLevel > 0 && fLOffset) cout <<
"ProfileLikelihoodTestStat::Evaluate - Use Offset in creating NLL " << endl ;
99 if (fPrintLevel > 1) cout <<
"creating NLL " << fNll <<
" with data = " << &data << endl ;
101 if (reuse && !created) {
102 if (fPrintLevel > 1) cout <<
"reusing NLL " << fNll <<
" new data = " << &data << endl ;
103 fNll->setData(data,kFALSE) ;
106 if (fPrintLevel > 1 && data.numEntries() == 1) {
107 std::cout <<
"Data set used is: ";
108 RooStats::PrintListContent(*data.get(0), std::cout);
113 RooArgSet* attachedSet = fNll->getVariables();
115 *attachedSet = paramsOfInterest;
116 RooArgSet* origAttachedSet = (RooArgSet*) attachedSet->snapshot();
125 RooArgSet* snap = (RooArgSet*)paramsOfInterest.snapshot();
128 double createTime = tsw.CpuTime();
133 double fit_favored_mu = 0;
135 RooArgSet * detOutput = 0;
138 fNll->clearEvalErrorLog();
139 if (fPrintLevel>1) std::cout <<
"Do unconditional fit" << std::endl;
140 RooFitResult* result = GetMinNLL();
142 uncondML = result->minNll();
143 statusD = result->status();
146 if (firstPOI) fit_favored_mu = attachedSet->getRealValue(firstPOI->GetName()) ;
149 if( fDetailedOutputEnabled ) {
150 detOutput = DetailedOutputAggregator::GetAsArgSet(result,
"fitUncond_", fDetailedOutputWithErrorsAndPulls);
151 fDetailedOutput->addOwned(*detOutput);
157 return TMath::SignalingNaN();
161 double fitTime1 = tsw.CpuTime();
169 bool doConditionalFit = (type != 1);
172 if (!fSigned && type==0 &&
173 ((fLimitType==oneSided && fit_favored_mu >= initial_mu_value) ||
174 (fLimitType==oneSidedDiscovery && fit_favored_mu <= initial_mu_value))) {
175 doConditionalFit =
false;
179 if (doConditionalFit) {
181 if (fPrintLevel>1) std::cout <<
"Do conditional fit " << std::endl;
185 *attachedSet = *snap;
189 RooLinkedListIter it = paramsOfInterest.iterator();
190 RooRealVar* tmpPar = NULL, *tmpParA=NULL;
191 while((tmpPar = (RooRealVar*)it.Next())){
192 tmpParA =
dynamic_cast<RooRealVar*
>( attachedSet->find(tmpPar->GetName()));
193 if (tmpParA) tmpParA->setConstant();
198 RooArgSet allParams(*attachedSet);
199 RooStats::RemoveConstantParameters(&allParams);
203 if (allParams.getSize() == 0 ) {
205 if (fLOffset) RooAbsReal::setHideOffset(
false);
206 condML = fNll->getVal();
207 if (fLOffset) RooAbsReal::setHideOffset(
true);
210 fNll->clearEvalErrorLog();
211 RooFitResult* result = GetMinNLL();
213 condML = result->minNll();
214 statusN = result->status();
215 if( fDetailedOutputEnabled ) {
216 detOutput = DetailedOutputAggregator::GetAsArgSet(result,
"fitCond_", fDetailedOutputWithErrorsAndPulls);
217 fDetailedOutput->addOwned(*detOutput);
223 return TMath::SignalingNaN();
230 double fitTime2 = tsw.CpuTime();
237 RooAbsReal::setHideOffset(kFALSE) ;
238 pll = fNll->getVal();
249 pll = condML-uncondML;
253 if (fPrintLevel > 0) std::cout <<
"pll is negative - setting it to zero " << std::endl;
256 if (fLimitType==oneSidedDiscovery ? (fit_favored_mu < initial_mu_value)
257 : (fit_favored_mu > initial_mu_value))
262 if (fPrintLevel > 0) {
263 std::cout <<
"EvaluateProfileLikelihood - ";
265 std::cout <<
"mu hat = " << fit_favored_mu <<
", uncond ML = " << uncondML;
267 std::cout <<
", cond ML = " << condML;
269 std::cout <<
" pll = " << pll;
270 std::cout <<
" time (create/fit1/2) " << createTime <<
" , " << fitTime1 <<
" , " << fitTime2
276 *attachedSet = *origAttachedSet;
279 delete origAttachedSet;
287 RooMsgService::instance().setGlobalKillBelow(msglevel);
289 if(statusN!=0 || statusD!=0) {
300 RooFitResult* RooStats::ProfileLikelihoodTestStat::GetMinNLL() {
302 const auto& config = GetGlobalRooStatsConfig();
303 RooMinimizer minim(*fNll);
304 minim.setStrategy(fStrategy);
305 minim.setEvalErrorWall(config.useEvalErrorWall);
307 int level = (fPrintLevel == 0) ? -1 : fPrintLevel -2;
308 minim.setPrintLevel(level);
309 minim.setEps(fTolerance);
311 minim.optimizeConst(2);
312 TString minimizer = fMinimizer;
313 TString algorithm = ROOT::Math::MinimizerOptions::DefaultMinimizerAlgo();
314 if (algorithm ==
"Migrad") algorithm =
"Minimize";
316 for (
int tries = 1, maxtries = 4; tries <= maxtries; ++tries) {
317 status = minim.minimize(minimizer,algorithm);
318 if (status%1000 == 0) {
320 }
else if (tries < maxtries) {
321 cout <<
" ----> Doing a re-scan first" << endl;
322 minim.minimize(minimizer,
"Scan");
324 if (fStrategy == 0 ) {
325 cout <<
" ----> trying with strategy = 1" << endl;;
326 minim.setStrategy(1);
332 cout <<
" ----> trying with improve" << endl;;
333 minimizer =
"Minuit";
334 algorithm =
"migradimproved";