diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/CMakeLists.txt b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/CMakeLists.txt index dab2628d59bc973bfe2e239661896a5690223da8..b511cd0bab6df5a92dcf6ec6dd824b0fb468d1e0 100644 --- a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/CMakeLists.txt +++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/CMakeLists.txt @@ -19,5 +19,5 @@ atlas_add_component( MuonMM_CnvTools src/*.cxx src/components/*.cxx INCLUDE_DIRS ${TDAQ-COMMON_INCLUDE_DIRS} - LINK_LIBRARIES ${TDAQ-COMMON_LIBRARIES} ByteStreamData ByteStreamData_test GaudiKernel AthenaBaseComps SGTools StoreGateLib SGtests AtlasDetDescr Identifier ByteStreamCnvSvcBaseLib MuonReadoutGeometry MuonDigitContainer MuonIdHelpersLib MuonRDO MuonPrepRawData MMClusterizationLib NSWCalibToolsLib MuonCnvToolInterfacesLib MuonMM_CnvToolsLib ) + LINK_LIBRARIES ${TDAQ-COMMON_LIBRARIES} ByteStreamData ByteStreamData_test GaudiKernel AthenaBaseComps SGTools StoreGateLib SGtests AtlasDetDescr Identifier ByteStreamCnvSvcBaseLib MuonReadoutGeometry MuonDigitContainer MuonIdHelpersLib MuonRDO MuonPrepRawData MMClusterizationLib NSWCalibToolsLib MuonCnvToolInterfacesLib MuonMM_CnvToolsLib CxxUtils ) diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/MuonMM_CnvTools/ATLAS_CHECK_THREAD_SAFETY b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/MuonMM_CnvTools/ATLAS_CHECK_THREAD_SAFETY new file mode 100644 index 0000000000000000000000000000000000000000..3c63df19ac2fce39c2163f2eb317e2aaf51df29f --- /dev/null +++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/MuonMM_CnvTools/ATLAS_CHECK_THREAD_SAFETY @@ -0,0 +1 @@ +MuonSpectrometer/MuonCnv/MuonMM_CnvTools/MuonMM_CnvTools diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.cxx b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.cxx index de1002778d40cb61f4529428c9928dfe799ea102..20a7ef09a95eb9576ab3222337d039869bb9e257 100644 --- a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.cxx +++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ #include "MmRdoToPrepDataTool.h" @@ -22,20 +22,18 @@ StatusCode Muon::MmRdoToPrepDataTool::initialize() return StatusCode::SUCCESS; } -Muon::MmRdoToPrepDataToolCore::SetupMM_PrepDataContainerStatus Muon::MmRdoToPrepDataTool::setupMM_PrepDataContainer() +Muon::MMPrepDataContainer* Muon::MmRdoToPrepDataTool::setupMM_PrepDataContainer() const { if(!evtStore()->contains<Muon::MMPrepDataContainer>(m_mmPrepDataContainerKey.key())){ - m_fullEventDone=false; SG::WriteHandle< Muon::MMPrepDataContainer > handle(m_mmPrepDataContainerKey); StatusCode status = handle.record(std::make_unique<Muon::MMPrepDataContainer>(m_idHelperSvc->mmIdHelper().module_hash_max())); if (status.isFailure() || !handle.isValid() ) { ATH_MSG_FATAL("Could not record container of MicroMega PrepData Container at " << m_mmPrepDataContainerKey.key()); - return FAILED; + return nullptr; } m_mmPrepDataContainer = handle.ptr(); - return ADDED; } - return ALREADYCONTAINED; + return m_mmPrepDataContainer; } diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.h b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.h index bd7431af3beb4093fbd862fbd67f5e3579256b7d..e77a6883fa7aec4a0acc0b33030d56b2f0a07bb9 100644 --- a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.h +++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.h @@ -1,17 +1,17 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ #ifndef MUONMmRdoToPrepDataTool_H #define MUONMmRdoToPrepDataTool_H #include "MmRdoToPrepDataToolCore.h" - #include "MuonPrepRawData/MuonPrepDataContainer.h" +#include "CxxUtils/checker_macros.h" namespace Muon { - class MmRdoToPrepDataTool : virtual public MmRdoToPrepDataToolCore + class ATLAS_NOT_THREAD_SAFE MmRdoToPrepDataTool : virtual public MmRdoToPrepDataToolCore { public: MmRdoToPrepDataTool(const std::string&,const std::string&,const IInterface*); @@ -23,7 +23,10 @@ namespace Muon virtual StatusCode initialize() override; protected: - virtual SetupMM_PrepDataContainerStatus setupMM_PrepDataContainer() override; + virtual Muon::MMPrepDataContainer* setupMM_PrepDataContainer() const override; + + private: + mutable Muon::MMPrepDataContainer* m_mmPrepDataContainer = nullptr; }; } // end of namespace diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.cxx b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.cxx index 517f527637cc2b44fba9bceeba49f444497ff19b..f799bd0f8fa2988e2169ea845e3c36ec3579c778 100644 --- a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.cxx +++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ #include "MmRdoToPrepDataToolCore.h" @@ -22,13 +22,11 @@ Muon::MmRdoToPrepDataToolCore::MmRdoToPrepDataToolCore(const std::string& t, const std::string& n, const IInterface* p ) : - AthAlgTool(t,n,p), - m_fullEventDone(false), - m_mmPrepDataContainer(nullptr) + AthAlgTool(t,n,p) { declareInterface<Muon::IMuonRdoToPrepDataTool>(this); - // template for property decalration + // template for property declaration declareProperty("OutputCollection", m_mmPrepDataContainerKey = std::string("MM_Measurements"), "Muon::MMPrepDataContainer to record"); declareProperty("InputCollection", m_rdoContainerKey = std::string("MMRDO"), @@ -50,8 +48,9 @@ StatusCode Muon::MmRdoToPrepDataToolCore::initialize() return StatusCode::SUCCESS; } -StatusCode Muon::MmRdoToPrepDataToolCore::processCollection(const MM_RawDataCollection *rdoColl, - std::vector<IdentifierHash>& idWithDataVect) +StatusCode Muon::MmRdoToPrepDataToolCore::processCollection(Muon::MMPrepDataContainer* mmPrepDataContainer, + const MM_RawDataCollection *rdoColl, + std::vector<IdentifierHash>& idWithDataVect) const { ATH_MSG_DEBUG(" ***************** Start of process MM Collection"); @@ -64,7 +63,7 @@ StatusCode Muon::MmRdoToPrepDataToolCore::processCollection(const MM_RawDataColl MMPrepDataCollection* prdColl = nullptr; // check if the collection already exists, otherwise add it - if ( m_mmPrepDataContainer->indexFindPtr(hash) != nullptr) { + if ( mmPrepDataContainer->indexFindPtr(hash) != nullptr) { ATH_MSG_DEBUG("In processCollection: collection already contained in the MM PrepData container"); return StatusCode::FAILURE; @@ -85,7 +84,7 @@ StatusCode Muon::MmRdoToPrepDataToolCore::processCollection(const MM_RawDataColl prdColl->setIdentifier(moduleId); } - if (StatusCode::SUCCESS != m_mmPrepDataContainer->addCollection(prdColl, hash)) { + if (StatusCode::SUCCESS != mmPrepDataContainer->addCollection(prdColl, hash)) { ATH_MSG_DEBUG("In processCollection - Couldn't record in the Container MM Collection with hashID = " << (int)hash ); return StatusCode::FAILURE; @@ -214,14 +213,8 @@ StatusCode Muon::MmRdoToPrepDataToolCore::processCollection(const MM_RawDataColl } -Muon::MmRdoToPrepDataToolCore::SetupMM_PrepDataContainerStatus Muon::MmRdoToPrepDataToolCore::setupMM_PrepDataContainer() +const MM_RawDataContainer* Muon::MmRdoToPrepDataToolCore::getRdoContainer() const { - return FAILED; -} - - -const MM_RawDataContainer* Muon::MmRdoToPrepDataToolCore::getRdoContainer() { - auto rdoContainerHandle = SG::makeHandle(m_rdoContainerKey); if(rdoContainerHandle.isValid()) { ATH_MSG_DEBUG("MM_getRdoContainer success"); @@ -233,7 +226,8 @@ const MM_RawDataContainer* Muon::MmRdoToPrepDataToolCore::getRdoContainer() { } -void Muon::MmRdoToPrepDataToolCore::processRDOContainer( std::vector<IdentifierHash>& idWithDataVect ) +void Muon::MmRdoToPrepDataToolCore::processRDOContainer( Muon::MMPrepDataContainer* mmPrepDataContainer, + std::vector<IdentifierHash>& idWithDataVect ) const { ATH_MSG_DEBUG("In processRDOContainer"); @@ -248,7 +242,7 @@ void Muon::MmRdoToPrepDataToolCore::processRDOContainer( std::vector<IdentifierH auto rdoColl = *it; if (rdoColl->empty()) continue; ATH_MSG_DEBUG("New RDO collection with " << rdoColl->size() << "MM Hits"); - if(processCollection(rdoColl, idWithDataVect).isFailure()) { + if(processCollection(mmPrepDataContainer, rdoColl, idWithDataVect).isFailure()) { ATH_MSG_DEBUG("processCsm returns a bad StatusCode - keep going for new data collections in this event"); } } @@ -268,21 +262,14 @@ StatusCode Muon::MmRdoToPrepDataToolCore::decode( std::vector<IdentifierHash>& i //is idVect a right thing to use here? to be reviewed maybe ATH_MSG_DEBUG("Size of the RDO container to be decoded: " << idVect.size() ); - SetupMM_PrepDataContainerStatus containerRecordStatus = setupMM_PrepDataContainer(); + Muon::MMPrepDataContainer* mmPrepDataContainer = setupMM_PrepDataContainer(); - if ( containerRecordStatus == FAILED ) { + if ( !mmPrepDataContainer ) { return StatusCode::FAILURE; } - processRDOContainer(idWithDataVect); + processRDOContainer(mmPrepDataContainer, idWithDataVect); - // check if the full event has already been decoded - if ( m_fullEventDone ) { - ATH_MSG_DEBUG ("Full event dcoded, nothing to do"); - return StatusCode::SUCCESS; - } - - return StatusCode::SUCCESS; } diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.h b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.h index f99bc526c2d6589894ea0e2c450e61578826c279..4c0a0a183b20892297c2caf5585e10efdd21512f 100644 --- a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.h +++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ #ifndef MUONMmRdoToPrepDataToolCore_H @@ -35,40 +35,35 @@ namespace Muon virtual ~MmRdoToPrepDataToolCore()=default; /** standard Athena-Algorithm method */ - virtual StatusCode initialize(); + virtual StatusCode initialize() override; /** Decode method - declared in Muon::IMuonRdoToPrepDataTool*/ - StatusCode decode( std::vector<IdentifierHash>& idVect, std::vector<IdentifierHash>& selectedIdVect ); + virtual StatusCode decode( std::vector<IdentifierHash>& idVect, std::vector<IdentifierHash>& selectedIdVect ) override; //new decode methods for Rob based readout StatusCode decode( const std::vector<uint32_t>& robIds, const std::vector<IdentifierHash>& chamberHashInRobs ); - StatusCode decode( const std::vector<uint32_t>& robIds ); + virtual StatusCode decode( const std::vector<uint32_t>& robIds ) override; - StatusCode processCollection(const MM_RawDataCollection *rdoColl, - std::vector<IdentifierHash>& idWithDataVect); + StatusCode processCollection(Muon::MMPrepDataContainer* mmPrepDataContainer, + const MM_RawDataCollection *rdoColl, + std::vector<IdentifierHash>& idWithDataVect) const; - void printInputRdo(); - void printPrepData(); + virtual void printInputRdo() override; + virtual void printPrepData() override; protected: - enum SetupMM_PrepDataContainerStatus { - FAILED = 0, ADDED, ALREADYCONTAINED - }; + virtual Muon::MMPrepDataContainer* setupMM_PrepDataContainer() const = 0; - virtual SetupMM_PrepDataContainerStatus setupMM_PrepDataContainer(); + const MM_RawDataContainer* getRdoContainer() const; - const MM_RawDataContainer* getRdoContainer(); - - void processRDOContainer( std::vector<IdentifierHash>& idWithDataVect ); + void processRDOContainer( Muon::MMPrepDataContainer* mmPrepDataContainer, + std::vector<IdentifierHash>& idWithDataVect ) const; SG::ReadCondHandleKey<MuonGM::MuonDetectorManager> m_muDetMgrKey {this, "DetectorManagerKey", "MuonDetectorManager", "Key of input MuonDetectorManager condition data"}; ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}; - bool m_fullEventDone; - /// MdtPrepRawData containers - Muon::MMPrepDataContainer* m_mmPrepDataContainer; SG::WriteHandleKey<Muon::MMPrepDataContainer> m_mmPrepDataContainerKey; SG::ReadHandleKey<MM_RawDataContainer> m_rdoContainerKey; diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolMT.cxx b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolMT.cxx index 6dacc020873bd7b1c7b47abe907799b1fc71ec6e..b2250fae3fb289ae02f0069fba3edb299baceb91 100644 --- a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolMT.cxx +++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolMT.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ #include "MmRdoToPrepDataToolMT.h" @@ -21,7 +21,7 @@ StatusCode Muon::MmRdoToPrepDataToolMT::initialize() return StatusCode::SUCCESS; } -Muon::MmRdoToPrepDataToolCore::SetupMM_PrepDataContainerStatus Muon::MmRdoToPrepDataToolMT::setupMM_PrepDataContainer() +Muon::MMPrepDataContainer* Muon::MmRdoToPrepDataToolMT::setupMM_PrepDataContainer() const { // MT version of this method always adds container. Caching will be added later. SG::WriteHandle< Muon::MMPrepDataContainer > handle(m_mmPrepDataContainerKey); @@ -29,8 +29,7 @@ Muon::MmRdoToPrepDataToolCore::SetupMM_PrepDataContainerStatus Muon::MmRdoToPrep if (status.isFailure() || !handle.isValid() ) { ATH_MSG_FATAL("Could not record container of MicroMega PrepData Container at " << m_mmPrepDataContainerKey.key()); - return FAILED; + return nullptr; } - m_mmPrepDataContainer = handle.ptr(); - return ADDED; + return handle.ptr(); } diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolMT.h b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolMT.h index d1190430c9d50876defb29f1b8e8dbc300690a72..22a09cb1409a57801ac339bc9bb9df2ddcfb2582 100644 --- a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolMT.h +++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolMT.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ #ifndef MUONMmRdoToPrepDataToolMT_H @@ -23,7 +23,7 @@ namespace Muon virtual StatusCode initialize() override; protected: - virtual SetupMM_PrepDataContainerStatus setupMM_PrepDataContainer() override; + virtual Muon::MMPrepDataContainer* setupMM_PrepDataContainer() const override; }; } // end of namespace diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/components/MuonMM_CnvTools_entries.cxx b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/components/MuonMM_CnvTools_entries.cxx index a5fb8f517addd34fa9a818f2d3bae12840924f08..0422090c5b99e78ba3d53ccf0f67106e5ed748d9 100644 --- a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/components/MuonMM_CnvTools_entries.cxx +++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/components/MuonMM_CnvTools_entries.cxx @@ -1,10 +1,8 @@ #include "../MmRdoToPrepDataTool.h" -#include "../MmRdoToPrepDataToolCore.h" #include "../MmRdoToPrepDataToolMT.h" #include "../MM_RDO_Decoder.h" DECLARE_COMPONENT(Muon::MmRdoToPrepDataTool) -DECLARE_COMPONENT(Muon::MmRdoToPrepDataToolCore) DECLARE_COMPONENT(Muon::MmRdoToPrepDataToolMT) DECLARE_COMPONENT( Muon::MM_RDO_Decoder )