6 Beam spot postprocessing library.
8 __author__ =
'Juerg Beringer'
14 from InDetBeamSpotExample.PostProcessing
import PostProcessingStep, PostProcessingError, PostponeProcessing, runPostProcStep
16 from InDetBeamSpotExample
import COOLUtils
21 'PlotBeamSpot.gif':
'<a href="../files?u=%s/%s/%s">Summary</a>',
22 'PlotBeamSpot.pdf':
'(<a href="/jobfiles/%s/%s/%s">pdf</a>)',
23 'PlotBeamSpotMon.gif':
'<a href="../files?u=%s/%s/%s">Monitoring</a>',
24 'PlotBeamSpotMon.pdf':
'(<a href="/jobfiles/%s/%s/%s">pdf</a>)',
25 'PlotGlobalMon.gif':
'<a href="../files?u=%s/%s/%s">Globalmon</a>',
26 'PlotGlobalMon.pdf':
'(<a href="/jobfiles/%s/%s/%s">pdf</a>)',
27 'PlotBeamSpotCompareReproc.gif':
'<a href="../files?u=%s/%s/%s">Compare</a>',
28 'PlotBeamSpotCompareReproc.pdf':
'(<a href="/jobfiles/%s/%s/%s">pdf</a>)',
29 'PlotBeamSpotCompareReproc.html':
'(<a href="/jobfiles/%s/%s/%s">html</a>)',
30 'PlotBCID-data.txt':
'<a href="../files?u=%s/%s/%s">BCID data</a>',
31 'PlotBCID-vsLb.gif':
'<a href="../files?u=%s/%s/%s">vsLb</a>',
32 'PlotBCID-vsLb.pdf':
None,
34 'PlotBCID-vsTime.gif':
'<a href="../files?u=%s/%s/%s">vsTime</a>',
35 'PlotBCID-vsTime.pdf':
None,
37 'PlotBCID-vsBCID.gif':
'<a href="../files?u=%s/%s/%s">vsBCID</a>',
38 'PlotBCID-vsBCID.pdf':
None,
39 'PlotBCID-vsBunchPos.gif':
'<a href="../files?u=%s/%s/%s">vsBunchPos</a>',
40 'PlotBCID-vsBunchPos.pdf':
None,
42 'MergeNt-nt.root':
None,
43 'BeamSpotNt-nt.root':
None,
44 'AveBeamSpot-beamspot.db':
None,
47 'DQBeamSpot-dqflags.db' :
None,
48 'DQBeamSpot-dqflags.txt' :
None,
49 'DQBeamSpotReproc-dqflags.db' :
None,
50 'PlotOnlineOfflineCompare.gif':
None,
51 'PlotOnlineOfflineCompare.pdf':
None
57 beamspottagonline =
'IndetBeamposOnl-LiveMon-001-00'
61 postProcSteps = self.taskDict[
'TASKPOSTPROCSTEPS'].
split()
62 for step
in postProcSteps:
63 self.log(
'Running postprocessing step: %s' % step)
71 print(
'Jobname: ',self.jobName)
73 postProcSteps = self.getJobConfig(self.jobName)[
'jobpostprocsteps'].
split()
75 self.log(
'Warning: No config file or jobpostprocsteps parameter found for %s/%s' % (self.dsName,self.taskName))
76 self.log(
'Continue anyway with the steps: PlotBeamSpotMon LinkResults')
77 steps =
'PlotBeamSpotMon LinkResults'
78 postProcSteps = steps.split()
80 for step
in postProcSteps:
81 self.log(
'Running postprocessing step: %s' % step)
87 postProcSteps =
'PlotBeamSpotMon MergeNt BeamSpotNt PlotBeamSpot LinkResults PlotOnlineOfflineCompare AveBeamSpot CheckT0Status UploadBeamSpot DQBeamSpot UploadDataQuality BeamSpotGlobalNt '
88 for step
in postProcSteps.split():
89 self.log(
'Running postprocessing step: %s' % step)
94 postProcSteps =
'PlotBeamSpotMon MergeNt BeamSpotNt PlotBeamSpot LinkResults PlotOnlineOfflineCompare AveBeamSpot CheckT0Status DQBeamSpot BeamSpotGlobalNt '
95 for step
in postProcSteps.split():
96 self.log(
'Running postprocessing step: %s' % step)
101 postProcSteps =
'PlotBeamSpotMon MergeNt BeamSpotNt PlotBeamSpot PlotBeamSpotCompareReproc LinkResults AveBeamSpot DQBeamSpotReproc'
102 for step
in postProcSteps.split():
103 self.log(
'Running postprocessing step: %s' % step)
109 postProcSteps =
'MergeNt BeamSpotNtNoAve PlotBCID LinkResults'
110 for step
in postProcSteps.split():
111 self.log(
'Running postprocessing step: %s' % step)
117 outFileNameGIF = self.getFileName(
'.gif')
118 outFileNamePDF = self.getFileName(
'.pdf')
119 histFileName = self.getFileName(
'-beamspotmonitoring.root')
120 if os.path.exists(
'/'.
join([self.taskDir,histFileName])):
121 self.logExec(
'cd %s; rm -f %s %s %s' % (self.taskDir,histFileName,outFileNameGIF,outFileNamePDF))
122 postProcFiles = self.taskFileList(
'*-beamspotmonitoring.root',
'POSTPROCESSING',self.jobName)
123 self.log(text=
'Found %i monitoring files from POSTPROCESSING jobs ...' % len(postProcFiles))
124 completedFiles = self.taskFileList(
'*-beamspotmonitoring.root',
'COMPLETED',self.jobName)
125 self.log(text=
'Found %i monitoring files from COMPLETED jobs ...' % len(completedFiles))
126 histFiles =
sorted(postProcFiles+completedFiles)
129 self.hadd(self.taskDir,histFileName,histFiles)
130 self.logExec(
'cd %s; plotBeamSpotMon.py -b -o %s,%s %s' % (self.taskDir,outFileNameGIF,outFileNamePDF,histFileName))
131 self.addResult(outFileNameGIF)
132 self.addResult(outFileNamePDF)
134 self.log(text=
'No monitoring files yet ...')
139 outFileNameGIF = self.getFileName(
'.gif')
140 outFileNamePDF = self.getFileName(
'.pdf')
141 ntFileName = self.getFileName(
'-nt.root',
'BeamSpotNt')
146 beamspottag = COOLUtils.resolveCurrentBeamSpotFolder()
148 raise PostProcessingError(
'ERROR: Unable to resolve beamspot folder tag',self.executedSteps,TaskManager.StatusCodes[
'POSTPROCFAILED'])
150 if os.path.exists(
'/'.
join([self.taskDir,ntFileName])):
151 self.logExec(
'cd %s; plotBeamSpotCompare.py -b -o %s,%s --config="Reproc" %s %s' % (self.taskDir, outFileNameGIF,outFileNamePDF,beamspottag,ntFileName))
152 self.addResult(outFileNameGIF)
153 self.addResult(outFileNamePDF)
154 self.logExec(
'cd %s; mkdir -p %s' % (self.taskDir, self.getFileName(
'-compplots')))
155 self.logExec(
'cd %s; plotBeamSpotCompare.py -b --outtag="%s/repro_" --output=".pdf,.png" --config="Reproc" --multicanv --html %s %s' % (self.taskDir, self.getFileName(
'-compplots'), beamspottag,ntFileName))
156 self.addResult(self.getFileName(
'.html'))
160 outFileNameGIF = self.getFileName(
'.gif')
161 outFileNamePDF = self.getFileName(
'.pdf')
162 ntFileName = self.getFileName(
'-nt.root',
'BeamSpotNt')
163 if os.path.exists(
'/'.
join([self.taskDir,ntFileName])):
164 cmd =
'cd %s; plotBeamSpotCompare.py -b -o %s,%s --online2 --config="OnlineOffline" %s %s' % (self.taskDir, outFileNameGIF, outFileNamePDF, ntFileName, beamspottagonline)
165 status=self.logExec(cmd,doPrint=
True,abortOnError=
False)
166 resultLinks = self.taskDict[
'RESULTLINKS']
168 self.addResult(outFileNameGIF)
169 self.addResult(outFileNamePDF)
170 link =
'<a class="ok" href="../files/?u=%s/%s/%s.gif">vsOnline</a>' % (self.dsName,self.taskName,self.baseNameStep)
171 if resultLinks.find(link)==-1:
172 resultLinks =
' '.
join([resultLinks,link])
173 link =
'(<a class="ok" href="/jobfiles/%s/%s/%s.pdf">pdf</a>)' % (self.dsName,self.taskName,self.baseNameStep)
174 if resultLinks.find(link)==-1:
175 resultLinks =
' '.
join([resultLinks,link])
177 link =
'<a class="warn" href="../files/?u=%s/%s/%s.log">No vsOnline</a>' % (self.dsName,self.taskName,self.baseNameStep)
178 if resultLinks.find(link)==-1:
179 resultLinks =
' '.
join([resultLinks,link])
180 self.taskman.setValue(self.dsName,self.taskName,
'RESULTLINKS',resultLinks)
185 outFileNameGIF = self.getFileName(
'.gif')
186 outFileNamePDF = self.getFileName(
'.pdf')
188 self.logExec(
'cd %s; hadd -f %s-globalmonitoring.root */*-globalmonitoring.root' % (self.taskDir,self.baseName))
189 self.logExec(
'cd %s; plotBeamSpotMon.py -b -o %s,%s %s-globalmonitoring.root' % (self.taskDir,outFileNameGIF,outFileNamePDF,self.baseName))
190 self.addResult(outFileNameGIF)
191 self.addResult(outFileNamePDF)
196 ntFileName = self.getFileName(
'-nt.root')
197 if os.path.exists(
'/'.
join([self.taskDir,ntFileName])):
198 self.logExec(
'cd %s; rm -f %s' % (self.taskDir,ntFileName))
199 postProcFiles = self.taskFileList(
'*-nt.root',
'POSTPROCESSING',self.jobName)
200 self.log(text=
'Found %i ntuple files from POSTPROCESSING jobs ...' % len(postProcFiles))
201 completedFiles = self.taskFileList(
'*-nt.root',
'COMPLETED',self.jobName)
202 self.log(text=
'Found %i ntuple files from COMPLETED jobs ...' % len(completedFiles))
203 ntFiles =
sorted(postProcFiles+completedFiles)
206 self.hadd(self.taskDir,ntFileName,ntFiles)
207 self.addResult(ntFileName)
209 raise PostProcessingError(
'WARNING: No beam spot ntuple files to merge',self.executedSteps)
214 ntFileName = self.getFileName(
'-nt.root',
'BeamSpotNt')
215 outFileNameGIF = self.getFileName(
'.gif')
216 outFileNamePDF = self.getFileName(
'.pdf')
217 if os.path.exists(
'/'.
join([self.taskDir,ntFileName])):
218 self.logExec(
'cd %s; beamspotnt.py -b -o %s,%s -f %s summary' % (self.taskDir,outFileNameGIF,outFileNamePDF,ntFileName))
219 self.addResult(outFileNameGIF)
220 self.addResult(outFileNamePDF)
222 raise PostProcessingError(
'ERROR: No ntuple file %s - did BeamSpotNt step run?\n' % ntFileName,self.executedSteps)
227 resultFiles = self.taskDict[
'RESULTFILES']
229 if 'AveBeamSpot' in self.executedSteps:
230 self.log(text=
'WARNING: You should always run AveBeamSpot after LinkResults to avoid overwriting results\n',doPrint=
True)
233 for r
in resultFiles.split():
234 what =
'.'.
join(r.split(
'.')[-2:])
235 if what
in linkTemplates:
236 if linkTemplates[what]:
237 resultLinks =
' '.
join([resultLinks, linkTemplates[what] % (self.dsName,self.taskName,r)])
239 resultLinks =
' '.
join([resultLinks,
'<a href="../files?u=%s/%s/%s">%s</a>' % (self.dsName,self.taskName,r,what)])
240 self.taskman.setValue(self.dsName,self.taskName,
'RESULTLINKS',resultLinks)
245 ntFileName = self.getFileName(
'-nt.root',
'BeamSpotNt')
246 beamSpotDbFileName = self.getFileName(
'-beamspot.db')
249 if os.path.exists(
'/'.
join([self.taskDir,beamSpotDbFileName])):
250 self.logExec(
'cd %s; rm -f %s' % (self.taskDir,beamSpotDbFileName))
254 if os.path.exists(
'/'.
join([self.taskDir,ntFileName])):
255 cmd =
'cd %s; beamspotnt.py --tag=%s -f %s --newave ave' % (self.taskDir,beamSpotDbFileName[:-3],ntFileName)
258 status = self.logExec(cmd,doPrint=
True,abortOnError=
False)
259 if status
and status!=2
and status!=3:
261 raise PostProcessingError(
'ERROR in postprocessing step AveBeamSpot while executing:\n\n%s\n' % (cmd),self.executedSteps)
262 resultLinks = self.taskDict[
'RESULTLINKS']
264 self.addResult(beamSpotDbFileName)
265 link =
'<a class="ok" href="../files/?u=%s/%s/%s.log">Beam spot</a>' % (self.dsName,self.taskName,self.baseNameStep)
266 if resultLinks.find(link)==-1:
267 resultLinks =
' '.
join([link,resultLinks])
269 link =
'<a class="warn" href="../files/?u=%s/%s/%s.log">No beam spot</a>' % (self.dsName,self.taskName,self.baseNameStep)
270 if resultLinks.find(link)==-1:
271 resultLinks =
' '.
join([link,resultLinks])
273 link =
'<a class="warn" href="../files/?u=%s/%s/%s.log">No vtx/beam spot</a>' % (self.dsName,self.taskName,self.baseNameStep)
274 if resultLinks.find(link)==-1:
275 resultLinks =
' '.
join([link,resultLinks])
298 self.taskman.setValue(self.dsName,self.taskName,
'RESULTLINKS',resultLinks)
300 raise PostProcessingError(
'ERROR: No ntuple file %s - did BeamSpotNt step run?\n' % ntFileName,self.executedSteps)
304 """Check in T0 task DB if T0 processing is done, if not raise PostponeProcessing exception."""
308 f = self.getJobConfig(self.jobName)[
'inputfiles'][0]
312 self.log(
'WARNING: Unable to determine input file type - will assume default (%s)\n' % filter, doPrint=
True)
313 cmd =
'beamspotman.py -n -f %s queryT0 %s %s' % (filter,self.dsName,self.taskName)
314 status = self.logExec(cmd,doPrint=
True,abortOnError=
False)
319 raise PostponeProcessing(
'Tier-0 processing still in progress - restart postprocessing later',self.executedSteps)
322 raise PostProcessingError(
'ERROR: Unable to determine Tier-0 task status',self.executedSteps)
327 beamSpotDbFileName = self.getFileName(
'-beamspot.db',
'AveBeamSpot')
328 cooltags = self.taskDict[
'COOLTAGS']
329 if not cooltags: cooltags =
''
333 beamspottag = COOLUtils.resolveCurrentBeamSpotFolder()
335 raise PostProcessingError(
'ERROR: Unable to resolve beamspot folder tag',self.executedSteps,TaskManager.StatusCodes[
'POSTPROCFAILED'])
338 if beamspottag
in cooltags.split():
339 self.log(
'WARNING: Beam spot already uploaded to COOL: %s - continue anyway' % beamspottag)
344 if self.dsName.
split(
'.')[-1] !=
'express_express' and self.dsName.
split(
'.')[-1] !=
'calibration_BeamSpot':
345 print (self.dsName.
split(
'.')[-1] )
346 self.log(text=
"WARNING: Not running on the express or BeamSpot stream, so won't upload anything - if this is intentional, please upload manually\n",doPrint=
True)
348 if os.path.exists(
'/'.
join([self.taskDir,beamSpotDbFileName])):
351 self.logExec(
'beamspotman.py -b -n -t %s upload %s %s' % (beamspottag,self.dsName,self.taskName))
354 self.log(text=
'ERROR: No beam spot COOL SQLite file %s\n Nothing to upload - was beam spot determination successful?\n' % beamSpotDbFileName,doPrint=
True)
364 """Automatically determine DQ info (after uploading beamspot)"""
365 def run(self, absent=False):
366 ntFileName = self.getFileName(
'-nt.root',
'BeamSpotNt')
367 dataQualityDbFileName = self.getFileName(
'-dqflags.db')
369 if os.path.exists(
'/'.
join([self.taskDir,dataQualityDbFileName])):
370 self.logExec(
'cd %s; rm -f %s' % (self.taskDir,dataQualityDbFileName))
372 if os.path.exists(
'/'.
join([self.taskDir,ntFileName])):
373 cmd =
'cd %s; dqBeamSpot.py -b %s -o %s %s' % (self.taskDir,
'-a' if absent
else '',dataQualityDbFileName,ntFileName)
374 status = self.logExec(cmd,doPrint=
True,abortOnError=
False)
377 raise PostProcessingError(
'ERROR in postprocessing step DQBeamSpot while executing:\n\n%s\n' % (cmd),self.executedSteps)
380 self.addResult(dataQualityDbFileName)
382 dataQualityTxtFileName = dataQualityDbFileName.replace(
'.db',
'.txt')
383 cmd =
'grep -c "ID_BS_NOBEAMSPOT" %s/%s' % (self.taskDir, dataQualityTxtFileName)
384 status,out = subprocess.getstatusoutput(cmd)
390 raise PostProcessingError(
'ERROR in postprocessing step DQBeamSpot while executing:\n\n%s\n' % (cmd),self.executedSteps)
393 link=
'<a class="ok" href="../files?u=%s/%s/%s-dqflags.txt">DQFlags</a>' % (self.dsName,self.taskName,self.baseNameStep)
395 link=
'<a class="bad" href="../files?u=%s/%s/%s-dqflags.txt">DQFlags</a>' % (self.dsName,self.taskName,self.baseNameStep)
397 resultLinks = self.taskDict[
'RESULTLINKS']
398 if resultLinks.find(link)==-1:
399 resultLinks =
' '.
join([resultLinks, link])
402 self.taskman.setValue(self.dsName,self.taskName,
'RESULTLINKS',resultLinks)
404 raise PostProcessingError(
'ERROR: No ntuple file %s - did BeamSpotNt step run?\n' % ntFileName,self.executedSteps)
407 """Automatically determine DQ info (after uploading beamspot). For reprocessing also upload absent defects to remove previosuly set ones"""
409 return DQBeamSpot.run(self, absent=
True)
412 """Upload beampsot data quality info"""
414 dataQualityDbFileName = self.getFileName(
'-dqflags.db',
'DQBeamSpot')
417 if os.path.exists(
'/'.
join([self.taskDir,dataQualityDbFileName])):
418 self.logExec(
'beamspotman.py -b -n --dqtag %s dqflag %s %s' % (dqtag,self.dsName,self.taskName))
420 self.log(text=
'ERROR: No beam spot DQ flag SQLite file %s\n Nothing to upload - was DQ determination successful?\n' % dataQualityDbFileName,doPrint=
True)
425 ntFileName = self.getFileName(
'-nt.root',
'MergeNt')
426 bsNtFileName = self.getFileName(
'-nt.root',
'BeamSpotNt')
427 if os.path.exists(
'/'.
join([self.taskDir,ntFileName])):
428 self.logExec(
"cd %s; rm -f %s; beamspotnt.py -f %s --status '' --fillCOOL --addScanVars merge %s" % (self.taskDir,bsNtFileName,bsNtFileName,ntFileName))
429 self.addResult(bsNtFileName)
431 raise PostProcessingError(
'ERROR: No merged ntuple file %s - did MergeNt step run?\n' % ntFileName,self.executedSteps)
437 ntFileName = self.getFileName(
'-nt.root',
'MergeNt')
438 bsNtFileName = self.getFileName(
'-nt.root')
439 if os.path.exists(
'/'.
join([self.taskDir,ntFileName])):
440 self.logExec(
"cd %s; rm -f %s; beamspotnt.py -f %s --status '' --fillCOOL --useAve merge %s" % (self.taskDir,bsNtFileName,bsNtFileName,ntFileName))
441 self.addResult(bsNtFileName)
443 raise PostProcessingError(
'ERROR: No merged ntuple file %s - did MergeNt step run?\n' % ntFileName,self.executedSteps)
449 cooltags = self.taskDict[
'COOLTAGS']
450 if not cooltags: cooltags =
''
455 self.log(text=
'WARNING: Beam spot not uploaded - result not merged to global ntuple\n',doPrint=
True)
458 ntFileName = self.getFileName(
'-nt.root',
'MergeNt')
459 globalNtDir =
'/afs/cern.ch/user/a/atlidbs/nt/t0'
460 beamspottag = cooltags.split()[len(cooltags.split())-1]
461 globalNtFileName =
'%s/beamspotnt-%s.root' % (globalNtDir,beamspottag)
462 if not os.path.exists(globalNtDir):
463 raise PostProcessingError(
'ERROR: Cannot access directory with global beam spot ntuple: %s' % globalNtDir, self.executedSteps)
464 if os.path.exists(
'/'.
join([self.taskDir,ntFileName])):
465 self.logExec(
"cd %s; beamspotnt.py -f %s --status '' --fillCOOL --useAve merge %s" % (self.taskDir,globalNtFileName,ntFileName))
468 raise PostProcessingError(
'ERROR: No merged ntuple file %s - did MergeNt step run?\n' % ntFileName, self.executedSteps)
473 bsNtFileName = self.getFileName(
'-nt.root',
'BeamSpotNt')
474 dumpFileName = self.getFileName(
'-data.txt')
475 outFileNameLbGIF = self.getFileName(
'-vsLb.gif')
476 outFileNameLbPDF = self.getFileName(
'-vsLb.pdf')
477 outFileNameTimeGIF = self.getFileName(
'-vsTime.gif')
478 outFileNameTimePDF = self.getFileName(
'-vsTime.pdf')
479 outFileNameBCIDGIF = self.getFileName(
'-vsBCID.gif')
480 outFileNameBCIDPDF = self.getFileName(
'-vsBCID.pdf')
481 outFileNameTrainGIF = self.getFileName(
'-vsBunchPos.gif')
482 outFileNameTrainPDF = self.getFileName(
'-vsBunchPos.pdf')
483 if os.path.exists(
'/'.
join([self.taskDir,bsNtFileName])):
484 self.logExec(
"cd %s; rm -f %s; beamspotnt.py -v -f %s dump > %s" % (self.taskDir,dumpFileName,bsNtFileName,dumpFileName))
485 self.addResult(dumpFileName)
486 self.logExec(
"cd %s; beamspotnt.py --batch -o %s,%s -f %s summary" % (self.taskDir,outFileNameLbGIF,outFileNameLbPDF,bsNtFileName))
487 self.addResult(outFileNameLbGIF)
488 self.addResult(outFileNameLbPDF)
489 self.logExec(
"cd %s; beamspotnt.py --batch --time -o %s,%s -f %s summary" % (self.taskDir,outFileNameTimeGIF,outFileNameTimePDF,bsNtFileName))
490 self.addResult(outFileNameTimeGIF)
491 self.addResult(outFileNameTimePDF)
492 self.logExec(
"cd %s; beamspotnt.py --batch -m 0.2 --perbcid -o %s,%s -f %s summary" % (self.taskDir,outFileNameBCIDGIF,outFileNameBCIDPDF,bsNtFileName))
493 self.addResult(outFileNameBCIDGIF)
494 self.addResult(outFileNameBCIDPDF)
495 self.logExec(
"cd %s; beamspotnt.py --batch --vsbunchpos -o %s,%s -f %s summary" % (self.taskDir,outFileNameTrainGIF,outFileNameTrainPDF,bsNtFileName))
496 self.addResult(outFileNameTrainGIF)
497 self.addResult(outFileNameTrainPDF)
499 raise PostProcessingError(
'ERROR: No beam spot ntuple file %s - did BeamSpotNt step run?\n' % bsNtFileName,self.executedSteps)