// @(#)root/roostats:$Id$
// Author: Kyle Cranmer   28/07/2008

/*************************************************************************
 * 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.             *
 *************************************************************************/

//_________________________________________________
/*
BEGIN_HTML
<p>
ProfileLikelihoodCalculator is a concrete implementation of CombinedCalculator 
(the interface class for a tools which can produce both RooStats HypoTestResults and ConfIntervals).  
The tool uses the profile likelihood ratio as a test statistic, and assumes that Wilks' theorem is valid.  
Wilks' theorem states that -2* log (profile likelihood ratio) is asymptotically distributed as a chi^2 distribution 
with N-dof, where N is the number of degrees of freedom.  Thus, p-values can be constructed and the profile likelihood ratio
can be used to construct a LikelihoodInterval.
(In the future, this class could be extended to use toy Monte Carlo to calibrate the distribution of the test statistic).
</p>
<p> Usage: It uses the interface of the CombinedCalculator, so that it can be configured by specifying:
<ul>
 <li>a model common model (eg. a family of specific models which includes both the null and alternate),</li>
 <li>a data set, </li>
 <li>a set of parameters of interest. The nuisance parameters will be all other parameters of the model </li>
 <li>a set of parameters of which specify the null hypothesis (including values and const/non-const status)  </li>
</ul>
The interface allows one to pass the model, data, and parameters either directly or via a ModelConfig class.
The alternate hypothesis leaves the parameter free to take any value other than those specified by the null hypotesis. There is therefore no need to 
specify the alternate parameters. 
</p>
<p>
After configuring the calculator, one only needs to ask GetHypoTest() (which will return a HypoTestResult pointer) or GetInterval() (which will return an ConfInterval pointer).
</p>
<p>
The concrete implementations of this interface should deal with the details of how the nuisance parameters are
dealt with (eg. integration vs. profiling) and which test-statistic is used (perhaps this should be added to the interface).
</p>
<p>
The motivation for this interface is that we hope to be able to specify the problem in a common way for several concrete calculators.
</p>
END_HTML
*/
//

#ifndef RooStats_ProfileLikelihoodCalculator
#include "RooStats/ProfileLikelihoodCalculator.h"
#endif

#ifndef RooStats_RooStatsUtils
#include "RooStats/RooStatsUtils.h"
#endif

#include "RooStats/LikelihoodInterval.h"
#include "RooStats/HypoTestResult.h"

#include "RooFitResult.h"
#include "RooRealVar.h"
#include "RooProfileLL.h"
#include "RooNLLVar.h"
#include "RooGlobalFunc.h"
#include "RooMsgService.h"

#include "Math/MinimizerOptions.h"
#include "RooMinimizer.h"
//#include "RooProdPdf.h"

using namespace std;

ClassImp(RooStats::ProfileLikelihoodCalculator) ;

using namespace RooFit;
using namespace RooStats;


//_______________________________________________________
ProfileLikelihoodCalculator::ProfileLikelihoodCalculator() : 
   CombinedCalculator(), fFitResult(0), fGlobalFitDone(false)
{
   // default constructor
}

ProfileLikelihoodCalculator::ProfileLikelihoodCalculator(RooAbsData& data, RooAbsPdf& pdf, const RooArgSet& paramsOfInterest, 
                                                         Double_t size, const RooArgSet* nullParams ) :
   CombinedCalculator(data,pdf, paramsOfInterest, size, nullParams ), 
   fFitResult(0), fGlobalFitDone(false)
{
   // constructor from pdf and parameters
   // the pdf must contain eventually the nuisance parameters
}

ProfileLikelihoodCalculator::ProfileLikelihoodCalculator(RooAbsData& data,  ModelConfig& model, Double_t size) :
   CombinedCalculator(data, model, size), 
   fFitResult(0), fGlobalFitDone(false)
{
   // construct from a ModelConfig. Assume data model.GetPdf() will provide full description of model including 
   // constraint term on the nuisances parameters
   assert(model.GetPdf() );
}


//_______________________________________________________
ProfileLikelihoodCalculator::~ProfileLikelihoodCalculator(){
   // destructor
   // cannot delete prod pdf because it will delete all the composing pdf's
//    if (fOwnPdf) delete fPdf; 
//    fPdf = 0; 
   if (fFitResult) delete fFitResult; 
}

void ProfileLikelihoodCalculator::DoReset() const { 
   // reset and clear fit result 
   // to be called when a new model or data are set in the calculator 
   if (fFitResult) delete fFitResult; 
   fFitResult = 0; 
}

