12 #include <tracking/trackFindingCDC/ca/AutomatonCell.h>
14 #include <tracking/trackFindingCDC/utilities/VectorRange.h>
15 #include <tracking/trackFindingCDC/utilities/WeightedRelation.h>
17 #include <tracking/trackFindingCDC/findlets/base/Findlet.h>
19 #include <framework/logging/Logger.h>
26 namespace TrackFindingCDC {
41 template <
class ACellHolder,
class ACluster = std::vector<ACellHolder*> >
43 :
public Findlet<ACellHolder* const, WeightedRelation<ACellHolder> const, ACluster> {
56 void apply(std::vector<ACellHolder*>
const& cellHolders,
57 std::vector<WeightedRelation<ACellHolder> >
const& cellHolderRelations,
58 std::vector<ACluster>& clusters)
override
61 assert(std::is_sorted(cellHolderRelations.begin(),
62 cellHolderRelations.end()));
68 for (ACellHolder* cellHolder : cellHolders) {
73 std::vector<ACellHolder*> cluster;
77 for (ACellHolder* cellHolder : cellHolders) {
84 cluster.push_back(cellHolder);
88 clusters.emplace_back(std::move(cluster));
95 void expandCluster(std::vector<WeightedRelation<ACellHolder>>
const& cellHolderRelations,
96 std::vector<ACellHolder*>& cluster)
const
98 ACellHolder* seedCellHolder = cluster.front();
102 std::vector<ACellHolder*> checkNow;
103 std::vector<ACellHolder*> checkNext;
105 checkNow.reserve(10);
106 checkNext.reserve(10);
108 checkNext.push_back(seedCellHolder);
110 while (not checkNext.empty()) {
112 checkNow.swap(checkNext);
115 for (ACellHolder* cellHolder : checkNow) {
118 std::equal_range(cellHolderRelations.begin(),
119 cellHolderRelations.end(),
123 size_t nNeighbors = neighborRelations.
size();
127 ACellHolder* neighborCellHolder = neighborRelation.getTo();
129 Weight neighborICluster =
getCellState(neighborCellHolder);
130 if (neighborICluster == -1) {
133 cluster.push_back(neighborCellHolder);
136 checkNext.push_back(neighborCellHolder);
140 if (neighborICluster != iCluster) {
141 B2WARNING(
"Clusterizer: Neighboring item was already assigned to different "
142 "cluster. Check if the neighborhood is symmetric.");
151 void setCellState(ACellHolder* cellHolder, Weight cellState)
const
153 AutomatonCell& automatonCell = cellHolder->getAutomatonCell();
154 automatonCell.setCellState(cellState);
160 const AutomatonCell& automatonCell = cellHolder->getAutomatonCell();
165 void setCellWeight(ACellHolder* cellHolder, Weight cellWeight)
const
167 AutomatonCell& automatonCell = cellHolder->getAutomatonCell();