ATLAS Offline Software
Loading...
Searching...
No Matches
Muon::MuonSegmentRegionRecoveryTool Class Reference

Implementation of an IMuonHoleRecoveryTool. More...

#include <MuonSegmentRegionRecoveryTool.h>

Inheritance diagram for Muon::MuonSegmentRegionRecoveryTool:
Collaboration diagram for Muon::MuonSegmentRegionRecoveryTool:

Classes

struct  MuonData

Public Member Functions

virtual ~MuonSegmentRegionRecoveryTool ()=default
 destructor
virtual StatusCode initialize () override
 AlgTool initialize.
virtual std::unique_ptr< Trk::Trackrecover (const Trk::Track &track, const EventContext &ctx) const override
 returns a new track with segments recovered using RegionSelector
void createHoleTSOSsForClusterChamber (const Identifier &detElId, const EventContext &ctx, const Trk::TrackParameters &pars, std::set< Identifier > &layIds, std::vector< std::unique_ptr< const Trk::TrackStateOnSurface > > &states) const override

Private Member Functions

std::unique_ptr< const Trk::TrackParametersreachableDetEl (const EventContext &ctx, const Trk::Track &track, const Trk::TrkDetElementBase &detEl, bool smallerBounds=false) const
void collectCrossedChambers (const EventContext &ctx, const Trk::Track &track, MuonData &data) const
 methods used by recover
void fillOnTrackChambers (const Trk::Track &theTrack, MuonData &data) const
std::unique_ptr< Trk::TrackaddMissingChambers (const EventContext &ctx, const Trk::Track &track, MuonData &data, bool addMdt) const
void addHashes (const EventContext &ctx, MuonStationIndex::TechnologyIndex type, const IRoiDescriptor &roi, std::set< IdentifierHash > &hashes, const std::set< IdentifierHash > &exclusion) const
std::unique_ptr< Trk::TrackfindHoles (const EventContext &ctx, const Trk::Track &track, MuonData &data) const

Private Attributes

ServiceHandle< IMuonEDMHelperSvcm_edmHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvcm_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
ToolHandle< IMuonSeededSegmentFinderm_seededSegmentFinder
ToolHandle< IMuonTrackSegmentMatchingToolm_trackSegmentMatchingTool
ToolHandle< MuonChamberHoleRecoveryToolm_chamberHoleRecoveryTool {this, "ChamberHoleRecoveryTool", "", "hit-based hole search"}
ToolHandle< Trk::IExtrapolatorm_extrapolator {this, "Extrapolator", "Trk::Extrapolator/MuonExtrapolator"}
ToolHandle< Rec::ICombinedMuonTrackFitterm_builder {this, "Builder", ""}
ToolHandle< Trk::ITrackFitterm_fitter {this, "Fitter", "Trk::GlobalChi2Fitter/MCTBSLFitter"}
ToolHandle< IMuonHitSummaryToolm_hitSummaryTool {this, "HitSummaryTool", "Muon::MuonHitSummaryTool/MuonHitSummaryTool"}
ToolHandle< IRegSelToolm_regsel_mdt {this, "MDTRegionSelector", "RegSelTool/RegSelTool_MDT"}
ToolHandle< IRegSelToolm_regsel_csc {this, "CSCRegionSelector", "RegSelTool/RegSelTool_CSC"}
ToolHandle< IRegSelToolm_regsel_rpc {this, "RPCRegionSelector", "RegSelTool/RegSelTool_RPC"}
ToolHandle< IRegSelToolm_regsel_tgc {this, "TGCRegionSelector", "RegSelTool/RegSelTool_TGC"}
ToolHandle< IRegSelToolm_regsel_stgc {this, "STGCRegionSelector", "RegSelTool/RegSelTool_STGC"}
ToolHandle< IRegSelToolm_regsel_mm {this, "MMRegionSelector", "RegSelTool/RegSelTool_MM"}
PublicToolHandle< MuonEDMPrinterToolm_printer {this, "EDMPrinter", "Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"}
ToolHandle< Trk::IExtendedTrackSummaryToolm_trackSummaryTool {this, "TrackSummaryTool", "MuonTrackSummaryTool"}
SG::ReadCondHandleKey< Muon::MuonIntersectGeoDatam_chamberGeoKey {this, "ChamberGeoKey", "MuonStationIntersects", "Pointer to hole search service"}
SG::ReadCondHandleKey< MuonGM::MuonDetectorManagerm_DetectorManagerKey
Gaudi::Property< double > m_deta {this, "DeltaEtaRegion", 0.05}
Gaudi::Property< double > m_dphi {this, "DeltaPhiRegion", 0.1}
Gaudi::Property< bool > m_excludeEES {this, "ExcludeEES", true}
Gaudi::Property< bool > m_onlyEO {this, "OnlyEO", false}
Gaudi::Property< bool > m_useFitterOutlierLogic {this, "UseFitterOutlierLogic", true}
Gaudi::Property< bool > m_recoverMM {this, "RecoverMM", true, "Pick up dropped micromega chambers"}
Gaudi::Property< bool > m_recoverSTGC {this, "RecoverSTGC", true, "Pick up dropped sTGC chambers"}

Detailed Description

Implementation of an IMuonHoleRecoveryTool.

It propagates the track to a chamber where no segments where found and runs the SeededSegmentFinder in a region selected by the region selector

Definition at line 67 of file MuonSegmentRegionRecoveryTool.h.

Constructor & Destructor Documentation

◆ ~MuonSegmentRegionRecoveryTool()

virtual Muon::MuonSegmentRegionRecoveryTool::~MuonSegmentRegionRecoveryTool ( )
virtualdefault

destructor

Member Function Documentation

◆ addHashes()

void MuonSegmentRegionRecoveryTool::addHashes ( const EventContext & ctx,
MuonStationIndex::TechnologyIndex type,
const IRoiDescriptor & roi,
std::set< IdentifierHash > & hashes,
const std::set< IdentifierHash > & exclusion ) const
private

Definition at line 162 of file MuonSegmentRegionRecoveryTool.cxx.

164 {
165 // if only looking at EO, skip all but MDT chambers
166 if (m_onlyEO && type != TechnologyIndex::MDT) return;
167
168 std::vector<IdentifierHash> crossed;
169
170 if (type == TechnologyIndex::MDT && m_regsel_mdt->lookup(ctx)) m_regsel_mdt->lookup(ctx)->HashIDList(roi, crossed);
171 if (type == TechnologyIndex::CSC && m_regsel_csc->lookup(ctx)) m_regsel_csc->lookup(ctx)->HashIDList(roi, crossed);
172 if (type == TechnologyIndex::RPC && m_regsel_rpc->lookup(ctx)) m_regsel_rpc->lookup(ctx)->HashIDList(roi, crossed);
173 if (type == TechnologyIndex::TGC && m_regsel_tgc->lookup(ctx)) m_regsel_tgc->lookup(ctx)->HashIDList(roi, crossed);
174 if (type == TechnologyIndex::STGC && m_regsel_stgc->lookup(ctx)) m_regsel_stgc->lookup(ctx)->HashIDList(roi, crossed);
175 if (type == TechnologyIndex::MM && m_regsel_mm->lookup(ctx)) m_regsel_mm->lookup(ctx)->HashIDList(roi, crossed);
176
177 for (const IdentifierHash& hash : crossed) {
178 if (exclusion.count(hash) || hashes.count(hash)) {
179 continue;
180 }
181 switch (type) {
182 using enum TechnologyIndex;
185 break;
186 case RPC:
187 case TGC:{
188 break;
189 }
190 case MDT: {
191 Identifier chId;
192 IdContext otCont = m_idHelperSvc->mdtIdHelper().module_context();
193 m_idHelperSvc->mdtIdHelper().get_id(hash, chId, &otCont);
194
195 if (m_excludeEES && m_idHelperSvc->chamberIndex(chId) == ChIndex::EES) {
196 ATH_MSG_VERBOSE(" excluding " << hash << " " << m_idHelperSvc->toStringChamber(chId));
197 continue;
198 }
199 if (m_onlyEO && m_idHelperSvc->stationIndex(chId) != StIndex::EO) {
200 ATH_MSG_VERBOSE(" excluding " << hash << " " << m_idHelperSvc->toStringChamber(chId));
201 continue;
202 }
203 ATH_MSG_VERBOSE(" -- hash " << hash << " " << m_idHelperSvc->toStringChamber(chId));
204 break;
205 } case STGC: {
206 Identifier chId;
207 IdContext otCont = m_idHelperSvc->stgcIdHelper().detectorElement_context();
208 m_idHelperSvc->stgcIdHelper().get_id(hash, chId, &otCont);
209 ATH_MSG_VERBOSE(" -- stgc hash " << hash << " " << m_idHelperSvc->toStringChamber(chId));
210 break;
211 } case MM: {
212 Identifier chId;
213 IdContext otCont = m_idHelperSvc->mmIdHelper().detectorElement_context();
214 m_idHelperSvc->mmIdHelper().get_id(hash, chId, &otCont);
215 ATH_MSG_VERBOSE(" -- mm hash " << hash << " " << m_idHelperSvc->toStringChamber(chId));
216 break;
217 } case CSC: {
218 Identifier chId;
219 IdContext otCont = m_idHelperSvc->cscIdHelper().module_context();
220 m_idHelperSvc->cscIdHelper().get_id(hash, chId, &otCont);
221 ATH_MSG_VERBOSE(" -- csc hash " << hash << " " << m_idHelperSvc->toStringChamber(chId));
222 break;
223 }
224 }
225 hashes.insert(hash);
226 }
227 }
#define ATH_MSG_VERBOSE(x)
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
TechnologyIndex
enum to classify the different layers in the muon spectrometer

