ATLAS Offline Software
Loading...
Searching...
No Matches
TrackStatePrinterTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7
8// Athena
13
14// ACTS
15#include "Acts/Definitions/Units.hpp"
16#include "Acts/Definitions/Common.hpp"
17#include "Acts/Definitions/Algebra.hpp"
18#include "Acts/Surfaces/Surface.hpp"
19#include "Acts/Surfaces/AnnulusBounds.hpp"
20#include "Acts/Surfaces/SurfaceBounds.hpp"
21#include "Acts/Surfaces/DiscSurface.hpp"
22#include "Acts/EventData/TransformationHelpers.hpp"
23#include "Acts/Utilities/detail/OstreamStateGuard.hpp"
24
25// PACKAGE
28#include "ActsInterop/Logger.h"
29
31
32// Other
33#include <vector>
34#include <iostream>
35#include <sstream>
36
37using Acts::detail::OstreamStateGuard;
38
39namespace ActsTrk
40{
45
46 std::string TrackStatePrinterTool::trackStateName(Acts::ConstTrackStateTypeMap trackStateType)
47 {
48 static constexpr std::array<std::tuple<bool, Acts::TrackStateFlag, char>, 6> trackStateNames{{
49 {false, Acts::TrackStateFlag::HasParameters, '-'},
50 {true, Acts::TrackStateFlag::HasMeasurement, 'M'},
51 {true, Acts::TrackStateFlag::IsOutlier, 'O'},
52 {true, Acts::TrackStateFlag::IsHole, 'H'},
53 {true, Acts::TrackStateFlag::HasMaterial, 'm'},
54 {true, Acts::TrackStateFlag::IsSharedHit, 'S'},
55 }};
56 std::string s;
57 for (const auto &[b, f, c] : trackStateNames)
58 {
59 if (trackStateType.test(f) == b)
60 s += c;
61 }
62 return s;
63 }
64
65 // compact surface/boundary name
66 std::string TrackStatePrinterTool::actsSurfaceName(const Acts::Surface &surface)
67 {
68 const auto type = std::min(surface.type(), Acts::Surface::SurfaceType::Other);
69 std::string name{Acts::Surface::s_surfaceTypeNames[type]};
70 static const std::map<Acts::SurfaceBounds::BoundsType, const char *> boundsNames{{
71 {Acts::SurfaceBounds::BoundsType::eCone, "Cone"},
72 {Acts::SurfaceBounds::BoundsType::eCylinder, "Cylinder"},
73 {Acts::SurfaceBounds::BoundsType::eDiamond, "Diamond"},
74 {Acts::SurfaceBounds::BoundsType::eDisc, "Disc"},
75 {Acts::SurfaceBounds::BoundsType::eEllipse, "Ellipse"},
76 {Acts::SurfaceBounds::BoundsType::eLine, "Line"},
77 {Acts::SurfaceBounds::BoundsType::eRectangle, "Rectangle"},
78 {Acts::SurfaceBounds::BoundsType::eTrapezoid, "Trapezoid"},
79 {Acts::SurfaceBounds::BoundsType::eTriangle, "Triangle"},
80 {Acts::SurfaceBounds::BoundsType::eDiscTrapezoid, "DiscTrapezoid"},
81 {Acts::SurfaceBounds::BoundsType::eConvexPolygon, "ConvexPolygon"},
82 {Acts::SurfaceBounds::BoundsType::eAnnulus, "Annulus"},
83 {Acts::SurfaceBounds::BoundsType::eBoundless, "Boundless"},
84 {Acts::SurfaceBounds::BoundsType::eOther, "Other"},
85 }};
86 if (auto it = boundsNames.find(surface.bounds().type());
87 it != boundsNames.end() && it->second != name)
88 {
89 name += ' ';
90 name += it->second;
91 }
92 return name;
93 }
94
95 static std::string
96 atlasSurfaceName(const Acts::Surface *measurement_surface)
97 {
98 if (measurement_surface) {
99 const auto* acts_detector_element = getActsDetectorElement(measurement_surface);
100 if (acts_detector_element) {
101 const InDetDD::SiDetectorElement *detElem = dynamic_cast< const InDetDD::SiDetectorElement *>(acts_detector_element->upstreamDetectorElement());
102 if (detElem) {
103 if (auto idHelper = detElem->getIdHelper())
104 {
105 auto name = idHelper->show_to_string(detElem->identify());
106 if (name.size() >= 2 && name[0] == '[' && name[name.size() - 1] == ']')
107 {
108 return name.substr(1, name.size() - 2);
109 }
110 else
111 {
112 return name;
113 }
114 }
115 }
116 }
117 }
118 return {};
119 }
120
121 static void printHeader(int type, bool extra = false)
122 {
123 OstreamStateGuard s(std::cout);
124 std::cout << std::left
125 << std::setw(5) << "Index" << ' '
126 << std::setw(4) << "Type" << ' '
127 << std::setw(21) << "SurfaceBounds" << ' ';
128 if (type == 0)
129 {
130 std::cout << std::setw(22) << "GeometryId" << ' '
131 << std::setw(20) << "ATLAS ID" << ' '
132 << std::right
133 << std::setw(10) << "loc0" << ' '
134 << std::setw(10) << "loc1"
135 << " "
136 << std::setw(9) << "R" << ' '
137 << std::setw(9) << "Pos Z" << ' '
138 << std::setw(9) << "phid" << ' '
139 << std::setw(9) << "eta";
140 if (extra)
141 {
142 std::cout << ' '
143 << std::setw(10) << "Trk loc0" << ' '
144 << std::setw(10) << "loc1"
145 << " "
146 << std::setw(9) << "Trk R" << ' '
147 << std::setw(9) << "phid" << ' '
148 << std::setw(9) << "eta" << ' '
149 << std::setw(10) << "g2l loc0" << ' '
150 << std::setw(10) << "loc1";
151 }
152 std::cout << '\n';
153 static std::atomic<int> kilroy = 0;
154 if (!(kilroy++))
155 {
156 std::cout << "R (mm) and phi (degrees). Estimated local coordinate indicated by \"*\" (from SP), \"o\" (from module center), or \"#\" (globalToLocal(center) failure).";
157 if (extra)
158 std::cout << " Athena/ACTS comparison only shown if different.";
159 std::cout << '\n';
160 }
161 }
162 if (type == 1)
163 {
164 std::cout << std::setw(22) << "GeometryId/meas/stats" << ' '
165 << std::right
166 << std::setw(10) << "loc0" << ' '
167 << std::setw(10) << "loc1" << ' '
168 << std::setw(9) << "Pos R" << ' '
169 << std::setw(9) << "Pos Z" << ' '
170 << std::setw(9) << "phid" << ' '
171 << std::setw(9) << "eta" << ' '
172 << std::setw(9) << "q*pT" << ' '
173 << std::setw(9) << "phid" << ' '
174 << std::setw(9) << "eta" << ' '
175 << std::setw(6) << "TrkLen" << ' '
176 << std::setw(7) << "chi2" << ' '
177 << std::setw(6) << "Flags" << '\n';
178 }
179 }
180
181 static void
182 printVec3(const Acts::Vector3 &p)
183 {
184 OstreamStateGuard s(std::cout);
185 std::cout << std::fixed << ' '
186 << std::setw(9) << std::setprecision(3) << p.head<2>().norm() << ' '
187 << std::setw(9) << std::setprecision(3) << p[2] << ' '
188 << std::setw(9) << std::setprecision(3) << std::atan2(p[1], p[0]) / Acts::UnitConstants::degree << ' '
189 << std::setw(9) << std::setprecision(5) << std::atanh(p[2] / p.norm());
190
191 }
192
193 static void
194 printVec3(const Acts::Vector3 &p, const Acts::Vector3 &cmp, int precision = 3)
195 {
196 if (((p - cmp).array().abs() >= 0.5 * std::pow(10.0, -precision)).any())
197 {
198 printVec3(p);
199 }
200 else
201 {
202 std::cout << std::setw(30) << "";
203 }
204 }
205
206 static void
207 printVec2(const Acts::Vector2 &p, const char *estimated = nullptr)
208 {
209 OstreamStateGuard s(std::cout);
210 const char e0 = estimated ? estimated[0] : ' ';
211 const char *e1 = estimated ? estimated + 1 : "";
212 std::cout << std::fixed << ' '
213 << std::setw(10) << std::setprecision(4) << p[0] << e0
214 << std::setw(10) << std::setprecision(4) << p[1] << e1;
215
216 }
217
218 static void
219 printVec2(const Acts::Vector2 &p, const Acts::Vector2 &cmp, const char *estimated = nullptr, int precision = 4)
220 {
221 if (((p - cmp).array().abs() >= 0.5 * std::pow(10.0, -precision)).any())
222 {
223 printVec2(p, estimated);
224 }
225 else
226 {
227 std::cout << std::setw(22 + (estimated ? 1 : 0)) << "";
228 }
229 }
230
231 static void
232 printMeasurement(const Acts::GeometryContext &tgContext,
233 const Acts::Surface *surface,
234 const std::tuple<Acts::Vector2, Amg::Vector2D, int, int> &locData,
235 bool compareMeasurementTransforms = false)
236 {
237 OstreamStateGuard s(std::cout);
238 auto &[loc, locTrk, measInd, est] = locData;
239 int flag = est < 0 ? est : 2 * est + measInd;
240 int flagTrk = est < 0 ? est : 2 * est;
241 // indicates coordinate that is estimated: *=from SP, o=from module center, #=globalToLocal(center) failure
242 static const std::map<int, const char *> estimated_flags{{-1, " "},
243 {0, " *"},
244 {1, "* "},
245 {2, " o"},
246 {3, "o "},
247 {4, " #"},
248 {5, "# "}};
249 printVec2(loc, estimated_flags.at(flag));
250
251 if (surface)
252 {
253 // momentum direction doesn't seem to be needed for measurement surfaces (only LineSurface?)
254 auto glob = surface->localToGlobal(tgContext, loc, Acts::Vector3::Zero());
255 printVec3(glob);
256
257 if (compareMeasurementTransforms) {
258 const auto* acts_detector_element = getActsDetectorElement(surface);
259 if (acts_detector_element) {
260 const InDetDD::SiDetectorElement *detElem = dynamic_cast< const InDetDD::SiDetectorElement *>(acts_detector_element->upstreamDetectorElement());
261
262 // if measInd=1: won't match because comparing x,y and R,phi, but at least not phi,R.
263 // This is still useful for debugging because the next test also fails.
264 printVec2(locTrk, (measInd == 1 ? loc.reverse() : loc), estimated_flags.at(flagTrk));
265
266 if (detElem)
267 {
268 auto globTrk = detElem->surface().localToGlobal(locTrk);
269 printVec3(globTrk, glob);
270
271 auto res = surface->globalToLocal(tgContext, globTrk, Acts::Vector3::Zero());
272 if (!res.ok())
273 {
274 std::cout << " ** " << res.error() << " **";
275 }
276 else
277 {
278 printVec2(res.value(), loc);
279 }
280 }
281 }
282 }
283
284 }
285 }
286
287 static std::tuple<Acts::Vector2, Amg::Vector2D, int, int>
288 localPositionStrip2D(const Acts::GeometryContext &tgContext,
289 const xAOD::UncalibratedMeasurement &measurement,
290 const Acts::Surface *surface,
291 const xAOD::SpacePoint *sp)
292 {
293 auto *disc = dynamic_cast<const Acts::DiscSurface *>(surface);
294 Acts::Vector2 loc{Acts::Vector2::Zero()};
295 int est = 2; // est = 0 (estimated from SP), 1 (from module center), 2 (globalToLocal(center) failure), -1 (pixel)
296 if (surface)
297 {
298 if (sp)
299 {
300 auto res = surface->globalToLocal(tgContext, sp->globalPosition().cast<double>(), Acts::Vector3::Zero());
301 if (res.ok())
302 {
303 loc = res.value();
304 est = 0;
305 }
306 }
307
308 if (est != 0)
309 {
310 if (auto *annulus = dynamic_cast<const Acts::AnnulusBounds *>(&surface->bounds()))
311 {
312 loc[0] = 0.5 * (annulus->rMin() + annulus->rMax());
313 est = 1;
314 }
315 else
316 {
317 auto res = surface->globalToLocal(tgContext, surface->center(tgContext), Acts::Vector3::Zero());
318 if (res.ok())
319 {
320 loc = res.value();
321 est = 1;
322 }
323 }
324 }
325 }
326
327 const int measInd = disc ? 1 : 0;
328 loc[measInd] = measurement.localPosition<1>()[0];
329 if (disc)
330 {
331 Amg::Vector2D locTrk{disc->localPolarToCartesian(loc).reverse()};
332 locTrk[0] = -locTrk[0];
333 return {loc, locTrk, measInd, est};
334 }
335 else
336 {
337 return {loc, loc, measInd, est};
338 }
339 }
340
341 void
342 TrackStatePrinterTool::printMeasurementAssociatedSpacePoint(const Acts::GeometryContext &tgContext,
343 const xAOD::UncalibratedMeasurement *measurement,
344 const std::vector<small_vector<const xAOD::SpacePoint *>> &measToSp,
345 size_t offset) const {
346 if (!measurement)
347 return;
348
349 std::cout << std::setw(5) << (measurement->index() + offset) << ' '
350 << std::setw(3) << measurement->numDimensions() << "D ";
351
352 const Acts::Surface *surface_ptr = m_surfAcc.get(measurement);
353 if (!surface_ptr)
354 {
355 std::cout << std::setw(20 + 22 + 20 + 2) << "** no surface for measurement **";
356 }
357 else
358 {
359 std::cout << std::left;
360 std::cout << std::setw(21) << actsSurfaceName(*surface_ptr) << ' '
361 << std::setw(22) << to_string(surface_ptr->geometryId()) << ' ';
362 std::cout << std::setw(20) << atlasSurfaceName(surface_ptr);
363 std::cout << std::right;
364 }
365
366 if (measurement->type() == xAOD::UncalibMeasType::PixelClusterType)
367 {
368 const auto loc = measurement->localPosition<2>().cast<double>();
369 printMeasurement(tgContext, surface_ptr, {loc, loc, -1, -1}, m_compareMeasurementTransforms);
370 }
371 else if (measurement->type() == xAOD::UncalibMeasType::StripClusterType)
372 {
373 if (measurement->index() >= measToSp.size() || measToSp.at(measurement->index()).empty()) {
374 // If we didn't load the SpacePoints, then just print the 1D measurement coordinates.
375 // **TODO** fix bug where measToSp isn't completely filled for ITkActsLargeRadiusPass.
376 // The other entries are empty, so it doesn't really make a difference.
377 printMeasurement(tgContext, surface_ptr,
378 localPositionStrip2D(tgContext, *measurement, surface_ptr, nullptr),
380 ATH_MSG_DEBUG("No SpacePoints for strip measurement " << measurement->index() << " (" << measToSp.size() << " associated SPs)");
381 } else {
382 size_t isp = 0;
383 for (auto *sp : measToSp.at(measurement->index()))
384 {
385 if (isp++)
386 {
387 std::cout << '\n'
388 << std::left
389 << std::setw(76) << to_string("** Spacepoint ", isp, " **")
390 << std::right;
391 }
392 printMeasurement(tgContext, surface_ptr,
393 localPositionStrip2D(tgContext, *measurement, surface_ptr, sp),
395 }
396 }
397 }
398 else if (measurement->type() == xAOD::UncalibMeasType::HGTDClusterType) {
399 const auto loc3D = measurement->localPosition<3>().cast<double>();
400 const std::tuple<Acts::Vector2, Amg::Vector2D, int, int> locTup = {Acts::Vector2{loc3D.head<2>()}, Amg::Vector2D{loc3D.head<2>()}, -1, -1};
401 printMeasurement(tgContext, surface_ptr, locTup, m_compareMeasurementTransforms);
402 }
403 std::cout << '\n';
404 }
405
406 void TrackStatePrinterTool::printParameters(const Acts::Surface &surface,
407 const Acts::GeometryContext &tgContext,
408 const Acts::BoundVector &bound)
409 {
410 OstreamStateGuard s(std::cout);
411 auto p = Acts::transformBoundToFreeParameters(surface, tgContext, bound);
412 std::cout << std::fixed
413 << std::setw(10) << std::setprecision(4) << bound[Acts::eBoundLoc0] << ' '
414 << std::setw(10) << std::setprecision(4) << bound[Acts::eBoundLoc1] << ' '
415 << std::setw(9) << std::setprecision(3) << p.segment<2>(Acts::eFreePos0).norm() << ' '
416 << std::setw(9) << std::setprecision(3) << p[Acts::eFreePos2] << ' '
417 << std::setw(9) << std::setprecision(3) << std::atan2(p[Acts::eFreePos1], p[Acts::eFreePos0]) / Acts::UnitConstants::degree << ' '
418 << std::setw(9) << std::setprecision(5) << std::atanh(p[Acts::eFreePos2] / p.segment<3>(Acts::eFreePos0).norm()) << ' '
419 << std::setw(9) << std::setprecision(3) << p.segment<2>(Acts::eFreeDir0).norm() / p[Acts::eFreeQOverP] << ' '
420 << std::setw(9) << std::setprecision(3) << std::atan2(p[Acts::eFreeDir1], p[Acts::eFreeDir0]) / Acts::UnitConstants::degree << ' '
421 << std::setw(9) << std::setprecision(5) << std::atanh(p[Acts::eFreeDir2]);
422 }
423
428 {
429 ATH_MSG_DEBUG("Initializing " << name() << "...");
430 ATH_MSG_DEBUG("Properties Summary:");
433
435 ATH_CHECK(m_ctxProvider.initialize());
437 ATH_CHECK(m_spacePointKey.initialize());
438
439 return StatusCode::SUCCESS;
440 }
441
442 void
443 TrackStatePrinterTool::printSeed(const Acts::GeometryContext &tgContext,
444 const ActsTrk::Seed &seed,
445 const Acts::BoundTrackParameters &initialParameters,
446 const detail::MeasurementIndex &measurementIndexer,
447 unsigned int iseed,
448 bool isKF) const
449 {
450 if (!isKF)
451 printHeader(1);
452
453 std::ostringstream os;
454 size_t nos = 0;
455 for (const auto *sp : seed.sp())
456 {
457 size_t nom = 0;
458 for (const auto *el : sp->measurements())
459 {
460 if (nom > 0)
461 os << '+';
462 else if (nos > 0)
463 os << ',';
464 ++nos;
465 ++nom;
466 os << measurementIndexer.index(*el);
467 }
468 }
469
470 std::cout << std::setw(5) << iseed << ' '
471 << std::left
472 << std::setw(4) << (!isKF ? "seed" : "KF") << ' '
473 << std::setw(21) << actsSurfaceName(initialParameters.referenceSurface()) << ' '
474 << std::setw(22) << to_string(os.str()) << ' '
475 << std::right;
476 printParameters(initialParameters.referenceSurface(), tgContext, initialParameters.parameters());
477 std::cout << '\n'
478 << std::flush;
479 }
480
481 void
483 const std::vector<const xAOD::UncalibratedMeasurementContainer *> &clusterContainers,
484 const std::vector<size_t> &offsets) const {
485
486 const Acts::GeometryContext tgContext = m_ctxProvider.getGeometryContext(ctx);
487
488 auto measToSp = addSpacePoints(ctx, clusterContainers, offsets);
489
490 ATH_MSG_INFO("CKF input measurements:");
492
493 for (std::size_t icontainer = 0; icontainer < clusterContainers.size(); ++icontainer)
494 {
495 for (const auto *measurement : *clusterContainers[icontainer])
496 {
497 printMeasurementAssociatedSpacePoint(tgContext, measurement,
498 measToSp[icontainer], offsets[icontainer]);
499 }
500 }
501 std::cout << std::flush;
502 }
503
504 std::vector<std::vector<TrackStatePrinterTool::small_vector<const xAOD::SpacePoint *>>>
506 const std::vector<const xAOD::UncalibratedMeasurementContainer *> &clusterContainers,
507 const std::vector<size_t> &offsets) const
508 {
509 std::vector<std::vector<TrackStatePrinterTool::small_vector<const xAOD::SpacePoint *>>> measToSp{clusterContainers.size()};
510 for (std::size_t icontainer = 0; icontainer < clusterContainers.size(); ++icontainer)
511 {
512 measToSp[icontainer].resize(clusterContainers[icontainer]->size());
513 }
514
515 for (auto &spacePointKey : m_spacePointKey)
516 {
517 ATH_MSG_DEBUG("Retrieving from input SpacePoint collection '" << spacePointKey.key() << "' ...");
519 if (!handle.isValid())
520 {
521 ATH_MSG_ERROR("Error retrieving from input SpacePoint collection '" << spacePointKey.key() << "'");
522 continue;
523 }
524 ATH_MSG_DEBUG(" \\__ " << handle->size() << " elements!");
525 for (const auto *sp : *handle)
526 {
527 for (const xAOD::UncalibratedMeasurement *meas : sp->measurements())
528 {
529 if (!meas)
530 continue;
531 for (std::size_t icontainer = 0; icontainer < clusterContainers.size(); ++icontainer)
532 {
533 // This measurement may well be in a different clusterContainer. Skip all but the one we are interested in.
534 if (!(meas && meas->index() < clusterContainers[icontainer]->size() && meas == clusterContainers[icontainer]->at(meas->index())))
535 continue;
536 small_vector<const xAOD::SpacePoint *> &measSp = measToSp[icontainer].at(meas->index());
537 if (!measSp.empty())
538 {
539 ATH_MSG_INFO("Cluster "
540 << (meas->index() + offsets[icontainer])
541 << " used by SpacePoints at ("
542 << sp->globalPosition()[0] << ',' << sp->globalPosition()[1] << ',' << sp->globalPosition()[2]
543 << ") and ("
544 << measSp[0]->globalPosition()[0] << ',' << measSp[0]->globalPosition()[1] << ',' << measSp[0]->globalPosition()[2]
545 << ')');
546 }
547 measSp.push_back(sp);
548 }
549 }
550 }
551 }
552 return measToSp;
553 }
554
555} // namespace ActsTrk
const ActsDetectorElement * getActsDetectorElement(const Acts::Surface &surf)
Attempts to retrieve the ActsDetectorElement associated to the passed ActsSurface.
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
static std::string to_string(const std::vector< T > &v)
std::pair< std::vector< unsigned int >, bool > res
static Double_t sp
size_t size() const
Number of registered mappings.
static void printParameters(const Acts::Surface &surface, const Acts::GeometryContext &tgContext, const Acts::BoundVector &bound)
detail::xAODUncalibMeasSurfAcc m_surfAcc
SG::ReadHandleKeyArray< xAOD::SpacePointContainer > m_spacePointKey
void printMeasurementAssociatedSpacePoint(const Acts::GeometryContext &tgContext, const xAOD::UncalibratedMeasurement *measurement, const std::vector< small_vector< const xAOD::SpacePoint * > > &measToSp, size_t offset) const
static std::string trackStateName(Acts::ConstTrackStateTypeMap trackStateType)
========================================================================= file-local static functions...
Gaudi::Property< bool > m_printFilteredStates
Gaudi::Property< bool > m_compareMeasurementTransforms
void printMeasurements(const EventContext &ctx, const std::vector< const xAOD::UncalibratedMeasurementContainer * > &clusterContainers, const std::vector< size_t > &offsets) const
virtual StatusCode initialize() override
=========================================================================
boost::container::small_vector< T, N_SP_PER_MEAS > small_vector
ServiceHandle< ActsTrk::ITrackingGeometrySvc > m_trackingGeometrySvc
void printSeed(const Acts::GeometryContext &tgContext, const ActsTrk::Seed &seed, const Acts::BoundTrackParameters &initialParameters, const detail::MeasurementIndex &measurementIndexer, unsigned int iseed, bool isKF) const
ActsTrk::ContextUtility m_ctxProvider
Context provider for geometry, magnetic field and calibration contexts.
static std::string actsSurfaceName(const Acts::Surface &surface)
std::vector< std::vector< small_vector< const xAOD::SpacePoint * > > > addSpacePoints(const EventContext &ctx, const std::vector< const xAOD::UncalibratedMeasurementContainer * > &clusterContainers, const std::vector< size_t > &offset) const
std::size_t index(const xAOD::UncalibratedMeasurement &hit) const
Helper class to access the Acts::surface associated with an Uncalibrated xAOD measurement.
Class to hold geometrical description of a silicon detector element.
virtual Identifier identify() const override final
identifier of this detector element (inline)
const AtlasDetectorID * getIdHelper() const
Returns the id helper (inline).
Trk::Surface & surface()
Element Surface.
virtual void localToGlobal(const Amg::Vector2D &locp, const Amg::Vector3D &mom, Amg::Vector3D &glob) const =0
Specified by each surface type: LocalToGlobal method without dynamic memory allocation.
ConstVectorMap< N > localPosition() const
Returns the local position of the measurement.
virtual unsigned int numDimensions() const =0
Returns the number of dimensions of the measurement.
virtual xAOD::UncalibMeasType type() const =0
Returns the type of the measurement type as a simple enumeration.
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
static std::string atlasSurfaceName(const Acts::Surface *measurement_surface)
static void printVec3(const Acts::Vector3 &p)
static void printMeasurement(const Acts::GeometryContext &tgContext, const Acts::Surface *surface, const std::tuple< Acts::Vector2, Amg::Vector2D, int, int > &locData, bool compareMeasurementTransforms=false)
static std::tuple< Acts::Vector2, Amg::Vector2D, int, int > localPositionStrip2D(const Acts::GeometryContext &tgContext, const xAOD::UncalibratedMeasurement &measurement, const Acts::Surface *surface, const xAOD::SpacePoint *sp)
static void printHeader(int type, bool extra=false)
static void printVec2(const Acts::Vector2 &p, const char *estimated=nullptr)
Eigen::Matrix< double, 2, 1 > Vector2D
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.