ROOT logo
// @(#)root/roostats:$Id$
// Author: Kyle Cranmer    June 2010
/*************************************************************************
 * 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.             *
 *************************************************************************/

#ifndef ROOSTATS_MaxLikelihoodEstimateTestStat
#define ROOSTATS_MaxLikelihoodEstimateTestStat

//_________________________________________________
/*
BEGIN_HTML
<p>
MaxLikelihoodEstimateTestStat: TestStatistic that returns maximum likelihood estimate of a specified parameter.
</p>
END_HTML
*/
//

#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif

#ifndef ROO_NLL_VAR
#include "RooNLLVar.h"
#endif

#include "RooFitResult.h"
#include "RooStats/TestStatistic.h"
#include "RooAbsPdf.h"
#include "RooRealVar.h"

namespace RooStats {

class MaxLikelihoodEstimateTestStat: public TestStatistic {

   public:

   //__________________________________
   MaxLikelihoodEstimateTestStat() :
   fPdf(NULL),fParameter(NULL), fUpperLimit(true)
   {
     // constructor
     //      fPdf = pdf;
     //      fParameter = parameter;
   }
   //__________________________________
   MaxLikelihoodEstimateTestStat(RooAbsPdf& pdf, RooRealVar& parameter) :
   fPdf(&pdf),fParameter(&parameter), fUpperLimit(true)
   {
      // constructor
      //      fPdf = pdf;
      //      fParameter = parameter;
   }

  //______________________________
  virtual Double_t Evaluate(RooAbsData& data, RooArgSet& /*nullPOI*/) {
      
    
    RooFit::MsgLevel msglevel = RooMsgService::instance().globalKillBelow();
    RooMsgService::instance().setGlobalKillBelow(RooFit::FATAL);

    /*
    // this is more straight forward, but produces a lot of messages
    RooFitResult* res = fPdf.fitTo(data, RooFit::CloneData(kFALSE),RooFit::Minos(0),RooFit::Hesse(false), RooFit::Save(1),RooFit::PrintLevel(-1),RooFit::PrintEvalErrors(0));
    RooRealVar* mle = (RooRealVar*) res->floatParsFinal().find(fParameter.GetName());
    double ret = mle->getVal();
    delete res;
    return ret;
    */

    RooAbsReal* nll = fPdf->createNLL(data, RooFit::CloneData(false));
    RooAbsReal* profile = nll->createProfile(RooArgSet());
    profile->getVal();
    RooArgSet* vars = profile->getVariables();
    RooMsgService::instance().setGlobalKillBelow(msglevel);
    double ret = vars->getRealValue(fParameter->GetName());
    delete vars;
    delete nll;
    delete profile;
    return ret;

  }
  
  virtual const TString GetVarName() const { 
    TString varName = Form("Maximum Likelihood Estimate of %s",fParameter->GetName());
    return varName;
  }

      
  virtual void PValueIsRightTail(bool isright) {  fUpperLimit = isright; }
  virtual bool PValueIsRightTail(void) const { return fUpperLimit; }


   private:
      RooAbsPdf *fPdf;
      RooRealVar *fParameter;
      bool fUpperLimit;

   protected:
   ClassDef(MaxLikelihoodEstimateTestStat,1)
};

}


