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 1486 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)
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 1488 of file plotting.py.

1488  def __init__(self, name, **kwargs):
1489  """ Constructor.
1490 
1491  Arguments:
1492  name -- String for name of the plot, or Efficiency object
1493 
1494  Keyword arguments:
1495  fallback -- Dictionary for specifying fallback (default None)
1496  outname -- String for an output name of the plot (default None for the same as 'name')
1497  title -- String for a title of the plot (default None)
1498  xtitle -- String for x axis title (default None)
1499  xtitlesize -- Float for x axis title size (default None)
1500  xtitleoffset -- Float for x axis title offset (default None)
1501  xlabelsize -- Float for x axis label size (default None)
1502  ytitle -- String for y axis title (default None)
1503  ytitlesize -- Float for y axis title size (default None)
1504  ytitleoffset -- Float for y axis title offset (default None)
1505  ztitle -- String for z axis title (default None)
1506  ztitleoffset -- Float for z axis title offset (default None)
1507  xmin -- Float for x axis minimum (default None, i.e. automatic)
1508  xmax -- Float for x axis maximum (default None, i.e. automatic)
1509  ymin -- Float for y axis minimum (default 0)
1510  ymax -- Float for y axis maximum (default None, i.e. automatic)
1511  xlog -- Bool for x axis log status (default False)
1512  ylog -- Bool for y axis log status (default False)
1513  xgrid -- Bool for x axis grid status (default True)
1514  ygrid -- Bool for y axis grid status (default True)
1515  stat -- Draw stat box? (default False)
1516  fit -- Do gaussian fit? (default False)
1517  statx -- Stat box x coordinate (default 0.65)
1518  staty -- Stat box y coordinate (default 0.8)
1519  statyadjust -- List of floats for stat box y coordinate adjustments (default None)
1520  normalizeToUnitArea -- Normalize histograms to unit area? (default False)
1521  normalizeToNumberOfEvents -- Normalize histograms to number of events? If yes, the PlotFolder needs 'numberOfEventsHistogram' set to a histogram filled once per event (default False)
1522  profileX -- Take histograms via ProfileX()? (default False)
1523  fitSlicesY -- Take histograms via FitSlicesY() (default False)
1524  rebinX -- rebin x axis (default None)
1525  scale -- Scale histograms by a number (default None)
1526  xbinlabels -- List of x axis bin labels (if given, default None)
1527  xbinlabelsize -- Size of x axis bin labels (default None)
1528  xbinlabeloption -- Option string for x axis bin labels (default None)
1529  removeEmptyBins -- Bool for removing empty bins, but only if histogram has bin labels (default False)
1530  printBins -- Bool for printing bin values, but only if histogram has bin labels (default False)
1531  drawStyle -- If "hist", draw as line instead of points (default None)
1532  drawCommand -- Deliver this to Draw() (default: None for same as drawStyle)
1533  lineWidth -- If drawStyle=="hist", the width of line (default 2)
1534  legendDx -- Float for moving TLegend in x direction for separate=True (default None)
1535  legendDy -- Float for moving TLegend in y direction for separate=True (default None)
1536  legendDw -- Float for changing TLegend width for separate=True (default None)
1537  legendDh -- Float for changing TLegend height for separate=True (default None)
1538  legend -- Bool to enable/disable legend (default True)
1539  adjustMarginRight -- Float for adjusting right margin (default None)
1540  ratio -- Possibility to disable ratio for this particular plot (default None)
1541  ratioYmin -- Float for y axis minimum in ratio pad (default: list of values)
1542  ratioYmax -- Float for y axis maximum in ratio pad (default: list of values)
1543  ratioFit -- Fit straight line in ratio? (default None)
1544  ratioUncertainty -- Plot uncertainties on ratio? (default True)
1545  ratioCoverageXrange -- Range of x axis values (xmin,xmax) to limit the automatic ratio y axis range calculation to (default None for disabled)
1546  histogramModifier -- Function to be called in create() to modify the histograms (default None)
1547  """
1548  self._name = name
1549 
1550  def _set(attr, default):
1551  setattr(self, "_"+attr, kwargs.get(attr, default))
1552 
1553  _set("fallback", None)
1554  _set("outname", None)
1555 
1556  _set("title", None)
1557  _set("xtitle", None)
1558  _set("xtitlesize", None)
1559  _set("xtitleoffset", None)
1560  _set("xlabelsize", None)
1561  _set("ytitle", None)
1562  _set("ytitlesize", None)
1563  _set("ytitleoffset", None)
1564  _set("ztitle", None)
1565  _set("ztitleoffset", None)
1566 
1567  _set("xmin", None)
1568  _set("xmax", None)
1569  _set("ymin", 0.)
1570  _set("ymax", None)
1571 
1572  _set("xlog", False)
1573  _set("ylog", False)
1574  _set("xgrid", True)
1575  _set("ygrid", True)
1576 
1577  _set("stat", False)
1578  _set("fit", False)
1579 
1580  _set("statx", 0.65)
1581  _set("staty", 0.8)
1582  _set("statyadjust", None)
1583 
1584  _set("normalizeToUnitArea", False)
1585  _set("normalizeToNumberOfEvents", False)
1586  _set("profileX", False)
1587  _set("fitSlicesY", False)
1588  _set("rebinX", None)
1589 
1590  _set("scale", None)
1591  _set("xbinlabels", None)
1592  _set("xbinlabelsize", None)
1593  _set("xbinlabeloption", None)
1594  _set("removeEmptyBins", False)
1595  _set("printBins", False)
1596 
1597  _set("drawStyle", "EP")
1598  _set("drawCommand", None)
1599  _set("lineWidth", 2)
1600 
1601  _set("legendDx", None)
1602  _set("legendDy", None)
1603  _set("legendDw", None)
1604  _set("legendDh", None)
1605  _set("legend", True)
1606 
1607  _set("adjustMarginRight", None)
1608 
1609  _set("ratio", None)
1610  _set("ratioYmin", [0, 0.2, 0.5, 0.7, 0.8, 0.9, 0.95])
1611  _set("ratioYmax", [1.05, 1.1, 1.2, 1.3, 1.5, 1.8, 2, 2.5, 3, 4, 5])
1612  _set("ratioFit", None)
1613  _set("ratioUncertainty", True)
1614  _set("ratioCoverageXrange", None)
1615 
1616  _set("histogramModifier", None)
1617 
1618  self._histograms = []
1619 
def __init__(self, name, kwargs)
Definition: plotting.py:1488

