Skip to content

Commit 64b27cb

Browse files
author
miranov25
committed
make test_export_tree_read_tree_with_subframe already OK
1 parent da90789 commit 64b27cb

File tree

2 files changed

+24
-10
lines changed

2 files changed

+24
-10
lines changed

UTILS/dfextensions/AliasDataFrame.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -291,15 +291,27 @@ def load(path_prefix):
291291
adf.constant_aliases = set(json.loads(meta[b"constants"].decode()))
292292
return adf
293293

294-
def export_tree(self, filename, treename="tree", dropAliasColumns=True):
295-
if dropAliasColumns:
296-
export_cols = [col for col in self.df.columns if col not in self.aliases]
294+
def export_tree(self, filename_or_file, treename="tree", dropAliasColumns=True):
295+
is_path = isinstance(filename_or_file, str)
296+
297+
if is_path:
298+
with uproot.recreate(filename_or_file) as f:
299+
self._write_to_uproot(f, treename, dropAliasColumns)
300+
self._write_metadata_to_root(filename_or_file, treename)
297301
else:
298-
export_cols = list(self.df.columns)
302+
self._write_to_uproot(filename_or_file, treename, dropAliasColumns)
303+
304+
def _write_to_uproot(self, uproot_file, treename, dropAliasColumns):
305+
export_cols = [col for col in self.df.columns if not dropAliasColumns or col not in self.aliases]
299306
dtype_casts = {col: np.float32 for col in export_cols if self.df[col].dtype == np.float16}
300307
export_df = self.df[export_cols].astype(dtype_casts)
301-
with uproot.recreate(filename) as f:
302-
f[treename] = export_df
308+
309+
uproot_file[treename] = export_df
310+
311+
for subframe_name, sub_adf in self._subframes.items():
312+
sub_adf.export_tree(uproot_file, f"{treename}__subframe__{subframe_name}", dropAliasColumns)
313+
314+
def _write_metadata_to_root(self, filename, treename):
303315
f = ROOT.TFile.Open(filename, "UPDATE")
304316
tree = f.Get(treename)
305317
for alias, expr in self.aliases.items():
@@ -313,13 +325,13 @@ def export_tree(self, filename, treename="tree", dropAliasColumns=True):
313325
"aliases": self.aliases,
314326
"dtypes": {k: v.__name__ for k, v in self.alias_dtypes.items()},
315327
"constants": list(self.constant_aliases),
328+
"subframes": list(self._subframes.subframes.keys())
316329
}
317330
jmeta = json.dumps(metadata)
318331
tree.GetUserInfo().Add(ROOT.TObjString(jmeta))
319332
tree.Write("", ROOT.TObject.kOverwrite)
320333
f.Close()
321334

322-
@staticmethod
323335
def read_tree(filename, treename="tree"):
324336
with uproot.open(filename) as f:
325337
df = f[treename].arrays(library="pd")
@@ -338,6 +350,9 @@ def read_tree(filename, treename="tree"):
338350
adf.aliases.update(jmeta.get("aliases", {}))
339351
adf.alias_dtypes.update({k: getattr(np, v) for k, v in jmeta.get("dtypes", {}).items()})
340352
adf.constant_aliases.update(jmeta.get("constants", []))
353+
for sf_name in jmeta.get("subframes", []):
354+
sf = AliasDataFrame.read_tree(filename, treename=f"{treename}__subframe__{sf_name}")
355+
adf.register_subframe(sf_name, sf)
341356
break
342357
except Exception:
343358
pass

UTILS/dfextensions/AliasDataFrameTest.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,8 @@ def test_export_tree_read_tree_with_subframe(self):
163163
tmp_path = tmp.name
164164

165165
adf_loaded = AliasDataFrame.read_tree(tmp_path, treename="clusters")
166-
with self.assertRaises(KeyError):
167-
_ = adf_loaded._subframes["T"]
168-
166+
self.assertIn("T", adf_loaded._subframes.subframes)
167+
self.assertTrue(isinstance(adf_loaded.get_subframe("T"), AliasDataFrame))
169168
os.remove(tmp_path)
170169

171170
if __name__ == "__main__":

0 commit comments

Comments
 (0)