CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
plotting.Plot Class Reference

Public Member Functions

def __init__ (self, name, kwargs)
 
def addToLegend (self, legend, legendLabels, denomUncertainty)
 
def clone (self, kwargs)
 
def create (self, tdirNEvents, requireAllHistograms=False)
 
def draw (self, pad, ratio, ratioFactor, nrows)
 
def drawRatioUncertainty (self)
 
def getName (self)
 
def getNumberOfHistograms (self)
 
def isEmpty (self)
 
def isRatio (self, ratio)
 
def isTGraph2D (self)
 
def setProperties (self, kwargs)
 

Private Member Functions

def _createOne (self, name, index, tdir, nevents)
 
def _normalize (self)
 
def _setStats (self, histos, startingX, startingY)
 

Private Attributes

 _forLegend
 
 _frame
 
 _histograms
 
 _mainAdditional
 
 _name
 
 _ratioAdditional
 
 _ratios
 
 _tmp_histos
 

Detailed Description

Represents one plot, comparing one or more histograms.

Definition at line 1691 of file plotting.py.

Constructor & Destructor Documentation

def plotting.Plot.__init__ (   self,
  name,
  kwargs 
)
Constructor.

Arguments:
name -- String for name of the plot, or Efficiency object

Keyword arguments:
fallback     -- Dictionary for specifying fallback (default None)
outname      -- String for an output name of the plot (default None for the same as 'name')
title        -- String for a title of the plot (default None)
xtitle       -- String for x axis title (default None)
xtitlesize   -- Float for x axis title size (default None)
xtitleoffset -- Float for x axis title offset (default None)
xlabelsize   -- Float for x axis label size (default None)
ytitle       -- String for y axis title (default None)
ytitlesize   -- Float for y axis title size (default None)
ytitleoffset -- Float for y axis title offset (default None)
ztitle       -- String for z axis title (default None)
ztitleoffset -- Float for z axis title offset (default None)
xmin         -- Float for x axis minimum (default None, i.e. automatic)
xmax         -- Float for x axis maximum (default None, i.e. automatic)
ymin         -- Float for y axis minimum (default 0)
ymax         -- Float for y axis maximum (default None, i.e. automatic)
xlog         -- Bool for x axis log status (default False)
ylog         -- Bool for y axis log status (default False)
xgrid        -- Bool for x axis grid status (default True)
ygrid        -- Bool for y axis grid status (default True)
stat         -- Draw stat box? (default False)
fit          -- Do gaussian fit? (default False)
statx        -- Stat box x coordinate (default 0.65)
staty        -- Stat box y coordinate (default 0.8)
statyadjust  -- List of floats for stat box y coordinate adjustments (default None)
normalizeToUnitArea -- Normalize histograms to unit area? (default False)
normalizeToNumberOfEvents -- Normalize histograms to number of events? If yes, the PlotFolder needs 'numberOfEventsHistogram' set to a histogram filled once per event (default False)
profileX     -- Take histograms via ProfileX()? (default False)
fitSlicesY   -- Take histograms via FitSlicesY() (default False)
rebinX       -- rebin x axis (default None)
scale        -- Scale histograms by a number (default None)
xbinlabels   -- List of x axis bin labels (if given, default None)
xbinlabelsize -- Size of x axis bin labels (default None)
xbinlabeloption -- Option string for x axis bin labels (default None)
removeEmptyBins -- Bool for removing empty bins, but only if histogram has bin labels (default False)
printBins    -- Bool for printing bin values, but only if histogram has bin labels (default False)
drawStyle    -- If "hist", draw as line instead of points (default None)
drawCommand  -- Deliver this to Draw() (default: None for same as drawStyle)
lineWidth    -- If drawStyle=="hist", the width of line (default 2)
legendDx     -- Float for moving TLegend in x direction for separate=True (default None)
legendDy     -- Float for moving TLegend in y direction for separate=True (default None)
legendDw     -- Float for changing TLegend width for separate=True (default None)
legendDh     -- Float for changing TLegend height for separate=True (default None)
legend       -- Bool to enable/disable legend (default True)
adjustMarginLeft  -- Float for adjusting left margin (default None)
adjustMarginRight  -- Float for adjusting right margin (default None)
ratio        -- Possibility to disable ratio for this particular plot (default None)
ratioYmin    -- Float for y axis minimum in ratio pad (default: list of values)
ratioYmax    -- Float for y axis maximum in ratio pad (default: list of values)
ratioFit     -- Fit straight line in ratio? (default None)
ratioUncertainty -- Plot uncertainties on ratio? (default True)
ratioCoverageXrange -- Range of x axis values (xmin,xmax) to limit the automatic ratio y axis range calculation to (default None for disabled)
histogramModifier -- Function to be called in create() to modify the histograms (default None)

Definition at line 1693 of file plotting.py.

