14#include "Acts/Utilities/Helpers.hpp"
19 constexpr int truthColor = kOrange +2;
20 using SpacePointSet = std::unordered_set<const MuonR4::SpacePoint*>;
22 double inDegrees(
double angle) {
23 return angle / Gaudi::Units::deg;
29 using namespace MuonR4;
46 ATH_MSG_INFO(
"Hits linked to the following segment decorations are considered as truth");
49 if (decorName.empty()) {
51 return StatusCode::FAILURE;
65 ATH_MSG_ERROR(
"No bucket view enabled. Please enable at least one of the bucket views to visualize the buckets.");
66 return StatusCode::FAILURE;
69 ATH_MSG_ERROR(
"Multiple bucket views enabled. Please enable only one bucket view.");
70 return StatusCode::FAILURE;
72 return StatusCode::SUCCESS;
81 return !decor(hit).empty();
85 std::vector<const xAOD::UncalibratedMeasurement*> measurements{};
86 measurements.reserve(2* hits.size());
88 measurements.push_back(hit->primaryMeasurement());
89 if(hit->secondaryMeasurement()) {
90 measurements.push_back(hit->secondaryMeasurement());
99 for (
const SegLink_t& link : decor(*hit)) {
100 truthSegs.insert(*link);
107 const std::string& extraLabel,
108 PatternHitVisualInfoVec&& patternVisualVec)
const {
110 plotPatternBuckets(ctx, extraLabel, std::move(patternVisualVec), std::move(primitives));
113 const std::string& extraLabel,
114 PatternHitVisualInfoVec&& patternVisualVec,
116 if (patternVisualVec.empty()) {
117 ATH_MSG_VERBOSE(
"No pattern visual info available. Do not create visualization.");
121 for (PatternHitVisualInfo& patVisual : patternVisualVec) {
127 const std::string& extraLabel,
128 PatternHitVisualInfo&& patternVisual)
const {
134 const std::string& extraLabel,
135 PatternHitVisualInfo&& patternVisual,
138 PatternHitVisualInfo patternVisualCopy {patternVisual};
140 plotPatternBucket(ctx, extraLabel, *bucket, std::move(patternVisualCopy), std::move(extraPaintsCopy));
144 const std::string& extraLabel,
146 PatternHitVisualInfo&& patternVisual,
148 using PatternStatus = FastRecoVisualizationTool::PatternHitVisualInfo::PatternStatus;
149 using HitStatus = FastRecoVisualizationTool::PatternHitVisualInfo::HitStatus;
160 PatternStatus patStatus{patternVisual.status};
167 std::vector<const MuonR4::SpacePoint*> patHitsInBucket{};
171 if (std::ranges::find_if(bucket,
172 [hit](
const std::shared_ptr<MuonR4::SpacePoint>
sp) {
return sp.get() == hit; }) != bucket.end()) {
173 patHitsInBucket.push_back(hit);
187 canvas->add(std::move(extraPaints));
190 throw std::runtime_error(
"Failed to retrieve GeometryContext from EventStore");
202 canvas->setAxisTitles(
"y [mm]",
"z [mm]");
205 canvas->setAxisTitles(
"x [mm]",
"z [mm]");
208 canvas->setAxisTitles(
"z [mm]",
"R [mm]");
211 canvas->setAxisTitles(
"R [mm]",
"z [mm]");
215 if (!
drawHits(bucket, localToGlobalBucket, patHitsInBucket, *canvas, view)) {
222 drawSearchWindow(localToGlobalBucket, lines, patternVisual.thetaSearchMin, patternVisual.thetaSearchMax, *canvas, view);
225 for (
const auto&
sp : bucket) {
228 if (patternVisual.hitLineInfo.find(testHit) == patternVisual.hitLineInfo.end()) {
232 const HitStatus hitStatus {std::ranges::find(patternVisual.discardedHits, testHit) != patternVisual.discardedHits.end() ? HitStatus::eDiscarded :
233 (std::ranges::find(patternVisual.replacedHits, testHit) != patternVisual.replacedHits.end() ? HitStatus::eReplaced : HitStatus::eKept)};
236 const auto& [lineSlope, deltaRWindow] = patternVisual.hitLineInfo.at(testHit);
237 drawLineResidual(*geoCtx, localToGlobalBucket, lines, patternVisual.seed, testHit, lineSlope, deltaRWindow, hitStatus, *canvas, view);
242 auto printOnCanvas = [&lines, &yLegend](
const std::string& text){
243 lines.push_back(
drawLabel(text, 0.2, yLegend, 13));
247 printOnCanvas(std::format(
"Seed hit: {}",
m_idHelperSvc->toString(patternVisual.seed->identify())));
248 printOnCanvas(std::format(
"Chamber: {}",
m_idHelperSvc->toStringChamber(bucket.front()->identify())));
249 printOnCanvas(std::format(
"nPrec: {:d}", pat.nPrecisionHits()));
250 printOnCanvas(std::format(
"nEtaNonPrec: {:d}", pat.nEtaNonPrecisionHits()));
251 printOnCanvas(std::format(
"nPhi: {:d}", pat.nPhiHits()));
252 printOnCanvas(std::format(
"theta: {:.2f}^{{#circ}}", inDegrees(pat.theta())));
253 printOnCanvas(std::format(
"phi: {:.2f}^{{#circ}}", inDegrees(pat.phi())));
254 printOnCanvas(std::format(
"TotalResidual: {:.2f}", pat.totalResidual()));
255 printOnCanvas(std::format(
"Status: {}", patStatus == PatternStatus::eSuccessful ?
"Success" : (patStatus == PatternStatus::eFailed ?
"Fail" :
"Overlap")));
256 printOnCanvas(std::format(
"Sector: {:d}", pat.sector()));
257 printOnCanvas(std::format(
"OverlapSector: {:d}", pat.isSectorOverlap() ? pat.secondarySector() : -1));
260 bool drawnTrueLabel{
true};
262 drawSegment(*segment, localToGlobalBucket, lines, drawnTrueLabel, *canvas, view);
263 paintSimHits(*geoCtx, localToGlobalBucket, *segment, lines, view);
265 canvas->add(std::move(lines));
267 std::string legendLabel = std::format(
"Event: {:}, chamber : {:}, #{:}-view ({:})",
268 ctx.eventID().event_number(),
272 canvas->add(
drawLabel(legendLabel, 0.15, 0.96));
276 const double thetaMin,
277 const double thetaMax,
279 const View view)
const {
284 auto addSearchWindowLine = [&outputContainer, &localToGlobalBucket, &view, &canvas,
this](
const double globLineTheta){
285 constexpr double smallAngle {1e-3};
286 if (std::abs(globLineTheta) < smallAngle || std::abs(globLineTheta -
M_PI) < smallAngle) {
288 throw std::runtime_error(
"Unexpected horizontal pattern search line in global frame. Cannot draw search window.");
297 lineDirection = Acts::makeDirectionFromAxisTangents(0., tan(globLineTheta));
298 linePosition = Amg::Vector3D::Zero();
299 lowEnd = view ==
View::objViewZR ? canvas.corner(Edges::yLow) : canvas.corner(Edges::xLow);
300 upEnd = view ==
View::objViewZR ? canvas.corner(Edges::yHigh) : canvas.corner(Edges::xHigh);
303 const double globLinePhi {localToGlobalBucket.translation().phi()};
304 const Amg::Vector3D globLineDir {Acts::makeDirectionFromPhiTheta(globLinePhi,globLineTheta)};
305 lineDirection = localToGlobalBucket.inverse().linear() * globLineDir;
306 linePosition = localToGlobalBucket.inverse() * Amg::Vector3D::Zero();
307 lowEnd = canvas.corner(Edges::yLow);
308 upEnd = canvas.corner(Edges::yHigh);
310 outputContainer.emplace_back(
drawLine(lineDirection, linePosition,
311 lowEnd, upEnd, kOrange, kDashed, view));
313 addSearchWindowLine(thetaMin);
314 addSearchWindowLine(thetaMax);
321 const double lineSlope,
322 const double Rwindow,
323 const PatternHitVisualInfo::HitStatus status,
325 const View view)
const {
326 using HitStatus = PatternHitVisualInfo::HitStatus;
331 if (std::abs(lineSlope) < std::numeric_limits<double>::epsilon()) {
335 auto color {status == HitStatus::eKept ? kGreen : (status == HitStatus::eReplaced ? kPink : kGray)};
338 const Amg::Vector3D lineDir {Acts::makeDirectionFromAxisTangents(0., lineSlope)};
339 const Amg::Vector3D seedGlobalPos {seed->msSector()->localToGlobalTransform(gctx) * seed->localPosition()};
340 const Amg::Vector3D linePos {seedGlobalPos.perp()* Amg::Vector3D::UnitY() + seedGlobalPos.z() * Amg::Vector3D::UnitZ()};
342 const double seedGlobalR {seedGlobalPos.perp()};
343 const double testGlobalR {(localToGlobalBucket * testHit->
localPosition()).perp()};
344 const double testGlobalZ {(localToGlobalBucket * testHit->
localPosition()).z()};
345 const double lineIntercept {linePos.y() - lineSlope * linePos.z()};
346 const double line2WindowInters {lineSlope*testGlobalZ + lineIntercept};
349 if (seedGlobalR < testGlobalR) {
350 lowLimit = (seed->msSector() == testHit->
msSector() ?
351 seedGlobalR : (view ==
View::objViewZR ? canvas.corner(Edges::yLow) : canvas.corner(Edges::xLow)));
352 upLimit = line2WindowInters;
354 upLimit = (seed->msSector() == testHit->
msSector() ?
355 seedGlobalR : (view ==
View::objViewZR ? canvas.corner(Edges::yHigh) : canvas.corner(Edges::xHigh)));
356 lowLimit = line2WindowInters;
358 outputContainer.emplace_back(
drawLine(lineDir, linePos,
359 lowLimit, upLimit,
color, kDashed, view));
363 const Amg::Vector3D barLinePos {testGlobalZ* Amg::Vector3D::UnitZ()};
364 lowLimit = testGlobalR - Rwindow;
365 upLimit = testGlobalR + Rwindow;
366 outputContainer.emplace_back(
drawLine(barLineDir, barLinePos,
367 lowLimit, upLimit,
color, kDotted, view));
370 const double globLineTheta { lineSlope > 0 ? atan(lineSlope) : atan(lineSlope) +
M_PI };
371 const double globLinePhi {localToGlobalBucket.translation().phi()};
372 const Amg::Vector3D globLineDir {Acts::makeDirectionFromPhiTheta(globLinePhi,globLineTheta)};
373 const Amg::Vector3D locLineDir {localToGlobalBucket.inverse().linear() * globLineDir};
375 const Amg::Vector3D seedGlobalPos {seed->msSector()->localToGlobalTransform(gctx) * seed->localPosition()};
376 const Amg::Vector3D seedLocalPos {localToGlobalBucket.inverse() * seedGlobalPos};
380 const double testGlobalR {(localToGlobalBucket * testHit->
localPosition()).perp()};
381 double seedGlobalR {seedGlobalPos.perp()};
382 const bool isBarrel {seed->msSector()->barrel()};
383 const double line2WindowInters {
isBarrel ? Acts::detail::LineHelper::lineIntersect<3>(seedLocalPos, locLineDir, testLocalY* Amg::Vector3D::UnitY(), Amg::Vector3D::UnitZ()).position().z()
384 : Acts::detail::LineHelper::lineIntersect<3>(seedLocalPos, locLineDir, testLocalZ* Amg::Vector3D::UnitZ(), Amg::Vector3D::UnitY()).position().z()};
387 if (seedGlobalR < testGlobalR) {
388 lowLimit = (seed->msSector() == testHit->
msSector() ? seedLocalPos.z() : canvas.corner(Edges::yLow));
389 upLimit = line2WindowInters;
391 upLimit = (seed->msSector() == testHit->
msSector() ? seedLocalPos.z() : canvas.corner(Edges::yHigh));
392 lowLimit = line2WindowInters;
394 outputContainer.emplace_back(
drawLine(locLineDir, seedLocalPos,
395 lowLimit, upLimit,
color, kDashed, view));
399 const Amg::Vector3D barLinePos {
isBarrel ? testLocalY* Amg::Vector3D::UnitY() : testLocalZ* Amg::Vector3D::UnitZ()};
400 lowLimit =
isBarrel ? testLocalZ - Rwindow : testLocalY - Rwindow;
401 upLimit =
isBarrel ? testLocalZ + Rwindow : testLocalY + Rwindow;
402 outputContainer.emplace_back(
drawLine(barLineDir, barLinePos,
403 lowLimit, upLimit,
color, kDotted, view));
409 bool& drawnTrueLabel,
411 const View view)
const {
416 double lowEnd{canvas.corner(Edges::yLow)};
417 double highEnd{canvas.corner(Edges::yHigh)};
420 const Amg::Vector3D globDir {localToGlobalBucket.linear() * lineDir};
423 const double slopeRZ {(globPos.x()*globDir.x() + globPos.y()*globDir.y()) / (globPos.perp()*globDir.z())};
424 lineDir = Acts::makeDirectionFromAxisTangents(0., slopeRZ);
425 linePos = globPos.perp()* Amg::Vector3D::UnitY() + globPos.z() * Amg::Vector3D::UnitZ();
427 lowEnd = canvas.corner(Edges::xLow);
428 highEnd = canvas.corner(Edges::xHigh);
431 outputContainer.emplace_back(
drawLine(lineDir, linePos, lowEnd, highEnd,
432 truthColor, kDotted, view));
433 if (!drawnTrueLabel) {
435 drawnTrueLabel =
true;
442 const View view)
const {
450 re->measurementHash(simHit->identify()) :
451 re->layerHash(simHit->identify());
453 re->localToGlobalTransform(gctx, hash);
454 const Amg::Vector3D locPos = trf * xAOD::toEigen(simHit->localPosition());
455 const Amg::Vector3D locDir = trf.linear() * xAOD::toEigen(simHit->localDirection());
457 outputContainer.emplace_back(
drawArrow(locPos, locDir, truthColor, kDashed,
static_cast<int>(view)));
459 constexpr double arrowLength = 2.*Gaudi::Units::cm;
461 const Amg::Vector3D globDir {localToGlobalBucket.linear() * locDir};
463 const Amg::Vector3D end = globPos + (arrowLength / std::hypot(globDir.z(),globDir.perp()) ) * globDir;
464 auto arrow = view ==
View::objViewZR ? std::make_unique<TArrow>(globPos.z(), globPos.perp(), end.z(), end.perp(),0.01) :
465 std::make_unique<TArrow>(globPos.perp(), globPos.z(), end.perp(), end.z(),0.01);
466 arrow->SetLineColor(truthColor);
467 arrow->SetLineWidth(2);
468 arrow->SetLineStyle(kDashed);
469 outputContainer.emplace_back(std::move(arrow));
473 template<
class SpacePo
intType>
479 unsigned int fillStyle)
const {
483 if ((isEtaView && !hit.measuresEta()) || (view ==
View::objViewPhi && !hit.measuresPhi())) {
487 const Amg::Vector3D globalPos {localToGlobalBucket * localPos};
488 const auto expand = [&canvas, &hit](
double centerX,
double centerY) {
489 canvas.expandPad(centerX- hit.driftRadius(), centerY - hit.driftRadius());
490 canvas.expandPad(centerX+ hit.driftRadius(), centerY + hit.driftRadius());
494 expand(localPos[
static_cast<int>(view)], localPos.z());
496 expand(globalPos.z(), globalPos.perp());
498 expand(globalPos.perp(), globalPos.z());
503 constexpr int invalidCalibFill = 3305;
504 if constexpr (std::is_same_v<SpacePointType, SpacePoint>) {
508 if (dc->status() != Muon::MdtDriftCircleStatus::MdtStatusDriftTime) {
509 fillStyle = invalidCalibFill;
512 }
else if constexpr(std::is_same_v<SpacePointType, CalibratedSpacePoint>) {
513 underlyingSp = hit.spacePoint();
514 if (hit.fitState() == CalibratedSpacePoint::State::Valid) {
516 }
else if (hit.fitState() == CalibratedSpacePoint::State::FailedCalib) {
517 fillStyle = invalidCalibFill;
528 return globalPos.z()* Amg::Vector3D::UnitY() + globalPos.perp() * Amg::Vector3D::UnitZ();
530 return globalPos.z()* Amg::Vector3D::UnitZ() + globalPos.perp() * Amg::Vector3D::UnitY();
532 return Amg::Vector3D::Zero();
538 canvas.add(
drawDriftCircle(posInCanvas, dc->readoutElement()->innerTubeRadius(),
541 const int circColor =
isLabeled(*dc) ? truthColor : kBlue;
542 canvas.add(
drawDriftCircle(posInCanvas, hit.driftRadius(), circColor, fillStyle));
546 const int boxColor =
isLabeled(*meas) ? truthColor : kGreen +2;
547 const double boxWidth = 0.5*std::sqrt(12)*std::sqrt(underlyingSp->
covariance()[covIdx]);
548 canvas.add(
drawBox(posInCanvas, boxWidth, 0.5*meas->readoutElement()->gasGapPitch(),
549 boxColor, fillStyle, covIdx));
553 const int boxColor =
isLabeled(*meas) ? truthColor : kCyan + 2;
554 const double boxWidth = 0.5*std::sqrt(12)*std::sqrt(underlyingSp->
covariance()[covIdx]);
555 canvas.add(
drawBox(posInCanvas, boxWidth, 0.5*meas->readoutElement()->gasGapPitch(),
556 boxColor, fillStyle, covIdx));
560 const double boxWidth = 5*Gaudi::Units::mm;
561 canvas.add(
drawBox(posInCanvas, boxWidth, 10.*Gaudi::Units::mm, boxColor, fillStyle, covIdx));
567 const double boxWidth = 5*Gaudi::Units::mm;
568 canvas.add(
drawBox(posInCanvas, boxWidth, 10.*Gaudi::Units::mm, boxColor, fillStyle, covIdx));
571 ATH_MSG_WARNING(
"Please implement proper drawings of the new small wheel.. "<<__FILE__<<
":"<<__LINE__);
578 template<
class SpacePo
intType>
581 const std::vector<SpacePointType>& hitsToDraw,
583 const View view)
const {
585 SpacePointSet drawnPoints{};
586 for (
const SpacePointType& hit : hitsToDraw) {
589 for (
const SpacePointBucket::value_type& hit : bucket) {
591 if (drawnPoints.count(hit.get())) {
596 return drawnPoints.size() - drawnPoints.count(
nullptr) > 1;
601 const double highEnd,
604 const View view)
const {
606 using ParamDefs = MuonR4::SpacePoint::SeedingAux::FitParIndex;
607 auto makeLine = [](
const double x1,
const double y1,
const double x2,
const double y2,
const int color,
const int style){
608 auto line = std::make_unique<TLine>(x1, y1, x2, y2);
609 line->SetLineColor(
color);
610 line->SetLineWidth(2);
611 line->SetLineStyle(style);
617 if (std::abs(lineDirection.z()) < std::numeric_limits<double>::epsilon()) {
619 return makeLine(lowEnd, linePoint.z(), highEnd, linePoint.z(),
color, lineStyle);
622 linePoint +
Amg::intersect<3>(linePoint,lineDirection,Amg::Vector3D::UnitZ(), highEnd).value_or(0.)* lineDirection,
623 color, lineStyle,
static_cast<int>(view));
627 if (std::abs(lineDirection.y()) < std::numeric_limits<double>::epsilon()) {
631 return makeLine(lowEnd, linePoint.y(), highEnd, linePoint.y(),
color, lineStyle);
634 return makeLine(linePoint.y(), lowEnd, linePoint.y(), highEnd,
color, lineStyle);
636 }
else if (std::abs(lineDirection.z()) < std::numeric_limits<double>::epsilon()) {
640 return makeLine(linePoint.z(), lowEnd, linePoint.z(), highEnd,
color, lineStyle);
643 return makeLine(lowEnd, linePoint.z(), highEnd, linePoint.z(),
color, lineStyle);
646 const double slope {lineDirection.y() / lineDirection.z()};
647 const double intercept {linePoint.y() - slope * linePoint.z()};
648 const double Zlow {(lowEnd - intercept) / slope};
649 const double Zhigh {(highEnd - intercept) / slope};
652 return makeLine(Zlow, lowEnd, Zhigh, highEnd,
color, lineStyle);
655 return makeLine(lowEnd, Zlow, highEnd, Zhigh,
color, lineStyle);
const boost::regex re(r_e)
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
This is a "hash" representation of an Identifier.
MuonReadoutElement is an abstract class representing the geometry of a muon detector.
bool barrel() const
Returns whether the sector is placed in the barrel.
const Amg::Transform3D & localToGlobalTransform(const ActsTrk::GeometryContext &gctx) const
Returns the local -> global tarnsformation from the sector.
std::string identString() const
Returns a string encoding the chamber index & the sector of the MS sector.
Data class to represent an eta maximum in hough space.
: The muon space point bucket represents a collection of points that will bre processed together in t...
const MuonGMR4::SpectrometerSector * msSector() const
returns th associated muonChamber
unsigned int bucketId() const
Returns the Identifier in the context of the MuonChamber.
The muon space point is the combination of two uncalibrated measurements one of them measures the eta...
const xAOD::UncalibratedMeasurement * secondaryMeasurement() const
const Amg::Vector3D & localPosition() const
const Cov_t & covariance() const
Returns the covariance array.
const xAOD::UncalibratedMeasurement * primaryMeasurement() const
const MuonGMR4::SpectrometerSector * msSector() const
Property holding a SG store/key/clid from which a ReadHandle is made.
std::optional< double > intersect(const AmgVector(N)&posA, const AmgVector(N)&dirA, const AmgVector(N)&posB, const AmgVector(N)&dirB)
Calculates the point B' along the line B that's closest to a second line A.
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
SeedingAux::FitParIndex ParamDefs
Use the same parameter indices as used by the CompSpacePointAuxiliaries.
Parameters localSegmentPars(const xAOD::MuonSegment &seg)
Returns the localSegPars decoration from a xAODMuon::Segment.
std::pair< Amg::Vector3D, Amg::Vector3D > makeLine(const Parameters &pars)
Returns the parsed parameters into an Eigen line parametrization.
Acts::Experimental::CompositeSpacePointLineFitter::ParamVec_t Parameters
std::string makeLabel(const Parameters &pars)
Dumps the parameters into a string in the form of TLatex.
std::unordered_set< const xAOD::MuonSimHit * > getMatchingSimHits(const xAOD::MuonSegment &segment)
: Returns all sim hits matched to a xAOD::MuonSegment
MuonValR4::IPatternVisualizationTool::PrimitiveVec PrimitiveVec
Lightweight algorithm to read xAOD MDT sim hits and (fast-digitised) drift circles from SG and fill a...
PatternVisualizationTool::LabeledSegmentSet LabeledSegmentSet
constexpr int hollowFilling
Filling codes for hollow / fullFilling / hatched filling.
std::unique_ptr< TLine > drawLine(const MuonR4::SegmentFit::Parameters &pars, const double lowEnd, const double highEnd, const int color=kRed+1, const int lineStyle=kDashed, const int view=objViewEta)
Draws a line from the segment fit parameters.
constexpr int hatchedFilling
std::unique_ptr< TLatex > drawLabel(const std::string &text, const double xPos, const double yPos, const double textSize=18, const bool useNDC=true, const int color=kBlack)
Create a TLatex label,.
std::vector< std::unique_ptr< TObject > > clone(const std::vector< std::unique_ptr< TObject > > &cloneMe)
std::unique_ptr< TEllipse > drawDriftCircle(const Amg::Vector3D ¢er, const double radius, const int color=kViolet, const int fillStyle=hollowFilling)
Create a TEllipse for drawing a drift circle.
constexpr int fullFilling
std::unique_ptr< TArrow > drawArrow(const Amg::Vector3D &start, const Amg::Vector3D &dir, const int color=kRed+1, const int lineStyle=kDashed, const int view=objViewEta)
Draw an arror between two endpoints in the y-z or the x-z plane.
std::unique_ptr< TBox > drawBox(const Amg::Vector3D &boxCenter, const double boxWidth, const double boxHeight, const int color=kGreen+2, const int fillStyle=hollowFilling, const int view=objViewEta)
Creates a box for drawing, e.g strip measurements.
StIndex
enum to classify the different station layers in the muon spectrometer
bool isBarrel(const ChIndex index)
Returns true if the chamber index points to a barrel chamber.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
std::vector< const SpacePoint * > SpacePointSet
vector of space points
MdtDriftCircle_v1 MdtDriftCircle
MuonSimHit_v1 MuonSimHit
Defined the version of the MuonSimHit.
RpcMeasurement_v1 RpcMeasurement
MuonSegment_v1 MuonSegment
Reference the current persistent version:
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.