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>
30 ROOT.PyConfig.IgnoreCommandLineOptions =
True
31 ROOT.gROOT.SetBatch(
True)
33 from ROOT
import TChain, TFile, TH1F, TH2F, TNamed, gStyle
37 from optparse
import OptionParser
41 CONTACT_PERSON = {
'Name':
'Giacomo De Pietro',
42 'Email':
'depietro@infn.it'}
46 """Create validation plots for Ext and Muid"""
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.'
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.')
57 (options, args) = option_parser.parse_args()
60 file_chain = TChain(
'tree')
61 file_chain.Add(options.input_file)
67 number_entries = file_chain.GetEntries()
68 except AttributeError:
69 print(
'Could not load input file(s) %s.' % options.input_file)
71 if number_entries == 0:
72 print(
'Data tree is empty or does not exist in file(s) %s. Exit.' % options.input_file)
76 output_root_file = TFile(options.output_file,
'recreate')
80 draw_exthits(file_chain)
81 draw_likelihoods(file_chain)
84 output_root_file.Write()
85 output_root_file.Close()
88 def draw_exthits(file_chain):
90 Draw the ExtHit-related distributions.
93 contact_mail =
"depietro@infn.it"
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'))
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'))
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'))
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'))
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'))
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'))
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'))
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"))
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"))
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"))
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"))
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"))
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"))
220 def draw_likelihoods(file_chain):
222 Draw the Muid likelihood-based distributions.
225 contact_mail =
"depietro@infn.it"
227 outcome = TH1F(
'Outcome',
'Outcome', 5, -0.5, 4.5)
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)
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)
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)
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)
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)
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)
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)
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)
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()
308 rchisq = chisq / ndof
310 theta = momentum.Theta() * 180.0 / np.pi
311 phi = momentum.Phi() * 180.0 / np.pi
314 if 'muon' in file_chain.GetCurrentFile().GetName():
317 llDiff_mu.Fill(llMu - llPi)
318 barrelLayer_mu.Fill(blayer)
319 endcapLayer_mu.Fill(elayer)
320 diffLayer_mu.Fill(diffLayer)
322 rchisq_mu.Fill(rchisq)
323 efficiency_momentum_denom.Fill(p)
324 efficiency_theta_denom.Fill(theta)
325 efficiency_phi_denom.Fill(phi)
327 efficiency_momentum.Fill(p)
328 efficiency_theta.Fill(theta)
329 efficiency_phi.Fill(phi)
333 llDiff_pi.Fill(llMu - llPi)
334 barrelLayer_pi.Fill(blayer)
335 endcapLayer_pi.Fill(elayer)
336 diffLayer_pi.Fill(diffLayer)
338 rchisq_pi.Fill(rchisq)
339 fakerate_momentum_denom.Fill(p)
340 fakerate_theta_denom.Fill(theta)
341 fakerate_phi_denom.Fill(phi)
343 fakerate_momentum.Fill(p)
344 fakerate_theta.Fill(theta)
345 fakerate_phi.Fill(phi)
347 for j
in range(efficiency_momentum_denom.GetNbinsX()):
348 num = efficiency_momentum.GetBinContent(j + 1)
349 denom = efficiency_momentum_denom.GetBinContent(j + 1)
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)
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)
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)
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)
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)
381 fakerate_phi.SetBinContent(j + 1, num / denom)
382 fakerate_phi.SetBinError(j + 1, math.sqrt(num * (denom - num) / (denom * denom * denom)))
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)
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'))
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'))
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')
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')
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')
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)
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)
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)
512 barrelLayer_mu.Write()
513 barrelLayer_pi.Write()
514 endcapLayer_mu.Write()
515 endcapLayer_pi.Write()
522 efficiency_momentum.Write()
523 efficiency_theta.Write()
524 efficiency_phi.Write()
525 fakerate_momentum.Write()
526 fakerate_theta.Write()
533 if __name__ ==
'__main__':
int main(int argc, char **argv)
Run all tests.