diff --git a/Projects/Athena/build_externals.sh b/Projects/Athena/build_externals.sh index 1bd43041d3af1fbb7576c40fe4f4e40e56c4584f..14f5056228d433558b9243578b738a18528933b0 100755 --- a/Projects/Athena/build_externals.sh +++ b/Projects/Athena/build_externals.sh @@ -12,7 +12,7 @@ ATLAS_BUILDTYPE="RelWithDebInfo" ATLAS_EXTRA_CMAKE_ARGS=(-DLCG_VERSION_NUMBER=104 -DLCG_VERSION_POSTFIX="d_ATLAS_13" -DATLAS_GAUDI_SOURCE="URL;https://gitlab.cern.ch/atlas/Gaudi/-/archive/v38r0.001/Gaudi-v38r0.001.tar.gz;URL_MD5;36f071bb81c0a85331c047107f829537" - -DATLAS_ACTS_SOURCE="URL;https://github.com/acts-project/acts/archive/refs/tags/v33.0.0.tar.gz;URL_HASH;SHA256=7fa226e59890d0693311fba3119fd4806458850c8741dc7970d50e0cfabb5889" + -DATLAS_ACTS_SOURCE="URL;https://github.com/acts-project/acts/archive/refs/tags/v34.0.0.tar.gz;URL_HASH;SHA256=e1d861920603894040c00a21c2b8fcfcbf89d2c55fd02cd6d750dbccefc58d69" -DATLAS_GEOMODEL_SOURCE="URL;https://gitlab.cern.ch/GeoModelDev/GeoModel/-/archive/5.4.0/GeoModel-5.4.0.tar.bz2;URL_MD5;c06fe74de34e6f89e527d83b366f7e03" -DATLAS_GEOMODEL_PATCH="" -DATLAS_GEOMODEL_FORCEDOWNLOAD_MESSAGE="Forcing_the_re-download_of_GeoModel_(2024.01.27.)") diff --git a/Tracking/Acts/ActsConfig/share/ActsCheckObjectCounts.ref b/Tracking/Acts/ActsConfig/share/ActsCheckObjectCounts.ref index 4c63ff950cbf4037cd5dea14b8bc2ff7cace3e8d..2803f8d54808e7b3f5723ef26ec53def3d652d34 100644 --- a/Tracking/Acts/ActsConfig/share/ActsCheckObjectCounts.ref +++ b/Tracking/Acts/ActsConfig/share/ActsCheckObjectCounts.ref @@ -16,31 +16,31 @@ ActsTrackFindingAlg INFO statistic |-----------------------------------|------------|------------|------------| | Input seeds | 123544 | 24791 | 148335 | | No track parameters | 0 | 0 | 0 | -| Used seeds | 70454 | 14842 | 85296 | +| Used seeds | 70454 | 14841 | 85295 | | Cannot find track | 7643 | 28 | 7671 | -| Duplicate seeds | 53090 | 9949 | 63039 | -| CKF tracks | 62435 | 12281 | 74716 | +| Duplicate seeds | 53090 | 9950 | 63040 | +| CKF tracks | 62435 | 12280 | 74715 | | Rejected refined parameters | 376 | 2533 | 2909 | | selected tracks | 14672 | 1405 | 16077 | | Stopped tracks reaching max holes | 7643 | 28 | 7671 | | Seeds with more than one branch | 0 | 0 | 0 | -| Tracks failing second CKF | 50377 | 456 | 50833 | +| Tracks failing second CKF | 50376 | 456 | 50832 | |-----------------------------------|------------|------------|------------| ActsTrackFindingAlg INFO Ratios |------------------------------------------|------------|------------|------------| | | PPP | SSS | ALL | |------------------------------------------|------------|------------|------------| | failed / seeds | 0.0618646 | 0.00112944 | 0.051714 | -| duplication / seeds | 0.429725 | 0.401315 | 0.424977 | +| duplication / seeds | 0.429725 | 0.401355 | 0.424984 | | Rejected refined params / seeds | 0.00304345 | 0.102174 | 0.019611 | -| selected / CKF tracks | 0.234996 | 0.114404 | 0.215175 | -| selected tracks / used seeds | 0.208249 | 0.0946638 | 0.188485 | +| selected / CKF tracks | 0.234996 | 0.114414 | 0.215178 | +| selected tracks / used seeds | 0.208249 | 0.0946702 | 0.188487 | | branched tracks / used seeds | 0 | 0 | 0 | -| no 2nd CKF / CKF tracks | 0.806871 | 0.0371305 | 0.68035 | +| no 2nd CKF / CKF tracks | 0.806855 | 0.0371336 | 0.680345 | |------------------------------------------|------------|------------|------------| | selected / CKF tracks 0.0- 0.5 | 0.241226 | 0.0175953 | 0.187123 | | 0.5- 1.0 | 0.187037 | 0.0497954 | 0.162152 | -| 1.0- 1.5 | 0.0962974 | 0.0598802 | 0.0934014 | +| 1.0- 1.5 | 0.0962974 | 0.0599315 | 0.0934077 | | 1.5- 2.0 | 0.118186 | 0.0905505 | 0.110949 | | 2.0- 2.5 | 0.250079 | 0.27071 | 0.254663 | | 2.5- 3.0 | 0.395963 | 1 | 0.396057 | diff --git a/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.h b/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.h index 4d7ecff76047ae5814b9e056137ce36557ddfa25..a2466ef11d8caef26ad9435aa0de8ae94688b91c 100644 --- a/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.h +++ b/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.h @@ -103,6 +103,15 @@ class MutableMultiTrajectory final ActsTrk::IndexType addTrackState_impl(Acts::TrackStatePropMask mask, ActsTrk::IndexType iprevious); + /** + * @brief Add state components for the given mask + * + * @param istate - state index + * @param mask - bitmask deciding which backends are extended + */ + void addTrackStateComponents_impl(ActsTrk::IndexType istate, + Acts::TrackStatePropMask mask); + /** * @brief Access component by key * diff --git a/Tracking/Acts/ActsEvent/Root/MultiTrajectory.cxx b/Tracking/Acts/ActsEvent/Root/MultiTrajectory.cxx index eb6cd37c279621c75762d81fa3b1cdcd8cc976c2..eb974ed6882ddcb8e1924cfcd530083709102b2c 100644 --- a/Tracking/Acts/ActsEvent/Root/MultiTrajectory.cxx +++ b/Tracking/Acts/ActsEvent/Root/MultiTrajectory.cxx @@ -150,6 +150,71 @@ ActsTrk::IndexType ActsTrk::MutableMultiTrajectory::addTrackState_impl( } +void ActsTrk::MutableMultiTrajectory::addTrackStateComponents_impl( + ActsTrk::IndexType istate, + Acts::TrackStatePropMask mask) { + using namespace Acts::HashedStringLiteral; + INSPECTCALL( this << " " << mask << " " << m_trackStatesAux->size() << " " << previous); + assert(m_trackStatesAux && "Missing Track States backend"); + constexpr size_t NDim = 6; // TODO take this from somewhere + + // set kInvalid + using Acts::MultiTrajectoryTraits::kInvalid; + + using namespace Acts; + + auto addParam = [this]() -> ActsTrk::IndexType { + stepResize(m_trackParametersAux.get(), m_trackParametersSize, 60); + // TODO ask AK if this resize could be method of aux container + m_trackParametersAux->params[m_trackParametersSize].resize(NDim); + m_trackParametersAux->covMatrix[m_trackParametersSize].resize(NDim*NDim); + m_trackParametersSize++; + return m_trackParametersSize-1; + }; + + auto addJacobian = [this]() -> ActsTrk::IndexType { + stepResize(m_trackJacobiansAux.get(), m_trackJacobiansSize); + m_trackJacobiansAux->jac[m_trackJacobiansSize].resize(NDim*NDim); + m_trackJacobiansSize++; + return m_trackJacobiansSize-1; + }; + + auto addMeasurement = [this]() -> ActsTrk::IndexType { + stepResize(m_trackMeasurementsAux.get(), m_trackMeasurementsSize ); + m_trackMeasurementsAux->meas[m_trackMeasurementsSize].resize(NDim); + m_trackMeasurementsAux->covMatrix[m_trackMeasurementsSize].resize(NDim*NDim); + m_trackMeasurementsSize++; + return m_trackMeasurementsSize-1; + }; + + if ((m_trackStatesAux->predicted[istate] == kInvalid) && + ACTS_CHECK_BIT(mask, TrackStatePropMask::Predicted)) { + m_trackStatesAux->predicted[istate] = addParam(); + } + + if ((m_trackStatesAux->filtered[istate] == kInvalid) && + ACTS_CHECK_BIT(mask, TrackStatePropMask::Filtered)) { + m_trackStatesAux->filtered[istate] = addParam(); + } + + if ((m_trackStatesAux->smoothed[istate] == kInvalid) && + ACTS_CHECK_BIT(mask, TrackStatePropMask::Smoothed)) { + m_trackStatesAux->smoothed[istate] = addParam(); + } + + if ((m_trackStatesAux->jacobian[istate] == kInvalid) && + ACTS_CHECK_BIT(mask, TrackStatePropMask::Jacobian)) { + m_trackStatesAux->jacobian[istate] = addJacobian(); + } + + if ((m_trackStatesAux->calibrated[istate] == kInvalid) && + ACTS_CHECK_BIT(mask, TrackStatePropMask::Calibrated)) { + m_trackStatesAux->calibrated[istate] = addMeasurement(); + m_calibratedSourceLinks.emplace_back(std::nullopt); + m_trackStatesAux->measDim[istate] = m_trackMeasurementsAux->meas[m_trackStatesAux->calibrated[istate]].size(); + } +} + void ActsTrk::MutableMultiTrajectory::shareFrom_impl( ActsTrk::IndexType iself, diff --git a/Tracking/Acts/ActsEvent/test/MultiTrajectoryBasic_test.cxx b/Tracking/Acts/ActsEvent/test/MultiTrajectoryBasic_test.cxx index 6f215f5401d96c5bb88bde44e897c73b3bd23ee3..a4fdefc05b492a9f809e1fd5a816dd434dae8ac7 100644 --- a/Tracking/Acts/ActsEvent/test/MultiTrajectoryBasic_test.cxx +++ b/Tracking/Acts/ActsEvent/test/MultiTrajectoryBasic_test.cxx @@ -11,6 +11,7 @@ #include "Acts/EventData/MultiTrajectory.hpp" #include "Acts/EventData/SourceLink.hpp" #include "Acts/EventData/TrackParameters.hpp" +#include "Acts/Surfaces/PlaneSurface.hpp" #include "Acts/Utilities/Helpers.hpp" #include "ActsEvent/MultiTrajectory.h" #include "CommonHelpers/GenerateParameters.hpp" diff --git a/Tracking/Acts/ActsEventCnv/src/ActsToTrkConverterTool.cxx b/Tracking/Acts/ActsEventCnv/src/ActsToTrkConverterTool.cxx index fca3bc3a6949a66d1674a890d8c905244aefbd9e..dd3c8315b674893ba1fdf534b16539e0a026a6ed 100644 --- a/Tracking/Acts/ActsEventCnv/src/ActsToTrkConverterTool.cxx +++ b/Tracking/Acts/ActsEventCnv/src/ActsToTrkConverterTool.cxx @@ -28,8 +28,7 @@ #include "Acts/Definitions/Units.hpp" #include "Acts/EventData/TrackParameters.hpp" #include "Acts/EventData/VectorTrackContainer.hpp" -#include "Acts/EventData/detail/TransformationBoundToFree.hpp" -#include "Acts/EventData/detail/TransformationFreeToBound.hpp" +#include "Acts/EventData/TransformationHelpers.hpp" #include "Acts/Geometry/TrackingGeometry.hpp" #include "Acts/Propagator/detail/JacobianEngine.hpp" #include "Acts/Surfaces/PerigeeSurface.hpp" @@ -290,16 +289,14 @@ ActsTrk::ActsToTrkConverterTool::actsTrackParametersToTrkParameters( auto helperSurface = Acts::Surface::makeShared<Acts::PlaneSurface>( planeSurface->transform()); - auto boundToFreeJacobian = - actsSurface.boundToFreeJacobian(gctx, actsParameter.parameters()); - auto covpc = actsParameter.covariance().value(); + Acts::FreeVector freePars = - Acts::detail::transformBoundToFreeParameters( + Acts::transformBoundToFreeParameters( actsSurface, gctx, actsParameter.parameters()); Acts::BoundVector targetPars = - Acts::detail::transformFreeToBoundParameters(freePars, + Acts::transformFreeToBoundParameters(freePars, *helperSurface, gctx) .value(); @@ -308,6 +305,10 @@ ActsTrk::ActsToTrkConverterTool::actsTrackParametersToTrkParameters( Acts::FreeVector freeToPathDerivatives = Acts::FreeVector::Zero(); freeToPathDerivatives.head<3>() = freePars.segment<3>(Acts::eFreeDir0); + auto boundToFreeJacobian = actsSurface.boundToFreeJacobian( + gctx, freePars.segment<3>(Acts::eFreePos0), + freePars.segment<3>(Acts::eFreeDir0)); + Acts::BoundMatrix boundToBoundJac = Acts::detail::boundToBoundTransportJacobian( gctx, freePars, boundToFreeJacobian, freeTransportJacobian, freeToPathDerivatives, *helperSurface); @@ -536,7 +537,6 @@ void ActsTrk::ActsToTrkConverterTool::actsTrackParameterPositionCheck( static void ActsTrk::ActsMeasurementCheck( const Acts::GeometryContext &gctx, const Trk::MeasurementBase &measurement, const Acts::Surface &surface, const Acts::BoundVector &loc) { - const Trk::Surface &surf = measurement.associatedSurface(); // only check Annulus for the moment if (surf.bounds().type() != Trk::SurfaceBounds::Annulus) { @@ -570,7 +570,11 @@ static void ActsTrk::ActsMeasurementCheck( locxypar[3] = M_PI_2; locxypar[4] = 1; locxypar[5] = 1; - auto boundToFree = planeSurface->boundToFreeJacobian(gctx, locxypar); + Acts::FreeVector globalxypar = Acts::transformBoundToFreeParameters( + *planeSurface, gctx, locxypar); + auto boundToFree = planeSurface->boundToFreeJacobian( + gctx, globalxypar.segment<3>(Acts::eFreePos0), + globalxypar.segment<3>(Acts::eFreeDir0)); Acts::ActsSquareMatrix<2> xyToXyzJac = boundToFree.topLeftCorner<2, 2>(); Acts::BoundVector locpcpar; @@ -579,8 +583,12 @@ static void ActsTrk::ActsMeasurementCheck( locpcpar[3] = M_PI_2; locpcpar[4] = 1; locpcpar[5] = 1; - - boundToFree = surface.boundToFreeJacobian(gctx, locpcpar); + Acts::FreeVector globalpcpar = Acts::transformBoundToFreeParameters( + surface, gctx, locpcpar); + + boundToFree = surface.boundToFreeJacobian( + gctx, globalpcpar.segment<3>(Acts::eFreePos0), + globalpcpar.segment<3>(Acts::eFreeDir0)); Acts::ActsSquareMatrix<2> pcToXyzJac = boundToFree.topLeftCorner<2, 2>(); Acts::ActsSquareMatrix<2> xyzToPcJac = pcToXyzJac.inverse(); diff --git a/Tracking/Acts/ActsEventCnv/src/ActsToTrkConvertorAlg.cxx b/Tracking/Acts/ActsEventCnv/src/ActsToTrkConvertorAlg.cxx index e98f4cd037fc8236179188fb09e6bfb2c821c828..fd281d9056e6acb8b1d171d320af2ba7634e3414 100644 --- a/Tracking/Acts/ActsEventCnv/src/ActsToTrkConvertorAlg.cxx +++ b/Tracking/Acts/ActsEventCnv/src/ActsToTrkConvertorAlg.cxx @@ -98,7 +98,7 @@ namespace ActsTrk std::vector<std::unique_ptr<const Acts::BoundTrackParameters>> actsSmoothedParam; tracks.trackStateContainer().visitBackwards( lastMeasurementIndex, - [this, &tgContext, &finalTrajectory, &actsSmoothedParam, &numberOfDeadPixel, &numberOfDeadSCT, &hypothesis](const typename ActsTrk::TrackStateBackend::ConstTrackStateProxy &state) -> void + [this, &tgContext, &track, &finalTrajectory, &actsSmoothedParam, &numberOfDeadPixel, &numberOfDeadSCT, &hypothesis](const typename ActsTrk::TrackStateBackend::ConstTrackStateProxy &state) -> void { // First only consider states with an associated detector element if (!state.hasReferenceSurface() || !state.referenceSurface().associatedDetectorElement()) @@ -113,10 +113,7 @@ namespace ActsTrk // State is a hole (no associated measurement), use predicted parameters if (flag.test(Acts::TrackStateFlag::HoleFlag)) { - const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(), - state.predicted(), - state.predictedCovariance(), - hypothesis); + const Acts::BoundTrackParameters actsParam = track.createParametersFromState(state); parm = m_ATLASConverterTool->actsTrackParametersToTrkParameters(actsParam, tgContext); auto boundaryCheck = m_boundaryCheckTool->boundaryCheck(*parm); @@ -148,20 +145,14 @@ namespace ActsTrk // The state was tagged as an outlier or (TODO!) was missed in the reverse filtering, use filtered parameters else if (flag.test(Acts::TrackStateFlag::OutlierFlag)) { - const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(), - state.filtered(), - state.filteredCovariance(), - hypothesis); + const Acts::BoundTrackParameters actsParam = track.createParametersFromState(state); parm = m_ATLASConverterTool->actsTrackParametersToTrkParameters(actsParam, tgContext); typePattern.set(Trk::TrackStateOnSurface::Outlier); } // The state is a measurement state, use smoothed parameters else { - const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(), - state.smoothed(), - state.smoothedCovariance(), - hypothesis); + const Acts::BoundTrackParameters actsParam = track.createParametersFromState(state); // is it really necessary to keep our own copy of all the smoothed parameters? actsSmoothedParam.push_back(std::make_unique<const Acts::BoundTrackParameters>(Acts::BoundTrackParameters(actsParam))); diff --git a/Tracking/Acts/ActsGeometry/ActsGeometry/ActsCaloTrackingVolumeBuilder.h b/Tracking/Acts/ActsGeometry/ActsGeometry/ActsCaloTrackingVolumeBuilder.h index 19855c0aabbd8edd054b005798bef9f5b7f18b74..ec1387c1d54bedcdef41f7388eb18f845f24b509 100644 --- a/Tracking/Acts/ActsGeometry/ActsGeometry/ActsCaloTrackingVolumeBuilder.h +++ b/Tracking/Acts/ActsGeometry/ActsGeometry/ActsCaloTrackingVolumeBuilder.h @@ -17,7 +17,6 @@ // ACTS #include "Acts/Geometry/Volume.hpp" -#include "Acts/Geometry/AbstractVolume.hpp" #include "Acts/Geometry/GeometryContext.hpp" class CaloDetDescrManager; @@ -45,16 +44,16 @@ public: private: - Acts::AbstractVolume + Acts::Volume build_endcap(double z, double dz, double eta, double deta, double phi, double dphi) const; - Acts::AbstractVolume + Acts::Volume build_barrel(double r, double dr, double eta, double deta, double phi, double dphi) const; - Acts::AbstractVolume + Acts::Volume build_box(double x, double dx, double y, double dy, double z, double dz) const; - std::vector<std::unique_ptr<Acts::AbstractVolume>> + std::vector<std::unique_ptr<Acts::Volume>> cellFactory() const; std::shared_ptr<Acts::CutoutCylinderVolumeBounds> diff --git a/Tracking/Acts/ActsGeometry/src/ActsCaloTrackingVolumeBuilder.cxx b/Tracking/Acts/ActsGeometry/src/ActsCaloTrackingVolumeBuilder.cxx index 08cf404755fab3b3713945b4fd4f2c22b42d4c73..a06c40f0aedee293031cd666d6c888523af4b94f 100644 --- a/Tracking/Acts/ActsGeometry/src/ActsCaloTrackingVolumeBuilder.cxx +++ b/Tracking/Acts/ActsGeometry/src/ActsCaloTrackingVolumeBuilder.cxx @@ -61,7 +61,7 @@ ActsCaloTrackingVolumeBuilder::trackingVolume( // generate the calo cell volume description - std::vector<std::unique_ptr<Acts::AbstractVolume>> cells; + std::vector<std::unique_ptr<Acts::Volume>> cells; cells = cellFactory(); ATH_MSG_VERBOSE("Collected " << cells.size() << " calo cells"); @@ -86,8 +86,8 @@ ActsCaloTrackingVolumeBuilder::trackingVolume( // build a BVH octree for the bounding boxes // but only AFTER we've built the calo volume bounds - Box* top; - top = Acts::make_octree(boxStore, prims, 1, 0.1); + // Box* top; + // top = Acts::make_octree(boxStore, prims, 1, 0.1); // Create Tracking Volume that coutains the Calo // This needs to own the Abstract Volumes (cells), but we @@ -101,14 +101,17 @@ ActsCaloTrackingVolumeBuilder::trackingVolume( cellVols.push_back(std::move(up)); } - std::shared_ptr<Acts::TrackingVolume> calo - = Acts::TrackingVolume::create(Acts::Transform3::Identity(), - caloVolBounds, - std::move(boxStore), - std::move(cellVols), - top, - nullptr, // no material for now - "Calo"); + // This was removed in https://github.com/acts-project/acts/pull/3029 + // To be reimplemented using new geometry model instead of explicit TrackingVolume content + throw std::runtime_error{"Calo building for ACTS currently disabled"}; + std::shared_ptr<Acts::TrackingVolume> calo; + // = Acts::TrackingVolume::create(Acts::Transform3::Identity(), + // caloVolBounds, + // std::move(boxStore), + // std::move(cellVols), + // top, + // nullptr, // no material for now + // "Calo"); // We need to interglue all the volumes together std::shared_ptr<Acts::TrackingVolume> mutInsideVolume @@ -278,10 +281,10 @@ ActsCaloTrackingVolumeBuilder::trackingVolume( caloRMin, caloRMax, (caloDZ1 - caloDZ2) / 2.); // they share the same bounds and tvol array - auto posContainer = Acts::TrackingVolume::create(posTrf, posNegCylBounds, tVolArrPosNeg); + auto posContainer = std::make_shared<Acts::TrackingVolume>(posTrf, posNegCylBounds, tVolArrPosNeg); ATH_MSG_VERBOSE("Built positive container " << *posContainer); ATH_MSG_VERBOSE(" - containing: " << calo->volumeName()); - auto negContainer = Acts::TrackingVolume::create(negTrf, posNegCylBounds, tVolArrPosNeg); + auto negContainer = std::make_shared<Acts::TrackingVolume>(negTrf, posNegCylBounds, tVolArrPosNeg); ATH_MSG_VERBOSE("Built negative container " << *negContainer); ATH_MSG_VERBOSE(" - containing: " << calo->volumeName()); @@ -303,7 +306,7 @@ ActsCaloTrackingVolumeBuilder::trackingVolume( tVolOrderedCtr, std::move(binUtilityCtr)); - auto ctrContainer = Acts::TrackingVolume::create(Acts::Transform3::Identity(), + auto ctrContainer = std::make_shared<Acts::TrackingVolume>(Acts::Transform3::Identity(), std::make_shared<Acts::CylinderVolumeBounds>( caloRMin, caloRMax, caloDZ2), tVolArrCtr); @@ -314,7 +317,7 @@ ActsCaloTrackingVolumeBuilder::trackingVolume( // and now combine those together into another one Acts::TrackingVolumeArrayCreator tvac{Acts::TrackingVolumeArrayCreator::Config{}}; - auto mainContainer = Acts::TrackingVolume::create(Acts::Transform3::Identity(), + auto mainContainer = std::make_shared<Acts::TrackingVolume>(Acts::Transform3::Identity(), std::make_shared<Acts::CylinderVolumeBounds>( caloRMin, caloRMax, caloDZ1), tvac.trackingVolumeArray(gctx, {negContainer, ctrContainer, posContainer}, @@ -487,7 +490,7 @@ namespace { } } -Acts::AbstractVolume +Acts::Volume ActsCaloTrackingVolumeBuilder::build_endcap(double z, double dz, double eta, @@ -551,13 +554,13 @@ ActsCaloTrackingVolumeBuilder::build_endcap(double z, auto cubo = std::make_shared<Acts::GenericCuboidVolumeBounds>( std::array<Acts::Vector3, 8>({{p1, p2, p3, p4, p5, p6, p7, p8}})); - Acts::AbstractVolume vol(globalToLocal, std::move(cubo)); + Acts::Volume vol(globalToLocal, std::move(cubo)); return vol; } -Acts::AbstractVolume +Acts::Volume ActsCaloTrackingVolumeBuilder::build_barrel(double r, double dr, double eta, @@ -623,12 +626,12 @@ ActsCaloTrackingVolumeBuilder::build_barrel(double r, auto cubo = std::make_shared<Acts::GenericCuboidVolumeBounds>( std::array<Acts::Vector3, 8>({{p1, p2, p3, p4, p5, p6, p7, p8}})); - Acts::AbstractVolume vol(globalToLocal, std::move(cubo)); + Acts::Volume vol(globalToLocal, std::move(cubo)); return vol; } -Acts::AbstractVolume +Acts::Volume ActsCaloTrackingVolumeBuilder::build_box(double x, double dx, double y, double dy, double z, double dz) const { // std::cout << "build box" << std::endl; @@ -670,12 +673,12 @@ ActsCaloTrackingVolumeBuilder::build_box(double x, double dx, double y, double d auto cubo = std::make_shared<Acts::GenericCuboidVolumeBounds>( std::array<Acts::Vector3, 8>({{p1, p2, p3, p4, p5, p6, p7, p8}})); - Acts::AbstractVolume vol(globalToLocal, std::move(cubo)); + Acts::Volume vol(globalToLocal, std::move(cubo)); return vol; } -std::vector<std::unique_ptr<Acts::AbstractVolume>> +std::vector<std::unique_ptr<Acts::Volume>> ActsCaloTrackingVolumeBuilder::cellFactory() const { //Acts::ply_helper<double> ply_lar; @@ -688,7 +691,7 @@ ActsCaloTrackingVolumeBuilder::cellFactory() const float scale; // storage of cells we will produce - std::vector<std::unique_ptr<Acts::AbstractVolume>> cells; + std::vector<std::unique_ptr<Acts::Volume>> cells; cells.reserve(m_caloMgr->element_size()); // about 180k for(auto it = m_caloMgr->element_begin();it < m_caloMgr->element_end();++it) { @@ -735,7 +738,7 @@ ActsCaloTrackingVolumeBuilder::cellFactory() const case 11: case 17: dz *= scale; - cells.push_back(std::make_unique<Acts::AbstractVolume>( + cells.push_back(std::make_unique<Acts::Volume>( build_endcap(z, dz, eta_raw, deta, phi_raw, dphi))); break; case 0: @@ -751,7 +754,7 @@ ActsCaloTrackingVolumeBuilder::cellFactory() const case 19: case 20: dr *= scale; - cells.push_back(std::make_unique<Acts::AbstractVolume>( + cells.push_back(std::make_unique<Acts::Volume>( build_barrel(r, dr, eta_raw, deta, phi_raw, dphi))); break; case 21: @@ -761,7 +764,7 @@ ActsCaloTrackingVolumeBuilder::cellFactory() const dx *= scale; dy *= scale; // dz *= scale; - cells.push_back(std::make_unique<Acts::AbstractVolume>( + cells.push_back(std::make_unique<Acts::Volume>( build_box(x, dx, y, dy, z, dz))); break; default: diff --git a/Tracking/Acts/ActsGeometry/test/ActsExtrapolationAlgTest.py b/Tracking/Acts/ActsGeometry/test/ActsExtrapolationAlgTest.py index ae6ace6aff76658cf11d665f725be02c74f492f7..00934a0add86c9c0349c84a27036902d0fff6d97 100755 --- a/Tracking/Acts/ActsGeometry/test/ActsExtrapolationAlgTest.py +++ b/Tracking/Acts/ActsGeometry/test/ActsExtrapolationAlgTest.py @@ -21,7 +21,7 @@ if "__main__" == __name__: flags.Detector.GeometryID = True flags.Detector.GeometryPixel = True flags.Detector.GeometrySCT = True - flags.Detector.GeometryCalo = True + flags.Detector.GeometryCalo = False flags.Detector.GeometryMuon = False flags.Detector.GeometryTRT = True flags.Acts.TrackingGeometry.MaterialSource = "None" @@ -54,9 +54,10 @@ if "__main__" == __name__: # Service will have removed TRT and Calo # We want them enabled for testing + # Temporarily disabling Calo though tgSvc.BuildSubDetectors += [ - "TRT", - "Calo" + "TRT" + #"Calo" ] # needed to construct the calo geometry in ACTS diff --git a/Tracking/Acts/ActsTrackReconstruction/src/CurvilinearCovarianceHelper.h b/Tracking/Acts/ActsTrackReconstruction/src/CurvilinearCovarianceHelper.h index 1625179ca08baaafad0ae9641d9a15e9e6206941..31bcabef45bfbd84515f0829390e0e0e9522ff64 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/CurvilinearCovarianceHelper.h +++ b/Tracking/Acts/ActsTrackReconstruction/src/CurvilinearCovarianceHelper.h @@ -63,12 +63,13 @@ namespace ActsTrk { const Acts::ParticleHypothesis &particle_hypothesis) { if (param.covariance().has_value()) { - - Acts::Vector3 direction(param.direction()); - Acts::BoundMatrix b2c; + Acts::FreeVector freeParams = Acts::transformBoundToFreeParameters( + param.referenceSurface(), tgContext, param.parameters()); + Acts::Vector3 position = freeParams.segment<3>(Acts::eFreePos0); + Acts::Vector3 direction = freeParams.segment<3>(Acts::eFreeDir0); + Acts::BoundMatrix b2c; Acts::detail::boundToCurvilinearTransportJacobian(direction, // magnFieldVect.normalized(), - param.referenceSurface().boundToFreeJacobian(tgContext, - param.parameters()), + param.referenceSurface().boundToFreeJacobian(tgContext, position, direction), Acts::FreeMatrix::Identity(), computeFreeToPathDerivatives(direction, param.parameters()[Acts::eBoundQOverP], diff --git a/Tracking/Acts/ActsTrackReconstruction/src/TrackFindingAlg.cxx b/Tracking/Acts/ActsTrackReconstruction/src/TrackFindingAlg.cxx index 638189d5022620a75e0d0e59f7769951e5133694..0a4717af2aa0291826a6652b477a68cb9a420d97 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/TrackFindingAlg.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/src/TrackFindingAlg.cxx @@ -27,6 +27,7 @@ #include "Acts/TrackFinding/MeasurementSelector.hpp" #include "Acts/TrackFinding/CombinatorialKalmanFilter.hpp" #include "Acts/Surfaces/PerigeeSurface.hpp" +#include "Acts/Utilities/TrackHelpers.hpp" // ACTS glue #include "ActsEvent/TrackContainer.h" @@ -142,6 +143,9 @@ namespace ActsTrk Navigator navigator(cfg, logger().cloneWithSuffix("Navigator")); Propagator propagator(std::move(stepper), std::move(navigator), logger().cloneWithSuffix("Prop")); + // Using the CKF propagator as extrapolator + Extrapolator extrapolator = propagator; + std::vector<double> etaBins; // m_etaBins (from flags.Tracking.ActiveConfig.etaBins) includes a dummy first and last bin, which we ignore if (m_etaBins.size() > 2) @@ -154,6 +158,7 @@ namespace ActsTrk measurementSelectorCuts.numMeasurementsCutOff = m_numMeasurementsCutOff; Acts::MeasurementSelector::Config measurementSelectorCfg{{Acts::GeometryIdentifier(), std::move(measurementSelectorCuts)}}; + Acts::MeasurementSelector measurementSelector(measurementSelectorCfg); std::vector<double> absEtaEdges; absEtaEdges.reserve(etaBins.size() + 2); @@ -202,7 +207,7 @@ namespace ActsTrk ATH_MSG_INFO(trackSelectorCfg); - m_trackFinder.reset(new CKF_pimpl{CKF_config{{std::move(propagator), logger().cloneWithSuffix("CKF")}, measurementSelectorCfg, {}, {}, {}, trackSelectorCfg}}); + m_trackFinder.reset(new CKF_pimpl{CKF_config{std::move(extrapolator), {std::move(propagator), logger().cloneWithSuffix("CKF")}, measurementSelector, {}, {}, {}, trackSelectorCfg}}); trackFinder().pOptions.maxSteps = m_maxPropagationStep; trackFinder().pSecondOptions.maxSteps = m_maxPropagationStep; @@ -210,7 +215,6 @@ namespace ActsTrk trackFinder().pSecondOptions.direction = trackFinder().pOptions.direction.invert(); trackFinder().ckfExtensions.updater.connect<&gainMatrixUpdate>(); - trackFinder().ckfExtensions.smoother.connect<&gainMatrixSmoother>(); trackFinder().ckfExtensions.measurementSelector.connect<&Acts::MeasurementSelector::select<ActsTrk::MutableTrackStateBackend>>(&trackFinder().measurementSelector); initStatTables(); @@ -464,11 +468,8 @@ namespace ActsTrk trackFinder().ckfExtensions, trackFinder().pOptions, &(*pSurface)); - options.smoothing = true; std::optional<TrackFinderOptions> secondOptions; if (m_doTwoWay) { - options.smoothingTargetSurfaceStrategy = Acts::CombinatorialKalmanFilterTargetSurfaceStrategy::first; - secondOptions.emplace(tgContext, mfContext, calContext, @@ -476,9 +477,7 @@ namespace ActsTrk trackFinder().ckfExtensions, trackFinder().pSecondOptions, &(*pSurface)); - secondOptions->filterTargetSurface = pSurface.get(); - secondOptions->smoothing = true; - secondOptions->smoothingTargetSurfaceStrategy = Acts::CombinatorialKalmanFilterTargetSurfaceStrategy::last; + secondOptions->targetSurface = pSurface.get(); } ActsTrk::MutableTrackContainer tracksContainerTemp; @@ -503,6 +502,13 @@ namespace ActsTrk if (m_doTwoWay) secondOptions->extensions.branchStopper.connect<&CkfBranchStopper::stopBranch>(&ckfBranchStopper); + Acts::PropagatorOptions<Acts::ActionList<Acts::MaterialInteractor>, + Acts::AbortList<Acts::EndOfWorldReached>> + extrapolationOptions(tgContext, mfContext); + + Acts::TrackExtrapolationStrategy extrapolationStrategy = + Acts::TrackExtrapolationStrategy::firstOrLast; + // Perform the track finding for all initial parameters ATH_MSG_DEBUG("Invoke track finding with " << estimatedTrackParameters.size() << ' ' << seedType << " seeds."); @@ -628,6 +634,14 @@ namespace ActsTrk for (auto &firstTrack : tracksForSeed) { std::size_t nsecond = 0; + auto smoothingResult = Acts::smoothTrack(tgContext, firstTrack, logger()); + if (!smoothingResult.ok()) { + ATH_MSG_DEBUG("Smoothing for seed " + << iseed << " and first track " << firstTrack.index() + << " failed with error " << smoothingResult.error()); + continue; + } + if (m_doTwoWay) { std::optional<ActsTrk::MutableMultiTrajectory::TrackStateProxy> firstState; for (auto st : firstTrack.trackStatesReversed()) { @@ -668,7 +682,25 @@ namespace ActsTrk Acts::calculateTrackQuantities(secondTrack); + auto extrapolationResult = Acts::extrapolateTrackToReferenceSurface( + secondTrack, *pSurface, trackFinder().extrapolator, extrapolationOptions, + extrapolationStrategy, logger()); + if (!extrapolationResult.ok()) { + ATH_MSG_WARNING("Extrapolation for seed " + << iseed << " and second track " << secondTrack.index() + << " failed with error " << extrapolationResult.error()); + + // restore first track + (*firstFirstState).previous() = Acts::kTrackIndexInvalid; + + continue; + } + addTrack(secondTrack); + + // restore first track + (*firstFirstState).previous() = Acts::kTrackIndexInvalid; + ++nsecond; } } @@ -679,6 +711,17 @@ namespace ActsTrk ATH_MSG_DEBUG("No viable result from second track finding for " << seedType << " seed " << iseed << " track " << nfirst); ++event_stat[category_i][kNoSecond]; } + + auto extrapolationResult = Acts::extrapolateTrackToReferenceSurface( + firstTrack, *pSurface, trackFinder().extrapolator, extrapolationOptions, + extrapolationStrategy, logger()); + if (!extrapolationResult.ok()) { + ATH_MSG_WARNING("Extrapolation for seed " + << iseed << " and first " << firstTrack.index() + << " failed with error " << extrapolationResult.error()); + continue; + } + addTrack(firstTrack); } nfirst++; diff --git a/Tracking/Acts/ActsTrackReconstruction/src/TrackFindingData.h b/Tracking/Acts/ActsTrackReconstruction/src/TrackFindingData.h index 1da3ebd429e128a05640161d8072f3b9eec7f305..e492ffe719cf796b1a2e7c9aceb477a9f82e9c50 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/TrackFindingData.h +++ b/Tracking/Acts/ActsTrackReconstruction/src/TrackFindingData.h @@ -51,16 +51,6 @@ namespace return updater.template operator()<ActsTrk::MutableTrackStateBackend>(gctx, trackState, direction, logger); } - static Acts::Result<void> - gainMatrixSmoother(const Acts::GeometryContext &gctx, - ActsTrk::MutableTrackStateBackend &trajectory, - size_t entryIndex, - const Acts::Logger &logger) - { - Acts::GainMatrixSmoother smoother; - return smoother.template operator()<ActsTrk::MutableTrackStateBackend>(gctx, trajectory, entryIndex, logger); - } - // Helper class to describe ranges of measurements // the range provides the measurement collection index and element index range (begin, end) struct MeasurementRange : public std::pair<unsigned int, unsigned int> @@ -217,6 +207,7 @@ namespace using Stepper = Acts::EigenStepper<>; using Navigator = Acts::Navigator; using Propagator = Acts::Propagator<Stepper, Navigator>; + using Extrapolator = Propagator; using CKF = Acts::CombinatorialKalmanFilter<Propagator, ActsTrk::MutableTrackStateBackend>; // Small holder class to keep CKF and related objects. @@ -225,6 +216,8 @@ namespace // ActsTrk::TrackFindingAlg::CKF_pimpl inherits from CKF_config to prevent -Wsubobject-linkage warning. struct CKF_config { + // Extrapolator + Extrapolator extrapolator; // CKF algorithm CKF ckf; // CKF configuration diff --git a/Tracking/Acts/ActsTrackReconstruction/src/TrackStatePrinter.cxx b/Tracking/Acts/ActsTrackReconstruction/src/TrackStatePrinter.cxx index 2462b1315c95845516d732ff98a28f2080ad8daa..ca87b50747aa74d2dd0f96ccd738a216878b22c6 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/TrackStatePrinter.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/src/TrackStatePrinter.cxx @@ -16,7 +16,7 @@ #include "Acts/Surfaces/AnnulusBounds.hpp" #include "Acts/Surfaces/SurfaceBounds.hpp" #include "Acts/Surfaces/DiscSurface.hpp" -#include "Acts/EventData/detail/TransformationBoundToFree.hpp" +#include "Acts/EventData/TransformationHelpers.hpp" #include "ActsEvent/TrackContainer.h" @@ -396,7 +396,7 @@ namespace ActsTrk static void printParameters(const Acts::Surface &surface, const Acts::GeometryContext &tgContext, const Acts::BoundVector &bound) { - auto p = Acts::detail::transformBoundToFreeParameters(surface, tgContext, bound); + auto p = Acts::transformBoundToFreeParameters(surface, tgContext, bound); std::cout << std::fixed << std::setw(10) << std::setprecision(4) << bound[Acts::eBoundLoc0] << ' ' << std::setw(10) << std::setprecision(4) << bound[Acts::eBoundLoc1] << ' ' diff --git a/Tracking/Acts/ActsTrackReconstruction/src/TrackToTrackParticleCnvAlg.cxx b/Tracking/Acts/ActsTrackReconstruction/src/TrackToTrackParticleCnvAlg.cxx index b76837d65af7d6a4298c1514e9f5c38e53048b9b..1ec188aa0c2522b60c758d28507e089d676ad64e 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/TrackToTrackParticleCnvAlg.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/src/TrackToTrackParticleCnvAlg.cxx @@ -417,12 +417,7 @@ namespace ActsTrk // for(ActsTrk::TrackStateBackend::ConstTrackStateProxy::IndexType idx : tmp_param_state_idx) { ActsTrk::TrackStateBackend::ConstTrackStateProxy state = tracksContainer->trackStateContainer().getTrackState(*idx_iter); - auto flag = state.typeFlags(); - const Acts::BoundTrackParameters - actsParam(state.referenceSurface().getSharedPtr(), - !flag.test(Acts::TrackStateFlag::OutlierFlag) ? state.smoothed() : state.filtered(), - !flag.test(Acts::TrackStateFlag::OutlierFlag) ? state.smoothedCovariance() : state.filteredCovariance(), - hypothesis); + const Acts::BoundTrackParameters actsParam = track.createParametersFromState(state); Acts::Vector3 position = actsParam.position(gctx.context()); Acts::Vector3 momentum = actsParam.momentum(); @@ -506,10 +501,7 @@ namespace ActsTrk Acts::BoundTrackParameters TrackToTrackParticleCnvAlg::parametersAtBeamLine(const EventContext &ctx, const typename ActsTrk::TrackContainer::ConstTrackProxy &track, const Acts::PerigeeSurface &perigee_surface) const { - Acts::BoundTrackParameters trackParam(track.referenceSurface().getSharedPtr(), - track.parameters(), - track.covariance(), - track.particleHypothesis()); + Acts::BoundTrackParameters trackParam = track.createParametersAtReference(); std::optional<const Acts::BoundTrackParameters> perigeeParam = m_extrapolationTool->propagate(ctx,