Belle II Software development
AxialTrackUtil Struct Reference

Utility structure gathering heuristic functions used during the axial track finding. More...

#include <AxialTrackUtil.h>

Static Public Member Functions

static void addCandidateFromHits (const std::vector< const TrackingUtilities::CDCWireHit * > &foundAxialWireHits, const std::vector< const TrackingUtilities::CDCWireHit * > &allAxialWireHits, std::vector< TrackingUtilities::CDCTrack > &axialTracks, bool withPostprocessing=true)
 Create CDCTrack using CDCWireHit hits and store it in the list. Then call the postprocessing on it.
 
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 postprocessing.
 
static void normalizeTrack (TrackingUtilities::CDCTrack &track)
 Refit and resort the track. Unmask all hits.
 
static void updateRecoHit3D (const TrackingUtilities::CDCTrajectory2D &trajectory2D, TrackingUtilities::CDCRecoHit3D &hit)
 update given CDCRecoHit3D with given trajectory
 
static void deleteHitsFarAwayFromTrajectory (TrackingUtilities::CDCTrack &track, double maximumDistance=0.2)
 Postprocessing: Delete axial hits that do not "match" to the given track.
 
static void assignNewHitsToTrack (TrackingUtilities::CDCTrack &track, const std::vector< const TrackingUtilities::CDCWireHit * > &allAxialWireHits, double minimalDistance=0.2)
 Assign new hits to the track basing on the distance from the hit to the track.
 
static std::vector< TrackingUtilities::CDCRecoHit3DsplitBack2BackTrack (TrackingUtilities::CDCTrack &track)
 Tries to split back-to-back tracks into two different tracks.
 
static bool isBack2BackTrack (TrackingUtilities::CDCTrack &track)
 Checks whether the track has hits on both arms as seen from the origin.
 
static TrackingUtilities::ESign getMajorArmSign (const TrackingUtilities::CDCTrack &track, const TrackingUtilities::Vector2D &center)
 Calculate whether the majority of hits is to the right or to the left relative to the line from origin to given center.
 
static int getArmSignVote (const TrackingUtilities::CDCTrack &track, const TrackingUtilities::Vector2D &center)
 Calculate the sum of right and left votes for the hits relative to the center.
 
static void removeHitsAfterSuperLayerBreak (TrackingUtilities::CDCTrack &track)
 Searches for a break in the super layer chain and remove all hits that come after that.
 
static TrackingUtilities::ESign getArmSign (const TrackingUtilities::CDCRecoHit3D &hit, const TrackingUtilities::Vector2D &center)
 Calculate whether the hits is to the right or to the left relative to the line from origin to the given center.
 
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 the list.
 
static void deleteShortTracks (std::vector< TrackingUtilities::CDCTrack > &axialTracks, double minimal_size=5)
 Remove tracks that are shorter than the given number of hits.
 

Static Private Member Functions

static bool checkTrackQuality (const TrackingUtilities::CDCTrack &track)
 Check track quality – currently based on number of hits only.
 
static std::vector< CDC::ISuperLayergetSLayerHoles (const std::array< int, CDC::ISuperLayerUtil::c_N > &nHitsBySLayer)
 Helper function getting the empty axial!
 
static CDC::ISuperLayer getFirstOccupiedISuperLayer (const std::array< int, CDC::ISuperLayerUtil::c_N > &nHitsBySLayer)
 Helper function to extract the first filled entry in the array of super layers ( = the start superlayer of the track).
 
static CDC::ISuperLayer getLastOccupiedISuperLayer (const std::array< int, CDC::ISuperLayerUtil::c_N > &nHitsBySLayer)
 Helper function to extract the last filled entry in the array of super layers ( = the final superlayer of the track).
 

Detailed Description

Utility structure gathering heuristic functions used during the axial track finding.

Definition at line 34 of file AxialTrackUtil.h.

Member Function Documentation

◆ addCandidateFromHits()