Member Function Documentation

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

Definition at line 1664 of file plotting.py.

References plotting._getOrCreateObject().

Referenced by plotting.Plot.create().

1664  def _createOne(self, name, index, tdir, nevents):
1665  """Create one histogram from a TDirectory."""
1666  if tdir == None:
1667  return None
1668 
1669  # If name is a list, pick the name by the index
1670  if isinstance(name, list):
1671  name = name[index]
1672 
1673  h = _getOrCreateObject(tdir, name)
1674  if h is not None and self._normalizeToNumberOfEvents and nevents is not None and nevents != 0:
1675  h.Scale(1.0/nevents)
1676  return h
1677 
def _getOrCreateObject(tdirectory, nameOrCreator)
Definition: plotting.py:53
def _createOne(self, name, index, tdir, nevents)
Definition: plotting.py:1664
def plotting.Plot._normalize (   self)
private
Normalise histograms to unit area

Definition at line 1769 of file plotting.py.

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

Referenced by plotting.Plot.draw().

1769  def _normalize(self):
1770  """Normalise histograms to unit area"""
1771 
1772  for h in self._histograms:
1773  if h is None:
1774  continue
1775  i = h.Integral()
1776  if i == 0:
1777  continue
1778  if h.GetSumw2().fN <= 0: # to suppress warning
1779  h.Sumw2()
1780  h.Scale(1.0/i)
1781 
def _normalize(self)
Definition: plotting.py:1769
def plotting.Plot._setStats (   self,
  histos,
  startingX,
  startingY 
)
private
Set stats box.

Definition at line 1728 of file plotting.py.

References DTSC._stat, and DTTrigGeom._stat.

