diff --git a/InnerDetector/InDetExample/InDetRecExample/python/InDetRecExampleConfig.py b/InnerDetector/InDetExample/InDetRecExample/python/InDetRecExampleConfig.py index 8f2b310003e4ce6b54df8c6476da54c6b57d7d15..d4968cf69d368df1653b95da87cab84a80a5c3b6 100644 --- a/InnerDetector/InDetExample/InDetRecExample/python/InDetRecExampleConfig.py +++ b/InnerDetector/InDetExample/InDetRecExample/python/InDetRecExampleConfig.py @@ -110,7 +110,7 @@ def InDetKOL(name='InDetKOL',**kwargs) : def InDetMeasRecalibST(name='InDetMeasRecalibST',**kwargs) : from TrkKalmanFitter.TrkKalmanFitterConf import Trk__MeasRecalibSteeringTool - pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix']) + pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix']) from InDetRecExample import TrackingCommon as TrackingCommon if 'BroadPixelClusterOnTrackTool' not in kwargs : @@ -132,7 +132,7 @@ def InDetKalmanTrackFitterBase(name='InDetKalmanTrackFitterBase',**kwargs) : from AthenaCommon.AppMgr import ToolSvc nameSuffix=kwargs.pop('nameSuffix','') - pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles']) + pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName']) if len(pix_cluster_on_track_args)>0 and len(nameSuffix)>0 : pix_cluster_on_track_args['nameSuffix']=nameSuffix @@ -194,7 +194,7 @@ def KalmanDNAFitter(name='KalmanDNAFitter',**kwargs) : return InDetKalmanTrackFitterBase(name,**kwargs) def DistributedKalmanFilter(name="DistributedKalmanFilter", **kwargs) : - pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix']) + pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix']) from InDetRecExample.TrackingCommon import setDefaults if 'ExtrapolatorTool' not in kwargs : @@ -241,7 +241,7 @@ def InDetGlobalChi2FitterBase(name='GlobalChi2FitterBase', **kwargs) : return Trk__GlobalChi2Fitter(name, **kwargs) def InDetGlobalChi2Fitter(name='InDetGlobalChi2Fitter', **kwargs) : - pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix']) + pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix']) from InDetRecExample import TrackingCommon as TrackingCommon @@ -305,7 +305,7 @@ def InDetGlobalChi2FitterBT(name='InDetGlobalChi2FitterBT', **kwargs): def InDetGlobalChi2FitterLowPt(name='InDetGlobalChi2FitterLowPt', **kwargs) : # @TODO TrackingGeometrySvc was not set but is set now # RotCreatorTool and BroadRotCreatorTool not set - pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix']) + pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix']) from InDetRecExample import TrackingCommon as TrackingCommon if 'RotCreatorTool' not in kwargs : @@ -329,7 +329,7 @@ def InDetGlobalChi2FitterTRT(name='InDetGlobalChi2FitterTRT', **kwargs) : ''' Global Chi2 Fitter for TRT segments with different settings ''' - pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix']) + pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix']) if 'RotCreatorTool' not in kwargs : from InDetRecExample import TrackingCommon as TrackingCommon @@ -357,7 +357,7 @@ def InDetGlobalChi2FitterTRT(name='InDetGlobalChi2FitterTRT', **kwargs) : )) def InDetGlobalChi2FitterDBM(name='InDetGlobalChi2FitterDBM', **kwargs) : - pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix']) + pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix']) if 'RotCreatorTool' not in kwargs : from InDetRecExample import TrackingCommon as TrackingCommon kwargs=setDefaults(kwargs, RotCreatorTool = TrackingCommon.getInDetRotCreatorDBM(**pix_cluster_on_track_args)) @@ -373,7 +373,7 @@ def InDetGlobalChi2FitterDBM(name='InDetGlobalChi2FitterDBM', **kwargs) : Momentum = 1000.*Units.MeV)) def GaussianSumFitter(name='GaussianSumFitter', **kwargs) : - pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix']) + pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix']) from InDetRecExample import TrackingCommon as TrackingCommon if 'ToolForROTCreation' not in kwargs : diff --git a/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py b/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py index 738553396c400e807b91fedea40c632b943ac930..90142d7220a34b3ba9d815ab657ad53945d8b4c6 100644 --- a/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py +++ b/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py @@ -513,7 +513,7 @@ def getInDetTRT_DriftCircleOnTrackUniversalToolCosmics(name='TRT_DriftCircleOnTr @makePublicTool def getInDetRotCreator(name='InDetRotCreator', **kwargs) : - strip_args=['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix'] + strip_args=['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'] pix_cluster_on_track_args = copyArgs(kwargs,strip_args) # note nameSuffix is strupped by makeName the_name = makeName( name, kwargs) @@ -548,7 +548,7 @@ def getInDetRotCreator(name='InDetRotCreator', **kwargs) : def getInDetRotCreatorPattern(name='InDetRotCreatorPattern', **kwargs) : if 'ToolPixelCluster' not in kwargs : - pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix']) + pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix']) kwargs = setDefaults(kwargs, ToolPixelCluster = getInDetPixelClusterOnTrackToolPattern(**pix_cluster_on_track_args)) return getInDetRotCreator(name=name, **kwargs) @@ -556,7 +556,7 @@ def getInDetRotCreatorPattern(name='InDetRotCreatorPattern', **kwargs) : def getInDetRotCreatorDBM(name='InDetRotCreatorDBM', **kwargs) : if 'ToolPixelCluster' not in kwargs : - pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix']) + pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix']) from InDetRecExample.InDetJobProperties import InDetFlags from AthenaCommon.DetFlags import DetFlags if InDetFlags.loadRotCreator() and DetFlags.haveRIO.pixel_on(): @@ -569,7 +569,7 @@ def getInDetRotCreatorDBM(name='InDetRotCreatorDBM', **kwargs) : def getInDetRotCreatorDigital(name='InDetRotCreatorDigital', **kwargs) : if 'ToolPixelCluster' not in kwargs : - pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix']) + pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix']) kwargs = setDefaults(kwargs, ToolPixelCluster = getInDetPixelClusterOnTrackToolDigital(**pix_cluster_on_track_args)) return getInDetRotCreator(name=name, **kwargs) @@ -577,7 +577,7 @@ def getInDetRotCreatorDigital(name='InDetRotCreatorDigital', **kwargs) : # @TODO rename to InDetBroadRotCreator def getInDetBroadRotCreator(name='InDetBroadInDetRotCreator', **kwargs) : if 'ToolPixelCluster' not in kwargs : - pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','RenounceInputHandles','nameSuffix']) + pix_cluster_on_track_args = copyArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix']) kwargs = setDefaults(kwargs, ToolPixelCluster = getInDetBroadPixelClusterOnTrackTool(**pix_cluster_on_track_args)) if 'ToolSCT_Cluster' not in kwargs : @@ -1069,9 +1069,8 @@ def getInDetSummaryHelperSharedHits(name='InDetSummaryHelperSharedHits',**kwargs def getInDetTrackSummaryTool(name='InDetTrackSummaryTool',**kwargs) : # makeName will remove the namePrefix in suffix from kwargs, so copyArgs has to be first hlt_args = copyArgs(kwargs,['isHLT','namePrefix']) - id_helper_args = copyArgs(kwargs,['ClusterSplitProbabilityName','RenounceInputHandles','namePrefix','nameSuffix']) if 'ClusterSplitProbabilityName' in kwargs else {} + id_helper_args = copyArgs(kwargs,['ClusterSplitProbabilityName','namePrefix','nameSuffix']) if 'ClusterSplitProbabilityName' in kwargs else {} kwargs.pop('ClusterSplitProbabilityName',None) - kwargs.pop('RenounceInputHandles',None) kwargs.pop('isHLT',None) the_name = makeName( name, kwargs) do_holes=kwargs.get("doHolesInDet",True) @@ -1097,13 +1096,12 @@ def getInDetTrackSummaryToolNoHoleSearch(name='InDetTrackSummaryToolNoHoleSearch def getInDetTrackSummaryToolSharedHits(name='InDetTrackSummaryToolSharedHits',**kwargs) : if 'InDetSummaryHelperTool' not in kwargs : - copy_args=['ClusterSplitProbabilityName','RenounceInputHandles','namePrefix','nameSuffix'] + copy_args=['ClusterSplitProbabilityName','namePrefix','nameSuffix'] do_holes=kwargs.get("doHolesInDet",True) if do_holes : copy_args += ['isHLT'] id_helper_args = copyArgs(kwargs,copy_args) if 'ClusterSplitProbabilityName' in kwargs else {} kwargs.pop('ClusterSplitProbabilityName',None) - kwargs.pop('RenounceInputHandles',None) kwargs = setDefaults( kwargs, InDetSummaryHelperTool = getInDetSummaryHelperSharedHits(**id_helper_args)) if 'TRT_ElectronPidTool' not in kwargs : diff --git a/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py b/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py index 4f2a7cbdc3c8c3e2b23000ed0bf8a8596f80b2a4..64b02d8db7904188de6f18f391deb15ecb961391 100644 --- a/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py +++ b/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py @@ -501,8 +501,7 @@ class ConfiguredNewTrackingSiPattern: # @TODO is the cluster split probability container needed here ? ambi_track_summary_tool = TrackingCommon.getInDetTrackSummaryTool(namePrefix = 'InDetAmbiguityProcessorSplitProb', nameSuffix = NewTrackingCuts.extension(), - ClusterSplitProbabilityName= 'InDetAmbiguityProcessorSplitProb'+NewTrackingCuts.extension(), - RenounceInputHandles = ['InDetAmbiguityProcessorSplitProb'+NewTrackingCuts.extension()]) + ClusterSplitProbabilityName= 'InDetAmbiguityProcessorSplitProb'+NewTrackingCuts.extension()) if InDetFlags.doTIDE_Ambi() and not (NewTrackingCuts.mode() == "ForwardSLHCTracks" or NewTrackingCuts.mode() == "ForwardTracks" or NewTrackingCuts.mode() == "DBM"): # DenseEnvironmentsAmbiguityScoreProcessorTool from TrkAmbiguityProcessor.TrkAmbiguityProcessorConf import Trk__DenseEnvironmentsAmbiguityScoreProcessorTool as ScoreProcessorTool @@ -524,8 +523,7 @@ class ConfiguredNewTrackingSiPattern: fitter_args = setDefaults({}, nameSuffix = 'Ambi'+NewTrackingCuts.extension(), SplitClusterMapExtension = NewTrackingCuts.extension(), - ClusterSplitProbabilityName = 'InDetAmbiguityProcessorSplitProb'+NewTrackingCuts.extension(), - RenounceInputHandles = ['InDetAmbiguityProcessorSplitProb'+NewTrackingCuts.extension()]) + ClusterSplitProbabilityName = 'InDetAmbiguityProcessorSplitProb'+NewTrackingCuts.extension()) if InDetFlags.holeSearchInGX2Fit(): fitter_args = setDefaults(fitter_args, DoHoleSearch = True, diff --git a/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool.h b/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool.h index 788a389a4bb8d507f73c61710002a08f5fe8f727..5d44f38c256e00de31e589a3f5ac63eb58e247ac 100755 --- a/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool.h +++ b/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool/InDetTrackSummaryHelperTool.h @@ -186,9 +186,6 @@ namespace InDet { SG::ReadHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainer {this, "ClusterSplitProbabilityName", "",""}; - Gaudi::Property<std::vector<std::string> > m_renounce - {this, "RenounceInputHandles", {},""}; - BooleanProperty m_usePixel{this, "usePixel", true}; BooleanProperty m_useSCT{this, "useSCT", true}; BooleanProperty m_useTRT{this, "useTRT", true}; diff --git a/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/src/InDetTrackSummaryHelperTool.cxx b/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/src/InDetTrackSummaryHelperTool.cxx index c576278b54deb170a924010cedb7db5748be62bb..e9482a0348b14f289dc948ee2e4495f662ed735a 100755 --- a/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/src/InDetTrackSummaryHelperTool.cxx +++ b/InnerDetector/InDetRecTools/InDetTrackSummaryHelperTool/src/InDetTrackSummaryHelperTool.cxx @@ -33,13 +33,6 @@ InDet::InDetTrackSummaryHelperTool::InDetTrackSummaryHelperTool(const std::strin } //========================================================================== -namespace { - std::string_view stripStoreName(const std::string &name) { - std::string::size_type pos = name.find("+"); - pos = (pos!=std::string::npos ? pos + 1 : 0); - return std::string_view( &(name.c_str()[pos]),name.size()-pos); - } -} StatusCode InDet::InDetTrackSummaryHelperTool::initialize() { @@ -72,18 +65,6 @@ StatusCode InDet::InDetTrackSummaryHelperTool::initialize() ATH_CHECK(m_clusterSplitProbContainer.initialize( !m_clusterSplitProbContainer.key().empty())); - if (!m_renounce.empty()) { - for (Gaudi::DataHandle* input_handle : inputHandles()) { - std::string_view base_name(stripStoreName(input_handle->objKey())); - for (const std::string &renounce_input : m_renounce) { - if (base_name==renounce_input) { - renounce(*input_handle); - ATH_MSG_INFO("Renounce : " << name() << " . " << input_handle->objKey() ); - } - } - } - } - ATH_MSG_INFO("initialize() successful in " << name()); return StatusCode::SUCCESS; diff --git a/InnerDetector/InDetRecTools/SiClusterOnTrackTool/SiClusterOnTrackTool/PixelClusterOnTrackTool.h b/InnerDetector/InDetRecTools/SiClusterOnTrackTool/SiClusterOnTrackTool/PixelClusterOnTrackTool.h index b0a7c8cd837a6c34bae49478f319e9ddf30fad85..ea222bcf6ecbef90281c043d06964e95578d655b 100755 --- a/InnerDetector/InDetRecTools/SiClusterOnTrackTool/SiClusterOnTrackTool/PixelClusterOnTrackTool.h +++ b/InnerDetector/InDetRecTools/SiClusterOnTrackTool/SiClusterOnTrackTool/PixelClusterOnTrackTool.h @@ -175,8 +175,6 @@ private: SG::ReadHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainer {this, "ClusterSplitProbabilityName", "",""}; - Gaudi::Property<std::vector<std::string> > m_renounce - {this, "RenounceInputHandles", {},""}; //moved from static to member variable static constexpr int s_nbinphi=9; diff --git a/InnerDetector/InDetRecTools/SiClusterOnTrackTool/src/PixelClusterOnTrackTool.cxx b/InnerDetector/InDetRecTools/SiClusterOnTrackTool/src/PixelClusterOnTrackTool.cxx index cf4b8c13f703c8d94e6a7b6843d6b12ae610cb1e..22b3ef7726514ed56e540fec2d8420ecbc365506 100755 --- a/InnerDetector/InDetRecTools/SiClusterOnTrackTool/src/PixelClusterOnTrackTool.cxx +++ b/InnerDetector/InDetRecTools/SiClusterOnTrackTool/src/PixelClusterOnTrackTool.cxx @@ -91,13 +91,6 @@ InDet::PixelClusterOnTrackTool::~PixelClusterOnTrackTool() { /////////////////////////////////////////////////////////////////// // Initialisation /////////////////////////////////////////////////////////////////// -namespace { - std::string_view stripStoreName(const std::string &name) { - std::string::size_type pos = name.find("+"); - pos = (pos!=std::string::npos ? pos + 1 : 0); - return std::string_view( &(name.c_str()[pos]),name.size()-pos); - } -} StatusCode InDet::PixelClusterOnTrackTool::initialize() { @@ -154,18 +147,6 @@ InDet::PixelClusterOnTrackTool::initialize() { /// ATH_CHECK(m_lorentzAngleTool.retrieve()); - - if (!m_renounce.empty()) { - for (Gaudi::DataHandle* input_handle : inputHandles()) { - std::string_view base_name(stripStoreName(input_handle->objKey())); - for (const std::string &renounce_input : m_renounce) { - if (base_name==renounce_input) { - renounce(*input_handle); - ATH_MSG_INFO("Renounce : " << name() << " . " << input_handle->objKey() ); - } - } - } - } return StatusCode::SUCCESS; } diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.cxx b/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.cxx index a29225e6e389d3364906aceb719f374af6f8eca1..0324fc0095c95e491af704af12dee6b9f04f7aa0 100644 --- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.cxx +++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.cxx @@ -6,7 +6,8 @@ #include "TrackScoringTool.h" #include "AmbiguityProcessorUtility.h" - +#include "GaudiKernel/ToolVisitor.h" +#include "GaudiKernel/RenounceToolInputsVisitor.h" namespace Trk { AmbiguityProcessorBase::AmbiguityProcessorBase(const std::string& t, const std::string& n, const IInterface* p ): @@ -23,7 +24,74 @@ namespace Trk { (track.trackParameters()->front()->pT() > m_pTminBrem) and ((not m_caloSeededBrem) or track.info().patternRecoInfo(Trk::TrackInfo::TrackInCaloROI)); } - + + StatusCode + AmbiguityProcessorBase::initializeClusterSplitProbContainer() { + // init ClusterSplitProb input and output container handles and renounce the output handle from its tools. + // the latter works because the ClusterSplitProb output container is created and recorded before the tools + // are called. + ATH_CHECK(m_clusterSplitProbContainerIn.initialize(!m_clusterSplitProbContainerIn.key().empty())); + ATH_CHECK(m_clusterSplitProbContainerOut.initialize(!m_clusterSplitProbContainerOut.key().empty())); + if (!m_clusterSplitProbContainerOut.key().empty()) { + auto visitor=[this](const IAlgTool *tool) { + const AlgTool *alg_tool = dynamic_cast<const AlgTool *>(tool); + for ( Gaudi::DataHandle* handle : alg_tool->inputHandles() ) { + this->msg(MSG::DEBUG) << " input Handle " + << tool->name() << " . " + << handle->objKey() << endmsg; + } + for (auto elm : alg_tool->inputDataObjs()) { + this->msg(MSG::DEBUG) << " input object " + << tool->name() << " . " + << elm.key() << endmsg; + } + }; + if (msgLvl(MSG::DEBUG)) { + ToolVisitor::visit(tools(), visitor); + } + /// usage: + ATH_MSG_DEBUG( " Renounce " << m_clusterSplitProbContainerOut.objKey() ); + auto logger=RenounceToolInputsVisitor::createLogger( [this](const std::string_view& tool_name, const std::string_view& key) { + this->msg(MSG::INFO) << " Renounce " << tool_name << " . " << key << endmsg; + }); + RenounceToolInputsVisitor renounce(std::vector<DataObjID>{m_clusterSplitProbContainerOut.fullKey()}, logger); + ToolVisitor::visit(tools(), renounce); + ATH_MSG_DEBUG(" renounced " << m_clusterSplitProbContainerOut.objKey() ); + if (msgLvl(MSG::DEBUG)) { + ToolVisitor::visit(tools(), visitor); + } + } + return StatusCode::SUCCESS; + } + + AmbiguityProcessorBase::UniqueClusterSplitProbabilityContainerPtr + AmbiguityProcessorBase::createAndRecordClusterSplitProbContainer(const EventContext& ctx) const { + SG::ReadHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainerIn; + if (!m_clusterSplitProbContainerIn.key().empty()) { + splitProbContainerIn = SG::ReadHandle( m_clusterSplitProbContainerIn, ctx); + if (!splitProbContainerIn.isValid()) { + ATH_MSG_ERROR( "Failed to get input cluster split probability container " << m_clusterSplitProbContainerIn.key()); + } + } + std::unique_ptr<Trk::ClusterSplitProbabilityContainer> + newSplitProbContainer(!m_clusterSplitProbContainerIn.key().empty() + ? std::make_unique<Trk::ClusterSplitProbabilityContainer>(*splitProbContainerIn) + : std::make_unique<Trk::ClusterSplitProbabilityContainer>()); + SG::WriteHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainerHandle; + if (!m_clusterSplitProbContainerOut.key().empty()) { + splitProbContainerHandle=SG::WriteHandle<Trk::ClusterSplitProbabilityContainer>( m_clusterSplitProbContainerOut, ctx); + if (splitProbContainerHandle.record(std::move(newSplitProbContainer)).isFailure()) { + ATH_MSG_FATAL( "Failed to record output cluster split probability container " << m_clusterSplitProbContainerOut.key()); + } + // newSplitProbContainer owned by storegate -> no cleanup + return UniqueClusterSplitProbabilityContainerPtr(splitProbContainerHandle.ptr(), [](Trk::ClusterSplitProbabilityContainer *) {}); + } + else { + // when not recording the split prob container in storegate the container must be deleted once going out of scope + return UniqueClusterSplitProbabilityContainerPtr(newSplitProbContainer.release(), [](Trk::ClusterSplitProbabilityContainer *ptr) { delete ptr;}); + } + } + bool AmbiguityProcessorBase::shouldTryBremRecovery(const Trk::Track & track, const TrackParameters * pPar) const{ return m_tryBremFit and @@ -167,4 +235,4 @@ namespace Trk { } -} \ No newline at end of file +} diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.h b/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.h index 4c9fec21d7c9ec61a44ee170b1a1bef2ac46fdcc..9c41f16cb4653f4cade90dee2716689b2b2c3649 100644 --- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.h +++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiguityProcessorBase.h @@ -13,6 +13,7 @@ #include "TrackPtr.h" #include "TrkEventPrimitives/TrackScore.h" +#include "TrkEventUtils/ClusterSplitProbabilityContainer.h" #include <vector> #include <map> //multimap @@ -95,7 +96,26 @@ namespace Trk { const TrackParameters * getTrackParameters(const Trk::Track* track) const; - + + /** Initialize read and write handles for ClusterSplitProbabilityContainers. + * If a write handle key is specified for the new ClusterSplitProbabilityContainer, read handles + * for this key are "renounced" in all child tools. + */ + StatusCode + initializeClusterSplitProbContainer(); + + // special pointer type for the ClusterSplitProbabilityContainerPtr to allow to use a single "pointer" for + // ClusterSplitProbabilityContainer which need to be deleted and those owned by storegate + using UniqueClusterSplitProbabilityContainerPtr = std::unique_ptr<Trk::ClusterSplitProbabilityContainer,void(*)(Trk::ClusterSplitProbabilityContainer*) >; + + /** Create a new cluster splitting probability container and (optionally) record it in storegate + * The new container may be populated from an already existing container, and might be stored in StoreGate. + * The ownersip, which might be either storegate or the calling scope, is taken into account by the + * UniqueClusterSplitProbabilityContainerPtr and must not be touched i.e. unique_ptr::release must not be called. + */ + AmbiguityProcessorBase::UniqueClusterSplitProbabilityContainerPtr + createAndRecordClusterSplitProbContainer(const EventContext& ctx) const; + //variables accessible to derived classes std::vector<float> m_etaBounds; //!< eta intervals for internal monitoring mutable std::mutex m_statMutex; @@ -105,6 +125,16 @@ namespace Trk { @todo The actual tool that is used should be configured through job options*/ ToolHandle<ITrackScoringTool> m_scoringTool; ToolHandle<Trk::IExtendedTrackSummaryTool> m_trackSummaryTool{this, "TrackSummaryTool", "InDetTrackSummaryToolNoHoleSearch"}; + + private: + // the handles should not be used directly instead the methods initializeClusterSplitProbContainer + // and createAndRecordClusterSplitProbContainer should be used. + SG::ReadHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainerIn + {this, "InputClusterSplitProbabilityName", "",""}; + SG::WriteHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainerOut + {this, "OutputClusterSplitProbabilityName", "",""}; + + protected: /** brem recovery mode with brem fit ? */ bool m_tryBremFit{}; bool m_caloSeededBrem{}; diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.cxx b/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.cxx index 48891f91622b34462337e841902a4f1b63d16312..9982fc9356a425a219dfe7d4f710867b94de9ec1 100644 --- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.cxx +++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.cxx @@ -88,9 +88,9 @@ Trk::DenseEnvironmentsAmbiguityProcessorTool::initialize(){ ATH_CHECK( m_extrapolatorTool.retrieve()); - ATH_CHECK(m_clusterSplitProbContainerIn.initialize(!m_clusterSplitProbContainerIn.key().empty())); - ATH_CHECK(m_clusterSplitProbContainerOut.initialize(!m_clusterSplitProbContainerOut.key().empty())); - + if (initializeClusterSplitProbContainer().isFailure()) { + sc=StatusCode::FAILURE; + } // Configuration of the material effects Trk::ParticleSwitcher particleSwitch; m_particleHypothesis = particleSwitch.particle[m_matEffects]; @@ -110,7 +110,6 @@ Trk::DenseEnvironmentsAmbiguityProcessorTool::initialize(){ } return sc; } -//================================================================================================== StatusCode Trk::DenseEnvironmentsAmbiguityProcessorTool::finalize(){ @@ -177,28 +176,7 @@ Trk::DenseEnvironmentsAmbiguityProcessorTool::solveTracks(const TracksScores &tr stat.incrementCounterByRegion(CounterIndex::kNcandidates,scoreTrack.first); } const EventContext& ctx = Gaudi::Hive::currentContext(); - SG::ReadHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainerIn; - if (!m_clusterSplitProbContainerIn.key().empty()) { - splitProbContainerIn = SG::ReadHandle( m_clusterSplitProbContainerIn, ctx); - if (!splitProbContainerIn.isValid()) { - ATH_MSG_ERROR( "Failed to get input cluster split probability container " << m_clusterSplitProbContainerIn.key()); - } - } - std::unique_ptr<Trk::ClusterSplitProbabilityContainer> splitProbContainerCleanup(!m_clusterSplitProbContainerIn.key().empty() - ? std::make_unique<ClusterSplitProbabilityContainer>(*splitProbContainerIn) - : std::make_unique<ClusterSplitProbabilityContainer>()); - SG::WriteHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainerHandle; - Trk::ClusterSplitProbabilityContainer *splitProbContainer; - if (!m_clusterSplitProbContainerOut.key().empty()) { - splitProbContainerHandle=SG::WriteHandle<Trk::ClusterSplitProbabilityContainer>( m_clusterSplitProbContainerOut, ctx); - if (splitProbContainerHandle.record(std::move(splitProbContainerCleanup)).isFailure()) { - ATH_MSG_FATAL( "Failed to record output cluster split probability container " << m_clusterSplitProbContainerOut.key()); - } - splitProbContainer = splitProbContainerHandle.ptr(); - } - else { - splitProbContainer = splitProbContainerCleanup.get(); - } + UniqueClusterSplitProbabilityContainerPtr splitProbContainer(createAndRecordClusterSplitProbContainer(ctx)); ATH_MSG_DEBUG ("Starting to solve tracks"); // now loop as long as map is not empty while ( !scoreTrackFitflagMap.empty() ){ diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.h b/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.h index 9b51c9f920fad6c3bacf3e4d7be16818386a768d..114504e4d093fe8d17909c4455703c17df6d458c 100644 --- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.h +++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/DenseEnvironmentsAmbiguityProcessorTool.h @@ -12,7 +12,6 @@ #include "TrkToolInterfaces/IPRDtoTrackMapTool.h" #include "TrkEventUtils/PRDtoTrackMap.h" -#include "TrkEventUtils/ClusterSplitProbabilityContainer.h" //need to include the following, since its a typedef and can't be forward declared. #include "TrkTrack/TrackCollection.h" @@ -83,8 +82,7 @@ namespace Trk { std::unique_ptr<Trk::Track> fit(const std::vector<const Trk::MeasurementBase*> &measurements, const TrackParameters ¶m, bool flag, Trk::ParticleHypothesis hypo) const; - - + std::unique_ptr<Trk::Track> fit(const Track &track, bool flag, Trk::ParticleHypothesis hypo) const override final; bool @@ -108,11 +106,6 @@ namespace Trk { which are removed are made */ ToolHandle<IAmbiTrackSelectionTool> m_selectionTool; - SG::ReadHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainerIn - {this, "InputClusterSplitProbabilityName", "",""}; - SG::WriteHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainerOut - {this, "OutputClusterSplitProbabilityName", "",""}; - bool m_rejectInvalidTracks; /// If enabled, this flag will make the tool restore the hole information from the input track after a refit. /// This is used when we want to use holes from the pattern recognition instead of repeating the hole search diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.cxx b/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.cxx index cde397de640ddf4a3ed4a9b9323ae4cda4a40aaf..acd3a08ba9ea6825869a4ea2a09052288617aa04 100644 --- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.cxx +++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.cxx @@ -9,6 +9,7 @@ #include "TrkToolInterfaces/IPRD_AssociationTool.h" #include "TrkTrack/TrackCollection.h" #include "TrkTrack/TrackInfo.h" + #include <map> #include <memory> #include "AmbiguityProcessorUtility.h" @@ -77,19 +78,19 @@ StatusCode Trk::SimpleAmbiguityProcessorTool::initialize(){ ATH_MSG_INFO( "Try brem fit and recovery for electron like tracks."); } - ATH_CHECK(m_clusterSplitProbContainerIn.initialize(!m_clusterSplitProbContainerIn.key().empty())); - ATH_CHECK(m_clusterSplitProbContainerOut.initialize(!m_clusterSplitProbContainerOut.key().empty())); // statistics if (m_etaBounds.size() != Counter::nRegions) { ATH_MSG_ERROR( "There must be exactly " << Counter::nRegions << " etaBounds: barrel end, transition region end, end-cap end, DBM start, DBM end." ); return StatusCode::FAILURE; } + if (initializeClusterSplitProbContainer().isFailure()) { + sc=StatusCode::FAILURE; + } return sc; } -//================================================================================================== - +//================================================================================================== StatusCode Trk::SimpleAmbiguityProcessorTool::finalize(){ return StatusCode::SUCCESS; } @@ -197,28 +198,7 @@ Trk::SimpleAmbiguityProcessorTool::solveTracks(TrackScoreMap& trackScoreTrackMap std::vector<std::unique_ptr<const Trk::Track> >& trackDustbin, Counter &stat) const{ const EventContext& ctx = Gaudi::Hive::currentContext(); - SG::ReadHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainerIn; - if (!m_clusterSplitProbContainerIn.key().empty()) { - splitProbContainerIn = SG::ReadHandle( m_clusterSplitProbContainerIn, ctx); - if (!splitProbContainerIn.isValid()) { - ATH_MSG_ERROR( "Failed to get input cluster split probability container " << m_clusterSplitProbContainerIn.key()); - } - } - std::unique_ptr<Trk::ClusterSplitProbabilityContainer> splitProbContainerCleanup(!m_clusterSplitProbContainerIn.key().empty() - ? std::make_unique<ClusterSplitProbabilityContainer>(*splitProbContainerIn) - : std::make_unique<ClusterSplitProbabilityContainer>()); - SG::WriteHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainerHandle; - Trk::ClusterSplitProbabilityContainer *splitProbContainer; - if (!m_clusterSplitProbContainerOut.key().empty()) { - splitProbContainerHandle = SG::WriteHandle<Trk::ClusterSplitProbabilityContainer>( m_clusterSplitProbContainerOut, ctx); - if (splitProbContainerHandle.record(std::move(splitProbContainerCleanup)).isFailure()) { - ATH_MSG_FATAL( "Failed to record output cluster split probability container " << m_clusterSplitProbContainerOut.key()); - } - splitProbContainer=splitProbContainerHandle.ptr(); - } - else { - splitProbContainer=splitProbContainerCleanup.get(); - } + UniqueClusterSplitProbabilityContainerPtr splitProbContainer(createAndRecordClusterSplitProbContainer(ctx)); std::unique_ptr<TrackCollection> finalTracks(std::make_unique<TrackCollection>()); diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.h b/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.h index 958b33bb4fdac1ed5c3c0dd3a04f6b6e77ec9e4d..532d2f3f1554de573b3a6df12ebf4f5379c6f495 100644 --- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.h +++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/SimpleAmbiguityProcessorTool.h @@ -14,7 +14,6 @@ #include "TrkToolInterfaces/IPRDtoTrackMapTool.h" #include "TrkEventUtils/PRDtoTrackMap.h" -#include "TrkEventUtils/ClusterSplitProbabilityContainer.h" #include "TrkToolInterfaces/IExtendedTrackSummaryTool.h" //need to include the following, since its a typedef and can't be forward declared. @@ -119,10 +118,6 @@ namespace Trk { ToolHandle<Trk::IPRDtoTrackMapTool> m_assoTool{this, "AssociationTool", "Trk::PRDtoTrackMapTool" }; /** selection tool - here the decision which hits remain on a track and which are removed are made */ ToolHandle<IAmbiTrackSelectionTool> m_selectionTool; - SG::ReadHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainerIn - {this, "InputClusterSplitProbabilityName", "",""}; - SG::WriteHandleKey<Trk::ClusterSplitProbabilityContainer> m_clusterSplitProbContainerOut - {this, "OutputClusterSplitProbabilityName", "",""}; }; } //end ns