11 """A complicated example calibration that takes several input data lists from raw data and performs
12 multiple calibrations. Only the second calibration will have its payloads placed into the final
13 outputdb directory by b2caf-prompt-run.
15 We make it so that this calibration depends on the result of a completely
16 different one 'example_simple'. Even though that calibration will not be run in this process, the automated
17 system can discover this dependency and use it when submitting tasks."""
19 from prompt
import CalibrationSettings, INPUT_DATA_FILTERS
31 from prompt.calibrations.example_simple
import settings
as example_simple
34 settings = CalibrationSettings(name=
"Example Complex",
35 expert_username=
"ddossett",
37 input_data_formats=[
"raw"],
38 input_data_names=[
"physics",
"cosmics",
"Bcosmics"],
39 input_data_filters={
"physics": [f
"NOT {INPUT_DATA_FILTERS['Magnet']['On']}",
40 INPUT_DATA_FILTERS[
"Data Tag"][
"hadron_calib"],
41 INPUT_DATA_FILTERS[
"Data Quality Tag"][
"Good"],
42 INPUT_DATA_FILTERS[
"Beam Energy"][
"4S"],
43 INPUT_DATA_FILTERS[
"Run Type"][
"physics"]],
44 "cosmics": [INPUT_DATA_FILTERS[
'Magnet'][
'Off'],
45 INPUT_DATA_FILTERS[
"Data Tag"][
"cosmic_calib"],
46 INPUT_DATA_FILTERS[
"Data Quality Tag"][
"Bad For Alignment"],
47 INPUT_DATA_FILTERS[
"Beam Energy"][
"Continuum"],
48 f
"NOT {INPUT_DATA_FILTERS['Run Type']['physics']}"],
49 "Bcosmics": [INPUT_DATA_FILTERS[
"Data Tag"][
"cosmic_calib"],
50 INPUT_DATA_FILTERS[
"Data Quality Tag"][
"Good"],
51 INPUT_DATA_FILTERS[
"Beam Energy"][
"4S"]]},
52 depends_on=[example_simple],
54 "physics_prescale": 0.2,
55 "max_events_per_file": 100,
56 "max_files_per_run": 2,
57 "payload_boundaries": []
78 def 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.Belle2
import TestCalibrationAlgorithm, TestBoundarySettingAlgorithm
104 from caf.framework
import Calibration, Collection
105 from caf.strategies
import SequentialBoundaries
106 from caf.utils
import vector_from_runs, ExpRun, IoV
112 file_to_iov_physics = input_data[
"physics"]
113 file_to_iov_cosmics = input_data[
"cosmics"]
114 file_to_iov_Bcosmics = input_data[
"Bcosmics"]
119 expert_config = kwargs.get(
"expert_config")
120 max_files_per_run = expert_config[
"max_files_per_run"]
121 basf2.B2INFO(f
"Reducing to a maximum of {max_files_per_run} files per run.")
127 reduced_file_to_iov_physics = filter_by_max_files_per_run(file_to_iov_physics, max_files_per_run)
128 input_files_physics = list(reduced_file_to_iov_physics.keys())
129 basf2.B2INFO(f
"Total number of physics files actually used as input = {len(input_files_physics)}")
131 reduced_file_to_iov_cosmics = filter_by_max_files_per_run(file_to_iov_cosmics, max_files_per_run)
132 input_files_cosmics = list(reduced_file_to_iov_cosmics.keys())
133 basf2.B2INFO(f
"Total number of cosmics files actually used as input = {len(input_files_cosmics)}")
135 reduced_file_to_iov_Bcosmics = filter_by_max_files_per_run(file_to_iov_Bcosmics, max_files_per_run)
136 input_files_Bcosmics = list(reduced_file_to_iov_Bcosmics.keys())
137 basf2.B2INFO(f
"Total number of Bcosmics files actually used as input = {len(input_files_Bcosmics)}")
141 requested_iov = kwargs.get(
"requested_iov",
None)
144 output_iov = IoV(requested_iov.exp_low, requested_iov.run_low, -1, -1)
149 col_test_physics = register_module(
"CaTest")
152 col_test_physics.param(
"granularity",
"run")
153 col_test_physics.param(
"spread", 4)
155 col_test_Bcosmics = register_module(
"CaTest")
156 col_test_Bcosmics.param(
"granularity",
"all")
157 col_test_Bcosmics.param(
"spread", 1)
159 col_test_cosmics = register_module(
"CaTest")
160 col_test_cosmics.param(
"granularity",
"all")
161 col_test_cosmics.param(
"spread", 10)
170 max_events = expert_config[
"max_events_per_file"]
171 root_input = register_module(
"RootInput",
172 entrySequences=[f
"0:{max_events}"]
180 prescale = expert_config[
"physics_prescale"]
181 prescale_mod = register_module(
"Prescale", prescale=prescale)
182 empty_path = create_path()
183 prescale_mod.if_false(empty_path, basf2.AfterConditionPath.END)
185 rec_path_physics = create_path()
186 rec_path_physics.add_module(root_input)
187 rec_path_physics.add_module(prescale_mod)
190 rec_path_cosmics = create_path()
191 rec_path_cosmics.add_module(root_input)
194 rec_path_Bcosmics = create_path()
195 rec_path_Bcosmics.add_module(root_input)
201 alg_test1 = TestCalibrationAlgorithm()
202 alg_test2 = TestBoundarySettingAlgorithm()
213 payload_boundaries = [ExpRun(output_iov.exp_low, output_iov.run_low)]
216 payload_boundaries.extend([ExpRun(*boundary)
for boundary
in expert_config[
"payload_boundaries"]])
217 basf2.B2INFO(f
"Expert set payload boundaries are: {expert_config['payload_boundaries']}")
219 alg_test2.setBoundaries(vector_from_runs(payload_boundaries))
226 collection_physics =
Collection(collector=col_test_physics,
227 input_files=input_files_physics,
228 pre_collector_path=rec_path_physics,
232 collection_cosmics =
Collection(collector=col_test_cosmics,
233 input_files=input_files_cosmics,
234 pre_collector_path=rec_path_cosmics,
238 collection_Bcosmics =
Collection(collector=col_test_Bcosmics,
239 input_files=input_files_Bcosmics,
240 pre_collector_path=rec_path_Bcosmics,
254 cal_test1.add_collection(name=
"cosmics", collection=collection_cosmics)
255 cal_test1.add_collection(name=
"Bcosmics", collection=collection_Bcosmics)
256 cal_test1.algorithms = [alg_test1]
258 cal_test1.algorithms[0].params = {
"apply_iov": output_iov}
260 cal_test1.save_payloads =
False
264 cal_test2.add_collection(name=
"physics", collection=collection_physics)
265 cal_test2.algorithms = [alg_test2]
267 cal_test2.strategies = SequentialBoundaries
269 cal_test2.algorithms[0].params[
"iov_coverage"] = output_iov
271 cal_test2.depends_on(cal_test1)
274 return [cal_test1, cal_test2]