File indexing completed on 2024-04-06 12:10:08
0001
0002 from __future__ import print_function
0003 import sys
0004 import numpy
0005 import uproot
0006 import argparse
0007
0008 numpy.set_printoptions(threshold=sys.maxsize)
0009
0010 parser = argparse.ArgumentParser(description="Display in text format a single ME out of a DQM (legacy or DQMIO) file. " +
0011 "If there is more than on copy, of one ME, all are shown.")
0012
0013 parser.add_argument('filename', help='Name of local root file. For remote files, use edmCopyUtil first: `edmCopyUtil root://cms-xrd-global.cern.ch/<FILEPATH> .`')
0014 parser.add_argument('mepaths', metavar='ME', nargs='+', help='Path of ME to extract.')
0015
0016 args = parser.parse_args()
0017
0018 f = uproot.open(args.filename)
0019 things = f.keys()
0020 if 'Indices;1' in things:
0021
0022
0023 treenames = [
0024 "Ints",
0025 "Floats",
0026 "Strings",
0027 "TH1Fs",
0028 "TH1Ss",
0029 "TH1Ds",
0030 "TH2Fs",
0031 "TH2Ss",
0032 "TH2Ds",
0033 "TH3Fs",
0034 "TProfiles",
0035 "TProfile2Ds"
0036 ]
0037 trees = [{"FullName": f[name]["FullName"].array(), "Value": f[name]["Value"].lazyarray()} for name in treenames]
0038
0039 def binsearch(a, key, lower, upper):
0040 n = upper - lower
0041 if n <= 1: return lower
0042 mid = int(n / 2) + lower
0043 if a[mid] < key: return binsearch(a, key, mid, upper)
0044 else: return binsearch(a, key, lower, mid)
0045 def linsearch(a, key, lower, upper):
0046 for k in range(lower, upper):
0047 if a[k] == key: return k
0048 return 0
0049
0050 indices = f['Indices'].lazyarrays()
0051 for idx in range(len(indices["Run"])):
0052 run = indices["Run"][idx]
0053 lumi = indices["Lumi"][idx]
0054 type = indices["Type"][idx]
0055 first = int(indices["FirstIndex"][idx])
0056 last = int(indices["LastIndex"][idx])
0057 if type == 1000: continue
0058 names = trees[type]["FullName"]
0059 for me in args.mepaths:
0060 k = linsearch(names, me, first, last+1)
0061 if names[k] == me:
0062 meobj = trees[type]["Value"][k]
0063 print("ME for run %d, lumi %d" % (run, lumi), meobj)
0064
0065
0066 elif 'DQMData;1' in things:
0067 basedir = f['DQMData']
0068 for run in basedir.keys():
0069 if not run.startswith("Run "): continue
0070 rundir = basedir[run]
0071 print("MEs for %s" % run)
0072 for me in args.mepaths:
0073 subsys, path = me.split('/', 1)
0074 subsysdir = rundir[subsys]
0075
0076 for lumi in subsysdir.keys():
0077 print(" MEs for %s" % lumi)
0078 lumidir = subsysdir[lumi]
0079 meobj = lumidir[path]
0080 try:
0081 print(meobj.show())
0082 except:
0083 print(meobj.numpy().__str__())
0084
0085