◆ addMissingChambers()

std::unique_ptr< Trk::Track > MuonSegmentRegionRecoveryTool::addMissingChambers ( const EventContext & ctx,
const Trk::Track & track,
MuonData & data,
bool addMdt ) const
private

Definition at line 706 of file MuonSegmentRegionRecoveryTool.cxx.

707 {
708 // states were added, create a new track
709 std::vector<std::unique_ptr<const Trk::TrackStateOnSurface>> states;
710 std::set<IdentifierHash> newMdtHashes;
711 std::set<IdentifierHash> newRpcHashes;
712 std::set<IdentifierHash> newTgcHashes;
713 std::set<IdentifierHash> newCscHashes;
714 // New Small Wheel
715 std::set<IdentifierHash> newMMHashes;
716 std::set<IdentifierHash> newsTgcHashes;
717 if (addMdt) {
718 ATH_MSG_DEBUG("Adding Missing MDT chambers: regions " << data.mdtPerStation.size());
719 std::vector<const MdtPrepDataCollection*> newmcols;
720 for (const auto& chit : data.mdtPerStation) {
721 ATH_MSG_VERBOSE("Region " << MuonStationIndex::chName(chit.first) << " size " << chit.second.size());
722 std::vector<const MdtPrepDataCollection*> cols;
723 m_seededSegmentFinder->extractMdtPrdCols(ctx, chit.second, cols);
724 std::map<int, std::vector<const MdtPrepData*>> mdtPrds;
725 std::unique_ptr<const Trk::TrackParameters> exParsFirst;
726 for (const MdtPrepDataCollection* mit : cols) {
727 std::unique_ptr<const Trk::TrackParameters> exPars{reachableDetEl(ctx, track, *mit->front()->detectorElement())};
728 if (exPars) {
729 int sector = m_idHelperSvc->sector(mit->identify());
730 ATH_MSG_DEBUG("New chamber " << m_idHelperSvc->toStringChamber(mit->identify()) << " hash " << mit->identifyHash()
731 << " sector " << sector);
732 newmcols.emplace_back(mit);
733 std::vector<const MdtPrepData*>& col = mdtPrds[sector];
734 col.insert(col.end(), mit->begin(), mit->end());
735 if (!exParsFirst) exParsFirst.swap(exPars);
736
737 } else {
738 ATH_MSG_DEBUG("Did not reach chamber " << m_idHelperSvc->toStringChamber(mit->identify()) << " hash "
739 << mit->identifyHash());
740 }
741 }
742 std::vector<const MdtPrepData*>* prds = nullptr;
743 std::map<int, std::vector<const MdtPrepData*>>::iterator sectorIt = mdtPrds.begin();
744 if (mdtPrds.empty()) {
745 ATH_MSG_VERBOSE("No hits selected");
746 } else if (mdtPrds.size() == 1) {
747 prds = &sectorIt->second;
748 } else {
749 IMuonHitSummaryTool::CompactSummary hitSummary = m_hitSummaryTool->summary(track);
750 ATH_MSG_VERBOSE("Multiple sectors selected, using main sector: " << hitSummary.mainSector);
751 std::map<int, std::vector<const MdtPrepData*>>::iterator pos = mdtPrds.find(hitSummary.mainSector);
752 if (pos != mdtPrds.end())
753 prds = &pos->second;
754 else {
755 ATH_MSG_DEBUG("Failed to find prds in main sector: " << hitSummary.mainSector);
756 }
757 }
758 if (prds && exParsFirst) {
759 std::unique_ptr<Trk::SegmentCollection> segments = m_seededSegmentFinder->find(ctx, *exParsFirst, *prds);
760 if (segments) {
761 if (!segments->empty()) ATH_MSG_DEBUG("found segments " << segments->size());
762
763 MuonSegment* bestSegment = nullptr;
764 std::unique_ptr<const Trk::TrackParameters> bestSegmentPars;
765 for (Trk::Segment* tseg : *segments) {
766 MuonSegment* mseg = dynamic_cast<MuonSegment*>(tseg);
767
768 if (m_trackSegmentMatchingTool.empty())
769 ATH_MSG_VERBOSE("No track/segment matching");
770 else if (!m_trackSegmentMatchingTool->match(ctx, track, *mseg, true)) {
771 ATH_MSG_DEBUG(" Segment does not match with track ");
772 continue;
773 } else {
774 ATH_MSG_DEBUG(" Segment/track matched successfully using " << m_trackSegmentMatchingTool);
775 }
776 std::unique_ptr<const Trk::TrackParameters> segPars{m_extrapolator->extrapolateDirectly(
777 ctx, *exParsFirst, mseg->associatedSurface(), Trk::anyDirection, false, Trk::muon)};
778 if (segPars) {
779 double resy = mseg->localParameters()[Trk::locY] - segPars->parameters()[Trk::locY];
780 Trk::LocalDirection locDir;
781 mseg->associatedSurface().globalToLocalDirection(segPars->momentum(), locDir);
782 double dangleYZ = mseg->localDirection().angleYZ() - locDir.angleYZ();
783 ATH_MSG_DEBUG("resy " << resy << " dangleYZ " << dangleYZ << " " << m_printer->print(*mseg));
784 if (std::abs(dangleYZ) < 0.05) {
785 bestSegment = mseg;
786 bestSegmentPars.swap(segPars);
787 }
788 } else {
789 ATH_MSG_DEBUG("Did not reach " << m_printer->print(*mseg));
790 }
791 }
792 if (bestSegment) {
793 for (const Trk::MeasurementBase* hit : bestSegment->containedMeasurements()) {
794 std::unique_ptr<Trk::TrackParameters> hitPars{m_extrapolator->extrapolateDirectly(
795 ctx, *bestSegmentPars, hit->associatedSurface(), Trk::anyDirection, false, Trk::muon)};
796 if (hitPars) {
797 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
799 Trk::TrackStateOnSurface* tsos =
800 new Trk::TrackStateOnSurface(hit->uniqueClone(), std::move(hitPars), nullptr, typePattern);
801 states.emplace_back(tsos);
802 const MdtDriftCircleOnTrack* mdt = dynamic_cast<const MdtDriftCircleOnTrack*>(hit);
803 if (mdt) newMdtHashes.insert(mdt->collectionHash());
804 } else {
805 ATH_MSG_WARNING("Failed to extrapolate to MDT hit ");
806 }
807 }
808 }
809 }
810 }
811 }
812 data.mdtCols = std::move(newmcols);
813 } else {
814 unsigned int nstates = states.size();
815 {
816 m_seededSegmentFinder->extractRpcPrdCols(ctx, data.rpc, data.rpcCols);
817 std::vector<const RpcPrepDataCollection*> newtcols;
818 for (const RpcPrepDataCollection* rit : data.rpcCols) {
819 std::unique_ptr<const Trk::TrackParameters> exPars{reachableDetEl(ctx, track, *(rit)->front()->detectorElement())};
820 if (exPars) {
821 newtcols.emplace_back(rit);
822 Identifier detElId = m_idHelperSvc->detElId(rit->identify());
823 std::set<Identifier> layIds;
824 createHoleTSOSsForClusterChamber(detElId, ctx, *exPars, layIds, states);
825 if (states.size() != nstates) {
826 nstates = states.size();
827 newRpcHashes.insert(rit->identifyHash());
828 }
829 }
830 }
831 data.rpcCols = std::move(newtcols);
832 }
833 {
834 m_seededSegmentFinder->extractTgcPrdCols(ctx, data.tgc, data.tgcCols);
835 std::vector<const TgcPrepDataCollection*> newtcols;
836 for (const TgcPrepDataCollection* tgcit : data.tgcCols) {
837 std::unique_ptr<const Trk::TrackParameters> exPars{reachableDetEl(ctx, track, *(tgcit)->front()->detectorElement())};
838 if (exPars) {
839 newtcols.emplace_back(tgcit);
840 Identifier detElId = m_idHelperSvc->detElId(tgcit->identify());
841 std::set<Identifier> layIds;
842 createHoleTSOSsForClusterChamber(detElId, ctx, *exPars, layIds, states);
843 if (states.size() != nstates) {
844 nstates = states.size();
845 newTgcHashes.insert(tgcit->identifyHash());
846 }
847 }
848 }
849 data.tgcCols = std::move(newtcols);
850 }
851
852 m_seededSegmentFinder->extractCscPrdCols(data.csc, data.cscCols);
853 std::vector<const CscPrepDataCollection*> newccols;
854 for (const CscPrepDataCollection* cit : data.cscCols) {
855 std::unique_ptr<const Trk::TrackParameters> exPars{reachableDetEl(ctx, track, *(cit)->front()->detectorElement())};
856 if (exPars) {
857 newccols.push_back(cit);
858 Identifier detElId = m_idHelperSvc->detElId(cit->identify());
859 std::set<Identifier> layIds;
860 createHoleTSOSsForClusterChamber(detElId, ctx, *exPars, layIds, states);
861 if (states.size() != nstates) {
862 nstates = states.size();
863 newCscHashes.insert(cit->identifyHash());
864 }
865 }
866 }
867 data.cscCols = std::move(newccols);
868
869 nstates = states.size();
870 if (m_recoverSTGC) {
871 m_seededSegmentFinder->extractsTgcPrdCols(ctx, data.stgc, data.stgcCols);
872 std::vector<const sTgcPrepDataCollection*> newstcols;
873 ATH_MSG_DEBUG(" extractsTgcPrdCols data.stgcCols.size() " << data.stgcCols.size());
874 for (const sTgcPrepDataCollection* stgcit : data.stgcCols) {
875 std::unique_ptr<const Trk::TrackParameters> exPars{reachableDetEl(ctx, track, *(stgcit)->front()->detectorElement())};
876 if (exPars) {
877 newstcols.push_back(stgcit);
878 Identifier detElId = m_idHelperSvc->detElId(stgcit->identify());
879 std::set<Identifier> layIds;
880 createHoleTSOSsForClusterChamber(detElId, ctx, *exPars, layIds, states);
881 ATH_MSG_DEBUG("Collected new sTgc states: " << states.size());
882 if (states.size() != nstates) {
883 nstates = states.size();
884 newsTgcHashes.insert(stgcit->identifyHash());
885 }
886 }
887 }
888 data.stgcCols = std::move(newstcols);
889 }
890
891 if (m_recoverMM) {
892 m_seededSegmentFinder->extractMMPrdCols(data.mm, data.mmCols);
893 ATH_MSG_DEBUG(" extractMMPrdCols data.mmCols.size() " << data.mmCols.size());
894 std::vector<const MMPrepDataCollection*> newmcols;
895 for (const MMPrepDataCollection* mit : data.mmCols) {
896 std::unique_ptr<const Trk::TrackParameters> exPars{reachableDetEl(ctx, track, *mit->front()->detectorElement())};
897 if (exPars) {
898 newmcols.push_back(mit);
899 Identifier detElId = m_idHelperSvc->detElId(mit->identify());
900 std::set<Identifier> layIds;
901 createHoleTSOSsForClusterChamber(detElId, ctx, *exPars, layIds, states);
902 ATH_MSG_DEBUG("Collected new Mm states: " << states.size());
903 if (states.size() != nstates) {
904 nstates = states.size();
905 newMMHashes.insert(mit->identifyHash());
906 }
907 }
908 }
909 data.mmCols = std::move(newmcols);
910 }
911 }
912 if (!states.empty()) {
913 ATH_MSG_DEBUG("Collected new states: " << states.size());
914
915 const Trk::TrackStates* oldStates = track.trackStateOnSurfaces();
916 if (!oldStates) {
917 ATH_MSG_WARNING(" track without states, cannot perform cleaning ");
918 return nullptr;
919 }
920
921 ATH_MSG_DEBUG("Copying old TSOSs " << oldStates->size());
922 for (const Trk::TrackStateOnSurface* tsit : *oldStates) states.emplace_back(tsit->clone());
923
924 std::stable_sort(states.begin(), states.end(), SortTSOSs(m_edmHelperSvc.get(), m_idHelperSvc.get()));
925 ATH_MSG_DEBUG("Filling DataVector with TSOSs " << states.size());
926 auto trackStateOnSurfaces = std::make_unique<Trk::TrackStates>();
927 trackStateOnSurfaces->reserve(states.size());
928 for (std::unique_ptr<const Trk::TrackStateOnSurface>& sorted : states) { trackStateOnSurfaces->push_back(sorted.release()); }
929 ATH_MSG_DEBUG("Creating new Track " << states.size());
930 std::unique_ptr<Trk::Track> newTrack = std::make_unique<Trk::Track>(track.info(), std::move(trackStateOnSurfaces),
931 track.fitQuality() ? track.fitQuality()->uniqueClone() : nullptr);
932 std::unique_ptr<Trk::Track> refittedTrack;
933 if (m_onlyEO)
934 refittedTrack = std::unique_ptr<Trk::Track>(m_fitter->fit(ctx, *newTrack, m_useFitterOutlierLogic, Trk::muon));
935 else
936 refittedTrack = std::unique_ptr<Trk::Track>(m_builder->fit(ctx, *newTrack, m_useFitterOutlierLogic, Trk::muon));
937 if (refittedTrack) {
938 ATH_MSG_DEBUG("New Track " << m_printer->print(*refittedTrack) << std::endl << m_printer->printStations(*refittedTrack));
939
940 // fit ok, add new hashs to lists
941 data.mdtTrack.insert(newMdtHashes.begin(), newMdtHashes.end());
942 data.rpcTrack.insert(newRpcHashes.begin(), newRpcHashes.end());
943 data.tgcTrack.insert(newTgcHashes.begin(), newTgcHashes.end());
944 data.cscTrack.insert(newCscHashes.begin(), newCscHashes.end());
945 // New Small Wheel
946 data.stgcTrack.insert(newsTgcHashes.begin(), newsTgcHashes.end());
947 data.mmTrack.insert(newMMHashes.begin(), newMMHashes.end());
948 }
949 return refittedTrack;
950 }
951 return nullptr;
952 }
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
MuonSegment_v1 MuonSegment
Reference the current persistent version:
size_type size() const noexcept
Returns the number of elements in the collection.
IdentifierHash collectionHash() const
Returns the hashID of the PRD collection.
virtual const Trk::PlaneSurface & associatedSurface() const override final
returns the surface for the local to global transformation
virtual Identifier identify() const override final
virtual IdentifierHash identifyHash() const override final
std::unique_ptr< const Trk::TrackParameters > reachableDetEl(const EventContext &ctx, const Trk::Track &track, const Trk::TrkDetElementBase &detEl, bool smallerBounds=false) const
PublicToolHandle< MuonEDMPrinterTool > m_printer
ToolHandle< IMuonHitSummaryTool > m_hitSummaryTool
ServiceHandle< IMuonEDMHelperSvc > m_edmHelperSvc
ToolHandle< Trk::IExtrapolator > m_extrapolator
void createHoleTSOSsForClusterChamber(const Identifier &detElId, const EventContext &ctx, const Trk::TrackParameters &pars, std::set< Identifier > &layIds, std::vector< std::unique_ptr< const Trk::TrackStateOnSurface > > &states) const override
ToolHandle< IMuonSeededSegmentFinder > m_seededSegmentFinder
ToolHandle< Rec::ICombinedMuonTrackFitter > m_builder
ToolHandle< IMuonTrackSegmentMatchingTool > m_trackSegmentMatchingTool
double angleYZ() const
access method for angle of local YZ projection
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
void globalToLocalDirection(const Amg::Vector3D &glodir, Trk::LocalDirection &locdir) const
This method transforms the global direction to a local direction wrt the plane.
const std::vector< const Trk::MeasurementBase * > & containedMeasurements() const
returns the vector of Trk::MeasurementBase objects
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
std::vector< typename R::value_type > sorted(const R &r, PROJ proj={})
Helper function to create a sorted vector from an unsorted range.
const std::string & chName(ChIndex index)
convert ChIndex into a string
MuonPrepDataCollection< CscPrepData > CscPrepDataCollection
MuonPrepDataCollection< TgcPrepData > TgcPrepDataCollection
MuonPrepDataCollection< MMPrepData > MMPrepDataCollection
MuonPrepDataCollection< MdtPrepData > MdtPrepDataCollection
MuonPrepDataCollection< RpcPrepData > RpcPrepDataCollection
MuonPrepDataCollection< sTgcPrepData > sTgcPrepDataCollection
@ anyDirection
DataVector< const Trk::TrackStateOnSurface > TrackStates
@ locY
local cartesian
Definition ParamDefs.h:38
void stable_sort(DataModel_detail::iterator< DVL > beg, DataModel_detail::iterator< DVL > end)
Specialization of stable_sort for DataVector/List.