RooAbsReal *  ProfileLikelihoodCalculator::DoGlobalFit() const { 
   // perform a global fit of the likelihood letting with all parameter of interest and 
   // nuisance parameters 
   // keep the list of fitted parameters 

   DoReset(); 
   RooAbsPdf * pdf = GetPdf();
   RooAbsData* data = GetData(); 
   if (!data || !pdf ) return 0;

   // get all non-const parameters
   RooArgSet* constrainedParams = pdf->getParameters(*data);
   if (!constrainedParams) return 0; 
   RemoveConstantParameters(constrainedParams);


   RooAbsReal * nll = pdf->createNLL(*data, CloneData(true), Constrain(*constrainedParams),ConditionalObservables(fConditionalObs), Offset(RooStats::IsNLLOffset() ) );

   // check if global fit has been already done
   if (fFitResult && fGlobalFitDone) {
      delete constrainedParams;
      return nll;
   }

      // calculate MLE 
   oocoutP((TObject*)0,Minimization) << "ProfileLikelihoodCalcultor::DoGLobalFit - find MLE " << std::endl;

   if (fFitResult) delete fFitResult;
   fFitResult = DoMinimizeNLL(nll);

   // print fit result 
   if (fFitResult) {
      fFitResult->printStream( oocoutI((TObject*)0,Minimization), fFitResult->defaultPrintContents(0), fFitResult->defaultPrintStyle(0) );

      if (fFitResult->status() != 0) 
         oocoutW((TObject*)0,Minimization) << "ProfileLikelihoodCalcultor::DoGlobalFit -  Global fit failed - status = " << fFitResult->status() << std::endl;
      else
         fGlobalFitDone = true; 
   }

   delete constrainedParams;
   return nll;
}
   
