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, input_data_filters
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 input_data_filters={
"physics": [f
"NOT {input_data_filters['Magnet']['On']}",
32 input_data_filters[
"Data Tag"][
"hadron_calib"],
33 input_data_filters[
"Data Quality Tag"][
"Good"],
34 input_data_filters[
"Beam Energy"][
"4S"],
35 input_data_filters[
"Run Type"][
"physics"]],
36 "cosmics": [input_data_filters[
'Magnet'][
'Off'],
37 input_data_filters[
"Data Tag"][
"cosmic_calib"],
38 input_data_filters[
"Data Quality Tag"][
"Bad For Alignment"],
39 input_data_filters[
"Beam Energy"][
"Continuum"],
40 f
"NOT {input_data_filters['Run Type']['physics']}"],
41 "Bcosmics": [input_data_filters[
"Data Tag"][
"cosmic_calib"],
42 input_data_filters[
"Data Quality Tag"][
"Good"],
43 input_data_filters[
"Beam Energy"][
"4S"]]},
44 depends_on=[example_simple],
46 "physics_prescale": 0.2,
47 "max_events_per_file": 100,
48 "max_files_per_run": 2,
49 "payload_boundaries": []
70 def get_calibrations(input_data, **kwargs):
73 input_data (dict): Should contain every name from the 'input_data_names' variable as a key.
74 Each value is a dictionary with {"/path/to/file_e1_r5.root": IoV(1,5,1,5), ...}. Useful for
75 assigning to calibration.files_to_iov
77 **kwargs: Configuration options to be sent in. Since this may change we use kwargs as a way to help prevent
78 backwards compatibility problems. But you could use the correct arguments in b2caf-prompt-run for this
79 release explicitly if you want to.
81 Currently only kwargs["requested_iov"] and kwargs["expert_config"] are used.
83 "requested_iov" is the IoV range of the bucket and your payloads should correspond to this range.
84 However your highest payload IoV should be open ended e.g. IoV(3,4,-1,-1)
86 "expert_config" is the input configuration. It takes default values from your `CalibrationSettings` but these are
87 overwritten by values from the 'expert_config' key in your input `caf_config.json` file when running ``b2caf-prompt-run``.
90 list(caf.framework.Calibration): All of the calibration objects we want to assign to the CAF process
94 from basf2
import register_module, create_path
95 from ROOT.Belle2
import TestCalibrationAlgorithm, TestBoundarySettingAlgorithm
96 from caf.framework
import Calibration, Collection
97 from caf.strategies
import SequentialBoundaries
98 from caf.utils
import vector_from_runs, ExpRun, IoV
104 file_to_iov_physics = input_data[
"physics"]
105 file_to_iov_cosmics = input_data[
"cosmics"]
106 file_to_iov_Bcosmics = input_data[
"Bcosmics"]
111 expert_config = kwargs.get(
"expert_config")
112 max_files_per_run = expert_config[
"max_files_per_run"]
113 basf2.B2INFO(f
"Reducing to a maximum of {max_files_per_run} files per run.")
119 reduced_file_to_iov_physics = filter_by_max_files_per_run(file_to_iov_physics, max_files_per_run)
120 input_files_physics = list(reduced_file_to_iov_physics.keys())
121 basf2.B2INFO(f
"Total number of physics files actually used as input = {len(input_files_physics)}")
123 reduced_file_to_iov_cosmics = filter_by_max_files_per_run(file_to_iov_cosmics, max_files_per_run)
124 input_files_cosmics = list(reduced_file_to_iov_cosmics.keys())
125 basf2.B2INFO(f
"Total number of cosmics files actually used as input = {len(input_files_cosmics)}")
127 reduced_file_to_iov_Bcosmics = filter_by_max_files_per_run(file_to_iov_Bcosmics, max_files_per_run)
128 input_files_Bcosmics = list(reduced_file_to_iov_Bcosmics.keys())
129 basf2.B2INFO(f
"Total number of Bcosmics files actually used as input = {len(input_files_Bcosmics)}")
133 requested_iov = kwargs.get(
"requested_iov",
None)
136 output_iov = IoV(requested_iov.exp_low, requested_iov.run_low, -1, -1)
141 col_test_physics = register_module(
"CaTest")
144 col_test_physics.param(
"granularity",
"run")
145 col_test_physics.param(
"spread", 4)
147 col_test_Bcosmics = register_module(
"CaTest")
148 col_test_Bcosmics.param(
"granularity",
"all")
149 col_test_Bcosmics.param(
"spread", 1)
151 col_test_cosmics = register_module(
"CaTest")
152 col_test_cosmics.param(
"granularity",
"all")
153 col_test_cosmics.param(
"spread", 10)
162 max_events = expert_config[
"max_events_per_file"]
163 root_input = register_module(
"RootInput",
164 entrySequences=[f
"0:{max_events}"]
172 prescale = expert_config[
"physics_prescale"]
173 prescale_mod = register_module(
"Prescale", prescale=prescale)
174 empty_path = create_path()
175 prescale_mod.if_false(empty_path, basf2.AfterConditionPath.END)
177 rec_path_physics = create_path()
178 rec_path_physics.add_module(root_input)
179 rec_path_physics.add_module(prescale_mod)
182 rec_path_cosmics = create_path()
183 rec_path_cosmics.add_module(root_input)
186 rec_path_Bcosmics = create_path()
187 rec_path_Bcosmics.add_module(root_input)
193 alg_test1 = TestCalibrationAlgorithm()
194 alg_test2 = TestBoundarySettingAlgorithm()
205 payload_boundaries = [ExpRun(output_iov.exp_low, output_iov.run_low)]
208 payload_boundaries.extend([ExpRun(*boundary)
for boundary
in expert_config[
"payload_boundaries"]])
209 basf2.B2INFO(f
"Expert set payload boundaries are: {expert_config['payload_boundaries']}")
211 alg_test2.setBoundaries(vector_from_runs(payload_boundaries))
218 collection_physics =
Collection(collector=col_test_physics,
219 input_files=input_files_physics,
220 pre_collector_path=rec_path_physics,
224 collection_cosmics =
Collection(collector=col_test_cosmics,
225 input_files=input_files_cosmics,
226 pre_collector_path=rec_path_cosmics,
230 collection_Bcosmics =
Collection(collector=col_test_Bcosmics,
231 input_files=input_files_Bcosmics,
232 pre_collector_path=rec_path_Bcosmics,
246 cal_test1.add_collection(name=
"cosmics", collection=collection_cosmics)
247 cal_test1.add_collection(name=
"Bcosmics", collection=collection_Bcosmics)
248 cal_test1.algorithms = [alg_test1]
250 cal_test1.algorithms[0].params = {
"apply_iov": output_iov}
252 cal_test1.save_payloads =
False
256 cal_test2.add_collection(name=
"physics", collection=collection_physics)
257 cal_test2.algorithms = [alg_test2]
259 cal_test2.strategies = SequentialBoundaries
261 cal_test2.algorithms[0].params[
"iov_coverage"] = output_iov
263 cal_test2.depends_on(cal_test1)
266 return [cal_test1, cal_test2]