1728  def _setStats(self, histos, startingX, startingY):
1729  """Set stats box."""
1730  if not self._stat:
1731  for h in histos:
1732  if h is not None and hasattr(h, "SetStats"):
1733  h.SetStats(0)
1734  return
1735 
1736  def _doStats(h, col, dy):
1737  if h is None:
1738  return
1739  h.SetStats(True)
1740 
1741  if self._fit and h.GetEntries() > 0.5:
1742  h.Fit("gaus", "Q")
1743  f = h.GetListOfFunctions().FindObject("gaus")
1744  if f == None:
1745  h.SetStats(0)
1746  return
1747  f.SetLineColor(col)
1748  f.SetLineWidth(1)
1749  h.Draw()
1750  ROOT.gPad.Update()
1751  st = h.GetListOfFunctions().FindObject("stats")
1752  if self._fit:
1753  st.SetOptFit(0o010)
1754  st.SetOptStat(1001)
1755  st.SetX1NDC(startingX)
1756  st.SetX2NDC(startingX+0.3)
1757  st.SetY1NDC(startingY+dy)
1758  st.SetY2NDC(startingY+dy+0.15)
1759  st.SetTextColor(col)
1760 
1761  dy = 0.0
1762  for i, h in enumerate(histos):
1763  if self._statyadjust is not None and i < len(self._statyadjust):
1764  dy += self._statyadjust[i]
1765 
1766  _doStats(h, _plotStylesColor[i], dy)
1767  dy -= 0.19
1768 
def _setStats(self, histos, startingX, startingY)
Definition: plotting.py:1728
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 2072 of file plotting.py.

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

2072  def addToLegend(self, legend, legendLabels, denomUncertainty):
2073  """Add histograms to a legend.
2074 
2075  Arguments:
2076  legend -- TLegend
2077  legendLabels -- List of strings for the legend labels
2078  """
2079  first = denomUncertainty
2080  for h, label in zip(self._histograms, legendLabels):
2081  if h is None:
2082  first = False
2083  continue
2084  if first:
2085  self._forLegend = h.Clone()
2086  self._forLegend.SetFillStyle(1001)
2087  self._forLegend.SetFillColor(ROOT.kGray)
2088  entry = legend.AddEntry(self._forLegend, label, "lpf")
2089  first = False
2090  else:
2091  legend.AddEntry(h, label, "LP")
2092 
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
def addToLegend(self, legend, legendLabels, denomUncertainty)
Definition: plotting.py:2072
def plotting.Plot.clone (   self,
  kwargs 
)
def plotting.Plot.create (   self,
  tdirNEvents,
  requireAllHistograms = False 
)
Create histograms from list of TDirectories

Definition at line 1678 of file plotting.py.

References plotting.Plot._createOne(), RunHistogramManager._histograms, plotting.Plot._histograms, FP420HitsObject._name, TrackerHitsObject._name, PGeometricDet::Item._name, TrackingRecHitAlgorithm._name, LikelihoodSpecies._name, L1TMuon::PtAssignmentUnit._name, L1TMuon::PtRefinementUnit._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, ElectronMVAEstimatorRun2Phys14NonTrig._name, PhotonMVAEstimatorRun2Spring15NonTrig._name, PhotonMVAEstimatorRun2Phys14NonTrig._name, ElectronMVAEstimatorRun2Spring15Trig._name, GeometricDetExtra._name, ElectronMVAEstimatorRun2Spring15NonTrig._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, plotting.Plot._name, Vispa.Gui.VispaWidget.VispaWidget._scale, plotting.AggregateBins._scale, HistoParams< TH1F >._title, HistoParams< T >._title, HistoParams< TProfile >._title, HistoParams< TH2F >._title, SiStripHitEffFromCalibTree._title, HistoParams< TProfile2D >._title, html.PageSet._title, plotting.Subtract._title, plotting.Transform._title, html.HtmlReport._title, plotting.FakeDuplicate._title, plotting.CutEfficiency._title, and genParticles_cff.map.

