Belle II Software  release-05-01-25
analyze_TOPFE_ntuple.py
1 
2 # Script to analyze the output of TOPFE_qualityPlots.py
3 
4 import ROOT
5 ROOT.gStyle.SetOptStat(0)
6 ROOT.gROOT.SetBatch()
7 import sys
8 
9 if len(sys.argv) < 2:
10  print("Usage: %s <name of root ntuple>" % sys.argv[0])
11  sys.exit(-1)
12 
13 f = ROOT.TFile.Open(sys.argv[1])
14 
15 t = f.Get("feProps")
16 t.SetLineWidth(2)
17 t.SetLineColor(6)
18 calChannel = "ch % 8 == 0"
19 signalChannel = "ch % 8 != 0"
20 c = ROOT.TCanvas()
21 
22 nTRDHist = ROOT.TH1D("nTRDHist", "all channels;number of TOPRawDigits;waveforms", 1000, 0, 30)
23 t.Draw("nTOPRawDigits>>nTRDHist")
24 c.SaveAs("nTOPRawDigits_All.pdf")
25 c.SetLogy()
26 c.SaveAs("nTOPRawDigits_All_logy.pdf")
27 c.SetLogy(False)
28 c.Clear()
29 nTRDHist.Reset()
30 
31 t.Draw("nTOPRawDigits>>nTRDHist", calChannel)
32 c.SaveAs("nTOPRawDigits_cal.pdf")
33 c.SetLogy()
34 c.SaveAs("nTOPRawDigits_cal_logy.pdf")
35 c.SetLogy(False)
36 c.Clear()
37 nTRDHist.Reset()
38 
39 t.Draw("nTOPRawDigits>>nTRDHist", signalChannel)
40 c.SaveAs("nTOPRawDigits_sig.pdf")
41 c.SetLogy()
42 c.SaveAs("nTOPRawDigits_sig_logy.pdf")
43 c.SetLogy(False)
44 c.Clear()
45 
46 t.Draw("fePeakHt:fePeak1Ht", calChannel, "hist")
47 c.SaveAs("fePeakHt_vs_fePeak1Ht_cal.pdf")
48 c.Clear()
49 
50 wd_adcHist = ROOT.TH2D("wd_adcHist", "Width vs Pulse height;width;height", 130, 0, 130, 1100, 50, 1150)
51 t.Draw("fePeakHt:fePeakWd>>wd_adcHist", "", "colz")
52 c.SaveAs("fePeakWd_vs_fePeakHt.pdf")
53 c.Clear()
54 wd_adcHist.Reset()
55 
56 wd_adcHist.SetTitle("Width vs Pulse height in the calibration channel;width;height")
57 t.Draw("fePeakHt:fePeakWd>>wd_adcHist", calChannel, "colz")
58 c.SaveAs("fePeakWd_vs_fePeakHt_cal.pdf")
59 c.Clear()
60 wd_adcHist.Reset()
61 
62 wd_adcHist.SetTitle("Width vs Pulse height in the signal channel;width;height")
63 t.Draw("fePeakHt:fePeakWd>>wd_adcHist", signalChannel, "colz")
64 c.SaveAs("fePeakWd_vs_fePeakHt_sig.pdf")
65 c.Clear()
66 wd_adcHist.Reset()
67 
68 wd_tdcHist = ROOT.TH2D("wd_tdcHist", "Width vs TDC;TDC;width", 256, 1, 257, 130, 0, 130)
69 t.Draw("fePeakWd:fePeakTDC>>wd_tdcHist", "", "colz")
70 c.SaveAs("fePeakWd_vs_TDC.pdf")
71 c.Clear()
72 
73 ht_tdcHist = ROOT.TH2D("ht_tdcHist", "Height vs TDC;TDC;height", 256, 1, 257, 1100, 50, 1150)
74 t.Draw("fePeakHt:fePeakTDC>>ht_tdcHist", "", "colz")
75 c.SaveAs("fePeakHt_vs_TDC.pdf")
76 c.SetLogz()
77 c.Clear()
78 
79 ch_tdcHist = ROOT.TH2D("ch_tdcHist", "Channel vs TDC;TDC;channel number", 256, 1, 257, 512, 0, 512)
80 t.Draw("ch:fePeakTDC>>ch_tdcHist", "", "colz")
81 c.SetLogz()
82 c.SaveAs("fePeakTDC_vs_ch.pdf")
83 c.Clear()
84 #
85 adcHist = ROOT.TH1D("adcHist", "ADC counts;ADC", 1000, 0, 1000)
86 adcHist.SetLineWidth(2)
87 adcHist.SetLineColor(4)
88 t.Draw("fePeakHt>>adcHist", calChannel)
89 adcHist.SetTitle("ADC counts in the calibration channel")
90 c.SaveAs("ADC_distribution_peak0_cal.pdf")
91 c.Clear()
92 adcHist.Reset()
93 
94 adcHist.SetLineWidth(2)
95 adcHist.SetLineColor(4)
96 t.Draw("fePeakHt>>adcHist", signalChannel)
97 adcHist.SetTitle("ADC counts in the signal channels")
98 c.SaveAs("ADC_distribution_peak0_sig.pdf")
99 c.Clear()
100 
101 tdcHist = ROOT.TH1D("tdcHist", "tdcHist;TDC;waveforms", 256, 1, 257)
102 tdcHist.SetLineWidth(2)
103 tdcHist.SetLineColor(4)
104 t.Draw("fePeakTDC>>tdcHist", calChannel)
105 tdcHist.SetTitle("TDC distribution calibration channel")
106 c.SaveAs("TDC_distribution_peak0_cal.pdf")
107 c.Clear()
108 tdcHist.Reset()
109 
110 tdcHist.SetLineWidth(2)
111 tdcHist.SetLineColor(4)
112 t.Draw("fePeakTDC>>tdcHist", signalChannel)
113 tdcHist.SetTitle("TDC distribution signal channels")
114 c.SaveAs("TDC_distribution_peak0_signal.pdf")
115 c.Clear()
116 tdcHist.Reset()
117 
118 tdcHist.SetLineWidth(2)
119 tdcHist.SetLineColor(4)
120 t.Draw("fePeak1TDC>>tdcHist", calChannel + "&& nTOPRawDigits > 2")
121 tdcHist.SetTitle("TDC distribution 2nd peak calibration channel")
122 c.Update()
123 c.SaveAs("fePeak1TDC_calChannel.pdf")
124 c.BuildLegend()
125 c.Clear()
126 tdcHist.Reset()
127 
128 tdcHist.SetLineWidth(2)
129 tdcHist.SetLineColor(4)
130 t.Draw("fePeak1TDC>>tdcHist", signalChannel + "&& nTOPRawDigits > 1")
131 tdcHist.SetTitle("TDC distribution 2nd peak signal channel")
132 c.Update()
133 c.SaveAs("fePeak1TDC_signalChannel.pdf")
134 c.BuildLegend()
135 c.Clear()
136 tdcHist.Reset()
137 
138 hists = []
139 c.Clear()
140 c.Divide(3, 3)
141 c.cd(9)
142 h0 = ROOT.TH1D("feh0", "all Channels", 1000, 50, 1050)
143 t.Draw("fePeakHt>>feh0")
144 for iCanv in range(1, 9):
145  c.cd(iCanv)
146  h = ROOT.TH1D("feh%d" % iCanv, "channel %d;ADC;waveforms" % iCanv, 1000, 50, 1050)
147  t.Draw("fePeakHt>>feh%d" % iCanv, "ch %% 8 == %d" % (iCanv - 1))
148  hists.append(h)
149 c.SaveAs("fePeakHt_byChannel.pdf")
150 
151 hists = []
152 c.Clear()
153 c.Divide(3, 3)
154 c.cd(5)
155 h0 = ROOT.TH1D("fe_asic0", "all ASICs", 1000, 50, 1050)
156 t.Draw("fePeakHt>>fe_asic0")
157 for iASIC, iCanv in enumerate([1, 3, 7, 9]):
158  c.cd(iCanv)
159  h = ROOT.TH1D("fe_asic%d" % iCanv, "ASIC %d;ADC;waveforms" % iASIC, 1000, 50, 1050)
160  t.Draw("fePeakHt>>fe_asic%d" % iCanv, "(ch/8) %% 4 == %d" % (iASIC))
161  hists.append(h)
162 c.SaveAs("fePeakHt_byASIC.pdf")
163 
164 hists = []
165 c.Clear()
166 c.Divide(3, 3)
167 c.cd(5)
168 h0 = ROOT.TH1D("fe_carrier0", "all Carriers", 1000, 50, 1050)
169 t.Draw("fePeakHt>>fe_carrier0")
170 for iCarrier, iCanv in enumerate([1, 3, 7, 9]):
171  c.cd(iCanv)
172  h = ROOT.TH1D("fe_carrier%d" % iCanv, "Carrier %d;ADC;waveforms" % iCarrier, 1000, 50, 1050)
173  t.Draw("fePeakHt>>fe_carrier%d" % iCanv, "(ch/8/4) %% 4 == %d" % (iCarrier))
174  hists.append(h)
175 c.SaveAs("fePeakHt_byCarrier.pdf")
176 
177 hists = []
178 c.Clear()
179 c.Divide(3, 3)
180 c.cd(5)
181 h0 = ROOT.TH1D("fe_boardstack0", "all board stacks", 1000, 50, 1050)
182 t.Draw("fePeakHt>>fe_boardstack0")
183 for iBS, iCanv in enumerate([1, 3, 7, 9]):
184  c.cd(iCanv)
185  h = ROOT.TH1D("fe_boardstack%d" % iCanv, "board stack %d;ADC;waveforms" % iBS, 1000, 50, 1050)
186  t.Draw("fePeakHt>>fe_boardstack%d" % iCanv, "(ch/8/4/4) %% 4 == %d" % (iBS))
187  hists.append(h)
188 c.SaveAs("fePeakHt_byBoardStack.pdf")
189 
190 # Count the number of failure modes
191 total = t.GetEntries()
192 
193 print("Fraction with width > 30: %.3f" % (1.0 * t.Draw("fePeakWd", "fePeakWd>30", "goff") / total))
194 print("Fraction with peaks at window borders: (average occupancy / bin = %.3f)" % (1. / 256))
195 print("\ttdc < 2 : %.3f" % (1.0 * t.Draw("fePeakWd", "fePeakTDC<2", "goff") / total))
196 print("\t63 < tdc < 66 : %.3f" % (1.0 * t.Draw("fePeakWd", "fePeakTDC>63 && fePeakTDC<66", "goff") / total))
197 print("\t127 < tdc < 130: %.3f" % (1.0 * t.Draw("fePeakWd", "fePeakTDC>127 && fePeakTDC<130", "goff") / total))
198 print("\t191 < tdc < 194: %.3f" % (1.0 * t.Draw("fePeakWd", "fePeakTDC>191 && fePeakTDC<194", "goff") / total))
199 print("\ttdc > 255 : %.3f" % (1.0 * t.Draw("fePeakWd", "fePeakTDC>255", "goff") / total))