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 Vector3D 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 Vector2D recoPos2D = recoHit.getRLWireHit().reconstruct3D(trajectory2D).xy();
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 Vector3D frontPosition = track.front().getRLWireHit().reconstruct3D(trajectory2D);
111 double arcLengthOffset = trajectory3D.
setLocalOrigin(frontPosition);
112 track.setStartTrajectory3D(trajectory3D);
114 recoHit.shiftArcLength2D(-arcLengthOffset);
118 Vector3D 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)) {
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;
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 Vector2D& currentPosition = recoHit.getRecoPos2D();
181 if (lastLayer != -1) {
182 const ILayer delta = currentLayer - lastLayer;
183 const double distance = (currentPosition - lastWirePosition).norm();
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.
Vector2D getOuterExit(double factor=1) const
Calculates the point where the trajectory meets the outer wall of the CDC.
void reverse()
Reverses the trajectory in place.
double calcArcLength2D(const Vector2D &point) const
Calculate the travel distance from the start position of the trajectory.
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.
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.
double setLocalOrigin(const Vector3D &localOrigin)
Setter for the origin of the local coordinate system.
void setFlightTime(double flightTime)
Setter for the time when the particle reached the support point position.
Vector2D 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.
A two dimensional vector which is equipped with functions for correct handling of orientation relate...
HepGeom::Vector3D< double > Vector3D
3D Vector
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.