10 #include <tracking/trackFindingCDC/findlets/minimal/AxialTrackMerger.h>
12 #include <tracking/trackFindingCDC/processing/AxialTrackUtil.h>
14 #include <tracking/trackFindingCDC/fitting/CDCKarimakiFitter.h>
16 #include <tracking/trackFindingCDC/eventdata/tracks/CDCTrack.h>
17 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
18 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
20 #include <tracking/trackFindingCDC/numerics/WeightComperator.h>
22 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
24 #include <framework/core/ModuleParamList.templateDetails.h>
27 using namespace TrackFindingCDC;
31 return "Merges axial tracks found in the legendre search";
36 moduleParamList->
addParameter(prefixed(prefix,
"minFitProb"),
38 "Minimal fit probability of the common fit "
39 "of two tracks to be eligible for merging",
44 const std::vector<const CDCWireHit*>& allAxialWireHits)
48 for (
CDCTrack& track : axialTracks) {
49 if (track.size() < 5)
continue;
55 for (
CDCTrack& track : axialTracks) {
71 const std::vector<const CDCWireHit*>& allAxialWireHits)
74 for (
auto itTrack = axialTracks.begin(); itTrack != axialTracks.end(); ++itTrack) {
76 auto followingTracks = asRange(std::next(itTrack), axialTracks.end());
90 template <
class ACDCTracks>
93 std::vector<WithWeight<CDCTrack*>> weightedTracks;
95 if (&track == &track2)
continue;
96 if (track2.size() < 3)
continue;
99 if (std::isnan(fitProb))
continue;
101 weightedTracks.emplace_back(&track2, fitProb);
104 auto bestMatch = std::max_element(weightedTracks.begin(), weightedTracks.end(),
LessWeight());
105 if (bestMatch == weightedTracks.end())
return {
nullptr, 0};
106 else return *bestMatch;
124 if (not isValid(fbInfo))
continue;
130 if (not isValid(fbInfo))
continue;
134 if (not trajectory3D1.
isCurler() and fbVote12 < 0)
return NAN;
135 if (not trajectory3D2.
isCurler() and fbVote21 < 0)
return NAN;
140 std::vector<const CDCWireHit*> combinedWireHits;
141 combinedWireHits.reserve(track1.size() + track2.size());
144 combinedWireHits.push_back(&(hit.getWireHit()));
148 combinedWireHits.push_back(&(hit.getWireHit()));
155 std::sort(combinedWireHits.begin(), combinedWireHits.end());
156 erase_unique(combinedWireHits);
163 commonTrajectory2D = fitter.fit(combinedWireHits);
165 commonTrajectory2D = fitter.fit(combinedWireHits);
167 commonTrajectory2D = fitter.fit(combinedWireHits);
169 commonTrajectory2D = fitter.fit(combinedWireHits);
171 commonTrajectory2D = fitter.fit(combinedWireHits);
175 if (combinedWireHits.size() <= std::max(track1.size(), track2.size())
176 or combinedWireHits.size() < 15) {
184 std::vector<const CDCWireHit*>& wireHits,
187 auto farFromTrajectory = [&trajectory2D, &factor](
const CDCWireHit * wireHit) {
188 Vector2D pos2D = wireHit->getRefPos2D();
189 double driftLength = wireHit->getRefDriftLength();
190 double dist = std::fabs(trajectory2D.
getDist2D(pos2D)) - driftLength;
191 return std::fabs(dist) > driftLength * factor;
193 erase_remove_if(wireHits, farFromTrajectory);
198 const std::vector<const CDCWireHit*>& allAxialWireHits)
200 if (&track1 == &track2)
return;
202 CDCTrajectory2D trajectory2D = track1.getStartTrajectory3D().getTrajectory2D();
205 track1.push_back(std::move(recoHit3D));
216 recoHit3D.setRecoPos3D({recoHit3D.getRefPos2D(), 0});
217 recoHit3D.setRLInfo(ERightLeft::c_Unknown);
224 recoHit3D.getWireHit()->setTakenFlag(
false);