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 1694 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 1696 of file plotting.py.

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

Member Function Documentation

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

Definition at line 1874 of file plotting.py.

References plotting._getOrCreateObject().

Referenced by plotting.Plot.create().

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

Definition at line 1979 of file plotting.py.

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

Referenced by plotting.Plot.draw().

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

Definition at line 1938 of file plotting.py.

References DTSC._stat, and DTTrigGeom._stat.

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

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

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

Definition at line 1888 of file plotting.py.

References plotting.Plot._createOne(), RunHistogramManager._histograms, plotting.Plot._histograms, TrackerHitsObject._name, FP420HitsObject._name, PGeometricDet::Item._name, LikelihoodSpecies._name, TrackingRecHitAlgorithm._name, LikelihoodPdfProduct._name, Logger._name, hcaldqm::DQModule._name, LikelihoodPdf._name, citk::IsolationConeDefinitionBase._name, DrellYanValidation._name, WValidation._name, hcaldqm::flag::Flag._name, hcaldqm::quantity::Quantity._name, HistoParams< T >._name, GeometricTimingDetExtra._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< TProfile >._title, HistoParams< T >._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.

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

Definition at line 1992 of file plotting.py.

References RunHistogramManager._histograms, plotting.Plot._histograms, plotting._mergeBinLabelsX(), plotting._mergeBinLabelsY(), plotting.Plot._normalize(), plotting._th1IncludeOnlyBins(), HistoData.getName(), PassiveHit.getName(), PhysicsTools::Source.getName(), emtf::Node.getName(), PCaloHit.getName(), CocoaMaterialElementary.getName(), ecaldqm::DBReaderWorker.getName(), LikelihoodSpecies.getName(), ParticleFlux.getName(), EcalLogicID.getName(), ecaldqm::DBWriterWorker.getName(), hcaldqm::mapper::Mapper.getName(), LikelihoodPdf.getName(), TkOfflineVariables.getName(), FieldHandlerBase< TOutput >.getName(), FittedEntry.getName(), hcaldqm::mapper::HashMapper.getName(), TrackingRecHitAlgorithm.getName(), jsoncollector::JsonMonitorable.getName(), CSGAction.getName(), AnyMVAEstimatorRun2Base.getName(), DTTPGLutFile.getName(), L1TUtmAlgorithm.getName(), L1TUtmScale.getName(), MVAVariableManager< ParticleType >.getName(), PhysicsTools::MVATrainer.getName(), L1TriggerLutFile.getName(), L1TUtmCondition.getName(), pos::PixelPortcardMap.getName(), QCriterion.getName(), fastsim::InteractionModel.getName(), L1MuGMTReg.getName(), GenericMVAComputer::TaggingVariableIterator< Iter_t >::Value.getName(), GEMStation.getName(), PhysicsTools::Variable::Value.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(), plotting.Plot.isTGraph2D(), and edm.print().

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

Definition at line 1870 of file plotting.py.

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

Definition at line 1843 of file plotting.py.

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

Referenced by plotting.Plot.isEmpty().

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

Definition at line 1847 of file plotting.py.

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

Referenced by plotting.Plot.clone().

1847  def isEmpty(self):
1848  """Return true if there are no histograms created for the plot"""
1849  return self.getNumberOfHistograms() == 0
1850 
def getNumberOfHistograms(self)
Definition: plotting.py:1843
def isEmpty(self)
Definition: plotting.py:1847
def plotting.Plot.isRatio (   self,
  ratio 
)

Definition at line 1857 of file plotting.py.

1857  def isRatio(self, ratio):
1858  if self._ratio is None:
1859  return ratio
1860  return ratio and self._ratio
1861 
def isRatio(self, ratio)
Definition: plotting.py:1857
def plotting.Plot.isTGraph2D (   self)

Definition at line 1851 of file plotting.py.

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

Referenced by plotting.Plot.draw().

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

Definition at line 1830 of file plotting.py.

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

Member Data Documentation

plotting.Plot._forLegend
private

Definition at line 2234 of file plotting.py.

plotting.Plot._frame
private

Definition at line 2219 of file plotting.py.

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

Definition at line 2093 of file plotting.py.

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

Definition at line 2094 of file plotting.py.

plotting.Plot._ratios
private

Definition at line 2097 of file plotting.py.

plotting.Plot._tmp_histos
private

Definition at line 2057 of file plotting.py.