1693  def __init__(self, name, **kwargs):
1694  """ Constructor.
1695 
1696  Arguments:
1697  name -- String for name of the plot, or Efficiency object
1698 
1699  Keyword arguments:
1700  fallback -- Dictionary for specifying fallback (default None)
1701  outname -- String for an output name of the plot (default None for the same as 'name')
1702  title -- String for a title of the plot (default None)
1703  xtitle -- String for x axis title (default None)
1704  xtitlesize -- Float for x axis title size (default None)
1705  xtitleoffset -- Float for x axis title offset (default None)
1706  xlabelsize -- Float for x axis label size (default None)
1707  ytitle -- String for y axis title (default None)
1708  ytitlesize -- Float for y axis title size (default None)
1709  ytitleoffset -- Float for y axis title offset (default None)
1710  ztitle -- String for z axis title (default None)
1711  ztitleoffset -- Float for z axis title offset (default None)
1712  xmin -- Float for x axis minimum (default None, i.e. automatic)
1713  xmax -- Float for x axis maximum (default None, i.e. automatic)
1714  ymin -- Float for y axis minimum (default 0)
1715  ymax -- Float for y axis maximum (default None, i.e. automatic)
1716  xlog -- Bool for x axis log status (default False)
1717  ylog -- Bool for y axis log status (default False)
1718  xgrid -- Bool for x axis grid status (default True)
1719  ygrid -- Bool for y axis grid status (default True)
1720  stat -- Draw stat box? (default False)
1721  fit -- Do gaussian fit? (default False)
1722  statx -- Stat box x coordinate (default 0.65)
1723  staty -- Stat box y coordinate (default 0.8)
1724  statyadjust -- List of floats for stat box y coordinate adjustments (default None)
1725  normalizeToUnitArea -- Normalize histograms to unit area? (default False)
1726  normalizeToNumberOfEvents -- Normalize histograms to number of events? If yes, the PlotFolder needs 'numberOfEventsHistogram' set to a histogram filled once per event (default False)
1727  profileX -- Take histograms via ProfileX()? (default False)
1728  fitSlicesY -- Take histograms via FitSlicesY() (default False)
1729  rebinX -- rebin x axis (default None)
1730  scale -- Scale histograms by a number (default None)
1731  xbinlabels -- List of x axis bin labels (if given, default None)
1732  xbinlabelsize -- Size of x axis bin labels (default None)
1733  xbinlabeloption -- Option string for x axis bin labels (default None)
1734  removeEmptyBins -- Bool for removing empty bins, but only if histogram has bin labels (default False)
1735  printBins -- Bool for printing bin values, but only if histogram has bin labels (default False)
1736  drawStyle -- If "hist", draw as line instead of points (default None)
1737  drawCommand -- Deliver this to Draw() (default: None for same as drawStyle)
1738  lineWidth -- If drawStyle=="hist", the width of line (default 2)
1739  legendDx -- Float for moving TLegend in x direction for separate=True (default None)
1740  legendDy -- Float for moving TLegend in y direction for separate=True (default None)
1741  legendDw -- Float for changing TLegend width for separate=True (default None)
1742  legendDh -- Float for changing TLegend height for separate=True (default None)
1743  legend -- Bool to enable/disable legend (default True)
1744  adjustMarginLeft -- Float for adjusting left margin (default None)
1745  adjustMarginRight -- Float for adjusting right margin (default None)
1746  ratio -- Possibility to disable ratio for this particular plot (default None)
1747  ratioYmin -- Float for y axis minimum in ratio pad (default: list of values)
1748  ratioYmax -- Float for y axis maximum in ratio pad (default: list of values)
1749  ratioFit -- Fit straight line in ratio? (default None)
1750  ratioUncertainty -- Plot uncertainties on ratio? (default True)
1751  ratioCoverageXrange -- Range of x axis values (xmin,xmax) to limit the automatic ratio y axis range calculation to (default None for disabled)
1752  histogramModifier -- Function to be called in create() to modify the histograms (default None)
1753  """
1754  self._name = name
1755 
1756  def _set(attr, default):
1757  setattr(self, "_"+attr, kwargs.get(attr, default))
1758 
1759  _set("fallback", None)
1760  _set("outname", None)
1761 
1762  _set("title", None)
1763  _set("xtitle", None)
1764  _set("xtitlesize", None)
1765  _set("xtitleoffset", None)
1766  _set("xlabelsize", None)
1767  _set("ytitle", None)
1768  _set("ytitlesize", None)
1769  _set("ytitleoffset", None)
1770  _set("ztitle", None)
1771  _set("ztitleoffset", None)
1772 
1773  _set("xmin", None)
1774  _set("xmax", None)
1775  _set("ymin", 0.)
1776  _set("ymax", None)
1777 
1778  _set("xlog", False)
1779  _set("ylog", False)
1780  _set("xgrid", True)
1781  _set("ygrid", True)
1782 
1783  _set("stat", False)
1784  _set("fit", False)
1785 
1786  _set("statx", 0.65)
1787  _set("staty", 0.8)
1788  _set("statyadjust", None)
1789 
1790  _set("normalizeToUnitArea", False)
1791  _set("normalizeToNumberOfEvents", False)
1792  _set("profileX", False)
1793  _set("fitSlicesY", False)
1794  _set("rebinX", None)
1795 
1796  _set("scale", None)
1797  _set("xbinlabels", None)
1798  _set("xbinlabelsize", None)
1799  _set("xbinlabeloption", None)
1800  _set("removeEmptyBins", False)
1801  _set("printBins", False)
1802 
1803  _set("drawStyle", "EP")
1804  _set("drawCommand", None)
1805  _set("lineWidth", 2)
1806 
1807  _set("legendDx", None)
1808  _set("legendDy", None)
1809  _set("legendDw", None)
1810  _set("legendDh", None)
1811  _set("legend", True)
1812 
1813  _set("adjustMarginLeft", None)
1814  _set("adjustMarginRight", None)
1815 
1816  _set("ratio", None)
1817  _set("ratioYmin", [0, 0.2, 0.5, 0.7, 0.8, 0.9, 0.95])
1818  _set("ratioYmax", [1.05, 1.1, 1.2, 1.3, 1.5, 1.8, 2, 2.5, 3, 4, 5])
1819  _set("ratioFit", None)
1820  _set("ratioUncertainty", True)
1821  _set("ratioCoverageXrange", None)
1822 
1823  _set("histogramModifier", None)
1824 
1825  self._histograms = []
1826 
def __init__(self, name, kwargs)
Definition: plotting.py:1693

