8#include <tracking/trackFindingCDC/fitting/CDCSZObservations.h>
10#include <tracking/trackFindingCDC/fitting/EigenObservationMatrix.h>
12#include <tracking/trackingUtilities/eventdata/tracks/CDCTrack.h>
13#include <tracking/trackingUtilities/eventdata/segments/CDCSegment3D.h>
14#include <tracking/trackingUtilities/eventdata/hits/CDCRecoHit3D.h>
16#include <cdc/topology/CDCWire.h>
18#include <framework/logging/Logger.h>
20#include <Math/Vector3D.h>
21#include <Math/Vector2D.h>
25using namespace TrackFindingCDC;
26using namespace TrackingUtilities;
30 if (std::isnan(s))
return 0;
31 if (std::isnan(z))
return 0;
32 if (std::isnan(weight)) {
33 B2WARNING(
"Weight is nan. Skipping observation");
58 const ROOT::Math::XYZVector& wireVector = wire.
getWireVector();
59 const ROOT::Math::XYVector disp2D = recoHit3D.
getRecoDisp2D();
62 double dispNorm = disp2D.R();
65 if (dispNorm == 0.0) {
66 zeta = wireVector.Rho() / wireVector.z();
68 zeta = VectorUtil::getXYVector(wireVector).Dot(disp2D) / wireVector.z() / dispNorm;
71 weight = zeta * zeta / driftlengthVariance;
74 size_t appendedHit =
fill(s, z, weight);
80 std::size_t nAppendedHits = 0;
82 nAppendedHits +=
append(recoHit3D);
89 const std::vector<CDCRecoHit3D> recoHit3Ds = segment3D;
95 const std::vector<CDCRecoHit3D> recoHit3Ds = track;
101 std::size_t n =
size();
102 if (n == 0)
return ROOT::Math::XYVector(NAN, NAN);
103 std::size_t i = n / 2;
107 ROOT::Math::XYVector center1(
getS(i),
getZ(i));
108 ROOT::Math::XYVector center2(
getS(i - 1),
getZ(i - 1));
109 return center1.Mag2() > center2.Mag2() ? center1 : center2;
111 ROOT::Math::XYVector center1(
getS(i),
getZ(i));
118 Eigen::Matrix<double, 1, 2> eigenOrigin(origin.x(), origin.y());
119 EigenObservationMatrix eigenObservations = getEigenObservationMatrix(
this);
120 eigenObservations.leftCols<2>().rowwise() -= eigenOrigin;
Class representing a sense wire in the central drift chamber.
ROOT::Math::XYZVector getWireVector() const
Getter for the vector pointing from the back end of the wire to the front end of the wire.
std::size_t append(const TrackingUtilities::CDCRecoHit3D &recoHit3D)
Appends the observed position.
ROOT::Math::XYVector centralize()
Picks one observation as a reference point and transform all observations to that new origin.
bool m_onlyStereo
Switch to only use information from stereo hits.
std::size_t fill(double s, double z, double weight=1.0)
Appends the observed position.
std::size_t appendRange(const std::vector< TrackingUtilities::CDCRecoHit3D > &recoHit3Ds)
Appends all reconstructed hits from the three dimensional track.
double getZ(int iObservation) const
Getter for the z value of the observation at the given index.
std::vector< double > m_szObservations
Memory for the individual observations.
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.
double getS(int iObservation) const
Getter for the arc length value of the observation at the given index.
ROOT::Math::XYVector getCentralPoint() const
Extracts the observation center that is at the index in the middle.
Class representing a three dimensional reconstructed hit.
const ROOT::Math::XYZVector & getRecoPos3D() const
Getter for the 3d position of the hit.
bool isAxial() const
Indicator if the underlying wire is axial.
const CDC::CDCWire & getWire() const
Getter for the wire.
ROOT::Math::XYVector getRecoDisp2D() const
Gets the displacement from the wire position in the xy plain at the reconstructed position.
double getRecoDriftLengthVariance() const
Returns the drift length variance next to the reconstructed position.
double getArcLength2D() const
Getter for the travel distance in the xy projection.
A segment consisting of three dimensional reconstructed hits.
Class representing a sequence of three dimensional reconstructed hits.
Abstract base class for different kinds of events.