◆ collectCrossedChambers()

void MuonSegmentRegionRecoveryTool::collectCrossedChambers ( const EventContext & ctx,
const Trk::Track & track,
MuonSegmentRegionRecoveryTool::MuonData & data ) const
private

methods used by recover

Definition at line 229 of file MuonSegmentRegionRecoveryTool.cxx.

230 {
231 ATH_MSG_VERBOSE(" Collecting all crossed chambers");
232
233 const Trk::TrackStates* states = track.trackStateOnSurfaces();
234 if (!states) {
235 ATH_MSG_WARNING(" track without states, cannot perform cleaning ");
236 return;
237 }
238
239 std::set<MuonStationIndex::StIndex> stations;
240 double etamin{1e9}, etamax{-1e9}, phimin{1e9}, phimax{-1e9};
241 // loop over TSOSs
244
245 for (; tsit != tsit_end; ++tsit) {
246 const Trk::TrackParameters* pars = (*tsit)->trackParameters();
247 if (!pars) continue;
248
249 double rpos = pars->position().perp();
250 double zpos = std::abs(pars->position().z());
251 if (rpos < 2500 && zpos < 4000) continue;
252 double eta = pars->position().eta();
253 double phi = pars->position().phi();
254 if (msgLvl(MSG::DEBUG)) {
255 msg() << "All State parameters: eta: " << eta << " ,phi: " << phi << " pos r " << rpos << " z " << zpos;
256 if (pars->covariance()) msg() << MSG::DEBUG << " extrapolation error " << Amg::error(*pars->covariance(), Trk::locX);
257 msg() << endmsg;
258 }
259
260 // check whether state is a measurement
261 const Trk::MeasurementBase* meas = (*tsit)->measurementOnTrack();
262 if (!meas) continue;
263
264 Identifier id = m_edmHelperSvc->getIdentifier(*meas);
265 bool pseudo = !id.is_valid();
266
267 if (pseudo || !m_idHelperSvc->mdtIdHelper().is_muon(id)) continue;
268
269 if (eta > etamax) etamax = eta;
270 if (eta < etamin) etamin = eta;
271 if (phi > phimax) phimax = phi;
272 if (phi < phimin) phimin = phi;
273 if (msgLvl(MSG::DEBUG)) {
274 msg() << "Selected State parameters: eta: " << eta << " ,phi: " << phi << " pos r " << rpos << " z " << zpos;
275 if (pars->covariance()) msg() << MSG::DEBUG << " extrapolation error " << Amg::error(*pars->covariance(), Trk::locX);
276 msg() << endmsg;
277 }
278
279 MuonStationIndex::StIndex stIndex = m_idHelperSvc->stationIndex(id);
280 if (stations.count(stIndex)) continue;
281 stations.insert(stIndex);
282
283 // At each station launch the Reg Sel and stuff the Id hashes in a vector
284 }
285 etamin -= m_deta;
286 etamax += m_deta;
287 phimin -= m_dphi;
288 phimax += m_dphi;
289
290 ATH_MSG_DEBUG("Eta range: " << etamin << " " << etamax << " Phi range " << phimin << " " << phimax);
291 if (etamin > etamax) { // something went wrong with the fit and no hits were selected in the loop
292 ATH_MSG_DEBUG("no hits selected, nothing further will be done");
293 return;
294 }
295
296 RoiDescriptor roi(etamin, etamax, phimin, phimax);
297
298 if (m_idHelperSvc->hasMDT()) addHashes( ctx, TechnologyIndex::MDT, roi, data.mdt, data.mdtTrack);
299 if (m_idHelperSvc->hasRPC()) addHashes( ctx, TechnologyIndex::RPC, roi, data.rpc, data.rpcTrack);
300 if (m_idHelperSvc->hasTGC()) addHashes( ctx, TechnologyIndex::TGC, roi, data.tgc, data.tgcTrack);
301 if (m_regsel_csc.isEnabled()) addHashes( ctx, TechnologyIndex::CSC, roi, data.csc, data.cscTrack);
302 if (m_recoverSTGC) addHashes( ctx, TechnologyIndex::STGC, roi, data.stgc, data.stgcTrack);
303 if (m_recoverMM) addHashes( ctx, TechnologyIndex::MM, roi, data.mm, data.mmTrack);
304
305 std::set<IdentifierHash>::iterator hsit = data.mdt.begin();
306 std::set<IdentifierHash>::iterator hsit_end = data.mdt.end();
307 for (; hsit != hsit_end; ++hsit) {
308 Identifier chId;
309 IdContext otCont = m_idHelperSvc->mdtIdHelper().module_context();
310 m_idHelperSvc->mdtIdHelper().get_id(*hsit, chId, &otCont);
311 MuonStationIndex::ChIndex chIndex = m_idHelperSvc->chamberIndex(chId);
312 data.mdtPerStation[chIndex].insert(*hsit);
313 ATH_MSG_VERBOSE(" chamberlayer " << MuonStationIndex::chName(chIndex) << " " << m_idHelperSvc->toStringChamber(chId));
314 }
315 hsit = data.csc.begin();
316 hsit_end = data.csc.end();
317 for (; hsit != hsit_end; ++hsit) {
318 Identifier chId;
319 IdContext otCont = m_idHelperSvc->cscIdHelper().module_context();
320 m_idHelperSvc->cscIdHelper().get_id(*hsit, chId, &otCont);
321 chId = m_idHelperSvc->chamberId(chId);
322 MuonStationIndex::ChIndex chIndex = m_idHelperSvc->chamberIndex(chId);
323 ATH_MSG_VERBOSE(" chamberlayer " << MuonStationIndex::chName(chIndex) << " " << m_idHelperSvc->toString(chId));
324 }
325 }
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define endmsg
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
void addHashes(const EventContext &ctx, MuonStationIndex::TechnologyIndex type, const IRoiDescriptor &roi, std::set< IdentifierHash > &hashes, const std::set< IdentifierHash > &exclusion) const
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
StIndex
enum to classify the different station layers in the muon spectrometer
ChIndex chIndex(const std::string &index)
convert ChIndex name string to enum
ChIndex
enum to classify the different chamber layers in the muon spectrometer
@ locX
Definition ParamDefs.h:37
ParametersBase< TrackParametersDim, Charged > TrackParameters
MsgStream & msg
Definition testRead.cxx:32