Member Function Documentation

def plotting.Plot._createOne (   self,
  name,
  index,
  tdir,
  nevents 
)
private
Create one histogram from a TDirectory.

Definition at line 1871 of file plotting.py.

References plotting._getOrCreateObject().

Referenced by plotting.Plot.create().

1871  def _createOne(self, name, index, tdir, nevents):
1872  """Create one histogram from a TDirectory."""
1873  if tdir == None:
1874  return None
1875 
1876  # If name is a list, pick the name by the index
1877  if isinstance(name, list):
1878  name = name[index]
1879 
1880  h = _getOrCreateObject(tdir, name)
1881  if h is not None and self._normalizeToNumberOfEvents and nevents is not None and nevents != 0:
1882  h.Scale(1.0/nevents)
1883  return h
1884 
def _getOrCreateObject(tdirectory, nameOrCreator)
Definition: plotting.py:55
def _createOne(self, name, index, tdir, nevents)
Definition: plotting.py:1871
def plotting.Plot._normalize (   self)
private
Normalise histograms to unit area

Definition at line 1976 of file plotting.py.

References RunHistogramManager._histograms, and plotting.Plot._histograms.

Referenced by plotting.Plot.draw().

1976  def _normalize(self):
1977  """Normalise histograms to unit area"""
1978 
1979  for h in self._histograms:
1980  if h is None:
1981  continue
1982  i = h.Integral()
1983  if i == 0:
1984  continue
1985  if h.GetSumw2().fN <= 0: # to suppress warning
1986  h.Sumw2()
1987  h.Scale(1.0/i)
1988 
def _normalize(self)
Definition: plotting.py:1976
def plotting.Plot._setStats (   self,
  histos,
  startingX,
  startingY 
)
private
Set stats box.

Definition at line 1935 of file plotting.py.

References DTSC._stat, and DTTrigGeom._stat.

1935  def _setStats(self, histos, startingX, startingY):
1936  """Set stats box."""
1937  if not self._stat:
1938  for h in histos:
1939  if h is not None and hasattr(h, "SetStats"):
1940  h.SetStats(0)
1941  return
1942 
1943  def _doStats(h, col, dy):
1944  if h is None:
1945  return
1946  h.SetStats(True)
1947 
1948  if self._fit and h.GetEntries() > 0.5:
1949  h.Fit("gaus", "Q")
1950  f = h.GetListOfFunctions().FindObject("gaus")
1951  if f == None:
1952  h.SetStats(0)
1953  return
1954  f.SetLineColor(col)
1955  f.SetLineWidth(1)
1956  h.Draw()
1957  ROOT.gPad.Update()
1958  st = h.GetListOfFunctions().FindObject("stats")
1959  if self._fit:
1960  st.SetOptFit(0o010)
1961  st.SetOptStat(1001)
1962  st.SetX1NDC(startingX)
1963  st.SetX2NDC(startingX+0.3)
1964  st.SetY1NDC(startingY+dy)
1965  st.SetY2NDC(startingY+dy+0.15)
1966  st.SetTextColor(col)
1967 
1968  dy = 0.0
1969  for i, h in enumerate(histos):
1970  if self._statyadjust is not None and i < len(self._statyadjust):
1971  dy += self._statyadjust[i]
1972 
1973  _doStats(h, _plotStylesColor[i], dy)
1974  dy -= 0.19
1975 
def _setStats(self, histos, startingX, startingY)
Definition: plotting.py:1935
def plotting.Plot.addToLegend (   self,
  legend,
  legendLabels,
  denomUncertainty 
)
Add histograms to a legend.

