12Generate alignment Monitoring Objects for Mirabelle
19from ROOT
import Belle2
27def get_means(payload):
32 for par
in range(1, 7):
36 for shell
in pxd_shells:
37 v = payload.get(shell.getID(), par)
39 v = v * 1e3
if par
in [4, 5, 6]
else v * 1e4
42 for shell
in svd_shells:
43 v = payload.get(shell.getID(), par)
45 v = v * 1e3
if par
in [4, 5, 6]
else v * 1e4
48 param_name = {1:
"x", 2:
"y", 3:
"z", 4:
"alpha", 5:
"beta", 6:
"gamma"}[par]
49 means[f
"pxd_{param_name}"] = np.mean(pxd_values)
if pxd_values
else 0.0
50 means[f
"svd_{param_name}"] = np.mean(svd_values)
if svd_values
else 0.0
51 means[f
"vxd_{param_name}"] = np.mean(vxd_values)
if vxd_values
else 0.0
55def create_output_file(exp, run, means, out_dir):
57 mon = ROOT.Belle2.MonitoringObject(
"vxd_alignment")
58 for name, value
in means.items():
59 mon.setVariable(name, float(value))
60 meta = ROOT.Belle2.DQMFileMetaData()
61 meta.setExperimentRun(exp, run)
62 if not os.path.exists(out_dir):
64 out_file_path = os.path.join(out_dir, f
"mon_exp{exp:03d}_run{run:06d}.root")
65 out_file = ROOT.TFile(out_file_path,
"RECREATE")
69 print(f
"Created {out_file_path}")
73 print(
"Usage: python merged_code.py <input_path> <output_dir>")
76input_path = sys.argv[1]
77output_dir = sys.argv[2]
80database_file = os.path.join(input_path,
"database.txt")
81if not os.path.exists(database_file):
82 print(f
"Error: {database_file} not found.")
85with open(database_file,
"r")
as db_file:
86 database_lines = db_file.readlines()
90for line
in database_lines:
91 match = re.match(
r"dbstore/VXDAlignment\s+([A-Za-z0-9]{4})\s+(\d+),(\d+),(\d+),(\d+)", line.strip())
94 exp1 = int(match.group(2))
95 start_run = int(match.group(3))
96 exp2 = int(match.group(4))
97 end_run = int(match.group(5))
98 database_dict[rev] = (exp1, start_run, exp2, end_run)
101root_files = glob(os.path.join(input_path,
"dbstore_VXDAlignment_rev_*.root"))
102for root_file
in root_files:
103 match = re.search(
r"dbstore_VXDAlignment_rev_([A-Za-z0-9]{4})\.root", root_file)
105 print(f
"Couldn't find a rev from file name: {root_file}")
108 if rev
not in database_dict:
109 print(f
"No database entry found for rev: {rev}")
112 exp1, start_run, exp2, end_run = database_dict[rev]
114 print(f
"Warning: exp1 ({exp1}) differs from exp2 ({exp2}) for rev {rev}. Using exp1.")
117 f = ROOT.TFile.Open(root_file)
118 if not f
or not f.IsOpen():
119 print(f
"error: unable to open ROOT file: {root_file}")
121 payload = f.Get(
"VXDAlignment")
123 print(f
"error: VXDAlignment not found in {root_file}")
128 means = get_means(payload)
132 for run
in range(start_run, end_run + 1):
133 create_output_file(exp, run, means, output_dir)
135print(f
" Done! all ROOT files created in {output_dir}")
Class to uniquely identify a any structure of the PXD and SVD.