Skip to content

Commit baa1aa8

Browse files
IzaakWNclelange
andauthored
Retrieve histogram from stack via RootFileReader.retrieve_object (#261)
* retrieve TH1 from THStack via RootFileReader.retrieve_object * add tester; do not return hist from stack immediately (to allow assertion error) * disable Pylint for ROOT members * Disable too-many-public-methods for test_rootfilereader.py --------- Co-authored-by: Clemens Lange <clemens.lange@cern.ch>
1 parent 891d699 commit baa1aa8

2 files changed

Lines changed: 42 additions & 1 deletion

File tree

hepdata_lib/root_utils.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ def retrieve_object(self, path_to_object):
101101
try:
102102
obj = self.tfile.Get(parts[0])
103103
for part in parts[1:]:
104-
obj = obj.GetPrimitive(part)
104+
if isinstance(obj,r.THStack): # pylint: disable=no-member
105+
obj = obj.GetHists().FindObject(part)
106+
else:
107+
obj = obj.GetPrimitive(part)
105108

106109
assert obj
107110

tests/test_rootfilereader.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
@pytest.mark.needs_root
1919
class TestRootFileReader(TestCase):
20+
# pylint: disable=R0904
2021
"""Test the RootFileReader class."""
2122

2223
def test_tfile_setter(self):
@@ -784,6 +785,43 @@ def test_retrieve_object_canvas(self):
784785
# Clean up
785786
self.doCleanups()
786787

788+
def test_retrieve_object_stack(self):
789+
'''Check that retrieve_object correctly reads from stack in canvas.'''
790+
# Disable graphical output
791+
ROOT.gROOT.SetBatch(ROOT.kTRUE) # pylint: disable=no-member
792+
793+
# Create test histogram, plot on canvas, save to file
794+
tfile = make_tmp_root_file(testcase=self)
795+
histogram = ROOT.TH1D("testhist", "testhist", 10, 0, 1) # pylint: disable=no-member
796+
stack = ROOT.THStack("teststack","teststack") # pylint: disable=no-member
797+
stack.Add(histogram)
798+
path_to_file = tfile.GetName()
799+
800+
canvas = ROOT.TCanvas() # pylint: disable=no-member
801+
stack.Draw("HIST")
802+
canvas.Write("canvas")
803+
804+
reference = histogram.Clone("reference")
805+
reference.SetDirectory(0)
806+
if tfile:
807+
tfile.Close()
808+
809+
# Read it back
810+
reader = RootFileReader(path_to_file)
811+
try:
812+
readback = reader.retrieve_object("canvas/teststack/testhist")
813+
except OSError:
814+
print("RootFileReader.retrieve_object raised unexpected IOError!")
815+
self.fail()
816+
817+
self.assertTrue(readback)
818+
self.assertTrue(
819+
histogram_compare_1d(reference, readback)
820+
)
821+
822+
# Clean up
823+
self.doCleanups()
824+
787825
def test_retrieve_object_canvas_tpad(self):
788826
'''Check that retrieve_object correctly reads from canvas.'''
789827
# Disable graphical output

0 commit comments

Comments
 (0)