1678  def create(self, tdirNEvents, requireAllHistograms=False):
1679  """Create histograms from list of TDirectories"""
1680  self._histograms = [self._createOne(self._name, i, tdirNEvent[0], tdirNEvent[1]) for i, tdirNEvent in enumerate(tdirNEvents)]
1681 
1682  if self._fallback is not None:
1683  profileX = [self._profileX]*len(self._histograms)
1684  for i in xrange(0, len(self._histograms)):
1685  if self._histograms[i] is None:
1686  self._histograms[i] = self._createOne(self._fallback["name"], i, tdirNEvents[i][0], tdirNEvents[i][1])
1687  profileX[i] = self._fallback.get("profileX", self._profileX)
1688 
1689  if self._histogramModifier is not None:
1690  self._histograms = self._histogramModifier(self._histograms)
1691 
1692  if len(self._histograms) > len(_plotStylesColor):
1693  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)))
1694 
1695  # Modify histograms here in case self._name returns numbers
1696  # and self._histogramModifier creates the histograms from
1697  # these numbers
1698  def _modifyHisto(th1, profileX):
1699  if th1 is None:
1700  return None
1701 
1702  if profileX:
1703  th1 = th1.ProfileX()
1704 
1705  if self._fitSlicesY:
1706  ROOT.TH1.AddDirectory(True)
1707  th1.FitSlicesY()
1708  th1 = ROOT.gDirectory.Get(th1.GetName()+"_2")
1709  th1.SetDirectory(None)
1710  #th1.SetName(th1.GetName()+"_ref")
1711  ROOT.TH1.AddDirectory(False)
1712 
1713  if self._title is not None:
1714  th1.SetTitle(self._title)
1715 
1716  if self._scale is not None:
1717  th1.Scale(self._scale)
1718 
1719  return th1
1720 
1721  if self._fallback is not None:
1722  self._histograms = map(_modifyHisto, self._histograms, profileX)
1723  else:
1724  self._histograms = map(lambda h: _modifyHisto(h, self._profileX), self._histograms)
1725  if requireAllHistograms and None in self._histograms:
1726  self._histograms = [None]*len(self._histograms)
1727 
def create(self, tdirNEvents, requireAllHistograms=False)
Definition: plotting.py:1678
def _createOne(self, name, index, tdir, nevents)
Definition: plotting.py:1664
def plotting.Plot.draw (   self,
  pad,
  ratio,
  ratioFactor,
  nrows 
)
Draw the histograms using values for a given algorithm.

Definition at line 1782 of file plotting.py.

References RunHistogramManager._histograms, plotting.Plot._histograms, plotting.Plot._normalize(), HistoData.getName(), emtf::Node.getName(), PhysicsTools::Source.getName(), CocoaMaterialElementary.getName(), ecaldqm::DBReaderWorker.getName(), LikelihoodSpecies.getName(), PCaloHit.getName(), EcalLogicID.getName(), pftools::SpaceManager.getName(), ecaldqm::DBWriterWorker.getName(), LikelihoodPdf.getName(), TkOfflineVariables.getName(), hcaldqm::mapper::Mapper.getName(), FieldHandlerBase< TOutput >.getName(), AnyMVAEstimatorRun2Base.getName(), FittedEntry.getName(), TrackingRecHitAlgorithm.getName(), hcaldqm::mapper::HashMapper.getName(), jsoncollector::JsonMonitorable.getName(), CSGAction.getName(), L1TUtmAlgorithm.getName(), L1TUtmScale.getName(), DTTPGLutFile.getName(), PhysicsTools::MVATrainer.getName(), L1TriggerLutFile.getName(), QCriterion.getName(), SeedMergerPixelLayer.getName(), L1TUtmCondition.getName(), pos::PixelPortcardMap.getName(), L1MuGMTReg.getName(), GenericMVAComputer::TaggingVariableIterator< Iter_t >::Value.getName(), GEMStation.getName(), PhysicsTools::Variable::Value.getName(), pftools::SpaceVoxel.getName(), ecaldqm::DQWorker.getName(), RPCAMCLink.getName(), RPCDCCLink.getName(), L1TUtmObject.getName(), PhotonMVAEstimatorRun2Spring15NonTrig.getName(), PhotonMVAEstimatorRun2Phys14NonTrig.getName(), L1TUtmTriggerMenu.getName(), L1TUtmCut.getName(), ElectronMVAEstimatorRun2Phys14NonTrig.getName(), PFTrackAlgoTools::edm::ELslProxy< ELgen >.getName(), edm::ELslProxy< ELgen >.getName(), L1MuGMTRegMMConfig.getName(), PhysicsTools::MVAModuleHelper< Record, Object, Filler >::Value.getName(), ElectronMVAEstimatorRun2Spring15Trig.getName(), ElectronMVAEstimatorRun2Spring15NonTrig.getName(), cscdqm::HistoDef.getName(), ElectronMVAEstimatorRun2Spring16GeneralPurpose.getName(), ElectronMVAEstimatorRun2Spring16HZZ.getName(), FourVectorHLT::PathInfo.getName(), RPCLBLink.getName(), jsoncollector::DataPoint.getName(), MonitorElement.getName(), PFTrackAlgoTools::edm::ELseverityLevel.getName(), edm::ELseverityLevel.getName(), PhysicsTools::Variable.getName(), PhysicsTools::TrainerMonitoring::Object.getName(), L1MuGMTRegSortRankOffset.getName(), L1MuGMTRegCDLConfig.getName(), cscdqm::CSCHistoDef.getName(), plotting.Plot.getName(), plotting.Plot.isTGraph2D(), and hpstanc_transforms.max.

