1 |
#!/usr/bin/env python
|
2 |
from sys import stderr, exit
|
3 |
|
4 |
from optparse import OptionParser
|
5 |
parser = OptionParser(usage="usage: %prog [options] Trigger_Path")
|
6 |
parser.add_option("--firstRun", dest="firstRun", help="first run", type="int", metavar="RUN", default="1")
|
7 |
parser.add_option("--lastRun", dest="lastRun", help="last run", type="int", metavar="RUN", default="9999999")
|
8 |
parser.add_option("--groupName", dest="groupName", help="select runs of name like NAME", metavar="NAME", default="Collisions%")
|
9 |
parser.add_option("--rrurl", dest="rrurl", help="run registry xmlrpc url", metavar="URL", default="http://pccmsdqm04.cern.ch/runregistry/xmlrpc")
|
10 |
parser.add_option("--jsonOut", dest="jsonOut", help="dump prescales in JSON format on FILE", metavar="FILE")
|
11 |
(options, args) = parser.parse_args()
|
12 |
if len(args) != 1:
|
13 |
parser.print_usage()
|
14 |
exit(2)
|
15 |
path = args[0]
|
16 |
|
17 |
|
18 |
edmCfgFromDB = "edmConfigFromDB --orcoff --nopsets --noes --nopaths --nooutput --services PrescaleService ";
|
19 |
## my $pyPrintTable = "echo 'for X in process.PrescaleService.prescaleTable: print \"\%s \%s\" % (X.pathName.value(), X.prescales[0])'";
|
20 |
def getPrescalesFromKey(key):
|
21 |
stderr.write("\t%s ...\n" % key);
|
22 |
# Get CFG
|
23 |
from subprocess import Popen, PIPE
|
24 |
cfg = Popen((edmCfgFromDB+" --configName "+key).split(), stdout=PIPE).communicate()[0]
|
25 |
# Evaluate, in its own namespace
|
26 |
ns = dict()
|
27 |
exec cfg.replace("\r\n","\n") in ns
|
28 |
# Parse results
|
29 |
psMap = {}
|
30 |
for X in ns["process"].PrescaleService.prescaleTable:
|
31 |
psMap[X.pathName.value()] = X.prescales[0]
|
32 |
return psMap
|
33 |
|
34 |
def queryRR():
|
35 |
stderr.write("Querying run registry for range [%d, %d], group name like %s ...\n" % (options.firstRun, options.lastRun, options.groupName))
|
36 |
import xmlrpclib
|
37 |
import xml.dom.minidom
|
38 |
server = xmlrpclib.ServerProxy(options.rrurl)
|
39 |
run_data = server.DataExporter.export('RUN', 'GLOBAL', 'xml_datasets', "{runNumber} >= %d AND {runNumber} <= %d AND {groupName} like '%s' AND {datasetName} = '/Global/Online/ALL'" % (options.firstRun, options.lastRun, options.groupName))
|
40 |
ret = {}
|
41 |
xml_data = xml.dom.minidom.parseString(run_data)
|
42 |
xml_runs = xml_data.documentElement.getElementsByTagName("RUN_DATASET")
|
43 |
for xml_run in xml_runs:
|
44 |
ret[xml_run.getElementsByTagName("RUN_NUMBER")[0].firstChild.nodeValue] = xml_run.getElementsByTagName("RUN_HLTKEY")[0].firstChild.nodeValue
|
45 |
return ret
|
46 |
|
47 |
runKeys = queryRR()
|
48 |
prescaleTable = {}
|
49 |
runs = runKeys.keys(); runs.sort()
|
50 |
stderr.write("Querying ConfDB for prescales for path %s...\n" % (path));
|
51 |
jsout = {}
|
52 |
for run in runs:
|
53 |
key = runKeys[run]
|
54 |
if not prescaleTable.has_key(key):
|
55 |
prescaleTable[key] = getPrescalesFromKey(key)
|
56 |
psfactor = 1
|
57 |
if prescaleTable[key].has_key(path): psfactor = prescaleTable[key][path]
|
58 |
print "%s\t%s" % (run, psfactor)
|
59 |
jsout[run] = psfactor
|
60 |
|
61 |
if options.jsonOut:
|
62 |
stderr.write("Exporting to JSON file %s...\n" % (options.jsonOut))
|
63 |
import json
|
64 |
jsonFile = open(options.jsonOut, "w")
|
65 |
jsonFile.write(json.dumps(jsout))
|
66 |
jsonFile.close()
|
67 |
|