70 const std::vector<CDCWireHit*>& wireHits)
const
72 assert(std::is_sorted(wireHits.begin(), wireHits.end(), LessOf<Deref>()) &&
73 "Expected wire hits to be sorted");
75 std::vector<std::pair<const CDCWire*, int>> wireNeighbors;
76 wireNeighbors.reserve(8);
78 std::vector<CDCWireHit*> wireHitNeighbors;
79 wireHitNeighbors.reserve(12);
81 std::array<short, 12> missingPrimaryNeighbor = {0};
85 const CDCWire& wire = from->getWire();
88 for (
short oClockDirection : {5, 7, 3, 9, 1, 11}) {
89 MayBePtr<const CDCWire> neighborWire = wireTopology.
getPrimaryNeighbor(oClockDirection, wire);
90 if (neighborWire) wireNeighbors.emplace_back(neighborWire, oClockDirection);
93 std::sort(std::begin(wireNeighbors), std::end(wireNeighbors));
95 for (std::pair<const CDCWire*, int> wireAndOClockDirection : wireNeighbors) {
96 const CDCWire* neighborWire = wireAndOClockDirection.first;
97 int oClockDirection = wireAndOClockDirection.second;
99 ConstVectorRange<CDCWireHit*> wireHitRange{
100 std::equal_range(wireHits.begin(), wireHits.end(), neighborWire, LessOf<Deref>())};
101 if (wireHitRange.empty()) {
102 int ccwOClockDirection = oClockDirection - 1;
103 int cwOClockDirection = oClockDirection == 11 ? 0 : oClockDirection + 1;
104 ++missingPrimaryNeighbor[ccwOClockDirection];
105 ++missingPrimaryNeighbor[oClockDirection];
106 ++missingPrimaryNeighbor[cwOClockDirection];
108 wireHitNeighbors.insert(wireHitNeighbors.end(), wireHitRange.begin(), wireHitRange.end());
111 size_t nPrimaryWireHitNeighbors = wireHitNeighbors.size();
112 wireNeighbors.clear();
116 MayBePtr<const CDCWire> neighborWire = wireTopology.
getSecondaryNeighbor(oClockDirection, wire);
117 if (not neighborWire)
continue;
118 if (missingPrimaryNeighbor[oClockDirection] <
121 wireNeighbors.emplace_back(neighborWire, oClockDirection);
124 std::sort(std::begin(wireNeighbors), std::end(wireNeighbors));
126 for (std::pair<const CDCWire*, int> wireAndOClockDirection : wireNeighbors) {
127 const CDCWire* neighborWire = wireAndOClockDirection.first;
128 ConstVectorRange<CDCWireHit*> wireHitRange{
129 std::equal_range(wireHits.begin(), wireHits.end(), neighborWire, LessOf<Deref>())};
130 wireHitNeighbors.insert(wireHitNeighbors.end(), wireHitRange.begin(), wireHitRange.end());
134 std::inplace_merge(wireHitNeighbors.begin(),
135 wireHitNeighbors.begin() + nPrimaryWireHitNeighbors,
136 wireHitNeighbors.end(),
137 std::less<CDCWireHit*>());
139 return wireHitNeighbors;