7 Plot beamspot properties vs mu
9 __author__ =
'Anthony Morley'
11 __usage__ =
'''%prog [options] [database1] [database2]
13 Database can be either connection string or db file:
15 e.g COOLOFL_INDET/CONDBR2 (default)
20 PlotVsMu --rl 341123 --ru 341123
24 from DQUtils
import fetch_iovs, process_iovs
25 from DQUtils.sugar
import IOVSet,RANGEIOV_VAL,RunLumiType
26 from array
import array
29 from InDetBeamSpotExample
import BeamSpotData
30 BeamSpotData.varDefs = getattr(BeamSpotData,
'varDefsGen')
32 from CoolLumiUtilities.CoolDataReader
import CoolDataReader
35 ROOT.gROOT.SetBatch(1)
37 lumiTag_default =
'OflPrefLumi-RUN3-UPD4-02'
38 indetbsTag_default =
'IndetBeampos-RUN3-ES1-UPD2-02'
40 from optparse
import OptionParser
41 parser = OptionParser(usage=__usage__, version=__version__)
42 parser.add_option(
'',
'--folderBS', dest=
'folderBS', default=
'/Indet/Beampos', help=
'Folder name (default: /Indet/Beampos)')
43 parser.add_option(
'',
'--folderLumi', dest=
'folderLumi', default=
'/TRIGGER/OFLLUMI/OflPrefLumi', help=
'Folder name (default: /TRIGGER/OFLLUMI/OflPrefLumi')
44 parser.add_option(
'',
'--tagBS', dest=
'tagBS', default=indetbsTag_default, help=
'Tag to compare (default: '+indetbsTag_default+
')')
45 parser.add_option(
'',
'--tagLumi', dest=
'tagLumi', default=lumiTag_default, help=
'Tag to compare to (default: '+lumiTag_default+
')')
46 parser.add_option(
'',
'--rl', dest=
'runMin', type=
'int', default=
None, help=
'Start run number (default: None)')
47 parser.add_option(
'',
'--ru', dest=
'runMax', type=
'int', default=
None, help=
'Max run number (default: None)')
48 parser.add_option(
'-p',
'--plot', dest=
'plot', default=
'', help=
'quantity to plot, only make one plot')
49 parser.add_option(
'',
'--plotGraph' , dest=
'plotGraph', action=
"store_true", default=
False, help=
'plot a graph instead of an histogram')
50 parser.add_option(
'',
'--noPlot', dest=
'plotSomething', action=
"store_false", default=
True, help=
'plot something')
51 (options,args) = parser.parse_args()
53 db1 = args[0]
if len(args)==1
else 'COOLOFL_INDET/CONDBR2'
54 db2 = args[1]
if len(args)==2
else 'COOLOFL_TRIGGER/CONDBR2'
61 varColl = [
'posX',
'posY',
'posZ',
'sigmaX',
'sigmaY',
'sigmaZ']
62 varPlot.append(options.plot)
64 varColl = [
'posX',
'posY',
'posZ',
'sigmaX',
'sigmaY',
'sigmaZ']
65 varPlot = [
'posX',
'posY',
'posZ',
'sigmaX',
'sigmaY',
'sigmaZ']
68 f1 =
"%s::%s" % (db1, options.folderBS)
69 f2 =
"%s::%s" % (db2, options.folderLumi)
72 print(
"Comparing: " )
73 print(
" * ", f1, options.tagBS )
74 print(
" * ", f2, options.tagLumi )
77 requiredForNtuple = [
'posX',
'posY',
'posZ',
'sigmaX',
'sigmaY',
'sigmaZ']
78 checkNtupleProd =
all(item
in varColl
for item
in requiredForNtuple)
79 if not checkNtupleProd:
80 print(
'Ntuple will not be filled missing vars' )
84 from PyCool
import cool
85 from CoolConvUtilities
import AtlCoolLib
86 cooldbBS = AtlCoolLib.indirectOpen(db1,
True,
False)
87 cooldbLumi = AtlCoolLib.indirectOpen(db2,
True,
False)
89 folderBS = cooldbBS.getFolder(options.folderBS)
90 folderLumi = cooldbLumi.getFolder(options.folderLumi)
93 coolQuery = COOLQuery()
95 if options.runMin
is not None:
96 iov1 = options.runMin << 32
97 if options.runMax
is not None:
98 iov2 = (options.runMax +1) << 32
100 iov2 = (options.runMin +1) << 32
101 print(
'Plotting iovs %i to %i ' % (iov1,iov2) )
103 print(
'No run selected -- ERROR' )
106 if (iov2>cool.ValidityKeyMax):
107 iov2=cool.ValidityKeyMax
109 print(
"Reading data from database" )
110 itrBS = folderBS.browseObjects(iov1, iov2, cool.ChannelSelection.all(), options.tagBS)
111 print(
"...finished getting BS data" )
115 startRLB =0x7FFFFFFFFFFFFFFF
118 outfile = ROOT.TFile(
"BeamspotLumi_%i.root" % (options.runMin),
"recreate")
119 ntuple = ROOT.TNtupleD(
'BeamspotLumi',
'BeamSpotLumi',
"x:y:z:sigma_x:sigma_y:sigma_z:run:mu:lumi:year:month:day:hour:minute:epoch" )
124 while itrBS.goToNext():
126 obj = itrBS.currentRef()
130 runBegin = since >> 32
131 lumiBegin = since & 0xFFFFFFFF
134 runUntil = until >> 32
135 lumiUntil = until & 0xFFFFFFFF
137 status =
int(obj.payloadValue(
'status'))
141 if runs.count(runBegin) < 1:
142 runs.append(runBegin)
152 values[var] =
float(obj.payloadValue(var))
153 values[var+
'Err'] =
float(obj.payloadValue(var+
'Err'))
154 values[
'until'] = until
155 lbDict[since] = values
158 print(
'Runs: ',runs )
171 sqtrt2pi = math.sqrt(2*math.pi)
173 lblb = CoolDataReader(
'COOLONL_TRIGGER/CONDBR2',
'/TRIGGER/LUMI/LBLB')
174 from DQUtils.sugar
import RANGEIOV_VAL, RunLumi
175 from DQUtils
import IOVSet
179 iov2 = (run + 1) << 32
181 itrLumi = folderLumi.browseObjects(iov1, iov2, cool.ChannelSelection(0), options.tagLumi)
182 print(
"...finished getting Lumi data for run %i" % run )
184 lblb.setIOVRangeFromRun(run)
186 if len(lblb.data) < 1:
187 print(
'No LBLB data found!' )
191 for obj
in lblb.data:
192 lblbMap[obj.since()] = (obj.payload()[
'StartTime'], obj.payload()[
'EndTime'])
195 while itrLumi.goToNext():
196 obj = itrLumi.currentRef()
199 runBegin = since >> 32
200 lumiBegin = since & 0xFFFFFFFF
203 runUntil = until >> 32
204 lumiUntil = until & 0xFFFFFFFF
207 mu =
float(obj.payloadValue(
'LBAvEvtsPerBX'))
208 instlumi =
float(obj.payloadValue(
'LBAvInstLumi'))
211 if lbDict[ since ][
'sigmaX'] > 0.1 :
213 startTime = lblbMap.get(obj.since(), (0., 0.))[0]
214 endTime = lblbMap.get(lbDict[ since ][
'until'], (0., 0.))[0]
215 mylumi = (endTime - startTime)/1e9 * instlumi/1e9
216 thisTime = time.gmtime( startTime /1.e9 )
223 lumi.append( mylumi );
227 if options.plotSomething:
229 if not var
in ydDict:
230 ydDict[var] =
array(
'd')
231 ydDict2[var] =
array(
'd')
232 eydDict[var] =
array(
'd')
234 ydDict2[var].
append( mu/(lbDict[ since ][var] * sqtrt2pi ))
235 ydDict[var].
append( lbDict[ since ][var] )
236 eydDict[var].
append( lbDict[ since ][var+
'Err'] )
238 timeSt = coolQuery.lbTime(
int(since >> 32),
int(since & 0xFFFFFFFF) )[0]
239 betaStar = coolQuery.getLHCInfo(timeSt).
get(
'BetaStar',0)
240 fillSt = coolQuery.getLHCInfo(timeSt).
get(
'FillNumber',0)
241 bstar.append(betaStar)
243 fillsLB.append(fillSt)
245 if checkNtupleProd
and lbDict[ since ][
'sigmaZErr'] < 5 :
246 ntuple.Fill( lbDict[ since ][
'posX'], lbDict[ since ][
'posY'], lbDict[ since ][
'posZ'], lbDict[ since ][
'sigmaX'], lbDict[ since ][
'sigmaY'], lbDict[ since ][
'sigmaZ'],runBegin, mu, mylumi, year, month, day,hour, mins, startTime /1.e9 )
248 runStart = startRLB >> 32
249 runEnd = endRLB >> 32
250 fillStart = fillEnd = 0
251 timeStart = timeEnd = 0
254 timeStart = coolQuery.lbTime(
int(startRLB >> 32),
int(startRLB & 0xFFFFFFFF) )[0]
258 timeEnd = coolQuery.lbTime(
int(endRLB >> 32),
int(endRLB & 0xFFFFFFFF)-1 )[1]
262 fillStart = coolQuery.getLHCInfo(timeStart).
get(
'FillNumber',0)
266 fillEnd = coolQuery.getLHCInfo(timeEnd).
get(
'FillNumber',0)
270 beamEnergy = coolQuery.getLHCInfo(timeStart).
get(
'BeamEnergyGeV',0)
277 if not options.plotSomething:
280 from InDetBeamSpotExample
import ROOTUtils
282 canvas = ROOT.TCanvas(
'BeamSpotComparison',
'BeamSpotComparison', 1600, 1200)
285 ROOT.gPad.SetTopMargin(0.05)
286 ROOT.gPad.SetLeftMargin(0.15)
287 ROOT.gPad.SetRightMargin(0.05)
289 if not options.plotGraph:
290 ROOT.gPad.SetRightMargin(0.15)
297 for runLB, betaStar
in zip(fillsLB,bstar):
300 pos = fillsFilled.index(runLB)
302 fillsFilled.append(
int(runLB))
304 print(
"Fills with beta* = 30 cm",fillsFilled)
305 length = len(fillsFilled)
306 print(
'Number of fills with beta* = 30 cm: ',length)
309 fillsFilled120 =
list()
310 for runLB, betaStar
in zip(fillsLB,bstar):
311 if betaStar > 119.
and betaStar < 121 :
313 pos = fillsFilled120.index(runLB)
315 fillsFilled120.append(
int(runLB))
316 fillsFilled120.sort()
317 print(
"Fills with beta* = 120 cm",fillsFilled120)
318 length120 = len(fillsFilled120)
319 print(
'Number of fills with beta* = 120 cm: ',length120)
323 if var
not in ydDict:
324 print(
'Missing yd: ',var )
325 if var
not in eydDict:
326 print(
'Missing eyd: ',var )
329 gr = ROOT.TGraphErrors(len(xd), xd, ydDict[var], exd, eydDict[var])
332 ymin =
min(ydDict[var])
333 ymax =
max(ydDict[var])
337 ymaxSmall = ymax + 0.25*h
340 ymin2 =
min(ydDict2[var])
341 ymax2 =
max(ydDict2[var])
352 histo = ROOT.TH2D(
'hd'+var,
'hd'+var, 100, xmin, xmax, 100, ymin, ymax)
353 histo.GetYaxis().SetTitle(
varDef(var,
'atit',var))
354 histo.GetXaxis().SetTitle(
'Average interactions per bunch crossing')
355 histo.GetZaxis().SetTitle(
'Entries')
357 histo2 = ROOT.TH2D(
'hd2'+var,
'hd2'+var, 100, xmin, xmax, 100, ymin2, ymax2)
358 histo2.GetYaxis().SetTitle(
"<Interaction density> @ z=0 [interactions/mm]")
359 histo2.GetXaxis().SetTitle(
'Average interactions per bunch crossing')
360 histo2.GetZaxis().SetTitle(
'Entries')
362 histo2W = ROOT.TH2D(
'hd3'+var,
'hd3'+var, 100, xmin, xmax, 100, ymin2, ymax2)
363 histo2W.GetYaxis().SetTitle(
"<Interaction density> @ z=0 [interactions/mm]")
364 histo2W.GetXaxis().SetTitle(
'Average interactions per bunch crossing')
365 histo2W.GetZaxis().SetTitle(
'Integrated Luminosity (fb^{-1}/bin)')
367 histoW = ROOT.TH2D(
'hdW'+var,
'hdW'+var, 100, xmin, xmax, 100, ymin, ymax)
368 histoW.GetYaxis().SetTitle(
varDef(var,
'atit',var))
369 histoW.GetXaxis().SetTitle(
'Average interactions per bunch crossing')
370 histoW.GetZaxis().SetTitle(
'Integrated Luminosity (fb^{-1}/bin)')
372 histoW1D = ROOT.TH1D(
'hd1D'+var,
'hd1D'+var, 100, ymin, ymaxSmall)
373 histoW1D.GetXaxis().SetTitle(
varDef(var,
'atit',var))
374 histoW1D.GetYaxis().SetTitle(
'Integrated Luminosity (fb^{-1}/bin)')
385 elif var ==
'sigmaX':
390 elif var ==
'sigmaY':
406 histoP = ROOT.TProfile(
'hdP'+var,
'hdP'+var, length,0.,length)
407 histoP.GetYaxis().SetTitle(
varDef(var,
'atit',var))
408 histoP.GetXaxis().SetTitle(
'Fill Number')
409 histoP.SetMinimum(yminP)
410 histoP.SetMaximum(ymaxP)
412 histoB = ROOT.TH2D(
'hdB'+var,
'hdB'+var, 100, 20., 150., 100, yminB, ymaxB)
413 histoB.GetYaxis().SetTitle(
varDef(var,
'atit',var))
414 histoB.GetXaxis().SetTitle(
'#beta*')
415 histoB.GetZaxis().SetTitle(
'Entries')
419 irate =
int(length/10)+1
420 for run
in fillsFilled:
422 if int((i-1)/irate)*irate == i-1:
423 histoP.GetXaxis().SetBinLabel(i,
str(run))
425 histoP.GetXaxis().SetBinLabel(i,
'')
428 irate =
int(length120/10)+1
430 if options.plotGraph:
433 for mu, x, l
in zip(xd, ydDict[var], lumi):
435 histoW.Fill( mu, x , l)
437 for mu, x, l
in zip(xd, ydDict2[var], lumi):
439 histo2W.Fill( mu,x, l)
440 for runLB, betaStar, x
in zip(fillsLB,bstar,ydDict[var]):
442 if runLB < 435229
or runLB > 435777 :
443 histoB.Fill( betaStar, x )
445 pos = fillsFilled.index(runLB)
446 histoP.Fill(pos+0.5,x)
447 if betaStar > 119.
and betaStar < 121 :
448 pos = fillsFilled120.index(runLB)
463 ROOTUtils.atlasLabel( 0.53,0.87,
False,offset=0.12,isForApproval=
False,customstring=
"Internal",energy=
'%2.1f' % beamEnergy,size=0.055)
469 comments.append(
'Run %i' % runStart)
471 comments.append(
'Runs %i - %i' % (runStart,runEnd))
473 if fillStart==fillEnd:
474 comments.append(
'Fill %i' % fillStart)
476 comments.append(
'Fills %i - %i' % (fillStart,fillEnd))
478 t1 = time.strftime(
'%d %b %Y',time.localtime(timeStart))
479 t2 = time.strftime(
'%d %b %Y',time.localtime(timeEnd))
483 comments.append(
'%s - %s' % (t1,t2))
487 canvas.Print(
"Run_%d_%sVsMu.png" % ( options.runMin,var ) )
489 if not options.plotGraph:
490 canvas.SetLogz(
False)
492 canvas.SetLogy(
False)
495 ROOTUtils.atlasLabel( 0.53,0.87,
False,offset=0.12,isForApproval=
False,customstring=
"Internal",energy=
'%2.1f' % beamEnergy,size=0.055)
499 canvas.Print(
"Run_%d_%sVsFill.png" % ( options.runMin,var ) )
500 canvas.SetLogy(
False)
503 ROOTUtils.atlasLabel( 0.53,0.87,
False,offset=0.12,isForApproval=
False,customstring=
"Internal",energy=
'%2.1f' % beamEnergy,size=0.055)
506 canvas.Print(
"Run_%d_%sVsBetaStar.png" % ( options.runMin,var ) )
507 canvas.SetLogy(
False)
509 if __name__ ==
"__main__":