Belle II Software  release-08-01-10
RecoTrackStorer.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/RecoTrackStorer.h>
9 #include <framework/core/ModuleParamList.h>
10 #include <framework/core/ModuleParamList.templateDetails.h>
11 #include <framework/geometry/BFieldManager.h>
12 #include <tracking/dataobjects/RecoTrack.h>
13 #include <svd/dataobjects/SVDCluster.h>
14 #include <tracking/spacePointCreation/SpacePoint.h>
15 #include <tracking/spacePointCreation/SpacePointTrackCand.h>
16 #include <tracking/trackFindingVXD/trackQualityEstimators/QualityEstimatorCircleFit.h>
17 #include <tracking/trackFindingVXD/trackQualityEstimators/QualityEstimatorMC.h>
18 #include <tracking/trackFindingVXD/trackQualityEstimators/QualityEstimatorRiemannHelixFit.h>
19 #include <tracking/trackFindingVXD/trackQualityEstimators/QualityEstimatorTripletFit.h>
20 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
21 #include <tracking/trackFindingCDC/utilities/Algorithms.h>
22 #include <tracking/trackFindingCDC/utilities/WeightedRelation.h>
23 
24 using namespace Belle2;
25 using namespace TrackFindingCDC;
26 using namespace vxdHoughTracking;
27 
28 RecoTrackStorer::~RecoTrackStorer() = default;
29 
30 RecoTrackStorer::RecoTrackStorer() : Super()
31 {
32 }
33 
34 void RecoTrackStorer::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
35 {
36  Super::exposeParameters(moduleParamList, prefix);
37 
38  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "SVDClustersStoreArrayName"), m_SVDClustersStoreArrayName,
39  "Name of the SVDClusters Store Array.", m_SVDClustersStoreArrayName);
40 
41  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "RecoTracksStoreArrayName"), m_RecoTracksStoreArrayName,
42  "Name of the RecoTracks Store Array.", m_RecoTracksStoreArrayName);
43 
44  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "SVDSpacePointTrackCandsStoreArrayName"),
46  "Name of the SpacePointTrackCand Store Array.", m_SVDSpacePointTrackCandsStoreArrayName);
47 
48  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "ResultStorerQualityEstimationMethod"), m_EstimationMethod,
49  "Identifier which estimation method to use. Valid identifiers are: [mcInfo, circleFit, tripletFit, helixFit].",
51 
52  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "ResultStorerMCRecoTracksStoreArrayName"),
54  "Only required for MCInfo method. Name of StoreArray containing MCRecoTracks.",
56 
57  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "ResultStorerMCStrictQualityEstimator"),
59  "Only required for MCInfo method. If false combining several MCTracks is allowed.",
61 }
62 
64 {
66 
72 
73  // create pointer to chosen estimator
74  if (m_EstimationMethod == "mcInfo") {
75  StoreArray<RecoTrack> mcRecoTracks;
77  m_estimator = std::make_unique<QualityEstimatorMC>(m_MCRecoTracksStoreArrayName, m_MCStrictQualityEstimator);
78  } else if (m_EstimationMethod == "tripletFit") {
79  m_estimator = std::make_unique<QualityEstimatorTripletFit>();
80  } else if (m_EstimationMethod == "circleFit") {
81  m_estimator = std::make_unique<QualityEstimatorCircleFit>();
82  } else if (m_EstimationMethod == "helixFit") {
83  m_estimator = std::make_unique<QualityEstimatorRiemannHelixFit>();
84  }
85  B2ASSERT("QualityEstimator could not be initialized with method: " << m_EstimationMethod, m_estimator);
86 }
87 
89 {
91 
92  // BField is required by all QualityEstimators
93  double bFieldZ = BFieldManager::getField(0, 0, 0).Z() / Unit::T;
94  m_estimator->setMagneticFieldStrength(bFieldZ);
95 
96  if (m_EstimationMethod == "mcInfo") {
97  QualityEstimatorMC* MCestimator = static_cast<QualityEstimatorMC*>(m_estimator.get());
98  MCestimator->forceUpdateClusterNames();
99  }
100 }
101 
103 {
105 
106  m_usedClusters.clear();
107  m_usedSpacePoints.clear();
108 }
109 
110 void RecoTrackStorer::apply(std::vector<SpacePointTrackCand>& finishedResults,
111  const std::vector<const SpacePoint*>& spacePoints)
112 {
113  for (auto& thisSPTC : finishedResults) {
114  // do nothing if the SpacePointTrackCand is not active
115  if (!thisSPTC.hasRefereeStatus(SpacePointTrackCand::c_isActive)) {
116  continue;
117  }
118 
119  auto sortedHits = thisSPTC.getSortedHits();
120  const auto& estimatorResult = m_estimator->estimateQualityAndProperties(sortedHits);
121 
122  const ROOT::Math::XYZVector trackPosition(sortedHits.front()->X(), sortedHits.front()->Y(), sortedHits.front()->Z());
123  const ROOT::Math::XYZVector& trackMomentum = *estimatorResult.p;
124  const short& trackChargeSeed = estimatorResult.curvatureSign ? -1 * (*(estimatorResult.curvatureSign)) : 0;
125  const double qi = estimatorResult.qualityIndicator;
126 
127  RecoTrack* newRecoTrack = m_storeRecoTracks.appendNew(trackPosition, trackMomentum, trackChargeSeed, "",
129 
130  // TODO: find out where these numbers come from!
131  // This is copied from the VXDTF2 counterpart tracking/modules/spacePointCreator/SPTCmomentumSeedRetrieverModule !
132  TVectorD stateSeed(6); //(x,y,z,px,py,pz)
133  TMatrixDSym covSeed(6);
134  covSeed(0, 0) = 0.01 ; covSeed(1, 1) = 0.01 ; covSeed(2, 2) = 0.04 ; // 0.01 = 0.1^2 = dx*dx =dy*dy. 0.04 = 0.2^2 = dz*dz
135  covSeed(3, 3) = 0.01 ; covSeed(4, 4) = 0.01 ; covSeed(5, 5) = 0.04 ;
136 
137  stateSeed(0) = (sortedHits.front()->X());
138  stateSeed(1) = (sortedHits.front()->Y());
139  stateSeed(2) = (sortedHits.front()->Z());
140  if (estimatorResult.p) {
141  auto momentumSeed = *(estimatorResult.p);
142  stateSeed(3) = momentumSeed.X();
143  stateSeed(4) = momentumSeed.Y();
144  stateSeed(5) = momentumSeed.Z();
145  } else {
146  stateSeed(3) = 0;
147  stateSeed(4) = 0;
148  stateSeed(5) = 0;
149  }
150 
151  thisSPTC.set6DSeed(stateSeed);
152  thisSPTC.setCovSeed(covSeed);
153  thisSPTC.setChargeSeed(trackChargeSeed);
154  // until here
155 
156  // Set information not required by constructor
157  newRecoTrack->setSeedCovariance(covSeed);
158 
159  // Transfer quality indicator from SPTC to RecoTrack
160  newRecoTrack->setQualityIndicator(qi);
161 
163  // Add relation to SpacePointTrackCandidate
164  newRecoTrack->addRelationTo(newSPTC);
165 
166 
167  unsigned int sortingParameter = 0;
168  for (const SpacePoint* spacePoint : sortedHits) {
169  m_usedSpacePoints.insert(spacePoint);
170 
171  RelationVector<SVDCluster> relatedClusters = spacePoint->getRelationsTo<SVDCluster>(m_SVDClustersStoreArrayName);
172  for (const SVDCluster& relatedCluster : relatedClusters) {
173  m_usedClusters.insert(&relatedCluster);
174  newRecoTrack->addSVDHit(&relatedCluster, sortingParameter, Belle2::RecoHitInformation::c_SVDHough);
175  sortingParameter++;
176  }
177  }
178  }
179 
180  for (const SpacePoint* spacePoint : spacePoints) {
181  if (TrackFindingCDC::is_in(spacePoint, m_usedSpacePoints)) {
182  spacePoint->setAssignmentState(true);
183  continue;
184  }
185 
186  const auto& relatedClusters = spacePoint->getRelationsTo<SVDCluster>(m_SVDClustersStoreArrayName);
187  for (const SVDCluster& relatedCluster : relatedClusters) {
188  if (TrackFindingCDC::is_in(&relatedCluster, m_usedClusters)) {
189  spacePoint->setAssignmentState(true);
190  break;
191  }
192  }
193  }
194 
195 }
@ c_DontWriteOut
Object/array should be NOT saved by output modules.
Definition: DataStore.h:71
@ c_ErrorIfAlreadyRegistered
If the object/array was already registered, produce an error (aborting initialisation).
Definition: DataStore.h:72
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.
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:79
void setSeedCovariance(const TMatrixDSym &seedCovariance)
Set the covariance of the seed. ATTENTION: This is not the fitted covariance.
Definition: RecoTrack.h:614
void setQualityIndicator(const float qualityIndicator)
Set the quality index attached to this RecoTrack. 0 means likely fake.
Definition: RecoTrack.h:847
static void registerRequiredRelations(StoreArray< RecoTrack > &recoTracks, std::string const &pxdHitsStoreArrayName="", std::string const &svdHitsStoreArrayName="", std::string const &cdcHitsStoreArrayName="", std::string const &bklmHitsStoreArrayName="", std::string const &eklmHitsStoreArrayName="", std::string const &recoHitInformationStoreArrayName="")
Convenience method which registers all relations required to fully use a RecoTrack.
Definition: RecoTrack.cc:53
bool addSVDHit(const UsedSVDHit *svdHit, const unsigned int sortingParameter, OriginTrackFinder foundByTrackFinder=OriginTrackFinder::c_undefinedTrackFinder)
Adds a svd hit with the given information to the reco track.
Definition: RecoTrack.h:272
Class for type safe access to objects that are referred to in relations.
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
The SVD Cluster class This class stores all information about reconstructed SVD clusters.
Definition: SVDCluster.h:29
Storage for (VXD) SpacePoint-based track candidates.
@ c_isActive
bit 11: SPTC is active (i.e.
SpacePoint typically is build from 1 PXDCluster or 1-2 SVDClusters.
Definition: SpacePoint.h:42
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
T * appendNew()
Construct a new T object at the end of the array.
Definition: StoreArray.h:246
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
Definition: StoreArray.h:140
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 beginEvent() override
Receive and dispatch signal for the start of a new event.
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 > &finishedResults, const std::vector< const SpacePoint * > &spacePoints) override
Store the finishey SpacePointTrackCands into RecoTracks and tag the SpacePoints.
bool m_MCStrictQualityEstimator
Only required for MCInfo method.
void initialize() override
Create the store arrays.
std::string m_SVDSpacePointTrackCandsStoreArrayName
StoreArray name of the SpacePointTrackCandidate StoreArray.
std::string m_EstimationMethod
Identifier which estimation method to use.
std::string m_SVDClustersStoreArrayName
StoreArray name of the SVDCluster StoreArray.
std::set< const SVDCluster * > m_usedClusters
Store the used clusters in the results.
StoreArray< SpacePointTrackCand > m_storeSpacePointTrackCands
Output SpacePointTrackCand Store Array.
std::string m_MCRecoTracksStoreArrayName
sets the name of the expected StoreArray containing MCRecoTracks. Only required for MCInfo method
void beginEvent() override
Reset internal vectors.
std::unique_ptr< QualityEstimatorBase > m_estimator
pointer to the selected QualityEstimator
StoreArray< RecoTrack > m_storeRecoTracks
Output RecoTracks Store Array.
std::set< const SpacePoint * > m_usedSpacePoints
Store the used space points in the results.
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) override
Expose the parameters of the sub findlets.
std::string m_RecoTracksStoreArrayName
StoreArray name of the output Track StoreArray.
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.