// @(#)root/roostats:$Id$
// Author: Kyle Cranmer, Lorenzo Moneta, Gregory Schott, Wouter Verkerke
// Additional Contributions: Giovanni Petrucciani 
/*************************************************************************
 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#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) {
        // interna function to evaluate test statistics
        // can do depending on type: 
        // type  = 0 standard evaluation, type = 1 find only unconditional NLL minimum, type = 2 conditional MLL

       if( fDetailedOutputEnabled && fDetailedOutput ) {
	       delete fDetailedOutput;
	       fDetailedOutput = 0;
       }
       if( fDetailedOutputEnabled && !fDetailedOutput ) {
	       fDetailedOutput = new RooArgSet();
       }

       //data.Print("V");
       
       TStopwatch tsw; 
       tsw.Start();

       double initial_mu_value  = 0;
       RooRealVar* firstPOI = dynamic_cast<RooRealVar*>( paramsOfInterest.first());       
       if (firstPOI) initial_mu_value = firstPOI->getVal();
       //paramsOfInterest.getRealValue(firstPOI->GetName());
       if (fPrintLevel > 1) { 
            cout << "POIs: " << endl;
            paramsOfInterest.Print("v");
       }

       RooFit::MsgLevel msglevel = RooMsgService::instance().globalKillBelow();
       if (fPrintLevel < 3) RooMsgService::instance().setGlobalKillBelow(RooFit::FATAL);

       // simple
       Bool_t reuse=(fReuseNll || fgAlwaysReuseNll) ;
       
       Bool_t created(kFALSE) ;
       if (!reuse || fNll==0) {
          RooArgSet* allParams = fPdf->getParameters(data);
          RooStats::RemoveConstantParameters(allParams);

          // need to call constrain for RooSimultaneous until stripDisconnected problem fixed
          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) ;
       }
       // print data in case of number counting (simple data sets) 
       if (fPrintLevel > 1 && data.numEntries() == 1) { 
          std::cout << "Data set used is:  ";
          RooStats::PrintListContent(*data.get(0), std::cout); 
       }


       // make sure we set the variables attached to this nll
       RooArgSet* attachedSet = fNll->getVariables();

       *attachedSet = paramsOfInterest;
       RooArgSet* origAttachedSet = (RooArgSet*) attachedSet->snapshot();

       ///////////////////////////////////////////////////////////////////////
       // New profiling based on RooMinimizer (allows for Minuit2)
       // based on major speed increases seen by CMS for complex problems

 
       // other order
       // get the numerator
       RooArgSet* snap =  (RooArgSet*)paramsOfInterest.snapshot();

       tsw.Stop(); 
       double createTime = tsw.CpuTime();
       tsw.Start();

       // get the denominator
       double uncondML = 0;
       double fit_favored_mu = 0;
       int statusD = 0;
       RooArgSet * detOutput = 0;
       if (type != 2) {
          // minimize and count eval errors
          fNll->clearEvalErrorLog();
          if (fPrintLevel>1) std::cout << "Do unconditional fit" << std::endl;
	  RooFitResult* result = GetMinNLL();
          if (result) {
             uncondML = result->minNll();
             statusD = result->status();

             // get best fit value for one-sided interval 
             if (firstPOI) fit_favored_mu = attachedSet->getRealValue(firstPOI->GetName()) ;

             // save this snapshot
             if( fDetailedOutputEnabled ) {
                detOutput = DetailedOutputAggregator::GetAsArgSet(result, "fitUncond_", fDetailedOutputWithErrorsAndPulls);
                fDetailedOutput->addOwned(*detOutput);
                delete detOutput;
             }
             delete result;
          }
          else { 
             return TMath::SignalingNaN();   // this should not really happen
          }
       }
       tsw.Stop();
       double fitTime1  = tsw.CpuTime();
          
       //double ret = 0; 
       int statusN = 0;
       tsw.Start();

       double condML = 0; 

       bool doConditionalFit = (type != 1); 

       // skip the conditional ML (the numerator) only when fit value is smaller than test value
       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;


          //       cout <<" reestablish snapshot"<<endl;
          *attachedSet = *snap;

 
          // set the POI to constant
          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();
          }


          // check if there are non-const parameters so it is worth to do the minimization
          RooArgSet allParams(*attachedSet); 
          RooStats::RemoveConstantParameters(&allParams);
          
          // in case no nuisance parameters are present
          // no need to minimize just evaluate the nll
          if (allParams.getSize() == 0 ) {
             // be sure to evaluate with offsets
             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();   // this should not really happen
            }
          }

       }

       tsw.Stop();
       double fitTime2 = tsw.CpuTime();

       double pll = 0;
       if (type != 0)  {
          // for conditional only or unconditional fits
          // need to compute nll value without the offset
          if (fLOffset) {
             RooAbsReal::setHideOffset(kFALSE) ;
             pll = fNll->getVal();
          }
          else {
             if (type == 1) 
                pll = uncondML;          
             else if (type == 2) 
                pll = condML;
          }
       }       
       else {  // type == 0
          // for standard profile likelihood evaluations 
         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;   // bad fit
            }
           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;
       }


       // need to restore the values ?
       *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; // indicate failed fit (WVE is not used anywhere yet)
       }

       return pll;
             
     }     

RooFitResult* RooStats::ProfileLikelihoodTestStat::GetMinNLL() {
   //find minimum of NLL using RooMinimizer

   RooMinimizer minim(*fNll);
   minim.setStrategy(fStrategy);
   //LM: RooMinimizer.setPrintLevel has +1 offset - so subtruct  here -1 + an extra -1 
   int level = (fPrintLevel == 0) ? -1 : fPrintLevel -2;
   minim.setPrintLevel(level);
   minim.setEps(fTolerance);
   // this cayses a memory leak
   minim.optimizeConst(2); 
   TString minimizer = fMinimizer;
   TString algorithm = ROOT::Math::MinimizerOptions::DefaultMinimizerAlgo();
   if (algorithm == "Migrad") algorithm = "Minimize"; // prefer to use Minimize instead of Migrad
   int status;
   for (int tries = 1, maxtries = 4; tries <= maxtries; ++tries) {
      status = minim.minimize(minimizer,algorithm);
      if (status%1000 == 0) {  // ignore erros from Improve 
         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++; // skip this trial if stratehy is already 1 
         }
         if (tries == 3) {
            cout << "    ----> trying with improve" << endl;;
            minimizer = "Minuit";
            algorithm = "migradimproved";
         }
      }
   }

   //how to get cov quality faster?
   return minim.save();
   //minim.optimizeConst(false); 
}
 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