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