#endif
 MaxLikelihoodEstimateTestStat.h:1
 MaxLikelihoodEstimateTestStat.h:2
 MaxLikelihoodEstimateTestStat.h:3
 MaxLikelihoodEstimateTestStat.h:4
 MaxLikelihoodEstimateTestStat.h:5
 MaxLikelihoodEstimateTestStat.h:6
 MaxLikelihoodEstimateTestStat.h:7
 MaxLikelihoodEstimateTestStat.h:8
 MaxLikelihoodEstimateTestStat.h:9
 MaxLikelihoodEstimateTestStat.h:10
 MaxLikelihoodEstimateTestStat.h:11
 MaxLikelihoodEstimateTestStat.h:12
 MaxLikelihoodEstimateTestStat.h:13
 MaxLikelihoodEstimateTestStat.h:14
 MaxLikelihoodEstimateTestStat.h:15
 MaxLikelihoodEstimateTestStat.h:16
 MaxLikelihoodEstimateTestStat.h:17
 MaxLikelihoodEstimateTestStat.h:18
 MaxLikelihoodEstimateTestStat.h:19
 MaxLikelihoodEstimateTestStat.h:20
 MaxLikelihoodEstimateTestStat.h:21
 MaxLikelihoodEstimateTestStat.h:22
 MaxLikelihoodEstimateTestStat.h:23
 MaxLikelihoodEstimateTestStat.h:24
 MaxLikelihoodEstimateTestStat.h:25
 MaxLikelihoodEstimateTestStat.h:26
 MaxLikelihoodEstimateTestStat.h:27
 MaxLikelihoodEstimateTestStat.h:28
 MaxLikelihoodEstimateTestStat.h:29
 MaxLikelihoodEstimateTestStat.h:30
 MaxLikelihoodEstimateTestStat.h:31
 MaxLikelihoodEstimateTestStat.h:32
 MaxLikelihoodEstimateTestStat.h:33
 MaxLikelihoodEstimateTestStat.h:34
 MaxLikelihoodEstimateTestStat.h:35
 MaxLikelihoodEstimateTestStat.h:36
 MaxLikelihoodEstimateTestStat.h:37
 MaxLikelihoodEstimateTestStat.h:38
 MaxLikelihoodEstimateTestStat.h:39
 MaxLikelihoodEstimateTestStat.h:40
 MaxLikelihoodEstimateTestStat.h:41
 MaxLikelihoodEstimateTestStat.h:42
 MaxLikelihoodEstimateTestStat.h:43
 MaxLikelihoodEstimateTestStat.h:44
 MaxLikelihoodEstimateTestStat.h:45
 MaxLikelihoodEstimateTestStat.h:46
 MaxLikelihoodEstimateTestStat.h:47
 MaxLikelihoodEstimateTestStat.h:48
 MaxLikelihoodEstimateTestStat.h:49
 MaxLikelihoodEstimateTestStat.h:50
 MaxLikelihoodEstimateTestStat.h:51
 MaxLikelihoodEstimateTestStat.h:52
 MaxLikelihoodEstimateTestStat.h:53
 MaxLikelihoodEstimateTestStat.h:54
 MaxLikelihoodEstimateTestStat.h:55
 MaxLikelihoodEstimateTestStat.h:56
 MaxLikelihoodEstimateTestStat.h:57
 MaxLikelihoodEstimateTestStat.h:58
 MaxLikelihoodEstimateTestStat.h:59
 MaxLikelihoodEstimateTestStat.h:60
 MaxLikelihoodEstimateTestStat.h:61
 MaxLikelihoodEstimateTestStat.h:62
 MaxLikelihoodEstimateTestStat.h:63
 MaxLikelihoodEstimateTestStat.h:64
 MaxLikelihoodEstimateTestStat.h:65
 MaxLikelihoodEstimateTestStat.h:66
 MaxLikelihoodEstimateTestStat.h:67
 MaxLikelihoodEstimateTestStat.h:68
 MaxLikelihoodEstimateTestStat.h:69
 MaxLikelihoodEstimateTestStat.h:70
 MaxLikelihoodEstimateTestStat.h:71
 MaxLikelihoodEstimateTestStat.h:72
 MaxLikelihoodEstimateTestStat.h:73
 MaxLikelihoodEstimateTestStat.h:74
 MaxLikelihoodEstimateTestStat.h:75
 MaxLikelihoodEstimateTestStat.h:76
 MaxLikelihoodEstimateTestStat.h:77
 MaxLikelihoodEstimateTestStat.h:78
 MaxLikelihoodEstimateTestStat.h:79
 MaxLikelihoodEstimateTestStat.h:80
 MaxLikelihoodEstimateTestStat.h:81
 MaxLikelihoodEstimateTestStat.h:82
 MaxLikelihoodEstimateTestStat.h:83
 MaxLikelihoodEstimateTestStat.h:84
 MaxLikelihoodEstimateTestStat.h:85
 MaxLikelihoodEstimateTestStat.h:86
 MaxLikelihoodEstimateTestStat.h:87
 MaxLikelihoodEstimateTestStat.h:88
 MaxLikelihoodEstimateTestStat.h:89
 MaxLikelihoodEstimateTestStat.h:90
 MaxLikelihoodEstimateTestStat.h:91
 MaxLikelihoodEstimateTestStat.h:92
 MaxLikelihoodEstimateTestStat.h:93
 MaxLikelihoodEstimateTestStat.h:94
 MaxLikelihoodEstimateTestStat.h:95
 MaxLikelihoodEstimateTestStat.h:96
 MaxLikelihoodEstimateTestStat.h:97
 MaxLikelihoodEstimateTestStat.h:98
 MaxLikelihoodEstimateTestStat.h:99
 MaxLikelihoodEstimateTestStat.h:100
 MaxLikelihoodEstimateTestStat.h:101
 MaxLikelihoodEstimateTestStat.h:102
 MaxLikelihoodEstimateTestStat.h:103
 MaxLikelihoodEstimateTestStat.h:104
 MaxLikelihoodEstimateTestStat.h:105
 MaxLikelihoodEstimateTestStat.h:106
 MaxLikelihoodEstimateTestStat.h:107
 MaxLikelihoodEstimateTestStat.h:108
 MaxLikelihoodEstimateTestStat.h:109
 MaxLikelihoodEstimateTestStat.h:110
 MaxLikelihoodEstimateTestStat.h:111