diff --git a/InnerDetector/InDetRawAlgs/InDetOverlay/InDetOverlay/TRTOverlay.h b/InnerDetector/InDetRawAlgs/InDetOverlay/InDetOverlay/TRTOverlay.h index 74b33959965484113667d7b241eccf600b8b78eb..b8f3b8b827dae58d4efaf152432a700f544983a7 100644 --- a/InnerDetector/InDetRawAlgs/InDetOverlay/InDetOverlay/TRTOverlay.h +++ b/InnerDetector/InDetRawAlgs/InDetOverlay/InDetOverlay/TRTOverlay.h @@ -51,6 +51,8 @@ private: const TRT_ID *m_trtId{}; + Gaudi::Property<bool> m_sortBkgInput{this, "SortBkgInput", false, "Sort background input RDOs"}; + SG::ReadHandleKey<TRT_RDO_Container> m_bkgInputKey{this, "BkgInputKey", "Bkg_TRT_RDOs"," ReadHandleKey for Background Input TRT_RDO_Container"}; SG::ReadHandleKey<TRT_RDO_Container> m_signalInputKey{this, "SignalInputKey", "Sig_TRT_RDOs", "ReadHandleKey for Signal Input TRT_RDO_Container"}; SG::WriteHandleKey<TRT_RDO_Container> m_outputKey{this, "OutputKey", "TRT_RDOs", "WriteHandleKey for Output TRT_RDO_Container"}; diff --git a/InnerDetector/InDetRawAlgs/InDetOverlay/python/InDetOverlayConfig.py b/InnerDetector/InDetRawAlgs/InDetOverlay/python/InDetOverlayConfig.py index b2ed2de326c5cb86d82c06537934f03e11459a8b..7b84a98bede5a32912dcc613594d583bd80bbf0f 100644 --- a/InnerDetector/InDetRawAlgs/InDetOverlay/python/InDetOverlayConfig.py +++ b/InnerDetector/InDetRawAlgs/InDetOverlay/python/InDetOverlayConfig.py @@ -70,11 +70,13 @@ def getTRTOverlay(name="TRTOverlay", **kwargs): from Digitization.DigitizationFlags import digitizationFlags if overlayFlags.isOverlayMT(): + kwargs.setdefault("SortBkgInput", overlayFlags.isDataOverlay()) kwargs.setdefault("BkgInputKey", overlayFlags.bkgPrefix() + "TRT_RDOs"); kwargs.setdefault("SignalInputKey", overlayFlags.sigPrefix() + "TRT_RDOs"); kwargs.setdefault("OutputKey", "TRT_RDOs"); kwargs.setdefault("SignalInputSDOKey", overlayFlags.sigPrefix() + "TRT_SDO_Map"); else: + kwargs.setdefault("SortBkgInput", overlayFlags.isDataOverlay()) kwargs.setdefault("BkgInputKey", overlayFlags.dataStore() + "+TRT_RDOs"); kwargs.setdefault("SignalInputKey", overlayFlags.evtStore() + "+TRT_RDOs"); kwargs.setdefault("OutputKey", overlayFlags.outputStore() + "+TRT_RDOs"); diff --git a/InnerDetector/InDetRawAlgs/InDetOverlay/python/TRTOverlayConfig.py b/InnerDetector/InDetRawAlgs/InDetOverlay/python/TRTOverlayConfig.py index fffe234ed0e4cfdff96a91a23ee46ddc396846f6..dbeb29096350c1c32851e463fc18ecb5b314d43c 100644 --- a/InnerDetector/InDetRawAlgs/InDetOverlay/python/TRTOverlayConfig.py +++ b/InnerDetector/InDetRawAlgs/InDetOverlay/python/TRTOverlayConfig.py @@ -50,6 +50,7 @@ def TRTOverlayAlgCfg(flags, name="TRTOverlay", **kwargs): from InDetOverlay.TRT_ConditionsConfig import TRTStrawCondAlgCfg acc.merge(TRTStrawCondAlgCfg(flags)) + kwargs.setdefault("SortBkgInput", flags.Overlay.DataOverlay) kwargs.setdefault("BkgInputKey", flags.Overlay.BkgPrefix + "TRT_RDOs") kwargs.setdefault("SignalInputKey", flags.Overlay.SigPrefix + "TRT_RDOs") kwargs.setdefault("SignalInputSDOKey", flags.Overlay.SigPrefix + "TRT_SDO_Map") diff --git a/InnerDetector/InDetRawAlgs/InDetOverlay/src/TRTOverlay.cxx b/InnerDetector/InDetRawAlgs/InDetOverlay/src/TRTOverlay.cxx index a0a565fe4bfac8a1492adf02779345960ffe70cf..9fdc3b7bb8d38d1c468b0a99de98fd7a46932be0 100644 --- a/InnerDetector/InDetRawAlgs/InDetOverlay/src/TRTOverlay.cxx +++ b/InnerDetector/InDetRawAlgs/InDetOverlay/src/TRTOverlay.cxx @@ -23,6 +23,13 @@ namespace Overlay { + struct TRTRDOSorter { + bool operator() (TRT_RDORawData *digit1, TRT_RDORawData *digit2) + { + return digit1->identify() < digit2->identify(); + } + } TRTRDOSorterObject; + // Specialize copyCollection() for the TRT template<> std::unique_ptr<TRT_RDO_Collection> copyCollection(const IdentifierHash &hashId, @@ -39,6 +46,14 @@ namespace Overlay return outputCollection; } + + std::unique_ptr<TRT_RDO_Collection> copyCollectionAndSort(const IdentifierHash &hashId, + const TRT_RDO_Collection *collection) + { + std::unique_ptr<TRT_RDO_Collection> outputCollection = copyCollection(hashId, collection); + std::stable_sort(outputCollection->begin(), outputCollection->end(), TRTRDOSorterObject); + return outputCollection; + } } // namespace Overlay @@ -186,7 +201,12 @@ StatusCode TRTOverlay::overlayContainer(const TRT_RDO_Container *bkgContainer, [](const std::pair<IdentifierHash, bool> &lhs, IdentifierHash rhs) -> bool { return lhs.first < rhs; } ); if (search == overlapMap.end() || search->first != hashId) { // Copy the background collection - std::unique_ptr<TRT_RDO_Collection> bkgCollection = Overlay::copyCollection(hashId, bkgContainer->indexFindPtr(hashId)); + std::unique_ptr<TRT_RDO_Collection> bkgCollection{}; + if (m_sortBkgInput) { + bkgCollection = Overlay::copyCollectionAndSort(hashId, bkgContainer->indexFindPtr(hashId)); + } else { + bkgCollection = Overlay::copyCollection(hashId, bkgContainer->indexFindPtr(hashId)); + } if (outputContainer->addCollection(bkgCollection.get(), hashId).isFailure()) { ATH_MSG_ERROR("Adding background Collection with hashId " << hashId << " failed"); @@ -211,7 +231,12 @@ StatusCode TRTOverlay::overlayContainer(const TRT_RDO_Container *bkgContainer, auto outputCollection = std::make_unique<TRT_RDO_Collection>(hashId); outputCollection->setIdentifier(signalCollection->identify()); // Copy the background collection - std::unique_ptr<TRT_RDO_Collection> bkgCollection = Overlay::copyCollection(hashId, bkgContainer->indexFindPtr(hashId)); + std::unique_ptr<TRT_RDO_Collection> bkgCollection{}; + if (m_sortBkgInput) { + bkgCollection = Overlay::copyCollectionAndSort(hashId, bkgContainer->indexFindPtr(hashId)); + } else { + bkgCollection = Overlay::copyCollection(hashId, bkgContainer->indexFindPtr(hashId)); + } // Merge collections int det = m_trtId->barrel_ec(signalCollection->identify());