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/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
28#include <tracking/trackingUtilities/numerics/ERightLeft.h>
29#include <tracking/trackingUtilities/numerics/Quadratic.h>
30
31#include <tracking/trackingUtilities/utilities/StringManipulation.h>
32
33#include <cdc/translators/RealisticTDCCountTranslator.h>
34#include <cdc/dataobjects/CDCHit.h>
35
36#include <framework/core/ModuleParamList.templateDetails.h>
37#include <framework/geometry/VectorUtil.h>
38
39#include <Math/Vector3D.h>
40#include <Math/Vector2D.h>
41#include <Math/VectorUtil.h>
42
43using namespace Belle2;
44using namespace CDC;
45using namespace TrackFindingCDC;
46using namespace TrackingUtilities;
47
48
49void DriftLengthEstimator::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
50{
51 moduleParamList->addParameter(prefixed(prefix, "useAlphaInDriftLength"),
53 "Switch to serve the alpha angle to the drift length translator",
55
56 moduleParamList->addParameter(prefixed(prefix, "tofMassScale"),
58 "Mass to estimate the velocity in the flight time to the hit",
60}
61
63{
65
66 ROOT::Math::XYVector flightDirection = recoHit2D.getFlightDirection2D();
67 ROOT::Math::XYVector recoPos2D = recoHit2D.getRecoPos2D();
68 double alpha = ROOT::Math::VectorUtil::DeltaPhi(recoPos2D, flightDirection);
69 const double beta = 1;
70 double flightTimeEstimate = FlightTimeEstimator::instance().getFlightTime2D(recoPos2D, alpha, beta);
71
72 const CDCWire& wire = recoHit2D.getWire();
73 const CDCHit* hit = recoHit2D.getWireHit().getHit();
74 const bool rl = recoHit2D.getRLInfo() == ERightLeft::c_Right;
75
77 alpha = 0;
78 }
79
80 double driftLength = tdcCountTranslator.getDriftLength(hit->getTDCCount(),
81 wire.getWireID(),
82 flightTimeEstimate,
83 rl,
84 wire.getRefZ(),
85 alpha);
86 if (driftLength > -2 and driftLength < 16) {
87 bool snapRecoPos = true;
88 recoHit2D.setRefDriftLength(driftLength, snapRecoPos);
89 }
90 return driftLength;
91}
92
94{
96
97 const UncertainParameterLine2D& line = facet.getFitLine();
98 ROOT::Math::XYVector flightDirection = line->tangential();
99 ROOT::Math::XYVector centralPos2D = line->closest(facet.getMiddleWire().getRefPos2D());
100 double alpha = ROOT::Math::VectorUtil::DeltaPhi(centralPos2D, flightDirection);
102 alpha = 0;
103 }
104
105 auto doUpdate = [&](CDCRLWireHit & rlWireHit, ROOT::Math::XYVector recoPos2D) {
106 const CDCWire& wire = rlWireHit.getWire();
107 const CDCHit* hit = rlWireHit.getWireHit().getHit();
108 const bool rl = rlWireHit.getRLInfo() == ERightLeft::c_Right;
109 const double beta = 1;
110 double flightTimeEstimate = FlightTimeEstimator::instance().getFlightTime2D(recoPos2D, alpha, beta);
111 double driftLength = tdcCountTranslator.getDriftLength(hit->getTDCCount(),
112 wire.getWireID(),
113 flightTimeEstimate,
114 rl,
115 wire.getRefZ(),
116 alpha);
117 rlWireHit.setRefDriftLength(driftLength);
118 };
119
120 doUpdate(facet.getStartRLWireHit(), facet.getStartRecoPos2D());
121 doUpdate(facet.getMiddleRLWireHit(), facet.getMiddleRecoPos2D());
122 doUpdate(facet.getEndRLWireHit(), facet.getEndRecoPos2D());
123
124 // More accurate implementation
125 // double startDriftLength = updateDriftLength(facet.getStartRecoHit2D());
126 // facet.getStartRLWireHit().setRefDriftLength(startDriftLength);
127
128 // double middleDriftLength = updateDriftLength(facet.getMiddleRecoHit2D());
129 // facet.getMiddleRLWireHit().setRefDriftLength(middleDriftLength);
130
131 // double endDriftLength = updateDriftLength(facet.getEndRecoHit2D());
132 // facet.getEndRLWireHit().setRefDriftLength(endDriftLength);
133}
134
136{
138
139 auto computeDriftLength = [&](const CDCRLWireHit & rlWireHit, double flightTimeEstimate, double alpha) {
140 const CDCWire& wire = rlWireHit.getWire();
141 const CDCHit* hit = rlWireHit.getWireHit().getHit();
142 const bool rl = rlWireHit.getRLInfo() == ERightLeft::c_Right;
143 return tdcCountTranslator.getDriftLength(hit->getTDCCount(),
144 wire.getWireID(),
145 flightTimeEstimate,
146 rl,
147 wire.getRefZ(),
148 alpha);
149 };
150
151 const double beta = 1;
152 if (not cache.valid) {
153 // Full update like updateDriftLength(facet) filling the cache on the way
154 const UncertainParameterLine2D& line = facet.getFitLine();
155 ROOT::Math::XYVector flightDirection = line->tangential();
156 ROOT::Math::XYVector centralPos2D = line->closest(facet.getMiddleWire().getRefPos2D());
157 double alpha = ROOT::Math::VectorUtil::DeltaPhi(centralPos2D, flightDirection);
159 alpha = 0;
160 }
161
162 double startFlightTime =
164 double startDriftLength = computeDriftLength(facet.getStartRLWireHit(), startFlightTime, alpha);
165 facet.getStartRLWireHit().setRefDriftLength(startDriftLength);
166
167 double middleFlightTime =
169 double middleDriftLength = computeDriftLength(facet.getMiddleRLWireHit(), middleFlightTime, alpha);
170 facet.getMiddleRLWireHit().setRefDriftLength(middleDriftLength);
171
172 double endFlightTime =
174 double endDriftLength = computeDriftLength(facet.getEndRLWireHit(), endFlightTime, alpha);
175 facet.getEndRLWireHit().setRefDriftLength(endDriftLength);
176
177 cache.fitLine = line;
178 cache.alpha = alpha;
179 cache.middleFlightTime = middleFlightTime;
180 cache.startDriftLength = startDriftLength;
181 cache.endDriftLength = endDriftLength;
182 cache.valid = true;
183 } else {
184 // Only the middle hit depends on its right left passage hypothesis
185 facet.setFitLine(cache.fitLine);
186 facet.getStartRLWireHit().setRefDriftLength(cache.startDriftLength);
187 double middleDriftLength =
188 computeDriftLength(facet.getMiddleRLWireHit(), cache.middleFlightTime, cache.alpha);
189 facet.getMiddleRLWireHit().setRefDriftLength(middleDriftLength);
190 facet.getEndRLWireHit().setRefDriftLength(cache.endDriftLength);
191 }
192}
193
195{
196 for (CDCRecoHit2D& recoHit2D : segment) {
197 updateDriftLength(recoHit2D);
198 }
199}
200
202 double tanLambda)
203{
205
206 ROOT::Math::XYVector flightDirection = recoHit3D.getFlightDirection2D();
207 const ROOT::Math::XYZVector& recoPos3D = recoHit3D.getRecoPos3D();
208 const ROOT::Math::XYVector& recoPos2D = VectorUtil::getXYVector(recoPos3D);
209 double alpha = ROOT::Math::VectorUtil::DeltaPhi(recoPos2D, flightDirection);
210 const double beta = 1;
211 double flightTimeEstimate = FlightTimeEstimator::instance().getFlightTime2D(recoPos2D, alpha, beta);
212
213 if (std::isnan(tanLambda)) {
214 tanLambda = recoPos3D.z() / recoPos3D.Rho();
215 }
216 const double theta = M_PI / 2 - std::atan(tanLambda);
217 flightTimeEstimate *= hypot2(1, tanLambda);
218
219 const CDCWire& wire = recoHit3D.getWire();
220 const CDCHit* hit = recoHit3D.getWireHit().getHit();
221 const bool rl = recoHit3D.getRLInfo() == ERightLeft::c_Right;
222 double driftLength =
223 tdcCountTranslator.getDriftLength(hit->getTDCCount(),
224 wire.getWireID(),
225 flightTimeEstimate,
226 rl,
227 recoPos3D.z(),
228 alpha,
229 theta,
230 hit->getADCCount());
231 if (driftLength > -2 and driftLength < 16) {
232 bool snapRecoPos = true;
233 recoHit3D.setRecoDriftLength(driftLength, snapRecoPos);
234 }
235 return driftLength;
236}
237
238
240 const double tanLambda)
241{
242 for (CDCRecoHit3D& recoHit3D : segment3D) {
243 updateDriftLength(recoHit3D, tanLambda);
244 }
245}
246
248 const double tanLambda)
249{
250 for (CDCRecoHit3D& recoHit3D : track) {
251 updateDriftLength(recoHit3D, tanLambda);
252 }
253}
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.
static const FlightTimeEstimator & instance(std::unique_ptr< FlightTimeEstimator > replacement=nullptr)
Getter for the instance.
virtual double getFlightTime2D(const ROOT::Math::XYVector &, double, double=1) const
Default estimator for the flight time.
Class representing a triple of neighboring oriented wire with additional trajectory information.
Definition CDCFacet.h:33
ROOT::Math::XYVector getMiddleRecoPos2D() const
Getter for the reconstructed position at the second hit on the fit line.
Definition CDCFacet.cc:77
ROOT::Math::XYVector 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:63
void setFitLine(const UncertainParameterLine2D &fitLine) const
Setter for the contained line fit information.
Definition CDCFacet.h:69
ROOT::Math::XYVector 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.
ROOT::Math::XYVector getFlightDirection2D() const
Getter for the direction of flight.
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.
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 ROOT::Math::XYZVector & getRecoPos3D() const
Getter for the 3d position of the hit.
ROOT::Math::XYVector getFlightDirection2D() const
Getter for the direction of flight.
const CDC::CDCWire & getWire() const
Getter for the wire.
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:37
const CDCHit * getHit() const
Getter for the CDCHit pointer into the StoreArray.
Definition CDCWireHit.h:160
A parameter line including including an line covariance matrix which is interpreted as located in the...
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.
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.