void addCandidateFromHits ( const std::vector< const TrackingUtilities::CDCWireHit * > & foundAxialWireHits,
const std::vector< const TrackingUtilities::CDCWireHit * > & allAxialWireHits,
std::vector< TrackingUtilities::CDCTrack > & axialTracks,
bool withPostprocessing = true )
static

Create CDCTrack using CDCWireHit hits and store it in the list. Then call the postprocessing on it.

Mark hits as taken and add the new track to the track list

Masked bad hits

Definition at line 26 of file AxialTrackUtil.cc.

30{
31 if (foundAxialWireHits.empty()) return;
32
33 // New track
34 CDCTrack track;
35
36 // Fit trajectory
37 const CDCRiemannFitter& fitter = CDCRiemannFitter::getFitter();
38 CDCTrajectory2D trajectory2D = fitter.fit(foundAxialWireHits);
39 track.setStartTrajectory3D(CDCTrajectory3D(trajectory2D, CDCTrajectorySZ::basicAssumption()));
40
41 // Reconstruct and add hits
42 for (const CDCWireHit* wireHit : foundAxialWireHits) {
43 AutomatonCell& automatonCell = wireHit->getAutomatonCell();
44 if (automatonCell.hasTakenFlag()) continue;
45 CDCRecoHit3D recoHit3D = CDCRecoHit3D::reconstructNearest(wireHit, trajectory2D);
46 track.push_back(std::move(recoHit3D));
47
48 automatonCell.setTakenFlag(true);
49 }
50 track.sortByArcLength2D();
51
52 // Change everything again in the postprocessing, if desired
53 bool success = withPostprocessing ? postprocessTrack(track, allAxialWireHits) : true;
54 if (success) {
56 for (const CDCRecoHit3D& recoHit3D : track) {
57 recoHit3D.getWireHit().getAutomatonCell().setTakenFlag(true);
58 }
59 axialTracks.emplace_back(std::move(track));
60 } else {
62 for (const CDCRecoHit3D& recoHit3D : track) {
63 recoHit3D.getWireHit().getAutomatonCell().setMaskedFlag(true);
64 recoHit3D.getWireHit().getAutomatonCell().setTakenFlag(false);
65 }
66 }
67}
static const CDCRiemannFitter & getFitter()
Static getter for a general Riemann fitter.
void setTakenFlag(bool setTo=true)
Sets the taken flag to the given value. Default value true.
void setMaskedFlag(bool setTo=true)
Sets the masked flag to the given value. Default value true.
bool hasTakenFlag() const
Gets the current state of the taken marker flag.
const CDCWireHit & getWireHit() const
Getter for the wire hit.
static CDCRecoHit3D reconstructNearest(const CDCWireHit *axialWireHit, const CDCTrajectory2D &trajectory2D)
Reconstruct a three dimensional hit from a wire hit (as in reconstruct(rlWireHit, trajectory2D)),...
static CDCTrajectorySZ basicAssumption()
Constructs a basic assumption, what the z0 start position and the sz slope are, including some broad ...
AutomatonCell & getAutomatonCell() const
Mutable getter for the automaton cell.
Definition CDCWireHit.h:289
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...

◆ assignNewHitsToTrack()

void assignNewHitsToTrack ( TrackingUtilities::CDCTrack & track,
const std::vector< const TrackingUtilities::CDCWireHit * > & allAxialWireHits,
double minimalDistance = 0.2 )
static

Assign new hits to the track basing on the distance from the hit to the track.

Definition at line 177 of file AxialTrackUtil.cc.

180{
181 if (track.size() < 10) return;
182
183 const CDCTrajectory2D& trackTrajectory2D = track.getStartTrajectory3D().getTrajectory2D();
184
185 for (const CDCWireHit* wireHit : allAxialWireHits) {
186 if (wireHit->getAutomatonCell().hasTakenFlag()) continue;
187
188 CDCRecoHit3D recoHit3D = CDCRecoHit3D::reconstructNearest(wireHit, trackTrajectory2D);
189 const Vector2D& recoPos2D = recoHit3D.getRecoPos2D();
190
191 if (fabs(trackTrajectory2D.getDist2D(recoPos2D)) < minimalDistance) {
192 track.push_back(std::move(recoHit3D));
194 }
195 }
196}
const Vector2D & getRecoPos2D() const
Getter for the 2d position of the hit.
double getDist2D(const Vector2D &point) const
Calculates the distance from the point to the trajectory as seen from the xy projection.