1782  def draw(self, pad, ratio, ratioFactor, nrows):
1783  """Draw the histograms using values for a given algorithm."""
1784 # if len(self._histograms) == 0:
1785 # print "No histograms for plot {name}".format(name=self._name)
1786 # return
1787 
1788  isTGraph2D = self.isTGraph2D()
1789  if isTGraph2D:
1790  # Ratios for the TGraph2Ds is not that interesting
1791  ratioOrig = ratio
1792  ratio = False
1793 
1794  if self._normalizeToUnitArea:
1795  self._normalize()
1796 
1797  if self._rebinX is not None:
1798  for h in self._histograms:
1799  h.Rebin(self._rebinX)
1800 
1801  def _styleMarker(h, msty, col):
1802  h.SetMarkerStyle(msty)
1803  h.SetMarkerColor(col)
1804  h.SetMarkerSize(0.7)
1805  h.SetLineColor(1)
1806  h.SetLineWidth(1)
1807 
1808  def _styleHist(h, msty, col):
1809  _styleMarker(h, msty, col)
1810  h.SetLineColor(col)
1811  h.SetLineWidth(self._lineWidth)
1812 
1813  # Use marker or hist style
1814  style = _styleMarker
1815  if "hist" in self._drawStyle.lower():
1816  style = _styleHist
1817  if len(self._histograms) > 0 and isinstance(self._histograms[0], ROOT.TGraph):
1818  if "l" in self._drawStyle.lower():
1819  style = _styleHist
1820 
1821  # Apply style to histograms, filter out Nones
1822  histos = []
1823  for i, h in enumerate(self._histograms):
1824  if h is None:
1825  continue
1826  style(h, _plotStylesMarker[i], _plotStylesColor[i])
1827  histos.append(h)
1828  if len(histos) == 0:
1829  if verbose:
1830  print "No histograms for plot {name}".format(name=self.getName())
1831  return
1832 
1833  # Extract x bin labels, make sure that only bins with same
1834  # label are compared with each other
1835  histosHaveBinLabels = len(histos[0].GetXaxis().GetBinLabel(1)) > 0
1836  xbinlabels = self._xbinlabels
1837  if xbinlabels is None:
1838  if histosHaveBinLabels:
1839  xbinlabels = [histos[0].GetXaxis().GetBinLabel(i) for i in xrange(1, histos[0].GetNbinsX()+1)]
1840  # Merge bin labels with difflib
1841  for h in histos[1:]:
1842  labels = [h.GetXaxis().GetBinLabel(i) for i in xrange(1, h.GetNbinsX()+1)]
1843  diff = difflib.unified_diff(xbinlabels, labels, n=max(len(xbinlabels), len(labels)))
1844  xbinlabels = []
1845  operation = []
1846  for item in diff: # skip the "header" lines
1847  if item[:2] == "@@":
1848  break
1849  for item in diff:
1850  operation.append(item[0])
1851  lab = item[1:]
1852  if lab in xbinlabels:
1853  # pick the last addition of the bin
1854  ind = xbinlabels.index(lab)
1855  if operation[ind] == "-" and operation[-1] == "+":
1856  xbinlabels.remove(lab)
1857  del operation[ind] # to keep xbinlabels and operation indices in sync
1858  elif operation[ind] == "+" and operation[-1] == "-":
1859  del operation[-1] # to keep xbinlabels and operation indices in sync
1860  continue
1861  else:
1862  raise Exception("This should never happen")
1863  xbinlabels.append(lab)
1864  # unified_diff returns empty diff if xbinlabels and labels are equal
1865  # so if xbinlabels is empty here, it can be just set to labels
1866  if len(xbinlabels) == 0:
1867  xbinlabels = labels
1868 
1869  histos_new = []
1870  for h in histos:
1871  h_new = h.Clone(h.GetName()+"_xbinlabels")
1872  h_new.SetBins(len(xbinlabels), h.GetBinLowEdge(1), h.GetBinLowEdge(1)+len(xbinlabels))
1873  for i, label in enumerate(xbinlabels):
1874  bin = h.GetXaxis().FindFixBin(label)
1875  if bin >= 0:
1876  h_new.SetBinContent(i+1, h.GetBinContent(bin))
1877  h_new.SetBinError(i+1, h.GetBinError(bin))
1878  else:
1879  h_new.SetBinContent(i+1, 0)
1880  h_new.SetBinError(i+1, 0)
1881  histos_new.append(h_new)
1882  self._tmp_histos = histos_new # need to keep these in memory too ...
1883  histos = histos_new
1884 
1885  # Remove empty bins, but only if histograms have bin labels
1886  if self._removeEmptyBins and histosHaveBinLabels:
1887  # at this point, all histograms have been "equalized" by their x binning and labels
1888  # therefore remove bins which are empty in all histograms
1889  binsToRemove = set()
1890  for b in xrange(1, histos[0].GetNbinsX()+1):
1891  binEmpty = True
1892  for h in histos:
1893  if h.GetBinContent(b) > 0:
1894  binEmpty = False
1895  break
1896  if binEmpty:
1897  binsToRemove.add(b)
1898 
1899  if len(binsToRemove) > 0:
1900  # filter xbinlabels
1901  xbinlab_new = []
1902  for i in xrange(len(xbinlabels)):
1903  if (i+1) not in binsToRemove:
1904  xbinlab_new.append(xbinlabels[i])
1905  xbinlabels = xbinlab_new
1906 
1907  # filter histogram bins
1908  histos_new = []
1909  for h in histos:
1910  values = []
1911  for b in xrange(1, h.GetNbinsX()+1):
1912  if b not in binsToRemove:
1913  values.append( (h.GetXaxis().GetBinLabel(b), h.GetBinContent(b), h.GetBinError(b)) )
1914 
1915  if len(values) > 0:
1916  h_new = h.Clone(h.GetName()+"_empty")
1917  h_new.SetBins(len(values), h.GetBinLowEdge(1), h.GetBinLowEdge(1)+len(values))
1918  for b, (l, v, e) in enumerate(values):
1919  h_new.GetXaxis().SetBinLabel(b+1, l)
1920  h_new.SetBinContent(b+1, v)
1921  h_new.SetBinError(b+1, e)
1922 
1923  histos_new.append(h_new)
1924 
1925  self._tmp_histos = histos_new # need to keep these in memory too ...
1926  histos = histos_new
1927  if len(histos) == 0:
1928  if verbose:
1929  print "No histograms with non-empty bins for plot {name}".format(name=self.getName())
1930  return
1931 
1932  if self._printBins and histosHaveBinLabels:
1933  print "####################"
1934  print self._name
1935  width = max([len(l) for l in xbinlabels])
1936  tmp = "%%-%ds " % width
1937  for b in xrange(1, histos[0].GetNbinsX()+1):
1938  s = tmp % xbinlabels[b-1]
1939  for h in histos:
1940  s += "%.3f " % h.GetBinContent(b)
1941  print s
1942  print
1943 
1944  bounds = _findBounds(histos, self._ylog,
1945  xmin=self._xmin, xmax=self._xmax,
1946  ymin=self._ymin, ymax=self._ymax)
1947 
1948  # need to keep these in memory
1951 
1952  if ratio:
1953  self._ratios = _calculateRatios(histos, self._ratioUncertainty) # need to keep these in memory too ...
1954  ratioHistos = filter(lambda h: h is not None, [r.getRatio() for r in self._ratios[1:]])
1955 
1956  if len(ratioHistos) > 0:
1957  ratioBoundsY = _findBoundsY(ratioHistos, ylog=False, ymin=self._ratioYmin, ymax=self._ratioYmax, coverage=0.68, coverageRange=self._ratioCoverageXrange)
1958  else:
1959  ratioBoundsY = (0.9, 1,1) # hardcoded default in absence of valid ratio calculations
1960 
1961  if self._ratioFit is not None:
1962  for i, rh in enumerate(ratioHistos):
1963  tf_line = ROOT.TF1("line%d"%i, "[0]+x*[1]")
1964  tf_line.SetRange(self._ratioFit["rangemin"], self._ratioFit["rangemax"])
1965  fitres = rh.Fit(tf_line, "RINSQ")
1966  tf_line.SetLineColor(rh.GetMarkerColor())
1967  tf_line.SetLineWidth(2)
1968  self._ratioAdditional.append(tf_line)
1969  box = PlotTextBox(xmin=self._ratioFit.get("boxXmin", 0.14), ymin=None, # None for automatix
1970  xmax=self._ratioFit.get("boxXmax", 0.35), ymax=self._ratioFit.get("boxYmax", 0.09),
1971  color=rh.GetMarkerColor(), font=43, size=11, lineheight=0.02)
1972  box.move(dx=(box.width()+0.01)*i)
1973  #box.addText("Const: %.4f" % fitres.Parameter(0))
1974  #box.addText("Slope: %.4f" % fitres.Parameter(1))
1975  box.addText("Const: %.4f#pm%.4f" % (fitres.Parameter(0), fitres.ParError(0)))
1976  box.addText("Slope: %.4f#pm%.4f" % (fitres.Parameter(1), fitres.ParError(1)))
1977  self._mainAdditional.append(box)
1978 
1979 
1980  # Create bounds before stats in order to have the
1981  # SetRangeUser() calls made before the fit
1982  #
1983  # stats is better to be called before frame, otherwise get
1984  # mess in the plot (that frame creation cleans up)
1985  if ratio:
1986  pad.cd(1)
1987  self._setStats(histos, self._statx, self._staty)
1988 
1989  # Create frame
1990  if isTGraph2D:
1991  frame = FrameTGraph2D(pad, bounds, histos, ratioOrig, ratioFactor)
1992  else:
1993  if ratio:
1994  ratioBounds = (bounds[0], ratioBoundsY[0], bounds[2], ratioBoundsY[1])
1995  frame = FrameRatio(pad, bounds, ratioBounds, ratioFactor, nrows, xbinlabels, self._xbinlabelsize, self._xbinlabeloption)
1996  else:
1997  frame = Frame(pad, bounds, nrows, xbinlabels, self._xbinlabelsize, self._xbinlabeloption)
1998 
1999  # Set log and grid
2000  frame.setLogx(self._xlog)
2001  frame.setLogy(self._ylog)
2002  frame.setGridx(self._xgrid)
2003  frame.setGridy(self._ygrid)
2004 
2005  # Construct draw option string
2006  opt = "sames" # s for statbox or something?
2007  ds = ""
2008  if self._drawStyle is not None:
2009  ds = self._drawStyle
2010  if self._drawCommand is not None:
2011  ds = self._drawCommand
2012  if len(ds) > 0:
2013  opt += " "+ds
2014 
2015  # Set properties of frame
2016  frame.setTitle(histos[0].GetTitle())
2017  if self._xtitle is not None:
2018  frame.setXTitle(self._xtitle)
2019  if self._xtitlesize is not None:
2020  frame.setXTitleSize(self._xtitlesize)
2021  if self._xtitleoffset is not None:
2022  frame.setXTitleOffset(self._xtitleoffset)
2023  if self._xlabelsize is not None:
2024  frame.setXLabelSize(self._xlabelsize)
2025  if self._ytitle is not None:
2026  frame.setYTitle(self._ytitle)
2027  if self._ytitlesize is not None:
2028  frame.setYTitleSize(self._ytitlesize)
2029  if self._ytitleoffset is not None:
2030  frame.setYTitleOffset(self._ytitleoffset)
2031  if self._ztitle is not None:
2032  frame.setZTitle(self._ztitle)
2033  if self._ztitleoffset is not None:
2034  frame.setZTitleOffset(self._ztitleoffset)
2035  if self._adjustMarginRight is not None:
2036  frame.adjustMarginRight(self._adjustMarginRight)
2037  elif "z" in opt:
2038  frame.adjustMarginLeft(0.03)
2039  frame.adjustMarginRight(0.08)
2040 
2041  # Draw histograms
2042  if ratio:
2043  frame._pad.cd()
2044 
2045  for h in histos:
2046  h.Draw(opt)
2047 
2048  for addl in self._mainAdditional:
2049  addl.Draw("same")
2050 
2051  # Draw ratios
2052  if ratio and len(histos) > 0:
2053  frame._padRatio.cd()
2054  firstRatio = self._ratios[0].getRatio()
2055  if self._ratioUncertainty and firstRatio is not None:
2056  firstRatio.SetFillStyle(1001)
2057  firstRatio.SetFillColor(ROOT.kGray)
2058  firstRatio.SetLineColor(ROOT.kGray)
2059  firstRatio.SetMarkerColor(ROOT.kGray)
2060  firstRatio.SetMarkerSize(0)
2061  self._ratios[0].draw("E2")
2062  frame._padRatio.RedrawAxis("G") # redraw grid on top of the uncertainty of denominator
2063  for r in self._ratios[1:]:
2064  r.draw()
2065 
2066  for addl in self._ratioAdditional:
2067  addl.Draw("same")
2068 
2069  frame.redrawAxis()
2070  self._frame = frame # keep the frame in memory for sure
2071 
def _findBoundsY(th1s, ylog, ymin=None, ymax=None, coverage=None, coverageRange=None)
Definition: plotting.py:514
def _findBounds(th1s, ylog, xmin=None, xmax=None, ymin=None, ymax=None)
Definition: plotting.py:446
def _calculateRatios(histos, ratioUncertainty=False)
Definition: plotting.py:144
def _setStats(self, histos, startingX, startingY)
Definition: plotting.py:1728
def draw(self, pad, ratio, ratioFactor, nrows)
Definition: plotting.py:1782
Definition: style.py:1
def _normalize(self)
Definition: plotting.py:1769
def isTGraph2D(self)
Definition: plotting.py:1641
def getName(self)
Definition: plotting.py:1652
def plotting.Plot.drawRatioUncertainty (   self)
Return true if the ratio uncertainty should be drawn

