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