Apply the findlet.
48{
49
50
51
52
53
54 std::vector<CDCRecoHit3D> recoHits3D;
55 int hit_size = 0;
56 for (const auto& relation : relations) {
57 hit_size += relation.getTo()->size();
58 }
59 for (const CDCSegment2D& segment : segments) {
60 hit_size += segment.size();
61 }
62 for (CDCTrack& track : tracks) {
63 hit_size += track.size();
64 }
65 recoHits3D.reserve(hit_size);
66
67
68 std::vector<WeightedRelation<CDCTrack, const CDCRecoHit3D>> trackHitRelations;
69 trackHitRelations.reserve(2500);
70
71
72
73
74
75
76
77
78 for (const auto& relation : relations) {
79 CDCTrack* track = relation.getFrom();
80 const CDCSegment2D& segment = *(relation.getTo());
81 const Weight weight = relation.getWeight();
82 const CDCTrajectory3D& trajectory3D = track->getStartTrajectory3D();
83
84 for (const CDCRecoHit2D& recoHit : segment) {
85
86
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()});
91 continue;
92 }
93
94
97 B2DEBUG(25, "Had to skip a NAN hit");
98 continue;
99 }
100 recoHits3D.push_back(recoHit3D);
101 trackHitRelations.push_back({track, weight, &recoHits3D.back()});
102 }
103 segment->setTakenFlag();
104 }
105
106
108 for (const CDCSegment2D& segment : segments) {
109
110
111 if (segment->hasTakenFlag()) continue;
112
113
114 for (const CDCRecoHit2D& recoHit : segment) {
115 recoHits3D.push_back({recoHit.getRLWireHit(),
Vector3D(recoHit.getRecoPos2D()), 0});
116 trackHitRelations.push_back({nullptr, 0, &recoHits3D.back()});
117 }
118 }
119 }
120
121
122 for (CDCTrack& track : tracks) {
123 for (const CDCRecoHit3D& recoHit3D : track) {
124 recoHits3D.push_back(recoHit3D);
125
126 trackHitRelations.push_back({&track, -INFINITY, &recoHits3D.back()});
127 }
128 }
129
130
131 std::sort(trackHitRelations.begin(), trackHitRelations.end());
133
134
135 for (CDCTrack& track : tracks) {
136 for (const CDCRecoHit3D& recoHit3D : track) {
138 }
139 track.clear();
140 }
141
142
143 for (const auto& trackHitRelation : trackHitRelations) {
144 CDCTrack* track = trackHitRelation.getFrom();
145 const CDCRecoHit3D* recoHit3D = trackHitRelation.getTo();
146
147 if (track == nullptr) continue;
148
149 track->push_back(*recoHit3D);
151 }
152
153
154 erase_remove_if(tracks, [](const CDCTrack & track) { return track.empty(); });
155
156
157 for (CDCTrack& track : tracks) {
158 track.sortByArcLength2D();
159 CDCTrajectory3D startTrajectory = track.getStartTrajectory3D();
161 track.setStartTrajectory3D(startTrajectory);
162
163 CDCTrajectory3D endTrajectory = track.getEndTrajectory3D();
165 track.setEndTrajectory3D(endTrajectory);
166 }
167
168
170}
bool m_param_removeUnmatchedSegments
Parameter : Switch to remove hits in segments that have no matching track from all tracks.
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.
HepGeom::Vector3D< double > Vector3D
3D Vector