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();
112 for (
const ROOT::Math::XYZVector& recoPos3D : trajectory2D.
reconstructBoth3D(wireLine, signedDriftLength)) {
120 double perpS = trajectory2D.
calcArcLength2D(VectorUtil::getXYVector(recoPos3D));
128 recoHits.emplace_back(
CDCRecoHit3D(rlWireHit, recoPos3D, perpS), &rlWireHit);
134 if (not recoHit.isAxial()) {
135 recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
137 recoHits.emplace_back(recoHit, &rlWireHit);
151 if (foundStereoHitsWithNode.size() != 1) {
156 auto foundStereoHits = foundStereoHitsWithNode[0].second;
157 const auto& node = foundStereoHitsWithNode[0].first;
160 std::vector<CDCRecoHit3D> allHits;
161 std::vector<CDCRecoHit3D> foundHits;
163 for (
const CDCRecoHitWithRLPointer& recoHitWithRL : recoHits) {
165 allHits.push_back(recoHit3D);
167 for (
const CDCRecoHitWithRLPointer& recoHitWithRL : foundStereoHits) {
169 foundHits.push_back(recoHit3D);
175 const auto& isAssignedHit = [](
const CDCRecoHitWithRLPointer & recoHitWithRLPointer) {
176 const CDCRecoHit3D& recoHit3D = recoHitWithRLPointer.first;
181 foundStereoHits.erase(std::remove_if(foundStereoHits.begin(),
182 foundStereoHits.end(),
184 foundStereoHits.end());
187 auto sortByHitAndNodeCenterDistance = [node](
const CDCRecoHitWithRLPointer & lhs,
188 const CDCRecoHitWithRLPointer & rhs) {
197 if (lhsWireHit < rhsWireHit) {
199 }
else if (rhsWireHit < lhsWireHit) {
202 return AQuadTree::DecisionAlgorithm::BoxAlgorithm::compareDistances(node, lhsRecoHit, rhsRecoHit);
206 const auto& sameHitComparer = [](
const CDCRecoHitWithRLPointer & lhs,
207 const CDCRecoHitWithRLPointer & rhs) {
214 std::sort(foundStereoHits.begin(),
215 foundStereoHits.end(),
216 sortByHitAndNodeCenterDistance);
219 foundStereoHits.erase(std::unique(foundStereoHits.begin(),
220 foundStereoHits.end(),
222 foundStereoHits.end());
225 for (
const CDCRecoHitWithRLPointer& recoHitWithRLPointer : foundStereoHits) {
226 const CDCRLWireHit* rlWireHit = recoHitWithRLPointer.second;
227 relationsForCollector.emplace_back(&track, foundStereoHits.size(), rlWireHit);