10 #include <tracking/trackFindingCDC/findlets/minimal/SuperClusterCreator.h>
12 #include <tracking/trackFindingCDC/eventdata/segments/CDCWireHitCluster.h>
13 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
15 #include <tracking/trackFindingCDC/topology/CDCWireLayer.h>
16 #include <tracking/trackFindingCDC/topology/CDCWire.h>
18 #include <tracking/trackFindingCDC/filters/base/RelationFilterUtil.h>
20 #include <tracking/trackFindingCDC/utilities/Functional.h>
21 #include <tracking/trackFindingCDC/utilities/Algorithms.h>
22 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
24 #include <framework/core/ModuleParamList.templateDetails.h>
27 using namespace TrackFindingCDC;
36 return "Groups the wire hits into super cluster by expanding the secondary wire "
42 moduleParamList->
addParameter(prefixed(prefix,
"expandOverApogeeGap"),
44 "Expand the super clusters over the typical gap at the apogee of the trajectory",
51 std::vector<CDCWireHitCluster>& outputSuperClusters)
56 auto wireHitsByLayer =
57 adjacent_groupby(inputWireHits.begin(), inputWireHits.end(), [](
const CDCWireHit & wireHit) {
58 return wireHit.getWireID().getILayer();
61 for (
const auto& wireHitsInLayer : wireHitsByLayer) {
63 const int nWires = wireLayer.
size();
70 unique_ranges(wireHitsInLayer.begin(), wireHitsInLayer.end(), sameWireHitChain);
74 nWireHits += wireHitChain.size();
76 assert(nWireHits == wireHitsInLayer.size());
81 if (wireHitChains.
size() > 1) {
82 if (wireHitChains.
front().front().getWire().isPrimaryNeighborWith(
83 wireHitChains.
back().back().getWire())) {
86 int wrapAroundChainSize = wireHitChains.
front().size() + wireHitChains.
back().size();
87 if (wrapAroundChainSize >= 5) {
90 frontWrapChain = wireHitChains.
front();
91 frontWrapChain.first = frontWrapChain.
end() - wrapAroundChainSize;
93 backWrapChain = wireHitChains.
back();
94 backWrapChain.second = backWrapChain.
begin() + wrapAroundChainSize;
96 wireHitChains.erase(wireHitChains.
begin());
97 wireHitChains.pop_back();
102 auto itLastChain = std::remove_if(wireHitChains.
begin(), wireHitChains.
end(),
Size() < 5u);
103 wireHitChains.erase(itLastChain, wireHitChains.
end());
104 if (wireHitChains.
empty())
continue;
108 int iWireDelta = rhs.
front().getWireID().getIWire() - lhs.
back().getWireID().getIWire();
109 if (iWireDelta < 0) iWireDelta += nWires;
110 if (iWireDelta <
static_cast<int>(lhs.
size() + rhs.size())) {
118 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());