46 std::vector<CDCTrack>& tracks,
const std::vector<CDCSegment2D>& segments)
53 std::vector<CDCRecoHit3D> recoHits3D;
55 for (
const auto& relation : relations) {
56 hit_size += relation.getTo()->size();
59 hit_size += segment.size();
62 hit_size += track.size();
64 recoHits3D.reserve(hit_size);
67 std::vector<WeightedRelation<CDCTrack, const CDCRecoHit3D>> trackHitRelations;
68 trackHitRelations.reserve(2500);
77 for (
const auto& relation : relations) {
78 CDCTrack* track = relation.getFrom();
80 const Weight weight = relation.getWeight();
86 MayBePtr<const CDCRecoHit3D> ptrRecoHit3D = track->find(recoHit.getWireHit());
87 if (ptrRecoHit3D !=
nullptr) {
88 recoHits3D.push_back(*ptrRecoHit3D);
89 trackHitRelations.push_back({track, weight, &recoHits3D.back()});
96 B2DEBUG(25,
"Had to skip a NAN hit");
99 recoHits3D.push_back(recoHit3D);
100 trackHitRelations.push_back({track, weight, &recoHits3D.back()});
102 segment->setTakenFlag();
110 if (segment->hasTakenFlag())
continue;
114 recoHits3D.push_back({recoHit.getRLWireHit(),
Vector3D(recoHit.getRecoPos2D()), 0});
115 trackHitRelations.push_back({
nullptr, 0, &recoHits3D.back()});
123 recoHits3D.push_back(recoHit3D);
125 trackHitRelations.push_back({&track, -INFINITY, &recoHits3D.back()});
130 std::sort(trackHitRelations.begin(), trackHitRelations.end());
136 recoHit3D.getWireHit()->unsetTakenFlag();
142 for (
const auto& trackHitRelation : trackHitRelations) {
143 CDCTrack* track = trackHitRelation.getFrom();
144 const CDCRecoHit3D* recoHit3D = trackHitRelation.getTo();
146 if (track ==
nullptr)
continue;
148 track->push_back(*recoHit3D);
153 TrackFindingCDC::erase_remove_if(tracks, [](
const CDCTrack & track) {
return track.empty(); });
157 track.sortByArcLength2D();
160 track.setStartTrajectory3D(startTrajectory);
164 track.setEndTrajectory3D(endTrajectory);