Belle II Software  release-05-02-19
tracked_event_generation.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 import basf2
5 import tracking
6 
7 from tracking.metamodules import IfMCParticlesPresentModule, IfStoreArrayPresentModule
8 from . import utilities
9 from .event_generation import ReadOrGenerateEventsRun
10 
11 import logging
12 
13 
14 def get_logger():
15  return logging.getLogger(__name__)
16 
17 
19  """ Apply tracking to presimulated events or events generated on the fly """
20 
21 
22  description = "Apply tracking to presimulated events or events generated on the fly."
23 
24 
25  finder_module = None
26 
27 
28  tracking_coverage = {
29  'UsePXDHits': True,
30  'UseSVDHits': True,
31  'UseCDCHits': True,
32  'UseOnlyAxialCDCHits': False,
33  'UseOnlyBeforeTOP': True,
34  'UseReassignedHits': True,
35  'UseNLoops': 1,
36  'WhichParticles': [],
37  }
38 
39 
40  fit_tracks = False
41 
42  def create_argument_parser(self, **kwds):
43  """Convert command-line arguments to basf2 argument list"""
44  argument_parser = super().create_argument_parser(**kwds)
45 
46  tracking_argument_group = argument_parser.add_argument_group("Tracking setup arguments")
47 
48  tracking_argument_group.add_argument(
49  '-f',
50  '--finder',
51  choices=utilities.NonstrictChoices(finder_modules_by_short_name.keys()),
52  default=self.finder_module,
53  dest='finder_module',
54  help='Name of the finder module to be evaluated.',)
55 
56  tracking_argument_group.add_argument(
57  '--fit',
58  action="store_true",
59  default=self.fit_tracks,
60  dest='fit_tracks',
61  help='Apply the fitting to the found tracks'
62  )
63 
64  return argument_parser
65 
66  def create_path(self):
67  """Sets up a path that plays back pregenerated events or generates events
68  based on the properties in the base class."""
69  path = super().create_path()
70 
71  # setting up fitting is only necessary when testing
72  # track finding comonenst ex-situ
73  if self.fit_tracks:
74  if 'SetupGenfitExtrapolation' not in path:
75  # Prepare Genfit extrapolation
76  path.add_module('SetupGenfitExtrapolation')
77 
78  if self.finder_module is not None:
79  # Setup track finder
80  utilities.extend_path(path,
81  self.finder_module,
82  finder_modules_by_short_name,
83  allow_function_import=True)
84 
85  # determine which sub-detector hits will be used
86  tracking_coverage = dict(self.tracking_coverage)
87 
88  matching_coverage = {key: value for key, value in tracking_coverage.items()
89  if key in ('UsePXDHits', 'UseSVDHits', 'UseCDCHits', 'MinimalEfficiency', 'MinimalPurity')}
90  # Removing minimal efficiency and purity as they are only parameters of the matching
91  if "MinimalEfficiency" in tracking_coverage:
92  tracking_coverage.pop("MinimalEfficiency")
93  if "MinimalPurity" in tracking_coverage:
94  tracking_coverage.pop("MinimalPurity")
95 
96  # Include the mc tracks if the monte carlo data is presentx
97  if 'MCRecoTracksMatcher' not in path:
98  # Reference Monte Carlo tracks
99  track_finder_mc_truth_module = basf2.register_module('TrackFinderMCTruthRecoTracks')
100 
101  # Track matcher
102  mc_track_matcher_module = basf2.register_module('MCRecoTracksMatcher')
103 
104  path.add_module(IfMCParticlesPresentModule(track_finder_mc_truth_module))
105  path.add_module(IfMCParticlesPresentModule(mc_track_matcher_module))
106 
107  # this ensures that the parameters are set in both cases (if the modules have been added or are already in the path)
108  # only check for containment to also cope with the "IfMCParticlesPresentModule" cases correctly
109  for module in path.modules():
110  if 'MCRecoTracksMatcher' in module.name():
111  module.param({
112  'mcRecoTracksStoreArrayName': 'MCRecoTracks',
113  'MinimalPurity': 0.66,
114  'prRecoTracksStoreArrayName': "RecoTracks",
115  **matching_coverage
116  })
117  if 'TrackFinderMCTruthRecoTracks' in module.name():
118  module.param({
119  'RecoTracksStoreArrayName': 'MCRecoTracks',
120  **tracking_coverage
121  })
122 
123  if self.fit_tracks:
124  # Fit tracks
125  gen_fitter_module = basf2.register_module('DAFRecoFitter')
126  gen_fitter_module.param({'pdgCodesToUseForFitting': [13]})
127  path.add_module(gen_fitter_module)
128  trackbuilder = basf2.register_module('TrackCreator', pdgCodes=[13])
129  path.add_module(trackbuilder)
130 
131  return path
132 
133 
134 def add_standard_finder(path):
135  """adds the standard track finding to the path"""
136 
137  import tracking
138  components = None
139  for module in path.modules():
140  if module.type() == "Geometry":
141  components = utilities.get_module_param(module, "components")
142  if not components:
143  components = None
144 
145  if 'SetupGenfitExtrapolation' not in path:
146  path.add_module('SetupGenfitExtrapolation', energyLossBrems=False, noiseBrems=False)
147 
148  tracking.add_track_finding(path, components=components)
149 
150 
151 def add_cosmics_finder(path):
152  import tracking
153  components = None
154  for module in path.modules():
155  if module.type() == "Geometry":
156  components = utilities.get_module_param(module, "components")
157  if not components:
158  components = None
159 
160  if 'SetupGenfitExtrapolation' not in path:
161  path.add_module('SetupGenfitExtrapolation', energyLossBrems=False, noiseBrems=False)
162 
163  tracking.add_cr_tracking_reconstruction(path, components=components)
164 
165 
166 def add_standard_reconstruction(path):
167  import reconstruction
168  components = None
169  for module in path.modules():
170  if module.type() == "Geometry":
171  components = utilities.get_module_param(module, "components")
172  if not components:
173  components = None
174  reconstruction.add_reconstruction(path, components=components)
175 
176 
177 def add_cosmics_reconstruction(path):
178  import reconstruction
179  components = None
180  for module in path.modules():
181  if module.type() == "Geometry":
182  components = utilities.get_module_param(module, "components")
183  if not components:
184  components = None
185  reconstruction.add_cosmics_reconstruction(path, components=components)
186 
187 
188 finder_modules_by_short_name = {
189  'MC': 'TrackFinderMCTruthRecoTracks',
190  'Reconstruction': add_standard_reconstruction,
191  'CosmicsReconstruction': add_cosmics_reconstruction,
192  'TrackFinder': add_standard_finder,
193  'CosmicsTrackFinder': add_cosmics_finder,
194  'TrackFinderVXD': tracking.add_vxd_track_finding_vxdtf2,
195  'TFCDC': lambda path: tracking.add_cdc_track_finding(path, with_ca=True),
196  'TFCDC_Cosmics': lambda path: tracking.add_cdc_cr_track_finding(path),
197  'TFCDC_Global': tracking.add_cdc_track_finding,
198  'TFCDC_Ca': lambda path: (path.add_module('TFCDC_WireHitPreparer',
199  flightTimeEstimation="outwards"),
200  path.add_module('TFCDC_ClusterPreparer',
201  SuperClusterDegree=3,
202  SuperClusterExpandOverApogeeGap=True),
203  path.add_module('TFCDC_SegmentFinderFacetAutomaton'),
204  path.add_module("TFCDC_TrackFinderSegmentPairAutomaton"),
205  path.add_module("TFCDC_TrackCreatorSingleSegments",
206  MinimalHitsBySuperLayerId={0: 15}),
207  path.add_module('TFCDC_TrackExporter')),
208  'TFCDC_Axial': lambda path: (path.add_module('TFCDC_WireHitPreparer',
209  flightTimeEstimation="outwards"),
210  path.add_module('TFCDC_ClusterPreparer'),
211  path.add_module('TFCDC_AxialTrackFinderLegendre'),
212  path.add_module('TFCDC_TrackExporter')),
213  'TFCDC_Segments': lambda path: (path.add_module('TFCDC_WireHitPreparer',
214  flightTimeEstimation="outwards"),
215  path.add_module('TFCDC_ClusterPreparer'),
216  path.add_module('TFCDC_SegmentFinderFacetAutomaton'),
217  path.add_module('TFCDC_TrackCreatorSingleSegments',
218  MinimalHitsBySuperLayerId={sl_id: 0 for sl_id in range(9)}),
219  path.add_module('TFCDC_TrackExporter')),
220  'TFCDC_MCSegments': lambda path: (path.add_module('TFCDC_WireHitPreparer',
221  flightTimeEstimation="outwards"),
222  path.add_module('TFCDC_SegmentCreatorMCTruth'),
223  path.add_module('TFCDC_SegmentLinker',
224  segments="CDCSegment2DVector",
225  filter="truth"),
226  path.add_module('TFCDC_TrackCreatorSingleSegments',
227  MinimalHitsBySuperLayerId={sl_id: 0 for sl_id in range(9)}),
228  path.add_module('TFCDC_TrackExporter')),
229  'FirstLoop': lambda path: path.add_module('TFCDC_WireHitPreparer', UseNLoops=1.0),
230 }
231 
232 
234  """Generate, simulate and reconstruct events"""
235 
236  generator_module = 'EvtGenInput'
237 
238  def finder_module(self, path):
239  """Add track reconstruction to the basf2 path"""
240  tracking.add_tracking_reconstruction(path, components=self.components)
tracking.run.tracked_event_generation.ReadOrGenerateTrackedEventsRun
Definition: tracked_event_generation.py:18
tracking.run.tracked_event_generation.ReadOrGenerateTrackedEventsRun.create_path
def create_path(self)
Definition: tracked_event_generation.py:66
tracking.run.tracked_event_generation.StandardReconstructionEventsRun
Definition: tracked_event_generation.py:233
tracking.add_tracking_reconstruction
def add_tracking_reconstruction(path, components=None, pruneTracks=False, skipGeometryAdding=False, mcTrackFinding=False, trackFitHypotheses=None, reco_tracks="RecoTracks", prune_temporary_tracks=True, fit_tracks=True, use_second_cdc_hits=False, skipHitPreparerAdding=False, use_svd_to_cdc_ckf=True, use_ecl_to_cdc_ckf=False, add_cdcTrack_QI=True, add_vxdTrack_QI=False, add_recoTrack_QI=False)
Definition: __init__.py:8
tracking.run.event_generation.ReadOrGenerateEventsRun.components
components
By default, do specific components.
Definition: event_generation.py:41
reconstruction.add_cosmics_reconstruction
def add_cosmics_reconstruction(path, components=None, pruneTracks=True, skipGeometryAdding=False, eventTimingExtraction=True, addClusterExpertModules=True, merge_tracks=True, top_in_counter=False, data_taking_period='early_phase3', use_second_cdc_hits=False, add_muid_hits=False, reconstruct_cdst=False)
Definition: reconstruction.py:256
reconstruction.add_reconstruction
def add_reconstruction(path, components=None, pruneTracks=True, add_trigger_calculation=True, skipGeometryAdding=False, trackFitHypotheses=None, addClusterExpertModules=True, use_second_cdc_hits=False, add_muid_hits=False, reconstruct_cdst=None, nCDCHitsMax=6000, nSVDShaperDigitsMax=70000, event_abort=default_event_abort, use_random_numbers_for_hlt_prescale=True)
Definition: reconstruction.py:130
tracking.run.event_generation.ReadOrGenerateEventsRun
Definition: event_generation.py:26
tracking.metamodules
Definition: metamodules.py:1
tracking.run.tracked_event_generation.ReadOrGenerateTrackedEventsRun.create_argument_parser
def create_argument_parser(self, **kwds)
Definition: tracked_event_generation.py:42
tracking.run.tracked_event_generation.ReadOrGenerateTrackedEventsRun.finder_module
finder_module
Name of the finder module to be used - can be everything that is accepted by tracking....
Definition: tracked_event_generation.py:25
tracking.run.tracked_event_generation.ReadOrGenerateTrackedEventsRun.fit_tracks
bool fit_tracks
By default, do not add the track fitting to the execution.
Definition: tracked_event_generation.py:40
tracking.add_track_finding
def add_track_finding(path, components=None, reco_tracks="RecoTracks", prune_temporary_tracks=True, use_second_cdc_hits=False, use_mc_truth=False, svd_ckf_mode="VXDTF2_after", add_both_directions=True, use_svd_to_cdc_ckf=True, use_ecl_to_cdc_ckf=False, add_cdcTrack_QI=True, add_vxdTrack_QI=False)
Definition: __init__.py:185
tracking.add_cr_tracking_reconstruction
def add_cr_tracking_reconstruction(path, components=None, prune_tracks=False, skip_geometry_adding=False, event_time_extraction=True, data_taking_period="early_phase3", top_in_counter=False, merge_tracks=True, use_second_cdc_hits=False)
Definition: __init__.py:110
tracking.metamodules.IfMCParticlesPresentModule
Definition: metamodules.py:292
tracking.run.utilities.NonstrictChoices
Definition: utilities.py:24
tracking.run.tracked_event_generation.ReadOrGenerateTrackedEventsRun.tracking_coverage
dictionary tracking_coverage
States which detectors the finder module covers like as a dictionary like.
Definition: tracked_event_generation.py:28