Belle II Software development
BendFacetVarSet.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/facet/BendFacetVarSet.h>
9
10#include <tracking/trackFindingCDC/eventdata/hits/CDCFacet.h>
11
12using namespace Belle2;
13using namespace TrackFindingCDC;
14
16{
17 if (not ptrFacet) return false;
18 const CDCFacet& facet = *ptrFacet;
19
21 facet.adjustFitLine();
22
23 const CDCRLWireHit& startRLWirehit = facet.getStartRLWireHit();
24 const double startDriftLengthVar = startRLWirehit.getRefDriftLengthVariance();
25 const double startDriftLengthSigma = sqrt(startDriftLengthVar);
26 const double startWeight = 1.0 / startDriftLengthVar;
27
28 const CDCRLWireHit& middleRLWirehit = facet.getMiddleRLWireHit();
29 const double middleDriftLengthVar = middleRLWirehit.getRefDriftLengthVariance();
30 const double middleDriftLengthSigma = sqrt(middleDriftLengthVar);
31 const double middleWeight = 1.0 / middleDriftLengthVar;
32
33 const CDCRLWireHit& endRLWirehit = facet.getEndRLWireHit();
34 const double endDriftLengthVar = endRLWirehit.getRefDriftLengthVariance();
35 const double endDriftLengthSigma = sqrt(endDriftLengthVar);
36 const double endWeight = 1.0 / endDriftLengthVar;
37
38 const double sumWeight = startWeight + middleWeight + endWeight;
39
40 const ParameterLine2D& startToMiddleLine = facet.getStartToMiddleLine();
41 const ParameterLine2D& startToEndLine = facet.getStartToEndLine();
42 const ParameterLine2D& middleToEndLine = facet.getMiddleToEndLine();
43
44 const double startDistance = middleToEndLine.distance(startRLWirehit.getRefPos2D()) - startRLWirehit.getSignedRefDriftLength();
45 const double middleDistance = startToEndLine.distance(middleRLWirehit.getRefPos2D()) - middleRLWirehit.getSignedRefDriftLength();
46 const double endDistance = startToMiddleLine.distance(endRLWirehit.getRefPos2D()) - endRLWirehit.getSignedRefDriftLength();
47
48 const double startOptimalStep = startDistance * startWeight / sumWeight;
49 const double middleOptimalStep = middleDistance * middleWeight / sumWeight;
50 const double endOptimalStep = endDistance * endWeight / sumWeight;
51
52 const double startChi2 = startDistance * (startDistance - startOptimalStep) * startWeight;
53 const double middleChi2 = middleDistance * (middleDistance - middleOptimalStep) * middleWeight;
54 const double endChi2 = endDistance * (endDistance - endOptimalStep) * endWeight;
55
56 const Vector2D& startToMiddleTangentialVector = startToMiddleLine.tangential();
57 const Vector2D& startToEndTangentialVector = startToEndLine.tangential();
58 const Vector2D& middleToEndTangentialVector = middleToEndLine.tangential();
59
60 const double startToMiddleLength = startToMiddleTangentialVector.norm();
61 const double startToEndLength = startToEndTangentialVector.norm();
62 const double middleToEndLength = middleToEndTangentialVector.norm();
63
64 const double startPhi = startToMiddleTangentialVector.angleWith(startToEndTangentialVector);
65 const double middlePhi = startToMiddleTangentialVector.angleWith(middleToEndTangentialVector);
66 const double endPhi = startToEndTangentialVector.angleWith(middleToEndTangentialVector);
67
68 const double startToMiddleSigmaPhi = startDriftLengthSigma / startToMiddleLength;
69 const double startToEndSigmaPhi = startDriftLengthSigma / startToEndLength;
70
71 const double middleToStartSigmaPhi = middleDriftLengthSigma / startToMiddleLength;
72 const double middleToEndSigmaPhi = middleDriftLengthSigma / middleToEndLength;
73
74 const double endToStartSigmaPhi = endDriftLengthSigma / startToEndLength;
75 const double endToMiddleSigmaPhi = endDriftLengthSigma / middleToEndLength;
76
77 const double startPhiSigma = hypot3(startToEndSigmaPhi - startToMiddleSigmaPhi,
78 middleToStartSigmaPhi,
79 endToStartSigmaPhi);
80
81 const double middlePhiSigma = hypot3(startToMiddleSigmaPhi,
82 middleToStartSigmaPhi + middleToEndSigmaPhi,
83 endToMiddleSigmaPhi);
84
85 const double endPhiSigma = hypot3(startToEndSigmaPhi,
86 middleToEndSigmaPhi,
87 endToStartSigmaPhi - endToMiddleSigmaPhi);
88
89 const double startPhiPull = startPhi / startPhiSigma;
90 const double middlePhiPull = middlePhi / middlePhiSigma;
91 const double endPhiPull = endPhi / endPhiSigma;
92
93 const double curv = 2 * middlePhi / startToEndLength;
94 const double curvSigma = 2 * middlePhiSigma / startToEndLength;
95 const double curvPull = middlePhiPull / startToEndLength;
96
97 var<named("start_phi")>() = startPhi;
98 var<named("start_phi_sigma")>() = startPhiSigma;
99 var<named("start_phi_pull")>() = startPhiPull;
100 var<named("start_d")>() = startDistance;
101 var<named("start_chi2")>() = startChi2;
102
103 var<named("middle_phi")>() = middlePhi;
104 var<named("middle_phi_sigma")>() = middlePhiSigma;
105 var<named("middle_phi_pull")>() = middlePhiPull;
106 var<named("middle_d")>() = middleDistance;
107 var<named("middle_chi2")>() = middleChi2;
108
109 var<named("end_phi")>() = endPhi;
110 var<named("end_phi_sigma")>() = endPhiSigma;
111 var<named("end_phi_pull")>() = endPhiPull;
112 var<named("end_d")>() = endDistance;
113 var<named("end_chi2")>() = endChi2;
114
115 var<named("s")>() = startToEndLength;
116
117 var<named("curv")>() = curv;
118 var<named("curv_sigma")>() = curvSigma;
119 var<named("curv_pull")>() = curvPull;
120
121 return true;
122}
bool extract(const CDCFacet *ptrFacet) final
Generate and assign the contained variables.
Class representing a triple of neighboring oriented wire with additional trajectory information.
Definition: CDCFacet.h:32
void adjustFitLine() const
Adjusts the contained fit line to touch such that it touches the first and third hit.
Definition: CDCFacet.cc:61
ParameterLine2D getStartToEndLine() const
Getter for the tangential line from the first to the third hit.
Definition: CDCFacet.cc:94
ParameterLine2D getStartToMiddleLine() const
Getter for the tangential line from the first to the second hit.
Definition: CDCFacet.cc:86
ParameterLine2D getMiddleToEndLine() const
Getter for the tangential line from the second to the third hit.
Definition: CDCFacet.cc:102
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 ...
Definition: CDCRLWireHit.h:41
double getRefDriftLengthVariance() const
Getter for the variance of the drift length at the reference position of the wire.
Definition: CDCRLWireHit.h:222
double getSignedRefDriftLength() const
Getter for the drift length at the reference position of the wire.
Definition: CDCRLWireHit.h:216
const Vector2D & getRefPos2D() const
The two dimensional reference position of the underlying wire.
A line with a support point and tangential vector.
double distance(const Vector2D &point) const
Gives the signed distance of a point to the line.
const Vector2D & tangential() const
Gives the tangential vector of the line.
static constexpr int named(const char *name)
Getter for the index from the name.
Definition: VarSet.h:78
Float_t & var()
Reference getter for the value of the ith variable. Static version.
Definition: VarSet.h:93
A two dimensional vector which is equipped with functions for correct handling of orientation relate...
Definition: Vector2D.h:32
double angleWith(const Vector2D &rhs) const
The angle between this and rhs.
Definition: Vector2D.h:197
double norm() const
Calculates the length of the vector.
Definition: Vector2D.h:175
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
Abstract base class for different kinds of events.