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