Arguments:
legend       -- TLegend
legendLabels -- List of strings for the legend labels

Definition at line 2218 of file plotting.py.

References RunHistogramManager._histograms, plotting.Plot._histograms, and ComparisonHelper.zip().

2218  def addToLegend(self, legend, legendLabels, denomUncertainty):
2219  """Add histograms to a legend.
2220 
2221  Arguments:
2222  legend -- TLegend
2223  legendLabels -- List of strings for the legend labels
2224  """
2225  first = denomUncertainty
2226  for h, label in zip(self._histograms, legendLabels):
2227  if h is None:
2228  first = False
2229  continue
2230  if first:
2231  self._forLegend = h.Clone()
2232  self._forLegend.SetFillStyle(1001)
2233  self._forLegend.SetFillColor(ROOT.kGray)
2234  entry = legend.AddEntry(self._forLegend, label, "lpf")
2235  first = False
2236  else:
2237  legend.AddEntry(h, label, "LP")
2238 
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
def addToLegend(self, legend, legendLabels, denomUncertainty)
Definition: plotting.py:2218
def plotting.Plot.clone (   self,
  kwargs 
)
def plotting.Plot.create (   self,
  tdirNEvents,
  requireAllHistograms = False 
)
Create histograms from list of TDirectories

Definition at line 1885 of file plotting.py.

References plotting.Plot._createOne(), RunHistogramManager._histograms, plotting.Plot._histograms, FP420HitsObject._name, TrackerHitsObject._name, PGeometricDet::Item._name, LikelihoodSpecies._name, TrackingRecHitAlgorithm._name, LikelihoodPdfProduct._name, LikelihoodPdf._name, citk::IsolationConeDefinitionBase._name, Logger._name, hcaldqm::DQModule._name, DrellYanValidation._name, WValidation._name, HistoParams< T >._name, hcaldqm::flag::Flag._name, hcaldqm::quantity::Quantity._name, CutApplicatorBase._name, GeometricDetExtra._name, HistoParams< TH2F >._name, HistoParams< TProfile2D >._name, Vispa.Views.PropertyView.Property._name, SequenceTypes.SequencePlaceholder._name, plotting.Subtract._name, plotting.Transform._name, plotting.FakeDuplicate._name, plotting.CutEfficiency._name, plotting.AggregateBins._name, plotting.AggregateHistos._name, plotting.ROC._name, SequenceTypes.TaskPlaceholder._name, plotting.Plot._name, Vispa.Gui.VispaWidget.VispaWidget._scale, plotting.AggregateBins._scale, HistoParams< T >._title, HistoParams< TProfile >._title, HistoParams< TH1F >._title, HistoParams< TH2F >._title, SiStripHitEffFromCalibTree._title, HistoParams< TProfile2D >._title, html.PageSet._title, html.HtmlReport._title, plotting.Subtract._title, plotting.Transform._title, plotting.FakeDuplicate._title, plotting.CutEfficiency._title, and genParticles_cff.map.