◆ createHoleTSOSsForClusterChamber()

void MuonSegmentRegionRecoveryTool::createHoleTSOSsForClusterChamber ( const Identifier & detElId,
const EventContext & ctx,
const Trk::TrackParameters & pars,
std::set< Identifier > & layIds,
std::vector< std::unique_ptr< const Trk::TrackStateOnSurface > > & states ) const
override

Definition at line 86 of file MuonSegmentRegionRecoveryTool.cxx.

88 {
89 m_chamberHoleRecoveryTool->createHoleTSOSsForClusterChamber(detElId, ctx, pars, layIds, states);
90 }
ToolHandle< MuonChamberHoleRecoveryTool > m_chamberHoleRecoveryTool

◆ fillOnTrackChambers()

void MuonSegmentRegionRecoveryTool::fillOnTrackChambers ( const Trk::Track & theTrack,
MuonData & data ) const
private

Definition at line 327 of file MuonSegmentRegionRecoveryTool.cxx.

327 {
328 ATH_MSG_VERBOSE(" making set of already-on-track chambers");
329
330 // Collect track PRD's
331 const Trk::TrackStates* states = track.trackStateOnSurfaces();
332 if (!states) {
333 ATH_MSG_WARNING(" track without states, cannot perform cleaning ");
334 return;
335 }
336
337 std::set<MuonStationIndex::StIndex> stations;
338
339 // loop over TSOSs
342 for (; tsit != tsit_end; ++tsit) {
343 const Trk::TrackParameters* pars = (*tsit)->trackParameters();
344 if (!pars) continue;
345
346 // check whether state is a measurement
347 const Trk::MeasurementBase* meas = (*tsit)->measurementOnTrack();
348 if (!meas) continue;
349
350 const Muon::MdtDriftCircleOnTrack* mdt = dynamic_cast<const Muon::MdtDriftCircleOnTrack*>(meas);
351 if (mdt && !data.mdtTrack.count(mdt->collectionHash())) {
352 data.mdtTrack.insert(mdt->collectionHash());
353 ATH_MSG_VERBOSE("Adding " << m_idHelperSvc->toStringChamber(mdt->identify()) << " hash " << mdt->collectionHash());
354 continue;
355 }
356
357 const MuonClusterOnTrack* clus = nullptr;
358 const CompetingMuonClustersOnTrack* compRot = dynamic_cast<const CompetingMuonClustersOnTrack*>(meas);
359 if (compRot) {
360 clus = &compRot->rioOnTrack(0);
361 } else {
362 clus = dynamic_cast<const MuonClusterOnTrack*>(meas);
363 }
364 if (!clus) continue;
365
366 const RpcClusterOnTrack* rpc = dynamic_cast<const RpcClusterOnTrack*>(clus);
367 if (rpc && !data.rpcTrack.count(rpc->collectionHash())) {
368 data.rpcTrack.insert(rpc->collectionHash());
369 ATH_MSG_VERBOSE("Adding " << m_idHelperSvc->toStringChamber(clus->identify()) << " hash " << clus->collectionHash());
370 continue;
371 }
372 const TgcClusterOnTrack* tgc = dynamic_cast<const TgcClusterOnTrack*>(clus);
373 if (tgc && !data.tgcTrack.count(tgc->collectionHash())) {
374 data.tgcTrack.insert(tgc->collectionHash());
375 ATH_MSG_VERBOSE("Adding " << m_idHelperSvc->toStringChamber(clus->identify()) << " hash " << clus->collectionHash());
376 continue;
377 }
378 const CscClusterOnTrack* csc = dynamic_cast<const CscClusterOnTrack*>(clus);
379 if (csc && !data.cscTrack.count(csc->collectionHash())) {
380 data.cscTrack.insert(csc->collectionHash());
381 ATH_MSG_VERBOSE("Adding " << m_idHelperSvc->toStringChamber(clus->identify()) << " hash " << clus->collectionHash());
382 continue;
383 }
384 // New Small Wheel
385 const sTgcClusterOnTrack* stgc = dynamic_cast<const sTgcClusterOnTrack*>(clus);
386 if (stgc && !data.stgcTrack.count(stgc->collectionHash())) {
387 data.stgcTrack.insert(stgc->collectionHash());
388 ATH_MSG_VERBOSE("Adding " << m_idHelperSvc->toStringChamber(clus->identify()) << " hash " << clus->collectionHash());
389 continue;
390 }
391 const MMClusterOnTrack* mm = dynamic_cast<const MMClusterOnTrack*>(clus);
392 if (mm && !data.mmTrack.count(mm->collectionHash())) {
393 data.mmTrack.insert(mm->collectionHash());
394 ATH_MSG_VERBOSE("Adding " << m_idHelperSvc->toStringChamber(clus->identify()) << " hash " << clus->collectionHash());
395 continue;
396 }
397 }
398 }
virtual IdentifierHash collectionHash() const
Returns the hashID of the PRD collection.
IdentifierHash collectionHash() const
Returns the hashID of the PRD collection.
virtual IdentifierHash collectionHash() const
Returns the hashID of the PRD collection.
Identifier identify() const
return the identifier -extends MeasurementBase

◆ findHoles()

std::unique_ptr< Trk::Track > MuonSegmentRegionRecoveryTool::findHoles ( const EventContext & ctx,
const Trk::Track & track,
MuonData & data ) const
private

Definition at line 400 of file MuonSegmentRegionRecoveryTool.cxx.

