Apply the findlet.
47{
48
49
50
51
52
53 std::vector<CDCRecoHit3D> recoHits3D;
54 int hit_size = 0;
55 for (const auto& relation : relations) {
56 hit_size += relation.getTo()->size();
57 }
58 for (const CDCSegment2D& segment : segments) {
59 hit_size += segment.size();
60 }
61 for (CDCTrack& track : tracks) {
62 hit_size += track.size();
63 }
64 recoHits3D.reserve(hit_size);
65
66
67 std::vector<WeightedRelation<CDCTrack, const CDCRecoHit3D>> trackHitRelations;
68 trackHitRelations.reserve(2500);
69
70
71
72
73
74
75
76
77 for (const auto& relation : relations) {
78 CDCTrack* track = relation.getFrom();
79 const CDCSegment2D& segment = *(relation.getTo());
80 const Weight weight = relation.getWeight();
81 const CDCTrajectory3D& trajectory3D = track->getStartTrajectory3D();
82
83 for (const CDCRecoHit2D& recoHit : segment) {
84
85
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()});
90 continue;
91 }
92
93
96 B2DEBUG(25, "Had to skip a NAN hit");
97 continue;
98 }
99 recoHits3D.push_back(recoHit3D);
100 trackHitRelations.push_back({track, weight, &recoHits3D.back()});
101 }
102 segment->setTakenFlag();
103 }
104
105
107 for (const CDCSegment2D& segment : segments) {
108
109
110 if (segment->hasTakenFlag()) continue;
111
112
113 for (const CDCRecoHit2D& recoHit : segment) {
114 recoHits3D.push_back({recoHit.getRLWireHit(),
Vector3D(recoHit.getRecoPos2D()), 0});
115 trackHitRelations.push_back({nullptr, 0, &recoHits3D.back()});
116 }
117 }
118 }
119
120
121 for (CDCTrack& track : tracks) {
122 for (const CDCRecoHit3D& recoHit3D : track) {
123 recoHits3D.push_back(recoHit3D);
124
125 trackHitRelations.push_back({&track, -INFINITY, &recoHits3D.back()});
126 }
127 }
128
129
130 std::sort(trackHitRelations.begin(), trackHitRelations.end());
132
133
134 for (CDCTrack& track : tracks) {
135 for (const CDCRecoHit3D& recoHit3D : track) {
137 }
138 track.clear();
139 }
140
141
142 for (const auto& trackHitRelation : trackHitRelations) {
143 CDCTrack* track = trackHitRelation.getFrom();
144 const CDCRecoHit3D* recoHit3D = trackHitRelation.getTo();
145
146 if (track == nullptr) continue;
147
148 track->push_back(*recoHit3D);
150 }
151
152
153 TrackFindingCDC::erase_remove_if(tracks, [](const CDCTrack & track) { return track.empty(); });
154
155
156 for (CDCTrack& track : tracks) {
157 track.sortByArcLength2D();
158 CDCTrajectory3D startTrajectory = track.getStartTrajectory3D();
160 track.setStartTrajectory3D(startTrajectory);
161
162 CDCTrajectory3D endTrajectory = track.getEndTrajectory3D();
164 track.setEndTrajectory3D(endTrajectory);
165 }
166
167
169}
void setTakenFlag(bool setTo=true)
Sets the taken flag to the given value. Default value true.
void unsetTakenFlag()
Resets the taken flag to false.
const CDCWireHit & getWireHit() const
Getter for the wire hit.
static CDCRecoHit3D reconstruct(const CDCRecoHit2D &recoHit2D, const CDCTrajectory2D &trajectory2D)
Reconstructs the three dimensional hit from the two dimensional and the two dimensional trajectory.
double getArcLength2D() const
Getter for the travel distance in the xy projection.
double setLocalOrigin(const Vector3D &localOrigin)
Setter for the origin of the local coordinate system.
bool m_param_removeUnmatchedSegments
Parameter : Switch to remove hits in segments that have no matching track from all tracks.
HepGeom::Vector3D< double > Vector3D
3D Vector