Belle II Software  release-06-01-15
caf_ecl_time_crate.py
1 # -*- coding: utf-8 -*-
2 
3 
10 
11 """ECL timing calibration that performs the crate calibrations, one for each physics run."""
12 
13 from prompt import CalibrationSettings, input_data_filters
14 from reconstruction import prepare_cdst_analysis
15 
16 
23 
24 
26 settings = CalibrationSettings(name="ECL crate time calibrations",
27  expert_username="ehill",
28  description=__doc__,
29  input_data_formats=["cdst"],
30  input_data_names=["bhabha_all_calib"],
31  # input_data_filters={"bhabha_all_calib": [input_data_filters["Data Tag"]["bhabha_all_calib"],
32  # input_data_filters["Beam Energy"]["4S"],
33  # input_data_filters["Beam Energy"]["Continuum"],
34  # input_data_filters["Beam Energy"]["Scan"],
35  # input_data_filters["Data Quality Tag"]["Good"],
36  # input_data_filters["Run Type"]["physics"],
37  # input_data_filters["Magnet"]["On"]]},
38  depends_on=[])
39 
40 
41 
42 
43 
52 
53 
54 def get_calibrations(input_data, **kwargs):
55  """
56  Parameters:
57  input_data (dict): Should contain every name from the 'input_data_names' variable as a key.
58  Each value is a dictionary with {"/path/to/file_e1_r5.root": IoV(1,5,1,5), ...}. Useful for
59  assigning to calibration.files_to_iov
60 
61  **kwargs: Configuration options to be sent in. Since this may change we use kwargs as a way to help prevent
62  backwards compatibility problems. But you could use the correct arguments in b2caf-prompt-run for this
63  release explicitly if you want to.
64 
65  Currently only kwargs["output_iov"] is used. This is the output IoV range that your payloads should
66  correspond to. Generally your highest ExpRun payload should be open ended e.g. IoV(3,4,-1,-1)
67 
68  Returns:
69  list(caf.framework.Calibration): All of the calibration objects we want to assign to the CAF process
70  """
71  import basf2
72  # Set up config options
73 
74  # In this script we want to use one sources of input data.
75  # Get the input files from the input_data variable
76  # The input data should be the bhabha skim
77  file_to_iov_physics = input_data["bhabha_all_calib"]
78 
79  # We might have requested an enormous amount of data across a run range.
80  # There's a LOT more files than runs!
81  # Lets set some limits because this calibration doesn't need that much to run.
82  max_files_per_run = 26
83 
84  # We filter addition files if there are more than [max_files_per_run] files per run.
85  # The input data files are sorted alphabetically by b2caf-prompt-run
86  # already. This procedure respects that ordering
87  from prompt.utils import filter_by_max_files_per_run
88 
89  reduced_file_to_iov_physics = filter_by_max_files_per_run(file_to_iov_physics, max_files_per_run)
90  input_files_physics = list(reduced_file_to_iov_physics.keys())
91  basf2.B2INFO(f"Total number of files actually used as input = {len(input_files_physics)}")
92 
93 
94  import basf2
95  from basf2 import register_module, create_path
96  import ROOT
97  from ROOT import Belle2
98  from ROOT.Belle2 import TestCalibrationAlgorithm
99  from caf.framework import Collection
100 
101 
103  root_input = register_module('RootInput')
104  rec_path_bhabha = create_path()
105  rec_path_bhabha.add_module(root_input)
106  if 'Gearbox' not in rec_path_bhabha:
107  rec_path_bhabha.add_module('Gearbox')
108  if 'Geometry' not in rec_path_bhabha:
109  rec_path_bhabha.add_module('Geometry', useDB=True)
110 
111  prepare_cdst_analysis(rec_path_bhabha) # for new 2020 cdst format
112 
113  # ====================================================
114  t0BiasCorrection = -0.9 # Correct for the CDC t0 bias
115  # ====================================================
116 
117  col_bhabha = register_module('ECLBhabhaTCollector')
118  col_bhabha.param('timeAbsMax', 250)
119  col_bhabha.param('minCrystal', 1)
120  col_bhabha.param('maxCrystal', 8736)
121  col_bhabha.param('saveTree', False)
122  col_bhabha.param('hadronEventT0_TO_bhabhaEventT0_correction', t0BiasCorrection)
123 
124  eclTCol = Collection(collector=col_bhabha,
125  input_files=input_files_physics,
126  pre_collector_path=rec_path_bhabha,
127  )
128 
129 
131 
133 
134  # Define the CAF algorithm arguments
135  # Set the cellIDLo to be larger than cellIDHi so that no crystal
136  # calibrations will be performed.
137  eclTAlg.cellIDLo = 3
138  eclTAlg.cellIDHi = 2
139  eclTAlg.debugOutput = True
140  eclTAlg.meanCleanRebinFactor = 3
141  eclTAlg.meanCleanCutMinFactor = 0.3
142  eclTAlg.debugFilenameBase = "eclBhabhaTAlgorithm"
143 
144 
146 
147  from caf.framework import Calibration
148 
149  cal_test = Calibration("ECLcrateTimeCalibration_physics")
150  cal_test.add_collection(name="bhabha", collection=eclTCol)
151  cal_test.algorithms = [eclTAlg]
152 
153  # Here we set the AlgorithmStrategy for our algorithm
154  from caf.strategies import SimpleRunByRun
155 
156  # The SimpleRunByRun strategy executes your algorithm over runs
157  # individually to give you payloads for each one (if successful)
158  # It will not do any merging of runs which didn't contain enough data.
159  # So failure is expected if your algorithm requires a large amount of data compared to run length.
160  # You should only use granularity='run' for the collector when using this strategy.
161 
162  cal_test.strategies = SimpleRunByRun
163 
164  # Most other options like database chain and backend args will be overwritten by b2caf-prompt-run.
165  # So we don't bother setting them.
166 
167  # You must return all calibrations you want to run in the prompt process, even if it's only one
168  return [cal_test]
169 
170 
Calibrate ecl crystals using bhabha events.