401 {
402 const Trk::TrackStates* oldStates = track.trackStateOnSurfaces();
403 if (!oldStates) {
404 ATH_MSG_WARNING(" track without states, cannot perform mdt hole search ");
405 return nullptr;
406 }
407
408 SG::ReadCondHandle<Muon::MuonIntersectGeoData> InterSectSvc{m_chamberGeoKey,ctx};
409 if (!InterSectSvc.isValid()) {
410 ATH_MSG_ERROR("Failed to retrieve chamber intersection service");
411 return nullptr;
412 }
413
414 SG::ReadCondHandle<MuonGM::MuonDetectorManager> detMgr{m_DetectorManagerKey,ctx};
415 const MuonGM::MuonDetectorManager* MuonDetMgr = detMgr.cptr();
416
417 std::vector<std::unique_ptr<const Trk::TrackStateOnSurface>> states;
418 unsigned int nholes = 0;
419 std::set<Identifier> chambersInSearch;
420 for (const IdentifierHash& ith : data.mdt) {
421 // ignore hashes already on track
422 if (data.mdtTrack.count(ith)) {
423 ATH_MSG_VERBOSE("Chamber already on track " << ith);
424 continue;
425 }
426 Identifier chId;
427 IdContext otCont = m_idHelperSvc->mdtIdHelper().module_context();
428 m_idHelperSvc->mdtIdHelper().get_id(ith, chId, &otCont);
429
430 // ignore chambers that already had a hole search
431 if (chambersInSearch.count(chId)) {
432 ATH_MSG_VERBOSE("Chamber already on track " << ith << " " << m_idHelperSvc->toStringChamber(chId));
433 continue;
434 }
435 const MuonGM::MdtReadoutElement* detEl = MuonDetMgr->getMdtReadoutElement(chId);
436 if (!detEl) {
437 ATH_MSG_WARNING("Found no detector element for " << ith);
438 continue;
439 }
440 std::unique_ptr<const Trk::TrackParameters> exPars{reachableDetEl(ctx, track, *detEl, true)};
441 if (!exPars) {
442 ATH_MSG_DEBUG("Did not reach " << m_idHelperSvc->toStringChamber(chId) << " hash " << ith);
443 continue;
444 }
445 ATH_MSG_DEBUG("Reached " << m_idHelperSvc->toStringChamber(chId) << " hash " << ith);
446
447 // calculate crossed tubes
448 const MuonStationIntersect intersect = InterSectSvc->tubesCrossedByTrack(MuonDetMgr, chId, exPars->position(), exPars->momentum().unit());
449
450 // clear hole vector
451 for (unsigned int ii = 0; ii < intersect.tubeIntersects().size(); ++ii) {
452 const MuonTubeIntersect& tint = intersect.tubeIntersects()[ii];
453 const Identifier& id = tint.tubeId;
454 const MuonGM::MdtReadoutElement* detElLoc = MuonDetMgr->getMdtReadoutElement(id);
455
456 // addition skip for cases when the track crosses inbetween two chambers
457 if (data.mdtTrack.count(detElLoc->identifyHash())) continue;
458
459 Identifier ch = m_idHelperSvc->chamberId(id);
460 chambersInSearch.insert(ch);
461
462 const Trk::Surface& surf = detElLoc->surface(id);
463 std::unique_ptr<Trk::TrackParameters> tubePars{
464 m_extrapolator->extrapolateDirectly(ctx, *exPars, surf, Trk::anyDirection, false, Trk::muon)};
465 if (!tubePars) {
466 ATH_MSG_WARNING("Failed to extrapolate to tube " << m_idHelperSvc->toString(id));
467 continue;
468 }
469 int lay = m_idHelperSvc->mdtIdHelper().tubeLayer(id);
470 int tube = m_idHelperSvc->mdtIdHelper().tube(id);
471 double tubeLen = detElLoc->getActiveTubeLength(lay, tube);
472 double distEdge = std::abs(tubePars->parameters()[Trk::locZ]) - 0.5 * tubeLen;
473 double pullEdge = tubePars->covariance() && Amg::hasPositiveDiagElems(*tubePars->covariance())
474 ? distEdge / Amg::error(*tubePars->covariance(), Trk::locZ)
475 : distEdge / 20.;
476 std::optional<Amg::Vector2D> locPos = surf.Trk::Surface::globalToLocal(tubePars->position());
477
478 bool inBounds = false;
479 if (locPos) {
480 // perform bound check do not count holes with 100. mm of bound edge
481 inBounds = surf.bounds().insideLoc2(*locPos, -100.) && std::abs((*locPos)[Trk::locR]) <= detElLoc->innerTubeRadius();
482 }
483 if (!inBounds) {
484 ATH_MSG_VERBOSE(" discarding hole " << m_idHelperSvc->toString(id) << " dist wire " << tubePars->parameters()[Trk::locR]
485 << " outside bounds ");
486 continue;
487 }
488 ATH_MSG_VERBOSE(" new hole " << m_idHelperSvc->toString(id) << " dist wire " << tubePars->parameters()[Trk::locR]
489 << " dist tube edge " << distEdge << " pullEdge " << pullEdge);
490 ++nholes;
491 std::unique_ptr<Trk::TrackStateOnSurface> tsos = MuonTSOSHelper::createHoleTSOS(std::move(tubePars));
492 states.emplace_back(std::move(tsos));
493 }
494 if (!nholes) ATH_MSG_DEBUG("found holes " << nholes);
495 }
496
497 for (const IdentifierHash& ith : data.csc) {
498 // ignore hashes already on track
499 if (data.cscTrack.count(ith)) {
500 ATH_MSG_VERBOSE("Chamber already on track " << ith);
501 continue;
502 }
503 Identifier chId;
504 IdContext otCont = m_idHelperSvc->cscIdHelper().module_context();
505 m_idHelperSvc->cscIdHelper().get_id(ith, chId, &otCont);
506 chId = m_idHelperSvc->chamberId(chId);
507
508 const MuonGM::CscReadoutElement* detEl = MuonDetMgr->getCscReadoutElement(chId);
509 if (!detEl) {
510 ATH_MSG_WARNING("Found no detector element for " << ith << " " << m_idHelperSvc->toString(chId));
511 continue;
512 }
513
514 std::unique_ptr<const Trk::TrackParameters> exPars{reachableDetEl(ctx, track, *detEl, true)};
515 if (!exPars) {
516 ATH_MSG_DEBUG("Did not reach " << m_idHelperSvc->toStringChamber(chId) << " hash " << ith);
517 continue;
518 }
519 Identifier detElId = m_idHelperSvc->detElId(chId);
520 std::set<Identifier> layIds;
521 std::vector<std::unique_ptr<const Trk::TrackStateOnSurface>> cscstates;
522 createHoleTSOSsForClusterChamber(detElId, ctx, *exPars, layIds, cscstates);
523 ATH_MSG_DEBUG("Reached " << m_idHelperSvc->toString(chId) << " hash " << ith << " holes " << cscstates.size());
524
525 for (std::unique_ptr<const Trk::TrackStateOnSurface>& cscit : cscstates) {
526 ATH_MSG_VERBOSE("Adding " << cscit.get());
527 states.emplace_back(std::move(cscit));
528 }
529 }
530 for (const IdentifierHash& ith : data.tgc) {
531 // ignore hashes already on track
532 if (data.tgcTrack.count(ith)) {
533 ATH_MSG_VERBOSE("Chamber already on track " << ith);
534 continue;
535 }
536 Identifier chId;
537 IdContext otCont = m_idHelperSvc->tgcIdHelper().module_context();
538 m_idHelperSvc->tgcIdHelper().get_id(ith, chId, &otCont);
539 chId = m_idHelperSvc->chamberId(chId);
540
541 const MuonGM::TgcReadoutElement* detEl = MuonDetMgr->getTgcReadoutElement(chId);
542 if (!detEl) {
543 ATH_MSG_WARNING("Found no detector element for " << ith << " " << m_idHelperSvc->toString(chId));
544 continue;
545 }
546
547 std::unique_ptr<const Trk::TrackParameters> exPars{reachableDetEl(ctx, track, *detEl, true)};
548 if (!exPars) {
549 ATH_MSG_DEBUG("Did not reach " << m_idHelperSvc->toStringChamber(chId) << " hash " << ith);
550 continue;
551 }
552 Identifier detElId = m_idHelperSvc->detElId(chId);
553 std::set<Identifier> layIds;
554 std::vector<std::unique_ptr<const Trk::TrackStateOnSurface>> tgcstates;
555 createHoleTSOSsForClusterChamber(detElId, ctx, *exPars, layIds, tgcstates);
556 ATH_MSG_DEBUG("Reached " << m_idHelperSvc->toString(chId) << " hash " << ith << " holes " << tgcstates.size());
557
558 for (std::unique_ptr<const Trk::TrackStateOnSurface>& tgcit : tgcstates) {
559 ATH_MSG_VERBOSE("Adding " << tgcit.get());
560 states.emplace_back(std::move(tgcit));
561 }
562 }
563
564 for (const IdentifierHash& ith : data.rpc) {
565 // ignore hashes already on track
566 if (data.rpcTrack.count(ith)) {
567 ATH_MSG_VERBOSE("Chamber already on track " << ith);
568 continue;
569 }
570 Identifier chId;
571 IdContext otCont = m_idHelperSvc->rpcIdHelper().module_context();
572 m_idHelperSvc->rpcIdHelper().get_id(ith, chId, &otCont);
573 chId = m_idHelperSvc->chamberId(chId);
574
575 const MuonGM::RpcReadoutElement* detEl = MuonDetMgr->getRpcReadoutElement(chId);
576 if (!detEl) {
577 ATH_MSG_WARNING("Found no detector element for " << ith << " " << m_idHelperSvc->toString(chId));
578 continue;
579 }
580
581 std::unique_ptr<const Trk::TrackParameters> exPars{reachableDetEl(ctx, track, *detEl, true)};
582 if (!exPars) {
583 ATH_MSG_DEBUG("Did not reach " << m_idHelperSvc->toStringChamber(chId) << " hash " << ith);
584 continue;
585 }
586 Identifier detElId = m_idHelperSvc->detElId(chId);
587 std::set<Identifier> layIds;
588 std::vector<std::unique_ptr<const Trk::TrackStateOnSurface>> rpcstates;
589 createHoleTSOSsForClusterChamber(detElId, ctx, *exPars, layIds, rpcstates);
590 ATH_MSG_DEBUG("Reached " << m_idHelperSvc->toString(chId) << " hash " << ith << " holes " << rpcstates.size());
591
592 for (std::unique_ptr<const Trk::TrackStateOnSurface>& rpcit : rpcstates) {
593 ATH_MSG_VERBOSE("Adding " << rpcit.get());
594 states.emplace_back(std::move(rpcit));
595 }
596 }
597
598 // New Small Wheel
599 // sTGC
600 for (const IdentifierHash& ith : data.stgc) {
601 // ignore hashes already on track
602 if (data.stgcTrack.count(ith)) {
603 ATH_MSG_VERBOSE("Chamber already on track " << ith);
604 continue;
605 }
606 Identifier chId;
607 IdContext otCont = m_idHelperSvc->stgcIdHelper().module_context();
608 m_idHelperSvc->stgcIdHelper().get_id(ith, chId, &otCont);
609
610 if (!chId.is_valid()) {
611 ATH_MSG_VERBOSE("invalid chId for stgc data " << ith);
612 continue;
613 }
614
615 chId = m_idHelperSvc->chamberId(chId);
616
617 const MuonGM::sTgcReadoutElement* detEl = MuonDetMgr->getsTgcReadoutElement(chId);
618 if (!detEl) {
619 ATH_MSG_WARNING("Found no detector element for " << ith << " " << m_idHelperSvc->toString(chId));
620 continue;
621 }
622
623 std::unique_ptr<const Trk::TrackParameters> exPars{reachableDetEl(ctx, track, *detEl, true)};
624 if (!exPars) {
625 ATH_MSG_DEBUG("Did not reach " << m_idHelperSvc->toStringChamber(chId) << " hash " << ith);
626 continue;
627 }
628 Identifier detElId = m_idHelperSvc->detElId(chId);
629 std::set<Identifier> layIds;
630 std::vector<std::unique_ptr<const Trk::TrackStateOnSurface>> stgcstates;
631 createHoleTSOSsForClusterChamber(detElId, ctx, *exPars, layIds, stgcstates);
632 ATH_MSG_DEBUG("Reached " << m_idHelperSvc->toString(chId) << " hash " << ith << " holes " << stgcstates.size());
633
634 for (std::unique_ptr<const Trk::TrackStateOnSurface>& stgcit : stgcstates) {
635 ATH_MSG_VERBOSE("Adding " << stgcit.get());
636 states.push_back(std::move(stgcit));
637 }
638 }
639
640 // MM
641 for (const IdentifierHash& ith : data.mm) {
642 // ignore hashes already on track
643 if (data.mmTrack.count(ith)) {
644 ATH_MSG_VERBOSE("Chamber already on track " << ith);
645 continue;
646 }
647 Identifier chId;
648 IdContext otCont = m_idHelperSvc->mmIdHelper().module_context();
649 m_idHelperSvc->mmIdHelper().get_id(ith, chId, &otCont);
650
651 if (!chId.is_valid()) {
652 ATH_MSG_VERBOSE("invalid chId for mm data " << ith);
653 continue;
654 }
655
656 chId = m_idHelperSvc->chamberId(chId);
657
658 const MuonGM::MMReadoutElement* detEl = MuonDetMgr->getMMReadoutElement(chId);
659 if (!detEl) {
660 ATH_MSG_WARNING("Found no detector element for " << ith << " " << m_idHelperSvc->toString(chId));
661 continue;
662 }
663
664 std::unique_ptr<const Trk::TrackParameters> exPars{reachableDetEl(ctx, track, *detEl, true)};
665 if (!exPars) {
666 ATH_MSG_DEBUG("Did not reach " << m_idHelperSvc->toStringChamber(chId) << " hash " << ith);
667 continue;
668 }
669 Identifier detElId = m_idHelperSvc->detElId(chId);
670 std::set<Identifier> layIds;
671 std::vector<std::unique_ptr<const Trk::TrackStateOnSurface>> mmstates;
672 createHoleTSOSsForClusterChamber(detElId, ctx, *exPars, layIds, mmstates);
673 ATH_MSG_DEBUG("Reached " << m_idHelperSvc->toString(chId) << " hash " << ith << " holes " << mmstates.size());
674
675 for (std::unique_ptr<const Trk::TrackStateOnSurface>& mmit : mmstates) {
676 ATH_MSG_VERBOSE("Adding " << mmit.get());
677 states.emplace_back(std::move(mmit));
678 }
679 }
680 if (!states.empty()) {
681 // states were added, create a new track
682 auto trackStateOnSurfaces = std::make_unique<Trk::TrackStates>();
683 trackStateOnSurfaces->reserve(oldStates->size() + states.size());
684
685 std::vector<std::unique_ptr<const Trk::TrackStateOnSurface>> toBeSorted;
686 toBeSorted.reserve(oldStates->size() + states.size());
687
688 for (const Trk::TrackStateOnSurface* sit : *oldStates) toBeSorted.emplace_back(sit->clone());
689
690 for (std::unique_ptr<const Trk::TrackStateOnSurface>& stit : states) toBeSorted.emplace_back(std::move(stit));
691
692 std::stable_sort(toBeSorted.begin(), toBeSorted.end(), SortTSOSs(&*m_edmHelperSvc, &*m_idHelperSvc));
693
694 for (std::unique_ptr<const Trk::TrackStateOnSurface>& sorted : toBeSorted) { trackStateOnSurfaces->push_back(sorted.release()); }
695 std::unique_ptr<Trk::Track> trackWithHoles = std::make_unique<Trk::Track>(
696 track.info(), std::move(trackStateOnSurfaces), track.fitQuality() ? track.fitQuality()->uniqueClone() : nullptr);
697 // generate a track summary for this track
698 if (m_trackSummaryTool.isEnabled()) { m_trackSummaryTool->computeAndReplaceTrackSummary(ctx, *trackWithHoles, false); }
699 ATH_MSG_DEBUG("Track with holes " << m_printer->print(*trackWithHoles) << std::endl
700 << m_printer->printStations(*trackWithHoles));
701 return trackWithHoles;
702 }
703 return nullptr;
704 }
#define ATH_MSG_ERROR(x)
bool is_valid() const
Check if id is in a valid state.
double getActiveTubeLength(const int tubeLayer, const int tube) const
virtual const Trk::Surface & surface() const override final
Return surface associated with this detector element.
double innerTubeRadius() const
Returns the inner tube radius excluding the aluminium walls.
const RpcReadoutElement * getRpcReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const MdtReadoutElement * getMdtReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const MMReadoutElement * getMMReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const TgcReadoutElement * getTgcReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const sTgcReadoutElement * getsTgcReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const CscReadoutElement * getCscReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
IdentifierHash identifyHash() const override final
Returns the IdentifierHash of the MuonStation, i.e.
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trackSummaryTool
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_DetectorManagerKey
SG::ReadCondHandleKey< Muon::MuonIntersectGeoData > m_chamberGeoKey
static std::unique_ptr< Trk::TrackStateOnSurface > createHoleTSOS(std::unique_ptr< Trk::TrackParameters > pars)
create a hole TSOS, takes ownership of the pointers
const_pointer_type cptr()
virtual bool insideLoc2(const Amg::Vector2D &locpo, double tol2=0.) const =0
Extend the interface to for single inside Loc 1 / Loc2 tests.
virtual const SurfaceBounds & bounds() const =0
Surface Bounds method.
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.
bool hasPositiveDiagElems(const AmgSymMatrix(N) &mat)
Returns true if all diagonal elements of the covariance matrix are finite aka sane in the above defin...
@ locR
Definition ParamDefs.h:44
@ locZ
local cylindrical
Definition ParamDefs.h:42

