Belle II Software development
FitlessSegmentRelationVarSet.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/segmentRelation/FitlessSegmentRelationVarSet.h>
9
10#include <tracking/trackingUtilities/eventdata/segments/CDCSegment2D.h>
11#include <tracking/trackingUtilities/numerics/Angle.h>
12
13#include <Math/Vector2D.h>
14#include <Math/VectorUtil.h>
15
16using namespace Belle2;
17using namespace TrackFindingCDC;
18using namespace TrackingUtilities;
19
21{
22 if (not ptrSegmentRelation) return false;
23
24 const Relation<const CDCSegment2D>& segmentPair = *ptrSegmentRelation;
25
26 const CDCSegment2D* ptrFromSegment = segmentPair.getFrom();
27 const CDCSegment2D* ptrToSegment = segmentPair.getTo();
28
29 const CDCSegment2D& fromSegment = *ptrFromSegment;
30 const CDCSegment2D& toSegment = *ptrToSegment;
31
32 // Segment fit should have been done at this point
33 const CDCTrajectory2D& fromFit = fromSegment.getTrajectory2D();
34 const CDCTrajectory2D& toFit = toSegment.getTrajectory2D();
35
36 finitevar<named("from_ndf")>() = fromFit.getNDF();
37 finitevar<named("to_ndf")>() = toFit.getNDF();
38
39 finitevar<named("from_chi2_over_ndf")>() = fabs(fromFit.getChi2() / fromFit.getNDF());
40 finitevar<named("to_chi2_over_ndf")>() = fabs(toFit.getChi2() / toFit.getNDF());
41
42 finitevar<named("from_p_value")>() = fromFit.getPValue();
43 finitevar<named("to_p_value")>() = toFit.getPValue();
44
45 // Direction agreement
46 using namespace NPerigeeParameterIndices;
47 const double fromCurv = fromFit.isFitted() ? fromFit.getCurvature() : NAN;
48 const double fromCurvVar = fromFit.getLocalVariance(c_Curv);
49
50 const double toCurv = toFit.isFitted() ? toFit.getCurvature() : NAN;
51 const double toCurvVar = toFit.getLocalVariance(c_Curv);
52
53 const double deltaCurvVar = fromCurvVar + toCurvVar;
54 const double avgPrecision = 1 / fromCurvVar + 1 / toCurvVar;
55 const double deltaCurvSigma = std::sqrt(deltaCurvVar);
56
57 finitevar<named("abs_avg_curv")>() = std::fabs(toCurv / toCurvVar + fromCurv / fromCurvVar) / avgPrecision;
58 finitevar<named("delta_curv_var")>() = deltaCurvVar;
59 finitevar<named("delta_curv")>() = toCurv - fromCurv;
60 finitevar<named("delta_curv_pull")>() = (toCurv - fromCurv) / deltaCurvSigma;
61
62 // Hits
63 // const CDCRecoHit2D& fromFirstHit = fromSegment.front();
64 const CDCRecoHit2D& fromLastHit = fromSegment.back();
65 const CDCRecoHit2D& toFirstHit = toSegment.front();
66 // const CDCRecoHit2D& toLastHit = toSegment.back();
67
68 const ROOT::Math::XYVector fromHitPos = fromLastHit.getRecoPos2D();
69 const ROOT::Math::XYVector toHitPos = toFirstHit.getRecoPos2D();
70
71 // Fit
72 const ROOT::Math::XYVector fromFitPos = fromFit.getClosest(fromHitPos);
73 const ROOT::Math::XYVector toFitPos = toFit.getClosest(toHitPos);
74 const ROOT::Math::XYVector fromFitMom = fromFit.getFlightDirection2D(fromHitPos);
75 const ROOT::Math::XYVector toFitMom = toFit.getFlightDirection2D(toHitPos);
76
77 const ROOT::Math::XYVector fromOtherFitMom = toFit.getFlightDirection2D(fromHitPos);
78 const ROOT::Math::XYVector toOtherFitMom = fromFit.getFlightDirection2D(toHitPos);
79
80 const double deltaPosPhi = ROOT::Math::VectorUtil::DeltaPhi(fromFitPos, toFitPos);
81 const double deltaMomPhi = ROOT::Math::VectorUtil::DeltaPhi(fromFitMom, toFitMom);
82 const double deltaAlpha = AngleUtil::normalised(deltaMomPhi - deltaPosPhi);
83
84 finitevar<named("delta_pos_phi")>() = deltaPosPhi;
85 finitevar<named("delta_mom_phi")>() = deltaMomPhi;
86
87 finitevar<named("from_delta_mom_phi")>() = ROOT::Math::VectorUtil::DeltaPhi(fromFitMom, fromOtherFitMom);
88 finitevar<named("to_delta_mom_phi")>() = ROOT::Math::VectorUtil::DeltaPhi(toFitMom, toOtherFitMom);
89 finitevar<named("delta_alpha")>() = deltaAlpha;
90
91 finitevar<named("arc_length_front_offset")>() =
92 (fromFit.getArcLength2DFrontOffset(fromSegment, toSegment)
93 + toFit.getArcLength2DFrontOffset(fromSegment, toSegment)) / 2;
94
95 finitevar<named("arc_length_back_offset")>() =
96 (fromFit.getArcLength2DBackOffset(fromSegment, toSegment)
97 + toFit.getArcLength2DBackOffset(fromSegment, toSegment)) / 2;
98
99 finitevar<named("from_arc_length_total")>() = toFit.getTotalArcLength2D(fromSegment);
100 finitevar<named("to_arc_length_total")>() = fromFit.getTotalArcLength2D(toSegment);
101
102 finitevar<named("arc_length_gap")>() =
103 (fromFit.getArcLength2DGap(fromSegment, toSegment)
104 + toFit.getArcLength2DGap(fromSegment, toSegment)) / 2;
105
106 return true;
107}
bool extract(const TrackingUtilities::Relation< const TrackingUtilities::CDCSegment2D > *ptrSegmentRelation) override
Generate and assign the contained variables.
Class representing a two dimensional reconstructed hit in the central drift chamber.
ROOT::Math::XYVector getRecoPos2D() const
Getter for the position in the reference plane.
A reconstructed sequence of two dimensional hits in one super layer.
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...
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.
Type for two related objects.
Definition Relation.h:21
From * getFrom() const
Getter for the pointer to the from side object.
Definition Relation.h:59
To * getTo() const
Getter for the pointer to the to side object.
Definition Relation.h:65
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