File indexing completed on 2024-11-26 02:34:09
0001 import sys, os, optparse, re, json
0002 import ROOT, xmlrpclib
0003
0004 SERVER_URL = "http://pccmsdqm04.cern.ch/runregistry/xmlrpc"
0005
0006 ONLINE_DATASET = '/Global/Online/ALL'
0007
0008
0009 FOLDERS = {
0010 'reportSummaryContents': ( 'DQM', 'reportSummary' ),
0011 'CertificationContents': ( 'CERT', 'CertificationSummary' ),
0012 'DAQContents': ( 'DAQ', 'DAQSummary' ),
0013 'DCSContents': ( 'DCS', 'DCSSummary' )
0014 }
0015
0016 SUBSYSTEMS = {
0017 'CSC' : 'CSC',
0018 'DT' : 'DT',
0019 'ES' : 'ES',
0020 'EcalBarrel' : 'ECAL',
0021 'EcalEndcap' : 'ECAL',
0022 'Hcal' : 'HCAL',
0023 'L1T' : 'L1T',
0024 'L1TEMU' : 'L1T',
0025 'Pixel' : 'PIX',
0026 'RPC' : 'RPC',
0027 'SiStrip' : 'STRIP'
0028 }
0029
0030 def getDatasetName(file_name):
0031 """ Method to get dataset name from the file name"""
0032 d = None
0033 try:
0034 d = re.search("(__[a-zA-Z0-9-_]+)+", file_name).group(0)
0035 d = re.sub("__", "/", d)
0036 except:
0037 d = None
0038 return d
0039
0040 def getSummaryValues(file_name, translate, filters = None):
0041 """ Method to extract keys from root file and return dict """
0042 ROOT.gROOT.Reset()
0043
0044 run_number = None
0045 result = {}
0046
0047 f = ROOT.TFile(file_name, 'READ')
0048
0049 root = f.GetDirectory("DQMData")
0050 if root == None: return (run_number, result)
0051
0052 run = None
0053 for key in root.GetListOfKeys():
0054 if re.match("^Run [0-9]+$", key.ReadObj().GetName()) and key.IsFolder():
0055 run_number = int(re.sub("^Run ", "", key.ReadObj().GetName()))
0056 run = key.ReadObj()
0057 break
0058
0059 if run == None: return (run_number, result)
0060
0061 for sub in run.GetListOfKeys():
0062
0063 sub_name = sub.ReadObj().GetName()
0064 if sub_name not in SUBSYSTEMS: continue
0065
0066 sub_key = sub_name
0067 if translate:
0068 sub_key = SUBSYSTEMS[sub_name]
0069
0070 if filters != None:
0071 if not re.match(filters[0], sub_key):
0072 continue
0073
0074 if sub_key not in result:
0075 result[sub_key] = {}
0076
0077 evInfo = sub.ReadObj().GetDirectory("Run summary/EventInfo")
0078 if evInfo == None: continue
0079
0080 for folder_name in FOLDERS.keys():
0081
0082 folder = evInfo.GetDirectory(folder_name)
0083 if folder == None: continue
0084
0085 folder_id = folder_name
0086 if translate:
0087 folder_id = FOLDERS[folder_name][0]
0088
0089 if filters != None:
0090 if not re.match(filters[1], folder_id):
0091 continue
0092
0093 if folder_id not in result[sub_key]:
0094 result[sub_key][folder_id] = {}
0095
0096 value_filter = None
0097 if filters != None:
0098 value_filter = filters[2]
0099
0100 writeValues(folder, result[sub_key][folder_id], None, value_filter)
0101 writeValues(evInfo, result[sub_key][folder_id], {FOLDERS[folder_name][1]: 'Summary'}, value_filter)
0102
0103 f.Close()
0104
0105 return (run_number, result)
0106
0107 def writeValues(folder, map, keymap = None, filter = None):
0108 """ Write values (possibly only for the keys in the keymap and filtered) from folder to map """
0109 for value in folder.GetListOfKeys():
0110 full_name = value.ReadObj().GetName()
0111 if not value.IsFolder() and re.match("^<.+>f=-{,1}[0-9\.]+</.+>$", full_name):
0112 value_name = re.sub("<(?P<n>[^>]+)>.+", "\g<n>", full_name)
0113 value_numb = float(re.sub("<.+>f=(?P<n>-{,1}[0-9\.]+)</.+>", "\g<n>", full_name))
0114 if keymap == None or value_name in keymap:
0115 if not keymap == None:
0116 if not keymap[value_name] == None:
0117 value_name = keymap[value_name]
0118 if filter == None or re.match(filter, value_name):
0119 if value_name not in map:
0120 map[value_name] = value_numb
0121
0122 def checkFilter(raw_filter):
0123 """ Check if filter is OK """
0124 if raw_filter != None:
0125 try:
0126 filter = eval(raw_filter)
0127 if not isinstance("", type(filter[0])) or not isinstance("", type(filter[1])) or not isinstance("", type(filter[2])):
0128 raise TypeError('')
0129 except:
0130 print("Bad filter value ", raw_filter, ".\nFilter should be written in python tupple with 3 elements, i.e. \"('subsystem','folder','value')\". elements are in regexp format.")
0131 sys.exit(2)
0132 else:
0133 filter = ('.*', '.*', '.*')
0134 return filter