6 from RecoLuminosity.LumiDB
import csvSelectionParser, selectionParser
7 import RecoLuminosity.LumiDB.lumiQueryAPI
as LumiQueryAPI
11 from pprint
import pprint
15 def CalcPileup (deadTable, parameters, luminometer, mode='deadtable'):
16 '''Given a deadtable, will calculate parameters of pileup distribution. Return formatted 17 string with LumiSection, LS integrated lumi, RMS of bunch to bunch lumi and pileup.''' 22 for lumiSection, deadArray
in sorted (six.iteritems(deadTable)):
24 if luminometer ==
"HFOC":
29 numerator = float (deadArray[1])
30 denominator = float (deadArray[0])
31 instLumiArray = deadArray[2]
36 livetime = numerator / denominator
43 print "no csv input! Doh!" 53 for xing, xingInstLumi, xingDelvLumi
in instLumiArray:
54 if selBXs
and xing
not in selBXs:
56 xingIntLumi = xingInstLumi * livetime
57 mean = xingInstLumi * parameters.rotationTime / parameters.lumiSectionLen
60 print "mean number of pileup events > 100 for run %d, lum %d : m %f l %f" % \
61 (runNumber, lumiSection, mean, xingInstLumi)
63 print "mean number of pileup events > 100 for lum %d: m %f l %f" % \
64 (lumiSection, mean, xingInstLumi)
67 if xingInstLumi > threshold:
69 TotalLumi = TotalLumi+xingIntLumi
70 TotalInt+= mean*xingIntLumi
71 FilledXings = FilledXings+1
77 MeanInt = TotalInt/TotalLumi
78 for xing, xingInstLumi, xingDelvlumi
in instLumiArray:
79 if selBXs
and xing
not in selBXs:
81 if xingInstLumi > threshold:
82 xingIntLumi = xingInstLumi * livetime
83 mean = xingInstLumi * parameters.rotationTime / parameters.lumiSectionLen
84 TotalInt2+= xingIntLumi*(mean-MeanInt)*(mean-MeanInt)
85 TotalWeight+= xingIntLumi
86 TotalWeight2+= xingIntLumi*xingIntLumi
90 if ((lumiSection > 0)):
93 AveLumi = TotalLumi/FilledXings
97 Denom = TotalWeight*TotalWeight-TotalWeight2
98 if TotalLumi > 0
and Denom > 0:
99 RMSLumi =
sqrt(TotalWeight/(TotalWeight*TotalWeight-TotalWeight2)*TotalInt2)
100 LumiString =
"[%d,%2.4e,%2.4e,%2.4e]," % (lumiSection, TotalLumi, RMSLumi, MeanInt)
101 LumiArray.append(lumiSection)
102 LumiArray.append(TotalLumi)
103 LumiArray.append(RMSLumi)
104 LumiArray.append(MeanInt)
105 lumiX=MeanInt*parameters.lumiSectionLen*FilledXings*(1./parameters.rotationTime)
134 if __name__ ==
'__main__':
135 parameters = LumiQueryAPI.ParametersObject()
136 parser = optparse.OptionParser (
"Usage: %prog [--options] output.root",
137 description =
"Script to estimate average instantaneous bunch crossing luminosity using xing instantaneous luminosity information. Output is JSON format file with one entry per LumiSection")
138 inputGroup = optparse.OptionGroup (parser,
"Input Options")
139 pileupGroup = optparse.OptionGroup (parser,
"Pileup Options")
140 inputGroup.add_option (
'--csvInput', dest =
'csvInput', type=
'string', default=
'',
141 help =
'Use CSV file from lumiCalc.py instead of lumiDB')
142 inputGroup.add_option (
'--selBXs', dest =
'selBXs', type=
'string', default=
'',
143 help =
'CSV of BXs to use; if empty, select all')
144 parser.add_option_group (inputGroup)
145 parser.add_option_group (pileupGroup)
147 (options, args) = parser.parse_args()
154 raise RuntimeError(
"Please specify an output file as your last argument")
158 if not options.csvInput:
159 raise "you must specify an input CSV file with (--csvInput)" 161 if options.selBXs !=
"":
162 for iBX
in options.selBXs.split(
","):
168 print iBX,
"is not an int" 170 print "selBXs",selBXs
177 sepRE = re.compile (
r'[\]\[\s,;:]+')
178 events = open (options.csvInput,
'r') 192 if re.search(
'^#', line):
195 pieces = sepRE.split (line.strip())
199 if len (pieces) < 15:
202 run, lumi = int ( pieces[0] ), int ( pieces[2] )
203 delivered, recorded =
float( pieces[11] ),
float( pieces[12] )
205 if pieces[0] !=
'run':
206 print " cannot parse csv file " 209 GapDict[lumi] = [delivered, recorded]
215 run, lumi = int ( pieces[0] ), int ( pieces[2] )
216 delivered, recorded =
float( pieces[11] ),
float( pieces[12] )
217 luminometer =
str( pieces[14] )
219 for orbit, lum, lumdelv
in zip( pieces[15::3],
223 print " Bad Parsing: Check if the input format has changed" 224 print pieces[0],pieces[1],pieces[2],pieces[3],pieces[4],pieces[5],pieces[6],pieces[7],pieces[8],pieces[9]
227 csvDict.setdefault (run, {})[lumi] = \
228 ( delivered, recorded, xingInstLumiArray )
234 for lumiS, lumiInfo
in sorted ( six.iteritems(GapDict) ):
239 peakratio = lumiInfo[0]/LastDelivered
240 pileup = LastValidLumi[3]*peakratio
243 aveLumi = LastValidLumi[1]*peakratio*lumiInfo[1]/lumiInfo[0]
244 LumiString =
"[%d,%2.4e,%2.4e,%2.4e]," % (lumiS, aveLumi, LastValidLumi[2],pileup)
245 OUTPUTLINE += LumiString
247 LumiString =
"[%d,0.0,0.0,0.0]," % (lumiS)
248 OUTPUTLINE+=LumiString
250 LumiString =
"[%d,0.0,0.0,0.0]," % (lastLumiS+1)
251 OUTPUTLINE+=LumiString
257 LumiString =
"[%d,0.0,0.0,0.0]," % (LastValidLumi[0]+1)
258 OUTPUTLINE+=LumiString
260 lastindex=len(OUTPUTLINE)-1
261 trunc = OUTPUTLINE[0:lastindex]
265 OUTPUTLINE+= (
'"%d":' % run )
269 OUTPUTLINE+=
'[1,0.0,0.0,0.0],' 271 for runNumber, lumiDict
in sorted( six.iteritems(csvDict) ):
273 LumiArray = CalcPileup (lumiDict, parameters, luminometer,
276 LastValidLumi = LumiArray
277 LastDelivered = lumiDict[LumiArray[0]][0]
280 for lumiS, lumiInfo
in sorted ( six.iteritems(GapDict) ):
281 peakratio = lumiInfo[0]/LastDelivered
282 pileup = LumiArray[3]*peakratio
285 aveLumi = LumiArray[1]*peakratio*lumiInfo[1]/lumiInfo[0]
286 LumiString =
"[%d,%2.4e,%2.4e,%2.4e]," % (lumiS, aveLumi, LumiArray[2],pileup)
287 OUTPUTLINE += LumiString
289 LumiString =
"[%d,%2.4e,%2.4e,%2.4e]," % (LumiArray[0], LumiArray[1], LumiArray[2], LumiArray[3])
290 OUTPUTLINE += LumiString
293 lastindex=len(OUTPUTLINE)-1
294 trunc = OUTPUTLINE[0:lastindex]
299 outputfile = open(output,
'w')
301 raise RuntimeError(
"Could not open '%s' as an output JSON file" % output)
303 outputfile.write(OUTPUTLINE)
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
def CalcPileup(deadTable, parameters, luminometer, mode='deadtable')