20#include "Acts/Seeding/CombinatorialSeedSolver.hpp"
25using namespace Acts::Experimental::CombinatorialSeedSolver;
30 return prd->readoutElement()->stripLayer(prd->measurementHash()).design();
33 const auto*
re = prd->readoutElement();
34 switch(prd->channelType()) {
36 return re->stripDesign(prd->measurementHash());
38 return re->wireDesign(prd->measurementHash());
40 return re->padDesign(prd->measurementHash());
43 THROW_EXCEPTION(
"Invalid space point for design retrieval "<<
sp.msSector()->idHelperSvc()->toString(
sp.identify()));
46 const auto& design = getDesign(
sp);
49 return 0.5* design.stripLength(prd->channelNumber());
53 inline std::string sTgcChannelType(
const int chType) {
76 ATH_MSG_ERROR(
"MM or STGC not part of initialized detector layout");
77 return StatusCode::FAILURE;
84 fitCfg.parsToUse = {ParamDefs::x0, ParamDefs::y0, ParamDefs::theta, ParamDefs::phi};
86 m_lineFitter = std::make_unique<SegmentFit::SegmentLineFitter>(name(), std::move(fitCfg));
89 m_seedCounter = std::make_unique<SeedStatistics>();
92 return StatusCode::SUCCESS;
98 for (std::size_t l = 0; l < sortedSp.size(); ++l) {
99 emptyKeeper[l].resize(sortedSp[l].size(), 0);
108 const auto& design = getDesign(
sp);
109 if (!design.hasStereoAngle()) {
114 if (
sp.dimension() == 2) {
130 const Amg::Vector3D estPlaneArrivalUp = SeedingAux::extrapolateToPlane(beamSpotPos, dirEstUp, testHit);
131 const Amg::Vector3D estPlaneArrivalDn = SeedingAux::extrapolateToPlane(beamSpotPos, dirEstDn, testHit);
133 bool below{
true}, above{
true};
138 const double halfLength = 0.5* stripHalfLength(testHit);
144 below = estPlaneArrivalDn.y() > std::max(leftEdge.y(), rightEdge.y());
146 above = estPlaneArrivalUp.y() < std::min(leftEdge.y(), rightEdge.y());
152 below = estPlaneArrivalDn.y() > hY;
154 above = estPlaneArrivalUp.y() < hY;
166 << (below || above ?
" is outside the window" :
" is inside the window"));
177#define TEST_HIT_CORRIDOR(LAYER, HIT_ITER, START_LAYER) \
179 const SpacePoint* testMe = combinatoricLayers[LAYER].get()[HIT_ITER]; \
180 if (usedHits[LAYER].get()[HIT_ITER] > m_maxUsed) { \
181 ATH_MSG_VERBOSE(__func__<<":"<<__LINE__<<" - " \
182 <<m_idHelperSvc->toString(testMe->identify()) \
183 <<" already used in good seed." ); \
186 const HitWindow inWindow = hitFromIPCorridor(*testMe, beamSpot, dirEstUp, dirEstDn); \
187 if(inWindow == HitWindow::tooHigh) { \
188 ATH_MSG_VERBOSE(__func__<<":"<<__LINE__<<" - Hit " \
189 <<m_idHelperSvc->toString(testMe->identify()) \
190 <<" is beyond the corridor. Break loop"); \
192 } else if (inWindow == HitWindow::tooLow) { \
193 START_LAYER = HIT_ITER + 1; \
194 ATH_MSG_VERBOSE(__func__<<":"<<__LINE__<<" - Hit " \
195 <<m_idHelperSvc->toString(testMe->identify()) \
196 <<" is still below the corridor. Update start to " \
207 seedHitsFromLayers.clear();
208 std::size_t maxSize{1};
209 for (
const HitVec& hitVec : combinatoricLayers) {
210 maxSize = maxSize * hitVec.size();
212 seedHitsFromLayers.reserve(maxSize);
215 unsigned iterLay0{0}, iterLay1{0}, iterLay2{0}, iterLay3{0};
216 unsigned startLay1{0}, startLay2{0}, startLay3{0};
218 for( ; iterLay0 < combinatoricLayers[0].get().size() ; ++iterLay0){
223 const SpacePoint* hit0 = combinatoricLayers[0].get()[iterLay0];
232 <<
", seed plane: "<<
Amg::toString(SeedingAux::extrapolateToPlane(beamSpot, initSeedDir, *hit0)));
234 for( iterLay1 = startLay1; iterLay1 < combinatoricLayers[1].get().size() ; ++iterLay1){
236 for( iterLay2 = startLay2; iterLay2 < combinatoricLayers[2].get().size() ; ++iterLay2){
238 for( iterLay3 = startLay3; iterLay3 < combinatoricLayers[3].get().size(); ++iterLay3){
240 seedHitsFromLayers.emplace_back(std::array{hit0, combinatoricLayers[1].get()[iterLay1],
241 combinatoricLayers[2].get()[iterLay2],
242 combinatoricLayers[3].get()[iterLay3]});
248#undef TEST_HIT_CORRIDOR
260 for (std::size_t i = 0; i < extensionLayers.size(); ++i) {
261 const HitVec& layer{extensionLayers[i].get()};
262 const Amg::Vector3D extrapPos = SeedingAux::extrapolateToPlane(startPos, direction, *layer.front());
264 unsigned indexOfHit = layer.size() + 1;
265 unsigned triedHit{0};
266 double minPull{std::numeric_limits<double>::max()};
269 for (
unsigned j = 0; j < layer.size(); ++j) {
273 auto hit = layer.at(j);
274 const double pull = std::sqrt(SeedingAux::chi2Term(extrapPos, direction, *hit));
278 if (pull > minPull) {
293 const auto* bestCand = layer.at(indexOfHit);
296 <<
", dir: "<<
Amg::toString(bestCand->sensorDirection())<<
" found with pull "<<minPull);
297 combinatoricHits.push_back(bestCand);
300 return combinatoricHits;
303std::unique_ptr<SegmentSeed>
312 bool allValid = std::any_of(initialSeed.begin(), initialSeed.end(),
313 [
this](
const auto& hit){
314 if (hit->type() == xAOD::UncalibMeasType::MMClusterType) {
315 const auto* mmClust = static_cast<const xAOD::MMCluster*>(hit->primaryMeasurement());
316 return mmClust->stripNumbers().size() >= m_minClusSize;
322 ATH_MSG_VERBOSE(
"Seed rejection: Not all clusters meet minimum strip size");
327 std::array<double, 4> params = defineParameters(bMatrix, initialSeed);
329 const auto [segPos, direction] = seedSolution(initialSeed, params);
333 for (std::size_t i = 0; i < 4; ++i) {
334 const double halfLength = stripHalfLength(*initialSeed[i]);
336 if (std::abs(params[i]) > halfLength) {
337 ATH_MSG_VERBOSE(
"Seed Rejection: Invalid seed - outside of the strip's length");
344 double interceptX = segPos.x();
345 double interceptY = segPos.y();
349 auto extendedHits = extendHits(segPos, direction, extensionLayers, usedHits);
350 HitVec hits{initialSeed.begin(),initialSeed.end()};
351 hits.insert(
hits.end(), extendedHits.begin(), extendedHits.end());
354 return std::make_unique<SegmentSeed>(tanBeta, interceptY, tanAlpha,
355 interceptX,
hits.size(),
356 std::move(hits),
max.parentBucket());
374 locToGlob, std::move(calibratedHits));
377std::pair<std::vector<std::unique_ptr<SegmentSeed>>, std::vector<std::unique_ptr<Segment>>>
380 const EventContext& ctx)
const {
385 const std::size_t layerSize = stripHitsLayers.size();
388 std::vector<std::unique_ptr<SegmentSeed>> seeds{};
389 std::vector<std::unique_ptr<Segment>> segments{};
392 unsigned nSeeds{0}, nExtSeeds{0}, nSegments{0};
397 return std::make_pair(std::move(seeds),std::move(segments));
403 constexpr double legX{0.2};
417 const double pull = std::sqrt(SeedingAux::chi2Term(hitPos, hitDir, *
sp));
420 const auto* mmClust =
static_cast<const xAOD::MMCluster*
>(
sp->primaryMeasurement());
422 const auto& design = mmEle->
stripLayer(mmClust->measurementHash()).
design();
423 std::string stereoDesign{!design.hasStereoAngle() ?
"X" : design.stereoAngle() >0 ?
"U":
"V"};
424 primitives.push_back(
MuonValR4::drawLabel(std::format(
"ml: {:1d}, gap: {:1d}, {:}, pull: {:.2f}",
426 stereoDesign, pull), legX, legY, 14));
429 std::string channelString =
sp->secondaryMeasurement() ==
nullptr ?
430 sTgcChannelType(sTgcMeas->channelType()) :
431 std::format(
"{:}/{:}", sTgcChannelType(sTgcMeas->channelType()),
433 primitives.push_back(
MuonValR4::drawLabel(std::format(
"ml: {:1d}, gap: {:1d}, type: {:}, pull: {:.2f}",
434 sTgcMeas->readoutElement()->multilayer(), sTgcMeas->gasGap(),
435 channelString, pull), legX, legY, 14));
440 "truth", std::move(primitives));
446 std::array<const SpacePoint*, 4> seedHits{};
450 for (std::size_t i = 0; i < layerSize - 3; ++i) {
451 seedHits[0] = stripHitsLayers[i].front();
452 for (std::size_t j = i + 1; j < layerSize - 2; ++j) {
453 seedHits[1] = stripHitsLayers[j].front();
454 for (std::size_t k = j + 1; k < layerSize - 1; ++k) {
455 seedHits[2] = stripHitsLayers[k].front();
456 for (std::size_t l = k + 1; l < layerSize; ++l) {
457 seedHits[3] = stripHitsLayers[l].front();
459 const HitLaySpan_t layers{stripHitsLayers[i], stripHitsLayers[j], stripHitsLayers[k], stripHitsLayers[l]};
462 if (std::ranges::any_of(layers,
463 [
this](
const auto& layer) {
470 if (std::abs(bMatrix.determinant()) < 1.e-6) {
474 <<(*seedHits[0]) <<
",\n"
475 <<(*seedHits[1]) <<
",\n"
476 <<(*seedHits[2]) <<
",\n"
479 UsedHitSpan_t usedHits{allUsedHits[i], allUsedHits[j], allUsedHits[k], allUsedHits[l]};
486 usedExtensionHits.reserve(stripHitsLayers.size());
487 extensionLayers.reserve(stripHitsLayers.size());
488 for (std::size_t e = 0 ; e < stripHitsLayers.size(); ++e) {
489 if (!(e == i || e == j || e == k || e == l)){
490 extensionLayers.emplace_back(stripHitsLayers[e]);
491 usedExtensionHits.emplace_back(allUsedHits[e]);
496 for (
auto &combinatoricHits : preLimSeeds) {
497 auto seed =
buildSegmentSeed(combinatoricHits, bMatrix,
max, extensionLayers, usedExtensionHits);
509 std::unique_ptr<Segment> segment =
fitSegmentSeed(ctx, gctx, seed.get());
510 seeds.push_back(std::move(seed));
517 markHitsAsUsed(seeds.back()->getHitsInMax(), stripHitsLayers, allUsedHits, 1,
false);
525 segMeasSP.reserve(segment->measurements().size());
526 std::ranges::transform(segment->measurements(),
527 std::back_inserter(segMeasSP),
528 [](
const auto& m) { return m->spacePoint(); });
530 markHitsAsUsed(segMeasSP, stripHitsLayers, allUsedHits, 10,
true);
531 segments.push_back(std::move(segment));
539 m_seedCounter->addToStat(
max.msSector(), nSeeds, nExtSeeds, nSegments);
542 return std::make_pair(std::move(seeds),std::move(segments));
550 bool markNeighborHits)
const {
554 for(
const auto&
sp : spacePoints){
564 switch (
sp->primaryMeasurement()->numDimensions()) {
566 spPosX[
Amg::x] =
sp->primaryMeasurement()->localPosition<1>().
x();
569 spPosX = xAOD::toEigen(
sp->primaryMeasurement()->localPosition<2>());
575 for (std::size_t lIdx = 0; lIdx < allSortHits.size(); ++lIdx) {
576 const HitVec& hVec{allSortHits[lIdx]};
579 if(hitLayer != measLayer) {
580 ATH_MSG_VERBOSE(
"Not in the same layer since measLayer = "<< measLayer <<
" and "<<hitLayer);
583 for (std::size_t hIdx = 0 ; hIdx < hVec.size(); ++hIdx) {
585 auto testHit = hVec[hIdx];
587 usedHitMarker[lIdx][hIdx] += incr;
588 if(!markNeighborHits){
591 }
else if (markNeighborHits) {
594 switch (testHit->primaryMeasurement()->numDimensions()) {
596 testPosX[
Amg::x] = testHit->primaryMeasurement()->localPosition<1>().
x();
599 testPosX = xAOD::toEigen(testHit->primaryMeasurement()->localPosition<2>());
605 double deltaX = (testPosX - spPosX).
mag();
607 usedHitMarker[lIdx][hIdx] += incr;
628 ATH_CHECK(writeSegmentSeeds.
record(std::make_unique<SegmentSeedContainer>()));
636 if (
msgLvl(MSG::VERBOSE)) {
637 for(
const auto& hitMax :
max->getHitsInMax()){
644 for(
auto& seed: seeds){
646 if (
msgLvl(MSG::VERBOSE)){
647 std::stringstream sstr{};
648 sstr<<
"Seed tanBeta = "<<seed->tanBeta()<<
", y0 = "<<seed->interceptY()
649 <<
", tanAlpha = "<<seed->tanAlpha()<<
", x0 = "<<seed->interceptX()<<
", hits in the seed "
650 <<seed->getHitsInMax().size()<<std::endl;
652 for(
const auto& hit : seed->getHitsInMax()){
653 sstr<<
" *** Hit "<<
m_idHelperSvc->toString(hit->identify())<<
", "
659 m_visionTool->visualizeSeed(ctx, *seed,
"#phi-combinatorialSeed");
662 writeSegmentSeeds->push_back(std::move(seed));
666 for (
auto &seg : segments) {
673 m_visionTool->visualizeSegment(ctx, *seg,
"#phi-segment");
676 writeSegments->push_back(std::move(seg));
681 return StatusCode::SUCCESS;
687 m_seedCounter->printTableSeedStats(msgStream());
689 return StatusCode::SUCCESS;
693 std::unique_lock guard{
m_mutex};
697 key.eta = msSector->
chambers().front()->stationEta();
700 entry.nSeeds += seeds;
701 entry.nExtSeeds += extSeeds;
702 entry.nSegments += segments;
708 msg<<MSG::ALWAYS<<
"Seed statistics per sector:"<<
endmsg;
709 msg<<MSG::ALWAYS<<
"-----------------------------------------------------"<<
endmsg;
710 msg<<MSG::ALWAYS<<
"| Chamber | Phi | Eta | Seeds | ExtSeeds | Segments |"<<
endmsg;
711 msg<<MSG::ALWAYS<<
"-----------------------------------------------------"<<
endmsg;
716 const auto& sector = entry.first;
717 const auto& stats = entry.second;
720 msg<<MSG::ALWAYS <<
"| " << std::setw(3) << (sector.chIdx == ChIndex::EIL ?
"EIL" :
"EIS")
721 <<
" | " << std::setw(2) << sector.phi
722 <<
" | " << std::setw(3) << sector.eta
723 <<
" | " << std::setw(7) << stats.nSeeds
724 <<
" | " << std::setw(8) << stats.nExtSeeds
725 <<
" | " << std::setw(8) << stats.nSegments
731 msg<<MSG::ALWAYS<<
"------------------------------------------------------------"<<
endmsg;
const boost::regex re(r_e)
Scalar mag() const
mag method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define AmgSymMatrix(dim)
ATLAS-specific HepMC functions.
sTgcIdHelper::sTgcChannelTypes chType
#define TEST_HIT_CORRIDOR(LAYER, HIT_ITER, START_LAYER)
Macro to check whether a hit is compatible with the hit corridor.
const ServiceHandle< StoreGateSvc > & detStore() const
bool msgLvl(const MSG::Level lvl) const
const StripLayer & stripLayer(const Identifier &measId) const
int multilayer() const
Returns the multi layer of the element [1-2].
The MuonReadoutElement is an abstract class representing the geometry representing the muon detector.
const SpectrometerSector * msSector() const
Returns the pointer to the envelope volume enclosing all chambers in the sector.
const Amg::Transform3D & localToGlobalTrans(const ActsTrk::GeometryContext &ctx) const
Returns the local to global transformation into the ATLAS coordinate system.
A spectrometer sector forms the envelope of all chambers that are placed in the same MS sector & laye...
Amg::Transform3D globalToLocalTrans(const ActsTrk::GeometryContext &gctx) const
Returns the global -> local transformation from the ATLAS global.
const Amg::Transform3D & localToGlobalTrans(const ActsTrk::GeometryContext &gctx) const
Returns the local -> global tarnsformation from the sector.
const ChamberSet & chambers() const
Returns the associated chambers with this sector.
int stationPhi() const
: Returns the station phi of the sector
Muon::MuonStationIndex::ChIndex chamberIndex() const
Returns the chamber index scheme.
const StripDesign & design(bool phiView=false) const
Returns the underlying strip design.
Data class to represent an eta maximum in hough space.
std::vector< CalibSpacePointPtr > CalibSpacePointVec
SeedStatistic_T m_seedStat
void printTableSeedStats(MsgStream &msg) const
void addToStat(const MuonGMR4::SpectrometerSector *msSector, unsigned int nSeeds, unsigned int nExtSeeds, unsigned int nSegments)
const MuonGMR4::MuonDetectorManager * m_detMgr
UnsignedIntegerProperty m_maxUsed
std::unique_ptr< SegmentSeed > buildSegmentSeed(const InitialSeed_t &initialSeed, const AmgSymMatrix(2)&bMatrix, const HoughMaximum &max, const HitLaySpan_t &extensionLayers, const UsedHitSpan_t &usedHits) const
Build the final seed from the initial seed hits and then attempt to append hits from the complementar...
std::pair< std::vector< std::unique_ptr< SegmentSeed > >, std::vector< std::unique_ptr< Segment > > > findSegmentsFromMaximum(const HoughMaximum &max, const ActsTrk::GeometryContext &gctx, const EventContext &ctx) const
Find seed and segment from an eta hough maximum.
std::unique_ptr< SegmentFit::SegmentLineFitter > m_lineFitter
UnsignedIntegerProperty m_maxClustersInLayer
DoubleProperty m_minPullThreshold
virtual StatusCode initialize() override
virtual StatusCode execute(const EventContext &ctx) const override
HitWindow
To fastly check whether a hit is roughly compatible with a muon trajectory a narrow corridor is opene...
@ inside
The hit is below the predefined corridor.
@ tooHigh
The hit is inside the defined window and hence an initial candidate.
DoubleProperty m_maxdYWindow
void constructPrelimnarySeeds(const Amg::Vector3D &beamSpot, const HitLaySpan_t &combinatoricLayers, const UsedHitSpan_t &usedHits, InitialSeedVec_t &outVec) const
Construct a set of prelimnary seeds from the selected combinatoric layers.
std::unique_ptr< Segment > fitSegmentSeed(const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const SegmentSeed *patternSeed) const
Fit the segment seed.
ToolHandle< MuonValR4::IPatternVisualizationTool > m_visionTool
Pattern visualization tool.
std::vector< std::reference_wrapper< const HitVec > > HitLaySpan_t
Abbrivation of the space comprising multiple hit vectors without copy.
std::array< const SpacePoint *, 4 > InitialSeed_t
Abbrivation of the.
SG::WriteHandleKey< SegmentSeedContainer > m_writeSegmentSeedKey
HitWindow hitFromIPCorridor(const SpacePoint &testHit, const Amg::Vector3D &beamSpotPos, const Amg::Vector3D &dirEstUp, const Amg::Vector3D &dirEstDn) const
The hit is above the predefined corridor.
void markHitsAsUsed(const HitVec &spacePoints, const HitLayVec &allSortHits, UsedHitMarker_t &usedHitMarker, unsigned int increase, bool markNeighborHits) const
Hits that are used in a good seed/segment built should be flagged as used and not contribute to other...
UsedHitMarker_t emptyBookKeeper(const HitLayVec &sortedSp) const
Constructs an empty HitMarker from the split space points.
virtual StatusCode finalize() override
DoubleProperty m_windowTheta
BooleanProperty m_dumpSeedStatistics
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
SpacePointPerLayerSplitter::HitLayVec HitLayVec
SpacePointPerLayerSplitter::HitVec HitVec
std::vector< InitialSeed_t > InitialSeedVec_t
Vector of initial seeds.
StripOrient classifyStrip(const SpacePoint &spacePoint) const
Determines the orientation of the strip space point.
StripOrient
Enumeration to classify the orientation of a NSW strip.
@ X
Stereo strips with negative angle.
@ C
Single phi measurements.
@ V
Stereo strips with positive angle.
@ Unknown
Combined 2D space point (sTGC wire + strip / sTgc pad)
SG::WriteHandleKey< SegmentContainer > m_writeSegmentKey
SG::ReadHandleKey< ActsTrk::GeometryContext > m_geoCtxKey
std::vector< std::vector< unsigned int > > UsedHitMarker_t
Abbrivation of the container book keeping whether a hit is used or not.
ToolHandle< ISpacePointCalibrator > m_calibTool
HitVec extendHits(const Amg::Vector3D &startPos, const Amg::Vector3D &direction, const HitLaySpan_t &extensionLayers, const UsedHitSpan_t &usedHits) const
Extend the seed with the hits from the other layers.
UnsignedIntegerProperty m_minSeedHits
SG::ReadHandleKey< EtaHoughMaxContainer > m_etaKey
std::vector< std::reference_wrapper< std::vector< unsigned int > > > UsedHitSpan_t
Abbrivation of the container to pass a subset of markers wtihout copy.
BooleanProperty m_markHitsFromSeed
Representation of a segment seed (a fully processed hough maximum) produced by the hough transform.
const std::vector< HitType > & getHitsInMax() const
Returns the list of assigned hits.
const Parameters & parameters() const
Returns the parameter array.
Amg::Vector3D localDirection() const
Returns the direction of the seed in the sector frame.
const MuonGMR4::SpectrometerSector * msSector() const
Returns the associated chamber.
Amg::Vector3D localPosition() const
Returns the position of the seed in the sector frame.
The SpacePointPerLayerSorter sort two given space points by their layer Identifier.
unsigned int sectorLayerNum(const SpacePoint &sp) const
method returning the logic layer number
The SpacePointPerLayerSplitter takes a set of spacepoints already sorted by layer Identifier (see Muo...
const HitLayVec & stripHits() const
Returns the sorted strip hits.
The muon space point is the combination of two uncalibrated measurements one of them measures the eta...
const Amg::Vector3D & sensorDirection() const
const Amg::Vector3D & localPosition() const
const Identifier & identify() const
: Identifier of the primary measurement
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
ConstVectorMap< 3 > localDirection() const
Returns the local direction of the traversing particle.
Identifier identify() const
Returns the global ATLAS identifier of the SimHit.
ConstVectorMap< 3 > localPosition() const
Returns the local postion of the traversing particle.
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Amg::Vector3D dirFromAngles(const double phi, const double theta)
Constructs a direction vector from the azimuthal & polar angles.
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
Parameters localSegmentPars(const xAOD::MuonSegment &seg)
Returns the localSegPars decoration from a xAODMuon::Segment.
Acts::Experimental::CompositeSpacePointLineFitter::ParamVec_t Parameters
std::string toString(const Parameters &pars)
Dumps the parameters into a string with labels in front of each number.
This header ties the generic definitions in this package.
ISpacePointCalibrator::CalibSpacePointVec CalibSpacePointVec
const xAOD::MuonSimHit * getTruthMatchedHit(const xAOD::UncalibratedMeasurement &prdHit)
Returns the MuonSimHit, if there's any, matched to the uncalibrated muon measurement.
double houghTanBeta(const Amg::Vector3D &v)
Returns the hough tanBeta [y] / [z].
DataVector< HoughMaximum > EtaHoughMaxContainer
constexpr unsigned minLayers
SpacePointPerLayerSplitter::HitVec HitVec
double houghTanAlpha(const Amg::Vector3D &v)
: Returns the hough tanAlpha [x] / [z]
std::unique_ptr< TLatex > drawLabel(const std::string &text, const double xPos, const double yPos, const unsigned int fontSize=18)
Create a TLatex label,.
ChIndex
enum to classify the different chamber layers in the muon spectrometer
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
MuonSimHit_v1 MuonSimHit
Defined the version of the MuonSimHit.
sTgcMeasurement_v1 sTgcMeasurement
sector's field to dump the seed statistics
const ISpacePointCalibrator * calibrator
Pointer to the calibrator.
const Muon::IMuonIdHelperSvc * idHelperSvc
Pointer to the idHelperSvc.
const MuonValR4::IPatternVisualizationTool * visionTool
Pointer to the visualization tool.
Full configuration object.
#define THROW_EXCEPTION(MESSAGE)