10 #include <tracking/trackFindingCDC/findlets/minimal/SegmentPairCreator.h>
12 #include <tracking/trackFindingCDC/eventdata/tracks/CDCSegmentPair.h>
13 #include <tracking/trackFindingCDC/eventdata/tracks/CDCAxialSegmentPair.h>
14 #include <tracking/trackFindingCDC/eventdata/segments/CDCSegment2D.h>
16 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
18 #include <framework/core/ModuleParamList.templateDetails.h>
26 using namespace TrackFindingCDC;
36 return "Creates axial stereo segment pairs from a set of segments filtered by some acceptance criterion";
44 moduleParamList->
addParameter(prefixed(prefix,
"axialBridging"),
46 "Switch to enable the search for axial to axial pairs "
47 "to enable more stable reconstruction of the middle stereo",
52 std::vector<CDCSegmentPair>& segmentPairs)
54 segmentPairs.reserve(500);
58 segmentsInSuperLayer.clear();
62 if (segment.empty())
continue;
63 ISuperLayer iSuperLayer = segment.front().getISuperLayer();
78 create(fromSegments, toSegments, segmentPairs);
85 create(fromSegments, toSegments, segmentPairs);
89 std::sort(segmentPairs.begin(), segmentPairs.end());
94 std::vector<CDCAxialSegmentPair> axialSegmentPairs;
101 const CDCSegment2D* startSegment = axialSegmentPair.getStartSegment();
102 const CDCSegment2D* endSegment = axialSegmentPair.getEndSegment();
104 CDCTrajectory2D startCommonTrajectory = axialSegmentPair.getTrajectory2D();
105 if (not startCommonTrajectory.
isFitted())
continue;
109 startSegment->setTrajectory2D(startCommonTrajectory);
110 std::vector<const CDCSegment2D*> startSegments{startSegment};
112 CDCTrajectory2D endCommonTrajectory = axialSegmentPair.getTrajectory2D();
115 endSegment->setTrajectory2D(endCommonTrajectory);
116 std::vector<const CDCSegment2D*> endSegments{endSegment};
118 if (startSegment->getISuperLayer() == endSegment->getISuperLayer()) {
119 ISuperLayer iSuperLayerCommon = startSegment->getISuperLayer();
124 create(startSegments, middleSegments, segmentPairs);
125 create(middleSegments, endSegments, segmentPairs);
131 create(startSegments, middleSegments, segmentPairs);
132 create(middleSegments, endSegments, segmentPairs);
136 ISuperLayer iSuperLayerMiddle =
137 (startSegment->getISuperLayer() + endSegment->getISuperLayer()) / 2;
139 create(startSegments, middleSegments, segmentPairs);
140 create(middleSegments, endSegments, segmentPairs);
142 startSegment->setTrajectory2D(startTrajectory2D);
143 endSegment->setTrajectory2D(endTrajectory2D);
147 if (lhs < rhs)
return true;
148 if (rhs < lhs)
return false;
152 std::sort(segmentPairs.begin(), segmentPairs.end(), lessPairAndgreaterWeight);
163 const std::vector<const CDCSegment2D*>& toSegments,
164 std::vector<CDCSegmentPair>& segmentPairs)
167 for (
const CDCSegment2D* ptrFromSegment : fromSegments) {
170 if (ptrFromSegment == ptrToSegment)
continue;
171 segmentPair.
setSegments(ptrFromSegment, ptrToSegment);
175 if (not std::isnan(pairWeight)) {
177 segmentPairs.push_back(segmentPair);