9"""A complicated example calibration that takes several input data lists from raw data and performs
10multiple calibrations. Only the second calibration will have its payloads placed into the final
11outputdb directory by b2caf-prompt-run.
13We make it so that this calibration depends on the result of a completely
14different one 'example_simple'. Even though that calibration will not be run in this process, the automated
15system can discover this dependency and use it when submitting tasks."""
17from prompt
import CalibrationSettings, INPUT_DATA_FILTERS
29from prompt.calibrations.example_simple
import settings
as example_simple
32settings = CalibrationSettings(name=
"Example Complex",
33 expert_username=
"ddossett",
36 input_data_formats=[
"raw"],
37 input_data_names=[
"physics",
"cosmics",
"Bcosmics"],
38 input_data_filters={
"physics": [f
"NOT {INPUT_DATA_FILTERS['Magnet']['On']}",
39 INPUT_DATA_FILTERS[
"Data Tag"][
"hadron_calib"],
40 INPUT_DATA_FILTERS[
"Data Quality Tag"][
"Good"],
41 INPUT_DATA_FILTERS[
"Beam Energy"][
"4S"],
42 INPUT_DATA_FILTERS[
"Run Type"][
"physics"]],
43 "cosmics": [INPUT_DATA_FILTERS[
'Magnet'][
'Off'],
44 INPUT_DATA_FILTERS[
"Data Tag"][
"cosmic_calib"],
45 INPUT_DATA_FILTERS[
"Data Quality Tag"][
"Bad For Alignment"],
46 INPUT_DATA_FILTERS[
"Beam Energy"][
"Continuum"],
47 f
"NOT {INPUT_DATA_FILTERS['Run Type']['physics']}"],
48 "Bcosmics": [INPUT_DATA_FILTERS[
"Data Tag"][
"cosmic_calib"],
49 INPUT_DATA_FILTERS[
"Data Quality Tag"][
"Good"],
50 INPUT_DATA_FILTERS[
"Beam Energy"][
"4S"]]},
51 depends_on=[example_simple],
53 "physics_prescale": 0.2,
54 "max_events_per_file": 100,
55 "max_files_per_run": 2,
56 "payload_boundaries": []
78def get_calibrations(input_data, **kwargs):
81 input_data (dict): Should contain every name from the 'input_data_names' variable as a key.
82 Each value is a dictionary with {"/path/to/file_e1_r5.root": IoV(1,5,1,5), ...}. Useful for
83 assigning to calibration.files_to_iov
85 **kwargs: Configuration options to be sent in. Since this may change we use kwargs as a way to help prevent
86 backwards compatibility problems. But you could use the correct arguments in b2caf-prompt-run for this
87 release explicitly if you want to.
89 Currently only kwargs["requested_iov"] and kwargs["expert_config"] are used.
91 "requested_iov" is the IoV range of the bucket and your payloads should correspond to this range.
92 However your highest payload IoV should be open ended e.g. IoV(3,4,-1,-1)
94 "expert_config" is the input configuration. It takes default values from your `CalibrationSettings` but these are
95 overwritten by values from the 'expert_config' key in your input `caf_config.json` file when running ``b2caf-prompt-run``.
98 list(caf.framework.Calibration): All of the calibration objects we want to assign to the CAF process
102 from basf2
import register_module, create_path
103 from ROOT
import Belle2
104 from ROOT.Belle2
import TestCalibrationAlgorithm, TestBoundarySettingAlgorithm
105 from caf.framework
import Calibration, Collection
106 from caf.strategies
import SequentialBoundaries
107 from caf.utils
import vector_from_runs, ExpRun, IoV
113 file_to_iov_physics = input_data[
"physics"]
114 file_to_iov_cosmics = input_data[
"cosmics"]
115 file_to_iov_Bcosmics = input_data[
"Bcosmics"]
120 expert_config = kwargs.get(
"expert_config")
121 max_files_per_run = expert_config[
"max_files_per_run"]
122 basf2.B2INFO(f
"Reducing to a maximum of {max_files_per_run} files per run.")
128 reduced_file_to_iov_physics = filter_by_max_files_per_run(file_to_iov_physics, max_files_per_run)
129 input_files_physics = list(reduced_file_to_iov_physics.keys())
130 basf2.B2INFO(f
"Total number of physics files actually used as input = {len(input_files_physics)}")
132 reduced_file_to_iov_cosmics = filter_by_max_files_per_run(file_to_iov_cosmics, max_files_per_run)
133 input_files_cosmics = list(reduced_file_to_iov_cosmics.keys())
134 basf2.B2INFO(f
"Total number of cosmics files actually used as input = {len(input_files_cosmics)}")
136 reduced_file_to_iov_Bcosmics = filter_by_max_files_per_run(file_to_iov_Bcosmics, max_files_per_run)
137 input_files_Bcosmics = list(reduced_file_to_iov_Bcosmics.keys())
138 basf2.B2INFO(f
"Total number of Bcosmics files actually used as input = {len(input_files_Bcosmics)}")
142 requested_iov = kwargs.get(
"requested_iov",
None)
145 output_iov = IoV(requested_iov.exp_low, requested_iov.run_low, -1, -1)
150 col_test_physics = register_module(
"CaTest")
153 col_test_physics.param(
"granularity",
"run")
154 col_test_physics.param(
"spread", 4)
156 col_test_Bcosmics = register_module(
"CaTest")
157 col_test_Bcosmics.param(
"granularity",
"all")
158 col_test_Bcosmics.param(
"spread", 1)
160 col_test_cosmics = register_module(
"CaTest")
161 col_test_cosmics.param(
"granularity",
"all")
162 col_test_cosmics.param(
"spread", 10)
171 max_events = expert_config[
"max_events_per_file"]
172 root_input = register_module(
"RootInput",
173 entrySequences=[f
"0:{max_events}"]
181 prescale = expert_config[
"physics_prescale"]
182 prescale_mod = register_module(
"Prescale", prescale=prescale)
183 empty_path = create_path()
184 prescale_mod.if_false(empty_path, basf2.AfterConditionPath.END)
186 rec_path_physics = create_path()
187 rec_path_physics.add_module(root_input)
188 rec_path_physics.add_module(prescale_mod)
191 rec_path_cosmics = create_path()
192 rec_path_cosmics.add_module(root_input)
195 rec_path_Bcosmics = create_path()
196 rec_path_Bcosmics.add_module(root_input)
202 alg_test1 = TestCalibrationAlgorithm()
203 alg_test2 = TestBoundarySettingAlgorithm()
214 payload_boundaries = [ExpRun(output_iov.exp_low, output_iov.run_low)]
217 payload_boundaries.extend([ExpRun(*boundary)
for boundary
in expert_config[
"payload_boundaries"]])
218 basf2.B2INFO(f
"Expert set payload boundaries are: {expert_config['payload_boundaries']}")
220 alg_test2.setBoundaries(vector_from_runs(payload_boundaries))
227 collection_physics =
Collection(collector=col_test_physics,
228 input_files=input_files_physics,
229 pre_collector_path=rec_path_physics,
233 collection_cosmics =
Collection(collector=col_test_cosmics,
234 input_files=input_files_cosmics,
235 pre_collector_path=rec_path_cosmics,
239 collection_Bcosmics =
Collection(collector=col_test_Bcosmics,
240 input_files=input_files_Bcosmics,
241 pre_collector_path=rec_path_Bcosmics,
253 cal_test1 = Calibration(
"TestCalibration_cosmics")
255 cal_test1.add_collection(name=
"cosmics", collection=collection_cosmics)
256 cal_test1.add_collection(name=
"Bcosmics", collection=collection_Bcosmics)
257 cal_test1.algorithms = [alg_test1]
259 cal_test1.algorithms[0].params = {
"apply_iov": output_iov}
261 cal_test1.save_payloads =
False
263 cal_test2 = Calibration(
"TestCalibration_physics")
265 cal_test2.add_collection(name=
"physics", collection=collection_physics)
266 cal_test2.algorithms = [alg_test2]
268 cal_test2.strategies = SequentialBoundaries
270 cal_test2.algorithms[0].params[
"iov_coverage"] = output_iov
272 cal_test2.depends_on(cal_test1)
275 return [cal_test1, cal_test2]