◆ initialize()

StatusCode MuonSegmentRegionRecoveryTool::initialize ( )
overridevirtual

AlgTool initialize.

Old chamber technologies

Definition at line 49 of file MuonSegmentRegionRecoveryTool.cxx.

49 {
50 ATH_CHECK(m_edmHelperSvc.retrieve());
51 ATH_CHECK(m_chamberGeoKey.initialize());
52 ATH_CHECK(m_DetectorManagerKey.initialize());
53 ATH_CHECK(m_printer.retrieve());
55
56 if (!m_trackSegmentMatchingTool.empty()) {
58 ATH_MSG_INFO("Using matching tool " << m_trackSegmentMatchingTool);
59 } else {
60 ATH_MSG_DEBUG("No matching tool selected ");
61 }
62
64 ATH_CHECK(m_extrapolator.retrieve());
65 if (m_onlyEO) {
66 ATH_CHECK(m_fitter.retrieve());
67 m_builder.disable();
68 } else {
69 m_fitter.disable();
70 ATH_CHECK(m_builder.retrieve());
71 }
72 ATH_CHECK(m_idHelperSvc.retrieve());
73 ATH_CHECK(m_hitSummaryTool.retrieve());
75 ATH_CHECK(m_regsel_mdt.retrieve());
76 ATH_CHECK(m_regsel_rpc.retrieve());
77 ATH_CHECK(m_regsel_tgc.retrieve());
80 ATH_CHECK(m_regsel_csc.retrieve(DisableTool{m_regsel_csc.empty()}));
81 ATH_CHECK(m_regsel_stgc.retrieve(DisableTool{!m_recoverSTGC}));
82 ATH_CHECK(m_regsel_mm.retrieve(DisableTool{!m_recoverMM}));
83 return StatusCode::SUCCESS;
84 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)

