54 std::vector<CDCWireHitCluster>& outputSuperClusters)
59 auto wireHitsByLayer =
60 adjacent_groupby(inputWireHits.begin(), inputWireHits.end(), [](
const CDCWireHit & wireHit) {
61 return wireHit.getWireID().getILayer();
64 for (
const auto& wireHitsInLayer : wireHitsByLayer) {
66 const int nWires = wireLayer.
size();
73 unique_ranges(wireHitsInLayer.begin(), wireHitsInLayer.end(), sameWireHitChain);
76 for (
const VectorRange<CDCWireHit>& wireHitChain : wireHitChains) {
77 nWireHits += wireHitChain.size();
79 assert(nWireHits == wireHitsInLayer.size());
82 VectorRange<CDCWireHit> frontWrapChain(wireHitsInLayer.begin(), wireHitsInLayer.begin());
83 VectorRange<CDCWireHit> backWrapChain(wireHitsInLayer.end(), wireHitsInLayer.end());
84 if (wireHitChains.
size() > 1) {
85 if (wireHitChains.
front().front().getWire().isPrimaryNeighborWith(
86 wireHitChains.
back().back().getWire())) {
89 int wrapAroundChainSize = wireHitChains.
front().size() + wireHitChains.
back().size();
90 if (wrapAroundChainSize >= 5) {
93 frontWrapChain = wireHitChains.
front();
94 frontWrapChain.first = frontWrapChain.
end() - wrapAroundChainSize;
96 backWrapChain = wireHitChains.
back();
97 backWrapChain.second = backWrapChain.
begin() + wrapAroundChainSize;
99 wireHitChains.erase(wireHitChains.
begin());
100 wireHitChains.pop_back();
105 auto itLastChain = std::remove_if(wireHitChains.
begin(), wireHitChains.
end(),
Size() < 5u);
106 wireHitChains.erase(itLastChain, wireHitChains.
end());
107 if (wireHitChains.
empty())
continue;
109 auto connectWireHitChains = [
this, nWires](
const VectorRange<CDCWireHit>& lhs,
110 const VectorRange<CDCWireHit>& rhs) {
111 int iWireDelta = rhs.front().getWireID().getIWire() - lhs.back().
getWireID().
getIWire();
112 if (iWireDelta < 0) iWireDelta += nWires;
113 if (iWireDelta <
static_cast<int>(lhs.size() + rhs.size())) {
120 std::ignore = std::adjacent_find(wireHitChains.
begin(), wireHitChains.
end(), connectWireHitChains);
122 if (not frontWrapChain.
empty()) {
123 connectWireHitChains(frontWrapChain, wireHitChains.
front());
125 if (not backWrapChain.
empty()) {
126 connectWireHitChains(wireHitChains.
back(), backWrapChain);
128 if (backWrapChain.
empty() and frontWrapChain.
empty()) {
129 connectWireHitChains(wireHitChains.
back(), wireHitChains.
front());
135 const std::vector<CDCWireHit*> wireHitPtrs = as_pointers<CDCWireHit>(inputWireHits);
140 B2ASSERT(
"Expect wire hit neighborhood to be symmetric ",
145 int iSuperCluster = -1;
148 superCluster.setISuperCluster(iSuperCluster);
150 wireHit->setISuperCluster(iSuperCluster);
152 std::sort(superCluster.begin(), superCluster.end());
static void appendUsing(ARelationFilter &relationFilter, const std::vector< AObject * > &froms, const std::vector< AObject * > &tos, std::vector< WeightedRelation< AObject > > &weightedRelations, unsigned int maximumNumberOfRelations=std::numeric_limits< unsigned int >::max())
Appends relations between elements in the given AItems using the ARelationFilter.