Back to home page

Project CMSSW displayed by LXR

 
 

    


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 # FOLDER UNDER EvInfo        NAME    SUMMARY VALUE IN EvInfo
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