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::ConstTrackStateType trackStateType)
43 {
44 static constexpr std::array<std::tuple<bool, Acts::TrackStateFlag, char>, 6> trackStateNames{{
45 {false, Acts::TrackStateFlag::ParameterFlag, '-'},
46 {true, Acts::TrackStateFlag::MeasurementFlag, 'M'},
47 {true, Acts::TrackStateFlag::OutlierFlag, 'O'},
48 {true, Acts::TrackStateFlag::HoleFlag, 'H'},
49 {true, Acts::TrackStateFlag::MaterialFlag, 'm'},
50 {true, Acts::TrackStateFlag::SharedHitFlag, '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) {
96 acts_detector_element = dynamic_cast<const ActsDetectorElement *>(measurement_surface->associatedDetectorElement());
97 if (acts_detector_element) {
98 const InDetDD::SiDetectorElement *detElem = dynamic_cast< const InDetDD::SiDetectorElement *>(acts_detector_element->upstreamDetectorElement());
99 if (detElem) {
100 if (auto idHelper = detElem->getIdHelper())
101 {
102 auto name = idHelper->show_to_string(detElem->identify());
103 if (name.size() >= 2 && name[0] == '[' && name[name.size() - 1] == ']')
104 {
105 return name.substr(1, name.size() - 2);
106 }
107 else
108 {
109 return name;
110 }
111 }
112 }
113 }
114 }
115 return {};
116 }
117
118 static void printHeader(int type, bool extra = false)
119 {
120 std::cout << std::left
121 << std::setw(5) << "Index" << ' '
122 << std::setw(4) << "Type" << ' '
123 << std::setw(21) << "SurfaceBounds" << ' ';
124 if (type == 0)
125 {
126 std::cout << std::setw(22) << "GeometryId" << ' '
127 << std::setw(20) << "ATLAS ID" << ' '
128 << std::right
129 << std::setw(10) << "loc0" << ' '
130 << std::setw(10) << "loc1"
131 << " "
132 << std::setw(9) << "R" << ' '
133 << std::setw(9) << "Pos Z" << ' '
134 << std::setw(9) << "phid" << ' '
135 << std::setw(9) << "eta";
136 if (extra)
137 {
138 std::cout << ' '
139 << std::setw(10) << "Trk loc0" << ' '
140 << std::setw(10) << "loc1"
141 << " "
142 << std::setw(9) << "Trk R" << ' '
143 << std::setw(9) << "phid" << ' '
144 << std::setw(9) << "eta" << ' '
145 << std::setw(10) << "g2l loc0" << ' '
146 << std::setw(10) << "loc1";
147 }
148 std::cout << '\n';
149 static std::atomic<int> kilroy = 0;
150 if (!(kilroy++))
151 {
152 std::cout << "R (mm) and phi (degrees). Estimated local coordinate indicated by \"*\" (from SP), \"o\" (from module center), or \"#\" (globalToLocal(center) failure).";
153 if (extra)
154 std::cout << " Athena/ACTS comparison only shown if different.";
155 std::cout << '\n';
156 }
157 }
158 if (type == 1)
159 {
160 std::cout << std::setw(22) << "GeometryId/meas/stats" << ' '
161 << std::right
162 << std::setw(10) << "loc0" << ' '
163 << std::setw(10) << "loc1" << ' '
164 << std::setw(9) << "Pos R" << ' '
165 << std::setw(9) << "Pos Z" << ' '
166 << std::setw(9) << "phid" << ' '
167 << std::setw(9) << "eta" << ' '
168 << std::setw(9) << "q*pT" << ' '
169 << std::setw(9) << "phid" << ' '
170 << std::setw(9) << "eta" << ' '
171 << std::setw(6) << "TrkLen" << ' '
172 << std::setw(7) << "chi2" << ' '
173 << std::setw(6) << "Flags" << '\n';
174 }
175 }
176
177 static void
178 printVec3(const Acts::Vector3 &p)
179 {
180 std::cout << std::fixed << ' '
181 << std::setw(9) << std::setprecision(3) << p.head<2>().norm() << ' '
182 << std::setw(9) << std::setprecision(3) << p[2] << ' '
183 << std::setw(9) << std::setprecision(3) << std::atan2(p[1], p[0]) / Acts::UnitConstants::degree << ' '
184 << std::setw(9) << std::setprecision(5) << std::atanh(p[2] / p.norm())
185 << std::defaultfloat << std::setprecision(-1);
186 }
187
188 static void
189 printVec3(const Acts::Vector3 &p, const Acts::Vector3 &cmp, int precision = 3)
190 {
191 if (((p - cmp).array().abs() >= 0.5 * std::pow(10.0, -precision)).any())
192 {
193 printVec3(p);
194 }
195 else
196 {
197 std::cout << std::setw(30) << "";
198 }
199 }
200
201 static void
202 printVec2(const Acts::Vector2 &p, const char *estimated = nullptr)
203 {
204 const char e0 = estimated ? estimated[0] : ' ';
205 const char *e1 = estimated ? estimated + 1 : "";
206 std::cout << std::fixed << ' '
207 << std::setw(10) << std::setprecision(4) << p[0] << e0
208 << std::setw(10) << std::setprecision(4) << p[1] << e1
209 << std::defaultfloat << std::setprecision(-1);
210 }
211
212 static void
213 printVec2(const Acts::Vector2 &p, const Acts::Vector2 &cmp, const char *estimated = nullptr, int precision = 4)
214 {
215 if (((p - cmp).array().abs() >= 0.5 * std::pow(10.0, -precision)).any())
216 {
217 printVec2(p, estimated);
218 }
219 else
220 {
221 std::cout << std::setw(22 + (estimated ? 1 : 0)) << "";
222 }
223 }
224
225 static void
226 printMeasurement(const Acts::GeometryContext &tgContext,
227 const Acts::Surface *surface,
228 const std::tuple<Acts::Vector2, Amg::Vector2D, int, int> &locData,
229 bool compareMeasurementTransforms = false)
230 {
231 auto &[loc, locTrk, measInd, est] = locData;
232 int flag = est < 0 ? est : 2 * est + measInd;
233 int flagTrk = est < 0 ? est : 2 * est;
234 // indicates coordinate that is estimated: *=from SP, o=from module center, #=globalToLocal(center) failure
235 static const std::map<int, const char *> estimated_flags{{-1, " "},
236 {0, " *"},
237 {1, "* "},
238 {2, " o"},
239 {3, "o "},
240 {4, " #"},
241 {5, "# "}};
242 printVec2(loc, estimated_flags.at(flag));
243
244 if (surface)
245 {
246 // momentum direction doesn't seem to be needed for measurement surfaces (only LineSurface?)
247 auto glob = surface->localToGlobal(tgContext, loc, Acts::Vector3::Zero());
248 printVec3(glob);
249
250 if (compareMeasurementTransforms)
251 {
252 const ActsDetectorElement *
253 acts_detector_element = dynamic_cast<const ActsDetectorElement *>(surface->associatedDetectorElement());
254 if (acts_detector_element) {
255 const InDetDD::SiDetectorElement *detElem = dynamic_cast< const InDetDD::SiDetectorElement *>(acts_detector_element->upstreamDetectorElement());
256
257 // if measInd=1: won't match because comparing x,y and R,phi, but at least not phi,R.
258 // This is still useful for debugging because the next test also fails.
259 printVec2(locTrk, (measInd == 1 ? loc.reverse() : loc), estimated_flags.at(flagTrk));
260
261 if (detElem)
262 {
263 auto globTrk = detElem->surface().localToGlobal(locTrk);
264 printVec3(globTrk, glob);
265
266 auto res = surface->globalToLocal(tgContext, globTrk, Acts::Vector3::Zero());
267 if (!res.ok())
268 {
269 std::cout << " ** " << res.error() << " **";
270 }
271 else
272 {
273 printVec2(res.value(), loc);
274 }
275 }
276 }
277 }
278
279 }
280 std::cout << std::defaultfloat << std::setprecision(-1);
281 }
282
283 static std::tuple<Acts::Vector2, Amg::Vector2D, int, int>
284 localPositionStrip2D(const Acts::GeometryContext &tgContext,
285 const xAOD::UncalibratedMeasurement &measurement,
286 const Acts::Surface *surface,
287 const xAOD::SpacePoint *sp)
288 {
289 auto *disc = dynamic_cast<const Acts::DiscSurface *>(surface);
290 Acts::Vector2 loc{Acts::Vector2::Zero()};
291 int est = 2; // est = 0 (estimated from SP), 1 (from module center), 2 (globalToLocal(center) failure), -1 (pixel)
292 if (surface)
293 {
294 if (sp)
295 {
296 auto res = surface->globalToLocal(tgContext, sp->globalPosition().cast<double>(), Acts::Vector3::Zero());
297 if (res.ok())
298 {
299 loc = res.value();
300 est = 0;
301 }
302 }
303
304 if (est != 0)
305 {
306 if (auto *annulus = dynamic_cast<const Acts::AnnulusBounds *>(&surface->bounds()))
307 {
308 loc[0] = 0.5 * (annulus->rMin() + annulus->rMax());
309 est = 1;
310 }
311 else
312 {
313 auto res = surface->globalToLocal(tgContext, surface->center(tgContext), Acts::Vector3::Zero());
314 if (res.ok())
315 {
316 loc = res.value();
317 est = 1;
318 }
319 }
320 }
321 }
322
323 const int measInd = disc ? 1 : 0;
324 loc[measInd] = measurement.localPosition<1>()[0];
325 if (disc)
326 {
327 Amg::Vector2D locTrk{disc->localPolarToCartesian(loc).reverse()};
328 locTrk[0] = -locTrk[0];
329 return {loc, locTrk, measInd, est};
330 }
331 else
332 {
333 return {loc, loc, measInd, est};
334 }
335 }
336
337 void
338 TrackStatePrinterTool::printMeasurementAssociatedSpacePoint(const Acts::GeometryContext &tgContext,
339 const xAOD::UncalibratedMeasurement *measurement,
340 const std::vector<small_vector<const xAOD::SpacePoint *>> &measToSp,
341 size_t offset) const {
342 if (!measurement)
343 return;
344
345 std::cout << std::setw(5) << (measurement->index() + offset) << ' '
346 << std::setw(3) << measurement->numDimensions() << "D ";
347
348 const Acts::Surface *surface_ptr = m_surfAcc.get(measurement);
349 if (!surface_ptr)
350 {
351 std::cout << std::setw(20 + 22 + 20 + 2) << "** no surface for measurement **";
352 }
353 else
354 {
355 std::cout << std::left;
356 std::cout << std::setw(21) << actsSurfaceName(*surface_ptr) << ' '
357 << std::setw(22) << to_string(surface_ptr->geometryId()) << ' ';
358 std::cout << std::setw(20) << atlasSurfaceName(surface_ptr);
359 std::cout << std::right;
360 }
361
362 if (measurement->type() == xAOD::UncalibMeasType::PixelClusterType)
363 {
364 const auto loc = measurement->localPosition<2>().cast<double>();
365 printMeasurement(tgContext, surface_ptr, {loc, loc, -1, -1}, m_compareMeasurementTransforms);
366 }
367 else if (measurement->type() == xAOD::UncalibMeasType::StripClusterType)
368 {
369 const small_vector<const xAOD::SpacePoint *> &spvec = measToSp.at(measurement->index());
370 if (spvec.empty())
371 {
372 printMeasurement(tgContext, surface_ptr,
373 localPositionStrip2D(tgContext, *measurement, surface_ptr, nullptr),
375 }
376 else
377 {
378 size_t isp = 0;
379 for (auto *sp : spvec)
380 {
381 if (isp++)
382 {
383 std::cout << '\n'
384 << std::left
385 << std::setw(76) << to_string("** Spacepoint ", isp, " **")
386 << std::right;
387 }
388 printMeasurement(tgContext, surface_ptr,
389 localPositionStrip2D(tgContext, *measurement, surface_ptr, sp),
391 }
392 }
393 }
394 else if (measurement->type() == xAOD::UncalibMeasType::HGTDClusterType) {
395 const auto loc3D = measurement->localPosition<3>().cast<double>();
396 const std::tuple<Acts::Vector2, Amg::Vector2D, int, int> locTup = {Acts::Vector2{loc3D.head<2>()}, Amg::Vector2D{loc3D.head<2>()}, -1, -1};
397 printMeasurement(tgContext, surface_ptr, locTup, m_compareMeasurementTransforms);
398 }
399 std::cout << '\n';
400 }
401
402 void TrackStatePrinterTool::printParameters(const Acts::Surface &surface,
403 const Acts::GeometryContext &tgContext,
404 const Acts::BoundVector &bound)
405 {
406 auto p = Acts::transformBoundToFreeParameters(surface, tgContext, bound);
407 std::cout << std::fixed
408 << std::setw(10) << std::setprecision(4) << bound[Acts::eBoundLoc0] << ' '
409 << std::setw(10) << std::setprecision(4) << bound[Acts::eBoundLoc1] << ' '
410 << std::setw(9) << std::setprecision(3) << p.segment<2>(Acts::eFreePos0).norm() << ' '
411 << std::setw(9) << std::setprecision(3) << p[Acts::eFreePos2] << ' '
412 << std::setw(9) << std::setprecision(3) << std::atan2(p[Acts::eFreePos1], p[Acts::eFreePos0]) / Acts::UnitConstants::degree << ' '
413 << std::setw(9) << std::setprecision(5) << std::atanh(p[Acts::eFreePos2] / p.segment<3>(Acts::eFreePos0).norm()) << ' '
414 << std::setw(9) << std::setprecision(3) << p.segment<2>(Acts::eFreeDir0).norm() / p[Acts::eFreeQOverP] << ' '
415 << std::setw(9) << std::setprecision(3) << std::atan2(p[Acts::eFreeDir1], p[Acts::eFreeDir0]) / Acts::UnitConstants::degree << ' '
416 << std::setw(9) << std::setprecision(5) << std::atanh(p[Acts::eFreeDir2])
417 << std::defaultfloat << std::setprecision(-1);
418 }
419
424 {
425 ATH_MSG_DEBUG("Initializing " << name() << "...");
426 ATH_MSG_DEBUG("Properties Summary:");
429
432 ATH_CHECK(m_spacePointKey.initialize());
433
434 return StatusCode::SUCCESS;
435 }
436
437 void
438 TrackStatePrinterTool::printSeed(const Acts::GeometryContext &tgContext,
439 const ActsTrk::Seed &seed,
440 const Acts::BoundTrackParameters &initialParameters,
441 const detail::MeasurementIndex &measurementIndexer,
442 unsigned int iseed,
443 bool isKF) const
444 {
445 if (!isKF)
446 printHeader(1);
447
448 std::ostringstream os;
449 size_t nos = 0;
450 for (const auto *sp : seed.sp())
451 {
452 size_t nom = 0;
453 for (const auto *el : sp->measurements())
454 {
455 if (nom > 0)
456 os << '+';
457 else if (nos > 0)
458 os << ',';
459 ++nos;
460 ++nom;
461 os << measurementIndexer.index(*el);
462 }
463 }
464
465 std::cout << std::setw(5) << iseed << ' '
466 << std::left
467 << std::setw(4) << (!isKF ? "seed" : "KF") << ' '
468 << std::setw(21) << actsSurfaceName(initialParameters.referenceSurface()) << ' '
469 << std::setw(22) << to_string(os.str()) << ' '
470 << std::right;
471 printParameters(initialParameters.referenceSurface(), tgContext, initialParameters.parameters());
472 std::cout << '\n'
473 << std::flush;
474 }
475
476 void
478 const std::vector<const xAOD::UncalibratedMeasurementContainer *> &clusterContainers,
479 const std::vector<size_t> &offsets) const {
480
481 Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
482
483 auto measToSp = addSpacePoints(ctx, clusterContainers, offsets);
484
485 ATH_MSG_INFO("CKF input measurements:");
486 printHeader(0, m_compareMeasurementTransforms);
487
488 for (std::size_t icontainer = 0; icontainer < clusterContainers.size(); ++icontainer)
489 {
490 for (const auto *measurement : *clusterContainers[icontainer])
491 {
492 printMeasurementAssociatedSpacePoint(tgContext, measurement,
493 measToSp[icontainer], offsets[icontainer]);
494 }
495 }
496 std::cout << std::flush;
497 }
498
499 std::vector<std::vector<TrackStatePrinterTool::small_vector<const xAOD::SpacePoint *>>>
501 const std::vector<const xAOD::UncalibratedMeasurementContainer *> &clusterContainers,
502 const std::vector<size_t> &offsets) const
503 {
504 std::vector<std::vector<TrackStatePrinterTool::small_vector<const xAOD::SpacePoint *>>> measToSp{clusterContainers.size()};
505 for (std::size_t icontainer = 0; icontainer < clusterContainers.size(); ++icontainer)
506 {
507 measToSp[icontainer].resize(clusterContainers[icontainer]->size());
508 }
509
510 for (auto &spacePointKey : m_spacePointKey)
511 {
512 ATH_MSG_DEBUG("Retrieving from input SpacePoint collection '" << spacePointKey.key() << "' ...");
514 if (!handle.isValid())
515 {
516 ATH_MSG_ERROR("Error retrieving from input SpacePoint collection '" << spacePointKey.key() << "'");
517 continue;
518 }
519 ATH_MSG_DEBUG(" \\__ " << handle->size() << " elements!");
520 for (const auto *sp : *handle)
521 {
522 for (const xAOD::UncalibratedMeasurement *meas : sp->measurements())
523 {
524 if (!meas)
525 continue;
526 for (std::size_t icontainer = 0; icontainer < clusterContainers.size(); ++icontainer)
527 {
528 // This measurement may well be in a different clusterContainer. Skip all but the one we are interested in.
529 if (!(meas && meas->index() < clusterContainers[icontainer]->size() && meas == clusterContainers[icontainer]->at(meas->index())))
530 continue;
531 small_vector<const xAOD::SpacePoint *> &measSp = measToSp[icontainer].at(meas->index());
532 if (!measSp.empty())
533 {
534 ATH_MSG_INFO("Cluster "
535 << (meas->index() + offsets[icontainer])
536 << " used by SpacePoints at ("
537 << sp->globalPosition()[0] << ',' << sp->globalPosition()[1] << ',' << sp->globalPosition()[2]
538 << ") and ("
539 << measSp[0]->globalPosition()[0] << ',' << measSp[0]->globalPosition()[1] << ',' << measSp[0]->globalPosition()[2]
540 << ')');
541 }
542 measSp.push_back(sp);
543 }
544 }
545 }
546 }
547 return measToSp;
548 }
549
550} // namespace ActsTrk
#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)
std::pair< std::vector< unsigned int >, bool > res
const GeoVDetectorElement * upstreamDetectorElement() const
Returns the underllying GeoModel detectorelement that this one is based on.
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
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
Gaudi::Property< bool > m_printFilteredStates
static std::string trackStateName(Acts::ConstTrackStateType trackStateType)
========================================================================= file-local static functions...
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
void printSeed(const Acts::GeometryContext &tgContext, const ActsTrk::Seed &seed, const Acts::BoundTrackParameters &initialParameters, const detail::MeasurementIndex &measurementIndexer, unsigned int iseed, bool isKF) const
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.
size_t index() const
Return the index of this element within its container.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
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 globalPosition() const
Returns the global position of the pixel cluster.
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...
std::string to_string(const DetectorType &type)
Eigen::Matrix< double, 2, 1 > Vector2D
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
double e0(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in pre-sampler
double e1(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in 1st sampling
bool flag
Definition master.py:29
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.