Belle II Software  release-08-01-10
SuperClusterCreator.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include <tracking/trackFindingCDC/findlets/minimal/SuperClusterCreator.h>
9 
10 #include <tracking/trackFindingCDC/eventdata/segments/CDCWireHitCluster.h>
11 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
12 
13 #include <tracking/trackFindingCDC/topology/CDCWireLayer.h>
14 #include <tracking/trackFindingCDC/topology/CDCWire.h>
15 
16 #include <tracking/trackFindingCDC/filters/base/RelationFilterUtil.h>
17 
18 #include <tracking/trackFindingCDC/utilities/Functional.h>
19 #include <tracking/trackFindingCDC/utilities/Algorithms.h>
20 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
21 
22 #include <framework/core/ModuleParamList.templateDetails.h>
23 
24 using namespace Belle2;
25 using namespace TrackFindingCDC;
26 
28 {
30 }
31 
33 {
34  return "Groups the wire hits into super cluster by expanding the secondary wire "
35  "neighborhood";
36 }
37 
38 void SuperClusterCreator::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
39 {
40  moduleParamList->addParameter(prefixed(prefix, "expandOverApogeeGap"),
42  "Expand the super clusters over the typical gap at the apogee of the trajectory",
44 
45  m_wireHitRelationFilter.exposeParameters(moduleParamList, prefix);
46 }
47 
48 void SuperClusterCreator::apply(std::vector<CDCWireHit>& inputWireHits,
49  std::vector<CDCWireHitCluster>& outputSuperClusters)
50 {
51  m_wireHitRelations.clear();
52 
54  auto wireHitsByLayer =
55  adjacent_groupby(inputWireHits.begin(), inputWireHits.end(), [](const CDCWireHit & wireHit) {
56  return wireHit.getWireID().getILayer();
57  });
58 
59  for (const auto& wireHitsInLayer : wireHitsByLayer) {
60  const CDCWireLayer& wireLayer = wireHitsInLayer.front().getWire().getWireLayer();
61  const int nWires = wireLayer.size();
62 
63  auto sameWireHitChain = [](const CDCWireHit & lhs, const CDCWireHit & rhs) {
64  return rhs.getWireID().getIWire() - lhs.getWireID().getIWire() == 1;
65  };
66 
67  auto wireHitChains =
68  unique_ranges(wireHitsInLayer.begin(), wireHitsInLayer.end(), sameWireHitChain);
69 
70  size_t nWireHits = 0;
71  for (const VectorRange<CDCWireHit>& wireHitChain : wireHitChains) {
72  nWireHits += wireHitChain.size();
73  }
74  assert(nWireHits == wireHitsInLayer.size());
75 
76  // Special treatment for the first and last wireHitChain as they might wrap around as one
77  VectorRange<CDCWireHit> frontWrapChain(wireHitsInLayer.begin(), wireHitsInLayer.begin());
78  VectorRange<CDCWireHit> backWrapChain(wireHitsInLayer.end(), wireHitsInLayer.end());
79  if (wireHitChains.size() > 1) {
80  if (wireHitChains.front().front().getWire().isPrimaryNeighborWith(
81  wireHitChains.back().back().getWire())) {
82  // Chains are touching
83  // Keep their information around but eliminate them from the regular chains
84  int wrapAroundChainSize = wireHitChains.front().size() + wireHitChains.back().size();
85  if (wrapAroundChainSize >= 5) {
86  // Warning reach over the local wire hit layer / outside the memory of the wire hit
87  // vector to transport the size.
88  frontWrapChain = wireHitChains.front();
89  frontWrapChain.first = frontWrapChain.end() - wrapAroundChainSize;
90 
91  backWrapChain = wireHitChains.back();
92  backWrapChain.second = backWrapChain.begin() + wrapAroundChainSize;
93 
94  wireHitChains.erase(wireHitChains.begin());
95  wireHitChains.pop_back();
96  }
97  }
98  }
99 
100  auto itLastChain = std::remove_if(wireHitChains.begin(), wireHitChains.end(), Size() < 5u);
101  wireHitChains.erase(itLastChain, wireHitChains.end());
102  if (wireHitChains.empty()) continue;
103 
104  auto connectWireHitChains = [this, nWires](const VectorRange<CDCWireHit>& lhs,
105  const VectorRange<CDCWireHit>& rhs) {
106  int iWireDelta = rhs.front().getWireID().getIWire() - lhs.back().getWireID().getIWire();
107  if (iWireDelta < 0) iWireDelta += nWires;
108  if (iWireDelta < static_cast<int>(lhs.size() + rhs.size())) {
109  m_wireHitRelations.push_back({&rhs.front(), 0, &lhs.back()});
110  m_wireHitRelations.push_back({&lhs.back(), 0, &rhs.front()});
111  }
112  return false;
113  };
114  // the return value is not needed
115  // cppcheck-suppress ignoredReturnValue
116  std::adjacent_find(wireHitChains.begin(), wireHitChains.end(), connectWireHitChains);
117 
118  if (not frontWrapChain.empty()) {
119  connectWireHitChains(frontWrapChain, wireHitChains.front());
120  }
121  if (not backWrapChain.empty()) {
122  connectWireHitChains(wireHitChains.back(), backWrapChain);
123  }
124  if (backWrapChain.empty() and frontWrapChain.empty()) {
125  connectWireHitChains(wireHitChains.back(), wireHitChains.front());
126  }
127  }
128  }
129 
131  const std::vector<CDCWireHit*> wireHitPtrs = as_pointers<CDCWireHit>(inputWireHits);
132 
135 
136  B2ASSERT("Expect wire hit neighborhood to be symmetric ",
138 
139  m_wirehitClusterizer.apply(wireHitPtrs, m_wireHitRelations, outputSuperClusters);
140 
141  int iSuperCluster = -1;
142  for (CDCWireHitCluster& superCluster : outputSuperClusters) {
143  ++iSuperCluster;
144  superCluster.setISuperCluster(iSuperCluster);
145  for (CDCWireHit* wireHit : superCluster) {
146  wireHit->setISuperCluster(iSuperCluster);
147  }
148  std::sort(superCluster.begin(), superCluster.end());
149  }
150 }
The Module parameter list class.
Class representing a hit wire in the central drift chamber.
Definition: CDCWireHit.h:55
const WireID & getWireID() const
Getter for the WireID of the wire the hit is located on.
Definition: CDCWireHit.h:185
Class representating a sense wire layer in the central drift chamber.
Definition: CDCWireLayer.h:42
void addProcessingSignalListener(ProcessingSignalListener *psl)
Register a processing signal listener to be notified.
A pair of iterators usable with the range base for loop.
Definition: Range.h:25
Iterator begin() const
Begin of the range for range based for.
Definition: Range.h:64
Iterator end() const
End of the range for range based for.
Definition: Range.h:68
bool empty() const
Checks if the begin equals the end iterator, hence if the range is empty.
Definition: Range.h:72
Reference back() const
Returns the derefenced iterator before end()
Definition: Range.h:84
Reference front() const
Returns the derefenced iterator at begin()
Definition: Range.h:80
std::size_t size() const
Returns the total number of objects in this range.
Definition: Range.h:76
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.
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.
Definition: WireID.h:145
void addParameter(const std::string &name, T &paramVariable, 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 abitrary objects.
Definition: Functional.h:318
Utility structure with functions related to weighted relations.