14 import os,os.path,sys,math,array,datetime,time,calendar,re
17 from RecoLuminosity.LumiDB
import argparse,sessionManager,lumiTime,CommonUtil,lumiCalcAPI,lumiParameters,revisionDML,normDML
20 allfillname=
'allfills.txt' 24 output: {run:starttime} 28 if len(fillrundict)>0:
29 runs=fillrundict.values()[0]
32 for perrundata
in runresult:
33 runtimesInFill[perrundata[0]]=perrundata[7]
38 list all fills contained in the given dir 42 fillnamepat=
r'^[0-9]{4}$' 43 p=re.compile(fillnamepat)
45 dirList=os.listdir(indir)
47 if p.match(fname)
and os.path.isdir(os.path.join(indir,fname)):
48 allfs=os.listdir(os.path.join(indir,fname))
50 sumfilenamepat=
r'^[0-9]{4}_bxsum_CMS.txt$' 51 s=re.compile(sumfilenamepat)
54 processedfills.append(
int(fname))
59 parse infile to find LASTCOMPLETEFILL 60 input: input file name 61 output: last completed fill number 64 hlinepat=
r'(LASTCOMPLETEFILL )([0-9]{4})' 65 h=re.compile(hlinepat)
66 dqmfile=open(infile,
'r') 70 lastfill=result.group(2)
76 calculate specific lumi 77 input: instlumi, instlumierror,beam1intensity,beam1intensityerror,beam2intensity,beam2intensityerror 78 output (specific lumi value,specific lumi error) 82 if beam1intensity<0: beam1intensity=0
83 if beam2intensity<0: beam2intensity=0
84 if beam1intensity>0.0
and beam2intensity>0.0:
86 specificlumierr=specificlumi*math.sqrt(lumierr**2/lumi**2+beam1intensityerr**2/beam1intensity**2+beam2intensityerr**2/beam2intensity**2)
87 return (specificlumi,specificlumierr)
91 parse fill_xxx.txt files in the input directory for runs, starttime in the fill 92 input: fillnumber, input dir 93 output: {run:tarttime} 97 for filename
in os.listdir(inputdir):
98 mpat=
r'^fill_[0-9]{4}.txt$' 100 if m.match(filename)
is None:
102 filename=filename.strip()
103 if filename.find(
'.')==-1:
continue 104 basename,extension=filename.split(
'.')
105 if not extension
or extension!=
'txt':
107 if basename.find(
'_')==-1:
continue 108 prefix,number=basename.split(
'_')
109 if not number :
continue 110 if fillnum!=
int(number):
continue 111 f=open(os.path.join(inputdir,
'fill_'+number+
'.txt'),
'r') 115 if len(fields)<2 :
continue 116 runtimesInFill[
int(fields[0])]=fields[1]
118 return runtimesInFill
123 write runnumber:starttime map per fill to files 125 f=open(os.path.join(dirname,allfillname),
'w')
126 for fill
in allfills:
127 print >>f,
'%d'%(fill)
129 for fill,runs
in runsperfill.items():
130 filename=
'fill_'+
str(fill)+
'.txt' 132 f=open(os.path.join(dirname,filename),
'w')
134 print >>f,
'%d,%s'%(run,runtimes[run])
145 print 'empty input data, do nothing for fill ',fillnum
148 filloutdir=os.path.join(outdir,
str(fillnum))
149 if not os.path.exists(filloutdir):
151 for cmsbxidx,perbxdata
in filldata.items():
154 lhcbucket=(cmsbxidx-1)*10+1
155 a=sorted(perbxdata,key=
lambda x:x[0])
156 filename=
str(fillnum)+
'_lumi_'+
str(lhcbucket)+
'_CMS.txt' 160 beamstatusfrac=perlsdata[1]
162 lumierror=perlsdata[3]
165 speclumi=perlsdata[4]
166 speclumierror= perlsdata[5]
168 linedata.append([ts,beamstatusfrac,lumi,lumierror,speclumi,speclumierror])
169 if ts
not in timedict:
171 timedict[ts].
append([beamstatusfrac,lumi,lumierror,speclumi,speclumierror])
173 f=open(os.path.join(filloutdir,filename),
'w')
174 for line
in linedata:
175 print >>f,
'%d\t%e\t%e\t%e\t%e\t%e'%(line[0],line[1],line[2],line[3],line[4],line[5])
178 summaryfilename=
str(fillnum)+
'_lumi_CMS.txt' 180 lstimes=sorted(timedict.keys())
183 for lstime
in lstimes:
184 allvalues=timedict[lstime]
186 bstatfrac=transposedvalues[0][0]
187 lumivals=transposedvalues[1]
188 lumitot=sum(lumivals)
190 fillseg.append([lstime,lumitot])
191 lumierrs=transposedvalues[2]
192 lumierrortot=math.sqrt(sum(
map(
lambda x:x**2,lumierrs)))
193 specificvals=transposedvalues[3]
194 specificavg=sum(specificvals)/
float(len(specificvals))
195 specificerrs=transposedvalues[4]
196 specifictoterr=math.sqrt(sum(
map(
lambda x:x**2,specificerrs)))
197 specificerravg=specifictoterr/
float(len(specificvals))
199 f=open(os.path.join(filloutdir,summaryfilename),
'w')
201 print >>f,
'%d\t%e\t%e\t%e\t%e\t%e'%(lstime,bstatfrac,lumitot,lumierrortot,specificavg,specificerravg)
205 fillsummaryfilename=
str(fillnum)+
'_bxsum_CMS.txt' 206 f=open(os.path.join(filloutdir,fillsummaryfilename),
'w')
208 print >>f,
'%s'%(
'#no stable beams')
211 previoustime=fillseg[0][0]
212 boundarytime=fillseg[0][0]
215 summaryls[boundarytime]=[]
216 for [lstime,lumitot]
in fillseg:
217 if lstime-previoustime>50.0:
220 summaryls[boundarytime]=[]
222 summaryls[boundarytime].
append([lstime,lumitot])
226 summarylstimes=summaryls.keys()
227 summarylstimes.sort()
229 for bts
in summarylstimes:
231 tsdatainseg=summaryls[bts]
233 stopts=tsdatainseg[-1][0]
236 print >>f,
'%d\t%d\t%e\t%e'%(startts,stopts,plu,lui)
239 def getSpecificLumi(schema,fillnum,inputdir,dataidmap,normmap,xingMinLum=0.0,amodetag='PROTPHYS',bxAlgo='OCC1'):
241 specific lumi in 1e-30 (ub-1s-1) unit 242 lumidetail occlumi in 1e-27 243 1309_lumi_401_CMS.txt 244 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) 245 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 246 result [(time,beamstatusfrac,lumi,lumierror,speclumi,speclumierror)] 251 runlist=runtimesInFill.keys()
252 if not runlist:
return fillbypos
253 irunlsdict=
dict(
list(
zip(runlist,[
None]*len(runlist))))
256 lumidetails=
lumiCalcAPI.deliveredLumiForIds(schema,irunlsdict,dataidmap,GrunsummaryData,beamstatusfilter=
None,normmap=normmap,withBXInfo=
True,bxAlgo=bxAlgo,xingMinLum=xingMinLum,withBeamIntensity=
True,lumitype=
'HF')
261 orderedrunlist=sorted(lumidetails)
262 for run
in orderedrunlist:
263 perrundata=lumidetails[run]
264 for perlsdata
in perrundata:
265 beamstatus=perlsdata[3]
266 if beamstatus==
'STABLE BEAMS':
269 if totalstablebeamls<10:
270 print 'fill ',fillnum,
' , having less than 10 stable beam lS, is not good, skip' 273 for run
in orderedrunlist:
274 perrundata=lumidetails[run]
275 for perlsdata
in perrundata:
277 tsdatetime=perlsdata[2]
278 ts=calendar.timegm(tsdatetime.utctimetuple())
279 beamstatus=perlsdata[3]
280 if beamstatus==
'STABLE BEAMS':
282 (bxidxlist,bxvaluelist,bxerrolist)=perlsdata[7]
284 instbxvaluelist=[x
for x
in bxvaluelist
if x]
286 if len(instbxvaluelist)!=0:
287 maxlumi=
max(instbxvaluelist)
289 if len(instbxvaluelist)!=0:
290 avginstlumi=sum(instbxvaluelist)
291 (intbxidxlist,b1intensities,b2intensities)=perlsdata[8]
292 for bxidx
in bxidxlist:
293 idx=bxidxlist.index(bxidx)
294 instbxvalue=bxvaluelist[idx]
295 bxerror=bxerrolist[idx]
296 if instbxvalue<
max(xingMinLum,maxlumi*0.2):
300 bintensityPos=intbxidxlist.index(bxidx)
304 fillbypos.setdefault(bxidx,[]).
append([ts,beamstatusfrac,instbxvalue,bxerror,0.0,0.0])
306 b1intensity=b1intensities[bintensityPos]
307 b2intensity=b2intensities[bintensityPos]
309 fillbypos.setdefault(bxidx,[]).
append([ts,beamstatusfrac,instbxvalue,bxerror,speclumi[0],speclumi[1]])
321 if __name__ ==
'__main__':
322 parser = argparse.ArgumentParser(prog=os.path.basename(sys.argv[0]),description =
"specific lumi",formatter_class=argparse.ArgumentDefaultsHelpFormatter)
323 amodetagChoices = [
"PROTPHYS",
"IONPHYS",
'PAPHYS' ]
324 xingAlgoChoices =[
"OCC1",
"OCC2",
"ET"]
326 parser.add_argument(
'-c',dest=
'connect',
329 help=
'connect string to lumiDB,optional',
330 default=
'frontier://LumiCalc/CMS_LUMI_PROD')
331 parser.add_argument(
'-P',dest=
'authpath',
333 help=
'path to authentication file,optional')
334 parser.add_argument(
'-i',dest=
'inputdir',
339 parser.add_argument(
'-o',dest=
'outputdir',
344 parser.add_argument(
'-f',
'--fill',dest=
'fillnum',
347 help=
'specific fill',
349 parser.add_argument(
'--minfill',dest=
'minfill',
355 parser.add_argument(
'--maxfill',dest=
'maxfill',
360 help=
'maximum fillnumber ' 362 parser.add_argument(
'--amodetag',dest=
'amodetag',
364 choices=amodetagChoices,
366 help=
'specific accelerator mode choices [PROTOPHYS,IONPHYS,PAPHYS] (optional)')
367 parser.add_argument(
'--xingMinLum', dest =
'xingMinLum',
371 help=
'Minimum luminosity considered for lumibylsXing action')
372 parser.add_argument(
'--xingAlgo', dest =
'bxAlgo',
375 help=
'algorithm name for per-bunch lumi ')
376 parser.add_argument(
'--normtag',dest=
'normtag',action=
'store',
380 parser.add_argument(
'--datatag',dest=
'datatag',action=
'store',
387 parser.add_argument(
'--siteconfpath',dest=
'siteconfpath',action=
'store',
388 help=
'specific path to site-local-config.xml file, optional. If path undefined, fallback to cern proxy&server')
392 parser.add_argument(
'--without-correction',dest=
'withoutNorm',action=
'store_true',
393 help=
'without any correction/calibration' )
394 parser.add_argument(
'--debug',dest=
'debug',action=
'store_true',
396 options=parser.parse_args()
398 os.environ[
'CORAL_AUTH_PATH'] = options.authpath
406 session=svc.openSession(isReadOnly=
True,cpp2sqltype=[(
'unsigned int',
'NUMBER(10)'),(
'unsigned long long',
'NUMBER(20)')])
409 maxfillnum=options.maxfill
410 minfillnum=options.minfill
411 if options.fillnum
is not None:
412 fillstoprocess.append(
int(options.fillnum))
414 session.transaction().
start(
True)
415 schema=session.nominalSchema()
419 for pf
in processedfills:
420 if pf>lastcompletedFill:
421 print '\tremove unfinished fill from processed list ',pf
422 processedfills.remove(pf)
423 for fill
in allfillsFromDB:
424 if fill
not in processedfills :
425 if int(fill)<=lastcompletedFill:
426 if int(fill)>minfillnum
and int(fill)<maxfillnum:
427 fillstoprocess.append(fill)
429 print 'ongoing fill...',fill
430 session.transaction().commit()
431 print 'fills to process : ',fillstoprocess
432 if len(fillstoprocess)==0:
433 print 'no fill to process, exit ' 437 print '===== Start Processing Fills',fillstoprocess
443 reqfillmin=
min(fillstoprocess)
444 reqfillmax=
max(fillstoprocess)
445 session.transaction().
start(
True)
446 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)
448 datatagname=options.datatag
462 if not options.withoutNorm:
463 normname=options.normtag
467 normname=normmap.keys()[0]
468 normid=normmap[normname]
472 raise RuntimeError(
'[ERROR] cannot resolve norm/correction')
475 session.transaction().commit()
476 for fillnum
in fillstoprocess:
477 session.transaction().
start(
True)
478 filldata=
getSpecificLumi(session.nominalSchema(),fillnum,options.inputdir,dataidmap,normvalueDict,xingMinLum=options.xingMinLum,amodetag=options.amodetag,bxAlgo=options.bxAlgo)
480 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')
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')