10 #include <tracking/trackFindingCDC/filters/wireHitRelation/BridgingWireHitRelationFilter.h>
12 #include <tracking/trackFindingCDC/filters/base/RelationFilter.icc.h>
14 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
16 #include <tracking/trackFindingCDC/topology/CDCWireTopology.h>
17 #include <tracking/trackFindingCDC/topology/CDCWire.h>
19 #include <tracking/trackFindingCDC/utilities/Relation.h>
20 #include <tracking/trackFindingCDC/utilities/VectorRange.h>
21 #include <tracking/trackFindingCDC/utilities/Functional.h>
22 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
24 #include <framework/core/ModuleParamList.templateDetails.h>
31 using namespace TrackFindingCDC;
40 const std::string& prefix)
43 ->
addParameter(prefixed(prefix,
"missingPrimaryNeighborThresholds"),
45 "Map of o'clock directions to number of missing drift cells "
46 "in the primary neighborhood to trigger the inclusion of secondary neighbors "
47 "in that very o'clock direction",
54 for (
short oClockDirection = 0; oClockDirection < 12; oClockDirection++) {
63 for (
short oClockDirection : {5, 6, 7, 4, 8, 3, 9, 2, 10, 1, 0, 11}) {
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;
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;
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;