Belle II Software  release-05-01-25
caf_ecl_E.py
1 # -*- coding: utf-8 -*-
2 
3 """ECL single crystal energy calibration using three control samples."""
4 
5 from prompt import CalibrationSettings
6 
7 # --------------------------------------------------------------
8 # ..Tell the automated script some required details
9 settings = CalibrationSettings(name="ecl_energy",
10  expert_username="hearty",
11  description=__doc__,
12  input_data_formats=["cdst"],
13  input_data_names=["hlt_bhabhaecl", "hlt_gamma_gamma", "hlt_mumu_2trk"],
14  depends_on=[])
15 
16 # --------------------------------------------------------------
17 # ..The calibration functions
18 
19 
20 def get_calibrations(input_data, **kwargs):
21  import basf2
22  from ROOT import Belle2
23  from caf.utils import IoV
24  from caf.framework import Calibration
25  from reconstruction import prepare_cdst_analysis
26 
27  # --------------------------------------------------------------
28  # ..Bhabha
29 
30  # ..Input data
31  file_to_iov_bhabha = input_data["hlt_bhabhaecl"]
32  input_files_bhabha = list(file_to_iov_bhabha.keys())
33 
34  # ..Algorithm
35  algo_ee5x5 = Belle2.ECL.eclee5x5Algorithm()
36  algo_ee5x5.setMinEntries(150)
37  algo_ee5x5.setPayloadName("ECLCrystalEnergy5x5")
38  algo_ee5x5.setStoreConst(True)
39 
40  # ..The calibration
41  eclee5x5_collector = basf2.register_module("eclee5x5Collector")
42  eclee5x5_collector.param("thetaLabMinDeg", 17.)
43  eclee5x5_collector.param("thetaLabMaxDeg", 150.)
44  eclee5x5_collector.param("minE0", 0.45)
45  eclee5x5_collector.param("minE1", 0.40)
46  eclee5x5_collector.param("maxdThetaSum", 2.)
47  eclee5x5_collector.param("dPhiScale", 1.)
48  eclee5x5_collector.param("maxTime", 10.)
49  eclee5x5_collector.param("useCalDigits", False)
50  eclee5x5_collector.param("requireL1", False)
51  eclee5x5_collector.param("granularity", "all")
52  cal_ecl_ee5x5 = Calibration("ecl_ee5x5",
53  collector=eclee5x5_collector,
54  algorithms=[algo_ee5x5],
55  input_files=input_files_bhabha
56  )
57 
58  # ..Add prepare_cdst_analysis to pre_collector_path
59  ee5x5_pre_path = basf2.create_path()
60  prepare_cdst_analysis(ee5x5_pre_path, components=['ECL'])
61  cal_ecl_ee5x5.pre_collector_path = ee5x5_pre_path
62 
63  # --------------------------------------------------------------
64  # ..gamma gamma
65 
66  # ..Input data
67  file_to_iov_gamma_gamma = input_data["hlt_gamma_gamma"]
68  input_files_gamma_gamma = list(file_to_iov_gamma_gamma.keys())
69 
70  # ..Algorithm
71  algo_gamma_gamma = Belle2.ECL.eclGammaGammaEAlgorithm()
72  algo_gamma_gamma.setOutputName("eclGammaGammaE_algorithm.root")
73  algo_gamma_gamma.setCellIDLo(1)
74  algo_gamma_gamma.setCellIDHi(8736)
75  algo_gamma_gamma.setMinEntries(150)
76  algo_gamma_gamma.setMaxIterations(10)
77  algo_gamma_gamma.setTRatioMin(0.45)
78  algo_gamma_gamma.setTRatioMax(0.60)
79  algo_gamma_gamma.setUpperEdgeThresh(0.02)
80  algo_gamma_gamma.setPerformFits(True)
81  algo_gamma_gamma.setFindExpValues(False)
82  algo_gamma_gamma.setStoreConst(0)
83 
84  # ..The calibration
85  eclGammaGamma_collector = basf2.register_module("eclGammaGammaECollector")
86  eclGammaGamma_collector.param("granularity", "all")
87  eclGammaGamma_collector.param("thetaLabMinDeg", 0.)
88  eclGammaGamma_collector.param("thetaLabMaxDeg", 180.)
89  eclGammaGamma_collector.param("minPairMass", 9.)
90  eclGammaGamma_collector.param("mindPhi", 179.)
91  eclGammaGamma_collector.param("maxTime", 999.)
92  eclGammaGamma_collector.param("measureTrueEnergy", False)
93  eclGammaGamma_collector.param("requireL1", False)
94  cal_ecl_gamma_gamma = Calibration("ecl_gamma_gamma",
95  collector=eclGammaGamma_collector,
96  algorithms=[algo_gamma_gamma],
97  input_files=input_files_gamma_gamma
98  )
99 
100  # ..Add prepare_cdst_analysis to pre_collector_path
101  gamma_gamma_pre_path = basf2.create_path()
102  prepare_cdst_analysis(gamma_gamma_pre_path, components=['ECL'])
103  cal_ecl_gamma_gamma.pre_collector_path = gamma_gamma_pre_path
104 
105  # --------------------------------------------------------------
106  # ..muon pair
107 
108  # ..Input data
109  file_to_iov_mu_mu = input_data["hlt_mumu_2trk"]
110  input_files_mu_mu = list(file_to_iov_mu_mu.keys())
111 
112  # ..Algorithm
113  algo_mu_mu = Belle2.ECL.eclMuMuEAlgorithm()
114  algo_mu_mu.cellIDLo = 1
115  algo_mu_mu.cellIDHi = 8736
116  algo_mu_mu.minEntries = 150
117  algo_mu_mu.maxIterations = 10
118  algo_mu_mu.tRatioMin = 0.2
119  algo_mu_mu.tRatioMax = 0.25
120  algo_mu_mu.performFits = True
121  algo_mu_mu.findExpValues = False
122  algo_mu_mu.storeConst = 0
123 
124  # ..The calibration
125  eclmumu_collector = basf2.register_module("eclMuMuECollector")
126  eclmumu_collector.param("granularity", "all")
127  eclmumu_collector.param("minPairMass", 9.0)
128  eclmumu_collector.param("minTrackLength", 30.)
129  eclmumu_collector.param("MaxNeighbourE", 0.010)
130  eclmumu_collector.param("thetaLabMinDeg", 17.)
131  eclmumu_collector.param("thetaLabMaxDeg", 150.)
132  eclmumu_collector.param("measureTrueEnergy", False)
133  eclmumu_collector.param("requireL1", False)
134  cal_ecl_mu_mu = Calibration(name="ecl_mu_mu", collector=eclmumu_collector, algorithms=algo_mu_mu, input_files=input_files_mu_mu)
135 
136  # ..Need to include track extrapolation in the path before collector
137  ext_path = basf2.create_path()
138  prepare_cdst_analysis(ext_path, components=['ECL'])
139  ext_path.add_module("Ext", pdgCodes=[13])
140  cal_ecl_mu_mu.pre_collector_path = ext_path
141 
142  # --------------------------------------------------------------
143  # Include a merging Calibration that doesn't require input data but instead creates the final
144  # payload from the previous calibration payloads.
145 
146  # We use a dummy collector that barely outputs any data and we set the input files to a single file so
147  # we spawn only one very fast job.
148  # It doesn't matter which input file we choose as the output is never used.
149 
151  cal_ecl_merge = Calibration(name="ecl_merge", collector="DummyCollector", algorithms=[merging_alg],
152  input_files=input_files_mu_mu[:1])
153 
154  # The important part is that we depend on all 3 previous calibrations
155  cal_ecl_merge.depends_on(cal_ecl_ee5x5)
156  cal_ecl_merge.depends_on(cal_ecl_gamma_gamma)
157  cal_ecl_merge.depends_on(cal_ecl_mu_mu)
158 
159  # ..Uses cdst data so it requires prepare_cdst_analysis
160  ecl_merge_pre_path = basf2.create_path()
161  prepare_cdst_analysis(ecl_merge_pre_path, components=['ECL'])
162  ecl_merge_pre_path.pre_collector_path = ecl_merge_pre_path
163 
164  # --------------------------------------------------------------
165  # ..Force the output iovs to be open
166  requested_iov = kwargs.get("requested_iov", None)
167  output_iov = IoV(requested_iov.exp_low, requested_iov.run_low, -1, -1)
168  for algorithm in cal_ecl_ee5x5.algorithms:
169  algorithm.params = {"apply_iov": output_iov}
170  for algorithm in cal_ecl_gamma_gamma.algorithms:
171  algorithm.params = {"apply_iov": output_iov}
172  for algorithm in cal_ecl_mu_mu.algorithms:
173  algorithm.params = {"apply_iov": output_iov}
174  for algorithm in cal_ecl_merge.algorithms:
175  algorithm.params = {"apply_iov": output_iov}
176 
177  # --------------------------------------------------------------
178  # ..Return the calibrations
179  return [cal_ecl_ee5x5, cal_ecl_gamma_gamma, cal_ecl_mu_mu, cal_ecl_merge]
Belle2::ECL::eclGammaGammaEAlgorithm
Calibrate ecl crystals using gamma pair events.
Definition: eclGammaGammaEAlgorithm.h:39
Belle2::ECL::eclMuMuEAlgorithm
Calibrate ecl crystals using muon pair events.
Definition: eclMuMuEAlgorithm.h:39
Belle2::ECL::eclMergingCrystalEAlgorithm
Calibrate ecl crystals using previously created payloads.
Definition: eclMergingCrystalEAlgorithm.h:40
Belle2::ECL::eclee5x5Algorithm
Calibrate ecl crystals using Bhabha events.
Definition: eclee5x5Algorithm.h:40
Calibration
Definition: Calibration.py:1