8#include <tracking/trackFindingCDC/findlets/minimal/SuperClusterCreator.h>
10#include <tracking/trackFindingCDC/eventdata/segments/CDCWireHitCluster.h>
11#include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
13#include <tracking/trackFindingCDC/topology/CDCWireLayer.h>
14#include <tracking/trackFindingCDC/topology/CDCWire.h>
16#include <tracking/trackFindingCDC/filters/base/RelationFilterUtil.h>
18#include <tracking/trackFindingCDC/utilities/Functional.h>
19#include <tracking/trackFindingCDC/utilities/Algorithms.h>
20#include <tracking/trackFindingCDC/utilities/StringManipulation.h>
22#include <framework/core/ModuleParamList.templateDetails.h>
28using namespace TrackFindingCDC;
37 return "Groups the wire hits into super cluster by expanding the secondary wire "
43 moduleParamList->
addParameter(prefixed(prefix,
"expandOverApogeeGap"),
45 "Expand the super clusters over the typical gap at the apogee of the trajectory",
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);
75 nWireHits += wireHitChain.size();
77 assert(nWireHits == wireHitsInLayer.size());
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;
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());
The Module parameter list class.
An aggregation of CDCWireHits.
Class representing a hit wire in the central drift chamber.
const WireID & getWireID() const
Getter for the WireID of the wire the hit is located on.
Class representing a sense wire layer in the central drift chamber.
void addProcessingSignalListener(ProcessingSignalListener *psl)
Register a processing signal listener to be notified.
A pair of iterators usable with the range base for loop.
Iterator begin() const
Begin of the range for range based for.
Iterator end() const
End of the range for range based for.
bool empty() const
Checks if the begin equals the end iterator, hence if the range is empty.
Reference back() const
Returns the dereferenced iterator before end()
Reference front() const
Returns the dereferenced iterator at begin()
std::size_t size() const
Returns the total number of objects in this range.
void apply(std::vector< CDCWireHit > &inputWireHits, std::vector< CDCWireHitCluster > &outputSuperClusters) final
Main algorithm applying the cluster refinement.
bool m_param_expandOverApogeeGap
Parameter : Expand the super clusters over the typical gap at the apogee of the trajectory.
std::vector< WeightedRelation< CDCWireHit > > m_wireHitRelations
Memory for the wire hit neighborhood in a cluster.
SuperClusterCreator()
Constructor.
std::string getDescription() final
Short description of the findlet.
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) final
Expose the parameters to a module.
Clusterizer< CDCWireHit, CDCWireHitCluster > m_wirehitClusterizer
Instance of the hit cluster generator.
WholeWireHitRelationFilter m_wireHitRelationFilter
Wire hit neighborhood relation filter.
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) final
Expose the parameters to a module.
unsigned short getIWire() const
Getter for wire within the layer.
void addParameter(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
Abstract base class for different kinds of events.
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.
Functor to get the .size() from an arbitrary objects.
Utility structure with functions related to weighted relations.