Belle II Software prerelease-11-00-00d
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/trackingUtilities/eventdata/tracks/CDCTrack.h>
13
14#include <tracking/trackingUtilities/eventdata/segments/CDCSegment3D.h>
15#include <tracking/trackingUtilities/eventdata/segments/CDCSegment2D.h>
16
17#include <tracking/trackingUtilities/eventdata/hits/CDCRecoHit3D.h>
18#include <tracking/trackingUtilities/eventdata/hits/CDCRecoHit2D.h>
19#include <tracking/trackingUtilities/eventdata/hits/CDCFacet.h>
20#include <tracking/trackingUtilities/eventdata/hits/CDCRLWireHit.h>
21#include <tracking/trackingUtilities/eventdata/hits/CDCWireHit.h>
22
23#include <cdc/topology/CDCWire.h>
24
25#include <tracking/trackingUtilities/geometry/UncertainParameterLine2D.h>
26#include <tracking/trackingUtilities/geometry/ParameterLine2D.h>
27#include <tracking/trackingUtilities/geometry/Vector2D.h>
28#include <tracking/trackingUtilities/geometry/Vector3D.h>
29
30#include <tracking/trackingUtilities/numerics/ERightLeft.h>
31#include <tracking/trackingUtilities/numerics/Quadratic.h>
32
33#include <framework/core/ModuleParamList.templateDetails.h>
34#include <tracking/trackingUtilities/utilities/StringManipulation.h>
35
36#include <cdc/translators/RealisticTDCCountTranslator.h>
37#include <cdc/dataobjects/CDCHit.h>
38
39using namespace Belle2;
40using namespace CDC;
41using namespace TrackFindingCDC;
42using namespace TrackingUtilities;
43
44
45void DriftLengthEstimator::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
46{
47 moduleParamList->addParameter(prefixed(prefix, "useAlphaInDriftLength"),
49 "Switch to serve the alpha angle to the drift length translator",
51
52 moduleParamList->addParameter(prefixed(prefix, "tofMassScale"),
54 "Mass to estimate the velocity in the flight time to the hit",
56}
57
59{
61
62 Vector2D flightDirection = recoHit2D.getFlightDirection2D();
63 Vector2D recoPos2D = recoHit2D.getRecoPos2D();
64 double alpha = recoPos2D.angleWith(flightDirection);
65 const double beta = 1;
66 double flightTimeEstimate = FlightTimeEstimator::instance().getFlightTime2D(recoPos2D, alpha, beta);
67
68 const CDCWire& wire = recoHit2D.getWire();
69 const CDCHit* hit = recoHit2D.getWireHit().getHit();
70 const bool rl = recoHit2D.getRLInfo() == ERightLeft::c_Right;
71
73 alpha = 0;
74 }
75
76 double driftLength = tdcCountTranslator.getDriftLength(hit->getTDCCount(),
77 wire.getWireID(),
78 flightTimeEstimate,
79 rl,
80 wire.getRefZ(),
81 alpha);
82 if (driftLength > -2 and driftLength < 16) {
83 bool snapRecoPos = true;
84 recoHit2D.setRefDriftLength(driftLength, snapRecoPos);
85 }
86 return driftLength;
87}
88
90{
92
93 const UncertainParameterLine2D& line = facet.getFitLine();
94 Vector2D flightDirection = line->tangential();
95 Vector2D centralPos2D = line->closest(facet.getMiddleWire().getRefPos2D());
96 double alpha = centralPos2D.angleWith(flightDirection);
98 alpha = 0;
99 }
100
101 auto doUpdate = [&](CDCRLWireHit & rlWireHit, Vector2D recoPos2D) {
102 const CDCWire& wire = rlWireHit.getWire();
103 const CDCHit* hit = rlWireHit.getWireHit().getHit();
104 const bool rl = rlWireHit.getRLInfo() == ERightLeft::c_Right;
105 const double beta = 1;
106 double flightTimeEstimate = FlightTimeEstimator::instance().getFlightTime2D(recoPos2D, alpha, beta);
107 double driftLength = tdcCountTranslator.getDriftLength(hit->getTDCCount(),
108 wire.getWireID(),
109 flightTimeEstimate,
110 rl,
111 wire.getRefZ(),
112 alpha);
113 rlWireHit.setRefDriftLength(driftLength);
114 };
115
116 doUpdate(facet.getStartRLWireHit(), facet.getStartRecoPos2D());
117 doUpdate(facet.getMiddleRLWireHit(), facet.getMiddleRecoPos2D());
118 doUpdate(facet.getEndRLWireHit(), facet.getEndRecoPos2D());
119
120 // More accurate implementation
121 // double startDriftLength = updateDriftLength(facet.getStartRecoHit2D());
122 // facet.getStartRLWireHit().setRefDriftLength(startDriftLength);
123
124 // double middleDriftLength = updateDriftLength(facet.getMiddleRecoHit2D());
125 // facet.getMiddleRLWireHit().setRefDriftLength(middleDriftLength);
126
127 // double endDriftLength = updateDriftLength(facet.getEndRecoHit2D());
128 // facet.getEndRLWireHit().setRefDriftLength(endDriftLength);
129}
130
132{
134
135 auto computeDriftLength = [&](const CDCRLWireHit & rlWireHit, double flightTimeEstimate, double alpha) {
136 const CDCWire& wire = rlWireHit.getWire();
137 const CDCHit* hit = rlWireHit.getWireHit().getHit();
138 const bool rl = rlWireHit.getRLInfo() == ERightLeft::c_Right;
139 return tdcCountTranslator.getDriftLength(hit->getTDCCount(),
140 wire.getWireID(),
141 flightTimeEstimate,
142 rl,
143 wire.getRefZ(),
144 alpha);
145 };
146
147 const double beta = 1;
148 if (not cache.valid) {
149 // Full update like updateDriftLength(facet) filling the cache on the way
150 const UncertainParameterLine2D& line = facet.getFitLine();
151 Vector2D flightDirection = line->tangential();
152 Vector2D centralPos2D = line->closest(facet.getMiddleWire().getRefPos2D());
153 double alpha = centralPos2D.angleWith(flightDirection);
155 alpha = 0;
156 }
157
158 double startFlightTime =
160 double startDriftLength = computeDriftLength(facet.getStartRLWireHit(), startFlightTime, alpha);
161 facet.getStartRLWireHit().setRefDriftLength(startDriftLength);
162
163 double middleFlightTime =
165 double middleDriftLength = computeDriftLength(facet.getMiddleRLWireHit(), middleFlightTime, alpha);
166 facet.getMiddleRLWireHit().setRefDriftLength(middleDriftLength);
167
168 double endFlightTime =
170 double endDriftLength = computeDriftLength(facet.getEndRLWireHit(), endFlightTime, alpha);
171 facet.getEndRLWireHit().setRefDriftLength(endDriftLength);
172
173 cache.fitLine = line;
174 cache.alpha = alpha;
175 cache.middleFlightTime = middleFlightTime;
176 cache.startDriftLength = startDriftLength;
177 cache.endDriftLength = endDriftLength;
178 cache.valid = true;
179 } else {
180 // Only the middle hit depends on its right left passage hypothesis
181 facet.setFitLine(cache.fitLine);
182 facet.getStartRLWireHit().setRefDriftLength(cache.startDriftLength);
183 double middleDriftLength =
184 computeDriftLength(facet.getMiddleRLWireHit(), cache.middleFlightTime, cache.alpha);
185 facet.getMiddleRLWireHit().setRefDriftLength(middleDriftLength);
186 facet.getEndRLWireHit().setRefDriftLength(cache.endDriftLength);
187 }
188}
189
191{
192 for (CDCRecoHit2D& recoHit2D : segment) {
193 updateDriftLength(recoHit2D);
194 }
195}
196
198 double tanLambda)
199{
201
202 Vector2D flightDirection = recoHit3D.getFlightDirection2D();
203 const Vector3D& recoPos3D = recoHit3D.getRecoPos3D();
204 const Vector2D& recoPos2D = recoPos3D.xy();
205 double alpha = recoPos2D.angleWith(flightDirection);
206 const double beta = 1;
207 double flightTimeEstimate = FlightTimeEstimator::instance().getFlightTime2D(recoPos2D, alpha, beta);
208
209 if (std::isnan(tanLambda)) {
210 tanLambda = recoPos3D.z() / recoPos3D.cylindricalR();
211 }
212 const double theta = M_PI / 2 - std::atan(tanLambda);
213 flightTimeEstimate *= hypot2(1, tanLambda);
214
215 const CDCWire& wire = recoHit3D.getWire();
216 const CDCHit* hit = recoHit3D.getWireHit().getHit();
217 const bool rl = recoHit3D.getRLInfo() == ERightLeft::c_Right;
218 double driftLength =
219 tdcCountTranslator.getDriftLength(hit->getTDCCount(),
220 wire.getWireID(),
221 flightTimeEstimate,
222 rl,
223 recoPos3D.z(),
224 alpha,
225 theta,
226 hit->getADCCount());
227 if (driftLength > -2 and driftLength < 16) {
228 bool snapRecoPos = true;
229 recoHit3D.setRecoDriftLength(driftLength, snapRecoPos);
230 }
231 return driftLength;
232}
233
234
236 const double tanLambda)
237{
238 for (CDCRecoHit3D& recoHit3D : segment3D) {
239 updateDriftLength(recoHit3D, tanLambda);
240 }
241}
242
244 const double tanLambda)
245{
246 for (CDCRecoHit3D& recoHit3D : track) {
247 updateDriftLength(recoHit3D, tanLambda);
248 }
249}
Class containing the result of the unpacker in raw data and the result of the digitizer in simulation...
Definition CDCHit.h:40
short getTDCCount() const
Getter for TDC count.
Definition CDCHit.h:219
unsigned short getADCCount() const
Getter for integrated charge.
Definition CDCHit.h:230
Class representing a sense wire in the central drift chamber.
Definition CDCWire.h:50
const ROOT::Math::XYVector & getRefPos2D() const
Getter for the wire reference position for 2D tracking Gives the wire's reference position projected ...
Definition CDCWire.h:221
const WireID & getWireID() const
Getter for the wire id.
Definition CDCWire.h:114
double getRefZ() const
Getter for the wire reference z coordinate Gives the wire's reference z coordinate.
Definition CDCWire.h:228
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.
virtual double getFlightTime2D(const TrackingUtilities::Vector2D &, double, double=1) const
Default estimator for the flight time.
static const FlightTimeEstimator & instance(std::unique_ptr< FlightTimeEstimator > replacement=nullptr)
Getter for the instance.
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:82
const UncertainParameterLine2D & getFitLine() const
Getter for the contained line fit information.
Definition CDCFacet.h:61
void setFitLine(const UncertainParameterLine2D &fitLine) const
Setter for the contained line fit information.
Definition CDCFacet.h:67
Vector2D getMiddleRecoPos2D() const
Getter for the reconstructed position at the second hit on the fit line.
Definition CDCFacet.cc:77
Vector2D getStartRecoPos2D() const
Getter for the reconstructed position at the first hit on the fit line.
Definition CDCFacet.cc:72
const CDC::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 CDC::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 CDC::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 CDC::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:39
const CDCHit * getHit() const
Getter for the CDCHit pointer into the StoreArray.
Definition CDCWireHit.h:162
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:36
double angleWith(const Vector2D &rhs) const
The angle between this and rhs.
Definition Vector2D.h:224
const Vector2D & xy() const
Getter for the xy projected vector ( reference ! )
Definition Vector3D.h:509
double cylindricalR() const
Getter for the cylindrical radius ( xy projected norm )
Definition Vector3D.h:535
double z() const
Getter for the z coordinate.
Definition Vector3D.h:497
void addParameter(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
HepGeom::Vector3D< double > Vector3D
3D Vector
Definition Cell.h:34
Abstract base class for different kinds of events.
Memory for the results of a facet drift length update that do not depend on the right left passage hy...
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.
double updateDriftLength(TrackingUtilities::CDCRecoHit2D &recoHit2D)
Update the drift length of the reconstructed hit in place.
bool m_param_useAlphaInDriftLength
Parameter : Switch to serve the alpha angle to the drift length translator.
CDC::RealisticTDCCountTranslator & getTDCCountTranslator()
Getter for the drift time translator constructing it on first use.