1885  def create(self, tdirNEvents, requireAllHistograms=False):
1886  """Create histograms from list of TDirectories"""
1887  self._histograms = [self._createOne(self._name, i, tdirNEvent[0], tdirNEvent[1]) for i, tdirNEvent in enumerate(tdirNEvents)]
1888 
1889  if self._fallback is not None:
1890  profileX = [self._profileX]*len(self._histograms)
1891  for i in xrange(0, len(self._histograms)):
1892  if self._histograms[i] is None:
1893  self._histograms[i] = self._createOne(self._fallback["name"], i, tdirNEvents[i][0], tdirNEvents[i][1])
1894  profileX[i] = self._fallback.get("profileX", self._profileX)
1895 
1896  if self._histogramModifier is not None:
1897  self._histograms = self._histogramModifier(self._histograms)
1898 
1899  if len(self._histograms) > len(_plotStylesColor):
1900  raise Exception("More histograms (%d) than there are plot styles (%d) defined. Please define more plot styles in this file" % (len(self._histograms), len(_plotStylesColor)))
1901 
1902  # Modify histograms here in case self._name returns numbers
1903  # and self._histogramModifier creates the histograms from
1904  # these numbers
1905  def _modifyHisto(th1, profileX):
1906  if th1 is None:
1907  return None
1908 
1909  if profileX:
1910  th1 = th1.ProfileX()
1911 
1912  if self._fitSlicesY:
1913  ROOT.TH1.AddDirectory(True)
1914  th1.FitSlicesY()
1915  th1 = ROOT.gDirectory.Get(th1.GetName()+"_2")
1916  th1.SetDirectory(None)
1917  #th1.SetName(th1.GetName()+"_ref")
1918  ROOT.TH1.AddDirectory(False)
1919 
1920  if self._title is not None:
1921  th1.SetTitle(self._title)
1922 
1923  if self._scale is not None:
1924  th1.Scale(self._scale)
1925 
1926  return th1
1927 
1928  if self._fallback is not None:
1929  self._histograms = map(_modifyHisto, self._histograms, profileX)
1930  else:
1931  self._histograms = map(lambda h: _modifyHisto(h, self._profileX), self._histograms)
1932  if requireAllHistograms and None in self._histograms:
1933  self._histograms = [None]*len(self._histograms)
1934 
def create(self, tdirNEvents, requireAllHistograms=False)
Definition: plotting.py:1885
def _createOne(self, name, index, tdir, nevents)
Definition: plotting.py:1871
def plotting.Plot.draw (   self,
  pad,
  ratio,
  ratioFactor,
  nrows 
)
Draw the histograms using values for a given algorithm.

Definition at line 1989 of file plotting.py.

References RunHistogramManager._histograms, plotting.Plot._histograms, plotting._mergeBinLabelsX(), plotting._mergeBinLabelsY(), plotting.Plot._normalize(), plotting._th1IncludeOnlyBins(), HistoData.getName(), PhysicsTools::Source.getName(), emtf::Node.getName(), PassiveHit.getName(), CocoaMaterialElementary.getName(), ecaldqm::DBReaderWorker.getName(), LikelihoodSpecies.getName(), EcalLogicID.getName(), PCaloHit.getName(), ParticleFlux.getName(), ElectronMVAEstimatorRun2.getName(), pftools::SpaceManager.getName(), ecaldqm::DBWriterWorker.getName(), AnyMVAEstimatorRun2Base.getName(), LikelihoodPdf.getName(), TkOfflineVariables.getName(), hcaldqm::mapper::Mapper.getName(), FieldHandlerBase< TOutput >.getName(), FittedEntry.getName(), TrackingRecHitAlgorithm.getName(), hcaldqm::mapper::HashMapper.getName(), jsoncollector::JsonMonitorable.getName(), CSGAction.getName(), PhotonMVAEstimator.getName(), L1TUtmAlgorithm.getName(), L1TUtmScale.getName(), DTTPGLutFile.getName(), PhysicsTools::MVATrainer.getName(), L1TriggerLutFile.getName(), L1TUtmCondition.getName(), pos::PixelPortcardMap.getName(), QCriterion.getName(), L1MuGMTReg.getName(), GenericMVAComputer::TaggingVariableIterator< Iter_t >::Value.getName(), fastsim::InteractionModel.getName(), GEMStation.getName(), PhysicsTools::Variable::Value.getName(), pftools::SpaceVoxel.getName(), MVAVariableManager< ParticleType >.getName(), ecaldqm::DQWorker.getName(), RPCAMCLink.getName(), RPCDCCLink.getName(), L1TUtmObject.getName(), L1TUtmTriggerMenu.getName(), L1TUtmCut.getName(), edm::ELslProxy< ELgen >.getName(), L1MuGMTRegMMConfig.getName(), PhysicsTools::MVAModuleHelper< Record, Object, Filler >::Value.getName(), cscdqm::HistoDef.getName(), FourVectorHLT::PathInfo.getName(), RPCLBLink.getName(), MonitorElement.getName(), jsoncollector::DataPoint.getName(), edm::ELseverityLevel.getName(), PhysicsTools::Variable.getName(), PhysicsTools::TrainerMonitoring::Object.getName(), L1MuGMTRegSortRankOffset.getName(), L1MuGMTRegCDLConfig.getName(), cscdqm::CSCHistoDef.getName(), plotting.PlotEmpty.getName(), plotting.Plot.getName(), and plotting.Plot.isTGraph2D().

