10 #include <tracking/trackFindingCDC/findlets/minimal/SegmentTrackAdderWithNormalization.h>
12 #include <tracking/trackFindingCDC/eventdata/tracks/CDCTrack.h>
13 #include <tracking/trackFindingCDC/eventdata/segments/CDCSegment2D.h>
15 #include <framework/core/ModuleParamList.templateDetails.h>
17 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
18 #include <tracking/trackFindingCDC/utilities/Algorithms.h>
22 using namespace TrackFindingCDC;
34 moduleParamList->
addParameter(prefixed(prefix,
"removeUnmatchedSegments"),
36 "Swtich to remove hits in segments that have no matching track from all tracks",
43 return "Add the matched segments to the tracks and normalize the tracks afterwards. Also deletes all "
44 "hits from tracks, that are now part in another track (or should not be part in any).";
48 std::vector<CDCTrack>& tracks,
const std::vector<CDCSegment2D>& segments)
55 std::vector<CDCRecoHit3D> recoHits3D;
57 for (
const auto& relation : relations) {
58 hit_size += relation.getTo()->size();
61 hit_size += segment.size();
64 hit_size += track.size();
66 recoHits3D.reserve(hit_size);
69 std::vector<WeightedRelation<CDCTrack, const CDCRecoHit3D>> trackHitRelations;
70 trackHitRelations.reserve(2500);
79 for (
const auto& relation : relations) {
80 CDCTrack* track = relation.getFrom();
82 const Weight weight = relation.getWeight();
88 MayBePtr<const CDCRecoHit3D> ptrRecoHit3D = track->find(recoHit.getWireHit());
89 if (ptrRecoHit3D !=
nullptr) {
90 recoHits3D.push_back(*ptrRecoHit3D);
91 trackHitRelations.push_back({track, weight, &recoHits3D.back()});
98 B2DEBUG(100,
"Had to skip a NAN hit");
101 recoHits3D.push_back(recoHit3D);
102 trackHitRelations.push_back({track, weight, &recoHits3D.back()});
104 segment->setTakenFlag();
112 if (segment->hasTakenFlag())
continue;
116 recoHits3D.push_back({recoHit.getRLWireHit(),
Vector3D(recoHit.getRecoPos2D()), 0});
117 trackHitRelations.push_back({
nullptr, 0, &recoHits3D.back()});
125 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 TrackFindingCDC::erase_remove_if(tracks, [](
const CDCTrack & track) {
return track.empty(); });
158 track.sortByArcLength2D();
161 track.setStartTrajectory3D(startTrajectory);
165 track.setEndTrajectory3D(endTrajectory);