diff --git a/MuonSpectrometer/MuonCnv/MuonByteStream/MuonByteStream/TgcRawDataProvider.h b/MuonSpectrometer/MuonCnv/MuonByteStream/MuonByteStream/TgcRawDataProvider.h index 9a608150e529e63a64b312843caa8c59d9c62928..eada3802cdd54dc03b7c4cd31f41f4dcd5ae3363 100644 --- a/MuonSpectrometer/MuonCnv/MuonByteStream/MuonByteStream/TgcRawDataProvider.h +++ b/MuonSpectrometer/MuonCnv/MuonByteStream/MuonByteStream/TgcRawDataProvider.h @@ -10,7 +10,11 @@ #include "GaudiKernel/ServiceHandle.h" #include "GaudiKernel/ToolHandle.h" -class IROBDataProviderSvc; +// interface to region selector service +#include "IRegionSelector/IRegSelSvc.h" + +// ROI Descriptor classes +#include "TrigSteeringEvent/TrigRoiDescriptor.h" namespace Muon { @@ -36,9 +40,18 @@ public: ~TgcRawDataProvider(); private: - ServiceHandle<IROBDataProviderSvc> m_robDataProvider; + ToolHandle<Muon::IMuonRawDataProviderTool> m_rawDataTool; - std::vector<uint32_t> m_robIds; + + /// Handle for region selector service + ServiceHandle<IRegSelSvc> m_regionSelector; + + /// Property to decide whether or not to do RoI based decoding + Gaudi::Property< bool > m_seededDecoding { this, "DoSeededDecoding", false, "If true do decoding in RoIs"}; + + /// ReadHandle for the input RoIs + SG::ReadHandleKey<TrigRoiDescriptorCollection> m_roiCollectionKey{ this, "RoIs", "OutputRoIs", "Name of RoI collection to read in" }; + }; } // ns end diff --git a/MuonSpectrometer/MuonCnv/MuonByteStream/src/TgcRawDataProvider.cxx b/MuonSpectrometer/MuonCnv/MuonByteStream/src/TgcRawDataProvider.cxx index 37b9087a3e03d8d8b8683d12955944f5635be907..5fc7ed6569449387bbbb3f9afa959cfc813d2471 100644 --- a/MuonSpectrometer/MuonCnv/MuonByteStream/src/TgcRawDataProvider.cxx +++ b/MuonSpectrometer/MuonCnv/MuonByteStream/src/TgcRawDataProvider.cxx @@ -1,9 +1,8 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "MuonByteStream/TgcRawDataProvider.h" -#include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h" #include "MuonCnvToolInterfaces/IMuonRawDataProviderTool.h" #include "MuonRDO/TgcRdoIdHash.h" #include "eformat/SourceIdentifier.h" @@ -17,10 +16,11 @@ using eformat::helper::SourceIdentifier; Muon::TgcRawDataProvider::TgcRawDataProvider(const std::string& name, ISvcLocator* pSvcLocator) : AthAlgorithm(name, pSvcLocator), - m_robDataProvider ("ROBDataProviderSvc",name), - m_rawDataTool ("Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool", this) + m_rawDataTool ("Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool", this), + m_regionSelector ("RegSelSvc",name) { declareProperty ("ProviderTool", m_rawDataTool); + declareProperty ("RegionSelectionSvc", m_regionSelector, "Region Selector"); } // Destructor @@ -34,17 +34,21 @@ Muon::TgcRawDataProvider::~TgcRawDataProvider() StatusCode Muon::TgcRawDataProvider::initialize() { ATH_MSG_INFO( "TgcRawDataProvider::initialize" ); - ATH_CHECK( m_robDataProvider.retrieve() ); + ATH_MSG_INFO( m_seededDecoding ); + ATH_CHECK( m_rawDataTool.retrieve() ); - TgcRdoIdHash rdoIdHash; - for (int i = 0; i < rdoIdHash.max(); i++) - { - SourceIdentifier sid((eformat::SubDetector)rdoIdHash.subDetectorId(i), rdoIdHash.rodId(i)); - m_robIds.push_back(sid.simple_code()); - } + ATH_CHECK( m_roiCollectionKey.initialize(m_seededDecoding) );// pass the seeded decoding flag - this marks the RoI collection flag as not used for the case when we decode the full detector - return StatusCode::SUCCESS; + if(m_seededDecoding) { + // We only need the region selector in RoI seeded mode + if (m_regionSelector.retrieve().isFailure()) { + ATH_MSG_FATAL("Unable to retrieve RegionSelector Svc"); + return StatusCode::FAILURE; + } + }//seededDecoding + + return StatusCode::SUCCESS; } StatusCode Muon::TgcRawDataProvider::finalize() @@ -58,15 +62,34 @@ StatusCode Muon::TgcRawDataProvider::execute() { ATH_MSG_VERBOSE( "TgcRawDataProvider::execute" ); - // ask ROBDataProviderSvc for the vector of ROBFragment for all TGC ROBIDs - std::vector<const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment*> vecOfRobf; - m_robDataProvider->getROBData(m_robIds, vecOfRobf); - - ATH_MSG_VERBOSE( "Number of ROB fragments " << vecOfRobf.size() ); + if(m_seededDecoding) { + + // read in the RoIs to process + SG::ReadHandle<TrigRoiDescriptorCollection> muonRoI(m_roiCollectionKey); + if(!muonRoI.isValid()){ + ATH_MSG_WARNING("Cannot retrieve muonRoI "<<m_roiCollectionKey.key()); + return StatusCode::SUCCESS; + } - // ask TgcRawDataProviderTool to decode it and to fill the IDC - if (m_rawDataTool->convert(vecOfRobf).isFailure()) + // loop on RoIs + std::vector<IdentifierHash> tgc_hash_ids; + for(auto roi : *muonRoI){ + ATH_MSG_DEBUG("Get ROBs for RoI " << *roi); + // get list of hash IDs from region selection + m_regionSelector->DetHashIDList(TGC, *roi, tgc_hash_ids); + + // decode the ROBs + if(m_rawDataTool->convert(tgc_hash_ids).isFailure()) { + ATH_MSG_ERROR( "RoI seeded BS conversion into RDOs failed" ); + } + // clear vector of hash IDs ready for next RoI + tgc_hash_ids.clear(); + } + } else { + // ask TgcRawDataProviderTool to decode full detector and to fill the IDC + if (m_rawDataTool->convert().isFailure()) ATH_MSG_ERROR( "BS conversion into RDOs failed" ); + } return StatusCode::SUCCESS; } diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py index 3f331be8159a3dc330c9b6bd1b3dc5dc4cf50edb..58e0938fca662227d3132c92ea35489a1c79e56e 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py @@ -161,8 +161,10 @@ def makeMuonPrepDataAlgs(forFullScan=False): RoIs = "MURoIs") from MuonByteStream.MuonByteStreamConf import Muon__TgcRawDataProvider - TgcRawDataProvider = Muon__TgcRawDataProvider(name = "TgcRawDataProvider", - ProviderTool = MuonTgcRawDataProviderTool ) + TgcRawDataProvider = Muon__TgcRawDataProvider(name = "TgcRawDataProvider" + postFix, + ProviderTool = MuonTgcRawDataProviderTool, + DoSeededDecoding = not forFullScan, + RoIs = "MURoIs" ) eventAlgs_MuonPRD.append( TgcRawDataProvider ) eventAlgs_MuonPRD.append( TgcRdoToTgcPrepData )