1989  def draw(self, pad, ratio, ratioFactor, nrows):
1990  """Draw the histograms using values for a given algorithm."""
1991 # if len(self._histograms) == 0:
1992 # print "No histograms for plot {name}".format(name=self._name)
1993 # return
1994 
1995  isTGraph2D = self.isTGraph2D()
1996  if isTGraph2D:
1997  # Ratios for the TGraph2Ds is not that interesting
1998  ratioOrig = ratio
1999  ratio = False
2000 
2001  if self._normalizeToUnitArea:
2002  self._normalize()
2003 
2004  if self._rebinX is not None:
2005  for h in self._histograms:
2006  h.Rebin(self._rebinX)
2007 
2008  def _styleMarker(h, msty, col):
2009  h.SetMarkerStyle(msty)
2010  h.SetMarkerColor(col)
2011  h.SetMarkerSize(0.7)
2012  h.SetLineColor(1)
2013  h.SetLineWidth(1)
2014 
2015  def _styleHist(h, msty, col):
2016  _styleMarker(h, msty, col)
2017  h.SetLineColor(col)
2018  h.SetLineWidth(self._lineWidth)
2019 
2020  # Use marker or hist style
2021  style = _styleMarker
2022  if "hist" in self._drawStyle.lower():
2023  style = _styleHist
2024  if len(self._histograms) > 0 and isinstance(self._histograms[0], ROOT.TGraph):
2025  if "l" in self._drawStyle.lower():
2026  style = _styleHist
2027 
2028  # Apply style to histograms, filter out Nones
2029  histos = []
2030  for i, h in enumerate(self._histograms):
2031  if h is None:
2032  continue
2033  style(h, _plotStylesMarker[i], _plotStylesColor[i])
2034  histos.append(h)
2035  if len(histos) == 0:
2036  if verbose:
2037  print "No histograms for plot {name}".format(name=self.getName())
2038  return
2039 
2040  # Extract x bin labels, make sure that only bins with same
2041  # label are compared with each other
2042  histosHaveBinLabels = len(histos[0].GetXaxis().GetBinLabel(1)) > 0
2043  xbinlabels = self._xbinlabels
2044  ybinlabels = None
2045  if xbinlabels is None:
2046  if histosHaveBinLabels:
2047  xbinlabels = _mergeBinLabelsX(histos)
2048  if isinstance(histos[0], ROOT.TH2):
2049  ybinlabels = _mergeBinLabelsY(histos)
2050 
2051  if len(histos) > 1: # don't bother if only one histogram
2052  # doing this for TH2 is pending for use case, for now there is only 1 histogram/plot for TH2
2053  histos = _th1IncludeOnlyBins(histos, xbinlabels)
2054  self._tmp_histos = histos # need to keep these in memory too ...
2055 
2056  # Remove empty bins, but only if histograms have bin labels
2057  if self._removeEmptyBins and histosHaveBinLabels:
2058  # at this point, all histograms have been "equalized" by their x binning and labels
2059  # therefore remove bins which are empty in all histograms
2060  if isinstance(histos[0], ROOT.TH2):
2061  (histos, xbinlabels, ybinlabels) = _th2RemoveEmptyBins(histos, xbinlabels, ybinlabels)
2062  else:
2063  (histos, xbinlabels) = _th1RemoveEmptyBins(histos, xbinlabels)
2064  self._tmp_histos = histos # need to keep these in memory too ...
2065  if len(histos) == 0:
2066  if verbose:
2067  print "No histograms with non-empty bins for plot {name}".format(name=self.getName())
2068  return
2069 
2070  if self._printBins and histosHaveBinLabels:
2071  print "####################"
2072  print self._name
2073  width = max([len(l) for l in xbinlabels])
2074  tmp = "%%-%ds " % width
2075  for b in xrange(1, histos[0].GetNbinsX()+1):
2076  s = tmp % xbinlabels[b-1]
2077  for h in histos:
2078  s += "%.3f " % h.GetBinContent(b)
2079  print s
2080  print
2081 
2082  bounds = _findBounds(histos, self._ylog,
2083  xmin=self._xmin, xmax=self._xmax,
2084  ymin=self._ymin, ymax=self._ymax)
2085  zmax = None
2086  if isinstance(histos[0], ROOT.TH2):
2087  zmax = max([h.GetMaximum() for h in histos])
2088 
2089  # need to keep these in memory
2092 
2093  if ratio:
2094  self._ratios = _calculateRatios(histos, self._ratioUncertainty) # need to keep these in memory too ...
2095  ratioHistos = [h for h in [r.getRatio() for r in self._ratios[1:]] if h is not None]
2096 
2097  if len(ratioHistos) > 0:
2098  ratioBoundsY = _findBoundsY(ratioHistos, ylog=False, ymin=self._ratioYmin, ymax=self._ratioYmax, coverage=0.68, coverageRange=self._ratioCoverageXrange)
2099  else:
2100  ratioBoundsY = (0.9, 1,1) # hardcoded default in absence of valid ratio calculations
2101 
2102  if self._ratioFit is not None:
2103  for i, rh in enumerate(ratioHistos):
2104  tf_line = ROOT.TF1("line%d"%i, "[0]+x*[1]")
2105  tf_line.SetRange(self._ratioFit["rangemin"], self._ratioFit["rangemax"])
2106  fitres = rh.Fit(tf_line, "RINSQ")
2107  tf_line.SetLineColor(rh.GetMarkerColor())
2108  tf_line.SetLineWidth(2)
2109  self._ratioAdditional.append(tf_line)
2110  box = PlotTextBox(xmin=self._ratioFit.get("boxXmin", 0.14), ymin=None, # None for automatix
2111  xmax=self._ratioFit.get("boxXmax", 0.35), ymax=self._ratioFit.get("boxYmax", 0.09),
2112  color=rh.GetMarkerColor(), font=43, size=11, lineheight=0.02)
2113  box.move(dx=(box.width()+0.01)*i)
2114  #box.addText("Const: %.4f" % fitres.Parameter(0))
2115  #box.addText("Slope: %.4f" % fitres.Parameter(1))
2116  box.addText("Const: %.4f#pm%.4f" % (fitres.Parameter(0), fitres.ParError(0)))
2117  box.addText("Slope: %.4f#pm%.4f" % (fitres.Parameter(1), fitres.ParError(1)))
2118  self._mainAdditional.append(box)
2119 
2120 
2121  # Create bounds before stats in order to have the
2122  # SetRangeUser() calls made before the fit
2123  #
2124  # stats is better to be called before frame, otherwise get
2125  # mess in the plot (that frame creation cleans up)
2126  if ratio:
2127  pad.cd(1)
2128  self._setStats(histos, self._statx, self._staty)
2129 
2130  # Create frame
2131  if isTGraph2D:
2132  frame = FrameTGraph2D(pad, bounds, histos, ratioOrig, ratioFactor)
2133  else:
2134  if ratio:
2135  ratioBounds = (bounds[0], ratioBoundsY[0], bounds[2], ratioBoundsY[1])
2136  frame = FrameRatio(pad, bounds, zmax, ratioBounds, ratioFactor, nrows, xbinlabels, self._xbinlabelsize, self._xbinlabeloption)
2137  else:
2138  frame = Frame(pad, bounds, zmax, nrows, xbinlabels, self._xbinlabelsize, self._xbinlabeloption, ybinlabels=ybinlabels)
2139 
2140  # Set log and grid
2141  frame.setLogx(self._xlog)
2142  frame.setLogy(self._ylog)
2143  frame.setGridx(self._xgrid)
2144  frame.setGridy(self._ygrid)
2145 
2146  # Construct draw option string
2147  opt = "sames" # s for statbox or something?
2148  ds = ""
2149  if self._drawStyle is not None:
2150  ds = self._drawStyle
2151  if self._drawCommand is not None:
2152  ds = self._drawCommand
2153  if len(ds) > 0:
2154  opt += " "+ds
2155 
2156  # Set properties of frame
2157  frame.setTitle(histos[0].GetTitle())
2158  if self._xtitle is not None:
2159  frame.setXTitle(self._xtitle)
2160  if self._xtitlesize is not None:
2161  frame.setXTitleSize(self._xtitlesize)
2162  if self._xtitleoffset is not None:
2163  frame.setXTitleOffset(self._xtitleoffset)
2164  if self._xlabelsize is not None:
2165  frame.setXLabelSize(self._xlabelsize)
2166  if self._ytitle is not None:
2167  frame.setYTitle(self._ytitle)
2168  if self._ytitlesize is not None:
2169  frame.setYTitleSize(self._ytitlesize)
2170  if self._ytitleoffset is not None:
2171  frame.setYTitleOffset(self._ytitleoffset)
2172  if self._ztitle is not None:
2173  frame.setZTitle(self._ztitle)
2174  if self._ztitleoffset is not None:
2175  frame.setZTitleOffset(self._ztitleoffset)
2176  if self._adjustMarginLeft is not None:
2177  frame.adjustMarginLeft(self._adjustMarginLeft)
2178  if self._adjustMarginRight is not None:
2179  frame.adjustMarginRight(self._adjustMarginRight)
2180  elif "z" in opt:
2181  frame.adjustMarginLeft(0.03)
2182  frame.adjustMarginRight(0.08)
2183 
2184  # Draw histograms
2185  if ratio:
2186  frame._pad.cd()
2187 
2188  for i, h in enumerate(histos):
2189  o = opt
2190  if isTGraph2D and i == 0:
2191  o = o.replace("sames", "")
2192  h.Draw(o)
2193 
2194  for addl in self._mainAdditional:
2195  addl.Draw("same")
2196 
2197  # Draw ratios
2198  if ratio and len(histos) > 0:
2199  frame._padRatio.cd()
2200  firstRatio = self._ratios[0].getRatio()
2201  if self._ratioUncertainty and firstRatio is not None:
2202  firstRatio.SetFillStyle(1001)
2203  firstRatio.SetFillColor(ROOT.kGray)
2204  firstRatio.SetLineColor(ROOT.kGray)
2205  firstRatio.SetMarkerColor(ROOT.kGray)
2206  firstRatio.SetMarkerSize(0)
2207  self._ratios[0].draw("E2")
2208  frame._padRatio.RedrawAxis("G") # redraw grid on top of the uncertainty of denominator
2209  for r in self._ratios[1:]:
2210  r.draw()
2211 
2212  for addl in self._ratioAdditional:
2213  addl.Draw("same")
2214 
2215  frame.redrawAxis()
2216  self._frame = frame # keep the frame in memory for sure
2217 
def _findBoundsY(th1s, ylog, ymin=None, ymax=None, coverage=None, coverageRange=None)
Definition: plotting.py:523
def _findBounds(th1s, ylog, xmin=None, xmax=None, ymin=None, ymax=None)
Definition: plotting.py:455
def _calculateRatios(histos, ratioUncertainty=False)
Definition: plotting.py:146
def _setStats(self, histos, startingX, startingY)
Definition: plotting.py:1935
def draw(self, pad, ratio, ratioFactor, nrows)
Definition: plotting.py:1989
Definition: style.py:1
def _mergeBinLabelsY(histos)
Definition: plotting.py:706
def _normalize(self)
Definition: plotting.py:1976
def _th1RemoveEmptyBins(histos, xbinlabels)
Definition: plotting.py:603
def isTGraph2D(self)
Definition: plotting.py:1848
def _th2RemoveEmptyBins(histos, xbinlabels, ybinlabels)
Definition: plotting.py:643
def getName(self)
Definition: plotting.py:1859
def _mergeBinLabelsX(histos)
Definition: plotting.py:703
def _th1IncludeOnlyBins(histos, xbinlabels)
Definition: plotting.py:740
def plotting.Plot.drawRatioUncertainty (   self)
Return true if the ratio uncertainty should be drawn