◆ checkTrackQuality()

bool checkTrackQuality ( const TrackingUtilities::CDCTrack & track)
staticprivate

Check track quality – currently based on number of hits only.

Definition at line 90 of file AxialTrackUtil.cc.

91{
92 return not(track.size() < 5);
93}

◆ deleteHitsFarAwayFromTrajectory()

void deleteHitsFarAwayFromTrajectory ( TrackingUtilities::CDCTrack & track,
double maximumDistance = 0.2 )
static

Postprocessing: Delete axial hits that do not "match" to the given track.

This is done by checking the distance between the hits and the trajectory, which should not exceed the maximum_distance parameter.

As this function used the masked flag, all hits should have their masked flag set to false before calling this function.

Definition at line 142 of file AxialTrackUtil.cc.

143{
144 const CDCTrajectory2D& trajectory2D = track.getStartTrajectory3D().getTrajectory2D();
145 auto farFromTrajectory = [&trajectory2D, &maximumDistance](CDCRecoHit3D & recoHit3D) {
146 Vector2D refPos2D = recoHit3D.getRefPos2D();
147 double distance = trajectory2D.getDist2D(refPos2D) - recoHit3D.getSignedRecoDriftLength();
148 if (std::fabs(distance) > maximumDistance) {
149 recoHit3D.getWireHit().getAutomatonCell().setTakenFlag(false);
150 // This must be here as the deleted hits must not participate in the hough search again.
151 recoHit3D.getWireHit().getAutomatonCell().setMaskedFlag(true);
152 return true;
153 }
154 return false;
155 };
156 erase_remove_if(track, farFromTrajectory);
157}

◆ deleteShortTracks()

void deleteShortTracks ( std::vector< TrackingUtilities::CDCTrack > & axialTracks,
double minimal_size = 5 )
static

Remove tracks that are shorter than the given number of hits.

Definition at line 198 of file AxialTrackUtil.cc.

199{
200 const auto isShort = [&](const CDCTrack & track) {
201 if (track.size() < minimal_size) {
202 // Release hits
203 track.forwardTakenFlag(false);
204 return true;
205 }
206 return false;
207 };
208 erase_remove_if(axialTracks, isShort);
209}

◆ deleteTracksWithLowFitProbability()

void deleteTracksWithLowFitProbability ( std::vector< TrackingUtilities::CDCTrack > & axialTracks,
double minimal_probability_for_good_fit = 0.4 )
static

Check an (improper) p-values of the tracks. If they are below the given value, delete the track from the list.

Definition at line 159 of file AxialTrackUtil.cc.

161{
162 const CDCKarimakiFitter& trackFitter = CDCKarimakiFitter::getNoDriftVarianceFitter();
163 const auto lowPValue = [&](const CDCTrack & track) {
164 CDCTrajectory2D fittedTrajectory = trackFitter.fit(track);
165 // Keep good fits - p-value is not really a probability,
166 // but what can you do if the original author did not mind...
167 if (not(fittedTrajectory.getPValue() >= minimal_probability_for_good_fit)) {
168 // Release hits
169 track.forwardTakenFlag(false);
170 return true;
171 }
172 return false;
173 };
174 erase_remove_if(axialTracks, lowPValue);
175}
TrackingUtilities::CDCTrajectory2D fit(const CDCObservations2D &observations2D) const
Fits a collection of observation drift circles.
static const CDCKarimakiFitter & getNoDriftVarianceFitter()
Static getter for a general fitter that does not use the drift length variances.
double getPValue() const
Getter for p-value.

◆ getArmSign()

ESign getArmSign ( const TrackingUtilities::CDCRecoHit3D & hit,
const TrackingUtilities::Vector2D & center )
static