◆ reachableDetEl()

std::unique_ptr< const Trk::TrackParameters > MuonSegmentRegionRecoveryTool::reachableDetEl ( const EventContext & ctx,
const Trk::Track & track,
const Trk::TrkDetElementBase & detEl,
bool smallerBounds = false ) const
private

Definition at line 954 of file MuonSegmentRegionRecoveryTool.cxx.

957 {
958 ATH_MSG_VERBOSE("reachableDetEl() " << m_idHelperSvc->toStringDetEl(detEl.identify()) << " at " << detEl.center());
959 std::unique_ptr<const Trk::TrackParameters> exPars;
960 std::unique_ptr<const Trk::TrackParameters> closest{MuonGetClosestParameters::closestParameters(track, detEl.surface(), true)};
961 if (closest) {
962 ATH_MSG_VERBOSE("Extrapolating from closest point:\n" << m_printer->print(*closest));
963 exPars = m_extrapolator->extrapolateDirectly(ctx, *closest, detEl.surface(), Trk::anyDirection, false, Trk::muon);
964
965 } else {
966 ATH_MSG_VERBOSE("Extrapolating from track (no closest point found):\n" << m_printer->print(track));
967 exPars = m_extrapolator->extrapolateTrack(ctx, track, detEl.surface(), Trk::anyDirection, false, Trk::muon);
968 }
969 if (!exPars) {
970 ATH_MSG_DEBUG("Extrapolation did not succeed");
971 return nullptr;
972 }
973 Amg::Vector2D locPos(exPars->parameters()[Trk::locX], exPars->parameters()[Trk::locY]);
974
975 double tolx = 100.; // positive -> large surface
976 double toly = 100.; // positive -> large surface
977 const AmgSymMatrix(5)* errMat = exPars->covariance();
978 if (errMat) {
979 ATH_MSG_VERBOSE("Extrapolated local Position & Error matrix\n:" << locPos << "\n" << Amg::toString(*errMat));
980 // MJW check validity of errors before using them (fix for bug #82920)
981 double covx = (*errMat)(Trk::locX, Trk::locX);
982 double covy = (*errMat)(Trk::locY, Trk::locY);
983 if (covx > 0.0 && covy > 0.0) {
984 tolx = 3 * covx;
985 toly = 3 * covy;
986 }
987 }
988
989 // in case we are looking for holes, only ignore stations if we are within 100 mm of the chamber edge
990 // all other holes are counted even if the extrapolation errors are large.
991 if (smallerBounds) {
992 if (tolx > 10.) tolx = 10.;
993 if (toly > 10.) toly = 10.;
994 // refer sign to check 'inside' the bounds
995 tolx *= -1.;
996 toly *= -1.;
997 }
998 bool inbounds = detEl.surface().insideBounds(locPos, tolx, toly);
999 if (msgLvl(MSG::DEBUG)) {
1000 std::ostringstream parsType;
1001 parsType << "pos=(" << locPos[Trk::locX] << "," << locPos[Trk::locY] << ")";
1002 if (errMat) { parsType << " exError=(" << Amg::error(*errMat, Trk::locX) << "," << Amg::error(*errMat, Trk::locY) << ")"; }
1003 parsType << " tolerance=(" << tolx << "," << toly << ")";
1004 if (inbounds)
1005 parsType << " => inbounds";
1006 else
1007 parsType << " => outbounds";
1008 ATH_MSG_DEBUG(" " << m_idHelperSvc->toStringChamber(detEl.identify()) << " pars " << parsType.str());
1009 }
1010 if (!inbounds) { return nullptr; }
1011 return exPars;
1012 }
#define AmgSymMatrix(dim)
static std::unique_ptr< Trk::TrackParameters > closestParameters(const Trk::Track &track, const Amg::Vector3D &pos, bool onlyUseMeasured=false)
virtual bool insideBounds(const Amg::Vector2D &locpos, double tol1=0., double tol2=0.) const =0
virtual methods to be overwritten by the inherited surfaces
virtual const Amg::Vector3D & center() const =0
Return the center of the element.
virtual Identifier identify() const =0
Identifier.
virtual const Surface & surface() const =0
Return surface associated with this detector element.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Eigen::Matrix< double, 2, 1 > Vector2D

◆ recover()

std::unique_ptr< Trk::Track > MuonSegmentRegionRecoveryTool::recover ( const Trk::Track & track,
const EventContext & ctx ) const
overridevirtual

returns a new track with segments recovered using RegionSelector

Algorithmic part Strategy: 1) Extrapolate back to MS entry record 2) Collect hashes of chambers close to where the track passed 3) Compare collected Hashes with the ones already on track 4) Recover segments on the missing chambers by launching the SeededSegmentFinder.

2) Collect hashes of chambers close to where the track passed 2a) Extrapolate forward to the next station 2b) Launch selector to get IDHashes 2c) push_back hashes for this station into a set 2d) stop where outer layers are 2e) the outcome of all of this is a std::set of collected hashes (some are already on the track, no need to recover)

Definition at line 99 of file MuonSegmentRegionRecoveryTool.cxx.

99 {
100 // Welcome into the implementation of the recovery method
101 ATH_MSG_VERBOSE(" Entering segment recovery method " << m_printer->print(track) << std::endl << m_printer->printStations(track));
102
103 // First run the MuonChamberHoleRecoveryTool on the input track
104 std::unique_ptr<Trk::Track> chRecTrack(m_chamberHoleRecoveryTool->recover(track, ctx));
105 if (!chRecTrack) {
106 ATH_MSG_DEBUG(" MuonChamberHoleRecoveryTool failed to create a new track "
107 << " Returning input (unrecovered) track ");
108 return std::make_unique<Trk::Track>(track);
109 }
110 ATH_MSG_VERBOSE(" After chamber hole recovery " << m_printer->print(*chRecTrack) << std::endl
111 << m_printer->printStations(*chRecTrack));
112 // only run this on single station EM tracks
113 if (m_onlyEO) {
114 // should be a sl track
115 // using release until parent tools use unique_ptr
116 if (!m_edmHelperSvc->isSLTrack(*chRecTrack)) return chRecTrack;
117
118 // get hit summary
119 IMuonHitSummaryTool::CompactSummary hitSummary = m_hitSummaryTool->summary(*chRecTrack);
120 // should be single station
121 // using release until parent tools use unique_ptr
122 if (hitSummary.stationLayers.size() != 1 || !hitSummary.stationLayers.count(StIndex::EM)) return chRecTrack;
123 ATH_MSG_DEBUG("Single station track, checking for EO hits");
124 }
125
126 // 1) Extrapolate back to MS entry record
127 // const Trk::TrackParameters* msEntryPars = goToMSEntryRecord( *chRecTrack );
128 // if(!msEntryPars) return chRecTrack;
129
137
138 MuonData muonData;
139 // extract the hashes already on track
140 fillOnTrackChambers(*chRecTrack, muonData);
141
142 // collect the hashes not in track close to the track
143 collectCrossedChambers( ctx, *chRecTrack, muonData);
144
145 // 3b) compare the two std::sets and make a final std::set of not-yet-on-track Hashes
146 std::unique_ptr<Trk::Track> triggerRecTrack = addMissingChambers(ctx, *chRecTrack, muonData, false);
147 if (triggerRecTrack) chRecTrack.swap(triggerRecTrack);
148
149 std::unique_ptr<Trk::Track> mdtRecTrack = addMissingChambers(ctx, *chRecTrack, muonData, true);
150 if (mdtRecTrack) chRecTrack.swap(mdtRecTrack);
151
152 std::unique_ptr<Trk::Track> mdtRecTrackWithHoles = findHoles(ctx, *chRecTrack, muonData);
153 if (mdtRecTrackWithHoles) chRecTrack.swap(mdtRecTrackWithHoles);
154
155 // recovered track, success!
156 // use release until calling tools also use unique_ptr
157 return chRecTrack;
158 }
void fillOnTrackChambers(const Trk::Track &theTrack, MuonData &data) const
std::unique_ptr< Trk::Track > addMissingChambers(const EventContext &ctx, const Trk::Track &track, MuonData &data, bool addMdt) const
std::unique_ptr< Trk::Track > findHoles(const EventContext &ctx, const Trk::Track &track, MuonData &data) const
void collectCrossedChambers(const EventContext &ctx, const Trk::Track &track, MuonData &data) const
methods used by recover

Member Data Documentation

◆ m_builder

ToolHandle<Rec::ICombinedMuonTrackFitter> Muon::MuonSegmentRegionRecoveryTool::m_builder {this, "Builder", ""}
private

Definition at line 139 of file MuonSegmentRegionRecoveryTool.h.

139{this, "Builder", ""};

◆ m_chamberGeoKey

SG::ReadCondHandleKey<Muon::MuonIntersectGeoData> Muon::MuonSegmentRegionRecoveryTool::m_chamberGeoKey {this, "ChamberGeoKey", "MuonStationIntersects", "Pointer to hole search service"}
private

Definition at line 151 of file MuonSegmentRegionRecoveryTool.h.