Definition at line 1867 of file plotting.py.

1868  """Return true if the ratio uncertainty should be drawn"""
1869  return self._ratioUncertainty
1870 
def drawRatioUncertainty(self)
Definition: plotting.py:1867
def plotting.Plot.getName (   self)
def plotting.Plot.getNumberOfHistograms (   self)
Return number of existing histograms.

Definition at line 1840 of file plotting.py.

References RunHistogramManager._histograms, and plotting.Plot._histograms.

Referenced by plotting.Plot.isEmpty().

1841  """Return number of existing histograms."""
1842  return len([h for h in self._histograms if h is not None])
1843 
def getNumberOfHistograms(self)
Definition: plotting.py:1840
def plotting.Plot.isEmpty (   self)
Return true if there are no histograms created for the plot

Definition at line 1844 of file plotting.py.

References plotting.PlotEmpty.getNumberOfHistograms(), and plotting.Plot.getNumberOfHistograms().

Referenced by plotting.Plot.clone().

1844  def isEmpty(self):
1845  """Return true if there are no histograms created for the plot"""
1846  return self.getNumberOfHistograms() == 0
1847 
def getNumberOfHistograms(self)
Definition: plotting.py:1840
def isEmpty(self)
Definition: plotting.py:1844
def plotting.Plot.isRatio (   self,
  ratio 
)

