// A RooPlot is a plot frame and a container for graphics objects
// within that frame. As a frame, it provides the TH1-style public interface
// for settting plot ranges, configuring axes, etc. As a container, it
// holds an arbitrary set of objects that might be histograms of data,
// curves representing a fit model, or text labels. Use the Draw()
// method to draw a frame and the objects it contains. Use the various
// add...() methods to add objects to be drawn. In general, the
// add...() methods create a private copy of the object you pass them
// and return a pointer to this copy. The caller owns the input object
// and this class owns the returned object.
// <p>
// All RooAbsReal and RooAbsData derived classes implement plotOn()
// functions that facilitate to plot themselves on a given RooPlot, e.g.
// <pre>
// RooPlot *frame = x.frame() ;
// data.plotOn(frame) ;
// pdf.plotOn(frame) ;
// </pre>
// These high level functions also take care of any projections
// or other mappings that need to be made to plot a multi-dimensional
// object onto a one-dimensional plot.
// END_HTML
#include "RooFit.h"
#include "TClass.h"
#include "TH1D.h"
#include "TBrowser.h"
#include "TPad.h"
#include "RooPlot.h"
#include "RooAbsReal.h"
#include "RooAbsRealLValue.h"
#include "RooPlotable.h"
#include "RooArgSet.h"
#include "RooCurve.h"
#include "RooHist.h"
#include "RooMsgService.h"
#include "TAttLine.h"
#include "TAttFill.h"
#include "TAttMarker.h"
#include "TAttText.h"
#include "TDirectory.h"
#include "TDirectoryFile.h"
#include "Riostream.h"
#include <string.h>
#include <assert.h>
using namespace std;
ClassImp(RooPlot)
;
Bool_t RooPlot::_addDirStatus = kTRUE ;
Bool_t RooPlot::addDirectoryStatus() { return _addDirStatus ; }
Bool_t RooPlot::setAddDirectoryStatus(Bool_t flag) { Bool_t ret = flag ; _addDirStatus = flag ; return ret ; }
RooPlot::RooPlot() : _hist(0), _plotVarClone(0), _plotVarSet(0), _normVars(0), _normObj(0), _dir(0)
{
_iterator= _items.MakeIterator() ;
if (gDirectory && addDirectoryStatus()) {
_dir = gDirectory ;
gDirectory->Append(this) ;
}
}
RooPlot::RooPlot(Double_t xmin, Double_t xmax) :
_hist(0), _items(), _plotVarClone(0), _plotVarSet(0), _normObj(0),
_defYmin(1e-5), _defYmax(1), _dir(0)
{
Bool_t histAddDirStatus = TH1::AddDirectoryStatus();
TH1::AddDirectory(kFALSE) ;
_hist = new TH1D(histName(),"A RooPlot",100,xmin,xmax) ;
_hist->Sumw2(kFALSE) ;
_hist->GetSumw2()->Set(0) ;
TH1::AddDirectory(histAddDirStatus) ;
initialize();
}
RooPlot::RooPlot(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax) :
_hist(0), _items(), _plotVarClone(0),
_plotVarSet(0), _normObj(0), _defYmin(1e-5), _defYmax(0), _dir(0)
{
Bool_t histAddDirStatus = TH1::AddDirectoryStatus();
TH1::AddDirectory(kFALSE) ;
_hist = new TH1D(histName(),"A RooPlot",100,xmin,xmax) ;
_hist->Sumw2(kFALSE) ;
_hist->GetSumw2()->Set(0) ;
TH1::AddDirectory(histAddDirStatus) ;
SetMinimum(ymin);
SetMaximum(ymax);
initialize();
}
RooPlot::RooPlot(const RooAbsRealLValue &var1, const RooAbsRealLValue &var2) :
_hist(0), _items(),
_plotVarClone(0), _plotVarSet(0), _normObj(0), _defYmin(1e-5), _defYmax(0), _dir(0)
{
Bool_t histAddDirStatus = TH1::AddDirectoryStatus();
TH1::AddDirectory(kFALSE) ;
_hist = new TH1D(histName(),"A RooPlot",100,var1.getMin(),var1.getMax()) ;
_hist->Sumw2(kFALSE) ;
_hist->GetSumw2()->Set(0) ;
TH1::AddDirectory(histAddDirStatus) ;
if(!var1.hasMin() || !var1.hasMax()) {
coutE(InputArguments) << "RooPlot::RooPlot: cannot create plot for variable without finite limits: "
<< var1.GetName() << endl;
return;
}
if(!var2.hasMin() || !var2.hasMax()) {
coutE(InputArguments) << "RooPlot::RooPlot: cannot create plot for variable without finite limits: "
<< var1.GetName() << endl;
return;
}
SetMinimum(var2.getMin());
SetMaximum(var2.getMax());
SetXTitle(var1.getTitle(kTRUE));
SetYTitle(var2.getTitle(kTRUE));
initialize();
}
RooPlot::RooPlot(const RooAbsRealLValue &var1, const RooAbsRealLValue &var2,
Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax) :
_hist(0), _items(), _plotVarClone(0),
_plotVarSet(0), _normObj(0), _defYmin(1e-5), _defYmax(0), _dir(0)
{
Bool_t histAddDirStatus = TH1::AddDirectoryStatus();
TH1::AddDirectory(kFALSE) ;
_hist = new TH1D(histName(),"A RooPlot",100,xmin,xmax) ;
_hist->Sumw2(kFALSE) ;
_hist->GetSumw2()->Set(0) ;
TH1::AddDirectory(histAddDirStatus) ;
SetMinimum(ymin);
SetMaximum(ymax);
SetXTitle(var1.getTitle(kTRUE));
SetYTitle(var2.getTitle(kTRUE));
initialize();
}
RooPlot::RooPlot(const char* name, const char* title, const RooAbsRealLValue &var, Double_t xmin, Double_t xmax, Int_t nbins) :
_hist(0), _items(),
_plotVarClone(0), _plotVarSet(0), _normObj(0), _defYmin(1e-5), _defYmax(1), _dir(0)
{
Bool_t histAddDirStatus = TH1::AddDirectoryStatus();
TH1::AddDirectory(kFALSE) ;
_hist = new TH1D(name,title,nbins,xmin,xmax) ;
_hist->Sumw2(kFALSE) ;
_hist->GetSumw2()->Set(0) ;
TH1::AddDirectory(histAddDirStatus) ;
_plotVarSet = (RooArgSet*) RooArgSet(var).snapshot() ;
_plotVarClone= (RooAbsRealLValue*)_plotVarSet->find(var.GetName()) ;
TString xtitle= var.getTitle(kTRUE);
SetXTitle(xtitle.Data());
initialize();
_normBinWidth = (xmax-xmin)/nbins ;
}
RooPlot::RooPlot(const RooAbsRealLValue &var, Double_t xmin, Double_t xmax, Int_t nbins) :
_hist(0), _items(),
_plotVarClone(0), _plotVarSet(0), _normObj(0), _defYmin(1e-5), _defYmax(1), _dir(0)
{
Bool_t histAddDirStatus = TH1::AddDirectoryStatus();
TH1::AddDirectory(kFALSE) ;
_hist = new TH1D(histName(),"RooPlot",nbins,xmin,xmax) ;
_hist->Sumw2(kFALSE) ;
_hist->GetSumw2()->Set(0) ;
TH1::AddDirectory(histAddDirStatus) ;
_plotVarSet = (RooArgSet*) RooArgSet(var).snapshot() ;
_plotVarClone= (RooAbsRealLValue*)_plotVarSet->find(var.GetName()) ;
TString xtitle= var.getTitle(kTRUE);
SetXTitle(xtitle.Data());
TString title("A RooPlot of \"");
title.Append(var.getTitle());
title.Append("\"");
SetTitle(title.Data());
initialize();
_normBinWidth = (xmax-xmin)/nbins ;
}
RooPlot* RooPlot::emptyClone(const char* name)
{
RooPlot* clone = new RooPlot(*_plotVarClone,_hist->GetXaxis()->GetXmin(),_hist->GetXaxis()->GetXmax(),_hist->GetNbinsX()) ;
clone->SetName(name) ;
return clone ;
}
void RooPlot::initialize()
{
SetName(histName()) ;
if (gDirectory && addDirectoryStatus()) {
_dir = gDirectory ;
gDirectory->Append(this) ;
}
_hist->SetStats(kFALSE);
setPadFactor(0.05);
_normNumEvts= 0;
_normBinWidth = 0;
_normVars= 0;
_iterator= _items.MakeIterator();
assert(0 != _iterator);
}
TString RooPlot::histName() const
{
if (_plotVarClone) {
return TString(Form("frame_%s_%lx",_plotVarClone->GetName(),(ULong_t)this)) ;
} else {
return TString(Form("frame_%lx",(ULong_t)this)) ;
}
}
RooPlot::~RooPlot()
{
if (_dir) {
if (!_dir->TestBit(TDirectoryFile::kCloseDirectory)) {
_dir->GetList()->RecursiveRemove(this) ;
}
}
_items.Delete();
delete _iterator;
if(_plotVarSet) delete _plotVarSet;
if(_normVars) delete _normVars;
delete _hist ;
}
void RooPlot::updateNormVars(const RooArgSet &vars)
{
if(0 == _normVars) _normVars= (RooArgSet*) vars.snapshot(kTRUE);
}
Stat_t RooPlot::GetBinContent(Int_t ) const {
return 0;
}
Stat_t RooPlot::GetBinContent(Int_t, Int_t) const
{
return 0;
}
Stat_t RooPlot::GetBinContent(Int_t, Int_t, Int_t) const
{
return 0;
}
void RooPlot::addObject(TObject *obj, Option_t *drawOptions, Bool_t invisible)
{
if(0 == obj) {
coutE(InputArguments) << fName << "::addObject: called with a null pointer" << endl;
return;
}
DrawOpt opt(drawOptions) ;
opt.invisible = invisible ;
_items.Add(obj,opt.rawOpt());
}
void RooPlot::addTH1(TH1 *hist, Option_t *drawOptions, Bool_t invisible)
{
if(0 == hist) {
coutE(InputArguments) << fName << "::addTH1: called with a null pointer" << endl;
return;
}
if(1 != hist->GetDimension()) {
coutE(InputArguments) << fName << "::addTH1: cannot plot histogram with "
<< hist->GetDimension() << " dimensions" << endl;
return;
}
TString options(drawOptions);
options.ToUpper();
if(!options.Contains("SAME")) options.Append("SAME");
updateYAxis(hist->GetMinimum(),hist->GetMaximum(),hist->GetYaxis()->GetTitle());
updateFitRangeNorm(hist);
addObject(hist,options.Data(),invisible);
}
void RooPlot::addPlotable(RooPlotable *plotable, Option_t *drawOptions, Bool_t invisible, Bool_t refreshNorm)
{
updateYAxis(plotable->getYAxisMin(),plotable->getYAxisMax(),plotable->getYAxisLabel());
updateFitRangeNorm(plotable,refreshNorm) ;
TObject *obj= plotable->crossCast();
if(0 == obj) {
coutE(InputArguments) << fName << "::add: cross-cast to TObject failed (nothing added)" << endl;
}
else {
DrawOpt opt(drawOptions) ;
opt.invisible = invisible ;
_items.Add(obj,opt.rawOpt());
}
}
void RooPlot::updateFitRangeNorm(const TH1* hist)
{
const TAxis* xa = ((TH1*)hist)->GetXaxis() ;
_normBinWidth = (xa->GetXmax()-xa->GetXmin())/hist->GetNbinsX() ;
_normNumEvts = hist->GetEntries()/_normBinWidth ;
}
void RooPlot::updateFitRangeNorm(const RooPlotable* rp, Bool_t refreshNorm)
{
if (_normNumEvts != 0) {
if (!refreshNorm) return ;
Double_t corFac(1.0) ;
if (dynamic_cast<const RooHist*>(rp)) corFac = _normBinWidth/rp->getFitRangeBinW() ;
if (fabs(rp->getFitRangeNEvt()/corFac-_normNumEvts)>1e-6) {
coutI(Plotting) << "RooPlot::updateFitRangeNorm: New event count of " << rp->getFitRangeNEvt()/corFac
<< " will supercede previous event count of " << _normNumEvts << " for normalization of PDF projections" << endl ;
}
_normNumEvts = rp->getFitRangeNEvt()/corFac ;
_normObj = rp ;
} else {
_normObj = rp ;
_normNumEvts = rp->getFitRangeNEvt() ;
if (rp->getFitRangeBinW()) {
_normBinWidth = rp->getFitRangeBinW() ;
}
}
}
void RooPlot::updateYAxis(Double_t ymin, Double_t ymax, const char *label)
{
if(GetMinimum() == 0 && ymin > 0) ymin= 0;
Double_t ypad= getPadFactor()*(ymax-ymin);
ymax+= ypad;
if(ymin < 0) ymin-= ypad;
if(GetMaximum() < ymax) {
_defYmax = ymax ;
SetMaximum(ymax);
_hist->SetBinContent(1,ymax) ;
}
if(GetMinimum() > ymin) {
_defYmin = ymin ;
SetMinimum(ymin);
}
if(0 == strlen(_hist->GetYaxis()->GetTitle())) _hist->SetYTitle(label);
}
void RooPlot::Draw(Option_t *option)
{
TString optArg = option ;
optArg.ToLower() ;
if (optArg.Contains("same")) {
_hist->Draw("FUNCSAME");
} else {
_hist->Draw("FUNC");
}
_iterator->Reset();
TObject *obj = 0;
while((obj= _iterator->Next())) {
DrawOpt opt(_iterator->GetOption()) ;
if (!opt.invisible) {
if (!strlen(opt.drawOptions) && obj->IsA()->InheritsFrom(TGraph::Class()) ) strlcpy(opt.drawOptions,"LP",3);
obj->Draw(opt.drawOptions);
}
}
_hist->Draw("AXISSAME");
}
void RooPlot::printName(ostream& os) const
{
os << GetName() ;
}
void RooPlot::printTitle(ostream& os) const
{
os << GetTitle() ;
}
void RooPlot::printClassName(ostream& os) const
{
os << IsA()->GetName() ;
}
void RooPlot::printArgs(ostream& os) const
{
if (_plotVarClone) {
os << "[" ;
_plotVarClone->printStream(os,kName,kInline) ;
os << "]" ;
}
}
void RooPlot::printValue(ostream& os) const
{
os << "(" ;
_iterator->Reset();
TObject *obj = 0;
Bool_t first(kTRUE) ;
while((obj= _iterator->Next())) {
if (first) {
first=kFALSE ;
} else {
os << "," ;
}
if(obj->IsA()->InheritsFrom(RooPrintable::Class())) {
RooPrintable* po = dynamic_cast<RooPrintable*>(obj) ;
po->printStream(os,kClassName|kName,kInline) ;
}
else {
os << obj->ClassName() << "::" << obj->GetName() ;
}
}
os << ")" ;
}
void RooPlot::printMultiline(ostream& os, Int_t , Bool_t verbose, TString indent) const
{
TString deeper(indent);
deeper.Append(" ");
if(0 != _plotVarClone) {
os << indent << "RooPlot " << GetName() << " (" << GetTitle() << ") plots variable ";
_plotVarClone->printStream(os,kName|kTitle,kSingleLine,"");
}
else {
os << indent << "RooPlot " << GetName() << " (" << GetTitle() << ") has no associated plot variable" << endl ;
}
os << indent << " Plot frame contains " << _items.GetSize() << " object(s):" << endl;
if(verbose) {
_iterator->Reset();
TObject *obj = 0;
Int_t i=0 ;
while((obj= _iterator->Next())) {
os << deeper << "[" << i++ << "] (Options=\"" << _iterator->GetOption() << "\") ";
if(obj->IsA()->InheritsFrom(RooPrintable::Class())) {
RooPrintable* po = dynamic_cast<RooPrintable*>(obj) ;
if (po) {
po->printStream(os,kName|kClassName|kArgs|kExtras,kSingleLine) ;
}
}
else {
os << obj->ClassName() << "::" << obj->GetName() << endl;
}
}
}
}
const char* RooPlot::nameOf(Int_t idx) const
{
TObject* obj = _items.At(idx) ;
if (!obj) {
coutE(InputArguments) << "RooPlot::nameOf(" << GetName() << ") index " << idx << " out of range" << endl ;
return 0 ;
}
return obj->GetName() ;
}
TObject* RooPlot::getObject(Int_t idx) const
{
TObject* obj = _items.At(idx) ;
if (!obj) {
coutE(InputArguments) << "RooPlot::getObject(" << GetName() << ") index " << idx << " out of range" << endl ;
return 0 ;
}
return obj ;
}
TAttLine *RooPlot::getAttLine(const char *name) const
{
return dynamic_cast<TAttLine*>(findObject(name));
}
TAttFill *RooPlot::getAttFill(const char *name) const
{
return dynamic_cast<TAttFill*>(findObject(name));
}
TAttMarker *RooPlot::getAttMarker(const char *name) const
{
return dynamic_cast<TAttMarker*>(findObject(name));
}
TAttText *RooPlot::getAttText(const char *name) const
{
return dynamic_cast<TAttText*>(findObject(name));
}
RooCurve* RooPlot::getCurve(const char* name) const
{
return dynamic_cast<RooCurve*>(findObject(name)) ;
}
RooHist* RooPlot::getHist(const char* name) const
{
return dynamic_cast<RooHist*>(findObject(name)) ;
}
void RooPlot::remove(const char* name, Bool_t deleteToo)
{
TObject* obj = findObject(name) ;
if (!obj) {
if (name) {
coutE(InputArguments) << "RooPlot::remove(" << GetName() << ") ERROR: no object found with name " << name << endl ;
} else {
coutE(InputArguments) << "RooPlot::remove(" << GetName() << ") ERROR: plot frame is empty, cannot remove last object" << endl ;
}
return ;
}
_items.Remove(obj) ;
if (deleteToo) {
delete obj ;
}
}
Bool_t RooPlot::drawBefore(const char *before, const char *target)
{
return _items.moveBefore(before, target, caller("drawBefore"));
}
Bool_t RooPlot::drawAfter(const char *after, const char *target)
{
return _items.moveAfter(after, target, caller("drawAfter"));
}
TObject *RooPlot::findObject(const char *name, const TClass* clas) const
{
TObject *obj = 0;
TObject *ret = 0;
TIterator* iter = _items.MakeIterator() ;
while((obj=iter->Next())) {
if ((!name || !TString(name).CompareTo(obj->GetName())) &&
(!clas || (obj->IsA()==clas))) {
ret = obj ;
}
}
delete iter ;
if (ret==0) {
coutE(InputArguments) << "RooPlot::findObject(" << GetName() << ") cannot find object " << (name?name:"<last>") << endl ;
}
return ret ;
}
TString RooPlot::getDrawOptions(const char *name) const
{
TObjOptLink *link= _items.findLink(name,caller("getDrawOptions"));
DrawOpt opt(0 == link ? "" : link->GetOption()) ;
return TString(opt.drawOptions) ;
}
Bool_t RooPlot::setDrawOptions(const char *name, TString options)
{
TObjOptLink *link= _items.findLink(name,caller("setDrawOptions"));
if(0 == link) return kFALSE;
DrawOpt opt(link->GetOption()) ;
strlcpy(opt.drawOptions,options,128) ;
link->SetOption(opt.rawOpt());
return kTRUE;
}
Bool_t RooPlot::getInvisible(const char* name) const
{
TObjOptLink *link= _items.findLink(name,caller("getInvisible"));
if(0 == link) return kFALSE;
return DrawOpt(link->GetOption()).invisible ;
}
void RooPlot::setInvisible(const char* name, Bool_t flag)
{
TObjOptLink *link= _items.findLink(name,caller("getInvisible"));
DrawOpt opt ;
if(link) {
opt.initialize(link->GetOption()) ;
opt.invisible = flag ;
link->SetOption(opt.rawOpt()) ;
}
}
TString RooPlot::caller(const char *method) const
{
TString name(fName);
if(strlen(method)) {
name.Append("::");
name.Append(method);
}
return name;
}
void RooPlot::SetMaximum(Double_t maximum)
{
_hist->SetMaximum(maximum==-1111?_defYmax:maximum) ;
}
void RooPlot::SetMinimum(Double_t minimum)
{
_hist->SetMinimum(minimum==-1111?_defYmin:minimum) ;
}
Double_t RooPlot::chiSquare(const char* curvename, const char* histname, Int_t nFitParam) const
{
RooCurve* curve = (RooCurve*) findObject(curvename,RooCurve::Class()) ;
if (!curve) {
coutE(InputArguments) << "RooPlot::chiSquare(" << GetName() << ") cannot find curve" << endl ;
return -1. ;
}
RooHist* hist = (RooHist*) findObject(histname,RooHist::Class()) ;
if (!hist) {
coutE(InputArguments) << "RooPlot::chiSquare(" << GetName() << ") cannot find histogram" << endl ;
return -1. ;
}
return curve->chiSquare(*hist,nFitParam) ;
}
RooHist* RooPlot::residHist(const char* histname, const char* curvename, bool normalize, bool useAverage) const
{
RooCurve* curve = (RooCurve*) findObject(curvename,RooCurve::Class()) ;
if (!curve) {
coutE(InputArguments) << "RooPlot::residHist(" << GetName() << ") cannot find curve" << endl ;
return 0 ;
}
RooHist* hist = (RooHist*) findObject(histname,RooHist::Class()) ;
if (!hist) {
coutE(InputArguments) << "RooPlot::residHist(" << GetName() << ") cannot find histogram" << endl ;
return 0 ;
}
return hist->makeResidHist(*curve,normalize,useAverage) ;
}
void RooPlot::DrawOpt::initialize(const char* inRawOpt)
{
if (!inRawOpt) {
drawOptions[0] = 0 ;
invisible=kFALSE ;
return ;
}
strlcpy(drawOptions,inRawOpt,128) ;
strtok(drawOptions,":") ;
const char* extraOpt = strtok(0,":") ;
if (extraOpt) {
invisible = (extraOpt[0]=='I') ;
}
}
const char* RooPlot::DrawOpt::rawOpt() const
{
static char buf[128] ;
strlcpy(buf,drawOptions,128) ;
if (invisible) {
strlcat(buf,":I",128) ;
}
return buf ;
}
Double_t RooPlot::getFitRangeNEvt(Double_t xlo, Double_t xhi) const
{
Double_t scaleFactor = 1.0 ;
if (_normObj) {
scaleFactor = _normObj->getFitRangeNEvt(xlo,xhi)/_normObj->getFitRangeNEvt() ;
} else {
coutW(Plotting) << "RooPlot::getFitRangeNEvt(" << GetName() << ") WARNING: Unable to obtain event count in range "
<< xlo << " to " << xhi << ", substituting full event count" << endl ;
}
return getFitRangeNEvt()*scaleFactor ;
}
void RooPlot::SetName(const char *name)
{
if (_dir) _dir->GetList()->Remove(this);
TNamed::SetName(name) ;
if (_dir) _dir->GetList()->Add(this);
}
void RooPlot::SetNameTitle(const char *name, const char* title)
{
if (_dir) _dir->GetList()->Remove(this);
TNamed::SetNameTitle(name,title) ;
if (_dir) _dir->GetList()->Add(this);
}
void RooPlot::SetTitle(const char* title)
{
TNamed::SetTitle(title) ;
_hist->SetTitle(title) ;
}
Int_t RooPlot::defaultPrintContents(Option_t* ) const
{
return kName|kArgs|kValue ;
}
TAxis* RooPlot::GetXaxis() const { return _hist->GetXaxis() ; }
TAxis* RooPlot::GetYaxis() const { return _hist->GetYaxis() ; }
Int_t RooPlot::GetNbinsX() const { return _hist->GetNbinsX() ; }
Int_t RooPlot::GetNdivisions(Option_t* axis) const { return _hist->GetNdivisions(axis) ; }
Double_t RooPlot::GetMinimum(Double_t minval) const { return _hist->GetMinimum(minval) ; }
Double_t RooPlot::GetMaximum(Double_t maxval) const { return _hist->GetMaximum(maxval) ; }
void RooPlot::SetAxisColor(Color_t color, Option_t* axis) { _hist->SetAxisColor(color,axis) ; }
void RooPlot::SetAxisRange(Double_t xmin, Double_t xmax, Option_t* axis) { _hist->SetAxisRange(xmin,xmax,axis) ; }
void RooPlot::SetBarOffset(Float_t offset) { _hist->SetBarOffset(offset) ; }
void RooPlot::SetBarWidth(Float_t width) { _hist->SetBarWidth(width) ; }
void RooPlot::SetContour(Int_t nlevels, const Double_t* levels) { _hist->SetContour(nlevels,levels) ; }
void RooPlot::SetContourLevel(Int_t level, Double_t value) { _hist->SetContourLevel(level,value) ; }
void RooPlot::SetDrawOption(Option_t* option) { _hist->SetDrawOption(option) ; }
void RooPlot::SetFillAttributes() { _hist->SetFillAttributes() ; }
void RooPlot::SetFillColor(Color_t fcolor) { _hist->SetFillColor(fcolor) ; }
void RooPlot::SetFillStyle(Style_t fstyle) { _hist->SetFillStyle(fstyle) ; }
void RooPlot::SetLabelColor(Color_t color, Option_t* axis) { _hist->SetLabelColor(color,axis) ; }
void RooPlot::SetLabelFont(Style_t font, Option_t* axis) { _hist->SetLabelFont(font,axis) ; }
void RooPlot::SetLabelOffset(Float_t offset, Option_t* axis) { _hist->SetLabelOffset(offset,axis) ; }
void RooPlot::SetLabelSize(Float_t size, Option_t* axis) { _hist->SetLabelSize(size,axis) ; }
void RooPlot::SetLineAttributes() { _hist->SetLineAttributes() ; }
void RooPlot::SetLineColor(Color_t lcolor) { _hist->SetLineColor(lcolor) ; }
void RooPlot::SetLineStyle(Style_t lstyle) { _hist->SetLineStyle(lstyle) ; }
void RooPlot::SetLineWidth(Width_t lwidth) { _hist->SetLineWidth(lwidth) ; }
void RooPlot::SetMarkerAttributes() { _hist->SetMarkerAttributes() ; }
void RooPlot::SetMarkerColor(Color_t tcolor) { _hist->SetMarkerColor(tcolor) ; }
void RooPlot::SetMarkerSize(Size_t msize) { _hist->SetMarkerSize(msize) ; }
void RooPlot::SetMarkerStyle(Style_t mstyle) { _hist->SetMarkerStyle(mstyle) ; }
void RooPlot::SetNdivisions(Int_t n, Option_t* axis) { _hist->SetNdivisions(n,axis) ; }
void RooPlot::SetOption(Option_t* option) { _hist->SetOption(option) ; }
void RooPlot::SetStats(Bool_t stats) { _hist->SetStats(stats) ; }
void RooPlot::SetTickLength(Float_t length, Option_t* axis) { _hist->SetTickLength(length,axis) ; }
void RooPlot::SetTitleFont(Style_t font, Option_t* axis) { _hist->SetTitleFont(font,axis) ; }
void RooPlot::SetTitleOffset(Float_t offset, Option_t* axis) { _hist->SetTitleOffset(offset,axis) ; }
void RooPlot::SetTitleSize(Float_t size, Option_t* axis) { _hist->SetTitleSize(size,axis) ; }
void RooPlot::SetXTitle(const char *title) { _hist->SetXTitle(title) ; }
void RooPlot::SetYTitle(const char *title) { _hist->SetYTitle(title) ; }
void RooPlot::SetZTitle(const char *title) { _hist->SetZTitle(title) ; }
void RooPlot::Browse(TBrowser * )
{
Draw();
gPad->Update();
}
void RooPlot::Streamer(TBuffer &R__b)
{
if (R__b.IsReading()) {
TH1::AddDirectory(kFALSE) ;
UInt_t R__s, R__c;
Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
if (R__v > 1) {
R__b.ReadClassBuffer(RooPlot::Class(),this,R__v,R__s,R__c);
} else {
_hist = new TH1F();
_hist->TH1::Streamer(R__b);
SetName(_hist->GetName());
SetTitle(_hist->GetTitle());
RooPrintable::Streamer(R__b);
_items.Streamer(R__b);
R__b >> _padFactor;
R__b >> _plotVarClone;
R__b >> _plotVarSet;
R__b >> _normVars;
R__b >> _normNumEvts;
R__b >> _normBinWidth;
R__b >> _defYmin;
R__b >> _defYmax;
R__b.CheckByteCount(R__s, R__c, RooPlot::IsA());
}
TH1::AddDirectory(kTRUE) ;
} else {
R__b.WriteClassBuffer(RooPlot::Class(),this);
}
}