Belle II Software  release-05-02-19
caf_top_pre.py
1 # -*- coding: utf-8 -*-
2 
3 """
4 Airflow script for TOP pre-tracking calibration:
5  channel masks
6 
7 Author: Marko Staric, Shahab Kohani
8 """
9 import basf2
10 from prompt import CalibrationSettings, input_data_filters
11 from caf.utils import IoV
12 from caf.strategies import SequentialBoundaries
13 from top_calibration import channel_mask_calibration
14 from prompt.utils import filter_by_max_files_per_run
15 
16 
17 settings = CalibrationSettings(
18  name="TOP pre-tracking calibration",
19  expert_username="skohani",
20  description=__doc__,
21  input_data_formats=["raw"],
22  input_data_names=["hadron_calib"],
23  input_data_filters={
24  "hadron_calib": [
25  input_data_filters["Data Tag"]["hadron_calib"],
26  input_data_filters["Run Type"]["physics"],
27  input_data_filters["Data Quality Tag"]["Good Or Recoverable"]]},
28  depends_on=[],
29  expert_config={
30  "max_files_per_run": 20,
31  "payload_boundaries": None,
32  "request_memory": "8 GB"
33  })
34 
35 
36 # Required function
37 def get_calibrations(input_data, **kwargs):
38  '''
39  Returns a list of calibration objects.
40  :input_data (dict): Contains every file name from the 'input_data_names' as a key.
41  :**kwargs: Configuration options to be sent in.
42  '''
43  file_to_iov = input_data["hadron_calib"]
44  expert_config = kwargs.get("expert_config")
45  max_files_per_run = expert_config["max_files_per_run"]
46  min_events_per_file = 1
47  # Applying the min event per file to remove empty root files
48  reduced_file_to_iov = filter_by_max_files_per_run(file_to_iov, max_files_per_run, min_events_per_file, random_select=True)
49  inputFiles = list(reduced_file_to_iov.keys())
50  basf2.B2INFO(f"Total number of files actually used as input = {len(inputFiles)}")
51  requested_iov = kwargs.get("requested_iov", None)
52  output_iov = IoV(requested_iov.exp_low, requested_iov.run_low, -1, -1)
53 
54  cal = [channel_mask_calibration(inputFiles)] # this is run-dep
55 
56  for c in cal:
57  # If it's a SequentialBoundary calibration, check if there is any boundary in the config file
58  if c.strategies[0] == SequentialBoundaries:
59 
60  # Default boundaries. If there are no boundaries in the config file, this calibration will give a single IoV
61  payload_boundaries = [[output_iov.exp_low, output_iov.run_low]]
62 
63  # user-defined boundaries are set here.
64  if expert_config["payload_boundaries"] is not None:
65  payload_boundaries = expert_config["payload_boundaries"]
66 
67  # Set the actual boundaries.
68  for alg in c.algorithms:
69  alg.params = {"iov_coverage": output_iov, "payload_boundaries": payload_boundaries}
70 
71  # If it's not a SequentialBoundary calbration, just set the IoV coverage
72  else:
73  for alg in c.algorithms:
74  alg.params = {"iov_coverage": output_iov}
75 
76  return cal
prompt.utils
Definition: utils.py:1