Belle II Software development
FitlessSegmentPairVarSet.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8#include <tracking/trackFindingCDC/filters/segmentPair/FitlessSegmentPairVarSet.h>
9
10#include <tracking/trackingUtilities/eventdata/tracks/CDCSegmentPair.h>
11#include <tracking/trackingUtilities/eventdata/segments/CDCSegment2D.h>
12
13#include <tracking/trackingUtilities/numerics/Angle.h>
14
15#include <cdc/topology/CDCWire.h>
16
17#include <framework/geometry/VectorUtil.h>
18
19#include <Math/Vector3D.h>
20#include <Math/Vector2D.h>
21#include <Math/VectorUtil.h>
22
23using namespace Belle2;
24using namespace CDC;
25using namespace TrackFindingCDC;
26using namespace TrackingUtilities;
27
29{
30 if (not ptrSegmentPair) return false;
31
32 const CDCSegmentPair& segmentPair = *ptrSegmentPair;
33
34 const CDCSegment2D* ptrFromSegment = segmentPair.getFromSegment();
35 const CDCSegment2D* ptrToSegment = segmentPair.getToSegment();
36
37 const CDCSegment2D& fromSegment = *ptrFromSegment;
38 const CDCSegment2D& toSegment = *ptrToSegment;
39
40 const CDCSegment2D* ptrAxialSegment = segmentPair.getAxialSegment();
41 const CDCSegment2D& axialSegment = *ptrAxialSegment;
42
43 const CDCSegment2D* ptrStereoSegment = segmentPair.getStereoSegment();
44 const CDCSegment2D& stereoSegment = *ptrStereoSegment;
45
46 // Segment fit should have been done at this point
47 const CDCTrajectory2D& fromFit = fromSegment.getTrajectory2D();
48 const CDCTrajectory2D& toFit = toSegment.getTrajectory2D();
49 const CDCTrajectory2D& axialFit = axialSegment.getTrajectory2D();
50 // const CDCTrajectory2D& stereoFit = stereoSegment.getTrajectory2D();
51
52 finitevar<named("from_ndf")>() = fromFit.getNDF();
53 finitevar<named("to_ndf")>() = toFit.getNDF();
54
55 finitevar<named("from_chi2_over_ndf")>() = fabs(fromFit.getChi2() / fromFit.getNDF());
56 finitevar<named("to_chi2_over_ndf")>() = fabs(toFit.getChi2() / toFit.getNDF());
57
58 finitevar<named("from_p_value")>() = fromFit.getPValue();
59 finitevar<named("to_p_value")>() = toFit.getPValue();
60
61 // Direction agreement
62 using namespace NPerigeeParameterIndices;
63 const double fromCurv = fromFit.isFitted() ? fromFit.getCurvature() : NAN;
64 const double fromCurvVar = fromFit.getLocalVariance(c_Curv);
65
66 const double toCurv = toFit.isFitted() ? toFit.getCurvature() : NAN;
67 const double toCurvVar = toFit.getLocalVariance(c_Curv);
68
69 const double deltaCurvVar = fromCurvVar + toCurvVar;
70 const double avgPrecision = 1 / fromCurvVar + 1 / toCurvVar;
71 const double deltaCurvSigma = std::sqrt(deltaCurvVar);
72
73 finitevar<named("abs_avg_curv")>() = std::fabs(toCurv / toCurvVar + fromCurv / fromCurvVar) / avgPrecision;
74 finitevar<named("delta_curv_var")>() = deltaCurvVar;
75 finitevar<named("delta_curv")>() = toCurv - fromCurv;
76 finitevar<named("delta_curv_pull")>() = (toCurv - fromCurv) / deltaCurvSigma;
77
78 // Hits
79 const CDCRecoHit2D& fromFirstHit = fromSegment.front();
80 const CDCRecoHit2D& fromLastHit = fromSegment.back();
81 const CDCRecoHit2D& toFirstHit = toSegment.front();
82 const CDCRecoHit2D& toLastHit = toSegment.back();
83
84 const ROOT::Math::XYVector fromHitPos = fromLastHit.getRecoPos2D();
85 const ROOT::Math::XYVector toHitPos = toFirstHit.getRecoPos2D();
86
87 // Fit
88 const ROOT::Math::XYVector fromFitPos = fromFit.getClosest(fromHitPos);
89 const ROOT::Math::XYVector toFitPos = toFit.getClosest(toHitPos);
90 const ROOT::Math::XYVector fromFitMom = fromFit.getFlightDirection2D(fromHitPos);
91 const ROOT::Math::XYVector toFitMom = toFit.getFlightDirection2D(toHitPos);
92
93 const ROOT::Math::XYVector fromOtherFitMom = toFit.getFlightDirection2D(fromHitPos);
94 const ROOT::Math::XYVector toOtherFitMom = fromFit.getFlightDirection2D(toHitPos);
95
96 const double deltaPosPhi = ROOT::Math::VectorUtil::DeltaPhi(fromFitPos, toFitPos);
97 const double deltaMomPhi = ROOT::Math::VectorUtil::DeltaPhi(fromFitMom, toFitMom);
98 const double deltaAlpha = AngleUtil::normalised(deltaMomPhi - deltaPosPhi);
99
100 finitevar<named("delta_pos_phi")>() = deltaPosPhi;
101 finitevar<named("delta_mom_phi")>() = deltaMomPhi;
102
103 finitevar<named("from_delta_mom_phi")>() = ROOT::Math::VectorUtil::DeltaPhi(fromFitMom, fromOtherFitMom);
104 finitevar<named("to_delta_mom_phi")>() = ROOT::Math::VectorUtil::DeltaPhi(toFitMom, toOtherFitMom);
105 finitevar<named("delta_alpha")>() = deltaAlpha;
106
107 // Reconstructed quantities
108 // One of the fitted positions corresponds to the axial hit and one to the stereo hit.
109 const CDCRecoHit2D& nearAxialHit = toFirstHit.isAxial() ? toFirstHit : fromLastHit;
110 const CDCRecoHit2D& farStereoHit = not fromFirstHit.isAxial() ? fromFirstHit : toLastHit;
111 const CDCRecoHit2D& nearStereoHit = not toFirstHit.isAxial() ? toFirstHit : fromLastHit;
112
113 const CDCWire& farStereoWire = farStereoHit.getWire();
114 const WireLine& farWireLine = farStereoWire.getWireLine();
115
116 const CDCWire& nearStereoWire = nearStereoHit.getWire();
117 const WireLine& nearWireLine = nearStereoWire.getWireLine();
118
119 const ROOT::Math::XYZVector nearAxialRecoPos = nearAxialHit.reconstruct3D(axialFit);
120 const ROOT::Math::XYZVector farStereoRecoPos = farStereoHit.reconstruct3D(axialFit);
121 const double farZ = farStereoRecoPos.z();
122
123 const ROOT::Math::XYZVector nearStereoRecoPos = nearStereoHit.reconstruct3D(axialFit);
124 const double nearZ = nearStereoRecoPos.z();
125
126 const double stereoArcLength2D =
127 axialFit.calcArcLength2DBetween(VectorUtil::getXYVector(nearStereoRecoPos),
128 VectorUtil::getXYVector(farStereoRecoPos));
129
130 const double arcLength2DGap =
131 axialFit.calcArcLength2DBetween(VectorUtil::getXYVector(nearAxialRecoPos),
132 VectorUtil::getXYVector(nearStereoRecoPos));
133
134 finitevar<named("reco_arc_length_gap")>() = fabs(arcLength2DGap);
135 finitevar<named("stereo_arc_length")>() = fabs(stereoArcLength2D);
136
137 finitevar<named("near_reco_z")>() = nearZ;
138 finitevar<named("near_z_bound_factor")>() = nearWireLine.outOfZBoundsFactor(nearZ);
139
140 finitevar<named("far_reco_z")>() = farZ;
141 finitevar<named("far_z_bound_factor")>() = farWireLine.outOfZBoundsFactor(farZ);
142
143 finitevar<named("coarse_tanl")>() = (farZ - nearZ) / stereoArcLength2D;
144
145 finitevar<named("stereo_rel_size")>() = fabs(stereoSegment.size() / stereoArcLength2D);
146
147 finitevar<named("arc_length_front_offset")>() =
148 (fromFit.getArcLength2DFrontOffset(fromSegment, toSegment)
149 + toFit.getArcLength2DFrontOffset(fromSegment, toSegment)) / 2;
150
151 finitevar<named("arc_length_back_offset")>() =
152 (fromFit.getArcLength2DBackOffset(fromSegment, toSegment)
153 + toFit.getArcLength2DBackOffset(fromSegment, toSegment)) / 2;
154
155 finitevar<named("from_arc_length_total")>() = toFit.getTotalArcLength2D(fromSegment);
156 finitevar<named("to_arc_length_total")>() = fromFit.getTotalArcLength2D(toSegment);
157
158 finitevar<named("arc_length_gap")>() =
159 (fromFit.getArcLength2DGap(fromSegment, toSegment)
160 + toFit.getArcLength2DGap(fromSegment, toSegment)) / 2;
161
162 return true;
163}
Class representing a sense wire in the central drift chamber.
Definition CDCWire.h:50
const WireLine & getWireLine() const
Getter for the wire line representation of the wire.
Definition CDCWire.h:180
A three dimensional limited line represented by its closest approach to the z-axes (reference positio...
Definition WireLine.h:33
double outOfZBoundsFactor(double z) const
Returns the amount how much the given z position is outside the bounds in units of the wire length.
Definition WireLine.h:160
bool extract(const TrackingUtilities::CDCSegmentPair *ptrSegmentPair) final
Generate and assign the contained variables.
Class representing a two dimensional reconstructed hit in the central drift chamber.
bool isAxial() const
Indicator if the underlying wire is axial.
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.
ROOT::Math::XYZVector reconstruct3D(const CDCTrajectory2D &trajectory2D, const double z=0) const
Reconstruct the three dimensional position (especially of stereo hits) by determining the z coordinat...
A reconstructed sequence of two dimensional hits in one super layer.
Class representing a pair of one reconstructed axial segment and one stereo segment in adjacent super...
const CDCSegment2D * getAxialSegment() const
Getter for the axial segment.
const CDCSegment2D * getToSegment() const
Getter for the to segment.
const CDCSegment2D * getStereoSegment() const
Getter for the stereo segment.
const CDCSegment2D * getFromSegment() const
Getter for the from segment.
CDCTrajectory2D & getTrajectory2D() const
Getter for the two dimensional trajectory fitted to the segment.
Definition CDCSegment.h:69
Particle trajectory as it is seen in xy projection represented as a circle.
double getTotalArcLength2D(const AHits &hits) const
Calculates the perpendicular travel distance from the first position of the hits to the last position...
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...
ROOT::Math::XYVector getClosest(const ROOT::Math::XYVector &point) const
Calculates the closest approach on the trajectory to the given point.
double getChi2() const
Getter for the chi2 value of the circle fit.
double getPValue() const
Getter for p-value.
bool isFitted() const
Checks if the circle is already set to a valid value.
double getLocalVariance(EPerigeeParameter i) const
Getter for an individual diagonal element of the covariance matrix of the local helix parameters.
double getArcLength2DGap(const AFromHits &fromHits, const AToHits &toHits) const
Calculates the perpendicular travel distance from the last position of the fromHits to the first posi...
double getArcLength2DBackOffset(const AFromHits &fromHits, const AToHits &toHits) const
Calculates the perpendicular travel distance from the last position of the fromHits to the last posit...
double getArcLength2DFrontOffset(const AFromHits &fromHits, const AToHits &toHits) const
Calculates the perpendicular travel distance from the first position of the fromHits to the first pos...
size_t getNDF() const
Getter for the number of degrees of freedom of the circle fit.
ROOT::Math::XYVector getFlightDirection2D(const ROOT::Math::XYVector &point) const
Get the unit direction of flight at the given point, where arcLength2D = 0.
double getCurvature() const
Getter for the curvature as seen from the xy projection.
static constexpr int named(const char *name)
Definition VarSet.h:78
Namespace to hide the contained enum constants.
Abstract base class for different kinds of events.
static double normalised(const double angle)
Normalise an angle to lie in the range from [-pi, pi].
Definition Angle.h:33