9 #include <tracking/modules/trackSetEvaluatorVXD/SVDOverlapResolverModule.h>
11 #include <framework/logging/Logger.h>
14 #include <tracking/spacePointCreation/SpacePoint.h>
16 #include <tracking/trackFindingVXD/trackSetEvaluator/OverlapMatrixCreator.h>
17 #include <tracking/trackFindingVXD/trackSetEvaluator/HopfieldNetwork.h>
18 #include <tracking/trackFindingVXD/trackSetEvaluator/Scrooge.h>
19 #include <tracking/trackFindingVXD/trackSetEvaluator/OverlapResolverNodeInfo.h>
21 #include <vxd/geometry/SensorInfoBase.h>
32 setDescription(
"Module checks for overlaps of SpacePointTrackCands");
33 setPropertyFlags(c_ParallelProcessingCertified);
35 addParam(
"NameSpacePointTrackCands", m_nameSpacePointTrackCands,
"Name of expected StoreArray.",
string(
""));
37 addParam(
"NameSVDClusters", m_nameSVDClusters,
"Name of expected StoreArray.",
string(
""));
39 addParam(
"ResolveMethod", m_resolveMethod,
"Strategy used to resolve overlaps. Currently implemented are \"greedy\" and "
40 " \"hopfield\" ",
string(
"greedy"));
42 addParam(
"minActivityState", m_minActivityState,
"Sets the minimal value of activity for acceptance. (0,1)",
47 void SVDOverlapResolverModule::initialize()
49 m_spacePointTrackCands.isRequired(m_nameSpacePointTrackCands);
50 m_svdClusters.isRequired(m_nameSVDClusters);
52 B2ASSERT(
"ResolveMethod has to be either 'greedy' or 'hopfield'. Selected ResolveMethod: " << m_resolveMethod,
53 m_resolveMethod ==
"greedy" || m_resolveMethod ==
"hopfield");
56 void SVDOverlapResolverModule::event()
60 unsigned short nHits = m_svdClusters.getEntries();
63 vector<SpacePointTrackCand*> activeCandidates;
64 auto requiredSpace = m_spacePointTrackCands.getEntries();
65 if (m_estimatedActiveCandidates < m_spacePointTrackCands.getEntries()) {
66 requiredSpace = m_estimatedActiveCandidates;
68 activeCandidates.reserve(requiredSpace);
70 if (sptc.hasRefereeStatus(SpacePointTrackCand::c_isActive)) activeCandidates.push_back(&sptc);
72 unsigned short const nActiveCandidates = activeCandidates.size();
73 if (nActiveCandidates < 2) {
74 B2DEBUG(29,
"Less than 2 active SPTC. No reason to do SVDOverlapResolver!");
79 vector<vector<unsigned short> > svdHitRelatedTracks(nHits);
81 for (
unsigned short iCand = 0; iCand < nActiveCandidates; ++iCand) {
83 for (
const SpacePoint* spacePointPointer : activeCandidates.at(iCand)->getHits()) {
85 if (spacePointPointer->getType() != VXD::SensorInfoBase::SensorType::SVD)
continue;
89 for (
SVDCluster const& svdClusterPointer : svdClusterRelations) {
90 svdHitRelatedTracks[svdClusterPointer.getArrayIndex()].push_back(iCand);
102 std::vector<OverlapResolverNodeInfo> qiTrackOverlap;
103 qiTrackOverlap.reserve(nActiveCandidates);
106 for (
unsigned short iCand = 0; iCand < nActiveCandidates; ++iCand) {
107 qiTrackOverlap.emplace_back(
108 activeCandidates[iCand]->getQualityIndicator(),
110 overlapMatrix.at(iCand),
114 if (m_resolveMethod ==
"greedy") {
119 }
else if (m_resolveMethod ==
"hopfield") {
123 unsigned maxIterations = 20;
124 if (hopfieldNetwork.
doHopfield(qiTrackOverlap, maxIterations) == maxIterations) {
125 B2WARNING(
"Hopfield Network failed converge.");
129 for (
auto && track : qiTrackOverlap) {
130 if (track.activityState < m_minActivityState) {
131 activeCandidates[track.trackIndex]->removeRefereeStatus(SpacePointTrackCand::c_isActive);
Hopfield Algorithm with number based inputs.
unsigned short doHopfield(std::vector< OverlapResolverNodeInfo > &overlapResolverNodeInfos, unsigned short nIterations=20)
Performance of the actual algorithm.
Creates a vector of vectors, that knows which track is conflicting with which other.
std::vector< std::vector< unsigned short > > getOverlapMatrix(unsigned allowedOverlaps=0)
Fills and returns the overlap matrix.
Class for type safe access to objects that are referred to in relations.
The SVD Cluster class This class stores all information about reconstructed SVD clusters.
SVD overlap resolver module.
Executes greedy algorithm for vector of QITrackOverlap structs.
void performSelection(std::vector< OverlapResolverNodeInfo > &overlapResolverNodeInfo)
Sets the isActive flag in m_qiTrackOverlap to false, for killed tracks.
Storage for (VXD) SpacePoint-based track candidates.
SpacePoint typically is build from 1 PXDCluster or 1-2 SVDClusters.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.