CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
lumiCalcAPI.py
Go to the documentation of this file.
1 import os,coral,datetime,fnmatch,time
2 from RecoLuminosity.LumiDB import nameDealer,revisionDML,dataDML,lumiTime,CommonUtil,selectionParser,hltTrgSeedMapper,normFunctors,lumiParameters
3 
4 ########################################################################
5 # Lumi data management and calculation API #
6 # #
7 # Author: Zhen Xie #
8 ########################################################################
9 
10 def runsummary(schema,irunlsdict):
11  '''
12  output [[run(0),l1key(1),amodetag(2),egev(3),hltkey(4),fillnum(5),fillscheme(6),starttime(7),stoptime(8)]]
13  '''
14  result=[]
15  for run in sorted(irunlsdict):
16  runinfo=dataDML.runsummary(schema,run)
17  runinfo.insert(0,run)
18  result.append(runinfo)
19  return result
20 
21 def runsummaryMap(schema,irunlsdict,dataidmap,lumitype='HF'):
22  '''
23  output: {run:[l1key(0),amodetag(1),egev(2),hltkey(3),fillnum(4),fillscheme(5),starttime(6),stoptime(7)]}
24  '''
25  result={}
26  seqresult=runsummary(schema,irunlsdict)
27  idresult=dataDML.lumiRunByIds(schema,dataidmap,lumitype)
28  for [run,l1key,amodetag,hltkey,fillnum,fillscheme] in seqresult:
29  egev=idresult[run][2]
30  startT=idresult[run][3]
31  stopT=idresult[run][4]
32  result[run]=[l1key,amodetag,egev,hltkey,fillnum,fillscheme,startT,stopT]
33  return result
34 
35 def fillInRange(schema,fillmin=1000,fillmax=9999,amodetag='PROTPHYS',startT=None,stopT=None):
36  '''
37  output [fill]
38  '''
39  fills=dataDML.fillInRange(schema,fillmin,fillmax,amodetag,startT,stopT)
40  return fills
41 def fillrunMap(schema,fillnum=None,runmin=None,runmax=None,startT=None,stopT=None,l1keyPattern=None,hltkeyPattern=None,amodetag=None):
42  '''
43  output: {fill:[runnum,...]}
44  '''
45  return dataDML.fillrunMap(schema,fillnum=fillnum,runmin=runmin,runmax=runmax,startT=startT,stopT=stopT,l1keyPattern=l1keyPattern,hltkeyPattern=hltkeyPattern,amodetag=amodetag)
46 
47 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'):
48  '''
49  output: [runnumber,...]
50  '''
51  return dataDML.runList(schema,datatagid,runmin=runmin,runmax=runmax,fillmin=fillmin,fillmax=fillmax,startT=startT,stopT=stopT,l1keyPattern=l1keyPattern,hltkeyPattern=hltkeyPattern,amodetag=amodetag,nominalEnergy=nominalEnergy,energyFlut=energyFlut,requiretrg=requiretrg,requirehlt=requirehlt,lumitype=lumitype)
52 
53 def hltpathsForRange(schema,runlist,hltpathname=None,hltpathpattern=None):
54  '''
55  input: runlist [run], (required)
56  datatag: data version (optional)
57  output : {runnumber,[(hltpath,l1seedexpr,l1bitname)...]}
58  '''
59  result={}
60  for run in runlist:
61  hlttrgmap=dataDML.hlttrgMappingByrun(schema,run,hltpathname=hltpathname,hltpathpattern=hltpathpattern)
62  result[run]=[]
63  for hltpath in sorted(hlttrgmap):
64  l1seedexpr=hlttrgmap[hltpath]
65  (exptype,l1bits)=hltTrgSeedMapper.findUniqueSeed(hltpath,l1seedexpr)
66  l1bitname='n/a'
67  if l1bits:
68  if exptype:
69  l1bitname=l1seedexpr
70  else:
71  l1bitname=l1bits[0]
72  result[run].append((hltpath,l1seedexpr,l1bitname))
73  return result
74 
75 def beamForRange(schema,inputRange,withBeamIntensity=False,minIntensity=0.1,tableName=None,branchName=None):
76  '''
77  input:
78  inputRange: {run:[cmsls]} (required)
79  output : {runnumber:[(lumicmslnum,cmslsnum,beamenergy,beamstatus,[(ibx,b1,b2)])...](4)}
80  '''
81  if tableName is None:
83  if branchName is None:
84  branchName='DATA'
85  result={}
86  for run in inputRange.keys():
87  lslist=inputRange[run]
88  if lslist is not None and len(lslist)==0:
89  result[run]=[]#if no LS is selected for a run
90  continue
91  lumidataid=dataDML.guessLumiDataIdByRun(schema,run,tableName)
92  if lumidataid is None:
93  result[run]=None
94  continue #run non exist
95  lumidata=dataDML.beamInfoById(schema,lumidataid,withBeamIntensity=withBeamIntensity,minIntensity=minIntensity)
96  #(runnum,[(lumilsnum(0),cmslsnum(1),beamstatus(2),beamenergy(3),beaminfolist(4)),..])
97  result[run]=[]
98  perrundata=lumidata[1]
99  if not perrundata:
100  result[run]=[]
101  continue
102  for perlsdata in perrundata:
103  lumilsnum=perlsdata[0]
104  cmslsnum=perlsdata[1]
105  if lslist is not None and cmslsnum not in lslist:
106  continue
107  beamstatus=perlsdata[2]
108  beamenergy=perlsdata[3]
109  beamintInfolist=[]
110  if withBeamIntensity:
111  beamintInfolist=perlsdata[4]
112  result[run].append((lumilsnum,cmslsnum,beamstatus,beamenergy,beamintInfolist))
113  return result
114 
115 def beamForIds(schema,irunlsdict,dataidmap,withBeamIntensity=False,minIntensity=0.1):
116  '''
117  input:
118  inputRange: {run:[cmsls]} (required)
119  dataidmap: {run:(lumiid,trgid,hltid)}
120  output : {runnumber:[(lumicmslnum(0),cmslsnum(1),beamenergy(2),beamstatus(3),ncollidingbx(4),[(ibx,b1,b2)])...](5)}
121  '''
122  result={}
123  for run in irunlsdict.keys():
124  result[run]=[]
125  lslist=irunlsdict[run]
126  if lslist is not None and len(lslist)==0:
127  continue
128  if not dataidmap.has_key(run):
129  continue #run non exist
130  lumidataid=dataidmap[run][0]
131  if lumidataid is None:
132  result[run]=None
133  continue
134  lumidata=dataDML.beamInfoById(schema,lumidataid,withBeamIntensity=withBeamIntensity,minIntensity=minIntensity)
135  #(runnum,[(lumilsnum(0),cmslsnum(1),beamstatus(2),beamenergy(3),ncollidingbunches(4),beaminfolist(5),..])
136  if lumidata and lumidata[1]:
137  perrundata=lumidata[1]
138  for perlsdata in perrundata:
139  lumilsnum=perlsdata[0]
140  cmslsnum=perlsdata[1]
141  if lslist is not None and cmslsnum not in lslist:
142  continue
143  beamstatus=perlsdata[2]
144  beamenergy=perlsdata[3]
145  ncollidingbunches=perlsdata[4]
146  beamintInfolist=[]
147  if withBeamIntensity:
148  beamintInfolist=perlsdata[5]
149  result[run].append((lumilsnum,cmslsnum,beamstatus,beamenergy,ncollidingbunches,beamintInfolist))
150  return result
151 
152 def hltForIds(schema,irunlsdict,dataidmap,hltpathname=None,hltpathpattern=None,withL1Pass=False,withHLTAccept=False):
153  '''
154  input:
155  irunlsdict: {run:[cmsls]} (required)
156  dataidmap: {run:(lumiid,trgid,hltid)}
157  hltpathname: exact match hltpathname (optional)
158  hltpathpattern: regex match hltpathpattern (optional)
159  withL1Pass: with L1 pass count
160  withHLTAccept: with HLT accept
161  output: {runnumber:[(cmslsnum,[(hltpath,hltprescale,l1pass,hltaccept),...]),(cmslsnum,[])})}
162  '''
163  result={}
164  for run in irunlsdict.keys():
165  lslist=irunlsdict[run]
166  if lslist is not None and len(lslist)==0:
167  result[run]=[]#if no LS is selected for a run
168  continue
169  if not dataidmap.has_key(run):
170  continue
171  hltdataid=dataidmap[run][2]
172  if hltdataid is None:
173  result[run]=None
174  continue #run non exist
175  hltdata=dataDML.hltLSById(schema,hltdataid,hltpathname=hltpathname,hltpathpattern=hltpathpattern,withL1Pass=withL1Pass,withHLTAccept=withHLTAccept)
176  #(runnum,{cmslsnum:[(pathname,prescale,l1pass,hltaccept),...]})
177  result[run]=[]
178  if hltdata and hltdata[1]:
179  lsdict={}
180  for cmslsnum in sorted(hltdata[1]):
181  if lslist is not None and cmslsnum not in lslist:
182  continue
183  lsdata=[]
184  for perpathdata in hltdata[1][cmslsnum]:
185  pathname=perpathdata[0]
186  prescale=perpathdata[1]
187  l1pass=None
188  hltaccept=None
189  if withL1Pass:
190  l1pass=perpathdata[2]
191  if withHLTAccept:
192  hltaccept=perpathdata[3]
193  lsdata.append((pathname,prescale,l1pass,hltaccept))
194  result[run].append((cmslsnum,lsdata))
195  return result
196 
197 def trgForIds(schema,irunlsdict,dataidmap,trgbitname=None,trgbitnamepattern=None,withL1Count=False,withPrescale=False):
198  '''
199  input :
200  irunlsdict {run:[cmsls]} (required)
201  dataidmap: {run:(lumiid,trgid,hltid)}
202  trgbitname exact match trgbitname (optional)
203  trgbitnamepattern match trgbitname (optional)
204  output
205  result {run:[[cmslsnum(0),deadfrac(1),deadtimecount(2),bitzero_count(3),bitzero_prescale(4),[(bitname,prescale,counts,mask)](5)]]}
206  '''
207  result={}
208  for run in irunlsdict.keys():
209  result[run]=[]
210  lslist=irunlsdict[run]
211  if lslist is not None and len(lslist)==0:
212  #if no LS is selected for a run
213  continue
214  if not dataidmap.has_key(run):
215  continue
216  trgdataid=dataidmap[run][1]
217  if trgdataid is None:
218  result[run]=None
219  continue #if run non exist
220  if trgdataid==0:
221  continue
222  trgdata=dataDML.trgLSById(schema,trgdataid,trgbitname=trgbitname,trgbitnamepattern=trgbitnamepattern,withL1Count=withL1Count,withPrescale=withPrescale)
223 
224  #(runnum,{cmslsnum:[deadtimecount(0),bitzerocount(1),bitzeroprescale(2),deadfrac(3),[(bitname,trgcount,prescale)](4)]})
225  if trgdata and trgdata[1]:
226  lsdict={}
227  for cmslsnum in sorted(trgdata[1]):
228  if lslist is not None and cmslsnum not in lslist:
229  continue
230  lsdata=[]
231  #print trgdata[1][cmslsnum]
232  deadtimecount=trgdata[1][cmslsnum][0]
233  #bitzerocount=trgdata[1][cmslsnum][1]
234  #bitzeroprescale=trgdata[1][cmslsnum][2]
235  bitzerocount=0
236  bitzeroprescale=0
237  deadfrac=trgdata[1][cmslsnum][3]
238  if deadfrac<0 or deadfrac>1.0:
239  deadfrac=1.0
240  allbitsinfo=trgdata[1][cmslsnum][4]
241  lsdata.append(cmslsnum)
242  lsdata.append(deadfrac)
243  lsdata.append(deadtimecount)
244  lsdata.append(bitzerocount)
245  lsdata.append(bitzeroprescale)
246  lsdata.append(allbitsinfo)
247  result[run].append(lsdata)
248  return result
249 
250 def instLumiForIds(schema,irunlsdict,dataidmap,runsummaryMap,beamstatusfilter=None,timeFilter=None,withBXInfo=False,bxAlgo=None,xingMinLum=None,withBeamIntensity=False,lumitype='HF'):
251  '''
252  FROM ROOT FILE NO CORRECTION AT ALL
253  input:
254  irunlsdict: {run:[cmsls]}
255  dataidmap: {run:(lumiid,trgid,hltid)}
256  runsummaryMap: {run:[l1key(0),amodetag(1),egev(2),hltkey(3),fillnum(4),fillscheme(5),starttime(6),stoptime(7)]}
257  beamstatus: LS filter on beamstatus (optional)
258  timeFilter: (minLSBegTime,maxLSBegTime)
259  withBXInfo: get per bunch info (optional)
260  bxAlgo: algoname for bx values (optional) ['OCC1','OCC2','ET']
261  xingMinLum: None means apply no cut
262  withBeamIntensity: get beam intensity info (optional)
263  lumitype: luminosity measurement source
264  output:
265  result {run:[lumilsnum(0),cmslsnum(1),timestamp(2),beamstatus(3),beamenergy(4),instlumi(5),instlumierr(6),startorbit(7),numorbit(8),(bxidx,bxvalues,bxerrs)(9),(bxidx,b1intensities,b2intensities)(10),fillnum(11)]}}
266 
267  special meanings:
268  {run:None} None means selected run not in lumiDB,
269  {run:[]} [] means no lumi data for this run in lumiDB
270  {run:cmslsnum(1)==0} means either not cmslsnum or iscms but not selected
271  instlumi unit in Hz/ub
272  '''
273  if lumitype not in ['HF','PIXEL']:
274  raise ValueError('unknown lumitype '+lumitype)
275  lumitableName=''
276  lumilstableName=''
277  if lumitype=='HF':
278  lumitableName=nameDealer.lumidataTableName()
279  lumilstableName=nameDealer.lumisummaryv2TableName()
280  else:
281  lumitableName=nameDealer.pixellumidataTableName()
283  result={}
284  for run in irunlsdict.keys():
285  #for run,(lumidataid,trgid,hltid ) in dataidmap.items():
286  lslist=irunlsdict[run]
287  if lslist is not None and len(lslist)==0:
288  result[run]=[]#no lumi data for this run in lumiDB
289  continue
290  fillnum=runsummaryMap[run][4]
291  runstarttimeStr=runsummaryMap[run][6]
292  if not dataidmap.has_key(run):
293  result[run]=[]#no lumi data for this run in lumiDB
294  continue
295  (lumidataid,trgid,hltid )=dataidmap[run]
296  if lumidataid is None: #selected run not in lumiDB
297  result[run]=None
298  continue
299  (lumirunnum,perlsresult)=dataDML.lumiLSById(schema,lumidataid,beamstatus=beamstatusfilter,withBXInfo=withBXInfo,bxAlgo=bxAlgo,withBeamIntensity=withBeamIntensity,tableName=lumilstableName)
300  lsresult=[]
302  for lumilsnum in perlsresult.keys():
303  perlsdata=perlsresult[lumilsnum]
304  cmslsnum=perlsdata[0]
305  if lslist is not None and cmslsnum not in lslist: #ls exists but not selected
306  cmslsnum=0
307  numorbit=perlsdata[6]
308  startorbit=perlsdata[7]
309  orbittime=c.OrbitToTime(runstarttimeStr,startorbit,begorbit=0,customfm='%m/%d/%y %H:%M:%S')
310  if timeFilter:
311  if timeFilter[0]:
312  if orbittime<timeFilter[0]: continue
313  if timeFilter[1]:
314  if orbittime>timeFilter[1]: continue
315  if lumitype=='HF':
316  instlumi=perlsdata[1]*1000.0 #HF db avg values are in Hz/mb,change it to Hz/ub
317  instlumierr=perlsdata[2]*1000.0
318  else:
319  instlumi=perlsdata[1] #PIXEL avg values are in Hz/ub, need no conversion
320  instlumierr=perlsdata[2]
321  beamstatus=perlsdata[4]
322  beamenergy=perlsdata[5]
323  bxidxlist=[]
324  bxvaluelist=[]
325  bxerrorlist=[]
326  bxdata=None
327  beamdata=None
328  if withBXInfo:
329  bxinfo=perlsdata[8]
330  bxvalueArray=None
331  bxerrArray=None
332  if bxinfo:
333  bxvalueArray=bxinfo[0]
334  bxerrArray=bxinfo[1]
335  if xingMinLum :
336  for idx,bxval in enumerate(bxvalueArray):
337  if bxval>xingMinLum:
338  bxidxlist.append(idx)
339  bxvaluelist.append(bxval)
340  bxerrorlist.append(bxerrArray[idx])
341  else:
342  bxidxlist=range(0,len(bxvalueArray))
343  bxvaluelist=bxvalueArray.tolist()
344  bxerrorlist=bxerrArray.tolist()
345  del bxvalueArray[:]
346  del bxerrArray[:]
347  bxdata=(bxidxlist,bxvaluelist,bxerrorlist)
348  if withBeamIntensity:
349  beaminfo=perlsdata[9]
350  bxindexlist=[]
351  b1intensitylist=[]
352  b2intensitylist=[]
353  if beaminfo[0] and beaminfo[1] and beaminfo[2]:
354  bxindexarray=beaminfo[0]
355  beam1intensityarray=beaminfo[1]
356  beam2intensityarray=beaminfo[2]
357  bxindexlist=bxindexarray.tolist()
358  b1intensitylist=beam1intensityarray.tolist()
359  b2intensitylist=beam2intensityarray.tolist()
360  del bxindexarray[:]
361  del beam1intensityarray[:]
362  del beam2intensityarray[:]
363  beamdata=(bxindexlist,b1intensitylist,b2intensitylist)
364  lsresult.append([lumilsnum,cmslsnum,orbittime,beamstatus,beamenergy,instlumi,instlumierr,startorbit,numorbit,bxdata,beamdata,fillnum])
365  del perlsdata[:]
366  result[run]=lsresult
367  return result
368 
369 def deliveredLumiForIds(schema,irunlsdict,dataidmap,runsummaryMap,beamstatusfilter=None,timeFilter=None,normmap=None,withBXInfo=False,bxAlgo=None,xingMinLum=None,withBeamIntensity=False,lumitype='HF',minbiasXsec=None):
370  '''
371  delivered lumi (including calibration,time integral)
372  input:
373  irunlsdict: {run:[lsnum]}, where [lsnum]==None means all ; [lsnum]==[] means selected ls
374  dataidmap : {run:(lumiid,trgid,hltid)}
375  runsummaryMap: {run:[l1key(0),amodetag(1),egev(2),hltkey(3),fillnum(4),fillscheme(5),starttime(6),stoptime(7)]}
376  beamstatus: LS filter on beamstatus
377  normmap: {since:[corrector(0),{paramname:paramvalue}(1),amodetag(2),egev(3),comment(4)]} if normmap empty, means without-correction , if notnormmap means without-correction
378  withBXInfo: get per bunch info (optional)
379  bxAlgo: algoname for bx values (optional) ['OCC1','OCC2','ET']
380  xingMinLum: cut on bx lumi value (optional)
381  withBeamIntensity: get beam intensity info (optional)
382  lumitype: luminosity source
383  output:
384  result {run:[lumilsnum(0),cmslsnum(1),timestamp(2),beamstatus(3),beamenergy(4),deliveredlumi(5),calibratedlumierr(6),(bxidxlist,bxvalues,bxerrs)(7),(bxidx,b1intensities,b2intensities)(8),fillnum(9),pu(10)]}
385 
386  special meanings:
387  {run:None} None means no run in lumiDB,
388  {run:[]} [] means no lumi for this run in lumiDB
389  {run:cmslsnum(1)==0} means either not cmslsnum or iscms but not selected
390  lumi unit: /ub
391  '''
392  result = {}
394  lumirundata=dataDML.lumiRunByIds(schema,dataidmap,lumitype=lumitype)
395  instresult=instLumiForIds(schema,irunlsdict,dataidmap,runsummaryMap,beamstatusfilter=beamstatusfilter,timeFilter=timeFilter,withBXInfo=withBXInfo,bxAlgo=bxAlgo,withBeamIntensity=withBeamIntensity,lumitype=lumitype)
396 
397  intglumimap={}
398  if lumitype=='HF':
399  intglumimap=dataDML.intglumiForRange(schema,irunlsdict.keys())#some runs need drift correction
400  allsince=[]
401  if normmap:
402  allsince=normmap.keys()
403  allsince.sort()
404  correctorname='fPoly' #HF default
405  correctionparams={'a0':1.0}
406  runfillschemeMap={}
407  fillschemePatternMap={}
408  if lumitype=='PIXEL':
409  correctorname='fPolyScheme' #PIXEL default
410  fillschemePatternMap=dataDML.fillschemePatternMap(schema,'PIXEL')
411  for run,perrundata in instresult.items():
412  if perrundata is None:
413  result[run]=None
414  continue
415  intglumi=0.
416  if normmap and intglumimap and intglumimap.has_key(run) and intglumimap[run]:
417  intglumi=intglumimap[run]
418  nBXs=0
419  if normmap and lumirundata and lumirundata.has_key(run) and lumirundata[run][2]:
420  nBXs=lumirundata[run][2]
421  fillschemeStr=''
422  if normmap and runsummaryMap and runsummaryMap.has_key(run) and runsummaryMap[run][5]:
423  fillschemeStr=runsummaryMap[run][5]
424  if allsince:
425  lastsince=allsince[0]
426  for since in allsince:
427  if run>=since:
428  lastsince=since
429  correctorname=normmap[lastsince][0]
430  correctionparams=normmap[lastsince][1]
431 
432  correctioninput=[0.,intglumi,nBXs,fillschemeStr,fillschemePatternMap]
433  result[run]=[]
434  for perlsdata in perrundata:#loop over ls
435  lumilsnum=perlsdata[0]
436  cmslsnum=perlsdata[1]
437  timestamp=perlsdata[2]
438  bs=perlsdata[3]
439  beamenergy=perlsdata[4]
440  instluminonorm=perlsdata[5]
441  correctioninput[0]=instluminonorm
442  totcorrectionFac=normFunctors.normFunctionCaller(correctorname,*correctioninput,**correctionparams)
443  fillnum=perlsdata[11]
444  instcorrectedlumi=totcorrectionFac*instluminonorm
445  numorbit=perlsdata[8]
446  numbx=lumip.NBX
447  lslen=lumip.lslengthsec()
448  deliveredlumi=instcorrectedlumi*lslen
449  calibratedbxdata=None
450  beamdata=None
451  pu=0.#avgPU
452  if nBXs and minbiasXsec:
453  pu=(instcorrectedlumi/nBXs)*minbiasXsec/lumip.rotationRate
454  if withBXInfo:
455  (bxidxData,bxvaluesData,bxerrsData)=perlsdata[9]
456  if lumitype=='HF':
457  if xingMinLum:
458  bxidxList=[]
459  bxvalueList=[]
460  bxerrList=[]
461  for idx,bxval in enumerate(bxvaluesData):
462  correctedbxintlumi=totcorrectionFac*bxval
463  correctedbxintlumierr=totcorrectionFac*bxerrsData[idx]
464  if correctedbxintlumi>xingMinLum:
465  bxidxList.append(bxidxData[idx])
466  bxvalueList.append(correctedbxintlumi)
467  bxerrList.append(correctedbxintlumierr)
468  calibratedbxdata=(bxidxList,bxvalueList,bxerrList)
469  else:
470  calibratedbxvalue=[totcorrectionFac*x for x in bxvaluesData]
471  calibratedlumierr=[totcorrectionFac*x for x in bxerrsData]
472  calibratedbxdata=(bxidxData,calibratedbxvalue,calibratedlumierr)
473  if withBeamIntensity:
474  beamdata=perlsdata[10]
475  calibratedlumierr=0.0
476  result[run].append([lumilsnum,cmslsnum,timestamp,bs,beamenergy,deliveredlumi,calibratedlumierr,calibratedbxdata,beamdata,fillnum,pu])
477  del perlsdata[:]
478  return result
479 
480 def lumiForIds(schema,irunlsdict,dataidmap,runsummaryMap,beamstatusfilter=None,timeFilter=None,normmap=None,withBXInfo=False,bxAlgo=None,xingMinLum=None,withBeamIntensity=False,lumitype='HF',minbiasXsec=None):
481  '''
482  delivered/recorded lumi (including calibration,time integral)
483  input:
484  irunlsdict: {run:[lsnum]}, where [lsnum]==None means all ; [lsnum]==[] means no selected ls
485  dataidmap : {run:(lumiid,trgid,hltid)}
486  runsummaryMap: {run:[l1key(0),amodetag(1),egev(2),hltkey(3),fillnum(4),fillscheme(5),starttime(6),stoptime(7)]}
487  beamstatus: LS filter on beamstatus
488  normmap:
489  withBXInfo: get per bunch info (optional)
490  bxAlgo: algoname for bx values (optional) ['OCC1','OCC2','ET']
491  xingMinLum: cut on bx lumi value (optional)
492  withBeamIntensity: get beam intensity info (optional)
493  lumitype: luminosity source
494  output:
495  result {run:[[lumilsnum(0),cmslsnum(1),timestamp(2),beamstatus(3),beamenergy(4),deliveredlumi(5),recordedlumi(6),calibratedlumierror(7),(bxidx,bxvalues,bxerrs)(8),(bxidx,b1intensities,b2intensities)(9),fillnum(10),ncollidingbunches(11)]...]}
496  special meanings:
497  {run:None} None means no run in lumiDB,
498  {run:[]} [] means no lumi for this run in lumiDB
499  {run:[....deliveredlumi(5),recordedlumi(6)None]} means no trigger in lumiDB
500  {run:cmslsnum(1)==0} means either not cmslsnum or is cms but not selected, therefore set recordedlumi=0,efflumi=0
501  lumi unit: 1/ub
502  '''
503  deliveredresult=deliveredLumiForIds(schema,irunlsdict,dataidmap,runsummaryMap,beamstatusfilter=beamstatusfilter,timeFilter=timeFilter,normmap=normmap,withBXInfo=withBXInfo,bxAlgo=bxAlgo,xingMinLum=xingMinLum,withBeamIntensity=withBeamIntensity,lumitype=lumitype,minbiasXsec=minbiasXsec)
504  trgresult=trgForIds(schema,irunlsdict,dataidmap)
505  for run in deliveredresult.keys():#loop over delivered,already selected
506  perrundata=deliveredresult[run]
507  if perrundata is None or len(perrundata)==0: #pass through
508  continue
509  alltrgls=[]
510  if trgresult.has_key(run) and trgresult[run]:
511  alltrgls=[x[0] for x in trgresult[run]]
512  for perlsdata in perrundata:#loop over ls
513  if not perlsdata: continue #no lumi data for this ls
514  perlsdata.insert(6,None)
515  if not alltrgls: continue #no trg for this run,recorded=None
516  cmslsnum=perlsdata[1]
517  if cmslsnum==0:#if not a cmsls or not selected by cms list, set recordedlumi to 0
518  recordedlumi=0.0
519  else:
520  try:
521  trglsidx=alltrgls.index(cmslsnum)
522  deadfrac=trgresult[run][trglsidx][1]
523  if deadfrac<0 or deadfrac>1.0: deadfrac=1.0
524  deliveredlumi=perlsdata[5]
525  recordedlumi=(1.0-deadfrac)*deliveredlumi
526  except ValueError:
527  #print '[WARNING] no trigger for LS=',cmslsnum
528  recordedlumi=None
529  perlsdata[6]=recordedlumi
530  return deliveredresult
531 
532 def effectiveLumiForIds(schema,irunlsdict,dataidmap,runsummaryMap=None,beamstatusfilter=None,timeFilter=None,normmap=None,hltpathname=None,hltpathpattern=None,withBXInfo=False,bxAlgo=None,xingMinLum=None,withBeamIntensity=False,lumitype='HF',minbiasXsec=None):
533  '''
534  delivered/recorded/eff lumi in selected hlt path (including calibration,time integral)
535  input:
536  irunlsdict: {run:[lsnum]}, where [lsnum]==None means all ; [lsnum]==[] means selected ls
537  dataidmap : {run:(lumiid,trgid,hltid)}
538  runsummaryMap: {run:[l1key(0),amodetag(1),egev(2),hltkey(3),fillnum(4),fillscheme(5),starttime(6),stoptime(7)]}
539  beamstatusfilter: LS filter on beamstatus
540  normmap: {since:[corrector(0),{paramname:paramvalue}(1),amodetag(2),egev(3),comment(4)]} if normmap empty, means without-correction , if notnormmap means without-correction
541  hltpathname: selected hltpathname
542  hltpathpattern: regex select hltpaths
543  withBXInfo: get per bunch info (optional)
544  bxAlgo: algoname for bx values (optional) ['OCC1','OCC2','ET']
545  xingMinLum: cut on bx lumi value (optional)
546  withBeamIntensity: get beam intensity info (optional)
547  lumitype: luminosity source
548  output:
549  result {run:[lumilsnum(0),cmslsnum(1),timestamp(2),beamstatus(3),beamenergy(4),deliveredlumi(5),recordedlumi(6),calibratedlumierror(7),{hltpath:[l1name,l1prescale,hltprescale,efflumi]}(8),bxdata(9),beamdata(10),fillnum(11),ncollidingbunches(12)]}
550  {run:None} None means no run in lumiDB,
551  {run:[]} [] means no lumi for this run in lumiDB
552  {run:[....deliveredlumi(5),recorded(6)==None,]} means no trigger in lumiDB
553  {run:[....deliveredlumi(5),recorded(6),calibratedlumierror(7)==None]} means no hlt in lumiDB
554 
555  lumi unit: 1/ub
556  '''
557  deliveredresult=deliveredLumiForIds(schema,irunlsdict,dataidmap,runsummaryMap,beamstatusfilter=beamstatusfilter,timeFilter=timeFilter,normmap=normmap,withBXInfo=withBXInfo,bxAlgo=bxAlgo,xingMinLum=xingMinLum,withBeamIntensity=withBeamIntensity,lumitype=lumitype,minbiasXsec=minbiasXsec)
558  trgresult=trgForIds(schema,irunlsdict,dataidmap,withPrescale=True) #{run:[cmslsnum,deadfrac,deadtimecount,bitzero_count,bitzero_prescale,[(bitname,prescale,counts,mask)]]}
559  hltresult=hltForIds(schema,irunlsdict,dataidmap,hltpathname=hltpathname,hltpathpattern=hltpathpattern,withL1Pass=False,withHLTAccept=False) #{runnumber:[(cmslsnum,[(hltpath,hltprescale,l1pass,hltaccept),...]),(cmslsnum,[])})}
560  for run in deliveredresult.keys(): #loop over delivered
561  perrundata=deliveredresult[run]
562  if perrundata is None or len(perrundata)==0:#pass through
563  continue
564  alltrgls=[]
565  if trgresult.has_key(run) and trgresult[run]:
566  alltrgls=[x[0] for x in trgresult[run]]
567  allhltls=[]
568  if hltresult.has_key(run) and hltresult[run]:
569  allhltls=[x[0] for x in hltresult[run]]
570  l1bitinfo=[]
571  hltpathinfo=[]
572  hlttrgmap=dataDML.hlttrgMappingByrun(schema,run,hltpathname=hltpathname,hltpathpattern=hltpathpattern)
573 
574  for perlsdata in perrundata: #loop over ls
575  if not perlsdata: continue #no lumi for this ls
576  perlsdata.insert(6,None)
577  perlsdata.insert(8,None)
578  if not alltrgls: continue #no trg for this run
579  cmslsnum=perlsdata[1]
580  recordedlumi=0.0
581  if cmslsnum==0:#if not a cmsls or not selected by cms list, set recordedlumi,efflumi to 0
582  continue
583  else:
584  try:
585  trglsidx=alltrgls.index(cmslsnum)
586  deadfrac=trgresult[run][trglsidx][1]
587  l1bitinfo=trgresult[run][trglsidx][5]
588  if deadfrac<0 or deadfrac>1.0:deadfrac=1.0
589  deliveredlumi=perlsdata[5]
590  recordedlumi=(1.0-deadfrac)*deliveredlumi
591  except ValueError:
592  #print '[WARNING] no trigger for LS=',cmslsnum
593  continue #do not go further
594  perlsdata[6]=recordedlumi
595  if not allhltls: continue #no hlt for this run
596  try:
597  hltlsidx=allhltls.index(cmslsnum)
598  except ValueError:
599  #print '[WARNING] no hlt for LS=',cmslsnum
600  continue #do not go further
601  trgprescalemap={} #{bitname:l1prescale} for this lumi section
602  if l1bitinfo:
603  for thisbitinfo in l1bitinfo:
604  thisbitname=thisbitinfo[0]
605  thisbitprescale=thisbitinfo[2]
606  trgprescalemap['"'+thisbitname+'"']=thisbitprescale
607  else:
608  continue
609  hltpathdata=hltresult[run][hltlsidx][1]
610  efflumidict={}#{pathname:[[l1bitname,l1prescale,hltprescale,efflumi]]}
611  for pathidx,thispathinfo in enumerate(hltpathdata):
612  thispathname=thispathinfo[0]
613  thisprescale=thispathinfo[1]
614  thisl1seed=None
615  l1bitname=None
616  l1prescale=None
617  try:
618  thisl1seed=hlttrgmap[thispathname]
619  except KeyError:
620  thisl1seed=None
621  if thisl1seed:
622  try:
623  (exptype,l1bits)=hltTrgSeedMapper.findUniqueSeed(thispathname,thisl1seed)
624  if l1bits:
625  if not exptype:
626  l1bitname=l1bits[0]
627  l1prescale=trgprescalemap[l1bits[0]]#need to match double quoted string!
628  else:
629  pmin=99999999
630  pmax=0
631  for bit in l1bits:
632  l1p=trgprescalemap[bit]
633  if exptype=='OR':
634  if l1p!=0 and l1p<pmin:
635  pmin=l1p
636  l1prescale=l1p
637  l1bitname=bit
638  if exptype=='AND':
639  if l1p!=0 and l1p>pmax:
640  pmax=l1p
641  l1prescale=l1p
642  l1bitname=bit
643  else:
644  l1prescale=None
645  except KeyError:
646  l1prescale=None
647 
648  efflumi=0.0
649  if l1prescale and thisprescale:#normal both prescaled
650  efflumi=recordedlumi/(float(l1prescale)*float(thisprescale))
651  efflumidict[thispathname]=[l1bitname,l1prescale,thisprescale,efflumi]
652  elif l1prescale and thisprescale==0: #hltpath in menu but masked
653  efflumidict[thispathname]=[l1bitname,l1prescale,thisprescale,efflumi]
654  else:
655  efflumidict[thispathname]=[None,0,thisprescale,efflumi]
656  perlsdata[8]=efflumidict
657  return deliveredresult
658 
def hlttrgMappingByrun
Definition: dataDML.py:1381
def fillschemePatternMap
Definition: dataDML.py:1563
def normFunctionCaller
Definition: normFunctors.py:49
def lumiRunByIds
Definition: dataDML.py:895
def runList
Definition: dataDML.py:240
def runsummary
Definition: dataDML.py:413
def effectiveLumiForIds
Definition: lumiCalcAPI.py:532
def instLumiForIds
Definition: lumiCalcAPI.py:250
def runsummary
Lumi data management and calculation API # # Author: Zhen Xie #.
Definition: lumiCalcAPI.py:10
def hltLSById
Definition: dataDML.py:1428
def lumidataTableName
Definition: nameDealer.py:19
def fillrunMap
Definition: lumiCalcAPI.py:41
def hltpathsForRange
Definition: lumiCalcAPI.py:53
def pixellumidataTableName
Definition: nameDealer.py:22
def fillInRange
Definition: lumiCalcAPI.py:35
def fillrunMap
Definition: dataDML.py:160
def trgLSById
Definition: dataDML.py:788
def lumisummaryv2TableName
Definition: nameDealer.py:28
def deliveredLumiForIds
Definition: lumiCalcAPI.py:369
def lumiLSById
Definition: dataDML.py:1076
def intglumiForRange
Definition: dataDML.py:1527
def beamInfoById
Definition: dataDML.py:1183
def runsummaryMap
Definition: lumiCalcAPI.py:21
def fillInRange
Definition: dataDML.py:89
def pixellumisummaryv2TableName
Definition: nameDealer.py:31
def beamForRange
Definition: lumiCalcAPI.py:75