87 std::vector<Super::WeightedRelationItem>& relationsForCollector)
95 const CDCTrajectory2D& trajectory2D = track.getStartTrajectory3D().getTrajectory2D();
96 const bool isCurler = trajectory2D.
isCurler();
98 using CDCRecoHitWithRLPointer = std::pair<CDCRecoHit3D, const CDCRLWireHit*>;
99 std::vector<CDCRecoHitWithRLPointer> recoHits;
100 recoHits.reserve(rlWireHits.size() + track.size());
107 if (rlWireHit.getWireHit().getAutomatonCell().hasTakenFlag())
continue;
109 const CDCWire& wire = rlWireHit.getWire();
111 double signedDriftLength = rlWireHit.getSignedRefDriftLength();
114 for (
const double recoZ : trajectory2D.
reconstructBothZ(wireLine, signedDriftLength)) {
119 const ROOT::Math::XYZVector recoWirePos3D = wireLine.
sagPos3DAtZ(recoZ);
120 const auto& closest = trajectory2D.
getClosest(VectorUtil::getXYVector(recoWirePos3D));
121 const ROOT::Math::XYZVector recoPos3D(closest.X(), closest.Y(), recoWirePos3D.z());
125 double perpS = trajectory2D.
calcArcLength2D(VectorUtil::getXYVector(recoPos3D));
133 recoHits.emplace_back(
CDCRecoHit3D(rlWireHit, recoPos3D, perpS), &rlWireHit);
139 if (not recoHit.isAxial()) {
140 recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
142 recoHits.emplace_back(recoHit, &rlWireHit);
156 if (foundStereoHitsWithNode.size() != 1) {
161 auto foundStereoHits = foundStereoHitsWithNode[0].second;
162 const auto& node = foundStereoHitsWithNode[0].first;
165 std::vector<CDCRecoHit3D> allHits;
166 std::vector<CDCRecoHit3D> foundHits;
168 for (
const CDCRecoHitWithRLPointer& recoHitWithRL : recoHits) {
170 allHits.push_back(recoHit3D);
172 for (
const CDCRecoHitWithRLPointer& recoHitWithRL : foundStereoHits) {
174 foundHits.push_back(recoHit3D);
180 const auto& isAssignedHit = [](
const CDCRecoHitWithRLPointer & recoHitWithRLPointer) {
181 const CDCRecoHit3D& recoHit3D = recoHitWithRLPointer.first;
186 foundStereoHits.erase(std::remove_if(foundStereoHits.begin(),
187 foundStereoHits.end(),
189 foundStereoHits.end());
192 auto sortByHitAndNodeCenterDistance = [node](
const CDCRecoHitWithRLPointer & lhs,
193 const CDCRecoHitWithRLPointer & rhs) {
202 if (lhsWireHit < rhsWireHit) {
204 }
else if (rhsWireHit < lhsWireHit) {
207 return AQuadTree::DecisionAlgorithm::BoxAlgorithm::compareDistances(node, lhsRecoHit, rhsRecoHit);
211 const auto& sameHitComparer = [](
const CDCRecoHitWithRLPointer & lhs,
212 const CDCRecoHitWithRLPointer & rhs) {
219 std::sort(foundStereoHits.begin(),
220 foundStereoHits.end(),
221 sortByHitAndNodeCenterDistance);
224 foundStereoHits.erase(std::unique(foundStereoHits.begin(),
225 foundStereoHits.end(),
227 foundStereoHits.end());
230 for (
const CDCRecoHitWithRLPointer& recoHitWithRLPointer : foundStereoHits) {
231 const CDCRLWireHit* rlWireHit = recoHitWithRLPointer.second;
232 relationsForCollector.emplace_back(&track, foundStereoHits.size(), rlWireHit);