Belle II Software development
DriftLengthEstimator.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/eventdata/utils/DriftLengthEstimator.h>
9
10#include <tracking/trackFindingCDC/eventdata/utils/FlightTimeEstimator.h>
11
12#include <tracking/trackFindingCDC/eventdata/tracks/CDCTrack.h>
13
14#include <tracking/trackFindingCDC/eventdata/segments/CDCSegment3D.h>
15#include <tracking/trackFindingCDC/eventdata/segments/CDCSegment2D.h>
16
17#include <tracking/trackFindingCDC/eventdata/hits/CDCRecoHit3D.h>
18#include <tracking/trackFindingCDC/eventdata/hits/CDCRecoHit2D.h>
19#include <tracking/trackFindingCDC/eventdata/hits/CDCFacet.h>
20#include <tracking/trackFindingCDC/eventdata/hits/CDCRLWireHit.h>
21#include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
22
23#include <tracking/trackFindingCDC/topology/CDCWire.h>
24
25#include <tracking/trackFindingCDC/geometry/UncertainParameterLine2D.h>
26#include <tracking/trackFindingCDC/geometry/ParameterLine2D.h>
27#include <tracking/trackFindingCDC/geometry/Vector2D.h>
28#include <tracking/trackFindingCDC/geometry/Vector3D.h>
29
30#include <tracking/trackFindingCDC/numerics/ERightLeft.h>
31#include <tracking/trackFindingCDC/numerics/Quadratic.h>
32
33#include <framework/core/ModuleParamList.templateDetails.h>
34#include <tracking/trackFindingCDC/utilities/StringManipulation.h>
35
36#include <cdc/translators/RealisticTDCCountTranslator.h>
37#include <cdc/dataobjects/CDCHit.h>
38
39using namespace Belle2;
40using namespace TrackFindingCDC;
41
42
43void DriftLengthEstimator::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
44{
45 moduleParamList->addParameter(prefixed(prefix, "useAlphaInDriftLength"),
47 "Switch to serve the alpha angle to the drift length translator",
49
50 moduleParamList->addParameter(prefixed(prefix, "tofMassScale"),
52 "Mass to estimate the velocity in the flight time to the hit",
54}
55
57{
58 CDC::RealisticTDCCountTranslator tdcCountTranslator;
59
60 Vector2D flightDirection = recoHit2D.getFlightDirection2D();
61 Vector2D recoPos2D = recoHit2D.getRecoPos2D();
62 double alpha = recoPos2D.angleWith(flightDirection);
63 const double beta = 1;
64 double flightTimeEstimate = FlightTimeEstimator::instance().getFlightTime2D(recoPos2D, alpha, beta);
65
66 const CDCWire& wire = recoHit2D.getWire();
67 const CDCHit* hit = recoHit2D.getWireHit().getHit();
68 const bool rl = recoHit2D.getRLInfo() == ERightLeft::c_Right;
69
71 alpha = 0;
72 }
73
74 double driftLength = tdcCountTranslator.getDriftLength(hit->getTDCCount(),
75 wire.getWireID(),
76 flightTimeEstimate,
77 rl,
78 wire.getRefZ(),
79 alpha);
80 if (driftLength > -2 and driftLength < 16) {
81 bool snapRecoPos = true;
82 recoHit2D.setRefDriftLength(driftLength, snapRecoPos);
83 }
84 return driftLength;
85}
86
88{
89 CDC::RealisticTDCCountTranslator tdcCountTranslator;
90
91 const UncertainParameterLine2D& line = facet.getFitLine();
92 Vector2D flightDirection = line->tangential();
93 Vector2D centralPos2D = line->closest(facet.getMiddleWire().getRefPos2D());
94 double alpha = centralPos2D.angleWith(flightDirection);
96 alpha = 0;
97 }
98
99 auto doUpdate = [&](CDCRLWireHit & rlWireHit, Vector2D recoPos2D) {
100 const CDCWire& wire = rlWireHit.getWire();
101 const CDCHit* hit = rlWireHit.getWireHit().getHit();
102 const bool rl = rlWireHit.getRLInfo() == ERightLeft::c_Right;
103 const double beta = 1;
104 double flightTimeEstimate = FlightTimeEstimator::instance().getFlightTime2D(recoPos2D, alpha, beta);
105 double driftLength = tdcCountTranslator.getDriftLength(hit->getTDCCount(),
106 wire.getWireID(),
107 flightTimeEstimate,
108 rl,
109 wire.getRefZ(),
110 alpha);
111 rlWireHit.setRefDriftLength(driftLength);
112 };
113
114 doUpdate(facet.getStartRLWireHit(), facet.getStartRecoPos2D());
115 doUpdate(facet.getMiddleRLWireHit(), facet.getMiddleRecoPos2D());
116 doUpdate(facet.getEndRLWireHit(), facet.getEndRecoPos2D());
117
118 // More accurate implementation
119 // double startDriftLength = updateDriftLength(facet.getStartRecoHit2D());
120 // facet.getStartRLWireHit().setRefDriftLength(startDriftLength);
121
122 // double middleDriftLength = updateDriftLength(facet.getMiddleRecoHit2D());
123 // facet.getMiddleRLWireHit().setRefDriftLength(middleDriftLength);
124
125 // double endDriftLength = updateDriftLength(facet.getEndRecoHit2D());
126 // facet.getEndRLWireHit().setRefDriftLength(endDriftLength);
127}
128
130{
131 for (CDCRecoHit2D& recoHit2D : segment) {
132 updateDriftLength(recoHit2D);
133 }
134}
135
137 double tanLambda)
138{
139 CDC::RealisticTDCCountTranslator tdcCountTranslator;
140
141 Vector2D flightDirection = recoHit3D.getFlightDirection2D();
142 const Vector3D& recoPos3D = recoHit3D.getRecoPos3D();
143 const Vector2D& recoPos2D = recoPos3D.xy();
144 double alpha = recoPos2D.angleWith(flightDirection);
145 const double beta = 1;
146 double flightTimeEstimate = FlightTimeEstimator::instance().getFlightTime2D(recoPos2D, alpha, beta);
147
148 if (std::isnan(tanLambda)) {
149 tanLambda = recoPos3D.z() / recoPos3D.cylindricalR();
150 }
151 const double theta = M_PI / 2 - std::atan(tanLambda);
152 flightTimeEstimate *= hypot2(1, tanLambda);
153
154 const CDCWire& wire = recoHit3D.getWire();
155 const CDCHit* hit = recoHit3D.getWireHit().getHit();
156 const bool rl = recoHit3D.getRLInfo() == ERightLeft::c_Right;
157 double driftLength =
158 tdcCountTranslator.getDriftLength(hit->getTDCCount(),
159 wire.getWireID(),
160 flightTimeEstimate,
161 rl,
162 recoPos3D.z(),
163 alpha,
164 theta,
165 hit->getADCCount());
166 if (driftLength > -2 and driftLength < 16) {
167 bool snapRecoPos = true;
168 recoHit3D.setRecoDriftLength(driftLength, snapRecoPos);
169 }
170 return driftLength;
171}
172
173
175 const double tanLambda)
176{
177 for (CDCRecoHit3D& recoHit3D : segment3D) {
178 updateDriftLength(recoHit3D, tanLambda);
179 }
180}
181
183 const double tanLambda)
184{
185 for (CDCRecoHit3D& recoHit3D : track) {
186 updateDriftLength(recoHit3D, tanLambda);
187 }
188}
Class containing the result of the unpacker in raw data and the result of the digitizer in simulation...
Definition CDCHit.h:40
Translator mirroring the realistic Digitization.
double getDriftLength(unsigned short tdcCount, const WireID &wireID=WireID(), double timeOfFlightEstimator=0, bool leftRight=false, double z=0, double alpha=0, double theta=static_cast< double >(TMath::Pi()/2.), unsigned short adcCount=0) override
Get Drift length.
The Module parameter list class.
Class representing a triple of neighboring oriented wire with additional trajectory information.
Definition CDCFacet.h:32
Vector2D getEndRecoPos2D() const
Getter for the reconstructed position at the third hit on the fit line.
Definition CDCFacet.cc:81
const UncertainParameterLine2D & getFitLine() const
Getter for the contained line fit information.
Definition CDCFacet.h:61
Vector2D getMiddleRecoPos2D() const
Getter for the reconstructed position at the second hit on the fit line.
Definition CDCFacet.cc:76
Vector2D getStartRecoPos2D() const
Getter for the reconstructed position at the first hit on the fit line.
Definition CDCFacet.cc:71
const CDCWire & getMiddleWire() const
Getter for the wire the second oriented wire hit is based on.
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 ...
const CDCWireHit & getWireHit() const
Getter for the wire hit associated with the oriented hit.
void setRefDriftLength(double driftLength)
Setter for the drift length at the reference position of the wire.
const CDCWire & getWire() const
Getter for the wire the oriented hit associated to.
ERightLeft getRLInfo() const
Getter for the right left passage information.
Class representing a two dimensional reconstructed hit in the central drift chamber.
const CDCWireHit & getWireHit() const
Getter for the wire hit associated with the reconstructed hit.
void setRefDriftLength(double driftLength, bool snapRecoPos)
Setter for the drift length at the wire reference position.
const CDCWire & getWire() const
Getter for the wire the reconstructed hit associated to.
Vector2D getFlightDirection2D() const
Getter for the direction of flight.
Vector2D getRecoPos2D() const
Getter for the position in the reference plane.
ERightLeft getRLInfo() const
Getter for the right left passage information.
Class representing a three dimensional reconstructed hit.
const CDCWireHit & getWireHit() const
Getter for the wire hit.
const Vector3D & getRecoPos3D() const
Getter for the 3d position of the hit.
const CDCWire & getWire() const
Getter for the wire.
Vector2D getFlightDirection2D() const
Getter for the direction of flight.
void setRecoDriftLength(double driftLength, bool snapRecoPos)
Setter to update the drift length 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.
Definition CDCTrack.h:41
const CDCHit * getHit() const
Getter for the CDCHit pointer into the StoreArray.
Definition CDCWireHit.h:159
Class representing a sense wire in the central drift chamber.
Definition CDCWire.h:58
const WireID & getWireID() const
Getter for the wire id.
Definition CDCWire.h:122
const Vector2D & getRefPos2D() const
Getter for the wire reference position for 2D tracking Gives the wire's reference position projected ...
Definition CDCWire.h:229
double getRefZ() const
Getter for the wire reference z coordinate Gives the wire's reference z coordinate.
Definition CDCWire.h:236
static const FlightTimeEstimator & instance(std::unique_ptr< FlightTimeEstimator > replacement=nullptr)
Getter for the instance.
virtual double getFlightTime2D(const Vector2D &, double, double=1) const
Default estimator for the flight time.
A parameter line including including an line covariance matrix which is interpreted as located in the...
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
A three dimensional vector.
Definition Vector3D.h:33
const Vector2D & xy() const
Getter for the xy projected vector ( reference ! )
Definition Vector3D.h:508
double cylindricalR() const
Getter for the cylindrical radius ( xy projected norm )
Definition Vector3D.h:534
double z() const
Getter for the z coordinate.
Definition Vector3D.h:496
void addParameter(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
Abstract base class for different kinds of events.
double m_param_tofMassScale
Parameter : Mass to estimate the velocity in the flight time to the hit.
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix)
Add the parameters of the estimator to the module.
bool m_param_useAlphaInDriftLength
Parameter : Switch to serve the alpha angle to the drift length translator.
double updateDriftLength(CDCRecoHit2D &recoHit2D)
Update the drift length of the reconstructed hit in place.