2 '''Script that runs a single O2O for SiStrip DAQ. 12 from functools
import partial
13 import CondTools.SiStrip.o2o_helper
as helper
14 from CondTools.SiStrip.o2o_db_cfgmap
import DbManagerDAQ
15 from CondTools.SiStrip.o2o_db_gain
import DbManagerGain
18 cfg_template =
'CondTools/SiStrip/python/SiStripO2O_cfg_template.py' 22 logging.debug(
str(args))
25 with open(args.cfgfile)
as cfgfile:
26 cfglines = cfgfile.read()
27 logging.debug(cfglines)
30 job_file =
'cfg_{type}_{run}.py'.
format(type=args.analyzer, run=args.since)
31 output_db =
'{type}_{run}.db'.
format(type=args.analyzer, run=args.since)
32 if os.path.exists(output_db):
33 logging.info(
'Output sqlite file %s already exists! Deleting...' % output_db)
35 hashmap_db =
'hashmap_{type}_{run}.db'.
format(type=args.analyzer, run=args.since)
36 if os.path.exists(hashmap_db):
37 logging.info(
'Hashmap sqlite file %s already exists! Deleting...' % hashmap_db)
39 replace_dict = {
'_CFGLINES_' : cfglines.replace(
'\\',
''),
40 '_ANALYZER_' : args.analyzer,
41 '_USEANALYSIS_':
'False',
42 '_CONDDB_' : args.condDbRead,
43 '_DBFILE_' :
'sqlite:///%s' % output_db,
44 '_TARGETTAG_': args.inputTag,
45 '_RUNNUMBER_': args.since,
46 '_HASHMAPDB_': args.hashmapDb,
47 '_MAPDBFILE_':
'sqlite:///%s' % hashmap_db,
51 if args.analyzer ==
'SiStripO2OApvGain':
55 with open(args.skiplistFile)
as skipfile:
56 skipped = skipfile.read()
58 logging.warning(
'Skipped module list not provided! No module will be skipped...')
60 if args.whitelistFile:
61 with open(args.whitelistFile)
as wfile:
62 whitelisted = wfile.read()
64 logging.warning(
'Module whitelist not provided!')
65 replace_dict[
'_USEANALYSIS_'] =
'True' 66 replace_dict[
'_SKIPPED_'] = skipped
67 replace_dict[
'_WHITELISTED_'] = whitelisted
68 replace_dict[
'_HASHMAPDB_'] =
'' 69 replace_dict[
'_MAPDBFILE_'] =
'' 72 for basedir
in os.environ[
'CMSSW_SEARCH_PATH'].
split(
':'):
73 templatefile = os.path.join(basedir, cfg_template)
74 if os.path.exists(templatefile):
75 logging.info(
'Use template config file %s' % templatefile)
77 config = helper.insert_to_file(templatefile, job_file, replace_dict)
78 logging.info(
'Start running O2O...')
79 logging.debug(
' ... config:\n%s\n' % config)
82 command =
'cmsRun %s' % job_file
83 pipe = subprocess.Popen(command, shell=
True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
84 atexit.register(partial(helper.kill_subproc_noexcept, pipe))
85 out = pipe.communicate()[0]
86 if isinstance(out, bytes):
87 out = out.decode(
"utf8",
"replace")
88 logging.info(
'\n%s\n' % out)
89 logging.info(
'@@@CMSSW job return code = %d@@@' % pipe.returncode)
90 if pipe.returncode != 0:
91 raise RuntimeError(
'O2O job FAILED!')
95 logging.info(
'Will not run uploading as requested!')
98 f = helper.upload_payload
100 f = helper.copy_payload
101 f(dbFile=output_db, inputTag=args.inputTag, destTags=args.destTags, destDb=args.destDb, since=args.since,
102 userText=
'{type}, run: {run}'.
format(type=args.analyzer, run=args.since))
105 if args.analyzer ==
'SiStripO2OApvGain':
106 logging.info(
'Writting bookkeeping info to database.')
107 dbmgr = DbManagerGain(args.bookkeeping_db)
108 dbmgr.update_gain_logs(args.since, job_file)
110 logging.info(
'Updating config-to-payload hash map to database.')
111 dbmgr = DbManagerDAQ(args.bookkeeping_db)
112 dbmgr.update_hashmap(hashmap_db)
117 os.remove(output_db.replace(
'.db',
'.txt'))
118 os.remove(hashmap_db)
123 parser = argparse.ArgumentParser(description=
'Run a single O2O job for SiStrip DAQ and upload the payloads to condition database.')
124 parser.add_argument(
'analyzer', metavar=
'ANALYZER', help=
'Which EDAnalyzer to use to create the payload.')
125 parser.add_argument(
'since', metavar=
'SINCE', type=str, help=
'Run number.')
126 parser.add_argument(
'cfgfile', metavar=
'CFGLINES', help=
'File containing configuration lines.')
127 parser.add_argument(
'--destTags', required=
True, help=
'Destination tag name(s) for upload. Use comma to separate multiple values.')
128 parser.add_argument(
'--destDb', required=
True, help=
'Destination DB to upload.')
129 parser.add_argument(
'--inputTag', required=
True, help=
'Tag name to be used in the sqlite file.')
130 parser.add_argument(
'--condDbRead', default=
'oracle://cms_orcon_prod/CMS_CONDITIONS', help=
'Connection string for the DB from which the fast O2O retrives payloads.')
131 parser.add_argument(
'--hashmapDb', default=
'', help=
'DB to read and write config-to-payload hash (for fast O2O).')
132 parser.add_argument(
'--skiplistFile', default=
'', help=
'File containing the devices to be skipped in G1 O2O.')
133 parser.add_argument(
'--whitelistFile', default=
'', help=
'File of the whitelisted devices in G1 O2O.')
135 parser.add_argument(
'--no-upload', action=
"store_true", default=
False, help=
'Do not upload payload. Default: %(default)s.')
136 parser.add_argument(
'--use-uploader', action=
"store_true", default=
False, help=
'Use conditionUploader instead of conddb copy. Default: %(default)s.')
137 parser.add_argument(
'--bookkeeping-db', default=
'prod', choices=[
'prod',
'dev',
'private'], help=
'Bookkeeping database for fast O2O and G1 O2O. Default: %(default)s.')
138 parser.add_argument(
'--debug', action=
"store_true", default=
False, help=
'Switch on debug mode. Default: %(default)s.')
139 args = parser.parse_args()
141 loglevel = logging.INFO
143 loglevel = logging.DEBUG
144 if args.bookkeeping_db ==
'prod':
145 args.bookkeeping_db =
'dev' 146 logging.basicConfig(level=loglevel, format=
'[%(asctime)s] %(levelname)s: %(message)s')
148 if not args.since.isdigit():
149 raise RuntimeError(
'Since (=%s) must be a valid run number!'%(args.since))
151 args.destTags = args.destTags.strip().
split(
',')
153 logging.info(
'Running O2O %s on machine [%s]' % (args.analyzer, socket.gethostname()))
156 jobdirbase = os.environ[jobDirVar]
159 logging.warning(
'%s not set in env, will use %s' % (jobDirVar, jobdirbase))
162 args.cfgfile = os.path.abspath(args.cfgfile)
163 if args.skiplistFile:
164 args.skiplistFile = os.path.abspath(args.skiplistFile)
165 if args.whitelistFile:
166 args.whitelistFile = os.path.abspath(args.whitelistFile)
169 jobdir = os.path.join(jobdirbase, args.since, args.analyzer)
170 if not os.path.exists(jobdir):
173 logging.info(
'Running O2O in %s' % jobdir)
178 logging.info(
'Done!')
182 if __name__ ==
'__main__':
def split(sequence, size)