Belle II Software  release-06-00-14
caf_top.py
1 # -*- coding: utf-8 -*-
2 
3 
10 
11 """
12 Airflow script for TOP post-tracking calibration:
13  BS13d carrier shifts, module T0 and common T0
14 """
15 import basf2
16 from prompt import CalibrationSettings, INPUT_DATA_FILTERS
17 from caf.utils import IoV
18 from caf.strategies import SequentialBoundaries
19 from top_calibration import BS13d_calibration_cdst
20 from top_calibration import moduleT0_calibration_DeltaT, moduleT0_calibration_LL
21 from top_calibration import commonT0_calibration_BF
22 from prompt.calibrations.caf_top_pre import settings as top_pretracking
23 from prompt.utils import filter_by_max_files_per_run
24 
25 
26 settings = CalibrationSettings(
27  name="TOP post-tracking calibration",
28  expert_username="skohani",
29  description=__doc__,
30  input_data_formats=["cdst"],
31  input_data_names=["bhabha_all_calib"],
32  input_data_filters={
33  "bhabha_all_calib": [
34  INPUT_DATA_FILTERS["Data Tag"]["bhabha_all_calib"],
35  INPUT_DATA_FILTERS["Run Type"]["physics"],
36  INPUT_DATA_FILTERS["Data Quality Tag"]["Good Or Recoverable"]]},
37  depends_on=[top_pretracking],
38  expert_config={
39  "max_files_per_run": 20,
40  "payload_boundaries": None,
41  "request_memory": "8 GB"
42  })
43 
44 
45 # Required function
46 def get_calibrations(input_data, **kwargs):
47  '''
48  Returns a list of calibration objects.
49  :input_data (dict): Contains every file name from the 'input_data_names' as a key.
50  :**kwargs: Configuration options to be sent in.
51  '''
52 
53  file_to_iov = input_data["bhabha_all_calib"]
54  sample = 'bhabha'
55  requested_iov = kwargs.get("requested_iov", None)
56  expert_config = kwargs.get("expert_config")
57  max_files_per_run = expert_config["max_files_per_run"]
58  min_events_per_file = 1
59  # Applying the min event per file to remove empty root files
60  reduced_file_to_iov = filter_by_max_files_per_run(file_to_iov, max_files_per_run, min_events_per_file, random_select=True)
61  inputFiles = list(reduced_file_to_iov.keys())
62  basf2.B2INFO(f"Total number of files actually used as input = {len(inputFiles)}")
63  requested_iov = kwargs.get("requested_iov", None)
64  output_iov = IoV(requested_iov.exp_low, requested_iov.run_low, -1, -1)
65 
66  cal = [BS13d_calibration_cdst(inputFiles), # this is run-dep
67  moduleT0_calibration_DeltaT(inputFiles), # this cal cannot span across experiments
68  moduleT0_calibration_LL(inputFiles, sample), # this cal cannot span across experiments
69  commonT0_calibration_BF(inputFiles)] # this is run-dep
70 
71  for c in cal:
72  # If it's a SequentialBoundary calibration, check if there is any boundary in the config file
73  if c.strategies[0] == SequentialBoundaries:
74 
75  # Default boundaries. If there are no boundaries in the config file, this calibration will give a single IoV
76  payload_boundaries = [[output_iov.exp_low, output_iov.run_low]]
77 
78  # user-defined boundaries are set here.
79  if expert_config["payload_boundaries"] is not None:
80  payload_boundaries = expert_config["payload_boundaries"]
81 
82  # Set the actual boundaries.
83  for alg in c.algorithms:
84  alg.params = {"iov_coverage": output_iov, "payload_boundaries": payload_boundaries}
85 
86  # If it's not a SequentialBoundary calbration, just set the IoV coverage
87  else:
88  for alg in c.algorithms:
89  alg.params = {"iov_coverage": output_iov}
90 
91  # Don't save the rough moduleT0 result
92  cal[1].save_payloads = False
93 
94  cal[1].depends_on(cal[0])
95  cal[2].depends_on(cal[1])
96  cal[3].depends_on(cal[2])
97 
98  return cal