14 from __future__
import print_function
15 import os,os.path,sys,math,array,datetime,time,calendar,re
18 from RecoLuminosity.LumiDB
import argparse,sessionManager,lumiTime,CommonUtil,lumiCalcAPI,lumiParameters,revisionDML,normDML
21 allfillname=
'allfills.txt' 25 output: {run:starttime} 29 if len(fillrundict)>0:
30 runs=fillrundict.values()[0]
33 for perrundata
in runresult:
34 runtimesInFill[perrundata[0]]=perrundata[7]
39 list all fills contained in the given dir 43 fillnamepat=
r'^[0-9]{4}$' 44 p=re.compile(fillnamepat)
46 dirList=os.listdir(indir)
48 if p.match(fname)
and os.path.isdir(os.path.join(indir,fname)):
49 allfs=os.listdir(os.path.join(indir,fname))
51 sumfilenamepat=
r'^[0-9]{4}_bxsum_CMS.txt$' 52 s=re.compile(sumfilenamepat)
55 processedfills.append(
int(fname))
60 parse infile to find LASTCOMPLETEFILL 61 input: input file name 62 output: last completed fill number 65 hlinepat=
r'(LASTCOMPLETEFILL )([0-9]{4})' 66 h=re.compile(hlinepat)
67 dqmfile=open(infile,
'r') 71 lastfill=result.group(2)
77 calculate specific lumi 78 input: instlumi, instlumierror,beam1intensity,beam1intensityerror,beam2intensity,beam2intensityerror 79 output (specific lumi value,specific lumi error) 83 if beam1intensity<0: beam1intensity=0
84 if beam2intensity<0: beam2intensity=0
85 if beam1intensity>0.0
and beam2intensity>0.0:
87 specificlumierr=specificlumi*math.sqrt(lumierr**2/lumi**2+beam1intensityerr**2/beam1intensity**2+beam2intensityerr**2/beam2intensity**2)
88 return (specificlumi,specificlumierr)
92 parse fill_xxx.txt files in the input directory for runs, starttime in the fill 93 input: fillnumber, input dir 94 output: {run:tarttime} 98 for filename
in os.listdir(inputdir):
99 mpat=
r'^fill_[0-9]{4}.txt$' 101 if m.match(filename)
is None:
103 filename=filename.strip()
104 if filename.find(
'.')==-1:
continue 105 basename,extension=filename.split(
'.')
106 if not extension
or extension!=
'txt':
108 if basename.find(
'_')==-1:
continue 109 prefix,number=basename.split(
'_')
110 if not number :
continue 111 if fillnum!=
int(number):
continue 112 f=open(os.path.join(inputdir,
'fill_'+number+
'.txt'),
'r') 116 if len(fields)<2 :
continue 117 runtimesInFill[
int(fields[0])]=fields[1]
119 return runtimesInFill
124 write runnumber:starttime map per fill to files 126 f=open(os.path.join(dirname,allfillname),
'w')
127 for fill
in allfills:
128 print(
'%d'%(fill), file=f)
130 for fill,runs
in runsperfill.items():
131 filename=
'fill_'+
str(fill)+
'.txt' 133 f=open(os.path.join(dirname,filename),
'w')
135 print(
'%d,%s'%(run,runtimes[run]), file=f)
146 print(
'empty input data, do nothing for fill ',fillnum)
149 filloutdir=os.path.join(outdir,
str(fillnum))
150 if not os.path.exists(filloutdir):
152 for cmsbxidx,perbxdata
in filldata.items():
155 lhcbucket=(cmsbxidx-1)*10+1
156 a=sorted(perbxdata,key=
lambda x:x[0])
157 filename=
str(fillnum)+
'_lumi_'+
str(lhcbucket)+
'_CMS.txt' 161 beamstatusfrac=perlsdata[1]
163 lumierror=perlsdata[3]
166 speclumi=perlsdata[4]
167 speclumierror= perlsdata[5]
169 linedata.append([ts,beamstatusfrac,lumi,lumierror,speclumi,speclumierror])
170 if ts
not in timedict:
172 timedict[ts].
append([beamstatusfrac,lumi,lumierror,speclumi,speclumierror])
174 f=open(os.path.join(filloutdir,filename),
'w')
175 for line
in linedata:
176 print(
'%d\t%e\t%e\t%e\t%e\t%e'%(line[0],line[1],line[2],line[3],line[4],line[5]), file=f)
179 summaryfilename=
str(fillnum)+
'_lumi_CMS.txt' 181 lstimes=sorted(timedict.keys())
184 for lstime
in lstimes:
185 allvalues=timedict[lstime]
187 bstatfrac=transposedvalues[0][0]
188 lumivals=transposedvalues[1]
189 lumitot=sum(lumivals)
191 fillseg.append([lstime,lumitot])
192 lumierrs=transposedvalues[2]
193 lumierrortot=math.sqrt(sum(
map(
lambda x:x**2,lumierrs)))
194 specificvals=transposedvalues[3]
195 specificavg=sum(specificvals)/
float(len(specificvals))
196 specificerrs=transposedvalues[4]
197 specifictoterr=math.sqrt(sum(
map(
lambda x:x**2,specificerrs)))
198 specificerravg=specifictoterr/
float(len(specificvals))
200 f=open(os.path.join(filloutdir,summaryfilename),
'w')
202 print(
'%d\t%e\t%e\t%e\t%e\t%e'%(lstime,bstatfrac,lumitot,lumierrortot,specificavg,specificerravg), file=f)
206 fillsummaryfilename=
str(fillnum)+
'_bxsum_CMS.txt' 207 f=open(os.path.join(filloutdir,fillsummaryfilename),
'w')
209 print(
'%s'%(
'#no stable beams'), file=f)
212 previoustime=fillseg[0][0]
213 boundarytime=fillseg[0][0]
216 summaryls[boundarytime]=[]
217 for [lstime,lumitot]
in fillseg:
218 if lstime-previoustime>50.0:
221 summaryls[boundarytime]=[]
223 summaryls[boundarytime].
append([lstime,lumitot])
227 summarylstimes=summaryls.keys()
228 summarylstimes.sort()
230 for bts
in summarylstimes:
232 tsdatainseg=summaryls[bts]
234 stopts=tsdatainseg[-1][0]
237 print(
'%d\t%d\t%e\t%e'%(startts,stopts,plu,lui), file=f)
240 def getSpecificLumi(schema,fillnum,inputdir,dataidmap,normmap,xingMinLum=0.0,amodetag='PROTPHYS',bxAlgo='OCC1'):
242 specific lumi in 1e-30 (ub-1s-1) unit 243 lumidetail occlumi in 1e-27 244 1309_lumi_401_CMS.txt 245 time(in seconds since January 1,2011,00:00:00 UTC) stab(fraction of time spent in stable beams for this time bin) l(lumi in Hz/ub) dl(point-to-point error on lumi in Hz/ub) sl(specific lumi in Hz/ub) dsl(error on specific lumi) 246 20800119.0 1 -0.889948 0.00475996848729 0.249009 0.005583287562 -0.68359 6.24140208607 0.0 0.0 0.0 0.0 0.0 0.0 0.0383576 0.00430892097862 0.0479095 0.00430892097862 66.6447 4.41269758764 0.0 0.0 0.0 247 result [(time,beamstatusfrac,lumi,lumierror,speclumi,speclumierror)] 252 runlist=runtimesInFill.keys()
253 if not runlist:
return fillbypos
254 irunlsdict=
dict(
list(
zip(runlist,[
None]*len(runlist))))
257 lumidetails=
lumiCalcAPI.deliveredLumiForIds(schema,irunlsdict,dataidmap,GrunsummaryData,beamstatusfilter=
None,normmap=normmap,withBXInfo=
True,bxAlgo=bxAlgo,xingMinLum=xingMinLum,withBeamIntensity=
True,lumitype=
'HF')
262 orderedrunlist=sorted(lumidetails)
263 for run
in orderedrunlist:
264 perrundata=lumidetails[run]
265 for perlsdata
in perrundata:
266 beamstatus=perlsdata[3]
267 if beamstatus==
'STABLE BEAMS':
270 if totalstablebeamls<10:
271 print(
'fill ',fillnum,
' , having less than 10 stable beam lS, is not good, skip')
274 for run
in orderedrunlist:
275 perrundata=lumidetails[run]
276 for perlsdata
in perrundata:
278 tsdatetime=perlsdata[2]
279 ts=calendar.timegm(tsdatetime.utctimetuple())
280 beamstatus=perlsdata[3]
281 if beamstatus==
'STABLE BEAMS':
283 (bxidxlist,bxvaluelist,bxerrolist)=perlsdata[7]
285 instbxvaluelist=[x
for x
in bxvaluelist
if x]
287 if len(instbxvaluelist)!=0:
288 maxlumi=
max(instbxvaluelist)
290 if len(instbxvaluelist)!=0:
291 avginstlumi=sum(instbxvaluelist)
292 (intbxidxlist,b1intensities,b2intensities)=perlsdata[8]
293 for bxidx
in bxidxlist:
294 idx=bxidxlist.index(bxidx)
295 instbxvalue=bxvaluelist[idx]
296 bxerror=bxerrolist[idx]
297 if instbxvalue<
max(xingMinLum,maxlumi*0.2):
301 bintensityPos=intbxidxlist.index(bxidx)
305 fillbypos.setdefault(bxidx,[]).
append([ts,beamstatusfrac,instbxvalue,bxerror,0.0,0.0])
307 b1intensity=b1intensities[bintensityPos]
308 b2intensity=b2intensities[bintensityPos]
310 fillbypos.setdefault(bxidx,[]).
append([ts,beamstatusfrac,instbxvalue,bxerror,speclumi[0],speclumi[1]])
322 if __name__ ==
'__main__':
323 parser = argparse.ArgumentParser(prog=os.path.basename(sys.argv[0]),description =
"specific lumi",formatter_class=argparse.ArgumentDefaultsHelpFormatter)
324 amodetagChoices = [
"PROTPHYS",
"IONPHYS",
'PAPHYS' ]
325 xingAlgoChoices =[
"OCC1",
"OCC2",
"ET"]
327 parser.add_argument(
'-c',dest=
'connect',
330 help=
'connect string to lumiDB,optional',
331 default=
'frontier://LumiCalc/CMS_LUMI_PROD')
332 parser.add_argument(
'-P',dest=
'authpath',
334 help=
'path to authentication file,optional')
335 parser.add_argument(
'-i',dest=
'inputdir',
340 parser.add_argument(
'-o',dest=
'outputdir',
345 parser.add_argument(
'-f',
'--fill',dest=
'fillnum',
348 help=
'specific fill',
350 parser.add_argument(
'--minfill',dest=
'minfill',
356 parser.add_argument(
'--maxfill',dest=
'maxfill',
361 help=
'maximum fillnumber ' 363 parser.add_argument(
'--amodetag',dest=
'amodetag',
365 choices=amodetagChoices,
367 help=
'specific accelerator mode choices [PROTOPHYS,IONPHYS,PAPHYS] (optional)')
368 parser.add_argument(
'--xingMinLum', dest =
'xingMinLum',
372 help=
'Minimum luminosity considered for lumibylsXing action')
373 parser.add_argument(
'--xingAlgo', dest =
'bxAlgo',
376 help=
'algorithm name for per-bunch lumi ')
377 parser.add_argument(
'--normtag',dest=
'normtag',action=
'store',
381 parser.add_argument(
'--datatag',dest=
'datatag',action=
'store',
388 parser.add_argument(
'--siteconfpath',dest=
'siteconfpath',action=
'store',
389 help=
'specific path to site-local-config.xml file, optional. If path undefined, fallback to cern proxy&server')
393 parser.add_argument(
'--without-correction',dest=
'withoutNorm',action=
'store_true',
394 help=
'without any correction/calibration' )
395 parser.add_argument(
'--debug',dest=
'debug',action=
'store_true',
397 options=parser.parse_args()
399 os.environ[
'CORAL_AUTH_PATH'] = options.authpath
407 session=svc.openSession(isReadOnly=
True,cpp2sqltype=[(
'unsigned int',
'NUMBER(10)'),(
'unsigned long long',
'NUMBER(20)')])
410 maxfillnum=options.maxfill
411 minfillnum=options.minfill
412 if options.fillnum
is not None:
413 fillstoprocess.append(
int(options.fillnum))
415 session.transaction().
start(
True)
416 schema=session.nominalSchema()
420 for pf
in processedfills:
421 if pf>lastcompletedFill:
422 print(
'\tremove unfinished fill from processed list ',pf)
423 processedfills.remove(pf)
424 for fill
in allfillsFromDB:
425 if fill
not in processedfills :
426 if int(fill)<=lastcompletedFill:
427 if int(fill)>minfillnum
and int(fill)<maxfillnum:
428 fillstoprocess.append(fill)
430 print(
'ongoing fill...',fill)
431 session.transaction().commit()
432 print(
'fills to process : ',fillstoprocess)
433 if len(fillstoprocess)==0:
434 print(
'no fill to process, exit ')
438 print(
'===== Start Processing Fills',fillstoprocess)
444 reqfillmin=
min(fillstoprocess)
445 reqfillmax=
max(fillstoprocess)
446 session.transaction().
start(
True)
447 runlist=
lumiCalcAPI.runList(session.nominalSchema(),options.fillnum,runmin=
None,runmax=
None,fillmin=reqfillmin,fillmax=reqfillmax,startT=
None,stopT=
None,l1keyPattern=
None,hltkeyPattern=
None,amodetag=options.amodetag,nominalEnergy=
None,energyFlut=
None,requiretrg=
False,requirehlt=
False)
449 datatagname=options.datatag
463 if not options.withoutNorm:
464 normname=options.normtag
468 normname=normmap.keys()[0]
469 normid=normmap[normname]
473 raise RuntimeError(
'[ERROR] cannot resolve norm/correction')
476 session.transaction().commit()
477 for fillnum
in fillstoprocess:
478 session.transaction().
start(
True)
479 filldata=
getSpecificLumi(session.nominalSchema(),fillnum,options.inputdir,dataidmap,normvalueDict,xingMinLum=options.xingMinLum,amodetag=options.amodetag,bxAlgo=options.bxAlgo)
481 session.transaction().commit()
def lastcompleteFill(infile)
def normIdByName(schema, normname)
def dataIdsByTagName(schema, tagname, runlist=None, withcomment=False, lumitype='HF')
def specificlumiTofile(fillnum, filldata, outdir)
def currentDataTag(schema, lumitype='HF')
S & print(S &os, JobReport::InputFile const &f)
def normIdByType(schema, lumitype='HF', defaultonly=True)
def runsummaryMap(schema, irunlsdict, dataidmap, lumitype='HF')
def calculateSpecificLumi(lumi, lumierr, beam1intensity, beam1intensityerr, beam2intensity, beam2intensityerr)
def getFillFromFile(fillnum, inputdir)
def filltofiles(allfills, runsperfill, runtimes, dirname)
output methods####
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
def transposed(lists, defaultval=None)
def fillrunMap(schema, fillnum=None, runmin=None, runmax=None, startT=None, stopT=None, l1keyPattern=None, hltkeyPattern=None, amodetag=None)
def fillInRange(schema, fillmin=1000, fillmax=9999, amodetag='PROTPHYS', startT=None, stopT=None)
def getFillFromDB(schema, fillnum)
def normValueById(schema, normid)
def dataIdsByTagId(schema, tagid, runlist=None, withcomment=False, lumitype='HF')
def runsummary(schema, irunlsdict)
Lumi data management and calculation API # # Author: Zhen Xie #.
def getSpecificLumi(schema, fillnum, inputdir, dataidmap, normmap, xingMinLum=0.0, amodetag='PROTPHYS', bxAlgo='OCC1')
def deliveredLumiForIds(schema, irunlsdict, dataidmap, runsummaryMap, beamstatusfilter=None, timeFilter=None, normmap=None, withBXInfo=False, bxAlgo=None, xingMinLum=None, withBeamIntensity=False, lumitype='HF', minbiasXsec=None)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run
def runList(schema, datatagid, runmin=None, runmax=None, fillmin=None, fillmax=None, startT=None, stopT=None, l1keyPattern=None, hltkeyPattern=None, amodetag=None, nominalEnergy=None, energyFlut=0.2, requiretrg=True, requirehlt=True, preselectedruns=None, lumitype='HF')