@@ -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
0 commit comments