47 std::vector<CDCTrack>& tracks,
const std::vector<CDCSegment2D>& segments)
54 std::vector<CDCRecoHit3D> recoHits3D;
56 for (
const auto& relation : relations) {
57 hit_size += relation.getTo()->size();
60 hit_size += segment.size();
63 hit_size += track.size();
65 recoHits3D.reserve(hit_size);
68 std::vector<WeightedRelation<CDCTrack, const CDCRecoHit3D>> trackHitRelations;
69 trackHitRelations.reserve(2500);
78 for (
const auto& relation : relations) {
79 CDCTrack* track = relation.getFrom();
81 const Weight weight = relation.getWeight();
87 MayBePtr<const CDCRecoHit3D> ptrRecoHit3D = track->find(recoHit.getWireHit());
88 if (ptrRecoHit3D !=
nullptr) {
89 recoHits3D.push_back(*ptrRecoHit3D);
90 trackHitRelations.push_back({track, weight, &recoHits3D.back()});
97 B2DEBUG(25,
"Had to skip a NAN hit");
100 recoHits3D.push_back(recoHit3D);
101 trackHitRelations.push_back({track, weight, &recoHits3D.back()});
103 segment->setTakenFlag();
111 if (segment->hasTakenFlag())
continue;
115 recoHits3D.push_back({recoHit.getRLWireHit(),
Vector3D(recoHit.getRecoPos2D()), 0});
116 trackHitRelations.push_back({
nullptr, 0, &recoHits3D.back()});
124 recoHits3D.push_back(recoHit3D);
126 trackHitRelations.push_back({&track, -INFINITY, &recoHits3D.back()});
131 std::sort(trackHitRelations.begin(), trackHitRelations.end());
137 recoHit3D.getWireHit()->unsetTakenFlag();
143 for (
const auto& trackHitRelation : trackHitRelations) {
144 CDCTrack* track = trackHitRelation.getFrom();
145 const CDCRecoHit3D* recoHit3D = trackHitRelation.getTo();
147 if (track ==
nullptr)
continue;
149 track->push_back(*recoHit3D);
154 erase_remove_if(tracks, [](
const CDCTrack & track) {
return track.empty(); });
158 track.sortByArcLength2D();
161 track.setStartTrajectory3D(startTrajectory);
165 track.setEndTrajectory3D(endTrajectory);