7 Create beam spot primary vertex plots (e.g. for approved plots).
9 __author__ =
'Juerg Beringer'
11 __usage__ =
'%prog [options] nt.root'
15 from optparse
import OptionParser
16 parser = OptionParser(usage=__usage__, version=__version__)
17 parser.add_option(
'-p',
'--plot', dest=
'plot', default=
'', help=
'what to plot')
18 parser.add_option(
'-c',
'--comment', dest=
'comment', default=
None, help=
'additional text (use semicolon to indicate line breaks)')
19 parser.add_option(
'-m',
'--more', dest=
'more', default=
'', help=
'more info (displayed beneath statistics box)')
20 parser.add_option(
'-o',
'--output', dest=
'output', default=
'.gif', help=
'comma-separated list of output files or formats (default: .gif')
21 parser.add_option(
'',
'--name', dest=
'name', default=
None, help=
'base name for plots (default: ntuple name)')
22 parser.add_option(
'-n',
'--ntracks', dest=
'ntracks', type=
'int', default=5, help=
'Number of tracks/vtx (default: 4)')
23 parser.add_option(
'',
'--lbmin', dest=
'lbmin', type=
'int', default=-1, help=
'Minimum LB to consider')
24 parser.add_option(
'',
'--lbmax', dest=
'lbmax', type=
'int', default=9999999, help=
'Maximum LB to consider')
25 parser.add_option(
'',
'--xmin', dest=
'xmin', type=
'float', default=
None, help=
'x axis minimum')
26 parser.add_option(
'',
'--xmax', dest=
'xmax', type=
'float', default=
None, help=
'x axis maximum')
27 parser.add_option(
'',
'--ymin', dest=
'ymin', type=
'float', default=
None, help=
'y axis minimum')
28 parser.add_option(
'',
'--ymax', dest=
'ymax', type=
'float', default=
None, help=
'y axis maximum')
29 parser.add_option(
'',
'--passed', dest=
'passed', action=
'store_true', default=
False, help=
'vertex must have passed athena selection')
30 parser.add_option(
'',
'--cuts', dest=
'cuts', default=
'', help=
'additional cuts (in addition to vertex type and what can be set with other options)')
31 parser.add_option(
'',
'--bins', dest=
'nbins', type=
'int', default=200, help=
'number of bins')
32 parser.add_option(
'',
'--fit', dest=
'fit', default=
'', help=
'fit histogram with function (e.g. gaus) (default: no fit)')
33 parser.add_option(
'',
'--logy', dest=
'logy', action=
'store_true', default=
False, help=
'log scale')
34 parser.add_option(
'',
'--optstat', dest=
'optstat', default=
'emruo', help=
'default OptStat value (Default: emruo)')
35 parser.add_option(
'',
'--energy', dest=
'energy', action=
'store_true', default=
False, help=
'add energy label')
36 parser.add_option(
'',
'--public', dest=
'public', action=
'store_true', default=
False, help=
'use labelling for public plots')
37 parser.add_option(
'',
'--prelim', dest=
'prelim', action=
'store_true', default=
False, help=
'Add ATLAS Preliminary to figure')
38 parser.add_option(
'',
'--approval', dest=
'approval', action=
'store_true', default=
False, help=
'Label figure ATLAS for approval')
39 parser.add_option(
'',
'--published', dest=
'published', action=
'store_true', default=
False, help=
'add ATLAS to figure')
40 parser.add_option(
'',
'--canvas', dest=
'canvas', default=
'default', help=
'canvas size: default, page, wide, extrawide or square')
41 parser.add_option(
'',
'--atlasx', dest=
'atlasx', type=
'float', default=
None, help=
'x position for drawing ATLAS label')
42 parser.add_option(
'',
'--atlasy', dest=
'atlasy', type=
'float', default=
None, help=
'y position for drawing ATLAS label')
43 parser.add_option(
'',
'--atlasdx', dest=
'atlasdx', type=
'float', default=
None, help=
'x position offset for drawing Preliminary label')
44 parser.add_option(
'-i',
'--interactive', dest=
'interactive', action=
'store_true', default=
False, help=
'interactive')
45 parser.add_option(
'-b',
'--batch', dest=
'batch', action=
'store_true', default=
False, help=
'run in batch mode')
46 (options,args) = parser.parse_args()
48 parser.error(
'wrong number of command line arguments')
50 ntName = ntFile.split(
'/')[-1][:-5]
if not options.name
else options.name
55 'x': {
'code':
'hist',
'var':
'x',
'hname':
'pvX',
'xmin': -2,
'xmax': 2,
'units':
'[mm]'},
56 'y': {
'code':
'hist',
'var':
'y',
'hname':
'pvY',
'xmin': -2,
'xmax': 2,
'units':
'[mm]'},
57 'z': {
'code':
'hist',
'var':
'z',
'hname':
'pvZ',
'xmin': -500,
'xmax': 500,
'units':
'[mm]'},
58 'errX': {
'code':
'histErr',
'var':
'vxx',
'hname':
'errX',
'xmin': 0,
'xmax': 500,
'units':
'[mm]'},
59 'errXComp': {
'code':
'histErrComp',
'var':
'vxx',
'hname':
'errX',
'xmin': 0,
'xmax': 100,
'units':
'[mm]'},
60 'errY': {
'code':
'histErr',
'var':
'vyy',
'hname':
'errY',
'xmin': 0,
'xmax': 500,
'units':
'[mm]'},
61 'errZ': {
'code':
'histErr',
'var':
'vzz',
'hname':
'errZ',
'xmin': 0,
'xmax': 500,
'units':
'[mm]'},
62 'ntracks': {
'code':
'hist',
'var':
'nTracks',
'hname':
'pvNTracks',
'xmin': 0,
'xmax': 200,
'nbins': 200},
63 'xz': {
'xmin': -250,
'xmax': 250,
'ymin': -1.5,
'ymax': 2.5},
64 'yz': {
'xmin': -250,
'xmax': 250,
'ymin': -0.5,
'ymax': 3.5},
65 'yx': {
'xmin': -1.4,
'xmax': 0.6,
'ymin': 0,
'ymax': 2}
69 return plotDef[what][property]
74 xmin = options.xmin
if options.xmin
else getPlotDef(options.plot,
'xmin',-500)
75 xmax = options.xmax
if options.xmax
else getPlotDef(options.plot,
'xmax',+500)
76 ymin = options.ymin
if options.ymin
else getPlotDef(options.plot,
'ymin',-500)
77 ymax = options.ymax
if options.ymax
else getPlotDef(options.plot,
'ymax',+500)
81 if options.atlasx==
None:
86 if options.atlasy==
None:
88 if options.atlasdx==
None:
89 options.atlasdx = 0.115
92 cuts =
'vType==1 && lb>=%i && lb<%i' % (options.lbmin,options.lbmax)
94 cuts +=
' && nTracks>=%i' % options.ntracks
96 cuts +=
' && passed==1'
98 cuts +=
' && %s' % options.cuts
100 print (
'Using cuts: ',cuts)
107 os.unsetenv(
'DISPLAY')
112 from InDetBeamSpotExample
import ROOTUtils
113 from InDetBeamSpotExample.Utils
import getRunFromName
115 from InDetBeamSpotExample.LHCInfoUtils
import lhcFillData
116 from InDetBeamSpotExample.LHCInfoUtils
import lhcEnergyData
119 ROOT.gStyle.SetPalette(1)
126 ROOTUtils.atlasLabel(options.atlasx,options.atlasy,
False,offset=options.atlasdx,isForApproval=
True,energy=
None)
127 if options.published:
131 comment = options.comment
if options.comment
is not None else '#geq %i tracks/vertex' % (options.ntracks)
137 info =
'Entries %5i' % h.GetEntries()
138 info +=
';RMS %s %6.3g mm' % (what[0],h.GetRMS(2))
139 info +=
';RMS %s %6.3g mm' % (what[1],h.GetRMS(1))
151 ROOT.gStyle.SetOptStat(options.optstat)
153 ROOT.gStyle.SetOptFit(1111)
155 c.SetRightMargin(0.14)
156 h =
ROOTUtils.protect(ROOT.TH1F(hname,
'Primary vertex: %s;Primary vertex %s %s' % (var,var,units),nbins,xmin,xmax))
157 nt.Draw(
'%s >> %s' % (var,hname),cuts)
161 comment = options.comment
if options.comment
is not None else '#geq %i tracks/vertex;%s' % (options.ntracks,options.cuts)
163 ROOT.gPad.SetLogy(options.logy)
171 ROOT.gStyle.SetOptStat(options.optstat)
172 ROOT.gStyle.SetOptFit(0)
174 c.SetRightMargin(0.14)
175 h =
ROOTUtils.protect(ROOT.TH1F(hname,
'Primary vertex error: %s;Primary vertex error #sqrt{V_{%s}} (#mum);Number of vertices' % (hname,vName),
177 nt.Draw(
'1e3*sqrt(%s) >> %s' % (var,hname),cuts)
179 comment = options.comment
if options.comment
is not None else '#geq %i tracks/vertex;%s' % (options.ntracks,options.cuts)
181 ROOT.gPad.SetLogy(options.logy)
189 ROOT.gStyle.SetOptStat(0)
190 ROOT.gStyle.SetOptFit(0)
192 c.SetRightMargin(0.14)
193 h =
ROOTUtils.protect(ROOT.TH1F(hname,
'Vertex Error: %s;Vertex error #sqrt{V_{%s}} [#mum];Fraction of entries' % (hname,vName),
195 nt.Draw(
'1e3*sqrt(%s) >> %s' % (var,hname),cuts)
198 pname = hname+
'_pileup'
199 p =
ROOTUtils.protect(ROOT.TH1F(pname,
'Vertex Error: %s;Vertex error #sqrt{V_{%s}} [#mum];Fraction of entries' % (hname,vName),
201 pcuts = cuts.replace(
'vType==1',
'vType==3')
203 nt.Draw(
'1e3*sqrt(%s) >> %s' % (var,pname),pcuts,
"SAME")
209 comment = options.comment
if options.comment
is not None else '#geq %i tracks/vertex;%s' % (options.ntracks,options.cuts)
211 legend = ROOT.TLegend(.50,.6,.85,.72)
212 legend.AddEntry(h,
'Primary vertices',
'L')
213 legend.AddEntry(p,
'Pileup vertices',
'L')
214 legend.SetFillColor(0)
215 legend.SetBorderSize(0)
217 ROOT.gPad.SetLogy(options.logy)
223 ROOT.gStyle.SetOptStat(0)
225 c.SetRightMargin(0.14)
226 h =
ROOTUtils.protect(ROOT.TH2F(
'pvXZ',
'Primary vertex: x vs z;Primary vertex z [mm];Primary vertex x [mm]',nbins,xmin,xmax,nbins,ymin,ymax))
227 nt.Draw(
'x:z >> pvXZ',cuts)
229 h.GetYaxis().SetTitleOffset(1.0)
237 ROOT.gStyle.SetOptStat(0)
239 c.SetRightMargin(0.14)
240 h =
ROOTUtils.protect(ROOT.TH2F(
'pvYZ',
'Primary vertex: y vs z;Primary vertex z [mm];Primary vertex y [mm]',nbins,xmin,xmax,nbins,ymin,ymax))
241 nt.Draw(
'y:z >> pvYZ',cuts)
243 h.GetYaxis().SetTitleOffset(1.0)
250 ROOT.gStyle.SetOptStat(0)
252 c.SetRightMargin(0.14)
253 h =
ROOTUtils.protect(ROOT.TH2F(
'pvYX',
'Primary vertex: y vs x;Primary vertex x [mm];Primary vertex y [mm]',nbins,xmin,xmax,nbins,ymin,ymax))
254 nt.Draw(
'y:x >> pvYX',cuts)
256 h.GetYaxis().SetTitleOffset(1.0)
266 runFillInfo =
'Fill %s' % (lhcFillData.get(run,
'')
if lhcFillData.get(run,
'')
else '')
268 runFillInfo =
'Run %s (LHC Fill %s)' % (run,lhcFillData.get(run,
'')
if lhcFillData.get(run,
'')
else '')
271 lhcEnergyInfo =
'#sqrt{s} = %s;' % lhcEnergyData.get(run,
'')
if lhcEnergyData.get(run,
'')
else ''
275 f = ROOT.TFile(ntFile)
276 if f.Get(
'Vertices'):
277 nt = f.Get(
'Vertices')
278 elif f.Get(
'Beamspot/Vertices'):
279 nt = f.Get(
'Beamspot/Vertices')
282 ROOTUtils.MyCanvas.saveAsList = options.output.split(
',')
283 ROOTUtils.MyCanvas.autoName =
'%s-%%s%%s' % ntName
285 plots =
Plots(
'Primary Vertex Plots',[
'hist',
'histErr'])
286 plots.plot(
getPlotDef(options.plot,
'code',options.plot))
288 if options.interactive:
289 os.environ[
'PYTHONINSPECT'] =
'1'