diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.cxx index 494bdac4fbc5a33f0ff865709784863a153b2ecc..51e5b6e7142bde9bc3d68ddd7bcc1f9fa8049952 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.cxx +++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.cxx @@ -204,6 +204,8 @@ namespace Muon { std::unique_ptr<Trk::Track> MooTrackFitter::fit( const MuPatCandidateBase& entry1, const MuPatCandidateBase& entry2, const PrepVec* externalPhiHits ) const { GarbageCan localGarbage; + MuPatHitTool::HitGarbage hitsToBeDeleted; + MuPatHitTool::ParGarbage parsToBeDeleted; ++m_nfits; @@ -211,7 +213,7 @@ namespace Muon { FitterData fitterData; // extract hits and geometrical information - if( !extractData(entry1,entry2,fitterData, localGarbage) ) { + if( !extractData(entry1,entry2,fitterData, localGarbage, parsToBeDeleted ) ) { ATH_MSG_DEBUG(" Failed to extract data for initial fit" ); localGarbage.cleanUp(); return std::unique_ptr<Trk::Track>(); @@ -238,7 +240,8 @@ namespace Muon { ++m_nfailedParsInital; // clean phi hits and reevaluate hits. Do not run for cosmics - bool hasCleaned = m_cleanPhiHits ? cleanPhiHits( startPars->momentum().mag(), fitterData, externalPhiHits, localGarbage ) : true; + bool hasCleaned = m_cleanPhiHits ? cleanPhiHits( startPars->momentum().mag(), fitterData, externalPhiHits, + localGarbage, hitsToBeDeleted, parsToBeDeleted ) : true; if( hasCleaned ){ ATH_MSG_DEBUG(" Cleaned phi hits, re-extracting hits" ); bool usePrecise = m_usePreciseHits ? true : (fitterData.firstHasMomentum || fitterData.secondHasMomentum); @@ -361,12 +364,12 @@ namespace Muon { if( track ) ++m_nsuccess; localGarbage.cleanUp(); - m_hitHandler->cleanUp(); if( msgLvl(MSG::DEBUG) && track ) msg(MSG::DEBUG) << MSG::DEBUG << " Track found " << endmsg; return track; } - bool MooTrackFitter::extractData( const MuPatCandidateBase& entry1, const MuPatCandidateBase& entry2 , MooTrackFitter::FitterData& fitterData, GarbageCan& garbage ) const { + bool MooTrackFitter::extractData( const MuPatCandidateBase& entry1, const MuPatCandidateBase& entry2 , MooTrackFitter::FitterData& fitterData, GarbageCan& garbage, + MuPatHitTool::ParGarbage& parsToBeDeleted) const { // sanity checks on the entries if( corruptEntry( entry1 ) ) { ATH_MSG_DEBUG(" corrupt first entry, cannot perform fit: eta hits " << entry1.etaHits().size() ); @@ -410,7 +413,7 @@ namespace Muon { copyHitList(entry1.hitList(),fitterData.copyHitList1,garbage); copyHitList(entry2.hitList(),fitterData.copyHitList2,garbage); - if( !m_hitHandler->merge(fitterData.copyHitList1,fitterData.copyHitList2,hitList) ) return false; + if( !m_hitHandler->merge(fitterData.copyHitList1,fitterData.copyHitList2,hitList, parsToBeDeleted) ) return false; bool usePrecise = m_usePreciseHits ? true : (fitterData.firstHasMomentum || fitterData.secondHasMomentum); if( msgLvl(MSG::DEBUG) ){ @@ -1929,7 +1932,9 @@ namespace Muon { } bool MooTrackFitter::cleanPhiHits( double momentum, MooTrackFitter::FitterData& fitterData, - const std::vector<const Trk::PrepRawData*>* patternPhiHits, GarbageCan& garbage ) const { + const std::vector<const Trk::PrepRawData*>* patternPhiHits, GarbageCan& garbage, + MuPatHitTool::HitGarbage& hitsToBeDeleted, + MuPatHitTool::ParGarbage& parsToBeDeleted) const { ATH_MSG_VERBOSE(" cleaning phi hits " ); @@ -2096,8 +2101,8 @@ namespace Muon { if( !measurementsToBeAdded.empty() ){ if( msgLvl(MSG::VERBOSE) ) msg(MSG::VERBOSE) << " adding measurements " << std::endl; MuPatHitList newHitList; - m_hitHandler->create(fitterData.firstEntry->entryPars(),measurementsToBeAdded,newHitList); - m_hitHandler->merge(newHitList,fitterData.hitList); + m_hitHandler->create(fitterData.firstEntry->entryPars(),measurementsToBeAdded,newHitList, hitsToBeDeleted, parsToBeDeleted); + m_hitHandler->merge(newHitList,fitterData.hitList, parsToBeDeleted); } ATH_MSG_VERBOSE(" done cleaning " ); diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.h index 70edaf1e8d5285ba9b91d08e0e79c3156b856261..28b9b5cff253950dcc0cd3f2c70e2fba01886c5b 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.h +++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooTrackFitter.h @@ -219,7 +219,8 @@ namespace Muon { /** extract all information needed for the fit from the track */ - bool extractData( const MuPatCandidateBase& entry1, const MuPatCandidateBase& entry2, FitterData& fitterData, GarbageCan& garbage ) const; + bool extractData( const MuPatCandidateBase& entry1, const MuPatCandidateBase& entry2, FitterData& fitterData, GarbageCan& garbage, + MuPatHitTool::ParGarbage& parsToBeDeleted) const; /** extract all information from the HitList of a FitterData object */ bool extractData( FitterData& fitterData, bool usePreciseHits ) const; @@ -262,7 +263,9 @@ namespace Muon { double thetaSeeding( const MuPatCandidateBase& entry, MeasVec& etaHits ) const; /** clean phi hits, returns true if anything happened during the cleaning */ - bool cleanPhiHits( double momentum, FitterData& phiHits, const PrepVec* patternPhiHits, GarbageCan& garbage ) const; + bool cleanPhiHits( double momentum, FitterData& phiHits, const PrepVec* patternPhiHits, GarbageCan& garbage, + MuPatHitTool::HitGarbage& hitsToBeDeleted, + MuPatHitTool::ParGarbage& parsToBeDeleted) const; /** check whether mometum of start parameter is ok */ bool validMomentum( const Trk::TrackParameters& pars ) const; diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx index b3364b7abc584959de22c58bb0a61d4d1be7c6f1..086c1b5be455e0765c219ecc14468ad53db5893b 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx +++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration */ #include "MuPatCandidateTool.h" @@ -63,6 +63,8 @@ namespace Muon { MuPatSegment* MuPatCandidateTool::createSegInfo( const MuonSegment& segment ) const { + CacheEntry& ent = getCache(); + Identifier chid = m_edmHelperSvc->chamberId(segment); if( m_idHelperSvc->isTrigger(chid) ){ ATH_MSG_WARNING("Trigger hit only segments not supported " << m_idHelperSvc->toStringChamber(chid) ); @@ -100,7 +102,8 @@ namespace Muon { updateHits(*info,info->segment->containedMeasurements(),m_doMdtRecreation,m_doCscRecreation, true ); MuPatHitList& hitList = info->hitList(); - m_hitHandler->create( segment, hitList ); + m_hitHandler->create( segment, hitList, + ent.m_hitsToBeDeleted, ent.m_parsToBeDeleted ); return info; } @@ -156,13 +159,7 @@ namespace Muon { void MuPatCandidateTool::updateHits( MuPatCandidateBase& entry, const MuPatCandidateTool::MeasVec& measurements, bool recreateMDT, bool recreateCSC, bool createComp ) const { - std::lock_guard<std::mutex> lock{m_mutex}; - const EventContext& ctx = Gaudi::Hive::currentContext(); - CacheEntry* ent{m_cache.get(ctx)}; - if (ent->m_evt != ctx.evt()) { - ent->m_evt = ctx.evt(); - ent->cleanUp(); - } + CacheEntry& ent = getCache(); MeasVec etaHits; MeasVec phiHits; @@ -239,7 +236,7 @@ namespace Muon { } ATH_MSG_DEBUG(" recreating MdtDriftCircleOnTrack " ); const MdtDriftCircleOnTrack* newMdt = m_mdtRotCreator->createRIO_OnTrack(*mdt->prepRawData(),mdt->globalPosition()); - ent->m_measurementsToBeDeleted.push_back(newMdt); + ent.m_measurementsToBeDeleted.push_back(newMdt); meas = newMdt; } } @@ -282,7 +279,7 @@ namespace Muon { } ATH_MSG_DEBUG(" recreating CscClusterOnTrack " ); const MuonClusterOnTrack* newCsc = m_cscRotCreator->createRIO_OnTrack(*csc->prepRawData(),csc->globalPosition()); - ent->m_measurementsToBeDeleted.push_back(newCsc); + ent.m_measurementsToBeDeleted.push_back(newCsc); meas = newCsc; } @@ -313,8 +310,8 @@ namespace Muon { } if( createComp ){ - if( m_createCompetingROTsEta && !triggerHitsEta.empty() ) createAndAddCompetingROTs(triggerHitsEta, etaHits, allHits, ent->m_measurementsToBeDeleted); - if( m_createCompetingROTsPhi && !triggerHitsPhi.empty() ) createAndAddCompetingROTs(triggerHitsPhi, phiHits, allHits, ent->m_measurementsToBeDeleted); + if( m_createCompetingROTsEta && !triggerHitsEta.empty() ) createAndAddCompetingROTs(triggerHitsEta, etaHits, allHits, ent.m_measurementsToBeDeleted); + if( m_createCompetingROTsPhi && !triggerHitsPhi.empty() ) createAndAddCompetingROTs(triggerHitsPhi, phiHits, allHits, ent.m_measurementsToBeDeleted); } entry.nmdtHitsMl1 = nmdtHitsMl1; @@ -435,6 +432,8 @@ namespace Muon { bool MuPatCandidateTool::recalculateCandidateSegmentContent( MuPatTrack& candidate ) const { + CacheEntry& ent = getCache(); + // loop over track and get the chambers on the track const DataVector<const Trk::TrackStateOnSurface>* states = candidate.track().trackStateOnSurfaces(); if( !states ) return false; @@ -485,7 +484,8 @@ namespace Muon { // recalculate hit list candidate.hitList().clear(); - m_hitHandler->create( candidate.track(),candidate.hitList() ); + m_hitHandler->create( candidate.track(),candidate.hitList(), + ent.m_hitsToBeDeleted ); // update the hit summary updateHits(candidate,candidate.track().measurementsOnTrack()->stdcont()); @@ -528,14 +528,8 @@ namespace Muon { void MuPatCandidateTool::cleanUp() const { // delete segments and clear vector - std::lock_guard<std::mutex> lock{m_mutex}; - const EventContext& ctx = Gaudi::Hive::currentContext(); - CacheEntry* ent{m_cache.get(ctx)}; - if (ent->m_evt != ctx.evt()) { - ent->m_evt = ctx.evt(); - } - m_hitHandler->cleanUp(); - ent->cleanUp(); + CacheEntry& ent = getCache(); + ent.cleanUp(); } std::string MuPatCandidateTool::print( const MuPatSegment& segment, int level ) const { @@ -595,5 +589,16 @@ namespace Muon { return "Unknown candidate type"; } + MuPatCandidateTool::CacheEntry& MuPatCandidateTool::getCache() const + { + const EventContext& ctx = Gaudi::Hive::currentContext(); + CacheEntry* ent{m_cache.get(ctx)}; + if (ent->m_evt != ctx.evt()) { + ent->m_evt = ctx.evt(); + ent->cleanUp(); + } + return *ent; + } + } // namespace Muon diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h index d4943d12c82b8d46b7fed6a05bb36bb60b735beb..9408b03df006abd7444dad72da8a6ba1340789d7 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h +++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h @@ -180,11 +180,14 @@ namespace Muon { Gaudi::Property<bool> m_doCscRecreation {this,"DoCscRecreation" , true }; // Mutex to protect the contents. - mutable std::mutex m_mutex{}; struct CacheEntry { EventContext::ContextEvt_t m_evt{EventContext::INVALID_CONTEXT_EVT}; MeasVec m_measurementsToBeDeleted{}; //<! vector to store measurements owned by the track maker + MuPatHitTool::HitGarbage m_hitsToBeDeleted; + MuPatHitTool::ParGarbage m_parsToBeDeleted; void cleanUp() { // Delete measurements to be deleted now + m_hitsToBeDeleted.clear(); + m_parsToBeDeleted.clear(); std::for_each( m_measurementsToBeDeleted.begin(), m_measurementsToBeDeleted.end(), MuonDeleteObject<const Trk::MeasurementBase>() ); m_measurementsToBeDeleted.clear(); }; @@ -193,7 +196,7 @@ namespace Muon { } }; mutable SG::SlotSpecificObj<CacheEntry> m_cache ATLAS_THREAD_SAFE; // Guarded by m_mutex - + CacheEntry& getCache() const; }; } diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.cxx index fa46e1a6402d01fb75f1e070dc650c34dc7e1ba9..b2c20352cb4dd05f2e212057c42da3b9eb2fa355 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.cxx +++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.cxx @@ -13,9 +13,9 @@ namespace Muon { // Static members - unsigned int MuPatHit::s_maxNumberOfInstantiations = 0; - unsigned int MuPatHit::s_numberOfInstantiations = 0; - unsigned int MuPatHit::s_numberOfCopies = 0; + std::atomic<unsigned int> MuPatHit::s_maxNumberOfInstantiations; + std::atomic<unsigned int> MuPatHit::s_numberOfInstantiations = 0; + std::atomic<unsigned int> MuPatHit::s_numberOfCopies = 0; // Static functions @@ -44,7 +44,6 @@ namespace Muon { MuPatHit& MuPatHit::operator=( const MuPatHit& hit ) { if( &hit != this ){ - cleanUp(); copy(hit); #ifdef MCTB_OBJECT_COUNTERS ++s_numberOfCopies; @@ -55,7 +54,6 @@ namespace Muon { MuPatHit::~MuPatHit() { // std::cout << " delete MuPatHit " << this << std::endl; - cleanUp(); #ifdef MCTB_OBJECT_COUNTERS removeInstance(); #endif @@ -64,14 +62,10 @@ namespace Muon { void MuPatHit::copy( const MuPatHit& hit ){ m_pars = hit.m_pars; m_precisionMeas = hit.m_precisionMeas; - m_broadMeas = hit.m_broadMeas->clone(); + m_broadMeas.reset (hit.m_broadMeas->clone()); m_info = hit.m_info; } - void MuPatHit::cleanUp(){ - delete m_broadMeas; - } - void MuPatHit::updateParameters( const Trk::TrackParameters* pars ) { // if( pars ) std::cout << " update pars " << this << " theta " << pars->momentum().theta() << " phi " << pars->momentum().phi() << std::endl; m_pars = pars; diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.h index 88334379a838a20d4b71edb6180565a895e47638..72b412af5fc7386f5eb2bf585ade62e6708773b9 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.h +++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHit.h @@ -7,6 +7,7 @@ #include "Identifier/Identifier.h" #include "TrkParameters/TrackParameters.h" +#include "CxxUtils/atomic_fetch_minmax.h" #include <list> #include <mutex> @@ -82,18 +83,12 @@ namespace Muon { /** @brief update the track parameters and residual of a MuPatHit */ void updateParameters( const Trk::TrackParameters* pars ); - /** @brief reset the maximum number of objects counter */ - static void resetMaxNumberOfInstantiations(); - /** @brief maximum number of objects of this type in memory */ static unsigned int maxNumberOfInstantiations(); /** current number of objects of this type in memory */ static unsigned int numberOfInstantiations(); - /** @brief reset the copy constructor counter */ - static void resetNumberOfCopies(); - /** @brief number of times the copy constructor was called since last reset */ static unsigned int numberOfCopies(); @@ -110,21 +105,15 @@ namespace Muon { // // private static data members // - static unsigned int s_numberOfInstantiations ATLAS_THREAD_SAFE; //<! current number of objects of this type in memory - static unsigned int s_maxNumberOfInstantiations ATLAS_THREAD_SAFE; //<! maximum number of objects of this type in memory - static unsigned int s_numberOfCopies ATLAS_THREAD_SAFE; //<! number of times the copy constructor was called since last reset - - static std::mutex s_mutex; //<! to remove race condition + static std::atomic<unsigned int> s_numberOfInstantiations; //<! current number of objects of this type in memory + static std::atomic<unsigned int> s_maxNumberOfInstantiations; //<! maximum number of objects of this type in memory + static std::atomic<unsigned int> s_numberOfCopies; //<! number of times the copy constructor was called since last reset // // private member functions // /** no default constructor */ - MuPatHit() : m_pars(0),m_precisionMeas(0),m_broadMeas(0) { } - - /** @brief clean memory */ - void cleanUp(); - + MuPatHit() = delete; /** @brief copy hit */ void copy( const MuPatHit& hit ); @@ -132,7 +121,7 @@ namespace Muon { // private member data const Trk::TrackParameters* m_pars; const Trk::MeasurementBase* m_precisionMeas; - const Trk::MeasurementBase* m_broadMeas; + std::unique_ptr<const Trk::MeasurementBase> m_broadMeas; Info m_info; }; // class MuPatHit @@ -151,48 +140,25 @@ namespace Muon { // static inline functions implementations // inline unsigned int MuPatHit::numberOfInstantiations() { - const std::lock_guard<std::mutex> lock(s_mutex); - return s_numberOfInstantiations; } inline unsigned int MuPatHit::maxNumberOfInstantiations() { - const std::lock_guard<std::mutex> lock(s_mutex); - return s_maxNumberOfInstantiations; } inline unsigned int MuPatHit::numberOfCopies() { - const std::lock_guard<std::mutex> lock(s_mutex); - return s_numberOfCopies; } inline void MuPatHit::addInstance() { - const std::lock_guard<std::mutex> lock(s_mutex); - ++s_numberOfInstantiations; - if ( s_numberOfInstantiations > s_maxNumberOfInstantiations ) { - s_maxNumberOfInstantiations = s_numberOfInstantiations; - } + CxxUtils::atomic_fetch_max (&s_maxNumberOfInstantiations, + s_numberOfInstantiations.load()); } inline void MuPatHit::removeInstance() { - const std::lock_guard<std::mutex> lock(s_mutex); - - if ( s_numberOfInstantiations > 0 ) --s_numberOfInstantiations; - } - - inline void MuPatHit::resetMaxNumberOfInstantiations() { - const std::lock_guard<std::mutex> lock(s_mutex); - - s_maxNumberOfInstantiations = 0; - } - - inline void MuPatHit::resetNumberOfCopies() { - const std::lock_guard<std::mutex> lock(s_mutex); - - s_numberOfCopies = 0; + --s_numberOfInstantiations; } // diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.cxx index 5e9e715ad98748e22c77aef6b24930b57b6957a5..1d6169030993e211695740f424506b53858237bd 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.cxx +++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.cxx @@ -55,10 +55,6 @@ MuPatHitTool::initialize() ATH_CHECK(m_pullCalculator.retrieve()); ATH_CHECK(m_propagator.retrieve()); - // reserve space to store hits - m_hitsToBeDeleted.reserve(1000); - m_parsToBeDeleted.reserve(1000); - return StatusCode::SUCCESS; } @@ -69,28 +65,6 @@ MuPatHitTool::finalize() return StatusCode::SUCCESS; } -void -MuPatHitTool::cleanUp() const -{ - { - const std::lock_guard<std::mutex> lock(m_hitsMutex); - - for (auto ptr : m_hitsToBeDeleted) { - delete ptr; - } - m_hitsToBeDeleted.clear(); - } - - { - const std::lock_guard<std::mutex> lock(m_parsMutex); - - for (auto ptr : m_parsToBeDeleted) { - delete ptr; - } - m_parsToBeDeleted.clear(); - } -} - bool MuPatHitTool::insert(MuPatHit* /*hit*/, MuPatHitList& /*hitList*/) const { @@ -98,7 +72,9 @@ MuPatHitTool::insert(MuPatHit* /*hit*/, MuPatHitList& /*hitList*/) const } bool -MuPatHitTool::create(const MuonSegment& seg, MuPatHitList& hitList) const +MuPatHitTool::create(const MuonSegment& seg, MuPatHitList& hitList, + HitGarbage& hitsToBeDeleted, + ParGarbage& parsToBeDeleted) const { ATH_MSG_DEBUG(" creating hit list from segment " << std::endl << m_printer->print(seg)); @@ -111,7 +87,8 @@ MuPatHitTool::create(const MuonSegment& seg, MuPatHitList& hitList) const return false; } - bool result = create(*pars, seg.containedMeasurements(), hitList); + bool result = create(*pars, seg.containedMeasurements(), hitList, + hitsToBeDeleted, parsToBeDeleted); // clean up pars delete pars; @@ -121,7 +98,9 @@ MuPatHitTool::create(const MuonSegment& seg, MuPatHitList& hitList) const bool MuPatHitTool::create(const Trk::TrackParameters& pars, const std::vector<const Trk::MeasurementBase*>& measVec, - MuPatHitList& hitList) const + MuPatHitList& hitList, + HitGarbage& hitsToBeDeleted, + ParGarbage& parsToBeDeleted) const { // store position of the current hit to speed up insertion MuPatHitIt currentHitIt = hitList.begin(); @@ -171,25 +150,22 @@ MuPatHitTool::create(const Trk::TrackParameters& pars, const std::vector<const T } if (exPars) { - const std::lock_guard<std::mutex> lock(m_parsMutex); - m_parsToBeDeleted.push_back(exPars); + parsToBeDeleted.emplace_back (exPars); } // create hit and insert it into list - MuPatHit* hit = new MuPatHit(exPars, *sit, broadMeas, hitInfo); - { - const std::lock_guard<std::mutex> lock(m_hitsMutex); - m_hitsToBeDeleted.push_back(hit); - } + auto hit = std::make_unique<MuPatHit>(exPars, *sit, broadMeas, hitInfo); ATH_MSG_VERBOSE(" inserting hit " << m_idHelperSvc->toString(id) << " " << m_printer->print(*exPars)); - currentHitIt = insert(hitList, currentHitIt, hit); + currentHitIt = insert(hitList, currentHitIt, hit.get()); + hitsToBeDeleted.push_back (std::move (hit)); } return true; } bool -MuPatHitTool::create(const Trk::Track& track, MuPatHitList& hitList) const +MuPatHitTool::create(const Trk::Track& track, MuPatHitList& hitList, + HitGarbage& hitsToBeDeleted) const { // store position of the current hit to speed up insertion MuPatHitIt currentHitIt = hitList.begin(); @@ -238,34 +214,33 @@ MuPatHitTool::create(const Trk::Track& track, MuPatHitList& hitList) const // create hit and insert it into list - MuPatHit* hit = new MuPatHit(pars, meas, broadMeas, hitInfo); - { - const std::lock_guard<std::mutex> lock(m_hitsMutex); - m_hitsToBeDeleted.push_back(hit); - } + auto hit = std::make_unique<MuPatHit>(pars, meas, broadMeas, hitInfo); if (msgLvl(MSG::VERBOSE)) { msg(MSG::VERBOSE) << " inserting hit " << m_printer->print(*meas); if (hitInfo.status == MuPatHit::Outlier) msg(MSG::VERBOSE) << " Outlier"; msg(MSG::VERBOSE) << endmsg; } - currentHitIt = insert(hitList, currentHitIt, hit); + currentHitIt = insert(hitList, currentHitIt, hit.get()); + hitsToBeDeleted.push_back (std::move (hit)); } return true; } bool -MuPatHitTool::merge(const MuPatHitList& hitList1, const MuPatHitList& hitList2, MuPatHitList& outList) const +MuPatHitTool::merge(const MuPatHitList& hitList1, const MuPatHitList& hitList2, MuPatHitList& outList, + ParGarbage& parsToBeDeleted) const { // copy first list into outList outList = hitList1; - return merge(hitList2, outList); + return merge(hitList2, outList, parsToBeDeleted); } bool -MuPatHitTool::merge(const MuPatHitList& hitList1, MuPatHitList& hitList2) const +MuPatHitTool::merge(const MuPatHitList& hitList1, MuPatHitList& hitList2, + ParGarbage& parsToBeDeleted) const { // The hits in the first list are most likely expressed with respect to a different set of track parameters // as the ones in the second list. They cannot be merged. To allow merging a new set of track parameters is @@ -347,11 +322,8 @@ MuPatHitTool::merge(const MuPatHitList& hitList1, MuPatHitList& hitList2) const } } - { - const std::lock_guard<std::mutex> lock(m_parsMutex); - m_parsToBeDeleted.push_back(exPars); - } hit->updateParameters(exPars); + parsToBeDeleted.emplace_back (exPars); } } } diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.h index 4c732d8fb16d99a190faee00a732fdde5948d883..a0894be056326f154815b0ff0bc457fa3f33c9e4 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.h +++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatHitTool.h @@ -38,6 +38,9 @@ static const InterfaceID IID_MuPatHitTool("Muon::MuPatHitTool", 1, 0); class MuPatHitTool : public AthAlgTool { public: + using HitGarbage = std::vector<std::unique_ptr<MuPatHit> >; + using ParGarbage = std::vector<std::unique_ptr<const Trk::TrackParameters> >; + /** default AlgTool constructor */ MuPatHitTool(const std::string&, const std::string&, const IInterface*); @@ -68,14 +71,17 @@ class MuPatHitTool : public AthAlgTool { @param hitList the list to be filled @return true if creation succeded */ - bool create(const MuonSegment& seg, MuPatHitList& hitList) const; + bool create(const MuonSegment& seg, MuPatHitList& hitList, + HitGarbage& hitsToBeDeleted, + ParGarbage& parsToBeDeleted) const; /** @brief create a MuPatHitList from a Track @param track the input track @param hitList the list to be filled @return true if creation succeded */ - bool create(const Trk::Track& track, MuPatHitList& hitList) const; + bool create(const Trk::Track& track, MuPatHitList& hitList, + HitGarbage& hitsToBeDeleted) const; /** @brief create a MuPatHitList from a Track @param pars the input parameters @@ -84,7 +90,9 @@ class MuPatHitTool : public AthAlgTool { @return true if creation succeded */ bool create(const Trk::TrackParameters& pars, const std::vector<const Trk::MeasurementBase*>& measVec, - MuPatHitList& hitList) const; + MuPatHitList& hitList, + HitGarbage& hitsToBeDeleted, + ParGarbage& parsToBeDeleted) const; /** @brief merge two MuPatHitLists into a new one @param hitList1 the first list @@ -92,14 +100,16 @@ class MuPatHitTool : public AthAlgTool { @param outList the resulting list @return true if merge succeded */ - bool merge(const MuPatHitList& hitList1, const MuPatHitList& hitList2, MuPatHitList& outList) const; + bool merge(const MuPatHitList& hitList1, const MuPatHitList& hitList2, MuPatHitList& outList, + ParGarbage& parsToBeDeleted) const; /** @brief merge two MuPatHitLists into a new one. The first list will be added to the second @param hitList1 the first list @param hitList2 the second list @return true if merge succeded */ - bool merge(const MuPatHitList& hitList1, MuPatHitList& hitList2) const; + bool merge(const MuPatHitList& hitList1, MuPatHitList& hitList2, + ParGarbage& parsToBeDeleted) const; /** @brief extract a sorted vector of MeasurementBase objects @param hitList the input list @@ -127,9 +137,6 @@ class MuPatHitTool : public AthAlgTool { /** update hit list for a give track */ bool update(const Trk::Track& track, MuPatHitList& hitList) const; - /** clean up MCTB hits allocated up to now */ - void cleanUp() const; - /** @brief print data part of Muon MeasurementBase to string. * * This really belongs in MuonEDMPrinterTool in package MuonRecHelperTools. @@ -211,11 +218,6 @@ class MuPatHitTool : public AthAlgTool { }; //<! multipurpose helper tool Trk::MagneticFieldProperties m_magFieldProperties; //!< magnetic field properties - - mutable std::vector<MuPatHit*> m_hitsToBeDeleted ATLAS_THREAD_SAFE; - mutable std::vector<const Trk::TrackParameters*> m_parsToBeDeleted ATLAS_THREAD_SAFE; - mutable std::mutex m_hitsMutex; - mutable std::mutex m_parsMutex; }; } // namespace Muon