3 """A complicated example calibration that takes several input data lists from raw data and performs
4 multiple calibrations. Only the second calibration will have its payloads placed into the final
5 outputdb directory by b2caf-prompt-run.
7 We make it so that this calibration depends on the result of a completely
8 different one 'example_simple'. Even though that calibration will not be run in this process, the automated
9 system can discover this dependency and use it when submitting tasks."""
11 from prompt
import CalibrationSettings
23 from prompt.calibrations.example_simple
import settings
as example_simple
26 settings = CalibrationSettings(name=
"Example Complex",
27 expert_username=
"ddossett",
29 input_data_formats=[
"raw"],
30 input_data_names=[
"physics",
"cosmics",
"Bcosmics"],
31 depends_on=[example_simple],
33 "physics_prescale": 0.2,
34 "max_events_per_file": 100,
35 "max_files_per_run": 2,
36 "payload_boundaries": []
57 def get_calibrations(input_data, **kwargs):
60 input_data (dict): Should contain every name from the 'input_data_names' variable as a key.
61 Each value is a dictionary with {"/path/to/file_e1_r5.root": IoV(1,5,1,5), ...}. Useful for
62 assigning to calibration.files_to_iov
64 **kwargs: Configuration options to be sent in. Since this may change we use kwargs as a way to help prevent
65 backwards compatibility problems. But you could use the correct arguments in b2caf-prompt-run for this
66 release explicitly if you want to.
68 Currently only kwargs["requested_iov"] and kwargs["expert_config"] are used.
70 "requested_iov" is the IoV range of the bucket and your payloads should correspond to this range.
71 However your highest payload IoV should be open ended e.g. IoV(3,4,-1,-1)
73 "expert_config" is the input configuration. It takes default values from your `CalibrationSettings` but these are
74 overwritten by values from the 'expert_config' key in your input `caf_config.json` file when running ``b2caf-prompt-run``.
77 list(caf.framework.Calibration): All of the calibration objects we want to assign to the CAF process
81 from basf2
import register_module, create_path
82 from ROOT.Belle2
import TestCalibrationAlgorithm, TestBoundarySettingAlgorithm
83 from caf.framework
import Calibration, Collection
84 from caf.strategies
import SequentialBoundaries
85 from caf.utils
import vector_from_runs, ExpRun, IoV
91 file_to_iov_physics = input_data[
"physics"]
92 file_to_iov_cosmics = input_data[
"cosmics"]
93 file_to_iov_Bcosmics = input_data[
"Bcosmics"]
98 expert_config = kwargs.get(
"expert_config")
99 max_files_per_run = expert_config[
"max_files_per_run"]
100 basf2.B2INFO(f
"Reducing to a maximum of {max_files_per_run} files per run.")
106 reduced_file_to_iov_physics = filter_by_max_files_per_run(file_to_iov_physics, max_files_per_run)
107 input_files_physics = list(reduced_file_to_iov_physics.keys())
108 basf2.B2INFO(f
"Total number of physics files actually used as input = {len(input_files_physics)}")
110 reduced_file_to_iov_cosmics = filter_by_max_files_per_run(file_to_iov_cosmics, max_files_per_run)
111 input_files_cosmics = list(reduced_file_to_iov_cosmics.keys())
112 basf2.B2INFO(f
"Total number of cosmics files actually used as input = {len(input_files_cosmics)}")
114 reduced_file_to_iov_Bcosmics = filter_by_max_files_per_run(file_to_iov_Bcosmics, max_files_per_run)
115 input_files_Bcosmics = list(reduced_file_to_iov_Bcosmics.keys())
116 basf2.B2INFO(f
"Total number of Bcosmics files actually used as input = {len(input_files_Bcosmics)}")
120 requested_iov = kwargs.get(
"requested_iov",
None)
123 output_iov = IoV(requested_iov.exp_low, requested_iov.run_low, -1, -1)
128 col_test_physics = register_module(
"CaTest")
131 col_test_physics.param(
"granularity",
"run")
132 col_test_physics.param(
"spread", 4)
134 col_test_Bcosmics = register_module(
"CaTest")
135 col_test_Bcosmics.param(
"granularity",
"all")
136 col_test_Bcosmics.param(
"spread", 1)
138 col_test_cosmics = register_module(
"CaTest")
139 col_test_cosmics.param(
"granularity",
"all")
140 col_test_cosmics.param(
"spread", 10)
149 max_events = expert_config[
"max_events_per_file"]
150 root_input = register_module(
"RootInput",
151 entrySequences=[f
"0:{max_events}"]
159 prescale = expert_config[
"physics_prescale"]
160 prescale_mod = register_module(
"Prescale", prescale=prescale)
161 empty_path = create_path()
162 prescale_mod.if_false(empty_path, basf2.AfterConditionPath.END)
164 rec_path_physics = create_path()
165 rec_path_physics.add_module(root_input)
166 rec_path_physics.add_module(prescale_mod)
169 rec_path_cosmics = create_path()
170 rec_path_cosmics.add_module(root_input)
173 rec_path_Bcosmics = create_path()
174 rec_path_Bcosmics.add_module(root_input)
180 alg_test1 = TestCalibrationAlgorithm()
181 alg_test2 = TestBoundarySettingAlgorithm()
192 payload_boundaries = [ExpRun(output_iov.exp_low, output_iov.run_low)]
195 payload_boundaries.extend([ExpRun(*boundary)
for boundary
in expert_config[
"payload_boundaries"]])
196 basf2.B2INFO(f
"Expert set payload boundaries are: {expert_config['payload_boundaries']}")
198 alg_test2.setBoundaries(vector_from_runs(payload_boundaries))
205 collection_physics =
Collection(collector=col_test_physics,
206 input_files=input_files_physics,
207 pre_collector_path=rec_path_physics,
211 collection_cosmics =
Collection(collector=col_test_cosmics,
212 input_files=input_files_cosmics,
213 pre_collector_path=rec_path_cosmics,
217 collection_Bcosmics =
Collection(collector=col_test_Bcosmics,
218 input_files=input_files_Bcosmics,
219 pre_collector_path=rec_path_Bcosmics,
233 cal_test1.add_collection(name=
"cosmics", collection=collection_cosmics)
234 cal_test1.add_collection(name=
"Bcosmics", collection=collection_Bcosmics)
235 cal_test1.algorithms = [alg_test1]
237 cal_test1.algorithms[0].params = {
"apply_iov": output_iov}
239 cal_test1.save_payloads =
False
243 cal_test2.add_collection(name=
"physics", collection=collection_physics)
244 cal_test2.algorithms = [alg_test2]
246 cal_test2.strategies = SequentialBoundaries
248 cal_test2.algorithms[0].params[
"iov_coverage"] = output_iov
250 cal_test2.depends_on(cal_test1)
253 return [cal_test1, cal_test2]