162 def _book_histograms(self):
163 """Book all histograms; the binning follows the histograms used for the KLM event T0 note."""
164 h = self._h
165
166 self._cd('diagnostics')
167 for name, sfx, lab in CATEGORIES:
168 h[f'nhits_{lab}'] = TH1D(f'h_nhits_pertrk_{sfx}', f'Hits per track ({sfx});hits', 100, -0.5, 99.5)
169 h[f'err_{lab}'] = TH1D(f'h_err_pertrk_{sfx}', f'Per-track T0 uncertainty ({sfx});uncertainty [ns]',
170 800, 0.0, 20.0)
171 h[f'dimuon_{lab}'] = TH1D(f'h_dimuon_{sfx}', f'Di-muon T0(#mu^{{+}}) - T0(#mu^{{-}}) ({sfx});#DeltaT_{{0}} [ns]',
172 800, -100, 100)
173 h['dimuon_all'] = TH1D('h_dimuon_all', 'Di-muon T0(#mu^{+}) - T0(#mu^{-}) (all categories);#DeltaT_{0} [ns]',
174 800, -100, 100)
175 h['digitQ_B'] = TH1D('h_digitQ_bklm_scint', 'Digit charge (BKLM scintillator);charge [ADC counts]', 100, 0.0, 800.0)
176 h['digitQ_E'] = TH1D('h_digitQ_eklm_scint', 'Digit charge (EKLM scintillator);charge [ADC counts]', 100, 0.0, 800.0)
177 h['resolution'] = TH1D('h_per_track_resolution', 'Per-track resolution from di-muon #DeltaT_{0};;#sigma/#sqrt{2} [ns]',
178 4, 0.5, 4.5)
179 for i, lab in enumerate(['all', 'bklm_scint', 'bklm_rpc', 'eklm_scint'], 1):
180 h['resolution'].GetXaxis().SetBinLabel(i, lab)
181
182 self._cd('final')
183 h['final'] = TH1D('h_t0evt_klm_final', 'Final KLM event T0;T0 [ns]', 800, -100, 100)
184 h['final_err'] = TH1D('h_t0evt_klm_final_err', 'Final KLM event T0 uncertainty;uncertainty [ns]', 800, 0.0, 20.0)
185
186 for kind, title, nb, lo, hi in (('pull', 'Pull', 200, -10, 10), ('res', 'Residual', 500, -25, 25)):
187 top = 'pulls' if kind == 'pull' else 'residuals'
188 unit = '' if kind == 'pull' else ' [ns]'
189 self._cd(top)
190 for name, sfx, lab in CATEGORIES:
191 h[f'{kind}_{lab}'] = TH1D(f'h_{kind}_{sfx}', f'{title} ({sfx});T0(#mu^{{+}}) - T0(#mu^{{-}}){unit}',
192 nb, lo, hi)
193 for a, b in CROSS_PAIRS:
194 h[f'{kind}_{a}_vs_{b}'] = TH1D(f'h_{kind}_{a}_vs_{b}', f'{title}, same track;T0({a}) - T0({b}){unit}',
195 nb, lo, hi)
196 h[f'evt_{kind}_{a}_vs_{b}'] = TH1D(f'h_evt_{kind}_{a}_vs_{b}', f'{title}, per event;T0({a}) - T0({b}){unit}',
197 nb, lo, hi)
198
199 snb, slo, shi = (200, -10, 10) if kind == 'pull' else (200, -50, 50)
200 for name, sfx, lab in CATEGORIES:
201 self._cd(f'{top}/sector/{sfx}')
202 n = N_SECTOR_BINS[lab]
203 grid = {}
204 for i in range(n):
205 for j in range(n):
206 si, sj = _sector_name(lab, i), _sector_name(lab, j)
207 grid[(i, j)] = TH1D(f'h_{kind}_{sfx}_{si}_vs_{sj}',
208 f'{title} ({sfx}), #mu^{{+}} in {si}, #mu^{{-}} in {sj};'
209 f'T0(#mu^{{+}}) - T0(#mu^{{-}}){unit}', snb, slo, shi)
210 h[f'{kind}_sector_{lab}'] = grid
211 self._cd(f'{top}/sector')
212 for stat in ('mean', 'sigma'):
213 h2 = TH2D(f'h2_{kind}_{sfx}_{stat}', f'{title} {stat} ({sfx});#mu^{{+}} sector;#mu^{{-}} sector',
214 n, 0.5, n + 0.5, n, 0.5, n + 0.5)
215 for k in range(n):
216 h2.GetXaxis().SetBinLabel(k + 1, _sector_name(lab, k))
217 h2.GetYaxis().SetBinLabel(k + 1, _sector_name(lab, k))
218 h[f'{kind}_sector_{lab}_{stat}'] = h2
219