Calculate whether the hits is to the right or to the left relative to the line from origin to the given center.

Return values
ESign::c_Righthit is on the right
ESign::c_Lefthit is on the left
ESign::c_Zerorare boarderline case
ESign::c_Invalidgiven hit has a nan value

Definition at line 283 of file AxialTrackUtil.cc.

284{
285 return sign(center.isRightOrLeftOf(hit.getRecoPos2D()));
286}

◆ getArmSignVote()

int getArmSignVote ( const TrackingUtilities::CDCTrack & track,
const TrackingUtilities::Vector2D & center )
static

Calculate the sum of right and left votes for the hits relative to the center.

Positive indicates a majority of right by that amount. Negative indicates a left majority.

Definition at line 258 of file AxialTrackUtil.cc.

259{
260 int votePos = 0;
261 int voteNeg = 0;
262
263 if (center.hasNAN()) {
264 B2WARNING("Trajectory is not set or wrong!");
265 return 0;
266 }
267
268 for (const CDCRecoHit3D& hit : track) {
269 ESign armSign = getArmSign(hit, center);
270
271 if (armSign == ESign::c_Plus) {
272 ++votePos;
273 } else if (armSign == ESign::c_Minus) {
274 ++voteNeg;
275 } else {
276 B2ERROR("Strange behaviour of getArmSignVote");
277 }
278 }
279 int armSignVote = votePos - voteNeg;
280 return armSignVote;
281}
ESign
Enumeration for the distinct sign values of floating point variables.
Definition ESign.h:27
static TrackingUtilities::ESign getArmSign(const TrackingUtilities::CDCRecoHit3D &hit, const TrackingUtilities::Vector2D &center)
Calculate whether the hits is to the right or to the left relative to the line from origin to the giv...

◆ getFirstOccupiedISuperLayer()

ISuperLayer getFirstOccupiedISuperLayer ( const std::array< int, CDC::ISuperLayerUtil::c_N > & nHitsBySLayer)
staticprivate

Helper function to extract the first filled entry in the array of super layers ( = the start superlayer of the track).

Definition at line 359 of file AxialTrackUtil.cc.

360{
361 for (ISuperLayer iSLayer = 0; iSLayer < ISuperLayerUtil::c_N; ++iSLayer) {
362 if (nHitsBySLayer[iSLayer] > 0) return iSLayer;
363 }
365}
signed short ISuperLayer
The type of the layer and superlayer ids.
Definition ISuperLayer.h:24
static const ISuperLayer c_Invalid
Constant making an invalid superlayer id.
Definition ISuperLayer.h:65
static const ISuperLayer c_N
Constant representing the total number of cdc superlayers.
Definition ISuperLayer.h:56

◆ getLastOccupiedISuperLayer()

ISuperLayer getLastOccupiedISuperLayer ( const std::array< int, CDC::ISuperLayerUtil::c_N > & nHitsBySLayer)
staticprivate

Helper function to extract the last filled entry in the array of super layers ( = the final superlayer of the track).

Definition at line 367 of file AxialTrackUtil.cc.

368{
369 for (ISuperLayer iSLayer = ISuperLayerUtil::c_N - 1; iSLayer >= 0; --iSLayer) {
370 if (nHitsBySLayer[iSLayer] > 0) return iSLayer;
371 }
373}

◆ getMajorArmSign()

ESign getMajorArmSign ( const TrackingUtilities::CDCTrack & track,
const TrackingUtilities::Vector2D & center )
static

Calculate whether the majority of hits is to the right or to the left relative to the line from origin to given center.

Return values
ESign::c_Rightmost hits are on the right
ESign::c_Leftmost hits are on the left
ESign::c_Zerono majority
ESign::c_Invalidgiven center has a nan value

Definition at line 248 of file AxialTrackUtil.cc.

249{
250 int armSignVote = getArmSignVote(track, center);
251 if (armSignVote > 0) {
252 return ESign::c_Plus;
253 } else {
254 return ESign::c_Minus;
255 }
256}
static int getArmSignVote(const TrackingUtilities::CDCTrack &track, const TrackingUtilities::Vector2D &center)
Calculate the sum of right and left votes for the hits relative to the center.