Definition at line 1660 of file plotting.py.

1661  """Return true if the ratio uncertainty should be drawn"""
1662  return self._ratioUncertainty
1663 
def drawRatioUncertainty(self)
Definition: plotting.py:1660
def plotting.Plot.getName (   self)

Definition at line 1652 of file plotting.py.

References FP420HitsObject._name, TrackerHitsObject._name, PGeometricDet::Item._name, TrackingRecHitAlgorithm._name, LikelihoodSpecies._name, L1TMuon::PtAssignmentUnit._name, L1TMuon::PtRefinementUnit._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, ElectronMVAEstimatorRun2Phys14NonTrig._name, PhotonMVAEstimatorRun2Spring15NonTrig._name, PhotonMVAEstimatorRun2Phys14NonTrig._name, ElectronMVAEstimatorRun2Spring15Trig._name, GeometricDetExtra._name, ElectronMVAEstimatorRun2Spring15NonTrig._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, plotting.Plot._name, and harvestTrackValidationPlots.str.

Referenced by plotting.Plot.draw().

1652  def getName(self):
1653  if self._outname is not None:
1654  return self._outname
1655  if isinstance(self._name, list):
1656  return str(self._name[0])
1657  else:
1658  return str(self._name)
1659 
def getName(self)
Definition: plotting.py:1652
def plotting.Plot.getNumberOfHistograms (   self)
Return number of existing histograms.

