52 std::vector<CDCWireHitCluster>& outputSuperClusters)
57 auto wireHitsByLayer =
58 adjacent_groupby(inputWireHits.begin(), inputWireHits.end(), [](
const CDCWireHit & wireHit) {
59 return wireHit.getWireID().getILayer();
62 for (
const auto& wireHitsInLayer : wireHitsByLayer) {
64 const int nWires = wireLayer.
size();
71 unique_ranges(wireHitsInLayer.begin(), wireHitsInLayer.end(), sameWireHitChain);
74 for (
const VectorRange<CDCWireHit>& wireHitChain : wireHitChains) {
75 nWireHits += wireHitChain.size();
77 assert(nWireHits == wireHitsInLayer.size());
80 VectorRange<CDCWireHit> frontWrapChain(wireHitsInLayer.begin(), wireHitsInLayer.begin());
81 VectorRange<CDCWireHit> backWrapChain(wireHitsInLayer.end(), wireHitsInLayer.end());
82 if (wireHitChains.
size() > 1) {
83 if (wireHitChains.
front().front().getWire().isPrimaryNeighborWith(
84 wireHitChains.
back().back().getWire())) {
87 int wrapAroundChainSize = wireHitChains.
front().size() + wireHitChains.
back().size();
88 if (wrapAroundChainSize >= 5) {
91 frontWrapChain = wireHitChains.
front();
92 frontWrapChain.first = frontWrapChain.
end() - wrapAroundChainSize;
94 backWrapChain = wireHitChains.
back();
95 backWrapChain.second = backWrapChain.
begin() + wrapAroundChainSize;
97 wireHitChains.erase(wireHitChains.
begin());
98 wireHitChains.pop_back();
103 auto itLastChain = std::remove_if(wireHitChains.
begin(), wireHitChains.
end(),
Size() < 5u);
104 wireHitChains.erase(itLastChain, wireHitChains.
end());
105 if (wireHitChains.
empty())
continue;
107 auto connectWireHitChains = [
this, nWires](
const VectorRange<CDCWireHit>& lhs,
108 const VectorRange<CDCWireHit>& rhs) {
109 int iWireDelta = rhs.front().getWireID().getIWire() - lhs.back().
getWireID().
getIWire();
110 if (iWireDelta < 0) iWireDelta += nWires;
111 if (iWireDelta <
static_cast<int>(lhs.size() + rhs.size())) {
118 std::ignore = std::adjacent_find(wireHitChains.
begin(), wireHitChains.
end(), connectWireHitChains);
120 if (not frontWrapChain.
empty()) {
121 connectWireHitChains(frontWrapChain, wireHitChains.
front());
123 if (not backWrapChain.
empty()) {
124 connectWireHitChains(wireHitChains.
back(), backWrapChain);
126 if (backWrapChain.
empty() and frontWrapChain.
empty()) {
127 connectWireHitChains(wireHitChains.
back(), wireHitChains.
front());
133 const std::vector<CDCWireHit*> wireHitPtrs = as_pointers<CDCWireHit>(inputWireHits);
138 B2ASSERT(
"Expect wire hit neighborhood to be symmetric ",
143 int iSuperCluster = -1;
146 superCluster.setISuperCluster(iSuperCluster);
148 wireHit->setISuperCluster(iSuperCluster);
150 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.