4 Airflow script for automatic CDC dEdx calibration. It is currently for the electron based
5 calibration, where at present only RunGain, Cosine and WireGain are implimented. The remaining
6 two 2D and 1D will be implimented in the near future.
8 Second part called "Hadron calibration" are not compitable with CAF/AirFlow
9 and will be done offline for a while.
11 Author: Jitendra Kumar
12 Contact: jkumar@andrew.cmu.edu
15 from ROOT
import gSystem
16 from ROOT.Belle2
import CDCDedxRunGainAlgorithm, CDCDedxCosineAlgorithm, CDCDedxWireGainAlgorithm
17 from caf.framework
import Calibration
18 from caf.strategies
import SequentialRunByRun, SequentialBoundaries
19 from prompt
import CalibrationSettings, input_data_filters
20 import reconstruction
as recon
21 from random
import seed
23 gSystem.Load(
'libreconstruction.so')
24 ROOT.gROOT.SetBatch(
True)
26 settings = CalibrationSettings(
28 expert_username=
"jikumar",
30 input_data_formats=[
"cdst"],
31 input_data_names=[
"bhabha_all_calib"],
33 "payload_boundaries": [],
34 "calib_datamode":
False,
38 "adjustment": 1.00798},
41 input_data_filters[
'Run Type'][
'physics'],
42 input_data_filters[
'Data Tag'][
'bhabha_all_calib'],
43 input_data_filters[
'Data Quality Tag'][
'Good Or Recoverable'],
44 input_data_filters[
'Magnet'][
'On'],
45 input_data_filters[
'Beam Energy'][
'4S'],
46 input_data_filters[
'Beam Energy'][
'Continuum'],
47 input_data_filters[
'Beam Energy'][
'Scan']]},
51 def get_calibrations(input_data, **kwargs):
52 """ REQUIRED FUNCTION used by b2caf-prompt-run tool
53 This function return a list of Calibration
54 objects we assign to the CAF process
58 file_to_iov_physics = input_data[
"bhabha_all_calib"]
60 expert_config = kwargs.get(
"expert_config")
63 fulldataMode = expert_config[
"calib_datamode"]
64 adjustment = expert_config[
"adjustment"]
67 input_files_rungain = list(file_to_iov_physics.keys())
68 input_files_coscorr = list(file_to_iov_physics.keys())
69 input_files_wiregain = list(file_to_iov_physics.keys())
73 maxevt_rg = expert_config[
"maxevt_rg"]
74 maxevt_cc = expert_config[
"maxevt_cc"]
75 maxevt_wg = expert_config[
"maxevt_wg"]
77 from prompt.utils import filter_by_max_events_per_run, filter_by_select_max_events_from_files
79 max_files_for_maxevents = maxevt_rg
80 reduced_file_to_iov_rungain = filter_by_max_events_per_run(file_to_iov_physics, max_files_for_maxevents,
True)
81 input_files_rungain = list(reduced_file_to_iov_rungain.keys())
82 basf2.B2INFO(f
"Total number of files used for rungains = {len(input_files_rungain)}")
85 input_files_coscorr = filter_by_select_max_events_from_files(list(file_to_iov_physics.keys()), maxevt_cc)
86 basf2.B2INFO(f
"Total number of files used for cosine = {len(input_files_coscorr)}")
87 if not input_files_coscorr:
89 f
"Cosine: all requested ({maxevt_cc}) events not found")
92 if maxevt_wg == maxevt_cc:
93 input_files_wiregain = input_files_coscorr
95 input_files_wiregain = filter_by_select_max_events_from_files(list(file_to_iov_physics.keys()), maxevt_wg)
97 basf2.B2INFO(f
"Total number of files used for wiregains = {len(input_files_wiregain)}")
98 if not input_files_wiregain:
100 f
"WireGain: all requested ({maxevt_wg}) events not found")
102 requested_iov = kwargs.get(
"requested_iov",
None)
103 from caf.utils
import ExpRun, IoV
104 output_iov = IoV(requested_iov.exp_low, requested_iov.run_low, -1, -1)
106 payload_boundaries = [ExpRun(output_iov.exp_low, output_iov.run_low)]
107 payload_boundaries.extend([ExpRun(*boundary)
for boundary
in expert_config[
"payload_boundaries"]])
108 basf2.B2INFO(f
"Expert set payload boundaries are: {expert_config['payload_boundaries']}")
112 Calibrate_RGTrial = basf2.create_path()
113 recon.prepare_cdst_analysis(path=Calibrate_RGTrial)
114 trg_bhabhaskim = Calibrate_RGTrial.add_module(
"TriggerSkim", triggerLines=[
"software_trigger_cut&skim&accept_bhabha"])
115 trg_bhabhaskim.if_value(
"==0", basf2.Path(), basf2.AfterConditionPath.END)
117 Calibrate_RGTrial.add_module(
119 relativeCorrections=
False,
128 Collector_RGTrial = basf2.register_module(
'CDCDedxElectronCollector')
129 CollParamTrial = {
'cleanupCuts':
True,
'IsRun':
True,
'granularity':
'run', }
130 Collector_RGTrial.param(CollParamTrial)
133 Algorithm_RGTrial = CDCDedxRunGainAlgorithm()
134 Algorithm_RGTrial.setMonitoringPlots(
True)
138 name=
"RunGainCalibrationTrial",
139 algorithms=[Algorithm_RGTrial],
140 collector=Collector_RGTrial,
141 input_files=input_files_rungain)
142 Calibration_RGTrial.strategies = SequentialRunByRun
143 Calibration_RGTrial.pre_collector_path = Calibrate_RGTrial
144 Calibration_RGTrial.algorithms[0].params = {
"iov_coverage": output_iov}
145 Calibration_RGTrial.save_payloads =
False
149 Calibrate_RGPre = basf2.create_path()
150 recon.prepare_cdst_analysis(path=Calibrate_RGPre)
151 trg_bhabhaskim = Calibrate_RGPre.add_module(
"TriggerSkim", triggerLines=[
"software_trigger_cut&skim&accept_bhabha"])
152 trg_bhabhaskim.if_value(
"==0", basf2.Path(), basf2.AfterConditionPath.END)
153 Calibrate_RGPre.add_module(
155 relativeCorrections=
False,
164 Collector_RGPre = basf2.register_module(
'CDCDedxElectronCollector')
165 CollParamPre = {
'cleanupCuts':
True,
'IsRun':
True,
'granularity':
'run'}
166 Collector_RGPre.param(CollParamPre)
169 Algorithm_RGPre = CDCDedxRunGainAlgorithm()
170 Algorithm_RGPre.setMonitoringPlots(
True)
174 name=
"RunGainCalibrationPre",
175 algorithms=[Algorithm_RGPre],
176 collector=Collector_RGPre,
177 input_files=input_files_rungain)
178 Calibration_RGPre.strategies = SequentialRunByRun
179 Calibration_RGPre.pre_collector_path = Calibrate_RGPre
180 Calibration_RGPre.depends_on(Calibration_RGTrial)
181 Calibration_RGPre.algorithms[0].params = {
"iov_coverage": output_iov}
182 Calibration_RGPre.save_payloads =
False
186 Calibrate_CC = basf2.create_path()
187 recon.prepare_cdst_analysis(path=Calibrate_CC)
188 trg_bhabhaskim = Calibrate_CC.add_module(
"TriggerSkim", triggerLines=[
"software_trigger_cut&skim&accept_bhabha"])
189 trg_bhabhaskim.if_value(
"==0", basf2.Path(), basf2.AfterConditionPath.END)
191 Calibrate_CC.add_module(
193 relativeCorrections=
False,
201 Collector_CC = basf2.register_module(
'CDCDedxElectronCollector')
202 CollParam_CC = {
'cleanupCuts':
True,
'IsCharge':
True,
'IsCosth':
True,
'granularity':
'all'}
203 Collector_CC.param(CollParam_CC)
204 if expert_config[
"payload_boundaries"]
is not None:
205 Collector_CC.param(
"granularity",
"run")
208 Algorithm_CC = CDCDedxCosineAlgorithm()
209 Algorithm_CC.setMonitoringPlots(
True)
213 name=
"CosineCorrCalibration",
214 algorithms=[Algorithm_CC],
215 collector=Collector_CC,
216 input_files=input_files_coscorr)
217 Calibration_CC.pre_collector_path = Calibrate_CC
218 Calibration_CC.depends_on(Calibration_RGPre)
219 if expert_config[
"payload_boundaries"]
is not None:
220 Calibration_CC.strategies = SequentialBoundaries
221 basf2.B2INFO(f
"Calibration_CC: Found payload_boundaries: calibration strategies set to SequentialBoundaries.")
222 Calibration_CC.algorithms[0].params = {
"iov_coverage": output_iov,
"payload_boundaries": payload_boundaries}
224 Calibration_CC.algorithms[0].params = {
"apply_iov": output_iov}
228 Calibrate_WG = basf2.create_path()
229 recon.prepare_cdst_analysis(path=Calibrate_WG)
230 trg_bhabhaskim = Calibrate_WG.add_module(
"TriggerSkim", triggerLines=[
"software_trigger_cut&skim&accept_bhabha"])
231 trg_bhabhaskim.if_value(
"==0", basf2.Path(), basf2.AfterConditionPath.END)
233 Calibrate_WG.add_module(
235 relativeCorrections=
False,
244 Collector_WG = basf2.register_module(
'CDCDedxElectronCollector')
245 CollParam_WG = {
'cleanupCuts':
True,
'IsWire':
True,
'Isdedxhit':
True,
'granularity':
'all'}
246 Collector_WG.param(CollParam_WG)
247 if expert_config[
"payload_boundaries"]
is not None:
248 Collector_WG.param(
"granularity",
"run")
251 Algorithm_WG = CDCDedxWireGainAlgorithm()
252 Algorithm_WG.setMonitoringPlots(
True)
256 name=
"WireGainCalibration",
257 algorithms=[Algorithm_WG],
258 collector=Collector_WG,
259 input_files=input_files_wiregain)
260 Calibration_WG.pre_collector_path = Calibrate_WG
261 Calibration_WG.depends_on(Calibration_RGPre)
262 Calibration_WG.depends_on(Calibration_CC)
263 if expert_config[
"payload_boundaries"]
is not None:
264 Calibration_WG.strategies = SequentialBoundaries
265 basf2.B2INFO(f
"Calibration_WG: Found payload_boundaries: calibration strategies set to SequentialBoundaries.")
266 Calibration_WG.algorithms[0].params = {
"iov_coverage": output_iov,
"payload_boundaries": payload_boundaries}
268 Calibration_WG.algorithms[0].params = {
"apply_iov": output_iov}
272 Calibrate_RG = basf2.create_path()
273 recon.prepare_cdst_analysis(path=Calibrate_RG)
274 trg_bhabhaskim = Calibrate_RG.add_module(
"TriggerSkim", triggerLines=[
"software_trigger_cut&skim&accept_bhabha"])
275 trg_bhabhaskim.if_value(
"==0", basf2.Path(), basf2.AfterConditionPath.END)
277 Calibrate_RG.add_module(
279 relativeCorrections=
False,
288 Collector_RG = basf2.register_module(
'CDCDedxElectronCollector')
289 CollParamFinal = {
'cleanupCuts':
True,
'IsRun':
True,
'granularity':
'run', }
290 Collector_RG.param(CollParamFinal)
293 Algorithm_RG = CDCDedxRunGainAlgorithm()
294 Algorithm_RG.setMonitoringPlots(
True)
295 Algorithm_RG.setAdjustment(adjustment)
299 name=
"RunGainCalibration",
300 algorithms=[Algorithm_RG],
301 collector=Collector_RG,
302 input_files=input_files_rungain)
303 Calibration_RG.strategies = SequentialRunByRun
304 Calibration_RG.depends_on(Calibration_RGPre)
305 Calibration_RG.depends_on(Calibration_CC)
306 Calibration_RG.depends_on(Calibration_WG)
307 Calibration_RG.pre_collector_path = Calibrate_RG
308 Calibration_RG.algorithms[0].params = {
"iov_coverage": output_iov}
310 return [Calibration_RGTrial, Calibration_RGPre, Calibration_CC, Calibration_WG, Calibration_RG]