Belle II Software release-09-00-02
__init__.py
1#!/usr/bin/env python3
2
3
10
11import basf2 as b2
12
13# Many scripts import these functions from `tracking`, so leave these imports here
14from tracking.path_utils import ( # noqa
15 add_cdc_cr_track_finding,
16 add_cdc_track_finding,
17 add_cr_track_fit_and_track_creator,
18 add_eclcdc_track_finding,
19 add_geometry_modules,
20 add_hit_preparation_modules,
21 add_mc_matcher,
22 add_prune_tracks,
23 add_flipping_of_recoTracks,
24 add_pxd_cr_track_finding,
25 add_pxd_track_finding,
26 add_svd_track_finding,
27 add_track_fit_and_track_creator,
28 add_prefilter_track_fit_and_track_creator,
29 add_vxd_track_finding_vxdtf2,
30 add_svd_standalone_tracking,
31 is_cdc_used,
32 is_ecl_used,
33 is_pxd_used,
34 is_svd_used,
35 use_local_sectormap,
36)
37
38from pxd import add_pxd_reconstruction
39
40
41def add_tracking_reconstruction(path, components=None, pruneTracks=False, skipGeometryAdding=False,
42 mcTrackFinding=False, trackFitHypotheses=None,
43 reco_tracks="RecoTracks", prune_temporary_tracks=True, fit_tracks=True,
44 use_second_cdc_hits=False, skipHitPreparerAdding=False,
45 svd_standalone_mode="VXDTF2",
46 use_svd_to_cdc_ckf=True, use_ecl_to_cdc_ckf=False,
47 add_cdcTrack_QI=True, add_vxdTrack_QI=False, add_recoTrack_QI=False,
48 pxd_filtering_offline=False,
49 create_intercepts_for_pxd_ckf=False,
50 append_full_grid_cdc_eventt0=True,
51 v0_finding=True, flip_recoTrack=True,
52 skip_full_grid_cdc_eventt0_if_svd_time_present=True):
53 """
54 This function adds the **standard tracking reconstruction** modules
55 to a path:
56
57 #. first we find tracks using the CDC hits only, see :ref:`CDC Track Finding<tracking_trackFindingCDC>`
58
59 #. CDC tracks are extrapolated to SVD and SVD hits are attached, see :ref:`CDC to SVD SpacePoint CKF<tracking_cdc2svd_ckf>`
60
61 #. remaining SVD hits are used to find SVD tracks, see :ref:`SVD Track Finding<tracking_trackFindingSVD>`
62
63 #. CDC standalone tracks which don't have SVD hits attached to them from the \
64 :ref:`CDC to SVD CKF<tracking_cdc2svd_ckf>` are combined with SVD standalone tracks found in the previous step using the \
65 :ref:`CDC to SVD Seed CKF<tracking_svdcdc_merger_ckf>`
66
67 #. SVD tracks are extrapolated to CDC to attach CDC hits, see :ref:`SVD to CDC CKF<tracking_svd2cdc_ckf>`
68
69 #. SVD and CDC tracks are merged and fitted, see :ref:`Track Fitting<tracking_trackFitting>`
70
71 #. merged SVD+CDC tracks are extrapolated to PXD to attach PXD hits, see :ref:`SVD to PXD CKF<tracking_svd2pxd_ckf>`
72
73 .. note::
74
75 PXD hits are not available on HLT. At the end of the tracking chain on HLT we have the\
76 :ref:`PXD Region Of Interest Finding<tracking_pxdDataReduction>`, that consists of extrapolating\
77 the tracks on the PXD sensors and defining regions in which we expect to find the hit.\
78 Only fired pixels inside these regions reach Event Builder 2.
79
80 #. after all the tracks from the IP are found, we look for special classes of tracks,\
81 in particular we search for displaced vertices to reconstruct K-short, Lambda and\
82 photon-conversions, see :ref:`V0 Finding<tracking_v0Finding>`.
83
84 #. If the reconstruction uses PXD, we finally look for tracks with a wrong charge,\
85 flip and refit them to fix the charge, see :ref:`Flip&Refit<trk_flipNrefit>`.
86
87
88
89 :param path: the path to add the tracking reconstruction modules to
90 :param components: the list of geometry components in use or None for all components.
91 :param pruneTracks: if true, delete all hits except the first and the last in the found tracks.
92 :param skipGeometryAdding: (advanced flag) the tracking modules need the geometry module and will add it,
93 if it is not already present in the path. In a setup with multiple (conditional) paths however, it can not
94 determine, if the geometry is already loaded. This flag can be used o just turn off the geometry adding at
95 all (but you will have to add it on your own then).
96 :param skipHitPreparerAdding: (advanced flag) if true, do not add the hit preparation (esp. VXD cluster creation
97 modules. This is useful if they have been added before already.
98 :param mcTrackFinding: if true, use the MC track finders instead of the realistic ones.
99 :param reco_tracks: name of the StoreArray where the reco tracks should be stored
100 :param prune_temporary_tracks: if false, store all information of the single CDC and VXD tracks before merging.
101 If true, prune them.
102 :param fit_tracks: if false, the final track find and the TrackCreator module will no be executed
103 :param use_second_cdc_hits: if true, the second hit information will be used in the CDC track finding.
104 :param trackFitHypotheses: which pdg hypothesis to fit. Defaults to [211, 321, 2212].
105 :param svd_standalone_mode: Which SVD standalone tracking is used.
106 Options are "VXDTF2", "SVDHough", "VXDTF2_and_SVDHough", and "SVDHough_and_VXDTF2".
107 Defaults to "VXDTF2"
108 :param use_svd_to_cdc_ckf: if true, add SVD to CDC CKF module.
109 :param use_ecl_to_cdc_ckf: if true, add ECL to CDC CKF module.
110 :param add_cdcTrack_QI: if true, add the MVA track quality estimation
111 to the path that sets the quality indicator property of the found CDC standalone tracks
112 :param add_vxdTrack_QI: if true, add the MVA track quality estimation
113 to the path that sets the quality indicator property of the found VXDTF2 tracks
114 (ATTENTION: Standard triplet QI of VXDTF2 is replaced in this case
115 -> setting this option to 'True' will have some influence on the final track collection)
116 :param add_recoTrack_QI: if true, add the MVA track quality estimation
117 to the path that sets the quality indicator property of all found reco tracks
118 (Both other QIs needed as input.)
119 :param pxd_filtering_offline: If True, PXD data reduction (ROI filtering) is applied during the track reconstruction.
120 The reconstructed SVD/CDC tracks are used to define the ROIs and reject all PXD clusters outside of these.
121 :param create_intercepts_for_pxd_ckf: If True, the PXDROIFinder is added to the path to create PXDIntercepts to be used
122 for hit filtering when creating the CKF relations. This independent of the offline PXD digit filtering which is
123 steered by 'pxd_filtering_offline'. This can be applied for both data and MC.
124 :param append_full_grid_cdc_eventt0: If True, the module FullGridChi2TrackTimeExtractor is added to the path
125 and provides the CDC temporary EventT0.
126 :param v0_finding: if false, the V0Finder module is not executed
127 :param flip_recoTrack: if true, add the recoTracks flipping function in the postfilter (only if PXD is present)
128 :param skip_full_grid_cdc_eventt0_if_svd_time_present: if true, and if also append_full_grid_cdc_eventt0 is true, the
129 FullGridChi2TrackTimeExtractor is only executed in the events where no SVD-based EventT0 is found. If false, but
130 append_full_grid_cdc_eventt0 is true, FullGridChi2TrackTimeExtractor will be executed in each event regardless of
131 SVD EventT0 being present. Has no effect if append_full_grid_cdc_eventt0 is false. Default: true
132 """
133
134 add_prefilter_tracking_reconstruction(
135 path,
136 components=components,
137 skipGeometryAdding=skipGeometryAdding,
138 mcTrackFinding=mcTrackFinding,
139 trackFitHypotheses=trackFitHypotheses,
140 reco_tracks=reco_tracks,
141 prune_temporary_tracks=prune_temporary_tracks,
142 fit_tracks=fit_tracks,
143 use_second_cdc_hits=use_second_cdc_hits,
144 skipHitPreparerAdding=skipHitPreparerAdding,
145 svd_standalone_mode=svd_standalone_mode,
146 use_svd_to_cdc_ckf=use_svd_to_cdc_ckf,
147 use_ecl_to_cdc_ckf=use_ecl_to_cdc_ckf,
148 add_cdcTrack_QI=add_cdcTrack_QI,
149 add_vxdTrack_QI=add_vxdTrack_QI,
150 add_recoTrack_QI=add_recoTrack_QI,
151 pxd_filtering_offline=pxd_filtering_offline,
152 create_intercepts_for_pxd_ckf=create_intercepts_for_pxd_ckf,
153 append_full_grid_cdc_eventt0=append_full_grid_cdc_eventt0,
154 skip_full_grid_cdc_eventt0_if_svd_time_present=skip_full_grid_cdc_eventt0_if_svd_time_present)
155
156 add_postfilter_tracking_reconstruction(path,
157 components=components,
158 pruneTracks=pruneTracks,
159 reco_tracks=reco_tracks,
160 use_second_cdc_hits=use_second_cdc_hits,
161 prune_temporary_tracks=prune_temporary_tracks,
162 v0_finding=v0_finding,
163 flip_recoTrack=flip_recoTrack,
164 mcTrackFinding=mcTrackFinding)
165
166
167def add_prefilter_tracking_reconstruction(path, components=None, skipGeometryAdding=False,
168 mcTrackFinding=False, trackFitHypotheses=None, reco_tracks="RecoTracks",
169 prune_temporary_tracks=True, fit_tracks=True,
170 use_second_cdc_hits=False, skipHitPreparerAdding=False,
171 svd_standalone_mode="VXDTF2",
172 use_svd_to_cdc_ckf=True, svd_ckf_mode="SVD_after", use_ecl_to_cdc_ckf=False,
173 add_cdcTrack_QI=True, add_vxdTrack_QI=False, add_recoTrack_QI=False,
174 pxd_filtering_offline=False,
175 create_intercepts_for_pxd_ckf=False,
176 append_full_grid_cdc_eventt0=True,
177 skip_full_grid_cdc_eventt0_if_svd_time_present=True):
178 """
179 This function adds the tracking reconstruction modules required to calculate HLT filter decision
180 to a path.
181
182 :param path: The path to add the tracking reconstruction modules to
183 :param components: the list of geometry components in use or None for all components.
184 :param skipGeometryAdding: Advances flag: The tracking modules need the geometry module and will add it,
185 if it is not already present in the path. In a setup with multiple (conditional) paths however, it can not
186 determine, if the geometry is already loaded. This flag can be used o just turn off the geometry adding at
187 all (but you will have to add it on your own then).
188 :param skipHitPreparerAdding: Advanced flag: do not add the hit preparation (esp. VXD cluster creation
189 modules. This is useful if they have been added before already.
190 :param mcTrackFinding: Use the MC track finders instead of the realistic ones.
191 :param reco_tracks: Name of the StoreArray where the reco tracks should be stored
192 :param prune_temporary_tracks: If false, store all information of the single CDC and VXD tracks before merging.
193 If true, prune them.
194 :param fit_tracks: If false, the final track find and the TrackCreator module will no be executed
195 :param use_second_cdc_hits: If true, the second hit information will be used in the CDC track finding.
196 :param trackFitHypotheses: Which pdg hypothesis to fit. Defaults to [211, 321, 2212].
197 :param svd_standalone_mode: Which SVD standalone tracking is used.
198 Options are "VXDTF2", "SVDHough", "VXDTF2_and_SVDHough", and "SVDHough_and_VXDTF2".
199 Defaults to "VXDTF2"
200 :param use_svd_to_cdc_ckf: if true, add SVD to CDC CKF module.
201 :param svd_ckf_mode: how to apply the CKF (with or without SVD standalone tracking). Defaults to "SVD_after".
202 :param use_ecl_to_cdc_ckf: if true, add ECL to CDC CKF module.
203 :param add_cdcTrack_QI: If true, add the MVA track quality estimation
204 to the path that sets the quality indicator property of the found CDC standalone tracks
205 :param add_vxdTrack_QI: If true, add the MVA track quality estimation
206 to the path that sets the quality indicator property of the found VXDTF2 tracks
207 (ATTENTION: Standard triplet QI of VXDTF2 is replaced in this case
208 -> setting this option to 'True' will have some influence on the final track collection)
209 :param add_recoTrack_QI: If true, add the MVA track quality estimation
210 to the path that sets the quality indicator property of all found reco tracks
211 (Both other QIs needed as input.)
212 :param pxd_filtering_offline: If True, PXD data reduction (ROI filtering) is applied during the track reconstruction.
213 The reconstructed SVD/CDC tracks are used to define the ROIs and reject all PXD clusters outside of these.
214 :param create_intercepts_for_pxd_ckf: If True, the PXDROIFinder is added to the path to create PXDIntercepts to be used
215 for hit filtering when creating the CKF relations. This independent of the offline PXD digit filtering which is
216 steered by 'pxd_filtering_offline'. This can be applied for both data and MC.
217 :param append_full_grid_cdc_eventt0: If True, the module FullGridChi2TrackTimeExtractor is added to the path
218 and provides the CDC temporary EventT0.
219 :param skip_full_grid_cdc_eventt0_if_svd_time_present: if true, and if also append_full_grid_cdc_eventt0 is true, the
220 FullGridChi2TrackTimeExtractor is only executed in the events where no SVD-based EventT0 is found. If false, but
221 append_full_grid_cdc_eventt0 is true, FullGridChi2TrackTimeExtractor will be executed in each event regardless of
222 SVD EventT0 being present. Has no effect if append_full_grid_cdc_eventt0 is false. Default: true
223 """
224
225 if not is_svd_used(components) and not is_cdc_used(components):
226 return
227
228 if (add_cdcTrack_QI or add_vxdTrack_QI or add_recoTrack_QI) and not fit_tracks:
229 b2.B2ERROR("MVA track qualiy indicator requires `fit_tracks` to be enabled. Turning all off.")
230 add_cdcTrack_QI = False
231 add_vxdTrack_QI = False
232 add_recoTrack_QI = False
233
234 if add_recoTrack_QI and (not add_cdcTrack_QI or not add_vxdTrack_QI):
235 b2.B2ERROR("RecoTrack qualiy indicator requires CDC and VXD QI as input. Turning it all of.")
236 add_cdcTrack_QI = False
237 add_vxdTrack_QI = False
238 add_recoTrack_QI = False
239
240 if not skipGeometryAdding:
241 add_geometry_modules(path, components=components)
242
243 if not skipHitPreparerAdding:
244 add_hit_preparation_modules(path,
245 components=components,
246 pxd_filtering_offline=pxd_filtering_offline,
247 create_intercepts_for_pxd_ckf=create_intercepts_for_pxd_ckf)
248
249 # Material effects for all track extrapolations
250 if 'SetupGenfitExtrapolation' not in path:
251 path.add_module('SetupGenfitExtrapolation',
252 energyLossBrems=False, noiseBrems=False)
253
254 if mcTrackFinding:
255 add_mc_track_finding(path, components=components, reco_tracks=reco_tracks,
256 use_second_cdc_hits=use_second_cdc_hits)
257 else:
258 add_track_finding(path, components=components, reco_tracks=reco_tracks,
259 prune_temporary_tracks=prune_temporary_tracks,
260 use_second_cdc_hits=use_second_cdc_hits,
261 svd_standalone_mode=svd_standalone_mode,
262 use_svd_to_cdc_ckf=use_svd_to_cdc_ckf,
263 svd_ckf_mode=svd_ckf_mode,
264 use_ecl_to_cdc_ckf=use_ecl_to_cdc_ckf,
265 add_cdcTrack_QI=add_cdcTrack_QI,
266 add_vxdTrack_QI=add_vxdTrack_QI,
267 pxd_filtering_offline=pxd_filtering_offline,
268 create_intercepts_for_pxd_ckf=create_intercepts_for_pxd_ckf)
269
270 # Only run the track time extraction on the full reconstruction chain for now. Later, we may
271 # consider to do the CDC-hit based method already during the fast reconstruction stage
272 add_time_extraction(path, append_full_grid_cdc_eventt0, components=components,
273 skip_full_grid_cdc_eventt0_if_svd_time_present=skip_full_grid_cdc_eventt0_if_svd_time_present)
274
275 if fit_tracks:
276 add_prefilter_track_fit_and_track_creator(path,
277 trackFitHypotheses=trackFitHypotheses,
278 reco_tracks=reco_tracks,
279 add_mva_quality_indicator=add_recoTrack_QI)
280 # estimate the track time
281 path.add_module('TrackTimeEstimator')
282
283
284def add_postfilter_tracking_reconstruction(path, components=None, pruneTracks=False, reco_tracks="RecoTracks",
285 use_second_cdc_hits=False, prune_temporary_tracks=True, v0_finding=True,
286 flip_recoTrack=True, mcTrackFinding=False, kink_finding=True):
287 """
288 This function adds the tracking reconstruction modules not required to calculate HLT filter
289 decision to a path.
290
291 :param path: The path to add the tracking reconstruction modules to
292 :param components: the list of geometry components in use or None for all components.
293 :param pruneTracks: Delete all hits except the first and the last in the found tracks.
294 :param reco_tracks: Name of the StoreArray where the reco tracks should be stored
295 :param use_second_cdc_hits: If true, the second hit information will be used in the CDC track finding.
296 :param prune_temporary_tracks: If false, store all information of the single CDC and VXD tracks before merging.
297 If true, prune them.
298 :param v0_finding: If false, the V0 module will not be executed
299 :param flip_recoTrack: if true, add the recoTracks flipping function in the postfilter (only if PXD is part of
300 the ``components``). This flag is automatically set to false on HLT and ExpressReco.
301 :param mcTrackFinding: Use the MC track finders instead of the realistic ones.
302 :param kink_finding: if true, add the ``KinkFinder`` module to the path. This flag is automatically set to false
303 on HLT and ExpressReco.
304 """
305
306 # do not add any new modules if no tracking detectors are in the components
307 if components and not ('SVD' in components or 'CDC' in components):
308 return
309
310 # flip & refit to fix the charge of some tracks
311 if flip_recoTrack and not mcTrackFinding and is_pxd_used(components):
312 add_flipping_of_recoTracks(path, reco_tracks="RecoTracks")
313
314 # V0 finding
315 if v0_finding:
316 path.add_module('V0Finder', RecoTracks=reco_tracks, v0FitterMode=1)
317
318 # Kink finding
319 if kink_finding:
320 path.add_module('KinkFinder', RecoTracks=reco_tracks)
321
322 add_mc_matcher(path, components=components, reco_tracks=reco_tracks,
323 use_second_cdc_hits=use_second_cdc_hits)
324
325 # prune
326 if pruneTracks:
327 add_prune_tracks(path, components=components, reco_tracks=reco_tracks)
328
329 if prune_temporary_tracks or pruneTracks:
330 path.add_module("PruneRecoHits")
331
332
333def add_time_extraction(path, append_full_grid_cdc_eventt0=False, components=None,
334 skip_full_grid_cdc_eventt0_if_svd_time_present=True):
335 """
336 Add time extraction components via tracking
337
338 :param path: The path to add the tracking reconstruction modules to
339 :param append_full_grid_cdc_eventt0: If True, the module FullGridChi2TrackTimeExtractor is added to the path
340 and provides the CDC temporary EventT0.
341 :param components: the list of geometry components in use or None for all components.
342 :param skip_full_grid_cdc_eventt0_if_svd_time_present: if true, and if also append_full_grid_cdc_eventt0 is true, the
343 FullGridChi2TrackTimeExtractor is only executed in the events where no SVD-based EventT0 is found. If false, but
344 append_full_grid_cdc_eventt0 is true, FullGridChi2TrackTimeExtractor will be executed in each event regardless of
345 SVD EventT0 being present. Has no effect if append_full_grid_cdc_eventt0 is false. Default: true
346 """
347
348 # Always run SVD EventT0 estimation first so that the CDC based medhod can check whether an SVD based EventT0 exists
349 if is_svd_used(components):
350 path.add_module("SVDEventT0Estimator")
351
352 if is_cdc_used(components) and append_full_grid_cdc_eventt0:
353 path.add_module("FullGridChi2TrackTimeExtractor",
354 skipIfSVDEventT0Present=skip_full_grid_cdc_eventt0_if_svd_time_present)
355
356
357def add_cr_tracking_reconstruction(path, components=None, prune_tracks=False,
358 skip_geometry_adding=False, event_time_extraction=True,
359 merge_tracks=True, use_second_cdc_hits=False):
360 """
361 This function adds the reconstruction modules for cr tracking to a path.
362
363 :param path: The path to which to add the tracking reconstruction modules
364
365 :param components: the list of geometry components in use or None for all components.
366 :param prune_tracks: Delete all hits except the first and the last in the found tracks.
367
368 :param skip_geometry_adding: Advanced flag: The tracking modules need the geometry module and will add it,
369 if it is not already present in the path. In a setup with multiple (conditional) paths however, it cannot
370 determine if the geometry is already loaded. This flag can be used to just turn off the geometry adding
371 (but you will have to add it on your own).
372 :param event_time_extraction: extract the event time
373 :param merge_tracks: The upper and lower half of the tracks should be merged together in one track
374 :param use_second_cdc_hits: If true, the second hit information will be used in the CDC track finding.
375
376 """
377
378 # Set the run for cosmics data
379 b2.declare_cosmics()
380
381 # make sure CDC is used
382 if not is_cdc_used(components):
383 return
384
385 if not skip_geometry_adding:
386 add_geometry_modules(path, components)
387
388 add_hit_preparation_modules(path, components=components, create_intercepts_for_pxd_ckf=False)
389
390 # Material effects for all track extrapolations
391 if 'SetupGenfitExtrapolation' not in path:
392 path.add_module('SetupGenfitExtrapolation',
393 energyLossBrems=False, noiseBrems=False)
394
395 # track finding
396 add_cr_track_finding(path, reco_tracks="RecoTracks", components=components,
397 merge_tracks=merge_tracks, use_second_cdc_hits=use_second_cdc_hits)
398
399 # track fitting
400 # if tracks were merged, use the unmerged collection for time extraction
401 add_cr_track_fit_and_track_creator(path, components=components, prune_tracks=prune_tracks,
402 event_timing_extraction=event_time_extraction)
403
404 if merge_tracks:
405 # Do also fit the not merged tracks
406 add_cr_track_fit_and_track_creator(path, components=components, prune_tracks=prune_tracks,
407 event_timing_extraction=False,
408 reco_tracks="NonMergedRecoTracks", tracks="NonMergedTracks")
409
410
411def add_mc_tracking_reconstruction(path, components=None, pruneTracks=False, use_second_cdc_hits=False):
412 """
413 This function adds the standard reconstruction modules for MC tracking
414 to a path.
415
416 :param path: The path to add the tracking reconstruction modules to
417 :param components: the list of geometry components in use or None for all components.
418 :param pruneTracks: Delete all hits expect the first and the last from the found tracks.
419 :param use_second_cdc_hits: If true, the second hit information will be used in the CDC track finding.
420 """
421 add_tracking_reconstruction(path,
422 components=components,
423 pruneTracks=pruneTracks,
424 mcTrackFinding=True,
425 use_second_cdc_hits=use_second_cdc_hits)
426
427
428def add_track_finding(path, components=None, reco_tracks="RecoTracks",
429 prune_temporary_tracks=True, use_second_cdc_hits=False,
430 use_mc_truth=False, svd_ckf_mode="SVD_after", add_both_directions=True,
431 svd_standalone_mode="VXDTF2",
432 use_svd_to_cdc_ckf=True, use_ecl_to_cdc_ckf=False,
433 add_cdcTrack_QI=True, add_vxdTrack_QI=False,
434 pxd_filtering_offline=False, use_HLT_ROIs=False,
435 create_intercepts_for_pxd_ckf=False):
436 """
437 Add the CKF to the path with all the track finding related to and needed for it.
438 :param path: The path to add the tracking reconstruction modules to
439 :param reco_tracks: The store array name where to output all tracks
440 :param use_mc_truth: Use the truth information in the CKF modules
441 :param svd_ckf_mode: how to apply the CKF (with or without SVD standalone tracking). Defaults to "SVD_after".
442 :param add_both_directions: Curlers may be found in the wrong orientation by the CDC track finder, so try to
443 extrapolate also in the other direction.
444 :param svd_standalone_mode: Which SVD standalone tracking is used.
445 Options are "VXDTF2", "SVDHough", "VXDTF2_and_SVDHough", and "SVDHough_and_VXDTF2".
446 Defaults to "VXDTF2"
447 :param use_second_cdc_hits: whether to use the secondary CDC hit during CDC track finding or not
448 :param components: the list of geometry components in use or None for all components.
449 :param prune_temporary_tracks: If false, store all information of the single CDC and VXD tracks before merging.
450 If true, prune them.
451 :param use_svd_to_cdc_ckf: if true, add SVD to CDC CKF module.
452 :param use_ecl_to_cdc_ckf: if true, add ECL to CDC CKF module.
453 :param add_cdcTrack_QI: If true, add the MVA track quality estimation
454 to the path that sets the quality indicator property of the found CDC standalone tracks
455 :param add_vxdTrack_QI: If true, add the MVA track quality estimation
456 to the path that sets the quality indicator property of the found VXDTF2 tracks
457 (ATTENTION: Standard triplet QI of VXDTF2 is replaced in this case
458 -> setting this option to 'True' will have some influence on the final track collection)
459 :param pxd_filtering_offline: If True, PXD data reduction (ROI filtering) is applied during the track reconstruction.
460 The reconstructed SVD/CDC tracks are used to define the ROIs and reject all PXD clusters outside of these.
461 :param use_HLT_ROIs: Don't calculate the ROIs here but use the ones from the HLT (does obviously not work for simulation) :param create_intercepts_for_pxd_ckf: If True, the PXDROIFinder is added to the path to create PXDIntercepts to be used
462 for hit filtering when creating the CKF relations. This independent of the offline PXD digit filtering which is
463 steered by 'pxd_filtering_offline'. This can be applied for both data and MC.
464 """
465 if not is_svd_used(components) and not is_cdc_used(components):
466 return
467
468 if use_ecl_to_cdc_ckf and not is_cdc_used(components):
469 b2.B2WARNING("ECL CKF cannot be used without CDC. Turning it off.")
470 use_ecl_to_cdc_ckf = False
471
472 if use_ecl_to_cdc_ckf and not is_ecl_used(components):
473 b2.B2ERROR("ECL CKF cannot be used without ECL. Turning it off.")
474 use_ecl_to_cdc_ckf = False
475
476 # register EventTrackingInfo
477 if 'RegisterEventLevelTrackingInfo' not in path:
478 path.add_module('RegisterEventLevelTrackingInfo')
479
480 # output tracks
481 cdc_reco_tracks = "CDCRecoTracks"
482 svd_cdc_reco_tracks = "SVDCDCRecoTracks"
483 ecl_reco_tracks = "ECLRecoTracks"
484 combined_ecl_reco_tracks = "combinedECLRecoTracks"
485
486 # temporary collections
487 svd_reco_tracks = "SVDRecoTracks"
488 pxd_reco_tracks = "PXDRecoTracks"
489
490 # collections that will be pruned
491 temporary_reco_track_list = []
492
493 # the name of the most recent track collection
494 latest_reco_tracks = None
495
496 if not is_pxd_used(components):
497 if use_ecl_to_cdc_ckf and is_cdc_used(components):
498 combined_ecl_reco_tracks = reco_tracks
499 elif (not use_ecl_to_cdc_ckf) and is_svd_used(components):
500 svd_cdc_reco_tracks = reco_tracks
501 elif (not use_ecl_to_cdc_ckf) and (not is_svd_used(components)) and is_cdc_used(components):
502 cdc_reco_tracks = reco_tracks
503
504 if is_cdc_used(components):
505 add_cdc_track_finding(path, use_second_hits=use_second_cdc_hits, output_reco_tracks=cdc_reco_tracks,
506 add_mva_quality_indicator=add_cdcTrack_QI)
507 temporary_reco_track_list.append(cdc_reco_tracks)
508 latest_reco_tracks = cdc_reco_tracks
509
510 if is_svd_used(components):
511 add_svd_track_finding(path, components=components, input_reco_tracks=latest_reco_tracks,
512 output_reco_tracks=svd_cdc_reco_tracks, use_mc_truth=use_mc_truth,
513 temporary_reco_tracks=svd_reco_tracks,
514 svd_ckf_mode=svd_ckf_mode, add_both_directions=add_both_directions,
515 use_svd_to_cdc_ckf=use_svd_to_cdc_ckf, prune_temporary_tracks=prune_temporary_tracks,
516 add_mva_quality_indicator=add_vxdTrack_QI,
517 svd_standalone_mode=svd_standalone_mode)
518 temporary_reco_track_list.append(svd_reco_tracks)
519 temporary_reco_track_list.append(svd_cdc_reco_tracks)
520 latest_reco_tracks = svd_cdc_reco_tracks
521
522 if use_ecl_to_cdc_ckf and is_cdc_used(components):
523 add_eclcdc_track_finding(path, components=components, output_reco_tracks=ecl_reco_tracks,
524 prune_temporary_tracks=prune_temporary_tracks)
525
526 # TODO: add another merging step? (SVD track found by vxdtf2, and CDC track found by ECL CKF)?
527
528 path.add_module("RecoTrackStoreArrayCombiner",
529 Temp1RecoTracksStoreArrayName=latest_reco_tracks,
530 Temp2RecoTracksStoreArrayName=ecl_reco_tracks,
531 recoTracksStoreArrayName=combined_ecl_reco_tracks)
532 temporary_reco_track_list.append(ecl_reco_tracks)
533 temporary_reco_track_list.append(combined_ecl_reco_tracks)
534 latest_reco_tracks = combined_ecl_reco_tracks
535
536 if is_pxd_used(components):
537 """
538 In case we want to use offline PXD hit filtering ('pxd_filtering_offline == True'), we can decide to either use ROIs
539 created by HLT ('use_HLT_ROIs == True') or to create ROIs on the fly ('use_HLT_ROIs == False').
540 In addition, we can also just run the ROI finder to create PXDIntercepts ('create_intercepts_for_pxd_ckf == True')
541 that can be used in the ToPXDCKF relation filters to reduce the number of relations that are created. In this case
542 there is no need to apply the ROI filtering.
543 """
544 if pxd_filtering_offline or create_intercepts_for_pxd_ckf:
545 roiName = "ROIs"
546 intercepts_name = "PXDIntercepts"
547 if not use_HLT_ROIs or create_intercepts_for_pxd_ckf:
548 path.add_module("DAFRecoFitter", recoTracksStoreArrayName=latest_reco_tracks)
549
550 roiName = "ROIs_offline"
551 intercepts_name = "CKF" + intercepts_name
552 add_roiFinder(path,
553 reco_tracks=latest_reco_tracks,
554 intercepts_name=intercepts_name,
555 roiName=roiName)
556
557 if pxd_filtering_offline:
558 pxd_digifilter = b2.register_module('PXDdigiFilter')
559 pxd_digifilter.param('ROIidsName', roiName)
560 pxd_digifilter.param('PXDDigitsName', 'PXDDigits')
561 pxd_digifilter.param('PXDDigitsInsideROIName', 'PXDDigits')
562 pxd_digifilter.param('overrideDB', True)
563 pxd_digifilter.param('usePXDDataReduction', True)
564 path.add_module(pxd_digifilter)
565
566 if pxd_filtering_offline or create_intercepts_for_pxd_ckf:
567 add_pxd_reconstruction(path)
568
569 add_pxd_track_finding(path, components=components, input_reco_tracks=latest_reco_tracks,
570 use_mc_truth=use_mc_truth, output_reco_tracks=reco_tracks,
571 temporary_reco_tracks=pxd_reco_tracks,
572 add_both_directions=add_both_directions)
573 temporary_reco_track_list.append(pxd_reco_tracks)
574
575 if prune_temporary_tracks:
576 for temporary_reco_track_name in temporary_reco_track_list:
577 if temporary_reco_track_name != reco_tracks:
578 path.add_module('PruneRecoTracks', storeArrayName=temporary_reco_track_name)
579
580
581def add_cr_track_finding(path, reco_tracks="RecoTracks", components=None,
582 merge_tracks=True, use_second_cdc_hits=False):
583
584 # register EventTrackingInfo
585 if 'RegisterEventLevelTrackingInfo' not in path:
586 path.add_module('RegisterEventLevelTrackingInfo')
587
588 if not is_cdc_used(components):
589 b2.B2FATAL("CDC must be in components")
590
591 reco_tracks_from_track_finding = reco_tracks
592 if merge_tracks:
593 reco_tracks_from_track_finding = "NonMergedRecoTracks"
594
595 cdc_reco_tracks = "CDCRecoTracks"
596 if not is_pxd_used(components) and not is_svd_used(components):
597 cdc_reco_tracks = reco_tracks_from_track_finding
598
599 svd_cdc_reco_tracks = "SVDCDCRecoTracks"
600 if not is_pxd_used(components):
601 svd_cdc_reco_tracks = reco_tracks_from_track_finding
602
603 full_reco_tracks = reco_tracks_from_track_finding
604
605 # CDC track finding with default settings
606 add_cdc_cr_track_finding(path, merge_tracks=False, use_second_cdc_hits=use_second_cdc_hits,
607 output_reco_tracks=cdc_reco_tracks)
608
609 latest_reco_tracks = cdc_reco_tracks
610
611 if is_svd_used(components):
612 add_svd_track_finding(path, components=components, input_reco_tracks=latest_reco_tracks,
613 output_reco_tracks=svd_cdc_reco_tracks,
614 svd_ckf_mode="cosmics", add_both_directions=True, svd_standalone_mode="VXDTF2")
615 latest_reco_tracks = svd_cdc_reco_tracks
616
617 if is_pxd_used(components):
618 add_pxd_cr_track_finding(path, components=components, input_reco_tracks=latest_reco_tracks,
619 output_reco_tracks=full_reco_tracks, add_both_directions=True)
620
621 if merge_tracks:
622 # merge the tracks together
623 path.add_module("CosmicsTrackMerger", inputRecoTracks=reco_tracks_from_track_finding,
624 outputRecoTracks=reco_tracks)
625
626
627def add_mc_track_finding(path, components=None, reco_tracks="RecoTracks", use_second_cdc_hits=False):
628 """
629 Add the MC based TrackFinder to the path.
630
631 :param path: The path to add the tracking reconstruction modules to
632 :param components: the list of geometry components in use or None for all components.
633 :param reco_tracks: Name of the StoreArray where the reco tracks should be stored
634 :param use_second_cdc_hits: If true, the second hit information will be used in the CDC track finding.
635 """
636 if is_cdc_used(components) or is_pxd_used(components) or is_svd_used(components):
637 # find MCTracks in CDC, SVD and PXD (or a subset of it)
638 path.add_module('TrackFinderMCTruthRecoTracks',
639 RecoTracksStoreArrayName=reco_tracks,
640 UseSecondCDCHits=use_second_cdc_hits,
641 UsePXDHits=is_pxd_used(components),
642 UseSVDHits=is_svd_used(components),
643 UseCDCHits=is_cdc_used(components))
644
645
646def add_tracking_for_PXDDataReduction_simulation(path, components, svd_cluster='__ROIsvdClusters'):
647 """
648 This function adds the standard reconstruction modules for tracking to be used for the simulation of PXD data
649 reduction to a path.
650
651 :param path: The path to add the tracking reconstruction modules to
652 :param components: the list of geometry components in use or None for all components, always exclude the PXD.
653 """
654
655 if not is_svd_used(components):
656 return
657
658 # Material effects
659 if 'SetupGenfitExtrapolation' not in path:
660 material_effects = b2.register_module('SetupGenfitExtrapolation')
661 material_effects.set_name(
662 'SetupGenfitExtrapolationForPXDDataReduction')
663 path.add_module(material_effects)
664
665 # SET StoreArray names
666 svd_reco_tracks = "__ROIsvdRecoTracks"
667
668 # SVD ONLY TRACK FINDING
669 add_svd_standalone_tracking(path, components=['SVD'], reco_tracks=svd_reco_tracks, suffix="__ROI",
670 svd_clusters=svd_cluster)
671
672 # TRACK FITTING
673 dafRecoFitter = b2.register_module("DAFRecoFitter")
674 dafRecoFitter.set_name("SVD-only DAFRecoFitter")
675 dafRecoFitter.param('recoTracksStoreArrayName', svd_reco_tracks)
676 dafRecoFitter.param('svdHitsStoreArrayName', svd_cluster)
677 path.add_module(dafRecoFitter)
678
679
680def add_roiFinder(path, reco_tracks="RecoTracks", intercepts_name="PXDIntercepts", roiName="ROIs"):
681 """
682 Add the ROI finding to the path creating ROIs out of reco tracks by extrapolating them to the PXD volume.
683 :param path: Where to add the module to.
684 :param reco_tracks: Which tracks to use in the extrapolation step.
685 :param roiName: Name of the produced/stored ROIs.
686 """
687
688 pxdDataRed = b2.register_module('PXDROIFinder')
689 param_pxdDataRed = {
690 'recoTrackListName': reco_tracks,
691 'PXDInterceptListName': intercepts_name,
692 'ROIListName': roiName,
693 }
694 pxdDataRed.param(param_pxdDataRed)
695 path.add_module(pxdDataRed)
696
697
698def add_vxd_standalone_cosmics_finder(
699 path,
700 reco_tracks="RecoTracks",
701 pxd_spacepoints_name="PXDSpacePoints",
702 svd_spacepoints_name="SVDSpacePoints",
703 quality_cut=0.0001,
704 min_sps=3,
705 max_rejected_sps=5):
706 """
707 Convenience function for adding VXD standalone cosmics track finding for B = 0 Tesla
708 to the path.
709
710 The result is a StoreArray with name @param reco_tracks containing one or zero reco tracks per event.
711 This track candidates have an arbitrary but large momentum seed in the direction of the fitted line.
712 The position and momentum seed is obtained using a principal component analysis method.
713
714 :param path: basf2 path
715 :param reco_tracks: Name of the output RecoTracks; defaults to RecoTracks.
716 :param spacepoints_name: name of store array containing the spacepoints; defaults to SpacePoints
717 :param quality_cut: Cut on the chi squared value of the line fit; candidates with values above the cut will be
718 rejected; defaults to 0.0001
719 :param min_sps: Minimal number of SpacePoints required to build a track candidate; defaults to 3;
720 :param max_rejected_sps: Maximal number of retries to refit a track after the worst spacepoint was removed;
721 defaults to 5;
722 """
723
724 # register EventTrackingInfo
725 if 'RegisterEventLevelTrackingInfo' not in path:
726 path.add_module('RegisterEventLevelTrackingInfo')
727
728 if "PXDSpacePointCreator" not in [m.name() for m in path.modules()]:
729 path.add_module('PXDSpacePointCreator', SpacePoints=pxd_spacepoints_name)
730
731 # SVDSpacePointCreator is applied in funtion add_svd_reconstruction
732
733 track_finder = b2.register_module('TrackFinderVXDCosmicsStandalone')
734 track_finder.param('SpacePointTrackCandArrayName', "")
735 track_finder.param('SpacePoints', [pxd_spacepoints_name, svd_spacepoints_name])
736 track_finder.param('QualityCut', quality_cut)
737 track_finder.param('MinSPs', min_sps)
738 track_finder.param('MaxRejectedSPs', max_rejected_sps)
739 path.add_module(track_finder)
740
741 converter = b2.register_module('SPTC2RTConverter')
742 converter.param('recoTracksStoreArrayName', reco_tracks)
743 path.add_module(converter)
744