10 #include <tracking/trackFindingCDC/eventdata/tracks/CDCTrack.h>
12 #include <tracking/trackFindingCDC/eventdata/tracks/CDCSegmentTriple.h>
13 #include <tracking/trackFindingCDC/eventdata/tracks/CDCSegmentPair.h>
14 #include <tracking/trackFindingCDC/eventdata/segments/CDCSegment3D.h>
15 #include <tracking/trackFindingCDC/eventdata/segments/CDCSegment2D.h>
17 #include <tracking/trackFindingCDC/eventdata/hits/CDCRecoHit3D.h>
18 #include <tracking/trackFindingCDC/eventdata/hits/CDCRecoHit2D.h>
19 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
21 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory3D.h>
22 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
24 #include <tracking/trackFindingCDC/topology/ISuperLayer.h>
26 #include <tracking/trackFindingCDC/geometry/PerigeeCircle.h>
27 #include <tracking/trackFindingCDC/geometry/UncertainPerigeeCircle.h>
28 #include <tracking/trackFindingCDC/geometry/Vector3D.h>
30 #include <tracking/trackFindingCDC/ca/AutomatonCell.h>
32 #include <tracking/trackFindingCDC/numerics/FloatComparing.h>
34 #include <tracking/trackFindingCDC/utilities/MayBePtr.h>
36 #include <framework/logging/Logger.h>
47 namespace TrackFindingCDC {
54 using namespace TrackFindingCDC;
58 void appendReconstructed(
const CDCSegment2D* segment,
59 const CDCTrajectory3D& trajectory3D,
63 B2ASSERT(
"Did not expect segment == nullptr", segment);
65 for (
const CDCRecoHit2D& recohit2D : *segment) {
68 track.back().shiftArcLength2D(perpSOffset);
85 double appendReconstructedAverage(
const CDCSegment2D* segment,
86 const CDCTrajectory3D& trajectory3D,
88 const CDCTrajectory3D& parallelTrajectory3D,
91 B2ASSERT(
"Did not expect segment == nullptr", segment);
93 const CDCRecoHit2D& firstRecoHit2D = segment->front();
95 CDCRecoHit3D firstRecoHit3D =
98 double firstPerpS = firstRecoHit3D.getArcLength2D();
100 CDCRecoHit3D parallelFirstRecoHit3D =
103 double parallelFirstPerpS = parallelFirstRecoHit3D.getArcLength2D();
105 double parallelPerpSOffSet = firstPerpS + perpSOffset - parallelFirstPerpS;
107 for (
const CDCRecoHit2D& recoHit2D : *segment) {
109 CDCRecoHit3D recoHit3D =
112 recoHit3D.shiftArcLength2D(perpSOffset);
115 CDCRecoHit3D parallelRecoHit3D =
118 parallelRecoHit3D.shiftArcLength2D(parallelPerpSOffSet);
124 const CDCRecoHit2D& lastRecoHit2D = segment->back() ;
126 CDCRecoHit3D parallelLastRecoHit3D =
129 double newPrepSOffset = track.back().getArcLength2D() - parallelLastRecoHit3D.getArcLength2D();
131 return newPrepSOffset;
141 m_startTrajectory3D(segment.getTrajectory2D()),
142 m_endTrajectory3D(segment.getTrajectory2D())
144 if (segment.empty())
return;
157 const CDCRLWireHit& rlWireHit = recoHit2D.getRLWireHit();
158 Vector3D recoPos3D(recoHit2D.getRecoPos2D(), 0.0);
168 if (trackPath.empty()) {
170 }
else if (trackPath.size() == 1) {
174 for (
const CDCTrack* track : trackPath) {
175 for (
const CDCRecoHit3D& recoHit3D : *track) {
176 result.push_back(recoHit3D);
181 CDCTrajectory3D startTrajectory3D = trackPath.front()->getStartTrajectory3D();
182 CDCTrajectory3D endTrajectory3D = trackPath.back()->getStartTrajectory3D();
184 double resetPerpSOffset =
185 startTrajectory3D.setLocalOrigin(result.front().getRecoPos3D());
186 result.setStartTrajectory3D(startTrajectory3D);
188 endTrajectory3D.setLocalOrigin(result.back().getRecoPos3D());
189 result.setEndTrajectory3D(endTrajectory3D);
191 for (CDCRecoHit3D& recoHit3D : result) {
192 recoHit3D.shiftArcLength2D(-resetPerpSOffset);
203 if (segmentTriplePath.empty())
return track;
205 Path<const CDCSegmentTriple>::const_iterator itSegmentTriple = segmentTriplePath.begin();
212 double perpSOffset = 0.0;
222 while (itSegmentTriple != segmentTriplePath.end()) {
225 B2ASSERT(
"Two segement triples do not overlap in their axial segments",
228 perpSOffset = appendReconstructedAverage(firstSegmentTriple->
getEndSegment(),
238 firstSegmentTriple = secondSegmentTriple;
252 double resetPerpSOffset = startTrajectory3D.
setLocalOrigin(track.front().getRecoPos3D());
253 track.setStartTrajectory3D(startTrajectory3D);
256 track.setEndTrajectory3D(endTrajectory3D);
259 recoHit3D.shiftArcLength2D(-resetPerpSOffset);
270 if (segmentPairPath.empty())
return track;
272 Path<const CDCSegmentPair>::const_iterator itSegmentPair = segmentPairPath.begin();
279 double perpSOffset = 0.0;
284 while (itSegmentPair != segmentPairPath.end()) {
288 B2ASSERT(
"Two segement pairs do not overlap in their segments",
291 perpSOffset = appendReconstructedAverage(firstSegmentPair->
getToSegment(),
297 firstSegmentPair = secondSegmentPair;
309 double resetPerpSOffset = startTrajectory3D.
setLocalOrigin(track.front().getRecoPos3D());
310 track.setStartTrajectory3D(startTrajectory3D);
314 track.setEndTrajectory3D(endTrajectory3D);
317 recoHit3D.shiftArcLength2D(-resetPerpSOffset);
325 vector<CDCSegment3D> result;
326 ISuperLayer lastISuperLayer = -1;
329 if (result.empty() or lastISuperLayer != iSuperLayer) {
330 result.emplace_back();
332 result.back().push_back(recoHit3D);
333 lastISuperLayer = iSuperLayer;
359 std::reverse(begin(), end());
366 return reversedTrack;
371 auto hasWireHit = [&wireHit](
const CDCRecoHit3D & recoHit3D) {
372 return recoHit3D.hasWireHit(wireHit);
374 auto itRecoHit3D = std::find_if(this->begin(), this->end(), hasWireHit);
375 return itRecoHit3D == this->end() ? nullptr : &*itRecoHit3D;
416 std::stable_sort(begin(),
421 return lessFloatHighNaN(arcLength, otherArcLength);
428 if (doForAllTracks or startTrajectory2D.
isCurler(1.1)) {
430 if (std::isfinite(shiftValue)) {