151{this, "ChamberGeoKey", "MuonStationIntersects", "Pointer to hole search service"};

◆ m_chamberHoleRecoveryTool

ToolHandle<MuonChamberHoleRecoveryTool> Muon::MuonSegmentRegionRecoveryTool::m_chamberHoleRecoveryTool {this, "ChamberHoleRecoveryTool", "", "hit-based hole search"}
private

Definition at line 137 of file MuonSegmentRegionRecoveryTool.h.

137{this, "ChamberHoleRecoveryTool", "", "hit-based hole search"};

◆ m_deta

Gaudi::Property<double> Muon::MuonSegmentRegionRecoveryTool::m_deta {this, "DeltaEtaRegion", 0.05}
private

Definition at line 156 of file MuonSegmentRegionRecoveryTool.h.

156{this, "DeltaEtaRegion", 0.05};

◆ m_DetectorManagerKey

SG::ReadCondHandleKey<MuonGM::MuonDetectorManager> Muon::MuonSegmentRegionRecoveryTool::m_DetectorManagerKey
private
Initial value:
{this, "DetectorManagerKey", "MuonDetectorManager",
"Key of input MuonDetectorManager condition data"}

Definition at line 152 of file MuonSegmentRegionRecoveryTool.h.

152 {this, "DetectorManagerKey", "MuonDetectorManager",
153 "Key of input MuonDetectorManager condition data"};

◆ m_dphi

Gaudi::Property<double> Muon::MuonSegmentRegionRecoveryTool::m_dphi {this, "DeltaPhiRegion", 0.1}
private

Definition at line 157 of file MuonSegmentRegionRecoveryTool.h.

157{this, "DeltaPhiRegion", 0.1};

◆ m_edmHelperSvc

ServiceHandle<IMuonEDMHelperSvc> Muon::MuonSegmentRegionRecoveryTool::m_edmHelperSvc
private
Initial value:
{this, "edmHelper", "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc",
"Handle to the service providing the IMuonEDMHelperSvc interface"}

Definition at line 127 of file MuonSegmentRegionRecoveryTool.h.

127 {this, "edmHelper", "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc",
128 "Handle to the service providing the IMuonEDMHelperSvc interface"};

◆ m_excludeEES

Gaudi::Property<bool> Muon::MuonSegmentRegionRecoveryTool::m_excludeEES {this, "ExcludeEES", true}
private

Definition at line 158 of file MuonSegmentRegionRecoveryTool.h.

158{this, "ExcludeEES", true};

◆ m_extrapolator

ToolHandle<Trk::IExtrapolator> Muon::MuonSegmentRegionRecoveryTool::m_extrapolator {this, "Extrapolator", "Trk::Extrapolator/MuonExtrapolator"}
private

Definition at line 138 of file MuonSegmentRegionRecoveryTool.h.

138{this, "Extrapolator", "Trk::Extrapolator/MuonExtrapolator"};

◆ m_fitter

ToolHandle<Trk::ITrackFitter> Muon::MuonSegmentRegionRecoveryTool::m_fitter {this, "Fitter", "Trk::GlobalChi2Fitter/MCTBSLFitter"}
private

Definition at line 140 of file MuonSegmentRegionRecoveryTool.h.

140{this, "Fitter", "Trk::GlobalChi2Fitter/MCTBSLFitter"};

◆ m_hitSummaryTool

ToolHandle<IMuonHitSummaryTool> Muon::MuonSegmentRegionRecoveryTool::m_hitSummaryTool {this, "HitSummaryTool", "Muon::MuonHitSummaryTool/MuonHitSummaryTool"}
private

Definition at line 141 of file MuonSegmentRegionRecoveryTool.h.

141{this, "HitSummaryTool", "Muon::MuonHitSummaryTool/MuonHitSummaryTool"};

◆ m_idHelperSvc

ServiceHandle<Muon::IMuonIdHelperSvc> Muon::MuonSegmentRegionRecoveryTool::m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
private

Definition at line 130 of file MuonSegmentRegionRecoveryTool.h.

130{this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};

◆ m_onlyEO

Gaudi::Property<bool> Muon::MuonSegmentRegionRecoveryTool::m_onlyEO {this, "OnlyEO", false}
private

Definition at line 159 of file MuonSegmentRegionRecoveryTool.h.

159{this, "OnlyEO", false};

◆ m_printer

PublicToolHandle<MuonEDMPrinterTool> Muon::MuonSegmentRegionRecoveryTool::m_printer {this, "EDMPrinter", "Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"}
private

Definition at line 148 of file MuonSegmentRegionRecoveryTool.h.

148{this, "EDMPrinter", "Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"};

◆ m_recoverMM

Gaudi::Property<bool> Muon::MuonSegmentRegionRecoveryTool::m_recoverMM {this, "RecoverMM", true, "Pick up dropped micromega chambers"}
private

Definition at line 162 of file MuonSegmentRegionRecoveryTool.h.

162{this, "RecoverMM", true, "Pick up dropped micromega chambers"};

◆ m_recoverSTGC

Gaudi::Property<bool> Muon::MuonSegmentRegionRecoveryTool::m_recoverSTGC {this, "RecoverSTGC", true, "Pick up dropped sTGC chambers"}
private

Definition at line 163 of file MuonSegmentRegionRecoveryTool.h.

163{this, "RecoverSTGC", true, "Pick up dropped sTGC chambers"};

◆ m_regsel_csc

ToolHandle<IRegSelTool> Muon::MuonSegmentRegionRecoveryTool::m_regsel_csc {this, "CSCRegionSelector", "RegSelTool/RegSelTool_CSC"}
private

Definition at line 143 of file MuonSegmentRegionRecoveryTool.h.

143{this, "CSCRegionSelector", "RegSelTool/RegSelTool_CSC"};

◆ m_regsel_mdt

ToolHandle<IRegSelTool> Muon::MuonSegmentRegionRecoveryTool::m_regsel_mdt {this, "MDTRegionSelector", "RegSelTool/RegSelTool_MDT"}
private

Definition at line 142 of file MuonSegmentRegionRecoveryTool.h.

142{this, "MDTRegionSelector", "RegSelTool/RegSelTool_MDT"};

◆ m_regsel_mm

ToolHandle<IRegSelTool> Muon::MuonSegmentRegionRecoveryTool::m_regsel_mm {this, "MMRegionSelector", "RegSelTool/RegSelTool_MM"}
private

Definition at line 147 of file MuonSegmentRegionRecoveryTool.h.

147{this, "MMRegionSelector", "RegSelTool/RegSelTool_MM"};

◆ m_regsel_rpc

ToolHandle<IRegSelTool> Muon::MuonSegmentRegionRecoveryTool::m_regsel_rpc {this, "RPCRegionSelector", "RegSelTool/RegSelTool_RPC"}
private

Definition at line 144 of file MuonSegmentRegionRecoveryTool.h.

144{this, "RPCRegionSelector", "RegSelTool/RegSelTool_RPC"};

◆ m_regsel_stgc

ToolHandle<IRegSelTool> Muon::MuonSegmentRegionRecoveryTool::m_regsel_stgc {this, "STGCRegionSelector", "RegSelTool/RegSelTool_STGC"}
private

Definition at line 146 of file MuonSegmentRegionRecoveryTool.h.

146{this, "STGCRegionSelector", "RegSelTool/RegSelTool_STGC"};

◆ m_regsel_tgc

ToolHandle<IRegSelTool> Muon::MuonSegmentRegionRecoveryTool::m_regsel_tgc {this, "TGCRegionSelector", "RegSelTool/RegSelTool_TGC"}
private

Definition at line 145 of file MuonSegmentRegionRecoveryTool.h.

145{this, "TGCRegionSelector", "RegSelTool/RegSelTool_TGC"};

◆ m_seededSegmentFinder

ToolHandle<IMuonSeededSegmentFinder> Muon::MuonSegmentRegionRecoveryTool::m_seededSegmentFinder
private
Initial value:
{this, "SeededSegmentFinder",
"Muon::MuonSeededSegmentFinder/MuonSeededSegmentFinder"}

Definition at line 132 of file MuonSegmentRegionRecoveryTool.h.

132 {this, "SeededSegmentFinder",
133 "Muon::MuonSeededSegmentFinder/MuonSeededSegmentFinder"};

◆ m_trackSegmentMatchingTool

ToolHandle<IMuonTrackSegmentMatchingTool> Muon::MuonSegmentRegionRecoveryTool::m_trackSegmentMatchingTool
private
Initial value:
{this, "TrackSegmentMatchingTool",
"Muon::MooCandidateMatchingTool/MooCandidateMatchingTool"}

Definition at line 134 of file MuonSegmentRegionRecoveryTool.h.

134 {this, "TrackSegmentMatchingTool",
135 "Muon::MooCandidateMatchingTool/MooCandidateMatchingTool"};

◆ m_trackSummaryTool

ToolHandle<Trk::IExtendedTrackSummaryTool> Muon::MuonSegmentRegionRecoveryTool::m_trackSummaryTool {this, "TrackSummaryTool", "MuonTrackSummaryTool"}
private

Definition at line 149 of file MuonSegmentRegionRecoveryTool.h.

149{this, "TrackSummaryTool", "MuonTrackSummaryTool"};

◆ m_useFitterOutlierLogic

Gaudi::Property<bool> Muon::MuonSegmentRegionRecoveryTool::m_useFitterOutlierLogic {this, "UseFitterOutlierLogic", true}
private

Definition at line 160 of file MuonSegmentRegionRecoveryTool.h.

160{this, "UseFitterOutlierLogic", true};

The documentation for this class was generated from the following files: