Belle II Software development
caf_ecl_cluster_energy.py
1
8
9"""ECL cluster crystal energy calibration using single photon MCrd."""
10
11from prompt import CalibrationSettings, INPUT_DATA_FILTERS
12
13# --------------------------------------------------------------
14# ..Tell the automated script some required details
15settings = CalibrationSettings(
16 name="ecl_cluster_energy",
17 expert_username="hearty",
18 subsystem="ecl",
19 description=__doc__,
20 input_data_formats=["mdst"],
21 input_data_names=["single_gamma_mc"],
22 input_data_filters={"single_gamma_mc": [INPUT_DATA_FILTERS["Data Tag"]["single_gamma_mc"]]},
23 depends_on=[],
24
25 # ..The expert_config settings should agree with the parameters of the jobs used
26 # to create the single_gamma_mc samples.
27 # Number of energy points, and the values of these for each of the three ECL regions.
28 # The mc samples include a reduced set of showers and CalDigits, with these names.
29 expert_config={"number_energies": 8,
30 "forward_energies": [0.030, 0.050, 0.100, 0.200, 0.483, 1.166, 2.816, 6.800],
31 "barrel_energies": [0.030, 0.050, 0.100, 0.200, 0.458, 1.049, 2.402, 5.500],
32 "backward_energies": [0.030, 0.050, 0.100, 0.200, 0.428, 0.917, 1.962, 4.200],
33 "digitArrayName": "ECLTrimmedDigits",
34 "showerArrayName": "ECLTrimmedShowers",
35 "nGroupPerThetaID": 8,
36 "lowEnergyThreshold": 0.04,
37 "max_subjobs": 10},
38 produced_payloads=["ECLnOptimal", "ECLLeakageCorrections"])
39
40#
41# --------------------------------------------------------------
42# ..The calibration functions
43
44
45def get_calibrations(input_data, **kwargs):
46 import basf2
47 from ROOT import Belle2
48 from caf.utils import IoV
49 from caf.framework import Calibration
50
51 # --------------------------------------------------------------
52 # ..Input data, same for both calibrations
53 file_to_iov = input_data["single_gamma_mc"]
54 input_files_single_gamma = list(file_to_iov.keys())
55
56 # --------------------------------------------------------------
57 # ..nOptimal calibration first
58
59 # ..eclNOptimal collector
60 ecl_nOptimal_collector = basf2.register_module("eclNOptimalCollector")
61 ecl_nOptimal_collector.param("granularity", "all")
62
63 # ..Number of energy points and their values can be set via expert_config
64 expert_config = kwargs.get("expert_config")
65 number_energies = expert_config["number_energies"]
66 ecl_nOptimal_collector.param("numberEnergies", number_energies)
67
68 forward_energies = expert_config["forward_energies"]
69 ecl_nOptimal_collector.param("energiesForward", forward_energies)
70
71 barrel_energies = expert_config["barrel_energies"]
72 ecl_nOptimal_collector.param("energiesBarrel", barrel_energies)
73
74 backward_energies = expert_config["backward_energies"]
75 ecl_nOptimal_collector.param("energiesBackward", backward_energies)
76
77 digitArrayName = expert_config["digitArrayName"]
78 ecl_nOptimal_collector.param("digitArrayName", digitArrayName)
79
80 showerArrayName = expert_config["showerArrayName"]
81 ecl_nOptimal_collector.param("showerArrayName", showerArrayName)
82
83 nGroupPerThetaID = expert_config["nGroupPerThetaID"]
84 ecl_nOptimal_collector.param("nGroupPerThetaID", nGroupPerThetaID)
85
86 # ..eclNOptimal algorithm
87 algo_nOptimal = Belle2.ECL.eclNOptimalAlgorithm()
88
89 # ..The calibration
90 cal_ecl_nOptimal = Calibration(
91 name="ecl_nOptimal",
92 collector=ecl_nOptimal_collector,
93 algorithms=algo_nOptimal,
94 input_files=input_files_single_gamma)
95
96 # Set max subjobs
97 cal_ecl_nOptimal.max_subjobs = expert_config["max_subjobs"]
98
99 # ..pre_path is empty
100 ecl_nOptimal_pre_path = basf2.create_path()
101 cal_ecl_nOptimal.pre_collector_path = ecl_nOptimal_pre_path
102
103 # --------------------------------------------------------------
104 # ..Leakage correction, which depends on nOptimal
105
106 # ..eclLeakage collector
107 ecl_leakage_collector = basf2.register_module("eclLeakageCollector")
108 ecl_leakage_collector.param("granularity", "all")
109 ecl_leakage_collector.param("position_bins", 29)
110
111 # ..Number of energy points and their values can be set via expert_config
112 ecl_leakage_collector.param("number_energies", number_energies)
113 ecl_leakage_collector.param("energies_forward", forward_energies)
114 ecl_leakage_collector.param("energies_barrel", barrel_energies)
115 ecl_leakage_collector.param("energies_backward", backward_energies)
116 ecl_leakage_collector.param("showerArrayName", showerArrayName)
117
118 # ..eclLeakage algorithm
119 algo_leakage = Belle2.ECL.eclLeakageAlgorithm()
120 lowEnergyThreshold = expert_config["lowEnergyThreshold"]
121 algo_leakage.setLowEnergyThreshold(lowEnergyThreshold)
122
123 # ..The calibration
124 cal_ecl_leakage = Calibration(
125 name="ecl_leakage",
126 collector=ecl_leakage_collector,
127 algorithms=algo_leakage,
128 input_files=input_files_single_gamma)
129
130 # Set max subjobs
131 cal_ecl_leakage.max_subjobs = expert_config["max_subjobs"]
132
133 # ..Depends on nOptimal
134 cal_ecl_leakage.depends_on(cal_ecl_nOptimal)
135
136 # ..pre_path is empty
137 ecl_leakage_pre_path = basf2.create_path()
138 cal_ecl_leakage.pre_collector_path = ecl_leakage_pre_path
139
140 # --------------------------------------------------------------
141 # ..Force the output iovs to be open
142 requested_iov = kwargs.get("requested_iov", None)
143 output_iov = IoV(requested_iov.exp_low, requested_iov.run_low, -1, -1)
144 for algorithm in cal_ecl_nOptimal.algorithms:
145 algorithm.params = {"apply_iov": output_iov}
146 for algorithm in cal_ecl_leakage.algorithms:
147 algorithm.params = {"apply_iov": output_iov}
148
149 # --------------------------------------------------------------
150 # ..Return the calibrations
151 return [cal_ecl_nOptimal, cal_ecl_leakage]
Calculate ECL energy leakage corrections.
Algorithm that works with eclNOptimalCollector to find the number of crystals to be summed to get the...