Belle II Software development
run_pulseHeight_calibration_laser.py
1#!/usr/bin/env python3
2
3
10
11# ---------------------------------------------------------------------------------------
12# CAF calibration script: pulse height distributions and threshold efficiencies
13# data type: local runs with laser
14#
15# usage: basf2 run_pulseHeight_calibration_laser.py expNo -- --runs 'run_1 run_2 ...' [OPTIONS]
16# ---------------------------------------------------------------------------------------
17
18import argparse
19import sys
20from os import makedirs
21import glob
22from caf import backends
23from caf.framework import CAF
24from basf2 import B2ERROR
25from top_calibration import pulseHeight_calibration_laser
26
27
28# Command line argument parser
29parser = argparse.ArgumentParser()
30parser.add_argument('exp')
31parser.add_argument('--runs')
32parser.add_argument('--main_output_dir', default='top_pulse_height_calibration')
33parser.add_argument('--look_back', type=int, default=28)
34parser.add_argument('--t_min', type=float, default=-60.)
35parser.add_argument('--t_max', type=float, default=-10.)
36parser.add_argument('--source_dir', default='/ghi/fs01/belle2/bdata/group/detector/TOP/current_data_sroot_global')
37parser.add_argument(
38 '--localDBs',
39 default='/group/belle2/group/detector/TOP/calibration/TBC/official/TBC_2025c_Nov25/localDB/localDB.txt',
40 type=str
41)
42args = parser.parse_args()
43
44
45# ----- These parameters may need to be adjusted --------------------
46#
47# globalTags = ['data_reprocessing_proc11', 'data_reprocessing_prompt'] # highest priority first
48# globalTags = ['data_reprocessing_prompt', 'online'] # highest priority first
49globalTags = ['online']
50localDBs = args.localDBs.split()
51
52data_dir = args.source_dir
53main_output_dir = args.main_output_dir
54look_back = args.look_back # look-back window setting (set to 0 if look-back setting available in DB)
55t_min = args.t_min # lower edge of time window to select laser signal [ns]
56t_max = args.t_max # upper edge of time window to select laser signal [ns]
57
58# -------------------------------------------------------------------
59
60# Argument parsing
61experiment = int(args.exp)
62runs = args.runs.split(' ')
63run_numbers = sorted([int(r) for r in runs])
64run_first = run_numbers[0]
65run_last = run_numbers[-1]
66
67# Make list of files
68inputFiles = []
69expNo = f"e{experiment:04d}"
70
71for run in run_numbers:
72 expRun = f"{experiment:04d}.{run:05d}"
73 filename = f"{data_dir}/top.{expRun}.*.root"
74 # filename = f"{data_dir}/top.{expRun}.*.root"
75 print(filename)
76 inputFiles += glob.glob(filename)
77
78if len(inputFiles) == 0:
79 runs = "".join([str(r) + "," for r in run_numbers])[:-1]
80 B2ERROR(f'No root files found in {data_dir} for exp={str(experiment)} runs={runs}')
81 sys.exit()
82
83# Output folder name
84run_range = f"r{run_first:05d}-{run_last:05d}"
85output_dir = f"{main_output_dir}/pulseHeight-laser-{expNo}-{run_range}"
86makedirs(output_dir, exist_ok=True)
87
88# Define calibration
89cal = pulseHeight_calibration_laser(inputFiles, t_min, t_max, look_back, globalTags, localDBs)
90# cal.backend_args = {"queue": "s"}
91
92# Add calibration to CAF
93cal_fw = CAF()
94cal_fw.add_calibration(cal)
95cal_fw.output_dir = output_dir
96cal_fw.backend = backends.LSF() # at KEKCC
97# cal_fw.backend = backends.HTCondor() # at NAF
98
99# Run calibration
100cal_fw.run()