11 #include <tracking/modules/trackSetEvaluatorVXD/SVDOverlapResolverModule.h>
13 #include <framework/logging/Logger.h>
16 #include <tracking/spacePointCreation/SpacePoint.h>
18 #include <tracking/trackFindingVXD/trackSetEvaluator/OverlapMatrixCreator.h>
19 #include <tracking/trackFindingVXD/trackSetEvaluator/HopfieldNetwork.h>
20 #include <tracking/trackFindingVXD/trackSetEvaluator/Scrooge.h>
21 #include <tracking/trackFindingVXD/trackSetEvaluator/OverlapResolverNodeInfo.h>
23 #include <vxd/geometry/SensorInfoBase.h>
34 setDescription(
"Module checks for overlaps of SpacePointTrackCands");
35 setPropertyFlags(c_ParallelProcessingCertified);
37 addParam(
"NameSpacePointTrackCands", m_nameSpacePointTrackCands,
"Name of expected StoreArray.",
string(
""));
39 addParam(
"NameSVDClusters", m_nameSVDClusters,
"Name of expected StoreArray.",
string(
""));
41 addParam(
"ResolveMethod", m_resolveMethod,
"Strategy used to resolve overlaps. Currently implemented are \"greedy\" and "
42 " \"hopfield\" ",
string(
"greedy"));
44 addParam(
"minActivityState", m_minActivityState,
"Sets the minimal value of activity for acceptance. (0,1)",
49 void SVDOverlapResolverModule::initialize()
51 m_spacePointTrackCands.isRequired(m_nameSpacePointTrackCands);
52 m_svdClusters.isRequired(m_nameSVDClusters);
54 B2ASSERT(
"ResolveMethod has to be either 'greedy' or 'hopfield'. Selected ResolveMethod: " << m_resolveMethod,
55 m_resolveMethod ==
"greedy" || m_resolveMethod ==
"hopfield");
58 void SVDOverlapResolverModule::event()
62 unsigned short nHits = m_svdClusters.getEntries();
65 vector<SpacePointTrackCand*> activeCandidates;
66 auto requiredSpace = m_spacePointTrackCands.getEntries();
67 if (m_estimatedActiveCandidates < m_spacePointTrackCands.getEntries()) {
68 requiredSpace = m_estimatedActiveCandidates;
70 activeCandidates.reserve(requiredSpace);
72 if (sptc.hasRefereeStatus(SpacePointTrackCand::c_isActive)) activeCandidates.push_back(&sptc);
74 unsigned short const nActiveCandidates = activeCandidates.size();
75 if (nActiveCandidates < 2) {
76 B2DEBUG(29,
"Less than 2 active SPTC. No reason to do SVDOverlapResolver!");
81 vector<vector<unsigned short> > svdHitRelatedTracks(nHits);
83 for (
unsigned short iCand = 0; iCand < nActiveCandidates; ++iCand) {
85 for (
const SpacePoint* spacePointPointer : activeCandidates.at(iCand)->getHits()) {
87 if (spacePointPointer->getType() != VXD::SensorInfoBase::SensorType::SVD)
continue;
91 for (
SVDCluster const& svdClusterPointer : svdClusterRelations) {
92 svdHitRelatedTracks[svdClusterPointer.getArrayIndex()].push_back(iCand);
104 std::vector<OverlapResolverNodeInfo> qiTrackOverlap;
105 qiTrackOverlap.reserve(nActiveCandidates);
108 for (
unsigned short iCand = 0; iCand < nActiveCandidates; ++iCand) {
109 qiTrackOverlap.emplace_back(
110 activeCandidates[iCand]->getQualityIndicator(),
112 overlapMatrix.at(iCand),
116 if (m_resolveMethod ==
"greedy") {
121 }
else if (m_resolveMethod ==
"hopfield") {
125 unsigned maxIterations = 20;
126 if (hopfieldNetwork.
doHopfield(qiTrackOverlap, maxIterations) == maxIterations) {
127 B2WARNING(
"Hopfield Network failed converge.");
131 for (
auto && track : qiTrackOverlap) {
132 if (track.activityState < m_minActivityState) {
133 activeCandidates[track.trackIndex]->removeRefereeStatus(SpacePointTrackCand::c_isActive);