72 const std::vector<CDCWireHit*>& wireHits)
const
74 assert(std::is_sorted(wireHits.begin(), wireHits.end(), LessOf<Deref>()) &&
75 "Expected wire hits to be sorted");
77 std::vector<std::pair<const CDCWire*, int>> wireNeighbors;
78 wireNeighbors.reserve(8);
80 std::vector<CDCWireHit*> wireHitNeighbors;
81 wireHitNeighbors.reserve(12);
83 std::array<short, 12> missingPrimaryNeighbor = {0};
87 const CDCWire& wire = from->getWire();
90 for (
short oClockDirection : {5, 7, 3, 9, 1, 11}) {
91 MayBePtr<const CDCWire> neighborWire = wireTopology.
getPrimaryNeighbor(oClockDirection, wire);
92 if (neighborWire) wireNeighbors.emplace_back(neighborWire, oClockDirection);
95 std::sort(std::begin(wireNeighbors), std::end(wireNeighbors));
97 for (std::pair<const CDCWire*, int> wireAndOClockDirection : wireNeighbors) {
98 const CDCWire* neighborWire = wireAndOClockDirection.first;
99 int oClockDirection = wireAndOClockDirection.second;
101 ConstVectorRange<CDCWireHit*> wireHitRange{
102 std::equal_range(wireHits.begin(), wireHits.end(), neighborWire, LessOf<Deref>())};
103 if (wireHitRange.empty()) {
104 int ccwOClockDirection = oClockDirection - 1;
105 int cwOClockDirection = oClockDirection == 11 ? 0 : oClockDirection + 1;
106 ++missingPrimaryNeighbor[ccwOClockDirection];
107 ++missingPrimaryNeighbor[oClockDirection];
108 ++missingPrimaryNeighbor[cwOClockDirection];
110 wireHitNeighbors.insert(wireHitNeighbors.end(), wireHitRange.begin(), wireHitRange.end());
113 size_t nPrimaryWireHitNeighbors = wireHitNeighbors.size();
114 wireNeighbors.clear();
118 MayBePtr<const CDCWire> neighborWire = wireTopology.
getSecondaryNeighbor(oClockDirection, wire);
119 if (not neighborWire)
continue;
120 if (missingPrimaryNeighbor[oClockDirection] <
123 wireNeighbors.emplace_back(neighborWire, oClockDirection);
126 std::sort(std::begin(wireNeighbors), std::end(wireNeighbors));
128 for (std::pair<const CDCWire*, int> wireAndOClockDirection : wireNeighbors) {
129 const CDCWire* neighborWire = wireAndOClockDirection.first;
130 ConstVectorRange<CDCWireHit*> wireHitRange{
131 std::equal_range(wireHits.begin(), wireHits.end(), neighborWire, LessOf<Deref>())};
132 wireHitNeighbors.insert(wireHitNeighbors.end(), wireHitRange.begin(), wireHitRange.end());
136 std::inplace_merge(wireHitNeighbors.begin(),
137 wireHitNeighbors.begin() + nPrimaryWireHitNeighbors,
138 wireHitNeighbors.end(),
139 std::less<CDCWireHit*>());
141 return wireHitNeighbors;