8#include <tracking/trackFindingCDC/findlets/minimal/AxialTrackMerger.h>
10#include <tracking/trackFindingCDC/processing/AxialTrackUtil.h>
12#include <tracking/trackFindingCDC/fitting/CDCKarimakiFitter.h>
14#include <tracking/trackingUtilities/eventdata/tracks/CDCTrack.h>
15#include <tracking/trackingUtilities/eventdata/hits/CDCWireHit.h>
16#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectory2D.h>
18#include <tracking/trackingUtilities/numerics/WeightComperator.h>
20#include <tracking/trackingUtilities/utilities/StringManipulation.h>
22#include <framework/core/ModuleParamList.templateDetails.h>
24#include <Math/Vector2D.h>
27using namespace TrackFindingCDC;
28using namespace TrackingUtilities;
32 return "Merges axial tracks found in the Legendre search";
37 moduleParamList->
addParameter(prefixed(prefix,
"minFitProb"),
39 "Minimal fit probability of the common fit "
40 "of two tracks to be eligible for merging",
45 const std::vector<const CDCWireHit*>& allAxialWireHits)
49 for (
CDCTrack& track : axialTracks) {
50 if (track.size() < 5)
continue;
56 for (
CDCTrack& track : axialTracks) {
72 const std::vector<const CDCWireHit*>& allAxialWireHits)
75 for (
auto itTrack = axialTracks.begin(); itTrack != axialTracks.end(); ++itTrack) {
77 auto followingTracks = asRange(std::next(itTrack), axialTracks.end());
91template <
class ACDCTracks>
94 std::vector<WithWeight<CDCTrack*>> weightedTracks;
96 if (&track == &track2)
continue;
97 if (track2.size() < 3)
continue;
100 if (std::isnan(fitProb))
continue;
102 weightedTracks.emplace_back(&track2, fitProb);
105 auto bestMatch = std::max_element(weightedTracks.begin(), weightedTracks.end(), LessWeight());
106 if (bestMatch == weightedTracks.end())
return {
nullptr, 0};
107 else return *bestMatch;
122 recoHit3D.getRecoPos2D());
123 if (not isValid(fbInfo))
continue;
129 recoHit3D.getRecoPos2D());
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());
143 combinedWireHits.push_back(&(hit.getWireHit()));
146 combinedWireHits.push_back(&(hit.getWireHit()));
153 std::sort(combinedWireHits.begin(), combinedWireHits.end());
154 erase_unique(combinedWireHits);
161 commonTrajectory2D = fitter.fit(combinedWireHits);
163 commonTrajectory2D = fitter.fit(combinedWireHits);
165 commonTrajectory2D = fitter.fit(combinedWireHits);
167 commonTrajectory2D = fitter.fit(combinedWireHits);
169 commonTrajectory2D = fitter.fit(combinedWireHits);
173 if (combinedWireHits.size() <= std::max(track1.size(), track2.size())
174 or combinedWireHits.size() < 15) {
182 std::vector<const CDCWireHit*>& wireHits,
185 auto farFromTrajectory = [&trajectory2D, &factor](
const CDCWireHit * wireHit) {
186 ROOT::Math::XYVector pos2D = wireHit->getRefPos2D();
187 double driftLength = wireHit->getRefDriftLength();
188 double dist = std::fabs(trajectory2D.
getDist2D(pos2D)) - driftLength;
189 return std::fabs(dist) > driftLength * factor;
191 erase_remove_if(wireHits, farFromTrajectory);
196 const std::vector<const CDCWireHit*>& allAxialWireHits)
198 if (&track1 == &track2)
return;
200 CDCTrajectory2D trajectory2D = track1.getStartTrajectory3D().getTrajectory2D();
203 track1.push_back(std::move(recoHit3D));
214 const auto& tmp = recoHit3D.getRefPos2D();
215 recoHit3D.setRecoPos3D({tmp.X(), tmp.Y(), 0});
216 recoHit3D.setRLInfo(ERightLeft::c_Unknown);
223 recoHit3D.getWireHit()->setTakenFlag(
false);
The Module parameter list class.
void apply(std::vector< TrackingUtilities::CDCTrack > &axialTracks, const std::vector< const TrackingUtilities::CDCWireHit * > &axialWireHits) final
Merge tracks together. Allows for axial hits to be added as it may see fit.
static void removeStrangeHits(double factor, std::vector< const TrackingUtilities::CDCWireHit * > &wireHits, TrackingUtilities::CDCTrajectory2D &trajectory)
Remove all hits that are further than factor * driftlength away from the trajectory.
void doTracksMerging(std::vector< TrackingUtilities::CDCTrack > &axialTracks, const std::vector< const TrackingUtilities::CDCWireHit * > &allAxialWireHits)
The track finding often finds two curling tracks, originating from the same particle.
std::string getDescription() final
Short description of the findlet.
static void mergeTracks(TrackingUtilities::CDCTrack &track1, TrackingUtilities::CDCTrack &track2, const std::vector< const TrackingUtilities::CDCWireHit * > &allAxialWireHits)
Function to merge two track candidates.
static double doTracksFitTogether(TrackingUtilities::CDCTrack &track1, TrackingUtilities::CDCTrack &track2)
Fits the hit content of both tracks in a common fit repeated with an annealing schedule removing far ...
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) final
Expose the parameters to a module.
static TrackingUtilities::WithWeight< TrackingUtilities::MayBePtr< TrackingUtilities::CDCTrack > > calculateBestTrackToMerge(TrackingUtilities::CDCTrack &track, ACDCTracks &tracks)
Searches for the best candidate to merge this track to.
double m_param_minFitProb
Parameter : Minimal fit probability of the common fit of two tracks to be eligible for merging.
Class implementing the fitter using Karimakis method.
static const CDCKarimakiFitter & getNoDriftVarianceFitter()
Static getter for a general fitter that does not use the drift length variances.
Class representing a three dimensional reconstructed hit.
static CDCRecoHit3D reconstruct(const CDCRecoHit2D &recoHit2D, const CDCTrajectory2D &trajectory2D)
Reconstructs the three dimensional hit from the two dimensional and the two dimensional trajectory.
Class representing a sequence of three dimensional reconstructed hits.
Particle trajectory as it is seen in xy projection represented as a circle.
double getPValue() const
Getter for p-value.
double getDist2D(const ROOT::Math::XYVector &point) const
Calculates the distance from the point to the trajectory as seen from the xy projection.
Particle full three dimensional trajectory.
bool isCurler(double factor=1) const
Checks if the trajectory leaves the outer radius of the CDC times the given tolerance factor.
ROOT::Math::XYZVector getFlightDirection3DAtSupport() const
Get the unit momentum at the start point of the trajectory.
Class representing a hit wire in the central drift chamber.
A mixin class to attach a weight to an object.
Weight getWeight() const
Getter for the weight.
void addParameter(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
Abstract base class for different kinds of events.
static void normalizeTrack(TrackingUtilities::CDCTrack &track)
Refit and resort the track. Unmask all hits.
static void deleteShortTracks(std::vector< TrackingUtilities::CDCTrack > &axialTracks, double minimal_size=5)
Remove tracks that are shorter than the given number of hits.
static void deleteTracksWithLowFitProbability(std::vector< TrackingUtilities::CDCTrack > &axialTracks, double minimal_probability_for_good_fit=0.4)
Check an (improper) p-values of the tracks. If they are below the given value, delete the track from ...
static void removeHitsAfterSuperLayerBreak(TrackingUtilities::CDCTrack &track)
Searches for a break in the super layer chain and remove all hits that come after that.
static std::vector< TrackingUtilities::CDCRecoHit3D > splitBack2BackTrack(TrackingUtilities::CDCTrack &track)
Tries to split back-to-back tracks into two different tracks.
static bool postprocessTrack(TrackingUtilities::CDCTrack &track, const std::vector< const TrackingUtilities::CDCWireHit * > &allAxialWireHits)
Perform all track postprocessing - return whether the track is considered good after the postprocessi...