diff --git a/Event/xAOD/xAODTracking/Root/TrackSummary_v1.cxx b/Event/xAOD/xAODTracking/Root/TrackSummary_v1.cxx index 1cc6ba522ca0192d21acdd04754debdf0afd410e..88234cb35617f5c9f990416041f53e3917fc2e6c 100644 --- a/Event/xAOD/xAODTracking/Root/TrackSummary_v1.cxx +++ b/Event/xAOD/xAODTracking/Root/TrackSummary_v1.cxx @@ -31,6 +31,9 @@ DEFINE_API(TrackSummary_v1, unsigned int, tipIndex, setTipIndex) DEFINE_API(TrackSummary_v1, unsigned int, stemIndex, setStemIndex) +AUXSTORE_PRIMITIVE_SETTER_AND_GETTER(TrackSummary_v1, unsigned int, surfaceIndex, setSurfaceIndex) + + AUXSTORE_OBJECT_SETTER_AND_GETTER(TrackSummary_v1, uint8_t, particleHypothesis, setParticleHypothesis) diff --git a/Event/xAOD/xAODTracking/xAODTracking/versions/TrackSummaryAuxContainer_v1.h b/Event/xAOD/xAODTracking/xAODTracking/versions/TrackSummaryAuxContainer_v1.h index b7f4aa1c1d3dd3610b0e3180640d41dc62b021e6..a5a94c5bcf0a9bbca43d2e842a5b6f76a36e7d99 100644 --- a/Event/xAOD/xAODTracking/xAODTracking/versions/TrackSummaryAuxContainer_v1.h +++ b/Event/xAOD/xAODTracking/xAODTracking/versions/TrackSummaryAuxContainer_v1.h @@ -28,6 +28,7 @@ namespace xAOD { std::vector<unsigned int> nSharedHits; std::vector<unsigned int> tipIndex; std::vector<unsigned int> stemIndex; + std::vector<unsigned int> surfaceIndex; std::vector<uint8_t> particleHypothesis; }; } diff --git a/Event/xAOD/xAODTracking/xAODTracking/versions/TrackSummary_v1.h b/Event/xAOD/xAODTracking/xAODTracking/versions/TrackSummary_v1.h index cbf408ce4f508299596d68cbf4a2b08325dcb2c7..ba589f5e028d1ad953729ec82f83ad2c78d30290 100644 --- a/Event/xAOD/xAODTracking/xAODTracking/versions/TrackSummary_v1.h +++ b/Event/xAOD/xAODTracking/xAODTracking/versions/TrackSummary_v1.h @@ -200,6 +200,19 @@ namespace xAOD const unsigned int* stemIndexPtr() const; unsigned int* stemIndexPtr(); + + /** + * @brief index of the surfaces in the surfaces collection + */ + unsigned int surfaceIndex() const; + + /** + * @brief Set the index in surface container + */ + void setSurfaceIndex(unsigned int); + + + /** * particle hypothesis access */ diff --git a/Tracking/Acts/ActsConfig/python/ActsTrackFindingConfig.py b/Tracking/Acts/ActsConfig/python/ActsTrackFindingConfig.py index ea9ba93b15b6aed76cbb7c8948a2d190a094b029..5f82db832f57e124431004dd258ba76b4c072d27 100644 --- a/Tracking/Acts/ActsConfig/python/ActsTrackFindingConfig.py +++ b/Tracking/Acts/ActsConfig/python/ActsTrackFindingConfig.py @@ -204,7 +204,11 @@ def ActsMainAmbiguityResolutionAlgCfg(flags, from ActsConfig.ActsMonitoringConfig import ActsAmbiguityResolutionMonitoringToolCfg kwargs.setdefault('MonTool', acc.popToolsAndMerge( ActsAmbiguityResolutionMonitoringToolCfg(flags))) - + if 'TrackingGeometryTool' not in kwargs: + from ActsConfig.ActsGeometryConfig import ActsTrackingGeometryToolCfg + kwargs.setdefault( + "TrackingGeometryTool", + acc.popToolsAndMerge(ActsTrackingGeometryToolCfg(flags))) acc.addEventAlgo( CompFactory.ActsTrk.AmbiguityResolutionAlg(name, **kwargs)) return acc @@ -259,6 +263,12 @@ def ActsTrackMergerAlgCfg(flags, **kwargs) -> ComponentAccumulator: acc = ComponentAccumulator() kwargs.setdefault('OutputTrackCollection', 'ActsCombinedTracks') + if 'TrackingGeometryTool' not in kwargs: + from ActsConfig.ActsGeometryConfig import ActsTrackingGeometryToolCfg + kwargs.setdefault( + "TrackingGeometryTool", + acc.popToolsAndMerge(ActsTrackingGeometryToolCfg(flags))) + acc.addEventAlgo(CompFactory.ActsTrk.TrackMergerAlg(name, **kwargs)) return acc diff --git a/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.h b/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.h index a2466ef11d8caef26ad9435aa0de8ae94688b91c..2fb4db7ec42d2056c895b906b25baea52b28d869 100644 --- a/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.h +++ b/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.h @@ -365,7 +365,6 @@ class MutableMultiTrajectory final friend ActsTrk::MutableTrackContainerHandlesHelper; - private: std::unique_ptr<xAOD::TrackStateAuxContainer> m_trackStatesAux; @@ -389,7 +388,8 @@ class MutableMultiTrajectory final std::vector<StoredSurface> m_surfaces; ActsGeometryContext m_geoContext; - // addjust prealocated size to actualy used + + // adjust preallocated size to actually used void trim(); }; diff --git a/Tracking/Acts/ActsEvent/ActsEvent/TrackContainerHandlesHelper.h b/Tracking/Acts/ActsEvent/ActsEvent/TrackContainerHandlesHelper.h index b9ddec226e84449f84fe369b0229cb5f3ce115c7..5247ff0d1b2d1e91a735cb723947d5f6ad3d6d73 100644 --- a/Tracking/Acts/ActsEvent/ActsEvent/TrackContainerHandlesHelper.h +++ b/Tracking/Acts/ActsEvent/ActsEvent/TrackContainerHandlesHelper.h @@ -43,10 +43,13 @@ class MutableTrackContainerHandlesHelper { * produces ActsTrk::ConstTrackContainer with all backends stored in SG * @arg tc - MutableTrackContainer the source (will be disassembled * after the operation) - * @arg context - event context (needed for SG operations) + * @arg - geoContext - geometry context, needed in surfaces conversion + * @arg evtContext - event context (needed for SG operations) */ std::unique_ptr<ActsTrk::TrackContainer> moveToConst( - ActsTrk::MutableTrackContainer&& tc, const EventContext& context) const; + ActsTrk::MutableTrackContainer&& tc, + const Acts::GeometryContext& geoContext, + const EventContext& evtContext) const; private: // MTJ part diff --git a/Tracking/Acts/ActsEvent/ActsEvent/TrackSummaryContainer.h b/Tracking/Acts/ActsEvent/ActsEvent/TrackSummaryContainer.h index d4fe15e216651a13bb0eb59d9cdd44cc55b593d8..ede1e645d4092dc34ad366f9ab0abcb6266d5f41 100644 --- a/Tracking/Acts/ActsEvent/ActsEvent/TrackSummaryContainer.h +++ b/Tracking/Acts/ActsEvent/ActsEvent/TrackSummaryContainer.h @@ -11,7 +11,6 @@ #include "ActsEvent/Decoration.h" #include "xAODTracking/TrackSummaryContainer.h" #include "xAODTracking/TrackSummaryAuxContainer.h" -#include "xAODTracking/TrackSurfaceAuxContainer.h" #include "xAODTracking/TrackSurfaceContainer.h" #include "ActsEvent/SurfaceEncoding.h" @@ -57,8 +56,7 @@ class TrackSummaryContainer { public: using IndexType = uint32_t; // TODO find common place for it static constexpr auto kInvalid = Acts::MultiTrajectoryTraits::kInvalid; - TrackSummaryContainer(const DataLink<xAOD::TrackSummaryContainer>& lin = nullptr, - const DataLink<xAOD::TrackSurfaceAuxContainer>& surfLink = nullptr); + TrackSummaryContainer(const DataLink<xAOD::TrackSummaryContainer>& lin = nullptr); static const std::set<std::string> staticVariables; static const std::set<Acts::HashedString> staticVariableHashes; /** @@ -97,11 +95,6 @@ class TrackSummaryContainer { */ ActsTrk::ConstCovariance covariance(ActsTrk::IndexType itrack) const; - /** - * surface - */ - std::shared_ptr<const Acts::Surface> surface(ActsTrk::IndexType itrack) const; - void fillFrom(ActsTrk::MutableTrackSummaryContainer& mtb); template<typename T> @@ -110,20 +103,15 @@ class TrackSummaryContainer { void restoreDecorations(); - const xAOD::TrackSummaryContainer* trackBackend() const{ - return m_trackBackend.cptr(); - } + void decodeSurfaces(const xAOD::TrackSurfaceContainer* src, const Acts::GeometryContext&); std::vector<Acts::HashedString> dynamicKeys_impl() const; protected: DataLink<xAOD::TrackSummaryContainer> m_trackBackend = nullptr; - DataLink<xAOD::TrackSurfaceAuxContainer> m_surfBackendAux = nullptr; - std::vector<ActsTrk::detail::Decoration> m_decorations; - - std::vector<std::shared_ptr<const Acts::Surface>> m_surfaces; + std::vector<std::shared_ptr<const Acts::Surface>> m_surfaces; // decoded transient form of surfaces }; class MutableTrackSummaryContainer : public TrackSummaryContainer { @@ -134,17 +122,6 @@ class MutableTrackSummaryContainer : public TrackSummaryContainer { MutableTrackSummaryContainer(MutableTrackSummaryContainer&&); MutableTrackSummaryContainer& operator=(MutableTrackSummaryContainer&& other) noexcept; - - /** - * adds new surface to the tail of the container - */ - ActsTrk::IndexType addSurface_impl(); - - /** - * clears surface data under index - */ - void removeSurface_impl(ActsTrk::IndexType isurf); - /** * adds new track to the tail of the container */ @@ -225,16 +202,11 @@ class MutableTrackSummaryContainer : public TrackSummaryContainer { return m_mutableTrackBackend.get(); } - xAOD::TrackSurfaceContainer* surfBackend(){ - return m_mutableSurfBackend.get(); - } + void encodeSurfaces(xAOD::TrackSurfaceAuxContainer* dest, const Acts::GeometryContext&) const; private: std::unique_ptr<xAOD::TrackSummaryContainer> m_mutableTrackBackend; std::unique_ptr<xAOD::TrackSummaryAuxContainer> m_mutableTrackBackendAux; - - std::unique_ptr<xAOD::TrackSurfaceContainer> m_mutableSurfBackend; - std::unique_ptr<xAOD::TrackSurfaceAuxContainer> m_mutableSurfBackendAux; }; diff --git a/Tracking/Acts/ActsEvent/Root/MultiTrajectory.cxx b/Tracking/Acts/ActsEvent/Root/MultiTrajectory.cxx index eb974ed6882ddcb8e1924cfcd530083709102b2c..34b2c64d6ec8d59247233cbb1a5173ff1a9c967b 100644 --- a/Tracking/Acts/ActsEvent/Root/MultiTrajectory.cxx +++ b/Tracking/Acts/ActsEvent/Root/MultiTrajectory.cxx @@ -642,7 +642,6 @@ ActsTrk::MultiTrajectory::getUncalibratedSourceLink_impl(ActsTrk::IndexType ista void ActsTrk::MultiTrajectory::moveSurfaces(const ActsTrk::MutableMultiTrajectory* mtj) { m_surfaces = std::move(mtj->m_surfaces); - INSPECTCALL(this << " " << m_surfaces.size()); } // TODO remove this implementation once tracking uses only sourceLinks with EL diff --git a/Tracking/Acts/ActsEvent/Root/TrackContainerHandlesHelper.cxx b/Tracking/Acts/ActsEvent/Root/TrackContainerHandlesHelper.cxx index 589cbd5072c6e21d5516d47d2a08dd6152f41983..219260b621b81d21e9cf0c121b13cdd325614db6 100644 --- a/Tracking/Acts/ActsEvent/Root/TrackContainerHandlesHelper.cxx +++ b/Tracking/Acts/ActsEvent/Root/TrackContainerHandlesHelper.cxx @@ -25,8 +25,8 @@ std::string prefixFromTrackContainerName(const std::string& tracks) { template <typename T, typename IFACE, typename AUX> void recordxAOD(const SG::WriteHandleKey<T>& key, IFACE& iface, AUX& aux, - const EventContext& context) { - SG::WriteHandle<T> handle = SG::makeHandle(key, context); + const EventContext& evtContext) { + SG::WriteHandle<T> handle = SG::makeHandle(key, evtContext); if (handle.record(std::move(iface), std::move(aux)).isFailure()) { throw std::runtime_error( std::string("MutableTrackContainerHandlesHelper::recordxAOD, can't record ") + key.key() + " backend"); @@ -74,44 +74,44 @@ StatusCode MutableTrackContainerHandlesHelper::initialize( std::unique_ptr<ActsTrk::MultiTrajectory> MutableTrackContainerHandlesHelper::moveToConst( - ActsTrk::MutableMultiTrajectory&& mmtj, const EventContext& context) const { + ActsTrk::MutableMultiTrajectory&& mmtj, const EventContext& evtContext) const { mmtj.trim(); - auto statesBackendHandle = SG::makeHandle(m_statesKey, context); + auto statesBackendHandle = SG::makeHandle(m_statesKey, evtContext); auto statesInterface = ActsTrk::makeInterfaceContainer<xAOD::TrackStateContainer>( mmtj.trackStatesAux()); - recordxAOD(m_statesKey, statesInterface, mmtj.m_trackStatesAux, context); + recordxAOD(m_statesKey, statesInterface, mmtj.m_trackStatesAux, evtContext); auto parametersInterface = ActsTrk::makeInterfaceContainer<xAOD::TrackParametersContainer>( mmtj.trackParametersAux()); - recordxAOD(m_parametersKey, parametersInterface, mmtj.m_trackParametersAux, context); + recordxAOD(m_parametersKey, parametersInterface, mmtj.m_trackParametersAux, evtContext); auto jacobiansInterface = ActsTrk::makeInterfaceContainer<xAOD::TrackJacobianContainer>( mmtj.trackJacobiansAux()); - recordxAOD(m_jacobiansKey, jacobiansInterface, mmtj.m_trackJacobiansAux, context); + recordxAOD(m_jacobiansKey, jacobiansInterface, mmtj.m_trackJacobiansAux, evtContext); auto measurementsInterface = ActsTrk::makeInterfaceContainer<xAOD::TrackMeasurementContainer>( mmtj.trackMeasurementsAux()); - recordxAOD(m_measurementsKey, measurementsInterface, mmtj.m_trackMeasurementsAux, context); + recordxAOD(m_measurementsKey, measurementsInterface, mmtj.m_trackMeasurementsAux, evtContext); - auto surfacesBackendHandle = SG::makeHandle(m_surfacesKey, context); - recordxAOD(m_surfacesKey, mmtj.m_surfacesBackend, mmtj.m_surfacesBackendAux, context); + auto surfacesBackendHandle = SG::makeHandle(m_surfacesKey, evtContext); + recordxAOD(m_surfacesKey, mmtj.m_surfacesBackend, mmtj.m_surfacesBackendAux, evtContext); // construct const MTJ version auto cmtj = std::make_unique<ActsTrk::MultiTrajectory>( DataLink<xAOD::TrackStateAuxContainer>(m_statesKey.key() + "Aux.", - context), + evtContext), DataLink<xAOD::TrackParametersAuxContainer>( - m_parametersKey.key() + "Aux.", context), + m_parametersKey.key() + "Aux.", evtContext), DataLink<xAOD::TrackJacobianAuxContainer>(m_jacobiansKey.key() + "Aux.", - context), + evtContext), DataLink<xAOD::TrackMeasurementAuxContainer>( - m_measurementsKey.key() + "Aux.", context)); + m_measurementsKey.key() + "Aux.", evtContext)); cmtj->moveSurfaces(&mmtj); cmtj->moveLinks(&mmtj); @@ -120,12 +120,13 @@ MutableTrackContainerHandlesHelper::moveToConst( std::unique_ptr<ActsTrk::TrackContainer> MutableTrackContainerHandlesHelper::moveToConst( - ActsTrk::MutableTrackContainer&& tc, const EventContext& context) const { + ActsTrk::MutableTrackContainer&& tc, const Acts::GeometryContext& geoContext, const EventContext& evtContext) const { + std::unique_ptr<ActsTrk::MultiTrajectory> constMtj = - moveToConst(std::move(tc.trackStateContainer()), context); + moveToConst(std::move(tc.trackStateContainer()), evtContext); - auto constMtjHandle = SG::makeHandle(m_mtjKey, context); + auto constMtjHandle = SG::makeHandle(m_mtjKey, evtContext); if (constMtjHandle.record(std::move(constMtj)).isFailure()) { throw std::runtime_error( "MutableTrackContainerHandlesHelper::moveToConst, can't record " @@ -135,17 +136,23 @@ MutableTrackContainerHandlesHelper::moveToConst( auto interfaceTrackSummaryContainer = ActsTrk::makeInterfaceContainer<xAOD::TrackSummaryContainer>( tc.container().m_mutableTrackBackendAux.get()); - recordxAOD(m_xAODTrackSummaryKey, interfaceTrackSummaryContainer, tc.container().m_mutableTrackBackendAux, context); + recordxAOD(m_xAODTrackSummaryKey, interfaceTrackSummaryContainer, tc.container().m_mutableTrackBackendAux, evtContext); + + auto trackSurfacesAux = std::make_unique<xAOD::TrackSurfaceAuxContainer>(); + // TODO consider passing in GeoContext to this function + tc.container().encodeSurfaces(trackSurfacesAux.get(), geoContext); - recordxAOD(m_trackSurfacesKey, tc.container().m_mutableSurfBackend, tc.container().m_mutableSurfBackendAux, context); + auto trackSurfaces = ActsTrk::makeInterfaceContainer<xAOD::TrackSurfaceContainer>( + trackSurfacesAux.get()); + recordxAOD(m_trackSurfacesKey, trackSurfaces, trackSurfacesAux, evtContext); auto constTrackSummary = std::make_unique<ActsTrk::TrackSummaryContainer>( DataLink<xAOD::TrackSummaryContainer>(m_xAODTrackSummaryKey.key(), - context)); + evtContext)); constTrackSummary->restoreDecorations(); constTrackSummary->fillFrom(tc.container()); - auto constTrackSummaryHandle = SG::makeHandle(m_trackSummaryKey, context); + auto constTrackSummaryHandle = SG::makeHandle(m_trackSummaryKey, evtContext); if (constTrackSummaryHandle.record(std::move(constTrackSummary)) .isFailure()) { throw std::runtime_error( @@ -154,8 +161,8 @@ MutableTrackContainerHandlesHelper::moveToConst( } auto constTrack = std::make_unique<ActsTrk::TrackContainer>( DataLink<ActsTrk::TrackSummaryContainer>(m_trackSummaryKey.key(), - context), - DataLink<ActsTrk::MultiTrajectory>(m_mtjKey.key(), context)); + evtContext), + DataLink<ActsTrk::MultiTrajectory>(m_mtjKey.key(), evtContext)); return constTrack; } @@ -190,30 +197,30 @@ StatusCode ConstTrackContainerHandlesHelper::initialize( std::unique_ptr<ActsTrk::MultiTrajectory> ConstTrackContainerHandlesHelper::buildMtj(const Acts::TrackingGeometry* geo, const Acts::GeometryContext& geoContext, - const EventContext& context) const { + const EventContext& evtContext) const { // we need to build it from backends DataLink<xAOD::TrackStateAuxContainer> statesLink(m_statesKey.key() + "Aux.", - context); + evtContext); if (not statesLink.isValid()) { throw std::runtime_error( "ConstMultiTrajectoryHandle::build, StatesLink is invalid"); } DataLink<xAOD::TrackParametersAuxContainer> parametersLink( - m_parametersKey.key() + "Aux.", context); + m_parametersKey.key() + "Aux.", evtContext); if (not parametersLink.isValid()) { throw std::runtime_error( "ConstMultiTrajectoryHandle::build, ParametersLink is invalid"); } DataLink<xAOD::TrackJacobianAuxContainer> jacobiansLink( - m_jacobiansKey.key() + "Aux.", context); + m_jacobiansKey.key() + "Aux.", evtContext); if (not jacobiansLink.isValid()) { throw std::runtime_error( "ConstMultiTrajectoryHandle::build, JacobiansLink is invalid"); } DataLink<xAOD::TrackMeasurementAuxContainer> measurementsLink( - m_measurementsKey.key() + "Aux.", context); + m_measurementsKey.key() + "Aux.", evtContext); if (not measurementsLink.isValid()) { throw std::runtime_error( "ConstMultiTrajectoryHandle::build, MeasurementsLink is invalid"); @@ -228,42 +235,42 @@ ConstTrackContainerHandlesHelper::buildMtj(const Acts::TrackingGeometry* geo, std::unique_ptr<ActsTrk::TrackContainer> ConstTrackContainerHandlesHelper::build(const Acts::TrackingGeometry* geo, const Acts::GeometryContext& geoContext, - const EventContext& context) const { + const EventContext& evtContext) const { std::unique_ptr<ActsTrk::MultiTrajectory> mtj = - buildMtj(geo, geoContext, context); - auto mtjHandle = SG::makeHandle(m_mtjKey, context); + buildMtj(geo, geoContext, evtContext); + auto mtjHandle = SG::makeHandle(m_mtjKey, evtContext); if (mtjHandle.record(std::move(mtj)).isFailure()) { throw std::runtime_error( "ConstTrackContainerHandle<C>::build failed recording MTJ"); } DataLink<xAOD::TrackSummaryContainer> summaryLink(m_xAODTrackSummaryKey.key(), - context); + evtContext); if (not summaryLink.isValid()) { throw std::runtime_error( "ConstTrackContainerHandle::build, SummaryLink is invalid"); } - DataLink<xAOD::TrackSurfaceAuxContainer> surfacesLink( - m_trackSurfacesKey.key() + "Aux.", context); - if (not surfacesLink.isValid()) { + auto surfacesHandle = SG::makeHandle(m_trackSurfacesKey, evtContext); + if (not surfacesHandle.isValid()) { throw std::runtime_error( - "ConstTrackContainerHandle::build, SurfaceLink is invalid"); + "ConstTrackContainerHandle::build, SurfaceHandle is invalid"); } - auto constTrackSummary = std::make_unique<ActsTrk::TrackSummaryContainer>( - summaryLink, surfacesLink); - auto summaryHandle = SG::makeHandle(m_trackSummaryKey, context); + auto constTrackSummary = std::make_unique<ActsTrk::TrackSummaryContainer>(summaryLink); + constTrackSummary->decodeSurfaces( surfacesHandle.cptr(), geoContext); + + auto summaryHandle = SG::makeHandle(m_trackSummaryKey, evtContext); if (summaryHandle.record(std::move(constTrackSummary)).isFailure()) { throw std::runtime_error( - "MutableTrackContainerHandle::moveToConst, can't record " + "MutableTrackContainerHandle::build, can't record " "TrackSummary"); } auto constTrack = std::make_unique<ActsTrk::TrackContainer>( DataLink<ActsTrk::TrackSummaryContainer>(m_trackSummaryKey.key(), - context), - DataLink<ActsTrk::MultiTrajectory>(m_mtjKey.key(), context)); + evtContext), + DataLink<ActsTrk::MultiTrajectory>(m_mtjKey.key(), evtContext)); return constTrack; diff --git a/Tracking/Acts/ActsEvent/Root/TrackSummaryContainer.cxx b/Tracking/Acts/ActsEvent/Root/TrackSummaryContainer.cxx index 64cabf8497a40ca5e45dd54d4d980cd295b55c84..52b4365ad15b8e93283153790bcce998849db7c6 100644 --- a/Tracking/Acts/ActsEvent/Root/TrackSummaryContainer.cxx +++ b/Tracking/Acts/ActsEvent/Root/TrackSummaryContainer.cxx @@ -5,7 +5,7 @@ #include "xAODTracking/TrackSummary.h" #include "ActsEvent/ParticleHypothesisEncoding.h" -// this is list of xAOD container varaible names that are "hardcoded" in TrackSummary_v1 +// this is list of xAOD container variable names that are "hardcoded" in TrackSummary_v1 // their compatibility is maintain ed by the unit tests: AllStaticxAODVaraiblesAreKnown const std::set<std::string> ActsTrk::TrackSummaryContainer::staticVariables = { "params", "covParams", "nMeasurements", "nHoles", "chi2f", @@ -23,9 +23,9 @@ const std::set<Acts::HashedString> ActsTrk::TrackSummaryContainer::staticVariabl ActsTrk::TrackSummaryContainer::TrackSummaryContainer( - const DataLink<xAOD::TrackSummaryContainer>& link, - const DataLink<xAOD::TrackSurfaceAuxContainer>& surfLink) - : m_trackBackend(link), m_surfBackendAux(surfLink) {} + const DataLink<xAOD::TrackSummaryContainer>& link) + : m_trackBackend(link) + {} const Acts::Surface* ActsTrk::TrackSummaryContainer::referenceSurface_impl( ActsTrk::IndexType itrack) const { @@ -99,19 +99,11 @@ ActsTrk::ConstCovariance ActsTrk::TrackSummaryContainer::covariance( return m_trackBackend->at(itrack)->covParamsEigen(); } -std::shared_ptr<const Acts::Surface> ActsTrk::TrackSummaryContainer::surface( - ActsTrk::IndexType itrack) const { - const Acts::GeometryContext geoContext{}; - return decodeSurface( m_surfBackendAux.cptr(), itrack, geoContext ); -} - void ActsTrk::TrackSummaryContainer::fillFrom( ActsTrk::MutableTrackSummaryContainer& mtb) { m_surfaces = std::move(mtb.m_surfaces); } - - void ActsTrk::TrackSummaryContainer::restoreDecorations() { m_decorations = ActsTrk::detail::restoreDecorations(m_trackBackend->getConstStore(), staticVariables); } @@ -127,6 +119,13 @@ std::vector<Acts::HashedString> ActsTrk::TrackSummaryContainer::dynamicKeys_impl return result; } +void ActsTrk::TrackSummaryContainer::decodeSurfaces(const xAOD::TrackSurfaceContainer* src, const Acts::GeometryContext& geoContext) { + for ( auto xAODSurfacePtr: *src) { + m_surfaces.push_back( decodeSurface(xAODSurfacePtr, geoContext)); + } +} + + //////////////////////////////////////////////////////////////////// @@ -139,11 +138,6 @@ ActsTrk::MutableTrackSummaryContainer::MutableTrackSummaryContainer() { m_mutableTrackBackend->setStore(m_mutableTrackBackendAux.get()); TrackSummaryContainer::m_trackBackend = m_mutableTrackBackend.get(); - m_mutableSurfBackend = std::make_unique<xAOD::TrackSurfaceContainer>(); - m_mutableSurfBackendAux = std::make_unique<xAOD::TrackSurfaceAuxContainer>(); - m_mutableSurfBackend->setStore(m_mutableSurfBackendAux.get()); - - TrackSummaryContainer::m_surfBackendAux = m_mutableSurfBackendAux.get(); } ActsTrk::MutableTrackSummaryContainer::MutableTrackSummaryContainer( @@ -153,11 +147,6 @@ ActsTrk::MutableTrackSummaryContainer::MutableTrackSummaryContainer( m_mutableTrackBackend->setStore(m_mutableTrackBackendAux.get()); TrackSummaryContainer::m_trackBackend = m_mutableTrackBackend.get(); - m_mutableSurfBackend = std::move(other.m_mutableSurfBackend); - m_mutableSurfBackendAux = std::move(other.m_mutableSurfBackendAux); - m_mutableSurfBackend->setStore(m_mutableSurfBackendAux.get()); - TrackSummaryContainer::m_surfBackendAux = m_mutableSurfBackendAux.get(); - m_surfaces = std::move(other.m_surfaces); m_decorations = std::move(other.m_decorations); } @@ -171,11 +160,6 @@ ActsTrk::MutableTrackSummaryContainer& ActsTrk::MutableTrackSummaryContainer::op m_mutableTrackBackend->setStore(m_mutableTrackBackendAux.get()); TrackSummaryContainer::m_trackBackend = m_mutableTrackBackend.get(); - m_mutableSurfBackend = std::exchange(other.m_mutableSurfBackend, nullptr); - m_mutableSurfBackendAux = std::exchange(other.m_mutableSurfBackendAux, nullptr); - m_mutableSurfBackend->setStore(m_mutableSurfBackendAux.get()); - TrackSummaryContainer::m_surfBackendAux = m_mutableSurfBackendAux.get(); - m_surfaces = std::move(other.m_surfaces); m_decorations = std::move(other.m_decorations); @@ -205,29 +189,6 @@ void ActsTrk::MutableTrackSummaryContainer::removeTrack_impl( m_mutableTrackBackend->erase(m_mutableTrackBackend->begin() + itrack); } -// Add and remove surface -ActsTrk::IndexType ActsTrk::MutableTrackSummaryContainer::addSurface_impl() { - m_mutableSurfBackendAux->resize(m_mutableSurfBackendAux->size()+1); - return m_mutableSurfBackendAux->size() - 1; -} - -void ActsTrk::MutableTrackSummaryContainer::removeSurface_impl( - ActsTrk::IndexType isurf) { - if (isurf >= m_mutableSurfBackendAux->size()) { - throw std::out_of_range("removeSurface_impl"); - } - // TODO find a more generic way to do this (possible issue may sneak ins when adding more variables to backend) - for (auto i = isurf; i < m_mutableSurfBackendAux->size()-1; ++i) { - m_mutableSurfBackendAux->surfaceType[i] = m_mutableSurfBackendAux->surfaceType[i+1]; - m_mutableSurfBackendAux->translation[i] = m_mutableSurfBackendAux->translation[i+1]; - m_mutableSurfBackendAux->rotation[i] = m_mutableSurfBackendAux->rotation[i+1]; - m_mutableSurfBackendAux->boundValues[i] = m_mutableSurfBackendAux->boundValues[i+1]; - } - m_mutableSurfBackendAux->resize(m_mutableSurfBackendAux->size()-1); -} - - - // this in fact may be a copy from other MutableTrackSymmaryContainer void ActsTrk::MutableTrackSummaryContainer::copyDynamicFrom_impl( ActsTrk::IndexType itrack, Acts::HashedString key, @@ -290,7 +251,16 @@ void ActsTrk::MutableTrackSummaryContainer::clear() { void ActsTrk::MutableTrackSummaryContainer::setReferenceSurface_impl( ActsTrk::IndexType itrack, std::shared_ptr<const Acts::Surface> surface) { m_surfaces.resize(itrack + 1, nullptr); - m_surfaces[itrack] = std::move(surface); + m_surfaces[itrack] = surface; +} + +void ActsTrk::MutableTrackSummaryContainer::encodeSurfaces( xAOD::TrackSurfaceAuxContainer* dest, const Acts::GeometryContext& geoContext) const { + dest->resize(m_surfaces.size()); + size_t index = 0; + for ( auto& surface: m_surfaces ) { + encodeSurface(dest, index, surface.get(), geoContext); + index++; + } } void ActsTrk::MutableTrackSummaryContainer::setParticleHypothesis_impl(ActsTrk::IndexType itrack, const Acts::ParticleHypothesis& particleHypothesis) { diff --git a/Tracking/Acts/ActsEvent/test/TrackSummaryContainer_test.cxx b/Tracking/Acts/ActsEvent/test/TrackSummaryContainer_test.cxx index c03d518974db1a511c4e5a8cb09f37407ecd07ff..e30edea60dc8b666d42335f44626ae525e24f290 100644 --- a/Tracking/Acts/ActsEvent/test/TrackSummaryContainer_test.cxx +++ b/Tracking/Acts/ActsEvent/test/TrackSummaryContainer_test.cxx @@ -111,25 +111,6 @@ BOOST_FIXTURE_TEST_CASE(ImmutableAccess, FilledBackend) { } -///////////////////////////////////////////////////////////////////// -// Test of TrackSurfaceContainer in mutable TrackSummaryContainer - -BOOST_FIXTURE_TEST_CASE(MutableSurfaceBackend_test, FilledBackend){ - -//TODO: Here the empty surface is created. Tests of surfase filling are needed - - auto i = m->addSurface_impl(); - BOOST_CHECK_EQUAL(i, 0); - - i = m->addSurface_impl(); - BOOST_CHECK_EQUAL(i, 1); - - m->removeSurface_impl(i); - i = m->addSurface_impl(); - BOOST_CHECK_EQUAL(i, 1); -}; - - template<typename surfType> void testSurface(surfType surf, std::shared_ptr<const Acts::Surface> outSurf, const Acts::GeometryContext& gctx) { BOOST_CHECK_EQUAL(int(surf->type()), int(outSurf->type())); @@ -149,14 +130,14 @@ BOOST_AUTO_TEST_CASE(ConstSurfaceBackend_test){ // Create filled xAOD::TrackSummaryContainer constexpr static size_t sz = 6; - xAOD::TrackSummaryContainer backend; - xAOD::TrackSummaryAuxContainer aux; - backend.setStore(&aux); + xAOD::TrackSummaryContainer summaryBackend; + xAOD::TrackSummaryAuxContainer summaryAux; + summaryBackend.setStore(&summaryAux); std::vector<double> semirandoms = {0.12, 0.92}; for (const double sr : semirandoms) { auto par = new xAOD::TrackSummary(); - backend.push_back(par); + summaryBackend.push_back(par); par->resize(); for ( size_t i = 0; i < sz; ++i) { par->paramsEigen()(i) = i * sr; @@ -178,8 +159,8 @@ BOOST_AUTO_TEST_CASE(ConstSurfaceBackend_test){ transform *= Acts::AngleAxis3(rotation[2], Acts::Vector3(1., 0., 0.)); //rotX xAOD::TrackSurfaceContainer surfBackend; - xAOD::TrackSurfaceAuxContainer aux0; - surfBackend.setStore(&aux0); + xAOD::TrackSurfaceAuxContainer surfAux; + surfBackend.setStore(&surfAux); auto surfCurr = new xAOD::TrackSurface(); surfBackend.push_back(surfCurr); @@ -191,11 +172,9 @@ BOOST_AUTO_TEST_CASE(ConstSurfaceBackend_test){ ActsTrk::encodeSurface(surfCurr, surf.get(), gctx); // Create constant ActsTrk::TrackSummaryContainer - std::unique_ptr<ActsTrk::TrackSummaryContainer> ms = std::make_unique<ActsTrk::TrackSummaryContainer>(&backend, &aux0); + std::unique_ptr<ActsTrk::TrackSummaryContainer> ms = std::make_unique<ActsTrk::TrackSummaryContainer>(&summaryBackend); - // Read the ActsTrk::TrackSummaryContainer and check track storage and track surfaces - auto cc = std::make_unique<ActsTrk::TrackSummaryContainer>(ms->trackBackend()); - BOOST_CHECK_EQUAL(cc->size_impl(), 2); + BOOST_CHECK_EQUAL(ms->size_impl(), 2); auto outSurf = ActsTrk::decodeSurface(surfBackend[0], gctx); testSurface(surf, outSurf, gctx); diff --git a/Tracking/Acts/ActsEventCnv/src/TrkToActsConvertorAlg.cxx b/Tracking/Acts/ActsEventCnv/src/TrkToActsConvertorAlg.cxx index cefd4be5c028d72e203e07a30f9789f5babc5746..17b9c8c0900f35e38180d98a59305a280fb16ced 100644 --- a/Tracking/Acts/ActsEventCnv/src/TrkToActsConvertorAlg.cxx +++ b/Tracking/Acts/ActsEventCnv/src/TrkToActsConvertorAlg.cxx @@ -50,7 +50,7 @@ StatusCode ActsTrk::TrkToActsConvertorAlg::execute( ATH_MSG_VERBOSE("TrackStateContainer has " << tc.trackStateContainer().trackStatesAux()->size() << " states"); ATH_MSG_VERBOSE("TrackParametersContainer has " << tc.trackStateContainer().trackParametersAux()->size() << " parameters"); - std::unique_ptr<ActsTrk::TrackContainer> constTrackContainer = m_trackContainerBackendsHelper.moveToConst(std::move(tc), ctx); + std::unique_ptr<ActsTrk::TrackContainer> constTrackContainer = m_trackContainerBackendsHelper.moveToConst(std::move(tc), tgContext, ctx); auto trackContainerHandle = SG::makeHandle(m_trackContainerKey, ctx); ATH_MSG_VERBOSE("Saving " << constTrackContainer->size() << " tracks to "<< trackContainerHandle.key()); ATH_CHECK(trackContainerHandle.record(std::move(constTrackContainer))); diff --git a/Tracking/Acts/ActsMonitoring/src/TrackAnalysisAlg.cxx b/Tracking/Acts/ActsMonitoring/src/TrackAnalysisAlg.cxx index 82c7c1cc171ccc615a385aeb21b4ce7590652398..8496b80e5b69bf15d7d9ffdf78357ca57081e08a 100644 --- a/Tracking/Acts/ActsMonitoring/src/TrackAnalysisAlg.cxx +++ b/Tracking/Acts/ActsMonitoring/src/TrackAnalysisAlg.cxx @@ -52,13 +52,12 @@ namespace ActsTrk { auto monitor_ndof = Monitored::Collection("ndof", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nDoF()); } ); auto monitor_nstates = Monitored::Collection("nStates", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nTrackStates()); } ); auto monitor_nmeas = Monitored::Collection("nMeasurements", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.nMeasurements()); } ); - // TODO this needs to be fixed in the followup MR - // auto monitor_surftype = Monitored::Collection("surfaceType", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.referenceSurface().type()); } ); + auto monitor_surftype = Monitored::Collection("surfaceType", proxies, [](const ConstTrackProxy& tp){ return static_cast<double>(tp.referenceSurface().type()); } ); fill(m_monGroupName.value(), monitor_ntracks, monitor_theta, monitor_phi, monitor_qoverp, monitor_nstates, monitor_phi, monitor_chi2, monitor_chi2OverNdof, - monitor_ndof, monitor_nstates, monitor_nmeas); + monitor_ndof, monitor_nstates, monitor_nmeas, monitor_surftype); return StatusCode::SUCCESS; } diff --git a/Tracking/Acts/ActsTrackReconstruction/src/AmbiguityResolutionAlg.cxx b/Tracking/Acts/ActsTrackReconstruction/src/AmbiguityResolutionAlg.cxx index 7c1aa8019fcdd25e97180b3171b2c7683e471f25..b47bd08f94ffa86811d812d3f3c9be389d2394a4 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/AmbiguityResolutionAlg.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/src/AmbiguityResolutionAlg.cxx @@ -55,6 +55,7 @@ namespace ActsTrk } ATH_CHECK(m_monTool.retrieve(EnableTool{not m_monTool.empty()})); + ATH_CHECK(m_trackingGeometryTool.retrieve()); ATH_CHECK(m_tracksKey.initialize()); ATH_CHECK(m_resolvedTracksKey.initialize()); ATH_CHECK(m_resolvedTracksBackendHandles.initialize(ActsTrk::prefixFromTrackContainerName(m_resolvedTracksKey.key()))); //TODO choose prefix related to the output tracks name @@ -85,7 +86,8 @@ namespace ActsTrk auto destProxy = solvedTracks.getTrack(solvedTracks.addTrack()); destProxy.copyFrom(trackHandle->getTrack(state.trackTips.at(iTrack))); } - std::unique_ptr<ActsTrk::TrackContainer> outputTracks = m_resolvedTracksBackendHandles.moveToConst( std::move(solvedTracks), ctx); + std::unique_ptr<ActsTrk::TrackContainer> outputTracks = m_resolvedTracksBackendHandles.moveToConst(std::move(solvedTracks), + m_trackingGeometryTool->getGeometryContext(ctx).context(), ctx); SG::WriteHandle<ActsTrk::TrackContainer> resolvedTrackHandle(m_resolvedTracksKey, ctx); if (resolvedTrackHandle.record( std::move(outputTracks)).isFailure()) { diff --git a/Tracking/Acts/ActsTrackReconstruction/src/AmbiguityResolutionAlg.h b/Tracking/Acts/ActsTrackReconstruction/src/AmbiguityResolutionAlg.h index d51afa62a622597d206373e44d3ab0f0a9239b3c..15d29545f0d4da2e70d2d5b1a03aa8c2d4cdd401 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/AmbiguityResolutionAlg.h +++ b/Tracking/Acts/ActsTrackReconstruction/src/AmbiguityResolutionAlg.h @@ -22,6 +22,7 @@ #include "InDetReadoutGeometry/SiDetectorElementCollection.h" #include "xAODInDetMeasurement/PixelClusterContainer.h" #include "xAODInDetMeasurement/StripClusterContainer.h" +#include "ActsGeometryInterfaces/IActsTrackingGeometryTool.h" // Handle Keys #include "StoreGate/ReadHandleKey.h" @@ -45,6 +46,7 @@ namespace ActsTrk private: ToolHandle< GenericMonitoringTool > m_monTool {this, "MonTool", "", "Monitoring tool"}; + ToolHandle<IActsTrackingGeometryTool> m_trackingGeometryTool{this, "TrackingGeometryTool", ""}; SG::ReadHandleKey<ActsTrk::TrackContainer> m_tracksKey {this, "TracksLocation", "", "Input track collection"}; diff --git a/Tracking/Acts/ActsTrackReconstruction/src/ProtoTrackCreationAndFitAlg.cxx b/Tracking/Acts/ActsTrackReconstruction/src/ProtoTrackCreationAndFitAlg.cxx index c5b1291e283a2233eea095836001755f03712619..b2ad2921d5d0576c4a0d4414ea0a790c285eead7 100755 --- a/Tracking/Acts/ActsTrackReconstruction/src/ProtoTrackCreationAndFitAlg.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/src/ProtoTrackCreationAndFitAlg.cxx @@ -121,7 +121,8 @@ StatusCode ActsTrk::ProtoTrackCreationAndFitAlg::execute(const EventContext & ct auto destProxy = trackContainer.getTrack(trackContainer.addTrack()); destProxy.copyFrom(trackProxy, true); // make sure we copy track states! } - std::unique_ptr<ActsTrk::TrackContainer> constTracksContainer = m_tracksBackendHandlesHelper.moveToConst(std::move(trackContainer), ctx); + std::unique_ptr<ActsTrk::TrackContainer> constTracksContainer = m_tracksBackendHandlesHelper.moveToConst(std::move(trackContainer), + m_trackingGeometryTool->getGeometryContext(ctx).context(), ctx); ATH_CHECK(trackContainerHandle.record(std::move(constTracksContainer))); diff --git a/Tracking/Acts/ActsTrackReconstruction/src/TrackFindingAlg.cxx b/Tracking/Acts/ActsTrackReconstruction/src/TrackFindingAlg.cxx index 95f29bb6551e9e0a269a04c85bf408f8d20ad4df..e6fdab36fb17ca48f985dfa7c48188c4b074ce18 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/TrackFindingAlg.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/src/TrackFindingAlg.cxx @@ -360,7 +360,8 @@ namespace ActsTrk copyStats(event_stat); - std::unique_ptr<ActsTrk::TrackContainer> constTracksContainer = m_tracksBackendHandlesHelper.moveToConst(std::move(tracksContainer), ctx); + std::unique_ptr<ActsTrk::TrackContainer> constTracksContainer = m_tracksBackendHandlesHelper.moveToConst(std::move(tracksContainer), + m_trackingGeometryTool->getGeometryContext(ctx).context(), ctx); // ================================================== // // ===================== OUTPUTS ==================== // // ================================================== // diff --git a/Tracking/Acts/ActsTrackReconstruction/src/TrackMergerAlg.cxx b/Tracking/Acts/ActsTrackReconstruction/src/TrackMergerAlg.cxx index e0a181b8a2ca38cbc33ca74322bc5647a272e71a..84bfc4e673b40341f897e5ca41a7d3447fdf7def 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/TrackMergerAlg.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/src/TrackMergerAlg.cxx @@ -19,7 +19,8 @@ namespace ActsTrk { ATH_CHECK(m_outputTrackCollection.initialize()); // Create all the backends ATH_CHECK(m_tracksBackendHandlesHelper.initialize(ActsTrk::prefixFromTrackContainerName(m_outputTrackCollection.key()))); - + ATH_CHECK(m_trackingGeometryTool.retrieve()); + return StatusCode::SUCCESS; } @@ -55,7 +56,8 @@ namespace ActsTrk { } ATH_MSG_DEBUG("Created a track container with " << mergedTracks.size() << " elements"); - std::unique_ptr< ActsTrk::TrackContainer > constTracksContainer = m_tracksBackendHandlesHelper.moveToConst(std::move(mergedTracks), ctx); + std::unique_ptr< ActsTrk::TrackContainer > constTracksContainer = m_tracksBackendHandlesHelper.moveToConst(std::move(mergedTracks), + m_trackingGeometryTool->getGeometryContext(ctx).context(), ctx); ATH_CHECK(mergedTracksHandle.record(std::move(constTracksContainer))); return StatusCode::SUCCESS; diff --git a/Tracking/Acts/ActsTrackReconstruction/src/TrackMergerAlg.h b/Tracking/Acts/ActsTrackReconstruction/src/TrackMergerAlg.h index 1ce863759b51707e3b95d5962b7cad285b800a8c..31bf4d69bc02368d22fe8f2594156a6ea7e9c590 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/TrackMergerAlg.h +++ b/Tracking/Acts/ActsTrackReconstruction/src/TrackMergerAlg.h @@ -10,6 +10,7 @@ #include "StoreGate/WriteHandleKey.h" #include "ActsEvent/TrackContainer.h" #include "ActsEvent/TrackContainerHandlesHelper.h" +#include "ActsGeometryInterfaces/IActsTrackingGeometryTool.h" namespace ActsTrk { @@ -28,6 +29,8 @@ namespace ActsTrk { "Input Acts Tracks to be merged"}; SG::WriteHandleKey< ActsTrk::TrackContainer > m_outputTrackCollection {this, "OutputTrackCollection", "", "Output Acts Tracks obtained from the merging of the input collections"}; + ToolHandle<IActsTrackingGeometryTool> m_trackingGeometryTool{this, "TrackingGeometryTool", ""}; + }; }