◆ getSLayerHoles()

std::vector< ISuperLayer > getSLayerHoles ( const std::array< int, CDC::ISuperLayerUtil::c_N > & nHitsBySLayer)
staticprivate

Helper function getting the empty axial!

super layers that appear in the chain of super layers that is supposed to be occupied

Definition at line 339 of file AxialTrackUtil.cc.

340{
341 std::vector<ISuperLayer> sLayerHoles;
342
343 // Find the start end end point.
344 ISuperLayer firstSlayer = getFirstOccupiedISuperLayer(nHitsBySLayer);
345 ISuperLayer lastSlayer = getLastOccupiedISuperLayer(nHitsBySLayer);
346
347 if (ISuperLayerUtil::isInvalid(firstSlayer) or ISuperLayerUtil::isInvalid(lastSlayer)) {
348 return sLayerHoles;
349 }
350
351 for (ISuperLayer iSLayer = firstSlayer; iSLayer <= lastSlayer; iSLayer += 2) {
352 if (nHitsBySLayer[iSLayer] == 0) {
353 sLayerHoles.push_back(iSLayer);
354 }
355 }
356 return sLayerHoles;
357}
static bool isInvalid(ISuperLayer iSuperLayer)
Indicates if the given number corresponds to a true cdc superlayer - excludes the logic ids for inner...
static CDC::ISuperLayer getLastOccupiedISuperLayer(const std::array< int, CDC::ISuperLayerUtil::c_N > &nHitsBySLayer)
Helper function to extract the last filled entry in the array of super layers ( = the final superlaye...
static CDC::ISuperLayer getFirstOccupiedISuperLayer(const std::array< int, CDC::ISuperLayerUtil::c_N > &nHitsBySLayer)
Helper function to extract the first filled entry in the array of super layers ( = the start superlay...

◆ isBack2BackTrack()

bool isBack2BackTrack ( TrackingUtilities::CDCTrack & track)
static

Checks whether the track has hits on both arms as seen from the origin.

Definition at line 238 of file AxialTrackUtil.cc.

239{
240 Vector2D center = track.getStartTrajectory3D().getGlobalCenter();
241 int armSignVote = getArmSignVote(track, center);
242 if (std::abs(armSignVote) < int(track.size()) and std::fabs(center.cylindricalR()) > 60.) {
243 return true;
244 }
245 return false;
246}
double cylindricalR() const
Gives the cylindrical radius of the vector. Same as norm()
Definition Vector2D.h:588

◆ normalizeTrack()

void normalizeTrack ( TrackingUtilities::CDCTrack & track)
static

Refit and resort the track. Unmask all hits.

Definition at line 95 of file AxialTrackUtil.cc.

96{
97 // Set the start point of the trajectory to the first hit
98 if (track.size() < 5) return;
99
100 CDCObservations2D observations2D(EFitPos::c_RecoPos);
101 for (const CDCRecoHit3D& item : track) {
102 observations2D.append(item);
103 }
104
105 const CDCRiemannFitter& fitter = CDCRiemannFitter::getFitter();
106 CDCTrajectory2D trackTrajectory2D = fitter.fit(observations2D);
107 Vector2D center = trackTrajectory2D.getGlobalCenter();
108
109 // Arm used as a proxy for the charge of the track
110 // Correct if the track originates close to the origin
111 ESign expectedCharge = AxialTrackUtil::getMajorArmSign(track, center);
112
113 if (trackTrajectory2D.getChargeSign() != expectedCharge) trackTrajectory2D.reverse();
114
115 trackTrajectory2D.setLocalOrigin(trackTrajectory2D.getGlobalPerigee());
116 for (CDCRecoHit3D& recoHit : track) {
117 AxialTrackUtil::updateRecoHit3D(trackTrajectory2D, recoHit);
118 }
119
120 track.sortByArcLength2D();
121
122 CDCTrajectory3D trajectory3D(trackTrajectory2D, CDCTrajectorySZ::basicAssumption());
123 track.setStartTrajectory3D(trajectory3D);
124
125 Vector3D backPosition = track.back().getRecoPos3D();
126 trajectory3D.setLocalOrigin(backPosition);
127 track.setEndTrajectory3D(trajectory3D);
128}
void reverse()
Reverses the trajectory in place.
double setLocalOrigin(const Vector2D &localOrigin)
Setter for the origin of the local coordinate system.
ESign getChargeSign() const
Gets the charge sign of the trajectory.
Vector2D getGlobalCenter() const
Getter for the center of the trajectory in global coordinates.
Vector2D getGlobalPerigee() const
Getter for the closest approach on the trajectory to the global origin.
HepGeom::Vector3D< double > Vector3D
3D Vector
Definition Cell.h:34
static void updateRecoHit3D(const TrackingUtilities::CDCTrajectory2D &trajectory2D, TrackingUtilities::CDCRecoHit3D &hit)
update given CDCRecoHit3D with given trajectory
static TrackingUtilities::ESign getMajorArmSign(const TrackingUtilities::CDCTrack &track, const TrackingUtilities::Vector2D &center)
Calculate whether the majority of hits is to the right or to the left relative to the line from origi...

◆ postprocessTrack()

bool postprocessTrack ( TrackingUtilities::CDCTrack & track,
const std::vector< const TrackingUtilities::CDCWireHit * > & allAxialWireHits )
static

Perform all track postprocessing - return whether the track is considered good after the postprocessing.

Definition at line 69 of file AxialTrackUtil.cc.

70{
72
75 if (not checkTrackQuality(track)) {
76 return false;
77 }
78
79 AxialTrackUtil::assignNewHitsToTrack(track, allAxialWireHits);
81
84 if (not checkTrackQuality(track)) {
85 return false;
86 }
87 return true;
88}
static void normalizeTrack(TrackingUtilities::CDCTrack &track)
Refit and resort the track. Unmask all hits.
static std::vector< TrackingUtilities::CDCRecoHit3D > splitBack2BackTrack(TrackingUtilities::CDCTrack &track)
Tries to split back-to-back tracks into two different tracks.
static void assignNewHitsToTrack(TrackingUtilities::CDCTrack &track, const std::vector< const TrackingUtilities::CDCWireHit * > &allAxialWireHits, double minimalDistance=0.2)
Assign new hits to the track basing on the distance from the hit to the track.
static void deleteHitsFarAwayFromTrajectory(TrackingUtilities::CDCTrack &track, double maximumDistance=0.2)
Postprocessing: Delete axial hits that do not "match" to the given track.
static bool checkTrackQuality(const TrackingUtilities::CDCTrack &track)
Check track quality – currently based on number of hits only.

◆ removeHitsAfterSuperLayerBreak()

void removeHitsAfterSuperLayerBreak ( TrackingUtilities::CDCTrack & track)
static

Searches for a break in the super layer chain and remove all hits that come after that.

Definition at line 288 of file AxialTrackUtil.cc.

289{
290 double apogeeArcLength = fabs(track.getStartTrajectory3D().getGlobalCircle().perimeter()) / 2.;
291
292 std::array<int, ISuperLayerUtil::c_N> nForwardArmHitsBySLayer = {0};
293 std::array<int, ISuperLayerUtil::c_N> nBackwardArmHitsBySLayer = {0};
294
295 // Count the number of hits in the outgoing and ingoing arm per superlayer.
296 for (const CDCRecoHit3D& hit : track) {
297 if ((hit.getArcLength2D() <= apogeeArcLength) and (hit.getArcLength2D() > 0)) {
298 nForwardArmHitsBySLayer[hit.getISuperLayer()]++;
299 } else {
300 nBackwardArmHitsBySLayer[hit.getISuperLayer()]++;
301 }
302 }
303
304 std::vector<ISuperLayer> forwardSLayerHoles = getSLayerHoles(nForwardArmHitsBySLayer);
305 std::vector<ISuperLayer> backwardSLayerHoles = getSLayerHoles(nBackwardArmHitsBySLayer);
306
307 // No missing layers
308 if (forwardSLayerHoles.empty() and backwardSLayerHoles.empty()) return;
309
310 // We only check for holes in the forward arm for now
311 // We do not use emptyEndingSLayers here, as it would leave to a severy efficiency drop.
312 assert(std::is_sorted(forwardSLayerHoles.begin(), forwardSLayerHoles.end()));
313 if (forwardSLayerHoles.empty()) return;
314
315 const ISuperLayer breakSLayer = forwardSLayerHoles.front();
316
317 auto isInBackwardArm = [apogeeArcLength](const CDCRecoHit3D & recoHit3D) {
318 if ((recoHit3D.getArcLength2D() >= apogeeArcLength) or (recoHit3D.getArcLength2D() < 0)) {
319 recoHit3D.getWireHit().getAutomatonCell().unsetTakenFlag();
320 return true;
321 }
322 return false;
323 };
324
325 erase_remove_if(track, isInBackwardArm);
326
327 auto isAfterSLayerBreak = [breakSLayer](const CDCRecoHit3D & recoHit3D) {
328 recoHit3D.getWireHit().getAutomatonCell().unsetTakenFlag();
329 if (recoHit3D.getISuperLayer() >= breakSLayer) {
330 recoHit3D.getWireHit().getAutomatonCell().unsetTakenFlag();
331 return true;
332 }
333 return false;
334 };
335
336 erase_remove_if(track, isAfterSLayerBreak);
337}
static std::vector< CDC::ISuperLayer > getSLayerHoles(const std::array< int, CDC::ISuperLayerUtil::c_N > &nHitsBySLayer)
Helper function getting the empty axial!

◆ splitBack2BackTrack()

std::vector< CDCRecoHit3D > splitBack2BackTrack ( TrackingUtilities::CDCTrack & track)
static

Tries to split back-to-back tracks into two different tracks.

Definition at line 211 of file AxialTrackUtil.cc.

212{
213 std::vector<CDCRecoHit3D> removedHits;
214
215 if (track.size() < 5) return removedHits;
216 if (not isBack2BackTrack(track)) return removedHits;
217
218 Vector2D center = track.getStartTrajectory3D().getGlobalCenter();
219 ESign majorArmSign = getMajorArmSign(track, center);
220
221 auto isOnMajorArm = [&center, &majorArmSign](const CDCRecoHit3D & hit) {
222 return getArmSign(hit, center) == majorArmSign;
223 };
224
225 auto itFirstMinorArmHit = std::stable_partition(track.begin(),
226 track.end(),
227 isOnMajorArm);
228
229 for (const CDCRecoHit3D& recoHit3D : asRange(itFirstMinorArmHit, track.end())) {
230 recoHit3D.getWireHit().getAutomatonCell().setTakenFlag(false);
231 removedHits.push_back(recoHit3D);
232 }
233 track.erase(itFirstMinorArmHit, track.end());
234
235 return removedHits;
236}
static bool isBack2BackTrack(TrackingUtilities::CDCTrack &track)
Checks whether the track has hits on both arms as seen from the origin.

◆ updateRecoHit3D()

void updateRecoHit3D ( const TrackingUtilities::CDCTrajectory2D & trajectory2D,
TrackingUtilities::CDCRecoHit3D & hit )
static

update given CDCRecoHit3D with given trajectory

Definition at line 130 of file AxialTrackUtil.cc.

131{
132 hit = CDCRecoHit3D::reconstructNearest(&hit.getWireHit(), trajectory2D);
133
134 // Recalculate the perpS of the hits
135 double arcLength2D = hit.getArcLength2D();
136 if (arcLength2D < -trajectory2D.getArcLength2DPeriod() / 4.0) {
137 arcLength2D += trajectory2D.getArcLength2DPeriod();
138 }
139 hit.setArcLength2D(arcLength2D);
140}

The documentation for this struct was generated from the following files: