8#include <tracking/trackFindingCDC/processing/TrackQualityTools.h>
9#include <tracking/trackingUtilities/eventdata/tracks/CDCTrack.h>
10#include <tracking/trackingUtilities/eventdata/hits/CDCWireHit.h>
11#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectory3D.h>
12#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectory2D.h>
14#include <cdc/topology/CDCWire.h>
15#include <tracking/trackingUtilities/utilities/ReversedRange.h>
17#include <Math/VectorUtil.h>
21using namespace TrackFindingCDC;
22using namespace TrackingUtilities;
28 if (recoHit.getStereoKind() == EStereoKind::c_Axial) {
31 recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
43 if (arcLength2DOfApogee < 0) {
44 arcLength2DOfApogee += 2 * TMath::Pi() * radius;
51 double currentArcLength2D = recoHit.getArcLength2D();
52 if (currentArcLength2D < 0) B2INFO(
"Below 0");
53 if (currentArcLength2D > arcLength2DOfApogee) {
54 splittedCDCTrack.push_back(recoHit);
59 if (splittedCDCTrack.size() > 0) {
60 tracks.push_back(splittedCDCTrack);
66 if (track.empty())
return;
71 const ROOT::Math::XYZVector startPosition(0, 0, 0);
79 unsigned int numberOfPositiveHits = 0;
81 const double currentArcLength = trajectory2D.
calcArcLength2D(recoHit.getRecoPos2D());
82 if (currentArcLength > 0) {
83 numberOfPositiveHits++;
86 const bool reverseTrajectory = 2 * numberOfPositiveHits < track.size();
88 if (reverseTrajectory) {
95 ROOT::Math::XYVector recoPos2D = VectorUtil::getXYVector(recoHit.getRLWireHit().reconstruct3D(trajectory2D));
98 if (arcLength2D < 0) {
99 arcLength2D += arcLength2DPeriod;
101 recoHit.setArcLength2D(arcLength2D);
102 recoHit.getWireHit().getAutomatonCell().unsetAssignedFlag();
103 recoHit.getWireHit().getAutomatonCell().setTakenFlag();
107 track.sortByArcLength2D();
110 ROOT::Math::XYZVector frontPosition = track.front().getRLWireHit().reconstruct3D(trajectory2D);
111 double arcLengthOffset = trajectory3D.
setLocalOrigin(frontPosition);
112 track.setStartTrajectory3D(trajectory3D);
114 recoHit.shiftArcLength2D(-arcLengthOffset);
118 ROOT::Math::XYZVector backPosition = track.back().getRLWireHit().reconstruct3D(trajectory2D);
119 double backArcLength2D = trajectory3D.
setLocalOrigin(backPosition);
120 if (backArcLength2D < 0) {
123 track.setEndTrajectory3D(trajectory3D);
129 const CDCTrajectory2D& trajectory2D = track.getStartTrajectory3D().getTrajectory2D();
133 if (trajectory2D.
isCurler(outerCylindricalRFactor)) {
137 const ROOT::Math::XYVector& outerExitWithFactor = trajectory2D.
getOuterExit(outerCylindricalRFactor);
139 double arcLength2DOfExitWithFactor = trajectory2D.
calcArcLength2D(outerExitWithFactor);
140 if (arcLength2DOfExitWithFactor < 0) {
141 arcLength2DOfExitWithFactor += 2 * TMath::Pi() * radius;
143 bool removeAfterThis =
false;
146 if (removeAfterThis) {
147 recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
151 double currentArcLength2D = recoHit.getArcLength2D();
152 if (currentArcLength2D < 0) {
153 currentArcLength2D += 2 * TMath::Pi() * radius;
156 if (currentArcLength2D > arcLength2DOfExitWithFactor) {
157 recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
158 removeAfterThis =
true;
166 ROOT::Math::XYVector lastWirePosition;
168 std::vector<std::vector<const CDCRecoHit3D*>> trackletList;
169 trackletList.reserve(3);
171 std::vector<const CDCRecoHit3D*>* currentTracklet =
nullptr;
174 if (currentTracklet ==
nullptr) {
175 trackletList.emplace_back();
176 currentTracklet = &(trackletList.back());
179 const ILayer currentLayer = recoHit.getWire().getICLayer();
180 const ROOT::Math::XYVector& currentPosition = recoHit.getRecoPos2D();
181 if (lastLayer != -1) {
182 const ILayer delta = currentLayer - lastLayer;
183 const double distance = (currentPosition - lastWirePosition).
R();
184 if (abs(delta) > 4 or distance > 50) {
185 trackletList.emplace_back();
186 currentTracklet = &(trackletList.back());
190 lastWirePosition = currentPosition;
191 lastLayer = currentLayer;
193 currentTracklet->push_back(&recoHit);
196 if (trackletList.size() > 1) {
197 for (
const std::vector<const CDCRecoHit3D*>& tracklet : trackletList) {
198 if (tracklet.size() < 5) {
200 recoHit->getWireHit().getAutomatonCell().setAssignedFlag();
213 if (std::isnan(radius)) {
217 std::vector<std::vector<const CDCRecoHit3D*>> trackletList;
219 double lastArcLength2D = NAN;
221 std::vector<const CDCRecoHit3D*>* currentTracklet =
nullptr;
224 if (currentTracklet ==
nullptr) {
225 trackletList.emplace_back();
226 currentTracklet = &(trackletList.back());
229 const double currentArcLength2D = recoHit.getArcLength2D();
230 if (not std::isnan(lastArcLength2D)) {
231 const double delta = (currentArcLength2D - lastArcLength2D);
232 if (std::fabs(delta) > m_maximumArcLength2DDistance) {
233 trackletList.emplace_back();
234 currentTracklet = &(trackletList.back());
238 lastArcLength2D = currentArcLength2D;
240 currentTracklet->push_back(&recoHit);
243 if (trackletList.size() > 1) {
245 while (trackletList.size() > 0) {
246 if (trackletList.back().size() > 4) {
250 for (
const CDCRecoHit3D* recoHit : trackletList.back()) {
251 recoHit->getWireHit().getAutomatonCell().setAssignedFlag();
254 trackletList.pop_back();
257 std::reverse(trackletList.begin(), trackletList.end());
259 while (trackletList.size() > 0) {
260 if (trackletList.back().size() > 4) {
264 for (
const CDCRecoHit3D* recoHit : trackletList.back()) {
265 recoHit->getWireHit().getAutomatonCell().setAssignedFlag();
268 trackletList.pop_back();
275 const bool deleteTrack = track.size() < minimalHits;
279 recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
286 double lastAngle = NAN;
287 bool removeAfterThis =
false;
289 for (
const CDCRecoHit3D& recoHit : reversedRange(track)) {
290 if (removeAfterThis) {
291 recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
295 const double currentAngle = recoHit.getRecoPos2D().Phi();
296 if (not std::isnan(lastAngle)) {
297 const double delta = currentAngle - lastAngle;
298 const double normalizedDelta =
300 ROOT::Math::VectorUtil::Phi_0_2pi(delta),
301 ROOT::Math::VectorUtil::Phi_0_2pi(-delta));
302 if (fabs(normalizedDelta) > maximalAngle) {
303 removeAfterThis =
true;
304 recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
308 lastAngle = currentAngle;
316 bool deleteTrack =
true;
319 const ISuperLayer currentLayer = recoHit.getISuperLayer();
320 if (lastLayer != -1 and lastLayer != currentLayer) {
325 lastLayer = currentLayer;
330 recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
346 recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
357 if (std::isnan(radius)) {
361 double lastArcLength2D = NAN;
362 bool removeAfterThis =
false;
365 if (removeAfterThis) {
366 recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
370 const double currentArcLength2D = recoHit.getArcLength2D();
371 if (not std::isnan(lastArcLength2D)) {
372 const double delta = (currentArcLength2D - lastArcLength2D) / radius;
373 if (fabs(delta) > m_maximumArcLength2DDistance) {
374 removeAfterThis =
true;
375 recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
380 lastArcLength2D = currentArcLength2D;
void setAssignedFlag(bool setTo=true)
Sets the already assigned marker flag to the given value. Default value true.
Class representing a three dimensional reconstructed hit.
Class representing a sequence of three dimensional reconstructed hits.
void setStartTrajectory3D(const CDCTrajectory3D &startTrajectory3D)
Setter for the two dimensional trajectory.
AutomatonCell & getAutomatonCell() const
Mutable getter for the automaton cell.
Particle trajectory as it is seen in xy projection represented as a circle.
PerigeeCircle getGlobalCircle() const
Getter for the circle in global coordinates.
void reverse()
Reverses the trajectory in place.
double calcArcLength2D(const ROOT::Math::XYVector &point) const
Calculate the travel distance from the start position of the trajectory.
ROOT::Math::XYVector getOuterExit(double factor=1) const
Calculates the point where the trajectory meets the outer wall of the CDC.
bool isCurler(double factor=1) const
Checks if the trajectory leaves the outer radius of the CDC times the given tolerance factor.
double getArcLength2DPeriod() const
Getter for the arc length for one round trip around the trajectory.
const UncertainPerigeeCircle & getLocalCircle() const
Getter for the circle in local coordinates.
Particle full three dimensional trajectory.
double setLocalOrigin(const ROOT::Math::XYZVector &localOrigin)
Setter for the origin of the local coordinate system.
void reverse()
Reverses the trajectory in place.
CDCTrajectory2D getTrajectory2D() const
Getter for the two dimensional trajectory.
double shiftPeriod(int nPeriods)
Adjusts the z0 to the one that lies n periods forward.
void setFlightTime(double flightTime)
Setter for the time when the particle reached the support point position.
ROOT::Math::XYVector apogee() const
Getter for the apogee of the circle. If it was a line both components will be infinity.
double absRadius() const
Gives the signed radius of the circle. If it was a line this will be infinity.
signed short ILayer
The type of the layer ids enumerating layers within a superlayer.
signed short ISuperLayer
The type of the layer and superlayer ids.
Abstract base class for different kinds of events.