Definition at line 1854 of file plotting.py.

1854  def isRatio(self, ratio):
1855  if self._ratio is None:
1856  return ratio
1857  return ratio and self._ratio
1858 
def isRatio(self, ratio)
Definition: plotting.py:1854
def plotting.Plot.isTGraph2D (   self)

Definition at line 1848 of file plotting.py.

References RunHistogramManager._histograms, and plotting.Plot._histograms.

Referenced by plotting.Plot.draw().

1848  def isTGraph2D(self):
1849  for h in self._histograms:
1850  if isinstance(h, ROOT.TGraph2D):
1851  return True
1852  return False
1853 
def isTGraph2D(self)
Definition: plotting.py:1848
def plotting.Plot.setProperties (   self,
  kwargs 
)

Definition at line 1827 of file plotting.py.

1827  def setProperties(self, **kwargs):
1828  for name, value in six.iteritems(kwargs):
1829  if not hasattr(self, "_"+name):
1830  raise Exception("No attribute '%s'" % name)
1831  setattr(self, "_"+name, value)
1832 
def setProperties(self, kwargs)
Definition: plotting.py:1827

Member Data Documentation

plotting.Plot._forLegend
private

Definition at line 2231 of file plotting.py.

plotting.Plot._frame
private

Definition at line 2216 of file plotting.py.

plotting.Plot._histograms
private
plotting.Plot._mainAdditional
private

Definition at line 2090 of file plotting.py.

plotting.Plot._name
private
plotting.Plot._ratioAdditional
private

Definition at line 2091 of file plotting.py.

plotting.Plot._ratios
private

Definition at line 2094 of file plotting.py.

plotting.Plot._tmp_histos
private

Definition at line 2054 of file plotting.py.