296 def _book_histograms(self):
297 """Create all validation histograms inside the output ROOT file."""
298 h = self._h
299 f = self._outfile
300
301 def H1(name, title, nb, lo, hi):
302 return TH1D(name, title, nb, lo, hi)
303
304 def H1I(name, title, nb, lo, hi):
305 return TH1I(name, title, nb, lo, hi)
306
307
308 f.mkdir('per_track').cd()
309 h['t0trk_B'] = H1('h_t0trk_bklm_scint',
310 'Per-track T_{0} (BKLM Scint);T_{0} [ns]', 800, -100, 100)
311 h['t0trk_R'] = H1('h_t0trk_bklm_rpc',
312 'Per-track T_{0} (BKLM RPC);T_{0} [ns]', 800, -100, 100)
313 h['t0trk_E'] = H1('h_t0trk_eklm_scint',
314 'Per-track T_{0} (EKLM Scint);T_{0} [ns]', 800, -100, 100)
315
316
317 f.mkdir('per_event').cd()
318 h['t0evt_B'] = H1('h_t0evt_bklm_scint',
319 'Per-event T_{0} (BKLM Scint);T_{0} [ns]', 800, -100, 100)
320 h['t0evt_R'] = H1('h_t0evt_bklm_rpc',
321 'Per-event T_{0} (BKLM RPC);T_{0} [ns]', 800, -100, 100)
322 h['t0evt_E'] = H1('h_t0evt_eklm_scint',
323 'Per-event T_{0} (EKLM Scint);T_{0} [ns]', 800, -100, 100)
324 h['t0evt_all'] = H1('h_t0evt_all',
325 'Per-event T_{0} (all KLM);T_{0} [ns]', 800, -100, 100)
326 h['final_source'] = H1I('h_final_source', 'Final KLM source;;events', 7, 0.5, 7.5)
327 for ib, lab in enumerate(['B only', 'E only', 'R only',
328 'B+E', 'B+R', 'E+R', 'B+E+R'], 1):
329 h['final_source'].GetXaxis().SetBinLabel(ib, lab)
330
331
332 f.mkdir('diagnostics').cd()
333 h['nhits_B'] = H1I('h_nhits_pertrk_bklm_scint',
334 'Hits per track (BKLM Scint);N_{hits}', 50, 0, 50)
335 h['nhits_E'] = H1I('h_nhits_pertrk_eklm_scint',
336 'Hits per track (EKLM Scint);N_{hits}', 50, 0, 50)
337 h['sem_B'] = H1('h_sem_pertrk_bklm_scint',
338 'SEM per track (BKLM Scint);SEM [ns]', 200, 0.0, 10.0)
339 h['sem_E'] = H1('h_sem_pertrk_eklm_scint',
340 'SEM per track (EKLM Scint);SEM [ns]', 200, 0.0, 10.0)
341 h['digitQ_B'] = H1('h_digitQ_bklm_scint',
342 'KLMDigit charge (BKLM Scint);ADC (a.u.)', 100, 0, 800)
343 h['digitQ_E'] = H1('h_digitQ_eklm_scint',
344 'KLMDigit charge (EKLM Scint);ADC (a.u.)', 100, 0, 800)
345 h['sample_type'] = H1I('h_sample_type', 'Sample type;;events', 2, 0.5, 2.5)
346 h['sample_type'].GetXaxis().SetBinLabel(1, 'Data')
347 h['sample_type'].GetXaxis().SetBinLabel(2, 'MC')
348
349
350 _timing_cfg = {
351 'B': ('BKLM Scint', -5000, -4000, -5000, -4000),
352 'R': ('BKLM RPC', -800, -500, -800, -500),
353 'E': ('EKLM Scint', -5000, -4000, -5000, -4000),
354 }
355 for key, (label, r0, r1, rc0, rc1) in _timing_cfg.items():
356 h[f'Trec_{key}'] = H1(f'h_Trec_{key.lower()}',
357 f'T_{{rec}} ({label});time [ns]', 800, r0, r1)
358 h[f'Tcable_{key}'] = H1(f'h_Tcable_{key.lower()}',
359 f'T_{{cable}} ({label});time [ns]', 800, rc0, rc1)
360 h[f'Tprop_{key}'] = H1(f'h_Tprop_{key.lower()}',
361 f'T_{{prop}} ({label});time [ns]', 800, -50, 50)
362 h[f'Tfly_{key}'] = H1(f'h_Tfly_{key.lower()}',
363 f'T_{{fly}} ({label});time [ns]', 800, -100, 100)
364
365
366 self._safe_cd(f, 'diagnostics')
367 h['dimuon_all'] = H1('h_dimuon_all',
368 'Dimuon #DeltaT_{0} (all KLM);T_{0}(#mu^{+})-T_{0}(#mu^{-}) [ns]',
369 400, -50, 50)
370 h['dimuon_B'] = H1('h_dimuon_bklm_scint',
371 'Dimuon #DeltaT_{0} (BKLM Scint);#DeltaT_{0} [ns]', 400, -50, 50)
372 h['dimuon_R'] = H1('h_dimuon_bklm_rpc',
373 'Dimuon #DeltaT_{0} (BKLM RPC);#DeltaT_{0} [ns]', 400, -50, 50)
374 h['dimuon_E'] = H1('h_dimuon_eklm_scint',
375 'Dimuon #DeltaT_{0} (EKLM Scint);#DeltaT_{0} [ns]', 400, -50, 50)
376 h['dimuon_scint'] = H1('h_dimuon_scint_only',
377 'Dimuon #DeltaT_{0} (Scint only);#DeltaT_{0} [ns]', 400, -50, 50)
378 h['dimuon_rpc'] = H1('h_dimuon_with_rpc',
379 'Dimuon #DeltaT_{0} (With RPC);#DeltaT_{0} [ns]', 400, -50, 50)
380 h['dimuon_rpcdir'] = H1('h_dimuon_with_rpc_dir',
381 'Dimuon #DeltaT_{0} (With RPC dir);#DeltaT_{0} [ns]', 400, -50, 50)
382
383
384 h['resolution'] = H1('h_per_track_resolution',
385 'Per-Track T_{0} Resolution (#sigma_{#DeltaT0}/#sqrt{2});'
386 'Category;Resolution [ns]', 6, 0.5, 6.5)
387 for ib, lab in enumerate(
388 ['BKLM Scint', 'BKLM RPC', 'EKLM Scint', 'Scint Only', 'With RPC', 'With RPC Dir'], 1):
389 h['resolution'].GetXaxis().SetBinLabel(ib, lab)
390
391
392 f.mkdir('pulls').cd()
393 h['pull_B'] = H1('h_pull_bklm_scint',
394 'Pull (BKLM Scint);(T_{0,i}-T_{0,j})/#sigma', 200, -10, 10)
395 h['pull_E'] = H1('h_pull_eklm_scint',
396 'Pull (EKLM Scint);(T_{0,i}-T_{0,j})/#sigma', 200, -10, 10)
397 h['pull_Rphi'] = H1('h_pull_rpc_phi',
398 'Pull (BKLM RPC Phi);(T_{0,i}-T_{0,j})/#sigma', 200, -10, 10)
399 h['pull_Rz'] = H1('h_pull_rpc_z',
400 'Pull (BKLM RPC Z);(T_{0,i}-T_{0,j})/#sigma', 200, -10, 10)
401 h['pull_R'] = H1('h_pull_bklm_rpc',
402 'Pull (BKLM RPC combined);(T_{0,i}-T_{0,j})/#sigma', 200, -10, 10)
403 h['pull_BvE'] = H1('h_pull_B_vs_E',
404 'Pull (BKLM Scint vs EKLM Scint);pull', 200, -10, 10)
405 h['pull_BvR'] = H1('h_pull_B_vs_R',
406 'Pull (BKLM Scint vs BKLM RPC);pull', 200, -10, 10)
407 h['pull_EvR'] = H1('h_pull_E_vs_R',
408 'Pull (EKLM Scint vs BKLM RPC);pull', 200, -10, 10)
409 h['pull_smean'] = H1('h_pull_summary_mean',
410 'Pull Mean;Category;#mu', 4, 0.5, 4.5)
411 h['pull_swidth'] = H1('h_pull_summary_width',
412 'Pull Sigma;Category;#sigma', 4, 0.5, 4.5)
413 for ib, lab in enumerate(['BKLM Scint', 'EKLM Scint', 'RPC Phi', 'RPC Z'], 1):
414 h['pull_smean'].GetXaxis().SetBinLabel(ib, lab)
415 h['pull_swidth'].GetXaxis().SetBinLabel(ib, lab)
416
417
418 h['ppw_B'] = self._book_pairwise(
419 f, 'pulls/sector/bklm_scint', 'h_pull_B_s{i}_vs_s{j}',
420 'BKLM Scint Pull: Sec {i} vs Sec {j};pull',
421 _N_BKLM_SECTORS, 200, -10, 10)
422 h['ppw_E'] = self._book_pairwise(
423 f, 'pulls/sector/eklm_scint_fwd_vs_bwd',
424 'h_pull_E_fwd{i}_vs_bwd{j}',
425 'EKLM Pull: Fwd Sec {i} vs Bwd Sec {j};pull',
426 _N_EKLM_SECTORS, 200, -10, 10, offset=1)
427 h['ppw_Rphi'] = self._book_pairwise(
428 f, 'pulls/sector/rpc_phi', 'h_pull_Rphi_s{i}_vs_s{j}',
429 'RPC Phi Pull: Sec {i} vs Sec {j};pull',
430 _N_BKLM_SECTORS, 200, -10, 10)
431
432 h['ppw_Rz'] = self._book_pairwise(
433 f, 'pulls/sector/rpc_z', 'h_pull_Rz_s{i}_vs_s{j}',
434 'RPC Z Pull: Sec {i} vs Sec {j};pull',
435 _N_BKLM_SECTORS, 200, -10, 10)
436
437
438 self._safe_cd(f, 'pulls/sector')
439 h['ppw_2d_B_mean'] = self._book_2d_summary(
440 'h2_pull_bklm_scint_mean', 'Pull Mean (BKLM Scint);Sec 1;Sec 2',
441 _N_BKLM_SECTORS)
442 h['ppw_2d_B_sigma'] = self._book_2d_summary(
443 'h2_pull_bklm_scint_sigma', 'Pull Sigma (BKLM Scint);Sec 1;Sec 2',
444 _N_BKLM_SECTORS)
445 h['ppw_2d_E_mean'] = self._book_2d_summary(
446 'h2_pull_eklm_fwd_bwd_mean', 'Pull Mean (EKLM Fwd vs Bwd);Fwd Sec;Bwd Sec',
447 _N_EKLM_SECTORS, lo=0.5)
448 h['ppw_2d_E_sigma'] = self._book_2d_summary(
449 'h2_pull_eklm_fwd_bwd_sigma', 'Pull Sigma (EKLM Fwd vs Bwd);Fwd Sec;Bwd Sec',
450 _N_EKLM_SECTORS, lo=0.5)
451 h['ppw_2d_Rphi_mean'] = self._book_2d_summary(
452 'h2_pull_rpc_phi_mean', 'Pull Mean (RPC Phi);Sec 1;Sec 2', _N_BKLM_SECTORS)
453 h['ppw_2d_Rphi_sigma'] = self._book_2d_summary(
454 'h2_pull_rpc_phi_sigma', 'Pull Sigma (RPC Phi);Sec 1;Sec 2', _N_BKLM_SECTORS)
455 h['ppw_2d_Rz_mean'] = self._book_2d_summary(
456 'h2_pull_rpc_z_mean', 'Pull Mean (RPC Z);Sec 1;Sec 2', _N_BKLM_SECTORS)
457 h['ppw_2d_Rz_sigma'] = self._book_2d_summary(
458 'h2_pull_rpc_z_sigma', 'Pull Sigma (RPC Z);Sec 1;Sec 2', _N_BKLM_SECTORS)
459
460
461 f.mkdir('residuals').cd()
462 h['res_B'] = H1('h_residual_bklm_scint',
463 'Residual (BKLM Scint);#DeltaT_{0} [ns]', 200, -50, 50)
464 h['res_E'] = H1('h_residual_eklm_scint',
465 'Residual (EKLM Scint);#DeltaT_{0} [ns]', 200, -50, 50)
466 h['res_Rphi'] = H1('h_residual_rpc_phi',
467 'Residual (BKLM RPC Phi);#DeltaT_{0} [ns]', 200, -50, 50)
468 h['res_Rz'] = H1('h_residual_rpc_z',
469 'Residual (BKLM RPC Z);#DeltaT_{0} [ns]', 200, -50, 50)
470 h['res_R'] = H1('h_residual_bklm_rpc',
471 'Residual (BKLM RPC combined);#DeltaT_{0} [ns]', 200, -50, 50)
472 h['res_BvE'] = H1('h_residual_B_vs_E',
473 'Residual BKLM Scint - EKLM Scint;#DeltaT_{0} [ns]', 200, -50, 50)
474 h['res_BvR'] = H1('h_residual_B_vs_R',
475 'Residual BKLM Scint - BKLM RPC;#DeltaT_{0} [ns]', 200, -50, 50)
476 h['res_EvR'] = H1('h_residual_E_vs_R',
477 'Residual EKLM Scint - BKLM RPC;#DeltaT_{0} [ns]', 200, -50, 50)
478 h['res_smean'] = H1('h_residual_summary_mean',
479 'Residual Mean;Category;#mu [ns]', 4, 0.5, 4.5)
480 h['res_swidth'] = H1('h_residual_summary_width',
481 'Residual Sigma;Category;#sigma [ns]', 4, 0.5, 4.5)
482 for ib, lab in enumerate(['BKLM Scint', 'EKLM Scint', 'RPC Phi', 'RPC Z'], 1):
483 h['res_smean'].GetXaxis().SetBinLabel(ib, lab)
484 h['res_swidth'].GetXaxis().SetBinLabel(ib, lab)
485
486
487 h['rpw_B'] = self._book_pairwise(
488 f, 'residuals/sector/bklm_scint', 'h_residual_B_s{i}_vs_s{j}',
489 'BKLM Scint Residual: Sec {i} vs Sec {j};#DeltaT_{{0}} [ns]',
490 _N_BKLM_SECTORS, 200, -50, 50)
491 h['rpw_E'] = self._book_pairwise(
492 f, 'residuals/sector/eklm_scint_fwd_vs_bwd',
493 'h_residual_E_fwd{i}_vs_bwd{j}',
494 'EKLM Residual: Fwd Sec {i} vs Bwd Sec {j};#DeltaT_{{0}} [ns]',
495 _N_EKLM_SECTORS, 200, -50, 50, offset=1)
496 h['rpw_Rphi'] = self._book_pairwise(
497 f, 'residuals/sector/rpc_phi', 'h_residual_Rphi_s{i}_vs_s{j}',
498 'RPC Phi Residual: Sec {i} vs Sec {j};#DeltaT_{{0}} [ns]',
499 _N_BKLM_SECTORS, 200, -50, 50)
500 h['rpw_Rz'] = self._book_pairwise(
501 f, 'residuals/sector/rpc_z', 'h_residual_Rz_s{i}_vs_s{j}',
502 'RPC Z Residual: Sec {i} vs Sec {j};#DeltaT_{{0}} [ns]',
503 _N_BKLM_SECTORS, 200, -50, 50)
504
505
506 self._safe_cd(f, 'residuals/sector')
507 h['rpw_2d_B_mean'] = self._book_2d_summary(
508 'h2_residual_bklm_scint_mean', 'Residual Mean (BKLM Scint);Sec 1;Sec 2',
509 _N_BKLM_SECTORS)
510 h['rpw_2d_B_sigma'] = self._book_2d_summary(
511 'h2_residual_bklm_scint_sigma', 'Residual Sigma (BKLM Scint);Sec 1;Sec 2',
512 _N_BKLM_SECTORS)
513 h['rpw_2d_E_mean'] = self._book_2d_summary(
514 'h2_residual_eklm_fwd_bwd_mean',
515 'Residual Mean (EKLM Fwd vs Bwd);Fwd Sec;Bwd Sec',
516 _N_EKLM_SECTORS, lo=0.5)
517 h['rpw_2d_E_sigma'] = self._book_2d_summary(
518 'h2_residual_eklm_fwd_bwd_sigma',
519 'Residual Sigma (EKLM Fwd vs Bwd);Fwd Sec;Bwd Sec',
520 _N_EKLM_SECTORS, lo=0.5)
521 h['rpw_2d_Rphi_mean'] = self._book_2d_summary(
522 'h2_residual_rpc_phi_mean', 'Residual Mean (RPC Phi);Sec 1;Sec 2',
523 _N_BKLM_SECTORS)
524 h['rpw_2d_Rphi_sigma'] = self._book_2d_summary(
525 'h2_residual_rpc_phi_sigma', 'Residual Sigma (RPC Phi);Sec 1;Sec 2',
526 _N_BKLM_SECTORS)
527 h['rpw_2d_Rz_mean'] = self._book_2d_summary(
528 'h2_residual_rpc_z_mean', 'Residual Mean (RPC Z);Sec 1;Sec 2',
529 _N_BKLM_SECTORS)
530 h['rpw_2d_Rz_sigma'] = self._book_2d_summary(
531 'h2_residual_rpc_z_sigma', 'Residual Sigma (RPC Z);Sec 1;Sec 2',
532 _N_BKLM_SECTORS)
533
534
535 f.mkdir('cross_detector').cd()
536 _reg_names = ['EKLM_Bwd', 'EKLM_Fwd', 'BKLM_RPC', 'BKLM_Scint']
537 _reg_labels = ['EKLM Backward', 'EKLM Forward', 'BKLM RPC', 'BKLM Scint']
538 h['dt0'] = {}
539 for ri in range(_N_REGIONS):
540 h['dt0'][ri] = {}
541 for rj in range(_N_REGIONS):
542 h['dt0'][ri][rj] = H1(
543 f'h_deltaT0_{_reg_names[ri]}_vs_{_reg_names[rj]}',
544 f'#DeltaT_{{0}}: {_reg_labels[ri]} vs {_reg_labels[rj]};'
545 f'#DeltaT_{{0}} [ns]', 200, -50, 50)
546 h['dt0_2d_mean'] = TH2D('h2_deltaT0_mean',
547 '#DeltaT_{0} Mean by Region;Region 1;Region 2',
548 _N_REGIONS, -0.5, _N_REGIONS - 0.5,
549 _N_REGIONS, -0.5, _N_REGIONS - 0.5)
550 h['dt0_2d_sigma'] = TH2D('h2_deltaT0_sigma',
551 '#DeltaT_{0} Sigma by Region;Region 1;Region 2',
552 _N_REGIONS, -0.5, _N_REGIONS - 0.5,
553 _N_REGIONS, -0.5, _N_REGIONS - 0.5)
554 h['dt0_2d_entries'] = TH2D('h2_deltaT0_entries',
555 '#DeltaT_{0} Entries by Region;Region 1;Region 2',
556 _N_REGIONS, -0.5, _N_REGIONS - 0.5,
557 _N_REGIONS, -0.5, _N_REGIONS - 0.5)
558 for ri, lab in enumerate(_reg_labels, 1):
559 for hh in (h['dt0_2d_mean'], h['dt0_2d_sigma'], h['dt0_2d_entries']):
560 hh.GetXaxis().SetBinLabel(ri, lab)
561 hh.GetYaxis().SetBinLabel(ri, lab)
562
563
564 f.mkdir('final').cd()
565 h['final_scint'] = H1('h_t0evt_final_scint_only',
566 'Final KLM T_{0} (Scint only);T_{0} [ns]', 800, -100, 100)
567 h['final_rpc'] = H1('h_t0evt_final_with_rpc',
568 'Final KLM T_{0} (Scint+RPC);T_{0} [ns]', 800, -100, 100)
569 h['final_rpcdir'] = H1('h_t0evt_final_with_rpc_dir',
570 'Final KLM T_{0} (Scint+RPC dir);T_{0} [ns]', 800, -100, 100)
571
572
573 self._prevent_gc()
574 f.cd()
575