ROOT logo
// @(#)root/roostats:$Id: LikelihoodIntervalPlot.h 26427 2009-05-20 15:45:36Z pellicci $

/*************************************************************************
 * Project: RooStats                                                     *
 * Package: RooFit/RooStats                                              *
 * Authors:                                                              *
 *   Kyle Cranmer, Lorenzo Moneta, Gregory Schott, Wouter Verkerke       *
 *************************************************************************
 * 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.             *
 *************************************************************************/

//____________________________________________________________________
/*
LikelihoodIntervalPlot : 

This class provides simple and straightforward utilities to plot a LikelihoodInterval
object.
*/

#include "RooStats/LikelihoodIntervalPlot.h"

#include <algorithm>
#include <iostream>

#include "TROOT.h"
#include "TMath.h"
#include "TLine.h"
#include "TObjArray.h"
#include "TList.h"
#include "TGraph.h"
#include "TPad.h"

#include "RooRealVar.h"
#include "RooPlot.h"

/// ClassImp for building the THtml documentation of the class 
ClassImp(RooStats::LikelihoodIntervalPlot);

using namespace RooStats;

//_______________________________________________________
LikelihoodIntervalPlot::LikelihoodIntervalPlot()
{
  // LikelihoodIntervalPlot default constructor
  fInterval = 0;
  fNdimPlot = 0;
  fParamsPlot = 0;
  fColor = 0;
  fFillStyle = 4050; // half transparent
  fLineColor = 0;
  fMaximum = 2.;
}

//_______________________________________________________
LikelihoodIntervalPlot::LikelihoodIntervalPlot(LikelihoodInterval* theInterval)
{
  // LikelihoodIntervalPlot constructor
  fInterval = theInterval;
  fParamsPlot = fInterval->GetParameters();
  fNdimPlot = fParamsPlot->getSize();
  fColor = kBlue;
  fLineColor = kGreen;
  fFillStyle = 4050; // half transparent
  fMaximum = 2.;
}

//_______________________________________________________
LikelihoodIntervalPlot::~LikelihoodIntervalPlot()
{
  // LikelihoodIntervalPlot destructor
}

//_____________________________________________________________________________
void LikelihoodIntervalPlot::SetLikelihoodInterval(LikelihoodInterval* theInterval)
{
  fInterval = theInterval;
  fParamsPlot = fInterval->GetParameters();
  fNdimPlot = fParamsPlot->getSize();

  return;
}

//_____________________________________________________________________________
void LikelihoodIntervalPlot::SetPlotParameters(const RooArgSet *params) 
{
  fNdimPlot = params->getSize();
  fParamsPlot = (RooArgSet*) params->clone((std::string(params->GetName())+"_clone").c_str());

  return;
}

//_____________________________________________________________________________
void LikelihoodIntervalPlot::Draw(const Option_t *options) 
{

  if(fNdimPlot > 2){
    std::cout << "LikelihoodIntervalPlot::Draw(" << GetName() 
	      << ") ERROR: contours for more than 2 dimensions not implemented!" << std::endl;
    return;
  }

  TIter it = fParamsPlot->createIterator();
  RooRealVar *myparam = (RooRealVar*)it.Next();


  //  RooAbsReal* newProfile = fInterval->GetLikelihoodRatio()->createProfile(*fParamsPlot);
  RooAbsReal* newProfile = fInterval->GetLikelihoodRatio(); 

  if(fNdimPlot == 1){

    const Double_t xcont_min = fInterval->LowerLimit(*myparam);
    const Double_t xcont_max = fInterval->UpperLimit(*myparam);

    RooRealVar* myarg = (RooRealVar *) newProfile->getVariables()->find(myparam->GetName());

    RooPlot *frame = myarg->frame();
    frame->SetTitle(GetTitle());
    frame->GetYaxis()->SetTitle("- log #lambda");
    //    frame->GetYaxis()->SetTitle("- log profile likelihood ratio");

    newProfile->plotOn(frame); 

    frame->SetMaximum(fMaximum);
    frame->SetMinimum(0.);

    // Double_t debug_var= newProfile->getVal();
    myarg->setVal(xcont_min);
    //const Double_t Yat_Xmin = newProfile->getVal();

    myarg->setVal(xcont_max);
    const Double_t Yat_Xmax = newProfile->getVal();

    TLine *Yline_cutoff = new TLine(myarg->getMin(),Yat_Xmax,myarg->getMax(),Yat_Xmax);
    TLine *Yline_min = new TLine(xcont_min,0.,xcont_min,Yat_Xmax);
    TLine *Yline_max = new TLine(xcont_max,0.,xcont_max,Yat_Xmax);

    //std::cout <<"debug " << xcont_min << "   " << xcont_max << "   "
    //<< Yat_Xmin << "   "  << Yat_Xmax << std::endl;

    Yline_cutoff->SetLineColor(fLineColor);
    Yline_min->SetLineColor(fLineColor);
    Yline_max->SetLineColor(fLineColor);

    frame->addObject(Yline_cutoff);
    frame->addObject(Yline_min);
    frame->addObject(Yline_max);

    frame->Draw(options);

    return;
  }
  else if(fNdimPlot == 2){

    RooRealVar *myparamY = (RooRealVar*)it.Next();

    TH2F* hist2D = (TH2F*)newProfile->createHistogram("_hist2D",*myparamY,RooFit::YVar(*myparam),RooFit::Binning(40),RooFit::Scaling(kFALSE));


    hist2D->SetTitle(GetTitle());
    hist2D->SetStats(kFALSE);

    Double_t cont_level = TMath::ChisquareQuantile(fInterval->ConfidenceLevel(),fNdimPlot); // level for -2log LR
    cont_level = cont_level/2; // since we are plotting -log LR
    hist2D->SetContour(1,&cont_level);

    hist2D->SetFillColor(fColor); 
    hist2D->SetFillStyle(fFillStyle); 
    hist2D->SetLineColor(fLineColor);

    TString tmpOpt(options);

    if(!tmpOpt.Contains("CONT")) tmpOpt.Append("CONT");
    if(!tmpOpt.Contains("LIST")) tmpOpt.Append("LIST"); // if you want the contour TGraphs

    hist2D->Draw(tmpOpt.Data());
    //    hist2D->Draw("cont2,list,same");

    gPad->Update();  // needed for get list of specials 

    // get TGraphs and add them
    //    gROOT->GetListOfSpecials()->Print();
    TObjArray *contours = (TObjArray*) gROOT->GetListOfSpecials()->FindObject("contours"); 
    if(contours){
      TList *list = (TList*)contours->At(0); 
      TGraph *gr1 = (TGraph*)list->First();
      gr1->SetLineColor(kBlack);
      gr1->SetLineStyle(kDashed);
      gr1->Draw("same");
    } else{
      std::cout << "no countours found in ListOfSpecials" << std::endl;
    }

    return;
  }


  return;
}
 LikelihoodIntervalPlot.cxx:1
 LikelihoodIntervalPlot.cxx:2
 LikelihoodIntervalPlot.cxx:3
 LikelihoodIntervalPlot.cxx:4
 LikelihoodIntervalPlot.cxx:5
 LikelihoodIntervalPlot.cxx:6
 LikelihoodIntervalPlot.cxx:7
 LikelihoodIntervalPlot.cxx:8
 LikelihoodIntervalPlot.cxx:9
 LikelihoodIntervalPlot.cxx:10
 LikelihoodIntervalPlot.cxx:11
 LikelihoodIntervalPlot.cxx:12
 LikelihoodIntervalPlot.cxx:13
 LikelihoodIntervalPlot.cxx:14
 LikelihoodIntervalPlot.cxx:15
 LikelihoodIntervalPlot.cxx:16
 LikelihoodIntervalPlot.cxx:17
 LikelihoodIntervalPlot.cxx:18
 LikelihoodIntervalPlot.cxx:19
 LikelihoodIntervalPlot.cxx:20
 LikelihoodIntervalPlot.cxx:21
 LikelihoodIntervalPlot.cxx:22
 LikelihoodIntervalPlot.cxx:23
 LikelihoodIntervalPlot.cxx:24
 LikelihoodIntervalPlot.cxx:25
 LikelihoodIntervalPlot.cxx:26
 LikelihoodIntervalPlot.cxx:27
 LikelihoodIntervalPlot.cxx:28
 LikelihoodIntervalPlot.cxx:29
 LikelihoodIntervalPlot.cxx:30
 LikelihoodIntervalPlot.cxx:31
 LikelihoodIntervalPlot.cxx:32
 LikelihoodIntervalPlot.cxx:33
 LikelihoodIntervalPlot.cxx:34
 LikelihoodIntervalPlot.cxx:35
 LikelihoodIntervalPlot.cxx:36
 LikelihoodIntervalPlot.cxx:37
 LikelihoodIntervalPlot.cxx:38
 LikelihoodIntervalPlot.cxx:39
 LikelihoodIntervalPlot.cxx:40
 LikelihoodIntervalPlot.cxx:41
 LikelihoodIntervalPlot.cxx:42
 LikelihoodIntervalPlot.cxx:43
 LikelihoodIntervalPlot.cxx:44
 LikelihoodIntervalPlot.cxx:45
 LikelihoodIntervalPlot.cxx:46
 LikelihoodIntervalPlot.cxx:47
 LikelihoodIntervalPlot.cxx:48
 LikelihoodIntervalPlot.cxx:49
 LikelihoodIntervalPlot.cxx:50
 LikelihoodIntervalPlot.cxx:51
 LikelihoodIntervalPlot.cxx:52
 LikelihoodIntervalPlot.cxx:53
 LikelihoodIntervalPlot.cxx:54
 LikelihoodIntervalPlot.cxx:55
 LikelihoodIntervalPlot.cxx:56
 LikelihoodIntervalPlot.cxx:57
 LikelihoodIntervalPlot.cxx:58
 LikelihoodIntervalPlot.cxx:59
 LikelihoodIntervalPlot.cxx:60
 LikelihoodIntervalPlot.cxx:61
 LikelihoodIntervalPlot.cxx:62
 LikelihoodIntervalPlot.cxx:63
 LikelihoodIntervalPlot.cxx:64
 LikelihoodIntervalPlot.cxx:65
 LikelihoodIntervalPlot.cxx:66
 LikelihoodIntervalPlot.cxx:67
 LikelihoodIntervalPlot.cxx:68
 LikelihoodIntervalPlot.cxx:69
 LikelihoodIntervalPlot.cxx:70
 LikelihoodIntervalPlot.cxx:71
 LikelihoodIntervalPlot.cxx:72
 LikelihoodIntervalPlot.cxx:73
 LikelihoodIntervalPlot.cxx:74
 LikelihoodIntervalPlot.cxx:75
 LikelihoodIntervalPlot.cxx:76
 LikelihoodIntervalPlot.cxx:77
 LikelihoodIntervalPlot.cxx:78
 LikelihoodIntervalPlot.cxx:79
 LikelihoodIntervalPlot.cxx:80
 LikelihoodIntervalPlot.cxx:81
 LikelihoodIntervalPlot.cxx:82
 LikelihoodIntervalPlot.cxx:83
 LikelihoodIntervalPlot.cxx:84
 LikelihoodIntervalPlot.cxx:85
 LikelihoodIntervalPlot.cxx:86
 LikelihoodIntervalPlot.cxx:87
 LikelihoodIntervalPlot.cxx:88
 LikelihoodIntervalPlot.cxx:89
 LikelihoodIntervalPlot.cxx:90
 LikelihoodIntervalPlot.cxx:91
 LikelihoodIntervalPlot.cxx:92
 LikelihoodIntervalPlot.cxx:93
 LikelihoodIntervalPlot.cxx:94
 LikelihoodIntervalPlot.cxx:95
 LikelihoodIntervalPlot.cxx:96
 LikelihoodIntervalPlot.cxx:97
 LikelihoodIntervalPlot.cxx:98
 LikelihoodIntervalPlot.cxx:99
 LikelihoodIntervalPlot.cxx:100
 LikelihoodIntervalPlot.cxx:101
 LikelihoodIntervalPlot.cxx:102
 LikelihoodIntervalPlot.cxx:103
 LikelihoodIntervalPlot.cxx:104
 LikelihoodIntervalPlot.cxx:105
 LikelihoodIntervalPlot.cxx:106
 LikelihoodIntervalPlot.cxx:107
 LikelihoodIntervalPlot.cxx:108
 LikelihoodIntervalPlot.cxx:109
 LikelihoodIntervalPlot.cxx:110
 LikelihoodIntervalPlot.cxx:111
 LikelihoodIntervalPlot.cxx:112
 LikelihoodIntervalPlot.cxx:113
 LikelihoodIntervalPlot.cxx:114
 LikelihoodIntervalPlot.cxx:115
 LikelihoodIntervalPlot.cxx:116
 LikelihoodIntervalPlot.cxx:117
 LikelihoodIntervalPlot.cxx:118
 LikelihoodIntervalPlot.cxx:119
 LikelihoodIntervalPlot.cxx:120
 LikelihoodIntervalPlot.cxx:121
 LikelihoodIntervalPlot.cxx:122
 LikelihoodIntervalPlot.cxx:123
 LikelihoodIntervalPlot.cxx:124
 LikelihoodIntervalPlot.cxx:125
 LikelihoodIntervalPlot.cxx:126
 LikelihoodIntervalPlot.cxx:127
 LikelihoodIntervalPlot.cxx:128
 LikelihoodIntervalPlot.cxx:129
 LikelihoodIntervalPlot.cxx:130
 LikelihoodIntervalPlot.cxx:131
 LikelihoodIntervalPlot.cxx:132
 LikelihoodIntervalPlot.cxx:133
 LikelihoodIntervalPlot.cxx:134
 LikelihoodIntervalPlot.cxx:135
 LikelihoodIntervalPlot.cxx:136
 LikelihoodIntervalPlot.cxx:137
 LikelihoodIntervalPlot.cxx:138
 LikelihoodIntervalPlot.cxx:139
 LikelihoodIntervalPlot.cxx:140
 LikelihoodIntervalPlot.cxx:141
 LikelihoodIntervalPlot.cxx:142
 LikelihoodIntervalPlot.cxx:143
 LikelihoodIntervalPlot.cxx:144
 LikelihoodIntervalPlot.cxx:145
 LikelihoodIntervalPlot.cxx:146
 LikelihoodIntervalPlot.cxx:147
 LikelihoodIntervalPlot.cxx:148
 LikelihoodIntervalPlot.cxx:149
 LikelihoodIntervalPlot.cxx:150
 LikelihoodIntervalPlot.cxx:151
 LikelihoodIntervalPlot.cxx:152
 LikelihoodIntervalPlot.cxx:153
 LikelihoodIntervalPlot.cxx:154
 LikelihoodIntervalPlot.cxx:155
 LikelihoodIntervalPlot.cxx:156
 LikelihoodIntervalPlot.cxx:157
 LikelihoodIntervalPlot.cxx:158
 LikelihoodIntervalPlot.cxx:159
 LikelihoodIntervalPlot.cxx:160
 LikelihoodIntervalPlot.cxx:161
 LikelihoodIntervalPlot.cxx:162
 LikelihoodIntervalPlot.cxx:163
 LikelihoodIntervalPlot.cxx:164
 LikelihoodIntervalPlot.cxx:165
 LikelihoodIntervalPlot.cxx:166
 LikelihoodIntervalPlot.cxx:167
 LikelihoodIntervalPlot.cxx:168
 LikelihoodIntervalPlot.cxx:169
 LikelihoodIntervalPlot.cxx:170
 LikelihoodIntervalPlot.cxx:171
 LikelihoodIntervalPlot.cxx:172
 LikelihoodIntervalPlot.cxx:173
 LikelihoodIntervalPlot.cxx:174
 LikelihoodIntervalPlot.cxx:175
 LikelihoodIntervalPlot.cxx:176
 LikelihoodIntervalPlot.cxx:177
 LikelihoodIntervalPlot.cxx:178
 LikelihoodIntervalPlot.cxx:179
 LikelihoodIntervalPlot.cxx:180
 LikelihoodIntervalPlot.cxx:181
 LikelihoodIntervalPlot.cxx:182
 LikelihoodIntervalPlot.cxx:183
 LikelihoodIntervalPlot.cxx:184
 LikelihoodIntervalPlot.cxx:185
 LikelihoodIntervalPlot.cxx:186
 LikelihoodIntervalPlot.cxx:187
 LikelihoodIntervalPlot.cxx:188
 LikelihoodIntervalPlot.cxx:189
 LikelihoodIntervalPlot.cxx:190
 LikelihoodIntervalPlot.cxx:191
 LikelihoodIntervalPlot.cxx:192
 LikelihoodIntervalPlot.cxx:193
 LikelihoodIntervalPlot.cxx:194
 LikelihoodIntervalPlot.cxx:195
 LikelihoodIntervalPlot.cxx:196
 LikelihoodIntervalPlot.cxx:197
 LikelihoodIntervalPlot.cxx:198
 LikelihoodIntervalPlot.cxx:199
 LikelihoodIntervalPlot.cxx:200
 LikelihoodIntervalPlot.cxx:201
 LikelihoodIntervalPlot.cxx:202