Belle II Software  release-06-02-00
extmuid_createPlots.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 
18 
19 """
20 <header>
21  <input>muon-ExtMuidValidation.root,
22  pion-ExtMuidValidation.root</input>
23  <contact>depietro@infn.it</contact>
24  <description>Create validation plots for Ext and Muid</description>
25 </header>
26 """
27 
28 import ROOT
29 
30 ROOT.PyConfig.IgnoreCommandLineOptions = True # noqa
31 ROOT.gROOT.SetBatch(True) # noqa
32 
33 from ROOT import TChain, TFile, TH1F, TH2F, TNamed, gStyle
34 import sys
35 import math
36 import numpy as np
37 from optparse import OptionParser
38 
39 # contact person information
40 # is added to the plot descriptions
41 CONTACT_PERSON = {'Name': 'Giacomo De Pietro',
42  'Email': 'depietro@infn.it'}
43 
44 
45 def main():
46  """Create validation plots for Ext and Muid"""
47 
48  option_parser = OptionParser()
49  option_parser.add_option('-i', '--input-file', dest='input_file',
50  default='../*on-ExtMuidValidation.root',
51  help='Root file with Ext and Muid validation data.'
52  )
53  option_parser.add_option('-o', '--output-file', dest='output_file',
54  default='ExtMuidValidation.root',
55  help='Root file with Ext and Muid validation histograms.')
56 
57  (options, args) = option_parser.parse_args()
58 
59  # load chain of input files
60  file_chain = TChain('tree')
61  file_chain.Add(options.input_file)
62 
63  # for file in file_chain:
64 
65  number_entries = 0
66  try:
67  number_entries = file_chain.GetEntries()
68  except AttributeError:
69  print('Could not load input file(s) %s.' % options.input_file)
70 
71  if number_entries == 0:
72  print('Data tree is empty or does not exist in file(s) %s. Exit.' % options.input_file)
73  sys.exit(0)
74 
75  # open the output root file
76  output_root_file = TFile(options.output_file, 'recreate')
77 
78  # create and draw histograms
79  gStyle.SetOptStat(0)
80  draw_exthits(file_chain)
81  draw_likelihoods(file_chain)
82 
83  # close the output file
84  output_root_file.Write()
85  output_root_file.Close()
86 
87 
88 def draw_exthits(file_chain):
89  """
90  Draw the ExtHit-related distributions.
91  """
92 
93  contact_mail = "depietro@infn.it"
94 
95  # NOTE: *.Draw() must precede *.GetListOfFunctions().Add() or the latter will be discarded!
96  detectorID = TH1F('DetectorID', 'Detector ID for ExtHits', 8, -0.5, 7.5)
97  file_chain.Draw('ExtHits.m_DetectorID&0x0F>>DetectorID', '')
98  detectorID.GetXaxis().SetTitle('0=undefined, 1=PXD, 2=SVD, 3=CDC, 4=TOP, 5=ARICH, 6=ECL, 7=KLM')
99  detectorID.GetListOfFunctions().Add(TNamed('Description', "0=undefined, 1=PXD, 2=SVD, 3=CDC, 4=TOP, 5=ARICH, 6=ECL, 7=KLM"))
100  detectorID.GetListOfFunctions().Add(TNamed('Check', "ECL > (KLM ~ TOP) >> ARICH; others ~ 0"))
101  detectorID.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
102  detectorID.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=0.50,pvalue-error=0.10'))
103  detectorID.Write()
104 
105  tof = TH1F('TOF', 'Time of Flight for non-KLM ExtHits', 100, 0.0, 25.0)
106  file_chain.Draw('ExtHits.m_TOF>>TOF', '(ExtHits.m_DetectorID&0x0F)!=7')
107  tof.GetXaxis().SetTitle('t (ns)')
108  tof.GetListOfFunctions().Add(TNamed('Description', "Time of flight along track from IP to each ExtHit"))
109  tof.GetListOfFunctions().Add(TNamed('Check', "Dominant peak at ~4.5 ns, secondary peak at ~6 ns"))
110  tof.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
111  tof.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
112  tof.Write()
113 
114  tofKLM = TH1F('TOFKLM', 'Time of Flight for KLM ExtHits', 100, 0.0, 25.0)
115  file_chain.Draw('ExtHits.m_TOF>>TOFKLM', '(ExtHits.m_DetectorID&0x0F)==7')
116  tofKLM.GetXaxis().SetTitle('t (ns)')
117  tofKLM.GetListOfFunctions().Add(TNamed('Description', "Time of flight along track from IP to each ExtHit"))
118  tofKLM.GetListOfFunctions().Add(TNamed('Check', "Broad rising distribution at 7-11 ns, then falling to ~17 ns"))
119  tofKLM.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
120  tofKLM.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
121  tofKLM.Write()
122 
123  r = TH1F('r', 'r for non-KLM ExtHits', 40, 0.0, 200.0)
124  file_chain.Draw('ExtHits.getPosition().Perp()>>r', '(ExtHits.m_DetectorID&0x0F)!=7')
125  r.GetXaxis().SetTitle('r (cm)')
126  r.GetListOfFunctions().Add(TNamed('Description', "Radial position in transverse plane of each ExtHit"))
127  r.GetListOfFunctions().Add(TNamed('Check', "Sharp peak at 120 cm; broad peak at 140 cm"))
128  r.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
129  r.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
130  r.Write()
131 
132  z = TH1F('z', 'z for non-KLM ExtHits', 100, -200.0, 300.0)
133  file_chain.Draw('ExtHits.getPosition().Z()>>z', '(ExtHits.m_DetectorID&0x0F)!=7')
134  z.GetXaxis().SetTitle('z (cm)')
135  z.GetListOfFunctions().Add(TNamed('Description', "Axial position of each ExtHit"))
136  z.GetListOfFunctions().Add(TNamed('Check', "Broad peak centered at 0 cm; sharp dip at 0; secondary peak at 170"))
137  z.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
138  z.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
139  z.Write()
140 
141  rKLM = TH1F('rKLM', 'r for KLM ExtHits', 50, 100.0, 350.0)
142  file_chain.Draw('ExtHits.getPosition().Perp()>>rKLM', '(ExtHits.m_DetectorID&0x0F)==7')
143  rKLM.GetXaxis().SetTitle('r (cm)')
144  rKLM.GetListOfFunctions().Add(TNamed('Description', "Radial position in transverse plane of each ExtHit"))
145  rKLM.GetListOfFunctions().Add(TNamed('Check', "Low shoulder below 200 cm (EKLM); comb-like pattern above 200 cm (BKLM)"))
146  rKLM.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
147  rKLM.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
148  rKLM.Write()
149 
150  zKLM = TH1F('zKLM', 'z for KLM ExtHits', 140, -300.0, 400.0)
151  file_chain.Draw('ExtHits.getPosition().Z()>>zKLM', '(ExtHits.m_DetectorID&0x0F)==7')
152  zKLM.GetXaxis().SetTitle('z (cm)')
153  zKLM.GetListOfFunctions().Add(TNamed('Description', "Axial position of each ExtHit"))
154  zKLM.GetListOfFunctions().Add(TNamed('Check', "Comb-like pattern at z<-180 and z>280 cm (EKLM); broad peak at 0 (BKLM)"))
155  zKLM.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
156  zKLM.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
157  zKLM.Write()
158 
159  xy = TH2F('xy', 'y vs x for non-KLM ExtHits', 100, -200.0, 200.0, 100, -200.0, 200.0)
160  file_chain.Draw('ExtHits.getPosition().Y():ExtHits.getPosition().X()>>xy', '(ExtHits.m_DetectorID&0x0F)!=7')
161  xy.GetXaxis().SetTitle('x (cm)')
162  xy.GetYaxis().SetTitle('y (cm)')
163  xy.GetListOfFunctions().Add(TNamed('Description', "Position projected into transverse plane of each ExtHit"))
164  xy.GetListOfFunctions().Add(TNamed('Check', "Cylindrical, with most hits in ECL and TOP"))
165  xy.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
166  xy.GetListOfFunctions().Add(TNamed('MetaOptions', "box, expert"))
167  xy.Write()
168 
169  xz = TH2F('xz', 'x vs z for non-KLM ExtHits', 125, -200.0, 300.0, 100, -200.0, 200.0)
170  file_chain.Draw('ExtHits.getPosition().X():ExtHits.getPosition().Z()>>xz', '(ExtHits.m_DetectorID&0x0F)!=7')
171  xz.GetXaxis().SetTitle('z (cm)')
172  xz.GetYaxis().SetTitle('x (cm)')
173  xz.GetListOfFunctions().Add(TNamed('Description', "Position projected into x-z plane of each ExtHit"))
174  xz.GetListOfFunctions().Add(TNamed('Check', " "))
175  xz.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
176  xz.GetListOfFunctions().Add(TNamed('MetaOptions', "box, expert"))
177  xz.Write()
178 
179  yz = TH2F('yz', 'y vs z for non-KLM ExtHits', 125, -200.0, 300.0, 100, -200.0, 200.0)
180  file_chain.Draw('ExtHits.getPosition().Y():ExtHits.getPosition().Z()>>yz', '(ExtHits.m_DetectorID&0x0F)!=7')
181  yz.GetXaxis().SetTitle('z (cm)')
182  yz.GetYaxis().SetTitle('y (cm)')
183  yz.GetListOfFunctions().Add(TNamed('Description', "Position projected into y-z plane of each ExtHit"))
184  yz.GetListOfFunctions().Add(TNamed('Check', " "))
185  yz.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
186  yz.GetListOfFunctions().Add(TNamed('MetaOptions', "box, expert"))
187  yz.Write()
188 
189  xyKLM = TH2F('xyKLM', 'y vs x for KLM ExtHits', 140, -350.0, 350.0, 140, -350.0, 350.0)
190  file_chain.Draw('ExtHits.getPosition().Y():ExtHits.getPosition().X()>>xyKLM', '(ExtHits.m_DetectorID&0x0F)==7')
191  xyKLM.GetXaxis().SetTitle('x (cm)')
192  xyKLM.GetYaxis().SetTitle('y (cm)')
193  xyKLM.GetListOfFunctions().Add(TNamed('Description', "Position projected into transverse plane of each ExtHit"))
194  xyKLM.GetListOfFunctions().Add(TNamed('Check', "Octagonal (BKLM) and cylindrical (EKLM)"))
195  xyKLM.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
196  xyKLM.GetListOfFunctions().Add(TNamed('MetaOptions', "box, expert"))
197  xyKLM.Write()
198 
199  xzKLM = TH2F('xzKLM', 'x vs z for KLM ExtHits', 140, -300.0, 400.0, 140, -350.0, 350.0)
200  file_chain.Draw('ExtHits.getPosition().X():ExtHits.getPosition().Z()>>xzKLM', '(ExtHits.m_DetectorID&0x0F)==7')
201  xzKLM.GetXaxis().SetTitle('z (cm)')
202  xzKLM.GetYaxis().SetTitle('x (cm)')
203  xzKLM.GetListOfFunctions().Add(TNamed('Description', "Position projected into x-z plane of each ExtHit"))
204  xzKLM.GetListOfFunctions().Add(TNamed('Check', " "))
205  xzKLM.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
206  xzKLM.GetListOfFunctions().Add(TNamed('MetaOptions', "box, expert"))
207  xzKLM.Write()
208 
209  yzKLM = TH2F('yzKLM', 'y vs z for KLM ExtHits', 140, -300.0, 400.0, 140, -350.0, 350.0)
210  file_chain.Draw('ExtHits.getPosition().Y():ExtHits.getPosition().Z()>>yzKLM', '(ExtHits.m_DetectorID&0x0F)==7')
211  yzKLM.GetXaxis().SetTitle('z (cm)')
212  yzKLM.GetYaxis().SetTitle('y (cm)')
213  yzKLM.GetListOfFunctions().Add(TNamed('Description', "Position projected into y-z plane of each ExtHit"))
214  yzKLM.GetListOfFunctions().Add(TNamed('Check', " "))
215  yzKLM.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
216  yzKLM.GetListOfFunctions().Add(TNamed('MetaOptions', "box, expert"))
217  yzKLM.Write()
218 
219 
220 def draw_likelihoods(file_chain):
221  """
222  Draw the Muid likelihood-based distributions.
223  """
224 
225  contact_mail = "depietro@infn.it"
226 
227  outcome = TH1F('Outcome', 'Outcome', 5, -0.5, 4.5)
228 
229  llBins = 120
230  llMin = -60.0
231  llMax = 0.0
232  llMu_mu = TH1F('LLmu-muons', 'logL(mu) for true muons', llBins, llMin, llMax)
233  llMu_pi = TH1F('LLmu-pions', 'logL(mu) for true pions', llBins, llMin, llMax)
234  llPi_mu = TH1F('LLpi-muons', 'logL(pi) for true muons', llBins, llMin, llMax)
235  llPi_pi = TH1F('LLpi-pions', 'logL(pi) for true pions', llBins, llMin, llMax)
236  llDiff_mu = TH1F('LLdiff-muons', 'logL(mu)-logL(pi) for true muons', llBins * 2, llMin, -llMin)
237  llDiff_pi = TH1F('LLdiff-pions', 'logL(mu)-logL(pi) for true pions', llBins * 2, llMin, -llMin)
238 
239  layerBins = 15
240  layerMin = -0.5
241  layerMax = 14.5
242  barrelLayer_mu = TH1F('BarrelLayer-muons', 'Last barrel layer with hit for true muons', layerBins, layerMin, layerMax)
243  barrelLayer_pi = TH1F('BarrelLayer-pions', 'Last barrel layer with hit for true pions', layerBins, layerMin, layerMax)
244  endcapLayer_mu = TH1F('EndcapLayer-muons', 'Last endcap layer with hit for true muons', layerBins, layerMin, layerMax)
245  endcapLayer_pi = TH1F('EndcapLayer-pions', 'Last endcap layer with hit for true pions', layerBins, layerMin, layerMax)
246 
247  diffLayerBins = 20
248  diffLayerMin = -0.5
249  diffLayerMax = 19.5
250  diffLayer_mu = TH1F('DiffLayer-muons', 'Range difference for true muons', diffLayerBins, diffLayerMin, diffLayerMax)
251  diffLayer_pi = TH1F('DiffLayer-pions', 'Range difference for true pions', diffLayerBins, diffLayerMin, diffLayerMax)
252 
253  ndofBins = 32
254  ndofMin = -0.5
255  ndofMax = 31.5
256  ndof_mu = TH1F('Ndof-muons', 'Degrees of freedom for true muons', ndofBins, ndofMin, ndofMax)
257  ndof_pi = TH1F('Ndof-pions', 'Degrees of freedom for true pions', ndofBins, ndofMin, ndofMax)
258 
259  rchisqBins = 50
260  rchisqMin = 0.0
261  rchisqMax = 10.0
262  rchisq_mu = TH1F('rchisq-muons', 'Reduced chi-squared for true muons', rchisqBins, rchisqMin, rchisqMax)
263  rchisq_pi = TH1F('rchisq-pions', 'Reduced chi-squared for true pions', rchisqBins, rchisqMin, rchisqMax)
264 
265  momentumBins = 25 # for efficiency
266  momentumBins2 = 5 # for fake rate (low statistics)
267  momentumMin = 0.0
268  momentumMax = 5.0
269  efficiency_momentum = TH1F('Eff-momentum', 'Muon efficiency vs momentum', momentumBins, momentumMin, momentumMax)
270  efficiency_momentum_denom = TH1F('Eff-momentum-denom', 'Muon efficiency vs momentum', momentumBins, momentumMin, momentumMax)
271  fakerate_momentum = TH1F('FakeRate-momentum', 'Pion fake rate vs momentum', momentumBins2, momentumMin, momentumMax)
272  fakerate_momentum_denom = TH1F('FakeRate-momentum-denom', 'Pion fake rate vs momentum', momentumBins2, momentumMin, momentumMax)
273 
274  thetaBins = 35 # for efficiency
275  thetaBins2 = 7 # for fake rate (low statistics)
276  thetaMin = 10.0
277  thetaMax = 150.0
278  efficiency_theta = TH1F('Eff-theta', 'Muon efficiency vs theta', thetaBins, thetaMin, thetaMax)
279  efficiency_theta_denom = TH1F('Eff-theta-denom', 'Muon efficiency vs theta', thetaBins, thetaMin, thetaMax)
280  fakerate_theta = TH1F('FakeRate-theta', 'Pion fake rate vs theta', thetaBins2, thetaMin, thetaMax)
281  fakerate_theta_denom = TH1F('FakeRate-theta-denom', 'Pion fake rate vs theta', thetaBins2, thetaMin, thetaMax)
282 
283  phiBins = 36 # for efficiency
284  phiBins2 = 8 # for fake rate (low statistics)
285  phiMin = 0.0
286  phiMax = 360.0
287  efficiency_phi = TH1F('Eff-phi', 'Muon efficiency vs phi', phiBins, phiMin, phiMax)
288  efficiency_phi_denom = TH1F('Eff-phi-denom', 'Muon efficiency vs phi', phiBins, phiMin, phiMax)
289  fakerate_phi = TH1F('FakeRate-phi', 'Pion fake rate vs phi', phiBins2, phiMin, phiMax)
290  fakerate_phi_denom = TH1F('FakeRate-phi-denom', 'Pion fake rate vs phi', phiBins2, phiMin, phiMax)
291 
292  for entry in file_chain:
293  mcps = entry.MCParticles
294  momentum = mcps[0].getMomentum()
295  muids = entry.KLMMuidLikelihoods
296  for i in range(muids.GetEntriesFast()):
297  outcome.Fill(muids[i].getOutcome())
298  if muids[i].getOutcome() > 0:
299  llMu = muids[i].getLogL_mu()
300  llPi = muids[i].getLogL_pi()
301  blayer = muids[i].getBarrelHitLayer()
302  elayer = muids[i].getEndcapHitLayer()
303  diffLayer = muids[i].getExtLayer() - muids[i].getHitLayer()
304  ndof = muids[i].getDegreesOfFreedom()
305  chisq = muids[i].getChiSquared()
306  rchisq = -1.0
307  if ndof > 0:
308  rchisq = chisq / ndof
309  p = momentum.Mag()
310  theta = momentum.Theta() * 180.0 / np.pi
311  phi = momentum.Phi() * 180.0 / np.pi
312  if phi < 0.0:
313  phi = phi + 360.0
314  if 'muon' in file_chain.GetCurrentFile().GetName():
315  llMu_mu.Fill(llMu)
316  llPi_mu.Fill(llPi)
317  llDiff_mu.Fill(llMu - llPi)
318  barrelLayer_mu.Fill(blayer)
319  endcapLayer_mu.Fill(elayer)
320  diffLayer_mu.Fill(diffLayer)
321  ndof_mu.Fill(ndof)
322  rchisq_mu.Fill(rchisq)
323  efficiency_momentum_denom.Fill(p)
324  efficiency_theta_denom.Fill(theta)
325  efficiency_phi_denom.Fill(phi)
326  if llMu > llPi:
327  efficiency_momentum.Fill(p)
328  efficiency_theta.Fill(theta)
329  efficiency_phi.Fill(phi)
330  else:
331  llMu_pi.Fill(llMu)
332  llPi_pi.Fill(llPi)
333  llDiff_pi.Fill(llMu - llPi)
334  barrelLayer_pi.Fill(blayer)
335  endcapLayer_pi.Fill(elayer)
336  diffLayer_pi.Fill(diffLayer)
337  ndof_pi.Fill(ndof)
338  rchisq_pi.Fill(rchisq)
339  fakerate_momentum_denom.Fill(p)
340  fakerate_theta_denom.Fill(theta)
341  fakerate_phi_denom.Fill(phi)
342  if llMu > llPi:
343  fakerate_momentum.Fill(p)
344  fakerate_theta.Fill(theta)
345  fakerate_phi.Fill(phi)
346 
347  for j in range(efficiency_momentum_denom.GetNbinsX()):
348  num = efficiency_momentum.GetBinContent(j + 1)
349  denom = efficiency_momentum_denom.GetBinContent(j + 1)
350  if denom > 0:
351  efficiency_momentum.SetBinContent(j + 1, num / denom)
352  efficiency_momentum.SetBinError(j + 1, math.sqrt(num * (denom - num) / (denom * denom * denom)))
353  for j in range(efficiency_theta_denom.GetNbinsX()):
354  num = efficiency_theta.GetBinContent(j + 1)
355  denom = efficiency_theta_denom.GetBinContent(j + 1)
356  if denom > 0:
357  efficiency_theta.SetBinContent(j + 1, num / denom)
358  efficiency_theta.SetBinError(j + 1, math.sqrt(num * (denom - num) / (denom * denom * denom)))
359  for j in range(efficiency_phi_denom.GetNbinsX()):
360  num = efficiency_phi.GetBinContent(j + 1)
361  denom = efficiency_phi_denom.GetBinContent(j + 1)
362  if denom > 0:
363  efficiency_phi.SetBinContent(j + 1, num / denom)
364  efficiency_phi.SetBinError(j + 1, math.sqrt(num * (denom - num) / (denom * denom * denom)))
365  for j in range(fakerate_momentum_denom.GetNbinsX()):
366  num = fakerate_momentum.GetBinContent(j + 1)
367  denom = fakerate_momentum_denom.GetBinContent(j + 1)
368  if denom > 0:
369  fakerate_momentum.SetBinContent(j + 1, num / denom)
370  fakerate_momentum.SetBinError(j + 1, math.sqrt(num * (denom - num) / (denom * denom * denom)))
371  for j in range(fakerate_theta_denom.GetNbinsX()):
372  num = fakerate_theta.GetBinContent(j + 1)
373  denom = fakerate_theta_denom.GetBinContent(j + 1)
374  if denom > 0:
375  fakerate_theta.SetBinContent(j + 1, num / denom)
376  fakerate_theta.SetBinError(j + 1, math.sqrt(num * (denom - num) / (denom * denom * denom)))
377  for j in range(fakerate_phi_denom.GetNbinsX()):
378  num = fakerate_phi.GetBinContent(j + 1)
379  denom = fakerate_phi_denom.GetBinContent(j + 1)
380  if denom > 0:
381  fakerate_phi.SetBinContent(j + 1, num / denom)
382  fakerate_phi.SetBinError(j + 1, math.sqrt(num * (denom - num) / (denom * denom * denom)))
383 
384  # NOTE: *.Fill() must precede *.GetListOfFunctions().Add() or the latter will be discarded!
385  outcome.GetListOfFunctions().Add(TNamed('Description', "0=not in KLM, 1/2=barrel/endcap stop, 3/4=barrel/endcap exit"))
386  outcome.GetListOfFunctions().Add(TNamed('Check', "Peak at 3; rest ~ flat"))
387  outcome.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
388  outcome.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
389  outcome.SetMinimum(0.0)
390 
391  llMu_mu.GetListOfFunctions().Add(TNamed('Description', "Log-likelihood of muon hypothesis for true muons"))
392  llMu_mu.GetListOfFunctions().Add(TNamed('Check', "Sharp peak at 0 with tail on negative side"))
393  llMu_mu.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
394  llMu_mu.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
395  llMu_pi.GetListOfFunctions().Add(TNamed('Description', "Log-likelihood of muon hypothesis for true pions"))
396  llMu_pi.GetListOfFunctions().Add(TNamed('Check', "Sharp double peak at ~52 with tail up to 0"))
397  llMu_pi.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
398  llMu_pi.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
399  llPi_mu.GetListOfFunctions().Add(TNamed('Description', "Log-likelihood of pion hypothesis for true muons"))
400  llPi_mu.GetListOfFunctions().Add(TNamed('Check', "Sharp peak at ~-42 with tail up to 0"))
401  llPi_mu.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
402  llPi_mu.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
403  llPi_pi.GetListOfFunctions().Add(TNamed('Description', "Log-likelihood of pion hypothesis for true pions"))
404  llPi_pi.GetListOfFunctions().Add(TNamed('Check', "Sharp peak at 0 with tail on negative side"))
405  llPi_pi.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
406  llPi_pi.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
407  llDiff_mu.GetListOfFunctions().Add(TNamed('Description', "Log-likelihood difference of muon-pion hypotheses for true muons"))
408  llDiff_mu.GetListOfFunctions().Add(TNamed('Check', "Sharp peak at ~+42 with tail on lower side"))
409  llDiff_mu.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
410  llDiff_mu.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=0.50,pvalue-error=0.10'))
411  llDiff_pi.GetListOfFunctions().Add(TNamed('Description', "Log-likelihood difference of muon-pion hypotheses for true pions"))
412  llDiff_pi.GetListOfFunctions().Add(TNamed('Check', "Sharp peak at ~-52 with tail on higher side"))
413  llDiff_pi.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
414  llDiff_pi.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=0.50,pvalue-error=0.10'))
415 
416  barrelLayer_mu.GetListOfFunctions().Add(TNamed('Description', "Outermost barrel layer with matching hit for true muons"))
417  barrelLayer_mu.GetListOfFunctions().Add(TNamed('Check', "Sharp peak at layer 14"))
418  barrelLayer_mu.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
419  barrelLayer_mu.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
420  barrelLayer_pi.GetListOfFunctions().Add(TNamed('Description', "Outermost barrel layer with matching hit for true pions"))
421  barrelLayer_pi.GetListOfFunctions().Add(TNamed('Check', "Peak at layers 0-1 with tail above that"))
422  barrelLayer_pi.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
423  barrelLayer_pi.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
424  endcapLayer_mu.GetListOfFunctions().Add(TNamed('Description', "Outermost endcap layer with matching hit for true muons"))
425  endcapLayer_mu.GetListOfFunctions().Add(TNamed('Check', "Sharp peaks at layers 11 (backward) and 13 (forward)"))
426  endcapLayer_mu.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
427  endcapLayer_mu.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
428  endcapLayer_pi.GetListOfFunctions().Add(TNamed('Description', "Outermost endcap layer with matching hit for true pions"))
429  endcapLayer_pi.GetListOfFunctions().Add(TNamed('Check', "Peak at layers 0-1 with tail above that"))
430  endcapLayer_pi.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
431  endcapLayer_pi.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
432 
433  diffLayer_mu.GetListOfFunctions().Add(TNamed('Description', "Outermost extrapolated-vs-hit layer difference for true muons"))
434  diffLayer_mu.GetListOfFunctions().Add(TNamed('Check', "Sharp peak at 0"))
435  diffLayer_mu.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
436  diffLayer_mu.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=0.50,pvalue-error=0.10'))
437  diffLayer_mu.GetXaxis().SetTitle('Last Ext Layer - Last Hit Layer')
438  diffLayer_pi.GetListOfFunctions().Add(TNamed('Description', "Outermost extrapolated-vs-hit layer difference for true pions"))
439  diffLayer_pi.GetListOfFunctions().Add(TNamed('Check', "Sharp peak at 15 with tail below that"))
440  diffLayer_pi.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
441  diffLayer_pi.GetListOfFunctions().Add(TNamed('MetaOptions', 'shifter,pvalue-warn=0.50,pvalue-error=0.10'))
442  diffLayer_pi.GetXaxis().SetTitle('Last Ext Layer - Last Hit Layer')
443 
444  ndof_mu.GetListOfFunctions().Add(TNamed('Description', "(Number of matching-hit layers) x 2 for true muons"))
445  ndof_mu.GetListOfFunctions().Add(TNamed('Check', "Even-only entries; peak at 30 with tail below"))
446  ndof_mu.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
447  ndof_mu.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
448  ndof_mu.GetXaxis().SetTitle('#dof')
449  ndof_pi.GetListOfFunctions().Add(TNamed('Description', "(Number of matching-hit layers) x 2 for true pions"))
450  ndof_pi.GetListOfFunctions().Add(TNamed('Check', "Even-only entries; sharp peak at 0 with tail above"))
451  ndof_pi.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
452  ndof_pi.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
453  ndof_pi.GetXaxis().SetTitle('#dof')
454 
455  rchisq_mu.GetListOfFunctions().Add(TNamed('Description', "Transverse-deviation chi-squared/#dof for true muons"))
456  rchisq_mu.GetListOfFunctions().Add(TNamed('Check', "Narrow peak at 1"))
457  rchisq_mu.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
458  rchisq_mu.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
459  rchisq_mu.GetXaxis().SetTitle('#chi^{2} / #ndof')
460  rchisq_pi.GetListOfFunctions().Add(TNamed('Description', "Transverse-deviation chi-squared/#dof for true pions"))
461  rchisq_pi.GetListOfFunctions().Add(TNamed('Check', "Broad peak at ~1"))
462  rchisq_pi.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
463  rchisq_pi.GetListOfFunctions().Add(TNamed('MetaOptions', 'expert,pvalue-warn=0.50,pvalue-error=0.10'))
464  rchisq_pi.GetXaxis().SetTitle('#chi^{2} / #ndof')
465 
466  efficiency_momentum.GetListOfFunctions().Add(TNamed('Description', "Muon ID efficiency vs p for logL(mu) > logL(pi)"))
467  efficiency_momentum.GetListOfFunctions().Add(TNamed('Check', "90-95% for p > 0.6 GeV/c"))
468  efficiency_momentum.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
469  efficiency_momentum.GetListOfFunctions().Add(TNamed('MetaOptions', 'pvalue-warn=0.50,pvalue-error=0.10'))
470  efficiency_momentum.GetXaxis().SetTitle('p (GeV/#it{c})')
471  efficiency_momentum.SetMinimum(0.0)
472  fakerate_momentum.GetListOfFunctions().Add(TNamed('Description', "Pion fake rate vs p for logL(mu) > logL(pi)"))
473  fakerate_momentum.GetListOfFunctions().Add(TNamed('Check', "Peak of 11% below 1 GeV/c, 2-6% above 1 GeV/c"))
474  fakerate_momentum.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
475  fakerate_momentum.GetListOfFunctions().Add(TNamed('MetaOptions', 'pvalue-warn=0.50,pvalue-error=0.10'))
476  fakerate_momentum.GetXaxis().SetTitle('p (GeV/#it{c})')
477  fakerate_momentum.SetMinimum(0.0)
478 
479  efficiency_theta.GetListOfFunctions().Add(TNamed('Description', "Muon ID efficiency vs theta for logL(mu) > logL(pi)"))
480  efficiency_theta.GetListOfFunctions().Add(TNamed('Check', "Somewhat flat (80-100%) in KLM range (17 < theta < 145 degrees)"))
481  efficiency_theta.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
482  efficiency_theta.GetListOfFunctions().Add(TNamed('MetaOptions', 'pvalue-warn=0.50,pvalue-error=0.10'))
483  efficiency_theta.GetXaxis().SetTitle('#theta (deg)')
484  efficiency_theta.SetMinimum(0.0)
485  fakerate_theta.GetListOfFunctions().Add(TNamed('Description', "Pion fake rate vs theta for logL(mu) > logL(pi)"))
486  fakerate_theta.GetListOfFunctions().Add(TNamed('Check', "Roughly flat (3-7%) in KLM range (17 < theta < 145 degrees)"))
487  fakerate_theta.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
488  fakerate_theta.GetListOfFunctions().Add(TNamed('MetaOptions', 'pvalue-warn=0.50,pvalue-error=0.10'))
489  fakerate_theta.GetXaxis().SetTitle('#theta (deg)')
490  fakerate_theta.SetMinimum(0.0)
491 
492  efficiency_phi.GetListOfFunctions().Add(TNamed('Description', "Muon identification efficiency vs phi for logL(mu) > logL(pi)"))
493  efficiency_phi.GetListOfFunctions().Add(TNamed('Check', "Somewhat flat distribution (85-100%)"))
494  efficiency_phi.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
495  efficiency_phi.GetListOfFunctions().Add(TNamed('MetaOptions', 'pvalue-warn=0.50,pvalue-error=0.10'))
496  efficiency_phi.GetXaxis().SetTitle('#phi (deg)')
497  efficiency_phi.SetMinimum(0.0)
498  fakerate_phi.GetListOfFunctions().Add(TNamed('Description', "Pion fake rate vs phi for logL(mu) > logL(pi)"))
499  fakerate_phi.GetListOfFunctions().Add(TNamed('Check', "Roughly flat distribution (2-7%)"))
500  fakerate_phi.GetListOfFunctions().Add(TNamed('Contact', contact_mail))
501  fakerate_phi.GetListOfFunctions().Add(TNamed('MetaOptions', 'pvalue-warn=0.50,pvalue-error=0.10'))
502  fakerate_phi.GetXaxis().SetTitle('#phi (deg)')
503  fakerate_phi.SetMinimum(0.0)
504 
505  outcome.Write()
506  llMu_mu.Write()
507  llMu_pi.Write()
508  llPi_mu.Write()
509  llPi_pi.Write()
510  llDiff_mu.Write()
511  llDiff_pi.Write()
512  barrelLayer_mu.Write()
513  barrelLayer_pi.Write()
514  endcapLayer_mu.Write()
515  endcapLayer_pi.Write()
516  diffLayer_mu.Write()
517  diffLayer_pi.Write()
518  ndof_mu.Write()
519  ndof_pi.Write()
520  rchisq_mu.Write()
521  rchisq_pi.Write()
522  efficiency_momentum.Write()
523  efficiency_theta.Write()
524  efficiency_phi.Write()
525  fakerate_momentum.Write()
526  fakerate_theta.Write()
527  fakerate_phi.Write()
528 
529 
530 
533 if __name__ == '__main__':
534  main()
int main(int argc, char **argv)
Run all tests.
Definition: test_main.cc:75