50 from .
import detmaskmod
51 runNumber = re.match(
r'run_(\d+)_.*han.root', name).group(1)
52 max_hi_limit = detmaskmod.getNumLumiBlocks(int(runNumber))+1
53 if (name.find(
'minutes10_') > -1):
54 t = name.split(
'minutes10_')
55 digit = float(((t[len(t)-1]).
split(
'_'))[0])
56 low_limit = int((digit-1.0)*10.0/LBlength+1)-1
57 hi_limit = int(digit*10.0/LBlength)
58 elif (name.find(
'minutes30_') > -1):
59 t = name.split(
'minutes30_')
60 digit = float(((t[len(t)-1]).
split(
'_'))[0])
61 low_limit = int((digit-1.0)*30.0/LBlength+1)-1
62 hi_limit = int(digit*30.0/LBlength)
63 elif 'lowStat_' in name:
64 t = name.split(
'lowStat_LB')[-1]
65 t = t.split(
'_han.root')[0]
67 low_limit = int(digits[0])
68 hi_limit =
min(int(digits[1])+1, max_hi_limit)
69 elif 'medStat_' in name:
70 t = name.split(
'medStat_LB')[-1]
71 t = t.split(
'_han.root')[0]
73 low_limit = int(digits[0])
74 hi_limit =
min(int(digits[1])+1, max_hi_limit)
77 hi_limit = max_hi_limit
78 except Exception
as e:
79 logging.warning(
'Could not determine limits because: %s', e)
83 return (low_limit, hi_limit)
129 mapping = {1:
'TRIG_L1_CTP_CTP_ROD_bcid',
130 2:
'TRIG_L1_CTP_bcid',
131 3:
'TRIG_L1_CTP_CTP_MuCTPI_bcid',
132 4:
'TRIG_L1_CTP_candnumber',
133 5:
'TRIG_L1_CTP_multpt',
134 6:
'TRIG_L1_CTP_roiNum',
135 7:
'TRIG_L1_CTP_roiCand',
136 8:
'TRIG_L1_CTP_bcidrange',
137 9:
'TRIG_L1_CTP_lumiblockrange',
138 10:
'TRIG_L1_CTP_lumiblocktime',
139 11:
'TRIG_L1_CTP_nanosectime',
140 12:
'TRIG_L1_CTP_TAPnoTBP',
141 13:
'TRIG_L1_CTP_TAVnoTAP',
142 14:
'TRIG_L1_CTP_CTPsim',
143 15:
'TRIG_L1_CTP_incompletefragment',
148 when = d.Get(
'CentralTrigger/ErrorSummary/errorSummaryPerLumiBlock')
152 overflow_bad_lbs = {}
157 for errorBin
in mapping:
158 bad_lbs[errorBin] = [bin
for bin
in range(1, when.GetNbinsX(
159 )+1)
if when.GetBinContent(bin, errorBin) > 0]
160 overflow_bad_lbs[errorBin] = (
161 when.GetBinContent(when.GetNbinsX()+1, errorBin) > 0)
163 message =
'Automatically set'
165 for defect
in mapping:
166 for lb
in bad_lbs[defect]:
167 rv.append(
defect_iov(mapping[defect], message,
False, lb, lb+1))
168 if overflow_bad_lbs[defect]:
169 message +=
'; defect occurred past end of monitoring histogram, marking end of run as bad'
170 from .
import detmaskmod
171 nlbs = detmaskmod.getNumLumiBlocks(runNumber)
173 False, when.GetNbinsX(), nlbs+1))
190 def sct_conf_defects_core(d, i, runNumber, histname, mapping):
192 histogram = d.Get(histname)
197 if mapping[bin] ==
'SCT_MOD_OUT_GT40':
199 if histogram.GetBinContent(bin) > threshold:
201 mapping[bin],
'%.1d modules affected' % histogram.GetBinContent(bin),
False))
204 rv1 = sct_conf_defects_core(d, i, runNumber,
'InnerDetector/SCT/Summary/SCTConfOutM',
205 {1:
'SCT_MOD_OUT_GT40'})
206 rv2 = sct_conf_defects_core(d, i, runNumber,
'InnerDetector/SCT/Summary/SCTConfNew',
207 {3:
'SCT_MOD_ERR_GT40',
208 5:
'SCT_MOD_NOISE_GT40'})
209 if rv1
is None and rv2
is None:
212 return (rv1
if rv1
is not None else [])+(rv2
if rv2
is not None else [])
216 pairs = [(
'InnerDetector/SCT/Summary/SCT_LinksWithLinkLevelErrorsVsLbs',
217 'SCT_PERIOD_ERR_GT40',
lambda _: _ > 80),
218 (
'InnerDetector/SCT/Summary/SCT_LinksWithRODLevelErrorsVsLbs',
219 'SCT_ROD_OUT',
lambda _: _ >= 1)]
223 overflow_bad_lbs = {}
224 message =
'Automatically set'
227 for hname, dname, policy
in pairs:
234 bad_lbs[dname] = [bin
for bin
in range(
235 1, when.GetNbinsX()+1)
if policy(when.GetBinContent(bin))]
236 overflow_bad_lbs[dname] = policy(
237 when.GetBinContent(when.GetNbinsX()+1))
239 for lb
in bad_lbs[dname]:
240 rv.append(
defect_iov(dname, message,
False, lb, lb+1))
241 if overflow_bad_lbs[dname]:
242 message +=
'; defect occurred past end of monitoring histogram, marking end of run as bad'
243 from .
import detmaskmod
244 nlbs = detmaskmod.getNumLumiBlocks(runNumber)
246 False, when.GetNbinsX(), nlbs+1))
254 from DQDefects
import DEFECT_IOV
255 from DQUtils.sugar
import RunLumi
257 histogram = d.Get(
'InnerDetector/SCT/Summary/SCT_LinksWithRODLevelErrorsVsLbs')
259 logger.warning(
'sct_rod_retraction: histogram not found in physics_Main, skipping')
262 existing = ddb.retrieve(RunLumi(runNumber, 0), RunLumi(runNumber, 0xFFFFFFFF),
263 channels=[
'SCT_ROD_OUT'], primary_only=
True)
264 auto_set = [iov
for iov
in existing
if iov.user ==
'sys:hancool' and iov.present]
267 logger.info(
'sct_rod_retraction: no auto-set SCT_ROD_OUT found for run %d', runNumber)
270 logger.info(
'sct_rod_retraction: found %d auto-set SCT_ROD_OUT IOV(s) for run %d',
271 len(auto_set), runNumber)
274 rod_out_policy =
lambda _: _ >= 1
277 for lb
in range(iov.since.lumi, iov.until.lumi):
278 if lb > histogram.GetNbinsX():
279 logger.warning(
'sct_rod_retraction: LB %d beyond histogram range, skipping', lb)
281 if not rod_out_policy(histogram.GetBinContent(lb)):
283 'Retracted: no ROD errors in physics_Main',
287 logger.info(
'sct_rod_retraction: no LBs to retract for run %d', runNumber)
291 logger.info(
'sct_rod_retraction: retracting %d IOV(s) for run %d', len(merged), runNumber)
293 return [DEFECT_IOV(RunLumi(runNumber, r.since),
294 RunLumi(runNumber, r.until),
365def hancool_defects(runNumber, filePath="./", dbConnection="", isESn=True, stream='', amitag=None):
366 from .
import pix_defect
367 isUPCESn = (amitag
is not None and 'x' in amitag
and stream ==
'UPC')
371 analyzers += [ctp_defects]
373 analyzers += [sct_eff_defect,
380 analyzers += [sct_eff_defect,
386 if (len(filePath) == 0
or filePath[-1] !=
'/'):
388 if (len(dbConnection) < 1):
389 dbConnection =
"/afs/cern.ch/user/a/atlasdqm/dqmdisk1/cherrypy-devel/defectstest.db/COMP200"
393 defects_by_function = {}
397 fnames = ([[filePath+
"run_"+str(runNumber)+
"_han.root"], []]
398 + [glob.glob(os.path.join(filePath,
'run_%s%s*_han.root' % (runNumber, intervalType[i])))
for i
in [2, 3]])
400 for i, itype
in enumerate(fnames):
401 ldefects_by_function = {}
402 for globname
in itype:
403 filename = os.path.basename(globname)
407 default_iov = default_iov._replace(since=since, until=until)
409 fobj = ROOT.TFile.Open(globname)
410 for func
in analyzers:
411 rv = func(fobj, i, runNumber)
413 rvt = [default_iov._replace(**(i._asdict()))
for i
in rv]
414 if func
not in ldefects_by_function:
415 ldefects_by_function[func] = rvt
417 ldefects_by_function[func] += rvt
418 defects_by_function.update(ldefects_by_function)
419 defects = sum(defects_by_function.values(), [])
422 globname = fnames[0][0]
423 filename = os.path.basename(globname)
426 defects += pix_defect.execute(runNumber, globname, until-1)
427 except Exception
as e:
428 logging.warning(
'Unable to execute pixel hancool code')
429 logging.warning(
'--> %s: %s',
type(e).__name__, e)
431 from DQDefects
import DefectsDB, DEFECT_IOV
432 from DQUtils.sugar
import RunLumi
434 ddb =
DefectsDB(dbConnection, read_only=
False)
435 use_flask =
'sqlite' not in dbConnection
437 secret_path = os.environ.get(
'COOLFLASK_SECRET',
'/afs/cern.ch/user/a/atlasdqm/private/coolflask_secret/coolflask_secret.json')
438 auth = json.loads(open(secret_path).
read())
443 logging.info(
'Running detmask_defects')
447 for defect
in dm_defects +
iovs_merge(defects):
448 logger.debug(
'Working with %s', defect)
449 defectlist.append(DEFECT_IOV(RunLumi(runNumber, defect.since),
450 RunLumi(runNumber, defect.until),
451 channel=defect.defect,
452 comment=defect.comment,
454 recoverable=defect.recoverable,
456 logger.debug(
'Flask upload')
457 ddb.insert_multiple(defectlist, use_flask=use_flask, flask_auth=auth)
459 elif isUPCESn
and defects:
461 defectlist = [DEFECT_IOV(RunLumi(runNumber, d.since),
462 RunLumi(runNumber, d.until),
466 recoverable=d.recoverable,
469 logger.debug(
'Flask upload (UPC express SCT defects)')
470 ddb.insert_multiple(defectlist, use_flask=use_flask, flask_auth=auth)
472 elif stream ==
'Main' and fnames[0]:
476 if not os.path.exists(fpath):
477 logger.warning(
'sct_rod_retraction: file not found: %s', fpath)
479 fobj = ROOT.TFile.Open(fpath)
483 logger.debug(
'Flask upload (retraction)')
484 ddb.insert_multiple(retract_list, use_flask=use_flask, flask_auth=auth)
486 logger.exception(
'sct_rod_retraction failed for run %d', runNumber)