#!/usr/bin/env python from rat import ROOT import sys import re def help(): print \ '''Usage: ratinfo file.root [item2 item3...] where is log Print log from RAT run which generated first file. macro Print RAT macro which generated first file. meta Print metadata (versions, overrides) for first file. If more files listed, compare metadata with the first file, listing matches with a +, and mismatches with a -. dbkeys List keys in db TMap in first file. db Print tables in db TMap, with regular expressions to match keys as further arguments. ''' def dump_metadata(meta): npass = meta.GetPassCount() if npass > 0: for ipass in range(0, npass): print 'Pass %d:' % ipass print ' Host %s (%s)' % (meta.hostNames[ipass], meta.hostSystems[ipass]) print ' RAT version %s' % meta.ratVersions[ipass] print ' RAT revision %s' % meta.ratRevisions[ipass] print ' ROOT version %s' % meta.rootVersions[ipass] print ' GEANT4 version %s' % meta.geant4Versions[ipass] print ' Contains MC %s' % (meta.containsMCFlags[ipass]) print ' Contains Data %s' % (meta.containsDataFlags[ipass]) print ' Events Generated %s' % (meta.eventsGeneratedCounts[ipass]) print ' Events Stored %s' % (meta.eventsStoredCounts[ipass]) db = meta.GetMetaDB(ipass) for ioc in range(0, db.GetOverrideCommandCount()): oc = db.GetOverrideCommand(ioc) print ' %s = %s' % (oc.first, oc.second) for iof in range(0, db.GetFileCount()): print ' File %s' % db.GetFile(iof) else: print >>sys.stderr, "No metadata for any passes in ROOT file." sys.exit(1) def compare_metadata(meta, fname): g = ROOT.TFile.Open(fname) if not g: return '0' if g.IsZombie(): return '0' gmeta = g.Get('meta') if gmeta: npass = meta.GetPassCount() if npass != gmeta.GetPassCount(): return '-' for ipass in range(0, npass): if meta.ratVersions[ipass] != gmeta.ratVersions[ipass]: return '-' if meta.ratRevisions[ipass] != gmeta.ratRevisions[ipass]: return '-' if meta.rootVersions[ipass] != gmeta.rootVersions[ipass]: return '-' if meta.geant4Versions[ipass] != gmeta.geant4Versions[ipass]: return '-' if meta.containsMCFlags[ipass] != gmeta.containsMCFlags[ipass]: return '-' if meta.containsDataFlags[ipass] != gmeta.containsDataFlags[ipass]: return '-' if meta.eventsStoredCounts[ipass] != gmeta.eventsStoredCounts[ipass]: return '-' if meta.eventsGeneratedCounts[ipass] != gmeta.eventsGeneratedCounts[ipass]: return '-' db = meta.GetMetaDB(ipass) gdb = gmeta.GetMetaDB(ipass) if db.GetOverrideCommandCount() != gdb.GetOverrideCommandCount(): return '-' if db.GetFileCount() != gdb.GetFileCount(): return '-' for ioc in range(0, db.GetOverrideCommandCount()): oc = db.GetOverrideCommand(ioc) match = False for i in range(0, gdb.GetOverrideCommandCount()): goc = gdb.GetOverrideCommand(i) if oc.first == goc.first: if oc.second == goc.second: match = True break else: return '-' if not match: return '-' for iof in range(0, db.GetFileCount()): of = db.GetFile(iof) match = False for i in range(0, gdb.GetFileCount()): if of == gdb.GetFile(i): match = True break if not match: return '-' else: return '-' return '+' if len(sys.argv) < 3: help() sys.exit(2) # we will detect and report errors ourselves ROOT.gErrorIgnoreLevel = ROOT.kFatal f = ROOT.TFile.Open(sys.argv[2]) if not f: print >>sys.stderr, "No such file", sys.argv[2] sys.exit(1) if f.IsZombie(): print >>sys.stderr, "Failed to open", sys.argv[2] sys.exit(1) if sys.argv[1] == 'log': if len(sys.argv) != 3: help() sys.exit(2) log = f.Get("log") if log: print log.GetString() else: print >>sys.stderr, "No log present in ROOT file." sys.exit(1) elif sys.argv[1] == 'macro': if len(sys.argv) != 3: help() sys.exit(2) macro = f.Get('macro') if macro: print macro.GetString() else: print >>sys.stderr, "No macro present in ROOT file." sys.exit(1) elif sys.argv[1] == 'dbkeys': if len(sys.argv) != 3: help() sys.exit(2) db = f.Get('db') if db: idb = db.MakeIterator() while idb.Next() != None: print idb.Key() else: print >>sys.stderr, "No db present in ROOT file." sys.exit(1) elif sys.argv[1] == 'db': db = f.Get('db') if db: idb = db.MakeIterator() for iarg in range(3, len(sys.argv)): p = re.compile(sys.argv[iarg]) idb.Reset() while idb.Next() != None: if p.match(idb.Key().GetName()): print '%s = %s' % (idb.Key(), idb.Value()) elif sys.argv[1] == 'meta': meta = f.Get('meta') if meta: dump_metadata(meta) if len(sys.argv) > 3: print '+ %s' % sys.argv[2] for iarg in range(3, len(sys.argv)): c = compare_metadata(meta, sys.argv[iarg]) print '%s %s' % (c, sys.argv[iarg]) else: print >>sys.stderr, "No metadata present in ROOT file." sys.exit(1)