8#include <tracking/trackFindingCDC/fitting/CDCObservations2D.h>
10#include <tracking/trackFindingCDC/fitting/EigenObservationMatrix.h>
12#include <tracking/trackingUtilities/eventdata/tracks/CDCTrack.h>
13#include <tracking/trackingUtilities/eventdata/tracks/CDCAxialSegmentPair.h>
14#include <tracking/trackingUtilities/eventdata/segments/CDCSegment3D.h>
15#include <tracking/trackingUtilities/eventdata/segments/CDCSegment2D.h>
16#include <tracking/trackingUtilities/eventdata/segments/CDCWireHitSegment.h>
17#include <tracking/trackingUtilities/eventdata/hits/CDCFacet.h>
18#include <tracking/trackingUtilities/eventdata/hits/CDCRLWireHitTriple.h>
19#include <tracking/trackingUtilities/eventdata/hits/CDCRLWireHitPair.h>
20#include <tracking/trackingUtilities/eventdata/hits/CDCRLWireHit.h>
21#include <tracking/trackingUtilities/eventdata/hits/CDCWireHit.h>
22#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectory2D.h>
23#include <tracking/trackingUtilities/geometry/VectorUtil.h>
25#include <cdc/topology/CDCWire.h>
27#include <Math/Vector2D.h>
31using namespace TrackFindingCDC;
32using namespace TrackingUtilities;
43 if (std::isnan(x))
return 0;
44 if (std::isnan(y))
return 0;
46 if (std::isnan(signedRadius)) {
47 B2WARNING(
"Signed radius is nan. Skipping observation");
51 if (std::isnan(weight)) {
52 B2WARNING(
"Weight is nan. Skipping observation");
66 return fill(pos2D.x(), pos2D.y(), signedRadius, weight);
71 const ROOT::Math::XYVector& wireRefPos2D = wireHit.
getRefPos2D();
73 double signedDriftLength = 0;
74 if (
m_fitPos == EFitPos::c_RLDriftCircle and isValid(rlInfo)) {
77 signedDriftLength = 0;
87 variance = fabs(driftLength);
91 if (abs(rlInfo) != 1) {
97 return fill(wireRefPos2D, signedDriftLength, 1 / variance);
103 return append(*(wireHit), rlInfo);
111 const ERightLeft rlInfo = rlWireHit.
getRLInfo();
116 const ROOT::Math::XYVector& wireRefPos2D = rlWireHit.
getRefPos2D();
118 double signedDriftLength = 0;
119 if (
m_fitPos == EFitPos::c_RLDriftCircle and isValid(rlInfo)) {
120 signedDriftLength =
static_cast<double>(rlInfo) * driftLength;
122 signedDriftLength = 0;
131 variance = fabs(driftLength);
135 if (abs(rlInfo) != 1) {
138 variance = driftLengthVariance;
142 return fill(wireRefPos2D, signedDriftLength, 1 / variance);
158 if (
m_fitPos == EFitPos::c_RecoPos) {
163 return append(rlWireHitTriple);
169 ROOT::Math::XYVector fitPos2D;
170 double signedDriftLength = 0;
171 if (
m_fitPos == EFitPos::c_RecoPos) {
173 signedDriftLength = 0;
176 if (VectorUtil::hasNAN(fitPos2D)) {
181 }
else if (
m_fitPos == EFitPos::c_RLDriftCircle) {
184 }
else if (
m_fitPos == EFitPos::c_WirePos) {
186 signedDriftLength = 0;
190 const ERightLeft rlInfo = recoHit2D.
getRLInfo();
198 variance = std::fabs(driftLength);
199 }
else if (
m_fitVariance == EFitVariance::c_Pseudo or abs(rlInfo) != 1) {
203 return fill(fitPos2D, signedDriftLength, 1 / variance);
208 ROOT::Math::XYVector fitPos2D = recoHit3D.
getRecoPos2D();
209 double signedDriftLength = 0;
210 if (
m_fitPos == EFitPos::c_RecoPos) {
211 signedDriftLength = 0;
212 }
else if (
m_fitPos == EFitPos::c_RLDriftCircle) {
215 }
else if (
m_fitPos == EFitPos::c_WirePos) {
217 signedDriftLength = 0;
221 const ERightLeft rlInfo = recoHit3D.
getRLInfo();
229 variance = std::fabs(driftLength);
230 }
else if (
m_fitVariance == EFitVariance::c_Pseudo or abs(rlInfo) != 1) {
234 return fill(fitPos2D, signedDriftLength, 1 / variance);
239 std::size_t nAppendedHits = 0;
241 nAppendedHits +=
append(recoHit2D);
243 return nAppendedHits;
248 std::size_t nAppendedHits = 0;
250 nAppendedHits +=
append(recoHit3D);
252 return nAppendedHits;
257 std::size_t nAppendedHits = 0;
259 if (ptrStartSegment2D) {
260 const CDCSegment2D& startSegment2D = *ptrStartSegment2D;
265 if (ptrEndSegment2D) {
269 return nAppendedHits;
274 std::size_t nAppendedHits = 0;
276 nAppendedHits +=
append(recoHit3D);
278 return nAppendedHits;
283 std::size_t nAppendedHits = 0;
284 for (
const CDCWire* ptrWire : wires) {
285 if (not ptrWire)
continue;
286 const CDCWire& wire = *ptrWire;
287 const ROOT::Math::XYVector& wirePos = wire.
getRefPos2D();
288 const double driftLength = 0.0;
289 const double weight = 1.0;
290 nAppendedHits +=
fill(wirePos, driftLength, weight);
292 return nAppendedHits;
297 std::size_t nAppendedHits = 0;
298 for (
const CDCWireHit* ptrWireHit : wireHits) {
299 if (not ptrWireHit)
continue;
301 nAppendedHits +=
append(wireHit);
303 return nAppendedHits;
313 std::size_t result = 0;
314 Index nObservations =
size();
316 for (Index iObservation = 0; iObservation < nObservations; ++iObservation) {
318 bool hasDriftLength = (driftLength != 0.0);
319 result += hasDriftLength ? 1 : 0;
327 std::size_t n =
size();
328 if (n == 0)
return ROOT::Math::XYVector(NAN, NAN);
329 std::size_t i = n / 2;
333 ROOT::Math::XYVector center1(
getX(i),
getY(i));
334 ROOT::Math::XYVector center2(
getX(i - 1),
getY(i - 1));
335 return center1.Mag2() > center2.Mag2() ? center1 : center2;
337 ROOT::Math::XYVector center1(
getX(i),
getY(i));
344 Eigen::Matrix<double, 1, 2> eigenOrigin(origin.x(), origin.y());
345 EigenObservationMatrix eigenObservations = getEigenObservationMatrix(
this);
346 eigenObservations.leftCols<2>().rowwise() -= eigenOrigin;
static constexpr const double c_simpleDriftLengthVariance
A default value for the drift length variance if no variance from the drift length translation is ava...
Class representing a sense wire in the central drift chamber.
const ROOT::Math::XYVector & getRefPos2D() const
Getter for the wire reference position for 2D tracking Gives the wire's reference position projected ...
EFitPos m_fitPos
Indicator which positional information should preferably be extracted from hits in calls to append.
ROOT::Math::XYVector getBackPos2D() const
Get the position of the first observation.
ROOT::Math::XYVector getFrontPos2D() const
Get the position of the first observation.
ROOT::Math::XYVector centralize()
Picks one observation as a reference point and transform all observations to that new origin.
static double getPseudoDriftLengthVariance(double driftLength, double driftLengthVariance)
Gets the pseudo variance.
double getX(int iObservation) const
Getter for the x value of the observation at the given index.
double getY(int iObservation) const
Getter for the y value of the observation at the given index.
std::size_t append(const TrackingUtilities::CDCWireHit &wireHit, TrackingUtilities::ERightLeft rlInfo=TrackingUtilities::ERightLeft::c_Unknown)
Appends the hit circle at wire reference position without a right left passage hypotheses.
std::size_t appendRange(const TrackingUtilities::CDCSegment2D &segment2D)
Appends all reconstructed hits from the two dimensional segment.
double getDriftLength(int iObservation) const
Getter for the signed drift radius of the observation at the given index.
std::size_t fill(double x, double y, double signedRadius=0.0, double weight=1.0)
Appends the observed position.
double getTotalPerpS(const TrackingUtilities::CDCTrajectory2D &trajectory2D) const
Calculate the total transverse travel distance traversed by these observations comparing the travel d...
void passiveMoveBy(const ROOT::Math::XYVector &origin)
Moves all observations passively such that the given vector becomes to origin of the new coordinate s...
EFitVariance m_fitVariance
Indicator which variance information should preferably be extracted from hits in calls to append.
std::size_t size() const
Returns the number of observations stored.
std::size_t getNObservationsWithDriftRadius() const
Returns the number of observations having a drift radius radius.
ROOT::Math::XYVector getCentralPoint() const
Extracts the observation center that is at the index in the middle.
std::vector< double > m_observations
Memory for the individual observations.
Class representing a pair of reconstructed axial segments in adjacent superlayer.
const CDCAxialSegment2D * getEndSegment() const
Getter for the end segment.
const CDCAxialSegment2D * getStartSegment() const
Getter for the start segment.
Class representing a triple of neighboring oriented wire with additional trajectory information.
CDCRecoHit2D getEndRecoHit2D() const
Getter for the third reconstructed hit.
CDCRecoHit2D getMiddleRecoHit2D() const
Getter for the second reconstructed hit.
CDCRecoHit2D getStartRecoHit2D() const
Getter for the first reconstructed hit.
A pair of oriented wire hits.
CDCRLWireHit & getToRLWireHit()
Getter for the second oriented wire hit.
CDCRLWireHit & getFromRLWireHit()
Getter for the first oriented wire hit.
Class representing a triple of neighboring wire hits.
CDCRLWireHit & getStartRLWireHit()
Getter for the first oriented wire hit.
CDCRLWireHit & getEndRLWireHit()
Getter for the third oriented wire hit.
CDCRLWireHit & getMiddleRLWireHit()
Getter for the second oriented wire hit.
Class representing an oriented hit wire including a hypotheses whether the causing track passes left ...
double getRefDriftLengthVariance() const
Getter for the variance of the drift length at the reference position of the wire.
double getRefDriftLength() const
Getter for the drift length at the reference position of the wire.
const ROOT::Math::XYVector & getRefPos2D() const
The two dimensional reference position of the underlying wire.
ERightLeft getRLInfo() const
Getter for the right left passage information.
Class representing a two dimensional reconstructed hit in the central drift chamber.
double getRefDriftLengthVariance() const
Getter for the uncertainty in the drift length at the wire reference position.
double getRefDriftLength() const
Getter for the drift length at the wire reference position.
ROOT::Math::XYVector getRecoPos2D() const
Getter for the position in the reference plane.
const CDC::CDCWire & getWire() const
Getter for the wire the reconstructed hit associated to.
double getSignedRefDriftLength() const
Getter for the drift length at the wire reference position signed with the right left passage hypothe...
ERightLeft getRLInfo() const
Getter for the right left passage information.
Class representing a three dimensional reconstructed hit.
ROOT::Math::XYVector getRecoWirePos2D() const
Returns the position of the wire in the xy plain the reconstructed position is located in.
double getSignedRecoDriftLength() const
Returns the drift length next to the reconstructed position.
double getRecoDriftLengthVariance() const
Returns the drift length variance next to the reconstructed position.
const ROOT::Math::XYVector getRecoPos2D() const
Getter for the 2d position of the hit.
ERightLeft getRLInfo() const
Getter for the right left passage information.
A reconstructed sequence of two dimensional hits in one super layer.
A segment consisting of three dimensional reconstructed hits.
Class representing a sequence of three dimensional reconstructed hits.
Particle trajectory as it is seen in xy projection represented as a circle.
double calcArcLength2DBetween(const ROOT::Math::XYVector &fromPoint, const ROOT::Math::XYVector &toPoint) const
Calculate the travel distance between the two given positions Returns the travel distance on the traj...
A segment consisting of two dimensional reconstructed hits.
Class representing a hit wire in the central drift chamber.
double getRefDriftLengthVariance() const
Getter for the variance of the drift length at the reference position of the wire.
double getRefDriftLength() const
Getter for the drift length at the reference position of the wire.
const ROOT::Math::XYVector & getRefPos2D() const
The two dimensional reference position (z=0) of the underlying wire.
Abstract base class for different kinds of events.