Belle II Software  release-08-01-10
TrackCandidateResultRefiner.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include <tracking/vxdHoughTracking/findlets/TrackCandidateResultRefiner.h>
9 #include <framework/core/ModuleParamList.h>
10 #include <framework/core/ModuleParamList.templateDetails.h>
11 #include <framework/geometry/BFieldManager.h>
12 #include <tracking/spacePointCreation/SpacePointTrackCand.h>
13 #include <tracking/trackFindingVXD/trackQualityEstimators/QualityEstimatorCircleFit.h>
14 #include <tracking/trackFindingVXD/trackQualityEstimators/QualityEstimatorMC.h>
15 #include <tracking/trackFindingVXD/trackQualityEstimators/QualityEstimatorRiemannHelixFit.h>
16 #include <tracking/trackFindingVXD/trackQualityEstimators/QualityEstimatorTripletFit.h>
17 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
18 
19 using namespace Belle2;
20 using namespace TrackFindingCDC;
21 using namespace vxdHoughTracking;
22 
23 TrackCandidateResultRefiner::~TrackCandidateResultRefiner() = default;
24 
25 
26 TrackCandidateResultRefiner::TrackCandidateResultRefiner() : Super()
27 {
29 }
30 
31 void TrackCandidateResultRefiner::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
32 {
33  Super::exposeParameters(moduleParamList, prefix);
34 
35  m_overlapResolver.exposeParameters(moduleParamList, TrackFindingCDC::prefixed(prefix, "refinerOverlapResolver"));
36 
37  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "trackQualityEstimationMethod"), m_EstimationMethod,
38  "Identifier which estimation method to use. Valid identifiers are: [mcInfo, circleFit, tripletFit, helixFit]",
40  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "MCRecoTracksStoreArrayName"), m_MCRecoTracksStoreArrayName,
41  "Only required for MCInfo method. Name of StoreArray containing MCRecoTracks.",
43  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "MCStrictQualityEstimator"), m_MCStrictQualityEstimator,
44  "Only required for MCInfo method. If false combining several MCTracks is allowed.",
46 
47  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minQualitiyIndicatorSize3"), m_minQualitiyIndicatorSize3,
48  "Cut on quality indicator value for track candidates of size 3. Only accept SpacePointTrackCands with QI above this value.",
50  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minQualitiyIndicatorSize4"), m_minQualitiyIndicatorSize4,
51  "Cut on quality indicator value for track candidates of size 4. Only accept SpacePointTrackCands with QI above this value.",
53  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minQualitiyIndicatorSize5"), m_minQualitiyIndicatorSize5,
54  "Cut on quality indicator value for track candidates of size 5. Only accept SpacePointTrackCands with QI above this value.",
56 
57  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "maxNumberOfEachPathLength"), m_maxNumberOfEachPathLength,
58  "Maximum number of SpacePointTrackCands with a length of 3, 4, 5, or 6 each.",
60 }
61 
63 {
65 
66  // create pointer to chosen estimator
67  if (m_EstimationMethod == "mcInfo") {
68  StoreArray<RecoTrack> mcRecoTracks;
70  m_estimator = std::make_unique<QualityEstimatorMC>(m_MCRecoTracksStoreArrayName, m_MCStrictQualityEstimator);
71  } else if (m_EstimationMethod == "tripletFit") {
72  m_estimator = std::make_unique<QualityEstimatorTripletFit>();
73  } else if (m_EstimationMethod == "circleFit") {
74  m_estimator = std::make_unique<QualityEstimatorCircleFit>();
75  } else if (m_EstimationMethod == "helixFit") {
76  m_estimator = std::make_unique<QualityEstimatorRiemannHelixFit>();
77  }
78  B2ASSERT("QualityEstimator could not be initialized with method: " << m_EstimationMethod, m_estimator);
79 }
80 
82 {
84 
85  // BField is required by all QualityEstimators
86  double bFieldZ = BFieldManager::getField(0, 0, 0).Z() / Unit::T;
87  m_estimator->setMagneticFieldStrength(bFieldZ);
88 
89  if (m_EstimationMethod == "mcInfo") {
90  QualityEstimatorMC* MCestimator = static_cast<QualityEstimatorMC*>(m_estimator.get());
91  MCestimator->forceUpdateClusterNames();
92  }
93 }
94 
95 void TrackCandidateResultRefiner::apply(std::vector<SpacePointTrackCand>& unrefinedResults,
96  std::vector<SpacePointTrackCand>& refinedResults)
97 {
98  refinedResults.clear();
99  std::vector<SpacePointTrackCand> selectedResults;
100  selectedResults.reserve(unrefinedResults.size());
101  // assign a QI computed using the selected QualityEstimator for each given SpacePointTrackCand
102  for (SpacePointTrackCand& aTrackCandidate : unrefinedResults) {
103  double qi = m_estimator->estimateQuality(aTrackCandidate.getSortedHits());
104  aTrackCandidate.setQualityIndicator(qi);
105 
106  // Track candidates of size >= 6 are very rare. If the track candidate already is quite long (>= 6 hits),
107  // it's very likely it's a valid track anyway, so QI is not checked.
108  if ((aTrackCandidate.getNHits() == 3 and qi >= m_minQualitiyIndicatorSize3) or
109  (aTrackCandidate.getNHits() == 4 and qi >= m_minQualitiyIndicatorSize4) or
110  (aTrackCandidate.getNHits() == 5 and qi >= m_minQualitiyIndicatorSize5) or
111  (aTrackCandidate.getNHits() >= 6)) {
112  selectedResults.emplace_back(aTrackCandidate);
113  }
114  }
115 
116  // return early if nothing to do
117  if (selectedResults.size() <= 1) {
118  std::swap(selectedResults, refinedResults);
119  return;
120  }
121 
122  // sort by number of hits in the track candidate and by the QI
123  std::sort(selectedResults.begin(), selectedResults.end(),
124  [](const SpacePointTrackCand & a, const SpacePointTrackCand & b) {
125  return ((a.getNHits() > b.getNHits()) or
126  (a.getNHits() == b.getNHits() and a.getQualityIndicator() > b.getQualityIndicator()));
127  });
128 
129  std::array<uint, 8> numberOfHitsInCheckedSPTCs{{0, 0, 0, 0, 0, 0, 0, 0}};
130  refinedResults.reserve(selectedResults.size());
131  for (auto& currentSPTC : selectedResults) {
132  if (numberOfHitsInCheckedSPTCs[currentSPTC.size()] < m_maxNumberOfEachPathLength) {
133  numberOfHitsInCheckedSPTCs[currentSPTC.size()] += 1;
134  refinedResults.emplace_back(currentSPTC);
135  }
136  }
137 
138  m_overlapResolver.apply(refinedResults);
139 }
The Module parameter list class.
Class implementing the algorithm used for the MC based quality estimation.
void forceUpdateClusterNames()
Setter to force the class to update its cluster names.
Storage for (VXD) SpacePoint-based track candidates.
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
void initialize() override
Receive and dispatch signal before the start of the event processing.
void beginRun() override
Receive and dispatch signal for the beginning of a new run.
void addProcessingSignalListener(ProcessingSignalListener *psl)
Register a processing signal listener to be notified.
virtual void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix)
Forward prefixed parameters of this findlet to the module parameter list.
Definition: Findlet.h:69
Interface for an algorithm part that needs to receive the module processing signals.
static const double T
[tesla]
Definition: Unit.h:120
void apply(std::vector< SpacePointTrackCand > &spacePointTrackCandsToResolve) override
Reject bad SpacePointTrackCands and bad hits inside the remaining.
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) override
Expose the parameters of the sub findlets.
double m_minQualitiyIndicatorSize4
Cut on the quality estimator and only further propagate SPTCs with four hits that are above this valu...
std::string m_EstimationMethod
Identifier which estimation method to use.
uint m_maxNumberOfEachPathLength
Accept nHits for each size at maximum.
double m_minQualitiyIndicatorSize3
Cut on the quality estimator and only further propagate SPTCs with three hits that are above this val...
void apply(std::vector< SpacePointTrackCand > &unrefinedResults, std::vector< SpacePointTrackCand > &refinedResults) override
Reject bad SpacePointTrackCands and bad hits inside the remaining.
void beginRun() override
End run and write Root file.
TrackCandidateOverlapResolver m_overlapResolver
Resolve hit overlaps in track candidates.
std::string m_MCRecoTracksStoreArrayName
sets the name of the expected StoreArray containing MCRecoTracks. Only required for MCInfo method
std::unique_ptr< QualityEstimatorBase > m_estimator
pointer to the selected QualityEstimator
double m_minQualitiyIndicatorSize5
Cut on the quality estimator and only further propagate SPTCs with five hits that are above this valu...
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) override
Expose the parameters of the sub findlets.
void addParameter(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
static void getField(const double *pos, double *field)
return the magnetic field at a given position.
Definition: BFieldManager.h:91
Abstract base class for different kinds of events.