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>
29 ROOT.PyConfig.IgnoreCommandLineOptions =
True
30 ROOT.gROOT.SetBatch(
True)
32 from ROOT
import TChain, TFile, TH1F, TH2F, TNamed, gStyle
36 from optparse
import OptionParser
40 CONTACT_PERSON = {
'Name':
'Giacomo De Pietro',
41 'Email':
'giacomo.pietro@kit.edu'}
45 """Create validation plots for Ext and Muid"""
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.'
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.')
56 (options, args) = option_parser.parse_args()
59 file_chain = TChain(
'tree')
60 file_chain.Add(options.input_file)
66 number_entries = file_chain.GetEntries()
67 except AttributeError:
68 print(
'Could not load input file(s) %s.' % options.input_file)
70 if number_entries == 0:
71 print(
'Data tree is empty or does not exist in file(s) %s. Exit.' % options.input_file)
75 output_root_file = TFile(options.output_file,
'recreate')
79 draw_exthits(file_chain)
80 draw_likelihoods(file_chain)
83 output_root_file.Write()
84 output_root_file.Close()
87 def draw_exthits(file_chain):
89 Draw the ExtHit-related distributions.
92 contact_mail =
"giacomo.pietro@kit.edu"
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'))
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'))
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'))
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'))
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'))
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'))
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'))
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"))
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"))
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"))
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"))
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"))
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"))
219 def draw_likelihoods(file_chain):
221 Draw the Muid likelihood-based distributions.
224 contact_mail =
"giacomo.pietro@kit.edu"
226 outcome = TH1F(
'Outcome',
'Outcome', 5, -0.5, 4.5)
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)
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)
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)
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)
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)
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)
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)
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)
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()
307 rchisq = chisq / ndof
309 theta = momentum.Theta() * 180.0 / np.pi
310 phi = momentum.Phi() * 180.0 / np.pi
313 if 'muon' in file_chain.GetCurrentFile().GetName():
316 llDiff_mu.Fill(llMu - llPi)
317 barrelLayer_mu.Fill(blayer)
318 endcapLayer_mu.Fill(elayer)
319 diffLayer_mu.Fill(diffLayer)
321 rchisq_mu.Fill(rchisq)
322 efficiency_momentum_denom.Fill(p)
323 efficiency_theta_denom.Fill(theta)
324 efficiency_phi_denom.Fill(phi)
326 efficiency_momentum.Fill(p)
327 efficiency_theta.Fill(theta)
328 efficiency_phi.Fill(phi)
332 llDiff_pi.Fill(llMu - llPi)
333 barrelLayer_pi.Fill(blayer)
334 endcapLayer_pi.Fill(elayer)
335 diffLayer_pi.Fill(diffLayer)
337 rchisq_pi.Fill(rchisq)
338 fakerate_momentum_denom.Fill(p)
339 fakerate_theta_denom.Fill(theta)
340 fakerate_phi_denom.Fill(phi)
342 fakerate_momentum.Fill(p)
343 fakerate_theta.Fill(theta)
344 fakerate_phi.Fill(phi)
346 for j
in range(efficiency_momentum_denom.GetNbinsX()):
347 num = efficiency_momentum.GetBinContent(j + 1)
348 denom = efficiency_momentum_denom.GetBinContent(j + 1)
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)
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)
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)
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)
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)
380 fakerate_phi.SetBinContent(j + 1, num / denom)
381 fakerate_phi.SetBinError(j + 1, math.sqrt(num * (denom - num) / (denom * denom * denom)))
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)
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'))
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'))
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')
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')
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')
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)
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)
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)
511 barrelLayer_mu.Write()
512 barrelLayer_pi.Write()
513 endcapLayer_mu.Write()
514 endcapLayer_pi.Write()
521 efficiency_momentum.Write()
522 efficiency_theta.Write()
523 efficiency_phi.Write()
524 fakerate_momentum.Write()
525 fakerate_theta.Write()
532 if __name__ ==
'__main__':
int main(int argc, char **argv)
Run all tests.