diff --git a/MuonSpectrometer/MuonReconstruction/MuonRecTools/MuonAmbiTrackSelectionTool/src/MuonAmbiTrackSelectionTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonRecTools/MuonAmbiTrackSelectionTool/src/MuonAmbiTrackSelectionTool.cxx index 01410abf0ea916aabbab162c4b5e29d3096122e2..16e55ebeb29a387ee1c0c3faef1b4e198ce878e4 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonRecTools/MuonAmbiTrackSelectionTool/src/MuonAmbiTrackSelectionTool.cxx +++ b/MuonSpectrometer/MuonReconstruction/MuonRecTools/MuonAmbiTrackSelectionTool/src/MuonAmbiTrackSelectionTool.cxx @@ -102,11 +102,7 @@ const Trk::Track* Muon::MuonAmbiTrackSelectionTool::getCleanedOutTrack(const Trk ATH_MSG_VERBOSE("New Track " << m_printer->print(*ptrTrack)); std::map<Muon::MuonStationIndex::StIndex,int> sharedPrecisionPerLayer; - std::map<Muon::MuonStationIndex::StIndex,int> sharedTriggerEtaPerLayer; - std::map<Muon::MuonStationIndex::StIndex,int> sharedPhiPerLayer; std::map<Muon::MuonStationIndex::StIndex,int> precisionPerLayer; - std::map<Muon::MuonStationIndex::StIndex,int> triggerEtaPerLayer; - std::map<Muon::MuonStationIndex::StIndex,int> phiPerLayer; // loop over TSOS DataVector<const Trk::TrackStateOnSurface>::const_iterator iTsos = tsos->begin(); @@ -123,63 +119,39 @@ const Trk::Track* Muon::MuonAmbiTrackSelectionTool::getCleanedOutTrack(const Trk const Trk::RIO_OnTrack* rot = dynamic_cast <const Trk::RIO_OnTrack*> (meas); if (!rot) { - // could be a Pseudo-Measurement + // we are only interested in precision hits since only they have the resolution to distinguish between close-by tracks + // so we only take competing ROTs if they are CSC eta hits const Trk::CompetingRIOsOnTrack* competingROT = dynamic_cast <const Trk::CompetingRIOsOnTrack*> (meas); - if (competingROT) { - bool measPhi = false; - ++numhits; - const unsigned int numROTs = competingROT->numberOfContainedROTs(); - bool overlap = false; - Muon::MuonStationIndex::StIndex stIndex = Muon::MuonStationIndex::StUnknown; - for( unsigned int i=0;i<numROTs;++i ){ - const Trk::RIO_OnTrack* rot = &competingROT->rioOnTrack(i); - if( !rot || !rot->prepRawData() || !m_idHelperTool->isMuon(rot->identify()) ) continue; - stIndex = m_idHelperTool->stationIndex(rot->identify()); - measPhi = m_idHelperTool->measuresPhi(rot->identify()); - + if(competingROT){ + const unsigned int numROTs = competingROT->numberOfContainedROTs(); + for( unsigned int i=0;i<numROTs;++i ){ + const Trk::RIO_OnTrack* rot = &competingROT->rioOnTrack(i); + if( !rot || !rot->prepRawData() || !m_idHelperTool->isMuon(rot->identify()) ) continue; + //only use precision hits for muon track overlap + if(!m_idHelperTool->isMdt(rot->identify()) && !(m_idHelperTool->isCsc(rot->identify()) && !m_idHelperTool->measuresPhi(rot->identify()))) continue; + Muon::MuonStationIndex::StIndex stIndex = m_idHelperTool->stationIndex(rot->identify()); + ++precisionPerLayer[stIndex]; if ( m_assoTool->isUsed(*(rot->prepRawData()))) { ATH_MSG_VERBOSE("Track overlap found! " << m_idHelperTool->toString(rot->identify())); - overlap = true; - break; + ++numshared; + ++sharedPrecisionPerLayer[stIndex]; } } - - if( overlap ){ - ++numshared; - if( measPhi ) ++sharedPhiPerLayer[stIndex]; - else ++sharedTriggerEtaPerLayer[stIndex]; - }else{ - if( measPhi ) ++phiPerLayer[stIndex]; - else ++triggerEtaPerLayer[stIndex]; - } - } }else{ if(!m_idHelperTool->isMuon(rot->identify())) continue; + if(!m_idHelperTool->isMdt(rot->identify()) && !(m_idHelperTool->isCsc(rot->identify()) && !m_idHelperTool->measuresPhi(rot->identify()))) continue; //only precision hits used for overlap ++numhits; Muon::MuonStationIndex::StIndex stIndex = m_idHelperTool->stationIndex(rot->identify()); - bool measPhi = m_idHelperTool->measuresPhi(rot->identify()); - bool isTrigger = m_idHelperTool->isTrigger(rot->identify()); - if( measPhi ) { - ++phiPerLayer[stIndex]; - }else{ - if( isTrigger ) ++triggerEtaPerLayer[stIndex]; - else ++precisionPerLayer[stIndex]; - } + ++precisionPerLayer[stIndex]; // allow no overlap if ( m_assoTool->isUsed(*(rot->prepRawData()))) { ATH_MSG_VERBOSE("Track overlap found! " << m_idHelperTool->toString(rot->identify())); ++numshared; - - if( measPhi ) { - ++sharedPhiPerLayer[stIndex]; - }else{ - if( isTrigger ) ++sharedTriggerEtaPerLayer[stIndex]; - else ++sharedPrecisionPerLayer[stIndex]; - } + ++sharedPrecisionPerLayer[stIndex]; } } } diff --git a/Tracking/TrkTools/TrkAssociationTools/CMakeLists.txt b/Tracking/TrkTools/TrkAssociationTools/CMakeLists.txt index ac69f30dab06a23010685ab2d601d60c2ceef552..cbb84046b900dc5270abdb4d90e3133adcec08e2 100644 --- a/Tracking/TrkTools/TrkAssociationTools/CMakeLists.txt +++ b/Tracking/TrkTools/TrkAssociationTools/CMakeLists.txt @@ -16,13 +16,15 @@ atlas_depends_on_subdirs( PUBLIC Tracking/TrkDetDescr/TrkDetElementBase Tracking/TrkEvent/TrkEventUtils Tracking/TrkEvent/TrkRIO_OnTrack - Tracking/TrkEvent/TrkTrack ) + Tracking/TrkEvent/TrkCompetingRIOsOnTrack + Tracking/TrkEvent/TrkTrack + MuonSpectrometer/MuonIdHelpers) # Component(s) in the package: atlas_add_component( TrkAssociationTools src/*.cxx src/components/*.cxx - LINK_LIBRARIES AthenaBaseComps TrkToolInterfaces AtlasDetDescr Identifier GaudiKernel TrkDetElementBase TrkEventUtils TrkRIO_OnTrack TrkTrack ) + LINK_LIBRARIES AthenaBaseComps TrkToolInterfaces AtlasDetDescr Identifier GaudiKernel TrkDetElementBase TrkEventUtils TrkRIO_OnTrack TrkCompetingRIOsOnTrack TrkTrack MuonIdHelpersLib) # Install files from the package: atlas_install_headers( TrkAssociationTools ) diff --git a/Tracking/TrkTools/TrkAssociationTools/TrkAssociationTools/PRD_AssociationTool.h b/Tracking/TrkTools/TrkAssociationTools/TrkAssociationTools/PRD_AssociationTool.h index 5e0be28f8acf7f72e5c91813d375524632029005..c09f25938db8d87728ce95526803f795df284c3e 100755 --- a/Tracking/TrkTools/TrkAssociationTools/TrkAssociationTools/PRD_AssociationTool.h +++ b/Tracking/TrkTools/TrkAssociationTools/TrkAssociationTools/PRD_AssociationTool.h @@ -14,6 +14,10 @@ class AtlasDetectorID; class Identifier; +namespace Muon{ + class MuonIdHelperTool; +} + namespace Trk { class Track; @@ -80,6 +84,9 @@ namespace Trk { /**holds the PRDs associated with each Track (i.e. the Track* is the key)*/ IPRD_AssociationTool::TrackPrepRawDataMap m_trackPrepRawDataMap; + + ToolHandle<Muon::MuonIdHelperTool> m_idHelperTool; + }; inline bool Trk::PRD_AssociationTool::isUsed(const PrepRawData& prd) const diff --git a/Tracking/TrkTools/TrkAssociationTools/src/PRD_AssociationTool.cxx b/Tracking/TrkTools/TrkAssociationTools/src/PRD_AssociationTool.cxx index 27fd62672f112c5ea86c24155b634fe299e75416..6faa9c12e6fcc6e21999301e2eb92cbe595fb9c8 100755 --- a/Tracking/TrkTools/TrkAssociationTools/src/PRD_AssociationTool.cxx +++ b/Tracking/TrkTools/TrkAssociationTools/src/PRD_AssociationTool.cxx @@ -6,12 +6,16 @@ #include "TrkDetElementBase/TrkDetElementBase.h" #include "TrkTrack/Track.h" #include "TrkRIO_OnTrack/RIO_OnTrack.h" +#include "TrkCompetingRIOsOnTrack/CompetingRIOsOnTrack.h" +#include "TrkCompetingRIOsOnTrack/CompetingRIOsOnTrack.h" #include "TrkEventUtils/CreatePRD_MapPairFromTrack.h" #include "TrkEventUtils/CreatePRD_VectorFromTrack.h" #include "Identifier/Identifier.h" #include "AtlasDetDescr/AtlasDetectorID.h" +#include "MuonIdHelpers/MuonIdHelperTool.h" + #include <cassert> #include <vector> //#include <functional> @@ -22,7 +26,8 @@ Trk::PRD_AssociationTool::PRD_AssociationTool(const std::string& t, const std::string& n, const IInterface* p ) : - AthAlgTool(t,n,p) + AthAlgTool(t,n,p), + m_idHelperTool("Muon::MuonIdHelperTool/MuonIdHelperTool") { declareInterface<IPRD_AssociationTool>(this); } @@ -203,8 +208,26 @@ std::vector< const Trk::PrepRawData* > Trk::PRD_AssociationTool::getPrdsOnTrack( for (;it!=itEnd;it++) { const RIO_OnTrack* rot = dynamic_cast<const RIO_OnTrack*>(*it); - if (0!=rot) + if (rot){ + if(m_idHelperTool->isMuon(rot->identify())){ + //only use precision hits for muon track overlap + if(!m_idHelperTool->isMdt(rot->identify()) && !(m_idHelperTool->isCsc(rot->identify()) && !m_idHelperTool->measuresPhi(rot->identify()))) continue; + } vec.push_back(rot->prepRawData()); + } + else{ + const Trk::CompetingRIOsOnTrack* competingROT = dynamic_cast <const Trk::CompetingRIOsOnTrack*> (*it); + if(competingROT){ + const unsigned int numROTs = competingROT->numberOfContainedROTs(); + for( unsigned int i=0;i<numROTs;++i ){ + const Trk::RIO_OnTrack* rot = &competingROT->rioOnTrack(i); + if( !rot || !rot->prepRawData() || !m_idHelperTool->isMuon(rot->identify()) ) continue; + //only use precision hits for muon track overlap + if(!m_idHelperTool->isMdt(rot->identify()) && !(m_idHelperTool->isCsc(rot->identify()) && !m_idHelperTool->measuresPhi(rot->identify()))) continue; + vec.push_back(rot->prepRawData()); + } + } + } } ATH_MSG_DEBUG (" Getting "<<vec.size()<<" PRDs from track at:"<<&track);