10 #include <tracking/trackFindingCDC/eventdata/segments/CDCSegment2D.h>
12 #include <tracking/trackFindingCDC/eventdata/segments/CDCFacetSegment.h>
13 #include <tracking/trackFindingCDC/eventdata/segments/CDCTangentSegment.h>
15 #include <tracking/trackFindingCDC/eventdata/segments/CDCRLWireHitSegment.h>
16 #include <tracking/trackFindingCDC/eventdata/segments/CDCWireHitSegment.h>
17 #include <tracking/trackFindingCDC/eventdata/hits/CDCFacet.h>
18 #include <tracking/trackFindingCDC/eventdata/hits/CDCTangent.h>
19 #include <tracking/trackFindingCDC/eventdata/hits/CDCRecoHit2D.h>
20 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
21 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
23 #include <tracking/trackFindingCDC/geometry/Vector2D.h>
25 #include <tracking/trackFindingCDC/ca/AutomatonCell.h>
27 #include <tracking/trackFindingCDC/numerics/ERightLeft.h>
29 #include <tracking/trackFindingCDC/utilities/WeightedRelation.h>
30 #include <tracking/trackFindingCDC/utilities/Relation.h>
31 #include <tracking/trackFindingCDC/utilities/Algorithms.h>
32 #include <tracking/trackFindingCDC/utilities/ReversedRange.h>
33 #include <tracking/trackFindingCDC/utilities/GetIterator.h>
35 #include <framework/logging/Logger.h>
49 namespace TrackFindingCDC {
57 using namespace TrackFindingCDC;
60 void createTangentSegment(
const CDCRLWireHitSegment& rlWireHitSegment,
61 CDCTangentSegment& tangentSegment)
63 size_t nRLWireHits = rlWireHitSegment.size();
64 if (nRLWireHits < 2)
return;
66 tangentSegment.reserve(nRLWireHits - 1);
69 transform_adjacent_pairs(rlWireHitSegment.begin(), rlWireHitSegment.end(),
70 back_inserter(tangentSegment),
71 [](
const CDCRLWireHit & firstRLWireHit,
72 const CDCRLWireHit & secondRLWireHit) {
73 return CDCTangent(firstRLWireHit, secondRLWireHit);
76 if (tangentSegment.size() + 1 != rlWireHitSegment.size()) {
77 B2ERROR(
"Wrong number of tangents created.");
82 template<
class ATangentRange>
83 CDCSegment2D condenseTangentSegment(
const ATangentRange& tangentSegment)
85 using TangentIt = GetIterator<const ATangentRange&>;
86 TangentIt tangentIt{tangentSegment.begin()};
87 TangentIt endTangentIt{tangentSegment.end()};
88 int nTangents = std::distance(tangentIt, endTangentIt);
91 result.reserve(nTangents + 1);
95 }
else if (nTangents == 1) {
97 const CDCTangent& tangent = *tangentIt;
98 result.push_back(tangent.getFromRecoHit2D());
99 result.push_back(tangent.getToRecoHit2D());
102 TangentIt firstTangentIt = tangentIt++;
103 TangentIt secondTangentIt = tangentIt++;
106 const CDCTangent& firstTangent = *firstTangentIt;
107 result.push_back(firstTangent.getFromRecoHit2D());
110 while (tangentIt != endTangentIt) {
112 firstTangentIt = secondTangentIt;
113 secondTangentIt = tangentIt++;
115 const CDCTangent& firstTangent = *firstTangentIt;
116 const CDCTangent& secondTangent = *secondTangentIt;
119 secondTangent.getFromRecoHit2D()));
122 const CDCTangent& secondTangent = *secondTangentIt;
123 result.push_back(secondTangent.getToRecoHit2D());
127 result.receiveISuperCluster();
131 template<
class AFacetRange>
132 CDCSegment2D condenseFacetSegment(
const AFacetRange& facetSegment)
134 using FacetIt = GetIterator<const AFacetRange&>;
135 FacetIt facetIt = facetSegment.begin();
136 FacetIt endFacetIt = facetSegment.end();
137 int nFacets = std::distance(facetIt, endFacetIt);
140 result.reserve(nFacets + 2);
144 }
else if (nFacets == 1) {
145 FacetIt onlyFacetIt = facetIt;
146 const CDCFacet& onlyFacet = *onlyFacetIt;
147 result.push_back(onlyFacet.getStartRecoHit2D());
148 result.push_back(onlyFacet.getMiddleRecoHit2D());
149 result.push_back(onlyFacet.getEndRecoHit2D());
151 }
else if (nFacets == 2) {
152 FacetIt firstFacetIt = facetIt++;
153 FacetIt secondFacetIt = facetIt;
155 const CDCFacet& firstFacet = *firstFacetIt;
156 const CDCFacet& secondFacet = *secondFacetIt;
158 result.push_back(firstFacet.getStartRecoHit2D());
160 firstFacet.getMiddleRecoHit2D()));
163 firstFacet.getEndRecoHit2D()));
165 result.push_back(secondFacet.getEndRecoHit2D());
168 FacetIt firstFacetIt = facetIt++;
169 FacetIt secondFacetIt = facetIt++;
170 FacetIt thirdFacetIt = facetIt++;
173 const CDCFacet& firstFacet = *firstFacetIt;
174 const CDCFacet& secondFacet = *secondFacetIt;
175 const CDCFacet& thirdFacet = *thirdFacetIt;
177 result.push_back(firstFacet.getStartRecoHit2D());
180 secondFacet.getStartRecoHit2D()));
183 secondFacet.getMiddleRecoHit2D(),
184 thirdFacet.getStartRecoHit2D()));
187 while (facetIt != endFacetIt) {
188 firstFacetIt = secondFacetIt;
189 secondFacetIt = thirdFacetIt;
190 thirdFacetIt = facetIt++;
192 const CDCFacet& firstFacet = *firstFacetIt;
193 const CDCFacet& secondFacet = *secondFacetIt;
194 const CDCFacet& thirdFacet = *thirdFacetIt;
197 secondFacet.getMiddleRecoHit2D(),
198 thirdFacet.getStartRecoHit2D()));
201 const CDCFacet& secondFacet = *secondFacetIt;
202 const CDCFacet& thirdFacet = *thirdFacetIt;
205 thirdFacet.getMiddleRecoHit2D()));
207 result.push_back(thirdFacet.getEndRecoHit2D());
211 result.receiveISuperCluster();
219 const std::vector<CDCTangent>& tangents = tangentSegment;
220 CDCSegment2D segment2D = ::condenseTangentSegment(tangents);
229 std::vector<std::reference_wrapper<const CDCTangent> > tangents;
230 tangents.reserve(tangentPath.size());
231 for (
const CDCTangent* tangent : tangentPath) {
233 tangents.push_back(std::ref(*tangent));
236 return ::condenseTangentSegment(tangents);
241 const std::vector<CDCFacet>& facets = facetSegment;
242 CDCSegment2D segment2D = ::condenseFacetSegment(facets);
251 std::vector<std::reference_wrapper<const CDCFacet> > facets;
252 facets.reserve(facetPath.size());
253 for (
const CDCFacet* facet : facetPath) {
255 facets.push_back(std::ref(*facet));
258 return ::condenseFacetSegment(facets);
264 double aliasScore = 0;
266 assert(ptrSegment2D);
268 if (result.empty()) {
273 result.push_back(recoHit2D);
278 result.receiveISuperCluster();
279 result.setAliasScore(aliasScore);
285 if (rlWireHitSegment.size() == 1) {
288 segment2D.emplace_back(rlWireHitSegment.front(), zeroDisp2D);
295 createTangentSegment(rlWireHitSegment, tangentSegment);
304 if (rlWireHitSegment.size() < 3) {
314 return {
this, segment};
319 return {
this, weight, segment};
331 std::vector<const CDCWire*> wireSegment;
334 wireSegment.push_back(&(recoHit2D.
getWire()));
344 wireHitSegment.push_back(&(recoHit2D.
getWireHit()));
348 return wireHitSegment;
356 segment.push_back(recoHit2D.
getAlias());
366 int nRLSwitches = -1;
384 return static_cast<double>(rlSum) / size();
396 return rlWireHitSegment;
402 reverseSegment.reserve(size());
403 for (
const CDCRecoHit2D& recohit : reversedRange(*
this)) {
405 reverseSegment.push_back(recohit.reversed());
412 return reverseSegment;
425 std::reverse(begin(), end());
431 if (not toHits)
return;
441 if (not toHits)
return;
450 if (not fromHits)
return;
462 unsigned int notTakenCounter = 0;
466 if (notTakenCounter > maxNotTaken) {
477 auto getISuperClusterOfHit = [](
const CDCRecoHit2D & recoHit2d) ->
int {
478 return recoHit2d.getWireHit().getISuperCluster();
480 int iSuperCluster = common(*
this, getISuperClusterOfHit, -1);