#include "RooStats/ProfileLikelihoodTestStat.h"
#include "RooFitResult.h"
#include "RooPullVar.h"
#include "RooStats/DetailedOutputAggregator.h"
#include "RooProfileLL.h"
#include "RooNLLVar.h"
#include "RooMsgService.h"
#include "RooMinimizer.h"
#include "RooArgSet.h"
#include "RooDataSet.h"
#include "TStopwatch.h"
#include "RooStats/RooStatsUtils.h"
using namespace std;
Bool_t RooStats::ProfileLikelihoodTestStat::fgAlwaysReuseNll = kTRUE ;
void RooStats::ProfileLikelihoodTestStat::SetAlwaysReuseNLL(Bool_t flag) { fgAlwaysReuseNll = flag ; }
Double_t RooStats::ProfileLikelihoodTestStat::EvaluateProfileLikelihood(int type, RooAbsData& data, RooArgSet& paramsOfInterest) {
if( fDetailedOutputEnabled && fDetailedOutput ) {
delete fDetailedOutput;
fDetailedOutput = 0;
}
if( fDetailedOutputEnabled && !fDetailedOutput ) {
fDetailedOutput = new RooArgSet();
}
TStopwatch tsw;
tsw.Start();
double initial_mu_value = 0;
RooRealVar* firstPOI = dynamic_cast<RooRealVar*>( paramsOfInterest.first());
if (firstPOI) initial_mu_value = firstPOI->getVal();
if (fPrintLevel > 1) {
cout << "POIs: " << endl;
paramsOfInterest.Print("v");
}
RooFit::MsgLevel msglevel = RooMsgService::instance().globalKillBelow();
if (fPrintLevel < 3) RooMsgService::instance().setGlobalKillBelow(RooFit::FATAL);
Bool_t reuse=(fReuseNll || fgAlwaysReuseNll) ;
Bool_t created(kFALSE) ;
if (!reuse || fNll==0) {
RooArgSet* allParams = fPdf->getParameters(data);
RooStats::RemoveConstantParameters(allParams);
fNll = fPdf->createNLL(data, RooFit::CloneData(kFALSE),RooFit::Constrain(*allParams),RooFit::ConditionalObservables(fConditionalObs), RooFit::Offset(fLOffset));
if (fPrintLevel > 0 && fLOffset) cout << "ProfileLikelihoodTestStat::Evaluate - Use Offset in creating NLL " << endl ;
created = kTRUE ;
delete allParams;
if (fPrintLevel > 1) cout << "creating NLL " << fNll << " with data = " << &data << endl ;
}
if (reuse && !created) {
if (fPrintLevel > 1) cout << "reusing NLL " << fNll << " new data = " << &data << endl ;
fNll->setData(data,kFALSE) ;
}
if (fPrintLevel > 1 && data.numEntries() == 1) {
std::cout << "Data set used is: ";
RooStats::PrintListContent(*data.get(0), std::cout);
}
RooArgSet* attachedSet = fNll->getVariables();
*attachedSet = paramsOfInterest;
RooArgSet* origAttachedSet = (RooArgSet*) attachedSet->snapshot();
RooArgSet* snap = (RooArgSet*)paramsOfInterest.snapshot();
tsw.Stop();
double createTime = tsw.CpuTime();
tsw.Start();
double uncondML = 0;
double fit_favored_mu = 0;
int statusD = 0;
RooArgSet * detOutput = 0;
if (type != 2) {
fNll->clearEvalErrorLog();
if (fPrintLevel>1) std::cout << "Do unconditional fit" << std::endl;
RooFitResult* result = GetMinNLL();
if (result) {
uncondML = result->minNll();
statusD = result->status();
if (firstPOI) fit_favored_mu = attachedSet->getRealValue(firstPOI->GetName()) ;
if( fDetailedOutputEnabled ) {
detOutput = DetailedOutputAggregator::GetAsArgSet(result, "fitUncond_", fDetailedOutputWithErrorsAndPulls);
fDetailedOutput->addOwned(*detOutput);
delete detOutput;
}
delete result;
}
else {
return TMath::SignalingNaN();
}
}
tsw.Stop();
double fitTime1 = tsw.CpuTime();
int statusN = 0;
tsw.Start();
double condML = 0;
bool doConditionalFit = (type != 1);
if (!fSigned && type==0 &&
((fLimitType==oneSided && fit_favored_mu >= initial_mu_value) ||
(fLimitType==oneSidedDiscovery && fit_favored_mu <= initial_mu_value))) {
doConditionalFit = false;
condML = uncondML;
}
if (doConditionalFit) {
if (fPrintLevel>1) std::cout << "Do conditional fit " << std::endl;
*attachedSet = *snap;
RooLinkedListIter it = paramsOfInterest.iterator();
RooRealVar* tmpPar = NULL, *tmpParA=NULL;
while((tmpPar = (RooRealVar*)it.Next())){
tmpParA = dynamic_cast<RooRealVar*>( attachedSet->find(tmpPar->GetName()));
if (tmpParA) tmpParA->setConstant();
}
RooArgSet allParams(*attachedSet);
RooStats::RemoveConstantParameters(&allParams);
if (allParams.getSize() == 0 ) {
if (fLOffset) RooAbsReal::setHideOffset(false);
condML = fNll->getVal();
if (fLOffset) RooAbsReal::setHideOffset(true);
}
else {
fNll->clearEvalErrorLog();
RooFitResult* result = GetMinNLL();
if (result) {
condML = result->minNll();
statusN = result->status();
if( fDetailedOutputEnabled ) {
detOutput = DetailedOutputAggregator::GetAsArgSet(result, "fitCond_", fDetailedOutputWithErrorsAndPulls);
fDetailedOutput->addOwned(*detOutput);
delete detOutput;
}
delete result;
}
else {
return TMath::SignalingNaN();
}
}
}
tsw.Stop();
double fitTime2 = tsw.CpuTime();
double pll = 0;
if (type != 0) {
if (fLOffset) {
RooAbsReal::setHideOffset(kFALSE) ;
pll = fNll->getVal();
}
else {
if (type == 1)
pll = uncondML;
else if (type == 2)
pll = condML;
}
}
else {
pll = condML-uncondML;
if (fSigned) {
if (pll<0.0) {
if (fPrintLevel > 0) std::cout << "pll is negative - setting it to zero " << std::endl;
pll = 0.0;
}
if (fLimitType==oneSidedDiscovery ? (fit_favored_mu < initial_mu_value)
: (fit_favored_mu > initial_mu_value))
pll = -pll;
}
}
if (fPrintLevel > 0) {
std::cout << "EvaluateProfileLikelihood - ";
if (type <= 1)
std::cout << "mu hat = " << fit_favored_mu << ", uncond ML = " << uncondML;
if (type != 1)
std::cout << ", cond ML = " << condML;
if (type == 0)
std::cout << " pll = " << pll;
std::cout << " time (create/fit1/2) " << createTime << " , " << fitTime1 << " , " << fitTime2
<< std::endl;
}
*attachedSet = *origAttachedSet;
delete attachedSet;
delete origAttachedSet;
delete snap;
if (!reuse) {
delete fNll;
fNll = 0;
}
RooMsgService::instance().setGlobalKillBelow(msglevel);
if(statusN!=0 || statusD!=0) {
return -1;
}
return pll;
}
RooFitResult* RooStats::ProfileLikelihoodTestStat::GetMinNLL() {
RooMinimizer minim(*fNll);
minim.setStrategy(fStrategy);
int level = (fPrintLevel == 0) ? -1 : fPrintLevel -2;
minim.setPrintLevel(level);
minim.setEps(fTolerance);
minim.optimizeConst(2);
TString minimizer = fMinimizer;
TString algorithm = ROOT::Math::MinimizerOptions::DefaultMinimizerAlgo();
if (algorithm == "Migrad") algorithm = "Minimize";
int status;
for (int tries = 1, maxtries = 4; tries <= maxtries; ++tries) {
status = minim.minimize(minimizer,algorithm);
if (status%1000 == 0) {
break;
} else if (tries < maxtries) {
cout << " ----> Doing a re-scan first" << endl;
minim.minimize(minimizer,"Scan");
if (tries == 2) {
if (fStrategy == 0 ) {
cout << " ----> trying with strategy = 1" << endl;;
minim.setStrategy(1);
}
else
tries++;
}
if (tries == 3) {
cout << " ----> trying with improve" << endl;;
minimizer = "Minuit";
algorithm = "migradimproved";
}
}
}
return minim.save();
}
ProfileLikelihoodTestStat.cxx:1 ProfileLikelihoodTestStat.cxx:2 ProfileLikelihoodTestStat.cxx:3 ProfileLikelihoodTestStat.cxx:4 ProfileLikelihoodTestStat.cxx:5 ProfileLikelihoodTestStat.cxx:6 ProfileLikelihoodTestStat.cxx:7 ProfileLikelihoodTestStat.cxx:8 ProfileLikelihoodTestStat.cxx:9 ProfileLikelihoodTestStat.cxx:10 ProfileLikelihoodTestStat.cxx:11 ProfileLikelihoodTestStat.cxx:12 ProfileLikelihoodTestStat.cxx:13 ProfileLikelihoodTestStat.cxx:14 ProfileLikelihoodTestStat.cxx:15 ProfileLikelihoodTestStat.cxx:16 ProfileLikelihoodTestStat.cxx:17 ProfileLikelihoodTestStat.cxx:18 ProfileLikelihoodTestStat.cxx:19 ProfileLikelihoodTestStat.cxx:20 ProfileLikelihoodTestStat.cxx:21 ProfileLikelihoodTestStat.cxx:22 ProfileLikelihoodTestStat.cxx:23 ProfileLikelihoodTestStat.cxx:24 ProfileLikelihoodTestStat.cxx:25 ProfileLikelihoodTestStat.cxx:26 ProfileLikelihoodTestStat.cxx:27 ProfileLikelihoodTestStat.cxx:28 ProfileLikelihoodTestStat.cxx:29 ProfileLikelihoodTestStat.cxx:30 ProfileLikelihoodTestStat.cxx:31 ProfileLikelihoodTestStat.cxx:32 ProfileLikelihoodTestStat.cxx:33 ProfileLikelihoodTestStat.cxx:34 ProfileLikelihoodTestStat.cxx:35 ProfileLikelihoodTestStat.cxx:36 ProfileLikelihoodTestStat.cxx:37 ProfileLikelihoodTestStat.cxx:38 ProfileLikelihoodTestStat.cxx:39 ProfileLikelihoodTestStat.cxx:40 ProfileLikelihoodTestStat.cxx:41 ProfileLikelihoodTestStat.cxx:42 ProfileLikelihoodTestStat.cxx:43 ProfileLikelihoodTestStat.cxx:44 ProfileLikelihoodTestStat.cxx:45 ProfileLikelihoodTestStat.cxx:46 ProfileLikelihoodTestStat.cxx:47 ProfileLikelihoodTestStat.cxx:48 ProfileLikelihoodTestStat.cxx:49 ProfileLikelihoodTestStat.cxx:50 ProfileLikelihoodTestStat.cxx:51 ProfileLikelihoodTestStat.cxx:52 ProfileLikelihoodTestStat.cxx:53 ProfileLikelihoodTestStat.cxx:54 ProfileLikelihoodTestStat.cxx:55 ProfileLikelihoodTestStat.cxx:56 ProfileLikelihoodTestStat.cxx:57 ProfileLikelihoodTestStat.cxx:58 ProfileLikelihoodTestStat.cxx:59 ProfileLikelihoodTestStat.cxx:60 ProfileLikelihoodTestStat.cxx:61 ProfileLikelihoodTestStat.cxx:62 ProfileLikelihoodTestStat.cxx:63 ProfileLikelihoodTestStat.cxx:64 ProfileLikelihoodTestStat.cxx:65 ProfileLikelihoodTestStat.cxx:66 ProfileLikelihoodTestStat.cxx:67 ProfileLikelihoodTestStat.cxx:68 ProfileLikelihoodTestStat.cxx:69 ProfileLikelihoodTestStat.cxx:70 ProfileLikelihoodTestStat.cxx:71 ProfileLikelihoodTestStat.cxx:72 ProfileLikelihoodTestStat.cxx:73 ProfileLikelihoodTestStat.cxx:74 ProfileLikelihoodTestStat.cxx:75 ProfileLikelihoodTestStat.cxx:76 ProfileLikelihoodTestStat.cxx:77 ProfileLikelihoodTestStat.cxx:78 ProfileLikelihoodTestStat.cxx:79 ProfileLikelihoodTestStat.cxx:80 ProfileLikelihoodTestStat.cxx:81 ProfileLikelihoodTestStat.cxx:82 ProfileLikelihoodTestStat.cxx:83 ProfileLikelihoodTestStat.cxx:84 ProfileLikelihoodTestStat.cxx:85 ProfileLikelihoodTestStat.cxx:86 ProfileLikelihoodTestStat.cxx:87 ProfileLikelihoodTestStat.cxx:88 ProfileLikelihoodTestStat.cxx:89 ProfileLikelihoodTestStat.cxx:90 ProfileLikelihoodTestStat.cxx:91 ProfileLikelihoodTestStat.cxx:92 ProfileLikelihoodTestStat.cxx:93 ProfileLikelihoodTestStat.cxx:94 ProfileLikelihoodTestStat.cxx:95 ProfileLikelihoodTestStat.cxx:96 ProfileLikelihoodTestStat.cxx:97 ProfileLikelihoodTestStat.cxx:98 ProfileLikelihoodTestStat.cxx:99 ProfileLikelihoodTestStat.cxx:100 ProfileLikelihoodTestStat.cxx:101 ProfileLikelihoodTestStat.cxx:102 ProfileLikelihoodTestStat.cxx:103 ProfileLikelihoodTestStat.cxx:104 ProfileLikelihoodTestStat.cxx:105 ProfileLikelihoodTestStat.cxx:106 ProfileLikelihoodTestStat.cxx:107 ProfileLikelihoodTestStat.cxx:108 ProfileLikelihoodTestStat.cxx:109 ProfileLikelihoodTestStat.cxx:110 ProfileLikelihoodTestStat.cxx:111 ProfileLikelihoodTestStat.cxx:112 ProfileLikelihoodTestStat.cxx:113 ProfileLikelihoodTestStat.cxx:114 ProfileLikelihoodTestStat.cxx:115 ProfileLikelihoodTestStat.cxx:116 ProfileLikelihoodTestStat.cxx:117 ProfileLikelihoodTestStat.cxx:118 ProfileLikelihoodTestStat.cxx:119 ProfileLikelihoodTestStat.cxx:120 ProfileLikelihoodTestStat.cxx:121 ProfileLikelihoodTestStat.cxx:122 ProfileLikelihoodTestStat.cxx:123 ProfileLikelihoodTestStat.cxx:124 ProfileLikelihoodTestStat.cxx:125 ProfileLikelihoodTestStat.cxx:126 ProfileLikelihoodTestStat.cxx:127 ProfileLikelihoodTestStat.cxx:128 ProfileLikelihoodTestStat.cxx:129 ProfileLikelihoodTestStat.cxx:130 ProfileLikelihoodTestStat.cxx:131 ProfileLikelihoodTestStat.cxx:132 ProfileLikelihoodTestStat.cxx:133 ProfileLikelihoodTestStat.cxx:134 ProfileLikelihoodTestStat.cxx:135 ProfileLikelihoodTestStat.cxx:136 ProfileLikelihoodTestStat.cxx:137 ProfileLikelihoodTestStat.cxx:138 ProfileLikelihoodTestStat.cxx:139 ProfileLikelihoodTestStat.cxx:140 ProfileLikelihoodTestStat.cxx:141 ProfileLikelihoodTestStat.cxx:142 ProfileLikelihoodTestStat.cxx:143 ProfileLikelihoodTestStat.cxx:144 ProfileLikelihoodTestStat.cxx:145 ProfileLikelihoodTestStat.cxx:146 ProfileLikelihoodTestStat.cxx:147 ProfileLikelihoodTestStat.cxx:148 ProfileLikelihoodTestStat.cxx:149 ProfileLikelihoodTestStat.cxx:150 ProfileLikelihoodTestStat.cxx:151 ProfileLikelihoodTestStat.cxx:152 ProfileLikelihoodTestStat.cxx:153 ProfileLikelihoodTestStat.cxx:154 ProfileLikelihoodTestStat.cxx:155 ProfileLikelihoodTestStat.cxx:156 ProfileLikelihoodTestStat.cxx:157 ProfileLikelihoodTestStat.cxx:158 ProfileLikelihoodTestStat.cxx:159 ProfileLikelihoodTestStat.cxx:160 ProfileLikelihoodTestStat.cxx:161 ProfileLikelihoodTestStat.cxx:162 ProfileLikelihoodTestStat.cxx:163 ProfileLikelihoodTestStat.cxx:164 ProfileLikelihoodTestStat.cxx:165 ProfileLikelihoodTestStat.cxx:166 ProfileLikelihoodTestStat.cxx:167 ProfileLikelihoodTestStat.cxx:168 ProfileLikelihoodTestStat.cxx:169 ProfileLikelihoodTestStat.cxx:170 ProfileLikelihoodTestStat.cxx:171 ProfileLikelihoodTestStat.cxx:172 ProfileLikelihoodTestStat.cxx:173 ProfileLikelihoodTestStat.cxx:174 ProfileLikelihoodTestStat.cxx:175 ProfileLikelihoodTestStat.cxx:176 ProfileLikelihoodTestStat.cxx:177 ProfileLikelihoodTestStat.cxx:178 ProfileLikelihoodTestStat.cxx:179 ProfileLikelihoodTestStat.cxx:180 ProfileLikelihoodTestStat.cxx:181 ProfileLikelihoodTestStat.cxx:182 ProfileLikelihoodTestStat.cxx:183 ProfileLikelihoodTestStat.cxx:184 ProfileLikelihoodTestStat.cxx:185 ProfileLikelihoodTestStat.cxx:186 ProfileLikelihoodTestStat.cxx:187 ProfileLikelihoodTestStat.cxx:188 ProfileLikelihoodTestStat.cxx:189 ProfileLikelihoodTestStat.cxx:190 ProfileLikelihoodTestStat.cxx:191 ProfileLikelihoodTestStat.cxx:192 ProfileLikelihoodTestStat.cxx:193 ProfileLikelihoodTestStat.cxx:194 ProfileLikelihoodTestStat.cxx:195 ProfileLikelihoodTestStat.cxx:196 ProfileLikelihoodTestStat.cxx:197 ProfileLikelihoodTestStat.cxx:198 ProfileLikelihoodTestStat.cxx:199 ProfileLikelihoodTestStat.cxx:200 ProfileLikelihoodTestStat.cxx:201 ProfileLikelihoodTestStat.cxx:202 ProfileLikelihoodTestStat.cxx:203 ProfileLikelihoodTestStat.cxx:204 ProfileLikelihoodTestStat.cxx:205 ProfileLikelihoodTestStat.cxx:206 ProfileLikelihoodTestStat.cxx:207 ProfileLikelihoodTestStat.cxx:208 ProfileLikelihoodTestStat.cxx:209 ProfileLikelihoodTestStat.cxx:210 ProfileLikelihoodTestStat.cxx:211 ProfileLikelihoodTestStat.cxx:212 ProfileLikelihoodTestStat.cxx:213 ProfileLikelihoodTestStat.cxx:214 ProfileLikelihoodTestStat.cxx:215 ProfileLikelihoodTestStat.cxx:216 ProfileLikelihoodTestStat.cxx:217 ProfileLikelihoodTestStat.cxx:218 ProfileLikelihoodTestStat.cxx:219 ProfileLikelihoodTestStat.cxx:220 ProfileLikelihoodTestStat.cxx:221 ProfileLikelihoodTestStat.cxx:222 ProfileLikelihoodTestStat.cxx:223 ProfileLikelihoodTestStat.cxx:224 ProfileLikelihoodTestStat.cxx:225 ProfileLikelihoodTestStat.cxx:226 ProfileLikelihoodTestStat.cxx:227 ProfileLikelihoodTestStat.cxx:228 ProfileLikelihoodTestStat.cxx:229 ProfileLikelihoodTestStat.cxx:230 ProfileLikelihoodTestStat.cxx:231 ProfileLikelihoodTestStat.cxx:232 ProfileLikelihoodTestStat.cxx:233 ProfileLikelihoodTestStat.cxx:234 ProfileLikelihoodTestStat.cxx:235 ProfileLikelihoodTestStat.cxx:236 ProfileLikelihoodTestStat.cxx:237 ProfileLikelihoodTestStat.cxx:238 ProfileLikelihoodTestStat.cxx:239 ProfileLikelihoodTestStat.cxx:240 ProfileLikelihoodTestStat.cxx:241 ProfileLikelihoodTestStat.cxx:242 ProfileLikelihoodTestStat.cxx:243 ProfileLikelihoodTestStat.cxx:244 ProfileLikelihoodTestStat.cxx:245 ProfileLikelihoodTestStat.cxx:246 ProfileLikelihoodTestStat.cxx:247 ProfileLikelihoodTestStat.cxx:248 ProfileLikelihoodTestStat.cxx:249 ProfileLikelihoodTestStat.cxx:250 ProfileLikelihoodTestStat.cxx:251 ProfileLikelihoodTestStat.cxx:252 ProfileLikelihoodTestStat.cxx:253 ProfileLikelihoodTestStat.cxx:254 ProfileLikelihoodTestStat.cxx:255 ProfileLikelihoodTestStat.cxx:256 ProfileLikelihoodTestStat.cxx:257 ProfileLikelihoodTestStat.cxx:258 ProfileLikelihoodTestStat.cxx:259 ProfileLikelihoodTestStat.cxx:260 ProfileLikelihoodTestStat.cxx:261 ProfileLikelihoodTestStat.cxx:262 ProfileLikelihoodTestStat.cxx:263 ProfileLikelihoodTestStat.cxx:264 ProfileLikelihoodTestStat.cxx:265 ProfileLikelihoodTestStat.cxx:266 ProfileLikelihoodTestStat.cxx:267 ProfileLikelihoodTestStat.cxx:268 ProfileLikelihoodTestStat.cxx:269 ProfileLikelihoodTestStat.cxx:270 ProfileLikelihoodTestStat.cxx:271 ProfileLikelihoodTestStat.cxx:272 ProfileLikelihoodTestStat.cxx:273 ProfileLikelihoodTestStat.cxx:274 ProfileLikelihoodTestStat.cxx:275 ProfileLikelihoodTestStat.cxx:276 ProfileLikelihoodTestStat.cxx:277 ProfileLikelihoodTestStat.cxx:278 ProfileLikelihoodTestStat.cxx:279 ProfileLikelihoodTestStat.cxx:280 ProfileLikelihoodTestStat.cxx:281 ProfileLikelihoodTestStat.cxx:282 ProfileLikelihoodTestStat.cxx:283 ProfileLikelihoodTestStat.cxx:284 ProfileLikelihoodTestStat.cxx:285 ProfileLikelihoodTestStat.cxx:286 ProfileLikelihoodTestStat.cxx:287 ProfileLikelihoodTestStat.cxx:288 ProfileLikelihoodTestStat.cxx:289 ProfileLikelihoodTestStat.cxx:290 ProfileLikelihoodTestStat.cxx:291 ProfileLikelihoodTestStat.cxx:292 ProfileLikelihoodTestStat.cxx:293 ProfileLikelihoodTestStat.cxx:294 ProfileLikelihoodTestStat.cxx:295 ProfileLikelihoodTestStat.cxx:296 ProfileLikelihoodTestStat.cxx:297 ProfileLikelihoodTestStat.cxx:298 ProfileLikelihoodTestStat.cxx:299 ProfileLikelihoodTestStat.cxx:300 ProfileLikelihoodTestStat.cxx:301 ProfileLikelihoodTestStat.cxx:302 ProfileLikelihoodTestStat.cxx:303 ProfileLikelihoodTestStat.cxx:304 ProfileLikelihoodTestStat.cxx:305 ProfileLikelihoodTestStat.cxx:306 ProfileLikelihoodTestStat.cxx:307 ProfileLikelihoodTestStat.cxx:308 ProfileLikelihoodTestStat.cxx:309 ProfileLikelihoodTestStat.cxx:310 ProfileLikelihoodTestStat.cxx:311 ProfileLikelihoodTestStat.cxx:312 ProfileLikelihoodTestStat.cxx:313 ProfileLikelihoodTestStat.cxx:314 ProfileLikelihoodTestStat.cxx:315 ProfileLikelihoodTestStat.cxx:316 ProfileLikelihoodTestStat.cxx:317