RooFitResult * ProfileLikelihoodCalculator::DoMinimizeNLL(RooAbsReal * nll)  {
   // Minimizer the given NLL using the default options 

   const char * minimType = ROOT::Math::MinimizerOptions::DefaultMinimizerType().c_str();
   const char * minimAlgo = ROOT::Math::MinimizerOptions::DefaultMinimizerAlgo().c_str();
   int strategy = ROOT::Math::MinimizerOptions::DefaultStrategy();
   int level = ROOT::Math::MinimizerOptions::DefaultPrintLevel() -1;// RooFit level starts from  -1
   int tolerance = ROOT::Math::MinimizerOptions::DefaultTolerance();
   oocoutP((TObject*)0,Minimization) << "ProfileLikelihoodCalcultor::DoMinimizeNLL - using " << minimType << " / " << minimAlgo << " with strategy " << strategy << std::endl;
   // do global fit and store fit result for further use

   RooMinimizer minim(*nll);
   minim.setStrategy(strategy);
   minim.setEps(tolerance);
   minim.setPrintLevel(level);
   minim.optimizeConst(2); // to optimize likelihood calculations

   int status = -1;
   for (int tries = 1, maxtries = 4; tries <= maxtries; ++tries) {
      status = minim.minimize(minimType,minimAlgo);
      if (status%1000 == 0) {  // ignore erros from Improve 
         break;
      } else if (tries < maxtries) {
         cout << "    ----> Doing a re-scan first" << endl;
         minim.minimize(minimType,"Scan");
         if (tries == 2) {
            if (strategy == 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;;
            minimType = "Minuit";
            minimAlgo = "migradimproved";
         }
      }
   }
 
   RooFitResult * result = minim.save(); 
  

   return result;
}

//_______________________________________________________
LikelihoodInterval* ProfileLikelihoodCalculator::GetInterval() const {
   // Main interface to get a RooStats::ConfInterval.  
   // It constructs a profile likelihood ratio and uses that to construct a RooStats::LikelihoodInterval.

//    RooAbsPdf* pdf   = fWS->pdf(fPdfName);
//    RooAbsData* data = fWS->data(fDataName);
   RooAbsPdf * pdf = GetPdf();
   RooAbsData* data = GetData(); 
   if (!data || !pdf || fPOI.getSize() == 0) return 0;

   RooArgSet* constrainedParams = pdf->getParameters(*data);
   RemoveConstantParameters(constrainedParams);


   /*
   RooNLLVar* nll = new RooNLLVar("nll","",*pdf,*data, Extended(),Constrain(*constrainedParams));
   RooProfileLL* profile = new RooProfileLL("pll","",*nll, *fPOI);
   profile->addOwnedComponents(*nll) ;  // to avoid memory leak
   */

   // do a global fit cloning the data 
   RooAbsReal * nll = DoGlobalFit();
   if (!nll) return 0; 

   if (!fFitResult)   {
      delete nll; 
      return 0;
   }

   RooAbsReal* profile = nll->createProfile(fPOI);
   profile->addOwnedComponents(*nll) ;  // to avoid memory leak

   // t.b.f. " RooProfileLL should keep and provide possibility to query on global minimum
   // set POI to fit value (this will speed up profileLL calculation of global minimum)
   const RooArgList & fitParams = fFitResult->floatParsFinal(); 
   for (int i = 0; i < fitParams.getSize(); ++i) {
      RooRealVar & fitPar =  (RooRealVar &) fitParams[i];
      RooRealVar * par = (RooRealVar*) fPOI.find( fitPar.GetName() );      
      if (par) { 
         par->setVal( fitPar.getVal() );
         par->setError( fitPar.getError() );
      }
   }
  
   // do this so profile will cache inside the absolute minimum and 
   // minimum values of nuisance parameters
   // (no need to this here)
   // profile->getVal(); 
   //RooMsgService::instance().setGlobalKillBelow(RooFit::DEBUG) ;
   //  profile->Print();

   TString name = TString("LikelihoodInterval_");// + TString(GetName() ); 

   // make a list of fPOI with fit result values and pass to LikelihoodInterval class
   // bestPOI is a cloned list of POI only with their best fit values 
   TIter iter = fPOI.createIterator(); 
   RooArgSet fitParSet(fitParams); 
   RooArgSet * bestPOI = new RooArgSet();  
   while (RooAbsArg * arg =  (RooAbsArg*) iter.Next() ) { 
      RooAbsArg * p  =  fitParSet.find( arg->GetName() );
      if (p) bestPOI->addClone(*p);
      else bestPOI->addClone(*arg);
   }
   // fPOI contains the paramter of interest of the PL object 
   // and bestPOI contains a snapshot with the best fit values 
   LikelihoodInterval* interval = new LikelihoodInterval(name, profile, &fPOI, bestPOI);
   interval->SetConfidenceLevel(1.-fSize);
   delete constrainedParams;
   return interval;
}

//_______________________________________________________
HypoTestResult* ProfileLikelihoodCalculator::GetHypoTest() const {
   // Main interface to get a HypoTestResult.
   // It does two fits:
   // the first lets the null parameters float, so it's a maximum likelihood estimate
   // the second is to the null (fixing null parameters to their specified values): eg. a conditional maximum likelihood
   // the ratio of the likelihood at the conditional MLE to the MLE is the profile likelihood ratio.
   // Wilks' theorem is used to get p-values 

//    RooAbsPdf* pdf   = fWS->pdf(fPdfName);
//    RooAbsData* data = fWS->data(fDataName);
   RooAbsPdf * pdf = GetPdf();
   RooAbsData* data = GetData(); 


   if (!data || !pdf) return 0;

   if (fNullParams.getSize() == 0) return 0; 

   // make a clone and ordered list since a vector will be associated to keep parameter values
   // clone the list since first fit will changes the fNullParams values
   RooArgList poiList; 
   poiList.addClone(fNullParams); // make a clone list 


   // do a global fit
   RooAbsReal * nll = DoGlobalFit();
   if (!nll) return 0;
   
   if (!fFitResult) {
      delete nll;
      return 0; 
   }
   
   RooArgSet* constrainedParams = pdf->getParameters(*data);
   RemoveConstantParameters(constrainedParams);

   Double_t nLLatMLE = fFitResult->minNll();
   // in case of using offset need to save offset value
   Double_t nlloffset = (RooStats::IsNLLOffset() ) ? nll->getVal() - nLLatMLE : 0; 

   // set POI to given values, set constant, calculate conditional MLE
   std::vector<double> oldValues(poiList.getSize() ); 
   for (unsigned int i = 0; i < oldValues.size(); ++i) { 
      RooRealVar * mytarget = (RooRealVar*) constrainedParams->find(poiList[i].GetName());
      if (mytarget) { 
         oldValues[i] = mytarget->getVal(); 
         mytarget->setVal( ( (RooRealVar&) poiList[i] ).getVal() );
         mytarget->setConstant(kTRUE);
      }
   }

   

   // perform the fit only if nuisance parameters are available
   // get nuisance parameters
   // nuisance parameters are the non const parameters from the likelihood parameters
   RooArgSet nuisParams(*constrainedParams);

   // need to remove the parameter of interest
   RemoveConstantParameters(&nuisParams);

   // check there are variable parameter in order to do a fit 
   bool existVarParams = false; 
   TIter it = nuisParams.createIterator();
   RooRealVar * myarg = 0; 
   while ((myarg = (RooRealVar *)it.Next())) { 
      if ( !myarg->isConstant() ) {
         existVarParams = true; 
         break;
      }
   }

   Double_t nLLatCondMLE = nLLatMLE; 
   if (existVarParams) {
      oocoutP((TObject*)0,Minimization) << "ProfileLikelihoodCalcultor::GetHypoTest - do conditional fit " << std::endl;

      RooFitResult * fit2 = DoMinimizeNLL(nll);
     
      // print fit result 
      if (fit2) {
         nLLatCondMLE = fit2->minNll();
         fit2->printStream( oocoutI((TObject*)0,Minimization), fit2->defaultPrintContents(0), fit2->defaultPrintStyle(0) );

         if (fit2->status() != 0) 
            oocoutW((TObject*)0,Minimization) << "ProfileLikelihoodCalcultor::GetHypotest -  Conditional fit failed - status = " << fit2->status() << std::endl;      
      }

   }
   else { 
      // get just the likelihood value (no need to do a fit since the likelihood is a constant function)
      nLLatCondMLE = nll->getVal();
      // this value contains the offset 
      if (RooStats::IsNLLOffset() ) nLLatCondMLE -= nlloffset; 
   }

   // Use Wilks' theorem to translate -2 log lambda into a signifcance/p-value
   Double_t deltaNLL = std::max( nLLatCondMLE-nLLatMLE, 0.);
   
   // get number of free parameter of interest
   RemoveConstantParameters(poiList);
   int ndf = poiList.getSize();

   Double_t pvalue = ROOT::Math::chisquared_cdf_c( 2* deltaNLL, ndf);
   
   // in case of one dimenension (1 poi) do the one-sided p-value (need to divide by 2)
   if (ndf == 1) pvalue = 0.5 * pvalue; 

   TString name = TString("ProfileLRHypoTestResult_");// + TString(GetName() ); 
   HypoTestResult* htr = new HypoTestResult(name, pvalue, 0 );

   // restore previous value of poi
   for (unsigned int i = 0; i < oldValues.size(); ++i) { 
      RooRealVar * mytarget = (RooRealVar*) constrainedParams->find(poiList[i].GetName());
      if (mytarget) { 
         mytarget->setVal(oldValues[i] ); 
         mytarget->setConstant(false); 
      }
   }

   delete constrainedParams;
   delete nll; 
   return htr;

}

 ProfileLikelihoodCalculator.cxx:1
 ProfileLikelihoodCalculator.cxx:2
 ProfileLikelihoodCalculator.cxx:3
 ProfileLikelihoodCalculator.cxx:4
 ProfileLikelihoodCalculator.cxx:5
 ProfileLikelihoodCalculator.cxx:6
 ProfileLikelihoodCalculator.cxx:7
 ProfileLikelihoodCalculator.cxx:8
 ProfileLikelihoodCalculator.cxx:9
 ProfileLikelihoodCalculator.cxx:10
 ProfileLikelihoodCalculator.cxx:11
 ProfileLikelihoodCalculator.cxx:12
 ProfileLikelihoodCalculator.cxx:13
 ProfileLikelihoodCalculator.cxx:14
 ProfileLikelihoodCalculator.cxx:15
 ProfileLikelihoodCalculator.cxx:16
 ProfileLikelihoodCalculator.cxx:17
 ProfileLikelihoodCalculator.cxx:18
 ProfileLikelihoodCalculator.cxx:19
 ProfileLikelihoodCalculator.cxx:20
 ProfileLikelihoodCalculator.cxx:21
 ProfileLikelihoodCalculator.cxx:22
 ProfileLikelihoodCalculator.cxx:23
 ProfileLikelihoodCalculator.cxx:24
 ProfileLikelihoodCalculator.cxx:25
 ProfileLikelihoodCalculator.cxx:26
 ProfileLikelihoodCalculator.cxx:27
 ProfileLikelihoodCalculator.cxx:28
 ProfileLikelihoodCalculator.cxx:29
 ProfileLikelihoodCalculator.cxx:30
 ProfileLikelihoodCalculator.cxx:31
 ProfileLikelihoodCalculator.cxx:32
 ProfileLikelihoodCalculator.cxx:33
 ProfileLikelihoodCalculator.cxx:34
 ProfileLikelihoodCalculator.cxx:35
 ProfileLikelihoodCalculator.cxx:36
 ProfileLikelihoodCalculator.cxx:37
 ProfileLikelihoodCalculator.cxx:38
 ProfileLikelihoodCalculator.cxx:39
 ProfileLikelihoodCalculator.cxx:40
 ProfileLikelihoodCalculator.cxx:41
 ProfileLikelihoodCalculator.cxx:42
 ProfileLikelihoodCalculator.cxx:43
 ProfileLikelihoodCalculator.cxx:44
 ProfileLikelihoodCalculator.cxx:45
 ProfileLikelihoodCalculator.cxx:46
 ProfileLikelihoodCalculator.cxx:47
 ProfileLikelihoodCalculator.cxx:48
 ProfileLikelihoodCalculator.cxx:49
 ProfileLikelihoodCalculator.cxx:50
 ProfileLikelihoodCalculator.cxx:51
 ProfileLikelihoodCalculator.cxx:52
 ProfileLikelihoodCalculator.cxx:53
 ProfileLikelihoodCalculator.cxx:54
 ProfileLikelihoodCalculator.cxx:55
 ProfileLikelihoodCalculator.cxx:56
 ProfileLikelihoodCalculator.cxx:57
 ProfileLikelihoodCalculator.cxx:58
 ProfileLikelihoodCalculator.cxx:59
 ProfileLikelihoodCalculator.cxx:60
 ProfileLikelihoodCalculator.cxx:61
 ProfileLikelihoodCalculator.cxx:62
 ProfileLikelihoodCalculator.cxx:63
 ProfileLikelihoodCalculator.cxx:64
 ProfileLikelihoodCalculator.cxx:65
 ProfileLikelihoodCalculator.cxx:66
 ProfileLikelihoodCalculator.cxx:67
 ProfileLikelihoodCalculator.cxx:68
 ProfileLikelihoodCalculator.cxx:69
 ProfileLikelihoodCalculator.cxx:70
 ProfileLikelihoodCalculator.cxx:71
 ProfileLikelihoodCalculator.cxx:72
 ProfileLikelihoodCalculator.cxx:73
 ProfileLikelihoodCalculator.cxx:74
 ProfileLikelihoodCalculator.cxx:75
 ProfileLikelihoodCalculator.cxx:76
 ProfileLikelihoodCalculator.cxx:77
 ProfileLikelihoodCalculator.cxx:78
 ProfileLikelihoodCalculator.cxx:79
 ProfileLikelihoodCalculator.cxx:80
 ProfileLikelihoodCalculator.cxx:81
 ProfileLikelihoodCalculator.cxx:82
 ProfileLikelihoodCalculator.cxx:83
 ProfileLikelihoodCalculator.cxx:84
 ProfileLikelihoodCalculator.cxx:85
 ProfileLikelihoodCalculator.cxx:86
 ProfileLikelihoodCalculator.cxx:87
 ProfileLikelihoodCalculator.cxx:88
 ProfileLikelihoodCalculator.cxx:89
 ProfileLikelihoodCalculator.cxx:90
 ProfileLikelihoodCalculator.cxx:91
 ProfileLikelihoodCalculator.cxx:92
 ProfileLikelihoodCalculator.cxx:93
 ProfileLikelihoodCalculator.cxx:94
 ProfileLikelihoodCalculator.cxx:95
 ProfileLikelihoodCalculator.cxx:96
 ProfileLikelihoodCalculator.cxx:97
 ProfileLikelihoodCalculator.cxx:98
 ProfileLikelihoodCalculator.cxx:99
 ProfileLikelihoodCalculator.cxx:100
 ProfileLikelihoodCalculator.cxx:101
 ProfileLikelihoodCalculator.cxx:102
 ProfileLikelihoodCalculator.cxx:103
 ProfileLikelihoodCalculator.cxx:104
 ProfileLikelihoodCalculator.cxx:105
 ProfileLikelihoodCalculator.cxx:106
 ProfileLikelihoodCalculator.cxx:107
 ProfileLikelihoodCalculator.cxx:108
 ProfileLikelihoodCalculator.cxx:109
 ProfileLikelihoodCalculator.cxx:110
 ProfileLikelihoodCalculator.cxx:111
 ProfileLikelihoodCalculator.cxx:112
 ProfileLikelihoodCalculator.cxx:113
 ProfileLikelihoodCalculator.cxx:114
 ProfileLikelihoodCalculator.cxx:115
 ProfileLikelihoodCalculator.cxx:116
 ProfileLikelihoodCalculator.cxx:117
 ProfileLikelihoodCalculator.cxx:118
 ProfileLikelihoodCalculator.cxx:119
 ProfileLikelihoodCalculator.cxx:120
 ProfileLikelihoodCalculator.cxx:121
 ProfileLikelihoodCalculator.cxx:122
 ProfileLikelihoodCalculator.cxx:123
 ProfileLikelihoodCalculator.cxx:124
 ProfileLikelihoodCalculator.cxx:125
 ProfileLikelihoodCalculator.cxx:126
 ProfileLikelihoodCalculator.cxx:127
 ProfileLikelihoodCalculator.cxx:128
 ProfileLikelihoodCalculator.cxx:129
 ProfileLikelihoodCalculator.cxx:130
 ProfileLikelihoodCalculator.cxx:131
 ProfileLikelihoodCalculator.cxx:132
 ProfileLikelihoodCalculator.cxx:133
 ProfileLikelihoodCalculator.cxx:134
 ProfileLikelihoodCalculator.cxx:135
 ProfileLikelihoodCalculator.cxx:136
 ProfileLikelihoodCalculator.cxx:137
 ProfileLikelihoodCalculator.cxx:138
 ProfileLikelihoodCalculator.cxx:139
 ProfileLikelihoodCalculator.cxx:140
 ProfileLikelihoodCalculator.cxx:141
 ProfileLikelihoodCalculator.cxx:142
 ProfileLikelihoodCalculator.cxx:143
 ProfileLikelihoodCalculator.cxx:144
 ProfileLikelihoodCalculator.cxx:145
 ProfileLikelihoodCalculator.cxx:146
 ProfileLikelihoodCalculator.cxx:147
 ProfileLikelihoodCalculator.cxx:148
 ProfileLikelihoodCalculator.cxx:149
 ProfileLikelihoodCalculator.cxx:150
 ProfileLikelihoodCalculator.cxx:151
 ProfileLikelihoodCalculator.cxx:152
 ProfileLikelihoodCalculator.cxx:153
 ProfileLikelihoodCalculator.cxx:154
 ProfileLikelihoodCalculator.cxx:155
 ProfileLikelihoodCalculator.cxx:156
 ProfileLikelihoodCalculator.cxx:157
 ProfileLikelihoodCalculator.cxx:158
 ProfileLikelihoodCalculator.cxx:159
 ProfileLikelihoodCalculator.cxx:160
 ProfileLikelihoodCalculator.cxx:161
 ProfileLikelihoodCalculator.cxx:162
 ProfileLikelihoodCalculator.cxx:163
 ProfileLikelihoodCalculator.cxx:164
 ProfileLikelihoodCalculator.cxx:165
 ProfileLikelihoodCalculator.cxx:166
 ProfileLikelihoodCalculator.cxx:167
 ProfileLikelihoodCalculator.cxx:168
 ProfileLikelihoodCalculator.cxx:169
 ProfileLikelihoodCalculator.cxx:170
 ProfileLikelihoodCalculator.cxx:171
 ProfileLikelihoodCalculator.cxx:172
 ProfileLikelihoodCalculator.cxx:173
 ProfileLikelihoodCalculator.cxx:174
 ProfileLikelihoodCalculator.cxx:175
 ProfileLikelihoodCalculator.cxx:176
 ProfileLikelihoodCalculator.cxx:177
 ProfileLikelihoodCalculator.cxx:178
 ProfileLikelihoodCalculator.cxx:179
 ProfileLikelihoodCalculator.cxx:180
 ProfileLikelihoodCalculator.cxx:181
 ProfileLikelihoodCalculator.cxx:182
 ProfileLikelihoodCalculator.cxx:183
 ProfileLikelihoodCalculator.cxx:184
 ProfileLikelihoodCalculator.cxx:185
 ProfileLikelihoodCalculator.cxx:186
 ProfileLikelihoodCalculator.cxx:187
 ProfileLikelihoodCalculator.cxx:188
 ProfileLikelihoodCalculator.cxx:189
 ProfileLikelihoodCalculator.cxx:190
 ProfileLikelihoodCalculator.cxx:191
 ProfileLikelihoodCalculator.cxx:192
 ProfileLikelihoodCalculator.cxx:193
 ProfileLikelihoodCalculator.cxx:194
 ProfileLikelihoodCalculator.cxx:195
 ProfileLikelihoodCalculator.cxx:196
 ProfileLikelihoodCalculator.cxx:197
 ProfileLikelihoodCalculator.cxx:198
 ProfileLikelihoodCalculator.cxx:199
 ProfileLikelihoodCalculator.cxx:200
 ProfileLikelihoodCalculator.cxx:201
 ProfileLikelihoodCalculator.cxx:202
 ProfileLikelihoodCalculator.cxx:203
 ProfileLikelihoodCalculator.cxx:204
 ProfileLikelihoodCalculator.cxx:205
 ProfileLikelihoodCalculator.cxx:206
 ProfileLikelihoodCalculator.cxx:207
 ProfileLikelihoodCalculator.cxx:208
 ProfileLikelihoodCalculator.cxx:209
 ProfileLikelihoodCalculator.cxx:210
 ProfileLikelihoodCalculator.cxx:211
 ProfileLikelihoodCalculator.cxx:212
 ProfileLikelihoodCalculator.cxx:213
 ProfileLikelihoodCalculator.cxx:214
 ProfileLikelihoodCalculator.cxx:215
 ProfileLikelihoodCalculator.cxx:216
 ProfileLikelihoodCalculator.cxx:217
 ProfileLikelihoodCalculator.cxx:218
 ProfileLikelihoodCalculator.cxx:219
 ProfileLikelihoodCalculator.cxx:220
 ProfileLikelihoodCalculator.cxx:221
 ProfileLikelihoodCalculator.cxx:222
 ProfileLikelihoodCalculator.cxx:223
 ProfileLikelihoodCalculator.cxx:224
 ProfileLikelihoodCalculator.cxx:225
 ProfileLikelihoodCalculator.cxx:226
 ProfileLikelihoodCalculator.cxx:227
 ProfileLikelihoodCalculator.cxx:228
 ProfileLikelihoodCalculator.cxx:229
 ProfileLikelihoodCalculator.cxx:230
 ProfileLikelihoodCalculator.cxx:231
 ProfileLikelihoodCalculator.cxx:232
 ProfileLikelihoodCalculator.cxx:233
 ProfileLikelihoodCalculator.cxx:234
 ProfileLikelihoodCalculator.cxx:235
 ProfileLikelihoodCalculator.cxx:236
 ProfileLikelihoodCalculator.cxx:237
 ProfileLikelihoodCalculator.cxx:238
 ProfileLikelihoodCalculator.cxx:239
 ProfileLikelihoodCalculator.cxx:240
 ProfileLikelihoodCalculator.cxx:241
 ProfileLikelihoodCalculator.cxx:242
 ProfileLikelihoodCalculator.cxx:243
 ProfileLikelihoodCalculator.cxx:244
 ProfileLikelihoodCalculator.cxx:245
 ProfileLikelihoodCalculator.cxx:246
 ProfileLikelihoodCalculator.cxx:247
 ProfileLikelihoodCalculator.cxx:248
 ProfileLikelihoodCalculator.cxx:249
 ProfileLikelihoodCalculator.cxx:250
 ProfileLikelihoodCalculator.cxx:251
 ProfileLikelihoodCalculator.cxx:252
 ProfileLikelihoodCalculator.cxx:253
 ProfileLikelihoodCalculator.cxx:254
 ProfileLikelihoodCalculator.cxx:255
 ProfileLikelihoodCalculator.cxx:256
 ProfileLikelihoodCalculator.cxx:257
 ProfileLikelihoodCalculator.cxx:258
 ProfileLikelihoodCalculator.cxx:259
 ProfileLikelihoodCalculator.cxx:260
 ProfileLikelihoodCalculator.cxx:261
 ProfileLikelihoodCalculator.cxx:262
 ProfileLikelihoodCalculator.cxx:263
 ProfileLikelihoodCalculator.cxx:264
 ProfileLikelihoodCalculator.cxx:265
 ProfileLikelihoodCalculator.cxx:266
 ProfileLikelihoodCalculator.cxx:267
 ProfileLikelihoodCalculator.cxx:268
 ProfileLikelihoodCalculator.cxx:269
 ProfileLikelihoodCalculator.cxx:270
 ProfileLikelihoodCalculator.cxx:271
 ProfileLikelihoodCalculator.cxx:272
 ProfileLikelihoodCalculator.cxx:273
 ProfileLikelihoodCalculator.cxx:274
 ProfileLikelihoodCalculator.cxx:275
 ProfileLikelihoodCalculator.cxx:276
 ProfileLikelihoodCalculator.cxx:277
 ProfileLikelihoodCalculator.cxx:278
 ProfileLikelihoodCalculator.cxx:279
 ProfileLikelihoodCalculator.cxx:280
 ProfileLikelihoodCalculator.cxx:281
 ProfileLikelihoodCalculator.cxx:282
 ProfileLikelihoodCalculator.cxx:283
 ProfileLikelihoodCalculator.cxx:284
 ProfileLikelihoodCalculator.cxx:285
 ProfileLikelihoodCalculator.cxx:286
 ProfileLikelihoodCalculator.cxx:287
 ProfileLikelihoodCalculator.cxx:288
 ProfileLikelihoodCalculator.cxx:289
 ProfileLikelihoodCalculator.cxx:290
 ProfileLikelihoodCalculator.cxx:291
 ProfileLikelihoodCalculator.cxx:292
 ProfileLikelihoodCalculator.cxx:293
 ProfileLikelihoodCalculator.cxx:294
 ProfileLikelihoodCalculator.cxx:295
 ProfileLikelihoodCalculator.cxx:296
 ProfileLikelihoodCalculator.cxx:297
 ProfileLikelihoodCalculator.cxx:298
 ProfileLikelihoodCalculator.cxx:299
 ProfileLikelihoodCalculator.cxx:300
 ProfileLikelihoodCalculator.cxx:301
 ProfileLikelihoodCalculator.cxx:302
 ProfileLikelihoodCalculator.cxx:303
 ProfileLikelihoodCalculator.cxx:304
 ProfileLikelihoodCalculator.cxx:305
 ProfileLikelihoodCalculator.cxx:306
 ProfileLikelihoodCalculator.cxx:307
 ProfileLikelihoodCalculator.cxx:308
 ProfileLikelihoodCalculator.cxx:309
 ProfileLikelihoodCalculator.cxx:310
 ProfileLikelihoodCalculator.cxx:311
 ProfileLikelihoodCalculator.cxx:312
 ProfileLikelihoodCalculator.cxx:313
 ProfileLikelihoodCalculator.cxx:314
 ProfileLikelihoodCalculator.cxx:315
 ProfileLikelihoodCalculator.cxx:316
 ProfileLikelihoodCalculator.cxx:317
 ProfileLikelihoodCalculator.cxx:318
 ProfileLikelihoodCalculator.cxx:319
 ProfileLikelihoodCalculator.cxx:320
 ProfileLikelihoodCalculator.cxx:321
 ProfileLikelihoodCalculator.cxx:322
 ProfileLikelihoodCalculator.cxx:323
 ProfileLikelihoodCalculator.cxx:324
 ProfileLikelihoodCalculator.cxx:325
 ProfileLikelihoodCalculator.cxx:326
 ProfileLikelihoodCalculator.cxx:327
 ProfileLikelihoodCalculator.cxx:328
 ProfileLikelihoodCalculator.cxx:329
 ProfileLikelihoodCalculator.cxx:330
 ProfileLikelihoodCalculator.cxx:331
 ProfileLikelihoodCalculator.cxx:332
 ProfileLikelihoodCalculator.cxx:333
 ProfileLikelihoodCalculator.cxx:334
 ProfileLikelihoodCalculator.cxx:335
 ProfileLikelihoodCalculator.cxx:336
 ProfileLikelihoodCalculator.cxx:337
 ProfileLikelihoodCalculator.cxx:338
 ProfileLikelihoodCalculator.cxx:339
 ProfileLikelihoodCalculator.cxx:340
 ProfileLikelihoodCalculator.cxx:341
 ProfileLikelihoodCalculator.cxx:342
 ProfileLikelihoodCalculator.cxx:343
 ProfileLikelihoodCalculator.cxx:344
 ProfileLikelihoodCalculator.cxx:345
 ProfileLikelihoodCalculator.cxx:346
 ProfileLikelihoodCalculator.cxx:347
 ProfileLikelihoodCalculator.cxx:348
 ProfileLikelihoodCalculator.cxx:349
 ProfileLikelihoodCalculator.cxx:350
 ProfileLikelihoodCalculator.cxx:351
 ProfileLikelihoodCalculator.cxx:352
 ProfileLikelihoodCalculator.cxx:353
 ProfileLikelihoodCalculator.cxx:354
 ProfileLikelihoodCalculator.cxx:355
 ProfileLikelihoodCalculator.cxx:356
 ProfileLikelihoodCalculator.cxx:357
 ProfileLikelihoodCalculator.cxx:358
 ProfileLikelihoodCalculator.cxx:359
 ProfileLikelihoodCalculator.cxx:360
 ProfileLikelihoodCalculator.cxx:361
 ProfileLikelihoodCalculator.cxx:362
 ProfileLikelihoodCalculator.cxx:363
 ProfileLikelihoodCalculator.cxx:364
 ProfileLikelihoodCalculator.cxx:365
 ProfileLikelihoodCalculator.cxx:366
 ProfileLikelihoodCalculator.cxx:367
 ProfileLikelihoodCalculator.cxx:368
 ProfileLikelihoodCalculator.cxx:369
 ProfileLikelihoodCalculator.cxx:370
 ProfileLikelihoodCalculator.cxx:371
 ProfileLikelihoodCalculator.cxx:372
 ProfileLikelihoodCalculator.cxx:373
 ProfileLikelihoodCalculator.cxx:374
 ProfileLikelihoodCalculator.cxx:375
 ProfileLikelihoodCalculator.cxx:376
 ProfileLikelihoodCalculator.cxx:377
 ProfileLikelihoodCalculator.cxx:378
 ProfileLikelihoodCalculator.cxx:379
 ProfileLikelihoodCalculator.cxx:380
 ProfileLikelihoodCalculator.cxx:381
 ProfileLikelihoodCalculator.cxx:382
 ProfileLikelihoodCalculator.cxx:383
 ProfileLikelihoodCalculator.cxx:384
 ProfileLikelihoodCalculator.cxx:385
 ProfileLikelihoodCalculator.cxx:386
 ProfileLikelihoodCalculator.cxx:387
 ProfileLikelihoodCalculator.cxx:388
 ProfileLikelihoodCalculator.cxx:389
 ProfileLikelihoodCalculator.cxx:390
 ProfileLikelihoodCalculator.cxx:391
 ProfileLikelihoodCalculator.cxx:392
 ProfileLikelihoodCalculator.cxx:393
 ProfileLikelihoodCalculator.cxx:394
 ProfileLikelihoodCalculator.cxx:395
 ProfileLikelihoodCalculator.cxx:396
 ProfileLikelihoodCalculator.cxx:397
 ProfileLikelihoodCalculator.cxx:398
 ProfileLikelihoodCalculator.cxx:399
 ProfileLikelihoodCalculator.cxx:400
 ProfileLikelihoodCalculator.cxx:401
 ProfileLikelihoodCalculator.cxx:402
 ProfileLikelihoodCalculator.cxx:403
 ProfileLikelihoodCalculator.cxx:404
 ProfileLikelihoodCalculator.cxx:405
 ProfileLikelihoodCalculator.cxx:406
 ProfileLikelihoodCalculator.cxx:407
 ProfileLikelihoodCalculator.cxx:408
 ProfileLikelihoodCalculator.cxx:409