Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
import sys, os, optparse, re, json
import ROOT, xmlrpclib
 
SERVER_URL = "http://pccmsdqm04.cern.ch/runregistry/xmlrpc"

ONLINE_DATASET = '/Global/Online/ALL'

# FOLDER UNDER EvInfo        NAME    SUMMARY VALUE IN EvInfo
FOLDERS     = { 
  'reportSummaryContents': ( 'DQM',  'reportSummary' ),
  'CertificationContents': ( 'CERT', 'CertificationSummary' ),
  'DAQContents':           ( 'DAQ',  'DAQSummary' ),
  'DCSContents':           ( 'DCS',  'DCSSummary' )
}

SUBSYSTEMS  = {
  'CSC' :        'CSC',
  'DT' :         'DT',
  'ES' :         'ES',
  'EcalBarrel' : 'ECAL',
  'EcalEndcap' : 'ECAL',
  'Hcal' :       'HCAL',
  'L1T' :        'L1T',
  'L1TEMU' :     'L1T',
  'Pixel' :      'PIX',
  'RPC' :        'RPC',
  'SiStrip' :    'STRIP'
}

def getDatasetName(file_name):
  """ Method to get dataset name from the file name"""
  d = None
  try:
    d = re.search("(__[a-zA-Z0-9-_]+)+", file_name).group(0)
    d = re.sub("__", "/", d)
  except:
    d = None
  return d

def getSummaryValues(file_name, translate, filters = None):
  """ Method to extract keys from root file and return dict """
  ROOT.gROOT.Reset()

  run_number = None
  result = {}

  f = ROOT.TFile(file_name, 'READ')

  root = f.GetDirectory("DQMData")
  if root == None: return (run_number, result)
  
  run = None
  for key in root.GetListOfKeys():
    if re.match("^Run [0-9]+$", key.ReadObj().GetName()) and key.IsFolder():
      run_number = int(re.sub("^Run ", "", key.ReadObj().GetName()))
      run = key.ReadObj()
      break

  if run == None: return (run_number, result)

  for sub in run.GetListOfKeys():

    sub_name = sub.ReadObj().GetName()
    if sub_name not in SUBSYSTEMS: continue

    sub_key = sub_name
    if translate:
      sub_key = SUBSYSTEMS[sub_name]

    if filters != None:
      if not re.match(filters[0], sub_key):
        continue
    
    if sub_key not in result:
      result[sub_key] = {}

    evInfo = sub.ReadObj().GetDirectory("Run summary/EventInfo")
    if evInfo == None: continue

    for folder_name in FOLDERS.keys():

      folder = evInfo.GetDirectory(folder_name)
      if folder == None: continue
      
      folder_id = folder_name
      if translate:
        folder_id = FOLDERS[folder_name][0]
      
      if filters != None:
        if not re.match(filters[1], folder_id):
          continue
    
      if folder_id not in result[sub_key]:
        result[sub_key][folder_id] = {}

      value_filter = None
      if filters != None:
        value_filter = filters[2]

      writeValues(folder, result[sub_key][folder_id], None, value_filter)
      writeValues(evInfo, result[sub_key][folder_id], {FOLDERS[folder_name][1]: 'Summary'}, value_filter)

  f.Close()

  return (run_number, result)

def writeValues(folder, map, keymap = None, filter = None):
  """ Write values (possibly only for the keys in the keymap and filtered) from folder to map """
  for value in folder.GetListOfKeys():
    full_name = value.ReadObj().GetName()
    if not value.IsFolder() and re.match("^<.+>f=-{,1}[0-9\.]+</.+>$", full_name):
      value_name = re.sub("<(?P<n>[^>]+)>.+", "\g<n>", full_name)
      value_numb = float(re.sub("<.+>f=(?P<n>-{,1}[0-9\.]+)</.+>", "\g<n>", full_name))
      if keymap == None or value_name in keymap:
        if not keymap == None:
          if not keymap[value_name] == None:
            value_name = keymap[value_name]
        if filter == None or re.match(filter, value_name):
          if value_name not in map:
            map[value_name] = value_numb

def checkFilter(raw_filter):
  """ Check if filter is OK """
  if raw_filter != None:
    try:
      filter = eval(raw_filter)
      if not isinstance("", type(filter[0])) or not isinstance("", type(filter[1])) or not isinstance("", type(filter[2])):
        raise TypeError('')
    except:
      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.")
      sys.exit(2)
  else:
    filter = ('.*', '.*', '.*')
  return filter