Definition at line 1633 of file plotting.py.

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

Referenced by plotting.Plot.isEmpty().

1634  """Return number of existing histograms."""
1635  return len(filter(lambda h: h is not None, self._histograms))
1636 
def getNumberOfHistograms(self)
Definition: plotting.py:1633
def plotting.Plot.isEmpty (   self)
Return true if there are no histograms created for the plot

Definition at line 1637 of file plotting.py.

References plotting.Plot.getNumberOfHistograms().

Referenced by plotting.Plot.clone().

1637  def isEmpty(self):
1638  """Return true if there are no histograms created for the plot"""
1639  return self.getNumberOfHistograms() == 0
1640 
def getNumberOfHistograms(self)
Definition: plotting.py:1633
def isEmpty(self)
Definition: plotting.py:1637
def plotting.Plot.isRatio (   self,
  ratio 
)

Definition at line 1647 of file plotting.py.

1647  def isRatio(self, ratio):
1648  if self._ratio is None:
1649  return ratio
1650  return ratio and self._ratio
1651 
def isRatio(self, ratio)
Definition: plotting.py:1647
def plotting.Plot.isTGraph2D (   self)

Definition at line 1641 of file plotting.py.

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

Referenced by plotting.Plot.draw().

1641  def isTGraph2D(self):
1642  for h in self._histograms:
1643  if isinstance(h, ROOT.TGraph2D):
1644  return True
1645  return False
1646 
def isTGraph2D(self)
Definition: plotting.py:1641
def plotting.Plot.setProperties (   self,
  kwargs 
)

Definition at line 1620 of file plotting.py.

1620  def setProperties(self, **kwargs):
1621  for name, value in kwargs.iteritems():
1622  if not hasattr(self, "_"+name):
1623  raise Exception("No attribute '%s'" % name)
1624  setattr(self, "_"+name, value)
1625 
def setProperties(self, kwargs)
Definition: plotting.py:1620

Member Data Documentation

plotting.Plot._forLegend
private

Definition at line 2085 of file plotting.py.

plotting.Plot._frame
private

Definition at line 2070 of file plotting.py.

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

Definition at line 1949 of file plotting.py.

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

Definition at line 1950 of file plotting.py.

plotting.Plot._ratios
private

Definition at line 1953 of file plotting.py.

plotting.Plot._tmp_histos
private

Definition at line 1882 of file plotting.py.