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 const auto& tmp = recoHit.getRecoPos2D();
116 recoHits3D.push_back({recoHit.getRLWireHit(), ROOT::Math::XYZVector(tmp.X(), tmp.Y(), 0.0), 0});
117 trackHitRelations.push_back({nullptr, 0, &recoHits3D.back()});
118 }
119 }
120 }
121
122
123 for (CDCTrack& track : tracks) {
124 for (const CDCRecoHit3D& recoHit3D : track) {
125 recoHits3D.push_back(recoHit3D);
126
127 trackHitRelations.push_back({&track, -INFINITY, &recoHits3D.back()});
128 }
129 }
130
131
132 std::sort(trackHitRelations.begin(), trackHitRelations.end());
134
135
136 for (CDCTrack& track : tracks) {
137 for (const CDCRecoHit3D& recoHit3D : track) {
139 }
140 track.clear();
141 }
142
143
144 for (const auto& trackHitRelation : trackHitRelations) {
145 CDCTrack* track = trackHitRelation.getFrom();
146 const CDCRecoHit3D* recoHit3D = trackHitRelation.getTo();
147
148 if (track == nullptr) continue;
149
150 track->push_back(*recoHit3D);
152 }
153
154
155 erase_remove_if(tracks, [](const CDCTrack & track) { return track.empty(); });
156
157
158 for (CDCTrack& track : tracks) {
159 track.sortByArcLength2D();
160 CDCTrajectory3D startTrajectory = track.getStartTrajectory3D();
162 track.setStartTrajectory3D(startTrajectory);
163
164 CDCTrajectory3D endTrajectory = track.getEndTrajectory3D();
166 track.setEndTrajectory3D(endTrajectory);
167 }
168
169
171}
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 ROOT::Math::XYZVector &localOrigin)
Setter for the origin of the local coordinate system.