From c051457ad03fe65e6135d1d7ed98799ab85bf51a Mon Sep 17 00:00:00 2001 From: Paul Gessinger <paul.gessinger@cern.ch> Date: Tue, 3 Dec 2024 17:23:32 +0100 Subject: [PATCH] Acts bump v38.0.0 Additional fixed for https://github.com/acts-project/acts/pull/3605 after https://gitlab.cern.ch/atlas/athena/-/merge_requests/76284 --- Projects/Athena/build_externals.sh | 2 +- .../python/ActsTrackFindingConfig.py | 9 +- .../ActsConfig/share/ActsAmbiguityConfig.json | 4 +- .../share/ActsCheckObjectCounts.ref | 40 +-- .../share/ActsCheckObjectCountsCached.ref | 40 +-- .../share/ActsCheckObjectCountsHgtd.ref | 40 +-- .../Acts/ActsEvent/ActsEvent/Decoration.h | 2 +- .../ActsEvent/ActsEvent/MultiTrajectory.h | 11 +- .../ActsEvent/ActsEvent/MultiTrajectory.icc | 29 +++ .../Acts/ActsEvent/Root/MultiTrajectory.cxx | 8 - .../ActsEvent/Root/TrackSummaryContainer.cxx | 2 +- .../test/MultiTrajectoryACTS_test.cxx | 4 + .../test/MultiTrajectoryBasic_test.cxx | 4 +- .../MeasurementToTrackParticleDecoration.cxx | 57 ++--- .../src/TrackParamsEstimationTool.cxx | 27 +- .../src/TrackParamsEstimationTool.h | 5 +- .../ITrackParamsEstimationTool.h | 3 +- .../ActsTrackReconstruction/CMakeLists.txt | 1 + .../src/GlobalChiSquareFitterTool.cxx | 4 +- .../src/KalmanFitterTool.cxx | 4 +- .../src/ScoreBasedAmbiguityResolutionAlg.cxx | 69 ++++-- .../src/ScoreBasedAmbiguityResolutionAlg.h | 8 +- .../src/ScoreBasedSolverCutsImpl.cxx | 231 ++++++++++++++++++ .../src/ScoreBasedSolverCutsImpl.h | 51 ++++ .../src/detail/FitterHelperFunctions.h | 8 +- .../src/detail/MeasurementCalibratorBase.icc | 6 +- .../src/detail/MeasurementSelector.h | 2 +- .../test/MeasurementCalibratorBaseTest.cxx | 2 +- .../test/TrkMeasurementCalibratorTest.cxx | 2 +- 29 files changed, 500 insertions(+), 175 deletions(-) create mode 100644 Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedSolverCutsImpl.cxx create mode 100644 Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedSolverCutsImpl.h diff --git a/Projects/Athena/build_externals.sh b/Projects/Athena/build_externals.sh index 5072f561d13..5896722a80c 100755 --- a/Projects/Athena/build_externals.sh +++ b/Projects/Athena/build_externals.sh @@ -12,7 +12,7 @@ ATLAS_BUILDTYPE="Release" ATLAS_EXTRA_CMAKE_ARGS=(-DLCG_VERSION_NUMBER=106 -DLCG_VERSION_POSTFIX="a_ATLAS_5" -DATLAS_GAUDI_SOURCE="URL;https://gitlab.cern.ch/atlas/Gaudi/-/archive/v39r1.001/Gaudi-v39r1.001.tar.gz;URL_MD5;ac2bdcde14c2feb7684e34d6e7879db8" - -DATLAS_ACTS_SOURCE="URL;https://github.com/acts-project/acts/archive/refs/tags/v37.4.0.tar.gz;URL_HASH;SHA256=8f5a035a8c62406550df5e645d144200f956a43a073c45cdf743977162593ebc" + -DATLAS_ACTS_SOURCE="URL;https://github.com/acts-project/acts/archive/refs/tags/v38.0.0.tar.gz;URL_HASH;SHA256=3ac1ff893c46fdb054f290704bdbe845b03e2954e12b1e5ace9a65302fb034b4" -DATLAS_GEOMODEL_SOURCE="URL;https://gitlab.cern.ch/GeoModelDev/GeoModel/-/archive/6.6.0/GeoModel-6.6.0.tar.bz2;URL_MD5;66c32047090b20afb75cd5befefce78a" -DATLAS_VECMEM_SOURCE="URL;http://cern.ch/atlas-software-dist-eos/externals/vecmem/v1.5.0.tar.gz;https://github.com/acts-project/vecmem/archive/refs/tags/v1.5.0.tar.gz;URL_MD5;3cc5a3bb14b93f611513535173a6be28" -DATLAS_GEANT4_USE_LTO=TRUE diff --git a/Tracking/Acts/ActsConfig/python/ActsTrackFindingConfig.py b/Tracking/Acts/ActsConfig/python/ActsTrackFindingConfig.py index 48b7a2dbcfb..bf405b3e22d 100644 --- a/Tracking/Acts/ActsConfig/python/ActsTrackFindingConfig.py +++ b/Tracking/Acts/ActsConfig/python/ActsTrackFindingConfig.py @@ -265,9 +265,16 @@ def ActsMainScoreBasedAmbiguityResolutionAlgCfg(flags, kwargs.setdefault('PhiMax', M_PI) kwargs.setdefault('EtaMin', -5.0) kwargs.setdefault('EtaMax', 5.0) - kwargs.setdefault('UseAmbiguityFunction', False) + kwargs.setdefault('UseAmbiguityFunction', True) kwargs.setdefault('jsonFileName', 'ActsAmbiguityConfig.json') + if 'InDetEtaDependentCutsSvc' not in kwargs: + from InDetConfig.InDetEtaDependentCutsConfig import ( + ITkEtaDependentCutsSvcCfg) + acc.merge(ITkEtaDependentCutsSvcCfg(flags)) + kwargs.setdefault("InDetEtaDependentCutsSvc", acc.getService( + "ITkEtaDependentCutsSvc"+flags.Tracking.ActiveConfig.extension)) + if flags.Acts.doMonitoring and 'MonTool' not in kwargs: from ActsConfig.ActsMonitoringConfig import ActsAmbiguityResolutionMonitoringToolCfg kwargs.setdefault('MonTool', acc.popToolsAndMerge( diff --git a/Tracking/Acts/ActsConfig/share/ActsAmbiguityConfig.json b/Tracking/Acts/ActsConfig/share/ActsAmbiguityConfig.json index 80707bcd9f6..bde1720e1fc 100644 --- a/Tracking/Acts/ActsConfig/share/ActsAmbiguityConfig.json +++ b/Tracking/Acts/ActsConfig/share/ActsAmbiguityConfig.json @@ -6,7 +6,7 @@ "outliersScoreWeight": -2, "otherScoreWeight": 0, "minHits": 0, - "maxHits": 24, + "maxHits": 8, "maxHoles": 2, "maxOutliers": 10, "maxSharedHits": 3, @@ -24,7 +24,7 @@ "outliersScoreWeight": -2, "otherScoreWeight": 0, "minHits": 0, - "maxHits": 24, + "maxHits": 8, "maxHoles": 5, "maxOutliers": 10, "maxSharedHits": 3, diff --git a/Tracking/Acts/ActsConfig/share/ActsCheckObjectCounts.ref b/Tracking/Acts/ActsConfig/share/ActsCheckObjectCounts.ref index 391db61e81d..d37f0944353 100644 --- a/Tracking/Acts/ActsConfig/share/ActsCheckObjectCounts.ref +++ b/Tracking/Acts/ActsConfig/share/ActsCheckObjectCounts.ref @@ -37,13 +37,13 @@ ActsTrackFindingAlg INFO statistic |-----------------------------------|------------|------------|------------| | Input seeds | 123542 | 24791 | 148333 | | No track parameters | 0 | 0 | 0 | -| Used seeds | 78109 | 15624 | 93733 | -| Cannot find track | 63304 | 11860 | 75164 | -| Duplicate seeds | 45433 | 9167 | 54600 | -| CKF tracks | 14805 | 3764 | 18569 | +| Used seeds | 78109 | 15627 | 93736 | +| Cannot find track | 63305 | 11860 | 75165 | +| Duplicate seeds | 45433 | 9164 | 54597 | +| CKF tracks | 14804 | 3767 | 18571 | | Rejected refined parameters | 0 | 0 | 0 | -| selected tracks | 13383 | 831 | 14214 | -| Stopped tracks reaching max holes | 60890 | 11366 | 72256 | +| selected tracks | 13383 | 832 | 14215 | +| Stopped tracks reaching max holes | 60891 | 11366 | 72257 | | Seeds with more than one branch | 0 | 0 | 0 | | Tracks failing second CKF | 0 | 0 | 0 | | Stopped tracks below pT cut | 2414 | 494 | 2908 | @@ -53,18 +53,18 @@ ActsTrackFindingAlg INFO Ratios |------------------------------------------|------------|------------|------------| | | PPP | SSS | ALL | |------------------------------------------|------------|------------|------------| -| failed / seeds | 0.512409 | 0.478399 | 0.506725 | -| duplication / seeds | 0.367753 | 0.369771 | 0.368091 | +| failed / seeds | 0.512417 | 0.478399 | 0.506731 | +| duplication / seeds | 0.367753 | 0.36965 | 0.36807 | | Rejected refined params / seeds | 0 | 0 | 0 | -| selected / CKF tracks | 0.903951 | 0.220776 | 0.765469 | -| selected tracks / used seeds | 0.171337 | 0.0531874 | 0.151643 | +| selected / CKF tracks | 0.904012 | 0.220865 | 0.765441 | +| selected tracks / used seeds | 0.171337 | 0.0532412 | 0.151649 | | branched tracks / used seeds | 0 | 0 | 0 | | no 2nd CKF / CKF tracks | 0 | 0 | 0 | |------------------------------------------|------------|------------|------------| | selected / CKF tracks 0.0- 0.5 | 0.890205 | 0.124352 | 0.711259 | -| 0.5- 1.0 | 0.913315 | 0.256262 | 0.739419 | -| 1.0- 1.5 | 0.885971 | 0.216418 | 0.704992 | -| 1.5- 2.0 | 0.79267 | 0.240154 | 0.563561 | +| 0.5- 1.0 | 0.913255 | 0.257692 | 0.739419 | +| 1.0- 1.5 | 0.88605 | 0.216418 | 0.705141 | +| 1.5- 2.0 | 0.793103 | 0.239784 | 0.56338 | | 2.0- 2.5 | 0.94335 | 0.216926 | 0.69915 | | 2.5- 3.0 | 0.882987 | 0 | 0.882987 | | 3.0- 3.5 | 0.942103 | 0 | 0.942103 | @@ -110,25 +110,25 @@ ActsLargeRadiusTrackFindingAlg INFO statistic | Input seeds | 9682 | 9682 | | No track parameters | 0 | 0 | | Used seeds | 9495 | 9495 | -| Cannot find track | 8549 | 8549 | +| Cannot find track | 8548 | 8548 | | Duplicate seeds | 187 | 187 | -| CKF tracks | 946 | 946 | +| CKF tracks | 947 | 947 | | Rejected refined parameters | 0 | 0 | | selected tracks | 113 | 113 | -| Stopped tracks reaching max holes | 6663 | 6663 | +| Stopped tracks reaching max holes | 6661 | 6661 | | Seeds with more than one branch | 0 | 0 | | Tracks failing second CKF | 0 | 0 | -| Stopped tracks below pT cut | 1886 | 1886 | +| Stopped tracks below pT cut | 1887 | 1887 | | Stopped tracks above max eta | 0 | 0 | |-----------------------------------|------------|------------| ActsLargeRadiusTrackFindingAlg INFO Ratios |------------------------------------------|------------|------------| | | SSS | ALL | |------------------------------------------|------------|------------| -| failed / seeds | 0.882979 | 0.882979 | +| failed / seeds | 0.882875 | 0.882875 | | duplication / seeds | 0.0193142 | 0.0193142 | | Rejected refined params / seeds | 0 | 0 | -| selected / CKF tracks | 0.11945 | 0.11945 | +| selected / CKF tracks | 0.119324 | 0.119324 | | selected tracks / used seeds | 0.011901 | 0.011901 | | branched tracks / used seeds | 0 | 0 | | no 2nd CKF / CKF tracks | 0 | 0 | @@ -136,7 +136,7 @@ ActsLargeRadiusTrackFindingAlg INFO Ratios | selected / CKF tracks 0.0- 0.5 | 0.169014 | 0.169014 | | 0.5- 1.0 | 0.214286 | 0.214286 | | 1.0- 1.5 | 0.228261 | 0.228261 | -| 1.5- 2.0 | 0.102941 | 0.102941 | +| 1.5- 2.0 | 0.102689 | 0.102689 | | 2.0- 2.5 | 0.0687285 | 0.0687285 | | 2.5- 3.0 | 0 | 0 | | 3.0- 3.5 | 0 | 0 | diff --git a/Tracking/Acts/ActsConfig/share/ActsCheckObjectCountsCached.ref b/Tracking/Acts/ActsConfig/share/ActsCheckObjectCountsCached.ref index e2663623fc5..6db9e366cfb 100644 --- a/Tracking/Acts/ActsConfig/share/ActsCheckObjectCountsCached.ref +++ b/Tracking/Acts/ActsConfig/share/ActsCheckObjectCountsCached.ref @@ -62,13 +62,13 @@ ActsTrackFindingAlg INFO statistic |-----------------------------------|------------|------------|------------| | Input seeds | 123542 | 24791 | 148333 | | No track parameters | 0 | 0 | 0 | -| Used seeds | 78109 | 15625 | 93734 | -| Cannot find track | 63304 | 11860 | 75164 | -| Duplicate seeds | 45433 | 9166 | 54599 | -| CKF tracks | 14805 | 3765 | 18570 | +| Used seeds | 78109 | 15628 | 93737 | +| Cannot find track | 63305 | 11860 | 75165 | +| Duplicate seeds | 45433 | 9163 | 54596 | +| CKF tracks | 14804 | 3768 | 18572 | | Rejected refined parameters | 0 | 0 | 0 | -| selected tracks | 13383 | 832 | 14215 | -| Stopped tracks reaching max holes | 60890 | 11366 | 72256 | +| selected tracks | 13383 | 833 | 14216 | +| Stopped tracks reaching max holes | 60891 | 11366 | 72257 | | Seeds with more than one branch | 0 | 0 | 0 | | Tracks failing second CKF | 0 | 0 | 0 | | Stopped tracks below pT cut | 2414 | 494 | 2908 | @@ -78,18 +78,18 @@ ActsTrackFindingAlg INFO Ratios |------------------------------------------|------------|------------|------------| | | PPP | SSS | ALL | |------------------------------------------|------------|------------|------------| -| failed / seeds | 0.512409 | 0.478399 | 0.506725 | -| duplication / seeds | 0.367753 | 0.369731 | 0.368084 | +| failed / seeds | 0.512417 | 0.478399 | 0.506731 | +| duplication / seeds | 0.367753 | 0.36961 | 0.368064 | | Rejected refined params / seeds | 0 | 0 | 0 | -| selected / CKF tracks | 0.903951 | 0.220983 | 0.765482 | -| selected tracks / used seeds | 0.171337 | 0.053248 | 0.151653 | +| selected / CKF tracks | 0.904012 | 0.221072 | 0.765453 | +| selected tracks / used seeds | 0.171337 | 0.0533018 | 0.151658 | | branched tracks / used seeds | 0 | 0 | 0 | | no 2nd CKF / CKF tracks | 0 | 0 | 0 | |------------------------------------------|------------|------------|------------| | selected / CKF tracks 0.0- 0.5 | 0.890205 | 0.124352 | 0.711259 | -| 0.5- 1.0 | 0.913315 | 0.256262 | 0.739419 | -| 1.0- 1.5 | 0.885971 | 0.216418 | 0.704992 | -| 1.5- 2.0 | 0.79267 | 0.240154 | 0.563561 | +| 0.5- 1.0 | 0.913255 | 0.257692 | 0.739419 | +| 1.0- 1.5 | 0.88605 | 0.216418 | 0.705141 | +| 1.5- 2.0 | 0.793103 | 0.239784 | 0.56338 | | 2.0- 2.5 | 0.94335 | 0.217687 | 0.699248 | | 2.5- 3.0 | 0.882987 | 0 | 0.882987 | | 3.0- 3.5 | 0.942103 | 0 | 0.942103 | @@ -151,25 +151,25 @@ ActsLargeRadiusTrackFindingAlg INFO statistic | Input seeds | 9682 | 9682 | | No track parameters | 0 | 0 | | Used seeds | 9495 | 9495 | -| Cannot find track | 8549 | 8549 | +| Cannot find track | 8548 | 8548 | | Duplicate seeds | 187 | 187 | -| CKF tracks | 946 | 946 | +| CKF tracks | 947 | 947 | | Rejected refined parameters | 0 | 0 | | selected tracks | 113 | 113 | -| Stopped tracks reaching max holes | 6663 | 6663 | +| Stopped tracks reaching max holes | 6661 | 6661 | | Seeds with more than one branch | 0 | 0 | | Tracks failing second CKF | 0 | 0 | -| Stopped tracks below pT cut | 1886 | 1886 | +| Stopped tracks below pT cut | 1887 | 1887 | | Stopped tracks above max eta | 0 | 0 | |-----------------------------------|------------|------------| ActsLargeRadiusTrackFindingAlg INFO Ratios |------------------------------------------|------------|------------| | | SSS | ALL | |------------------------------------------|------------|------------| -| failed / seeds | 0.882979 | 0.882979 | +| failed / seeds | 0.882875 | 0.882875 | | duplication / seeds | 0.0193142 | 0.0193142 | | Rejected refined params / seeds | 0 | 0 | -| selected / CKF tracks | 0.11945 | 0.11945 | +| selected / CKF tracks | 0.119324 | 0.119324 | | selected tracks / used seeds | 0.011901 | 0.011901 | | branched tracks / used seeds | 0 | 0 | | no 2nd CKF / CKF tracks | 0 | 0 | @@ -177,7 +177,7 @@ ActsLargeRadiusTrackFindingAlg INFO Ratios | selected / CKF tracks 0.0- 0.5 | 0.169014 | 0.169014 | | 0.5- 1.0 | 0.214286 | 0.214286 | | 1.0- 1.5 | 0.228261 | 0.228261 | -| 1.5- 2.0 | 0.102941 | 0.102941 | +| 1.5- 2.0 | 0.102689 | 0.102689 | | 2.0- 2.5 | 0.0687285 | 0.0687285 | | 2.5- 3.0 | 0 | 0 | | 3.0- 3.5 | 0 | 0 | diff --git a/Tracking/Acts/ActsConfig/share/ActsCheckObjectCountsHgtd.ref b/Tracking/Acts/ActsConfig/share/ActsCheckObjectCountsHgtd.ref index 41cb9558aca..8d9bdd91447 100644 --- a/Tracking/Acts/ActsConfig/share/ActsCheckObjectCountsHgtd.ref +++ b/Tracking/Acts/ActsConfig/share/ActsCheckObjectCountsHgtd.ref @@ -42,13 +42,13 @@ ActsTrackFindingAlg INFO statistic |-----------------------------------|------------|------------|------------| | Input seeds | 123542 | 24791 | 148333 | | No track parameters | 0 | 0 | 0 | -| Used seeds | 78100 | 15624 | 93724 | -| Cannot find track | 63275 | 11851 | 75126 | -| Duplicate seeds | 45442 | 9167 | 54609 | -| CKF tracks | 14825 | 3773 | 18598 | +| Used seeds | 78100 | 15627 | 93727 | +| Cannot find track | 63276 | 11851 | 75127 | +| Duplicate seeds | 45442 | 9164 | 54606 | +| CKF tracks | 14824 | 3776 | 18600 | | Rejected refined parameters | 0 | 0 | 0 | -| selected tracks | 13389 | 831 | 14220 | -| Stopped tracks reaching max holes | 60861 | 11356 | 72217 | +| selected tracks | 13389 | 832 | 14221 | +| Stopped tracks reaching max holes | 60862 | 11356 | 72218 | | Seeds with more than one branch | 0 | 0 | 0 | | Tracks failing second CKF | 0 | 0 | 0 | | Stopped tracks below pT cut | 2414 | 495 | 2909 | @@ -58,18 +58,18 @@ ActsTrackFindingAlg INFO Ratios |------------------------------------------|------------|------------|------------| | | PPP | SSS | ALL | |------------------------------------------|------------|------------|------------| -| failed / seeds | 0.512174 | 0.478036 | 0.506469 | -| duplication / seeds | 0.367826 | 0.369771 | 0.368151 | +| failed / seeds | 0.512182 | 0.478036 | 0.506475 | +| duplication / seeds | 0.367826 | 0.36965 | 0.368131 | | Rejected refined params / seeds | 0 | 0 | 0 | -| selected / CKF tracks | 0.903137 | 0.220249 | 0.764598 | -| selected tracks / used seeds | 0.171434 | 0.0531874 | 0.151722 | +| selected / CKF tracks | 0.903198 | 0.220339 | 0.76457 | +| selected tracks / used seeds | 0.171434 | 0.0532412 | 0.151728 | | branched tracks / used seeds | 0 | 0 | 0 | | no 2nd CKF / CKF tracks | 0 | 0 | 0 | |------------------------------------------|------------|------------|------------| | selected / CKF tracks 0.0- 0.5 | 0.890205 | 0.124352 | 0.711259 | -| 0.5- 1.0 | 0.913315 | 0.256262 | 0.739419 | -| 1.0- 1.5 | 0.885971 | 0.216418 | 0.704992 | -| 1.5- 2.0 | 0.79267 | 0.240154 | 0.563561 | +| 0.5- 1.0 | 0.913255 | 0.257692 | 0.739419 | +| 1.0- 1.5 | 0.88605 | 0.216418 | 0.705141 | +| 1.5- 2.0 | 0.793103 | 0.239784 | 0.56338 | | 2.0- 2.5 | 0.94335 | 0.215251 | 0.697326 | | 2.5- 3.0 | 0.882635 | 0 | 0.882282 | | 3.0- 3.5 | 0.936117 | 0 | 0.936117 | @@ -120,25 +120,25 @@ ActsLargeRadiusTrackFindingAlg INFO statistic | Input seeds | 9681 | 9681 | | No track parameters | 0 | 0 | | Used seeds | 9494 | 9494 | -| Cannot find track | 8540 | 8540 | +| Cannot find track | 8539 | 8539 | | Duplicate seeds | 187 | 187 | -| CKF tracks | 954 | 954 | +| CKF tracks | 955 | 955 | | Rejected refined parameters | 0 | 0 | | selected tracks | 113 | 113 | -| Stopped tracks reaching max holes | 6655 | 6655 | +| Stopped tracks reaching max holes | 6653 | 6653 | | Seeds with more than one branch | 0 | 0 | | Tracks failing second CKF | 0 | 0 | -| Stopped tracks below pT cut | 1885 | 1885 | +| Stopped tracks below pT cut | 1886 | 1886 | | Stopped tracks above max eta | 0 | 0 | |-----------------------------------|------------|------------| ActsLargeRadiusTrackFindingAlg INFO Ratios |------------------------------------------|------------|------------| | | SSS | ALL | |------------------------------------------|------------|------------| -| failed / seeds | 0.88214 | 0.88214 | +| failed / seeds | 0.882037 | 0.882037 | | duplication / seeds | 0.0193162 | 0.0193162 | | Rejected refined params / seeds | 0 | 0 | -| selected / CKF tracks | 0.118449 | 0.118449 | +| selected / CKF tracks | 0.118325 | 0.118325 | | selected tracks / used seeds | 0.0119023 | 0.0119023 | | branched tracks / used seeds | 0 | 0 | | no 2nd CKF / CKF tracks | 0 | 0 | @@ -146,7 +146,7 @@ ActsLargeRadiusTrackFindingAlg INFO Ratios | selected / CKF tracks 0.0- 0.5 | 0.169014 | 0.169014 | | 0.5- 1.0 | 0.214286 | 0.214286 | | 1.0- 1.5 | 0.228261 | 0.228261 | -| 1.5- 2.0 | 0.102941 | 0.102941 | +| 1.5- 2.0 | 0.102689 | 0.102689 | | 2.0- 2.5 | 0.0668896 | 0.0668896 | | 2.5- 3.0 | 0 | 0 | | 3.0- 3.5 | 0 | 0 | diff --git a/Tracking/Acts/ActsEvent/ActsEvent/Decoration.h b/Tracking/Acts/ActsEvent/ActsEvent/Decoration.h index 72737cb62b0..c25306ceee3 100644 --- a/Tracking/Acts/ActsEvent/ActsEvent/Decoration.h +++ b/Tracking/Acts/ActsEvent/ActsEvent/Decoration.h @@ -74,7 +74,7 @@ static Decoration decoration(std::string_view n, GetterType g, CopierType c, SetterType s = static_cast<SetterType>(nullptr)) { Decoration dec; dec.name = n; - dec.hash = Acts::hashString(n); + dec.hash = Acts::hashStringDynamic(n); dec.auxid = SG::AuxTypeRegistry::instance().getAuxID<T>(dec.name); if (dec.auxid == SG::null_auxid) throw std::runtime_error("ActsTrk::Decoration Aux ID for " + dec.name + diff --git a/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.h b/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.h index 463e3cdded5..a045237c68a 100644 --- a/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.h +++ b/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.h @@ -306,7 +306,16 @@ class MutableMultiTrajectory final /** * Implementation of allocation of calibrated measurements */ - void allocateCalibrated_impl(ActsTrk::IndexType istate, std::size_t measdim); + template <typename val_t, typename cov_t> + void allocateCalibrated_impl(IndexType istate, + const Eigen::DenseBase<val_t>& val, + const Eigen::DenseBase<cov_t>& cov) + requires(Eigen::PlainObjectBase<val_t>::RowsAtCompileTime > 0 && + Eigen::PlainObjectBase<val_t>::RowsAtCompileTime <= Acts::eBoundSize && + Eigen::PlainObjectBase<val_t>::RowsAtCompileTime == + Eigen::PlainObjectBase<cov_t>::RowsAtCompileTime && + Eigen::PlainObjectBase<cov_t>::RowsAtCompileTime == + Eigen::PlainObjectBase<cov_t>::ColsAtCompileTime); /** * Implementation of calibrated size diff --git a/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.icc b/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.icc index b1afa332876..02b97f11144 100644 --- a/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.icc +++ b/Tracking/Acts/ActsEvent/ActsEvent/MultiTrajectory.icc @@ -121,3 +121,32 @@ void ActsTrk::MutableMultiTrajectory::addColumn_impl(std::string_view name) { throw std::runtime_error("Can't add decoration of this type to MutableMultiTrajectory"); } } + +template <typename val_t, typename cov_t> +void ActsTrk::MutableMultiTrajectory::allocateCalibrated_impl(IndexType istate, + const Eigen::DenseBase<val_t>& val, + const Eigen::DenseBase<cov_t>& cov) + + requires(Eigen::PlainObjectBase<val_t>::RowsAtCompileTime > 0 && + Eigen::PlainObjectBase<val_t>::RowsAtCompileTime <= Acts::eBoundSize && + Eigen::PlainObjectBase<val_t>::RowsAtCompileTime == + Eigen::PlainObjectBase<cov_t>::RowsAtCompileTime && + Eigen::PlainObjectBase<cov_t>::RowsAtCompileTime == + Eigen::PlainObjectBase<cov_t>::ColsAtCompileTime) +{ + constexpr std::size_t measdim = val_t::RowsAtCompileTime; + + m_trackStatesAux->measDim[istate] = measdim; + auto idx = m_trackStatesAux->calibrated[istate]; + m_trackMeasurementsAux->meas[idx].resize(measdim); + m_trackMeasurementsAux->covMatrix[idx].resize(measdim*measdim); + + double* measPtr = m_trackMeasurementsAux->meas[idx].data(); + Eigen::Map<Acts::ActsVector<measdim>> valMap(measPtr); + valMap = val; + + double* covPtr = m_trackMeasurementsAux->covMatrix[idx].data(); + Eigen::Map<Acts::ActsSquareMatrix<measdim>> covMap(covPtr); + covMap = cov; +} + diff --git a/Tracking/Acts/ActsEvent/Root/MultiTrajectory.cxx b/Tracking/Acts/ActsEvent/Root/MultiTrajectory.cxx index 2c94bf5f48d..0c77bd62982 100644 --- a/Tracking/Acts/ActsEvent/Root/MultiTrajectory.cxx +++ b/Tracking/Acts/ActsEvent/Root/MultiTrajectory.cxx @@ -496,14 +496,6 @@ void ActsTrk::MutableMultiTrajectory::clear_impl() { } -void ActsTrk::MutableMultiTrajectory::allocateCalibrated_impl(ActsTrk::IndexType istate, std::size_t measdim) { - m_trackStatesAux->measDim[istate] = measdim; - auto idx = m_trackStatesAux->calibrated[istate]; - m_trackMeasurementsAux->meas[idx].resize(measdim); - m_trackMeasurementsAux->covMatrix[idx].resize(measdim*measdim); -} - - ActsTrk::IndexType ActsTrk::MutableMultiTrajectory::calibratedSize_impl(ActsTrk::IndexType istate) const { // Retrieve the calibrated measurement size // INSPECTCALL(istate << " " << trackMeasurements().size()); diff --git a/Tracking/Acts/ActsEvent/Root/TrackSummaryContainer.cxx b/Tracking/Acts/ActsEvent/Root/TrackSummaryContainer.cxx index 569b565b024..3c8a3e94e21 100644 --- a/Tracking/Acts/ActsEvent/Root/TrackSummaryContainer.cxx +++ b/Tracking/Acts/ActsEvent/Root/TrackSummaryContainer.cxx @@ -18,7 +18,7 @@ using namespace Acts::HashedStringLiteral; const std::set<Acts::HashedString> ActsTrk::TrackSummaryContainer::staticVariableHashes = [](){ std::set<Acts::HashedString> result; for (const auto& s: ActsTrk::TrackSummaryContainer::staticVariables) { - result.insert(Acts::hashString(s)); + result.insert(Acts::hashStringDynamic(s)); } return result; }(); diff --git a/Tracking/Acts/ActsEvent/test/MultiTrajectoryACTS_test.cxx b/Tracking/Acts/ActsEvent/test/MultiTrajectoryACTS_test.cxx index 22741b9245d..c38da6af34c 100644 --- a/Tracking/Acts/ActsEvent/test/MultiTrajectoryACTS_test.cxx +++ b/Tracking/Acts/ActsEvent/test/MultiTrajectoryACTS_test.cxx @@ -180,6 +180,10 @@ BOOST_AUTO_TEST_CASE(MultiTrajectoryExtraColumnsRuntime) { ct.testMultiTrajectoryExtraColumnsRuntime(); } +BOOST_AUTO_TEST_CASE(MultiTrajectoryAllocateCalibratedInit) { + CommonTests ct; + ct.testMultiTrajectoryAllocateCalibratedInit(rng); +} BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file diff --git a/Tracking/Acts/ActsEvent/test/MultiTrajectoryBasic_test.cxx b/Tracking/Acts/ActsEvent/test/MultiTrajectoryBasic_test.cxx index 8a270eb8265..16dc8177b83 100644 --- a/Tracking/Acts/ActsEvent/test/MultiTrajectoryBasic_test.cxx +++ b/Tracking/Acts/ActsEvent/test/MultiTrajectoryBasic_test.cxx @@ -810,9 +810,9 @@ BOOST_FIXTURE_TEST_CASE(TrackStateProjector, EmptyMTJ) { // Set and test subspace Acts::BoundSubspaceIndices subspace = {Acts::eBoundLoc0, Acts::eBoundLoc0, Acts::eBoundPhi, Acts::eBoundTheta, Acts::eBoundQOverP, Acts::eBoundTime}; - ts.setBoundSubspaceIndices(subspace); + ts.setProjectorSubspaceIndices(subspace); - BOOST_CHECK(ts.boundSubspaceIndices() == subspace); + BOOST_CHECK(ts.projectorSubspaceIndices() == subspace); } BOOST_FIXTURE_TEST_CASE(TrackStateProxyStorage, EmptyMTJ) { diff --git a/Tracking/Acts/ActsObjectDecoration/src/MeasurementToTrackParticleDecoration.cxx b/Tracking/Acts/ActsObjectDecoration/src/MeasurementToTrackParticleDecoration.cxx index effd7fc0431..321c28fb835 100644 --- a/Tracking/Acts/ActsObjectDecoration/src/MeasurementToTrackParticleDecoration.cxx +++ b/Tracking/Acts/ActsObjectDecoration/src/MeasurementToTrackParticleDecoration.cxx @@ -11,6 +11,7 @@ #include "xAODInDetMeasurement/StripCluster.h" #include "InDetReadoutGeometry/SiDetectorElementCollection.h" #include "Acts/Surfaces/AnnulusBounds.hpp" +#include "Acts/Utilities/TrackHelpers.hpp" namespace ActsTrk { @@ -281,7 +282,7 @@ namespace ActsTrk { } const auto& [unbiasedParameters, unbiasedCovariance] = - evaluateUnbiased ? getUnbiasedTrackParameters(state,true) : std::make_pair(state.parameters(), state.covariance()); + evaluateUnbiased ? Acts::calculateUnbiasedParametersCovariance(state) : std::make_pair(state.parameters(), state.covariance()); measurementLocX = calibratedParameters[Acts::eBoundLoc0]; measurementLocCovX = calibratedCovariance(Acts::eBoundLoc0, Acts::eBoundLoc0); @@ -367,51 +368,31 @@ namespace ActsTrk { float MeasurementToTrackParticleDecoration::getChi2Contribution(const typename ActsTrk::TrackStateBackend::ConstTrackStateProxy &state) const { auto pred = state.predicted(); - auto H = state.effectiveProjector(); auto predC = state.predictedCovariance(); - const auto calibrated = state.effectiveCalibrated(); - const auto calibratedCov = state.effectiveCalibratedCovariance(); - - auto residual = (H * pred - calibrated).eval(); - auto rescov = (H * predC * H.transpose() + calibratedCov).eval(); + return Acts::visit_measurement( + state.calibratedSize(), + [&]<std::size_t measdim>(std::integral_constant<std::size_t, measdim>) { + Acts::FixedBoundSubspaceHelper<measdim> subspaceHelper = + state.template projectorSubspaceHelper<measdim>(); + + // TODO use subspace helper for projection instead + auto H = subspaceHelper.projector(); - return ((residual.transpose() * rescov.inverse() * residual).eval())(0,0); + const auto calibrated = state.template calibrated<measdim>(); + const auto calibratedCov = state.template calibratedCovariance<measdim>(); - } + auto residual = (H * pred - calibrated).eval(); + auto rescov = (H * predC * H.transpose() + calibratedCov).eval(); - - std::pair<Acts::BoundVector, Acts::BoundMatrix> - MeasurementToTrackParticleDecoration::getUnbiasedTrackParameters(const typename ActsTrk::TrackStateBackend::ConstTrackStateProxy &state, - bool useSmoothed) const { - // calculate the unbiased track parameters (i.e. fitted track - // parameters with this measurement removed) using Eq.(12a)-Eq.(12c) - // of NIMA 262, 444 (1987) - - Acts::BoundVector tp = useSmoothed ? state.smoothed() : state.filtered(); - Acts::BoundMatrix C = useSmoothed ? state.smoothedCovariance() : state.filteredCovariance(); + return ((residual.transpose() * rescov.inverse() * residual).eval())(0,0); + }); - const auto calibratedParameters = state.effectiveCalibrated(); - const auto calibratedCovariance = state.effectiveCalibratedCovariance(); - - ATH_MSG_DEBUG( "--- Getting effectiveCalibrated..."); - auto m = calibratedParameters; - ATH_MSG_DEBUG( "--- Getting effectiveProjector..."); - auto H = state.effectiveProjector(); - ATH_MSG_DEBUG( "--- Getting effectiveCalibratedCovariance..."); - auto V = calibratedCovariance; - - ATH_MSG_DEBUG( "--- Evaluating K... "); - auto K = (C * H.transpose() * - (H * C * H.transpose() - V).inverse()).eval(); - - ATH_MSG_DEBUG( "--- Evaluating unbiased parameters... "); - Acts::BoundVector unbiasedParameters = tp + K * (m - H * tp); - ATH_MSG_DEBUG( "--- Evaluating unbiased covariance... "); - Acts::BoundMatrix unbiasedCovariance = C - K * H * C; - return std::make_pair(unbiasedParameters, unbiasedCovariance); + + } + float MeasurementToTrackParticleDecoration::evaluatePull(const float residual, const float measurementCovariance, const float trackParameterCovariance, diff --git a/Tracking/Acts/ActsPatternRecognition/src/TrackParamsEstimationTool.cxx b/Tracking/Acts/ActsPatternRecognition/src/TrackParamsEstimationTool.cxx index 2db3613518c..535ee88f85d 100644 --- a/Tracking/Acts/ActsPatternRecognition/src/TrackParamsEstimationTool.cxx +++ b/Tracking/Acts/ActsPatternRecognition/src/TrackParamsEstimationTool.cxx @@ -19,7 +19,6 @@ namespace ActsTrk { ATH_MSG_INFO( "Initializing " << name() << "..." ); ATH_MSG_DEBUG( "Properties Summary:" ); - ATH_MSG_DEBUG( " " << m_bFieldMin ); ATH_MSG_DEBUG( " " << m_sigmaLoc0 ); ATH_MSG_DEBUG( " " << m_sigmaLoc1 ); ATH_MSG_DEBUG( " " << m_sigmaPhi ); @@ -58,8 +57,7 @@ namespace ActsTrk { seed, geoContext, surface, - bField, - m_bFieldMin); + bField); } std::optional<Acts::BoundTrackParameters> @@ -67,35 +65,28 @@ namespace ActsTrk { const ActsTrk::Seed& seed, const Acts::GeometryContext& geoContext, const Acts::Surface& surface, - const Acts::Vector3& bField, - double bFieldMin) const + const Acts::Vector3& bField) const { // Get SPs const auto& sp_collection = seed.sp(); if ( sp_collection.size() < 3 ) return std::nullopt; // Compute Bound parameters at surface - std::optional<Acts::BoundVector> params_opt = m_useTopSp ? + auto params_result = m_useTopSp ? Acts::estimateTrackParamsFromSeed(geoContext, - sp_collection.rbegin(), - sp_collection.rend(), + std::ranges::views::reverse(sp_collection), surface, - bField, - bFieldMin, - logger()) : + bField) : Acts::estimateTrackParamsFromSeed(geoContext, - sp_collection.begin(), - sp_collection.end(), + sp_collection, surface, - bField, - bFieldMin, - logger()); + bField); - if ( not params_opt.has_value() ) { + if ( not params_result.ok() ) { return std::nullopt; } - auto& params = params_opt.value(); + auto& params = params_result.value(); if (m_useTopSp) { // reverse direction so momentum vector pointing outwards diff --git a/Tracking/Acts/ActsPatternRecognition/src/TrackParamsEstimationTool.h b/Tracking/Acts/ActsPatternRecognition/src/TrackParamsEstimationTool.h index 7fdb741fe67..2293cbae4ef 100644 --- a/Tracking/Acts/ActsPatternRecognition/src/TrackParamsEstimationTool.h +++ b/Tracking/Acts/ActsPatternRecognition/src/TrackParamsEstimationTool.h @@ -37,16 +37,13 @@ namespace ActsTrk { const ActsTrk::Seed& seed, const Acts::GeometryContext& geoContext, const Acts::Surface& surface, - const Acts::Vector3& bField, - double bFieldMin) const override; + const Acts::Vector3& bField) const override; // ********************************************************************* // ********************************************************************* private: // Properties - Gaudi::Property< double > m_bFieldMin {this, "bFieldMin", 0.1 * Acts::UnitConstants::T, - "The minimum magnetic field to trigger the track parameters estimation"}; Gaudi::Property< double > m_sigmaLoc0 {this, "sigmaLoc0", 1 * Acts::UnitConstants::mm, "Constant term of the loc0 resolution"}; Gaudi::Property< double > m_sigmaLoc1 {this, "sigmaLoc1", 1 * Acts::UnitConstants::mm, diff --git a/Tracking/Acts/ActsToolInterfaces/ActsToolInterfaces/ITrackParamsEstimationTool.h b/Tracking/Acts/ActsToolInterfaces/ActsToolInterfaces/ITrackParamsEstimationTool.h index 7c83e3fc0ca..54445bbc2f5 100644 --- a/Tracking/Acts/ActsToolInterfaces/ActsToolInterfaces/ITrackParamsEstimationTool.h +++ b/Tracking/Acts/ActsToolInterfaces/ActsToolInterfaces/ITrackParamsEstimationTool.h @@ -37,8 +37,7 @@ namespace ActsTrk { const ActsTrk::Seed& seed, const Acts::GeometryContext& geoContext, const Acts::Surface& surface, - const Acts::Vector3& bField, - double bFieldMin) const = 0; + const Acts::Vector3& bField) const = 0; }; } // namespace diff --git a/Tracking/Acts/ActsTrackReconstruction/CMakeLists.txt b/Tracking/Acts/ActsTrackReconstruction/CMakeLists.txt index f304095f245..0288330b531 100644 --- a/Tracking/Acts/ActsTrackReconstruction/CMakeLists.txt +++ b/Tracking/Acts/ActsTrackReconstruction/CMakeLists.txt @@ -33,6 +33,7 @@ atlas_add_component( ActsTrackReconstruction InDetPrepRawData InDetRIO_OnTrack InDetReadoutGeometry + InDetRecToolInterfaces MagFieldConditions MagFieldElements PixelConditionsData diff --git a/Tracking/Acts/ActsTrackReconstruction/src/GlobalChiSquareFitterTool.cxx b/Tracking/Acts/ActsTrackReconstruction/src/GlobalChiSquareFitterTool.cxx index df175743861..d9b7dc7697a 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/GlobalChiSquareFitterTool.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/src/GlobalChiSquareFitterTool.cxx @@ -133,7 +133,7 @@ void PRDSourceLinkCalibratorGX2F::calibrate( } else { subspaceIndices = {Acts::eBoundLoc0}; // x coordinate is l0 } - trackState.setBoundSubspaceIndices(subspaceIndices); + trackState.setProjectorSubspaceIndices(subspaceIndices); } else if (dim == 2) { trackState.template calibrated<2>() = (*rot).localParameters().template head<2>(); @@ -141,7 +141,7 @@ void PRDSourceLinkCalibratorGX2F::calibrate( (*rot).localCovariance().template topLeftCorner<2, 2>(); Acts::BoundSubspaceIndices subspaceIndices = {Acts::eBoundLoc0, Acts::eBoundLoc1}; - trackState.setBoundSubspaceIndices(subspaceIndices); + trackState.setProjectorSubspaceIndices(subspaceIndices); } else { throw std::runtime_error("Dim " + std::to_string(dim) + " currently not supported."); diff --git a/Tracking/Acts/ActsTrackReconstruction/src/KalmanFitterTool.cxx b/Tracking/Acts/ActsTrackReconstruction/src/KalmanFitterTool.cxx index 614610b7c30..1ff1dab6e12 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/KalmanFitterTool.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/src/KalmanFitterTool.cxx @@ -141,14 +141,14 @@ void PRDSourceLinkCalibrator::calibrate(const Acts::GeometryContext& gctx, } else { subspaceIndices = {Acts::eBoundLoc0}; // x coordinate is l0 } - trackState.setBoundSubspaceIndices(subspaceIndices); + trackState.setProjectorSubspaceIndices(subspaceIndices); } else if (dim == 2) { trackState.template calibrated<2>() = (*rot).localParameters().template head<2>(); trackState.template calibratedCovariance<2>() = (*rot).localCovariance().template topLeftCorner<2, 2>(); Acts::BoundSubspaceIndices subspaceIndices = {Acts::eBoundLoc0, Acts::eBoundLoc1}; - trackState.setBoundSubspaceIndices(subspaceIndices); + trackState.setProjectorSubspaceIndices(subspaceIndices); } else { diff --git a/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedAmbiguityResolutionAlg.cxx b/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedAmbiguityResolutionAlg.cxx index a551dca5d2b..a30ac0cbce3 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedAmbiguityResolutionAlg.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedAmbiguityResolutionAlg.cxx @@ -4,24 +4,25 @@ #include "ScoreBasedAmbiguityResolutionAlg.h" +#include "ScoreBasedSolverCutsImpl.h" + // Athena #include "AthenaMonitoringKernel/Monitored.h" #include "PathResolver/PathResolver.h" // ACTS +#include <fstream> +#include <iostream> +#include <vector> + #include "Acts/AmbiguityResolution/ScoreBasedAmbiguityResolution.hpp" #include "Acts/Definitions/Units.hpp" #include "Acts/EventData/VectorMultiTrajectory.hpp" #include "Acts/EventData/VectorTrackContainer.hpp" +#include "Acts/Plugins/Json/AmbiguityConfigJsonConverter.hpp" #include "Acts/Utilities/Logger.hpp" #include "ActsGeometry/ATLASSourceLink.h" #include "ActsInterop/Logger.h" -#include "Acts/Plugins/Json/AmbiguityConfigJsonConverter.hpp" - -#include <fstream> -#include <iostream> -#include <vector> - namespace { std::size_t sourceLinkHash(const Acts::SourceLink &slink) { @@ -42,6 +43,7 @@ bool sourceLinkEquality(const Acts::SourceLink &a, const Acts::SourceLink &b) { return uncalibMeas_a.identifier() == uncalibMeas_b.identifier(); } + } // namespace namespace ActsTrk { @@ -56,7 +58,8 @@ StatusCode ScoreBasedAmbiguityResolutionAlg::initialize() { Acts::ConfigPair configPair; nlohmann::json json_file; - std::string fileName = PathResolver::find_file( "ActsConfig/ActsAmbiguityConfig.json", "DATAPATH" ); + std::string fileName = PathResolver::find_file( + "ActsConfig/ActsAmbiguityConfig.json", "DATAPATH"); std::ifstream file(fileName.c_str()); if (!file.is_open()) { @@ -81,7 +84,7 @@ StatusCode ScoreBasedAmbiguityResolutionAlg::initialize() { cfg.etaMin = m_etaMin; cfg.etaMax = m_etaMax; cfg.useAmbiguityFunction = m_useAmbiguityFunction; - + m_ambi = std::make_unique<Acts::ScoreBasedAmbiguityResolution>( std::move(cfg), makeActsAthenaLogger(this, "Acts")); assert(m_ambi); @@ -107,27 +110,51 @@ StatusCode ScoreBasedAmbiguityResolutionAlg::execute( SG::makeHandle(m_tracksKey, ctx); ATH_CHECK(trackHandle.isValid()); - std::vector<std::vector<Acts::ScoreBasedAmbiguityResolution::MeasurementInfo>> - measurementsPerTracks; - - std::vector<std::vector<Acts::ScoreBasedAmbiguityResolution::TrackFeatures>> - trackFeaturesVectors; - - measurementsPerTracks = m_ambi->computeInitialState(*trackHandle, &sourceLinkHash, - &sourceLinkEquality, trackFeaturesVectors); - + // creates mutable tracks from the input tracks to add summary information + // NOTE: this operation likely needs to moved outside ambiguity resolution + ActsTrk::MutableTrackContainer updatedTracks = + ScoreBasedSolverCutsImpl::addSummaryInformation(*trackHandle); + + // create the optional cuts for the ambiguity resolution + Acts::ScoreBasedAmbiguityResolution::OptionalCuts< + ActsTrk::MutableTrackContainer::ConstTrackProxy> + optionalCuts; + + using TrackProxyType = Acts::TrackProxy<ActsTrk::MutableTrackSummaryContainer, + ActsTrk::MutableMultiTrajectory, + Acts::detail::ValueHolder, true>; + + // Eta based optional cuts is added as a lambda function inorder to access the + // m_etaDependentCutsSvc private variable + optionalCuts.cuts.push_back([this](const TrackProxyType &track) { + // Access m_etaDependentCutsSvc through this + return ScoreBasedSolverCutsImpl::etaDependentCuts( + track, this->m_etaDependentCutsSvc); + }); + + // Add other optional cuts and scores + optionalCuts.cuts.push_back(ScoreBasedSolverCutsImpl::doubleHolesFilter); + optionalCuts.scores.push_back( + ScoreBasedSolverCutsImpl::innermostPixelLayerHitsScore); + optionalCuts.scores.push_back( + ScoreBasedSolverCutsImpl::ContribPixelLayersScore); + optionalCuts.hitSelections.push_back( + ScoreBasedSolverCutsImpl::patternTrackHitSelection); + + // Call the ambiguity resolution algorithm with the optional cuts on the + // updated tracks std::vector<int> goodTracks = m_ambi->solveAmbiguity( - *trackHandle, measurementsPerTracks, trackFeaturesVectors); + updatedTracks, &sourceLinkHash, &sourceLinkEquality, optionalCuts); ATH_MSG_DEBUG("Resolved to " << goodTracks.size() << " tracks from " - << trackHandle->size()); + << updatedTracks.size()); ActsTrk::MutableTrackContainer solvedTracks; - solvedTracks.ensureDynamicColumns(*trackHandle); + solvedTracks.ensureDynamicColumns(updatedTracks); for (auto iTrack : goodTracks) { auto destProxy = solvedTracks.getTrack(solvedTracks.addTrack()); - destProxy.copyFrom(trackHandle->getTrack(iTrack)); + destProxy.copyFrom(updatedTracks.getTrack(iTrack)); } std::unique_ptr<ActsTrk::TrackContainer> outputTracks = m_resolvedTracksBackendHandles.moveToConst( diff --git a/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedAmbiguityResolutionAlg.h b/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedAmbiguityResolutionAlg.h index b890ddd179f..fcc84ca85f6 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedAmbiguityResolutionAlg.h +++ b/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedAmbiguityResolutionAlg.h @@ -24,6 +24,8 @@ #include "InDetReadoutGeometry/SiDetectorElementCollection.h" #include "xAODInDetMeasurement/PixelClusterContainer.h" #include "xAODInDetMeasurement/StripClusterContainer.h" +#include "InDetRecToolInterfaces/IInDetEtaDependentCutsSvc.h" + // Handle Keys #include <memory> @@ -92,7 +94,11 @@ class ScoreBasedAmbiguityResolutionAlg : public AthReentrantAlgorithm { this, "jsonFileName", "ScoreBasedAmbiguity_Config.json", "Name of the JSON file that contains the config file."}; - std::unique_ptr<Acts::ScoreBasedAmbiguityResolution> m_ambi {nullptr}; + std::unique_ptr<Acts::ScoreBasedAmbiguityResolution> m_ambi{nullptr}; + + /** ITk eta-dependent cuts*/ + ServiceHandle<InDet::IInDetEtaDependentCutsSvc> m_etaDependentCutsSvc{ + this, "InDetEtaDependentCutsSvc", ""}; }; } // namespace ActsTrk diff --git a/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedSolverCutsImpl.cxx b/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedSolverCutsImpl.cxx new file mode 100644 index 00000000000..dde8f305c92 --- /dev/null +++ b/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedSolverCutsImpl.cxx @@ -0,0 +1,231 @@ +/* + Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration +*/ + +#include "ScoreBasedSolverCutsImpl.h" + +#include "ScoreBasedAmbiguityResolutionAlg.h" + +// ACTS +#include "Acts/AmbiguityResolution/ScoreBasedAmbiguityResolution.hpp" +#include "Acts/Definitions/Units.hpp" +#include "Acts/EventData/VectorMultiTrajectory.hpp" +#include "Acts/EventData/VectorTrackContainer.hpp" +#include "Acts/Utilities/HashedString.hpp" +#include "Acts/Utilities/Logger.hpp" +#include "ActsEvent/TrackContainer.h" +#include "ActsEvent/TrackSummaryContainer.h" +#include "ActsInterop/Logger.h" + +// Athena +#include "AthenaMonitoringKernel/GenericMonitoringTool.h" +#include "AthenaMonitoringKernel/Monitored.h" + +// Gaudi +#include "GaudiKernel/ServiceHandle.h" +#include "GaudiKernel/ToolHandle.h" +namespace ActsTrk { + +namespace ScoreBasedSolverCutsImpl { +// Add the summary information to the track container for OptionalCuts, This likely needs to be moved outside ambiguity resolution +ActsTrk::MutableTrackContainer addSummaryInformation( + ActsTrk::TrackContainer trackContainer) { + + ActsTrk::MutableTrackContainer updatedTracks; + updatedTracks.ensureDynamicColumns(trackContainer); + + updatedTracks.addColumn<unsigned int>("nInnermostPixelLayerHits"); + updatedTracks.addColumn<unsigned int>("nSCTDoubleHoles"); + updatedTracks.addColumn<unsigned int>("nContribPixelLayers"); + + for (auto track : trackContainer) { + auto iTrack = track.index(); + auto destProxy = updatedTracks.getTrack(updatedTracks.addTrack()); + destProxy.copyFrom(trackContainer.getTrack(iTrack)); + } + + unsigned int pixelVoulmeIds[] = {8, 9, 10, 13, 14, 15, 16, 17, 18, 19, 20}; + + for (auto track : updatedTracks) { + bool doubleFlag = false; + int nDoubleHoles = 0; + int nInnermostPixelLayerHits = 0; + int nContribPixelLayers = 0; + for (const auto &ts : track.trackStatesReversed()) { + if (!ts.hasReferenceSurface()) { + continue; + } + // Check if the volume is the innermost pixel layer + // Compute the number of hits in the innermost pixel layer + auto iVolume = ts.referenceSurface().geometryId().volume(); + if (iVolume == 8) { + nInnermostPixelLayerHits++; + } + if (std::find(std::begin(pixelVoulmeIds), std::end(pixelVoulmeIds), + iVolume) != std::end(pixelVoulmeIds)) { + nContribPixelLayers++; + } + + // Check if the track state has a hole flag + // Compute the number of double holes + auto iTypeFlags = ts.typeFlags(); + if (!iTypeFlags.test(Acts::TrackStateFlag::HoleFlag)) { + doubleFlag = false; + } + if (iTypeFlags.test(Acts::TrackStateFlag::HoleFlag)) { + if (doubleFlag) { + nDoubleHoles++; + doubleFlag = false; + } else { + doubleFlag = true; + } + } + } + track.template component<unsigned int>(Acts::hashString( + "nInnermostPixelLayerHits")) = nInnermostPixelLayerHits; + track.template component<unsigned int>( + Acts::hashString("nSCTDoubleHoles")) = nDoubleHoles; + track.template component<unsigned int>( + Acts::hashString("nContribPixelLayers")) = nContribPixelLayers; + } + + return updatedTracks; +} + +// This optionalCut removes tracks that have a number of SCT double holes greater than 2 +bool doubleHolesFilter(const trackProxy_t &track) { + + int n_doubleHoles = 0; + int max_doubleHoles = 2; + Acts::HashedString hash_nMeasSubDet = + Acts::hashString("nSCTDoubleHoles"); + if (track.container().hasColumn(hash_nMeasSubDet)) { + n_doubleHoles = track.component<unsigned int>(hash_nMeasSubDet); + } else { + return false; + } + if (n_doubleHoles > max_doubleHoles) { + return true; + } + return false; +} + +// This optional score modifies the score based on the number of hits in the innermost pixel layer +void innermostPixelLayerHitsScore(const trackProxy_t &track, double &score) { + int bLayerHits = 0; + const int maxB_LayerHitsITk = 8; + auto maxB_LayerHits = maxB_LayerHitsITk; + const double blayModi[maxB_LayerHitsITk + 1] = {0.25, 4.0, 4.5, 5.0, 5.5, + 6.0, 6.5, 7.0, 7.5}; + + std::vector<double> factorB_LayerHits; + + for (int i = 0; i <= maxB_LayerHits; ++i) + factorB_LayerHits.push_back(blayModi[i]); + Acts::HashedString hash_nMeasSubDet = + Acts::hashString("nInnermostPixelLayerHits"); + if (track.container().hasColumn(hash_nMeasSubDet)) { + bLayerHits = track.component<unsigned int>(hash_nMeasSubDet); + } else { + return; + } + + if (bLayerHits > -1 && maxB_LayerHits > 0) { + if (bLayerHits > maxB_LayerHits) { + score *= (bLayerHits - maxB_LayerHits + 1); // hits are good ! + bLayerHits = maxB_LayerHits; + } + score *= factorB_LayerHits[bLayerHits]; + } +} + +// This optional score modifies the score based on the number of contributing pixel layers +void ContribPixelLayersScore(const trackProxy_t &track, double &score) { + + const int maxPixelLayITk = 16; + auto maxPixLay = maxPixelLayITk; + double maxScore = 30.0; + double minScore = 5.00; + int maxBarrel = 10; + int minBarrel = 3; + int minEnd = 5; + + double step[2] = {(maxScore - minScore) / (maxBarrel - minBarrel), + (maxScore - minScore) / (maxPixelLayITk - minEnd)}; + + std::vector<double> factorPixLay; + for (int i = 0; i <= maxPixelLayITk; i++) { + if (i < minEnd) + factorPixLay.push_back(0.01 + (i * 0.33)); + else + factorPixLay.push_back(minScore + ((i - minEnd) * step[1])); + } + + int iPixLay = 0; + Acts::HashedString hash_nMeasSubDet = + Acts::hashString("nContribPixelLayers"); + if (track.container().hasColumn(hash_nMeasSubDet)) { + iPixLay = track.component<unsigned int>(hash_nMeasSubDet); + } else { + return; + } + + if (iPixLay > -1 && maxPixLay > 0) { + if (iPixLay > maxPixLay) { + score *= (iPixLay - maxPixLay + 1); // layers are good ! + iPixLay = maxPixLay; + } + score *= factorPixLay[iPixLay]; + } +} + +// This optional cut removes tracks based on the eta dependent cuts +// The eta dependent cuts are defined in the InDet::InDetEtaDependentCutsSvc +bool etaDependentCuts(const trackProxy_t &track,ServiceHandle<InDet::IInDetEtaDependentCutsSvc> etaDependentCutsSvc) { + auto trackEta = Acts::VectorHelpers::eta(track.momentum()); + auto parm = track.parameters(); + + double maxEta = etaDependentCutsSvc->getMaxEta(); + if (std::abs(trackEta) > maxEta) { + return true; + } + + double maxZ0 = etaDependentCutsSvc->getMaxZImpactAtEta(trackEta); + if (std::abs(parm[Acts::BoundIndices::eBoundLoc1]) > maxZ0) { + return true; + } + + double maxD0 = etaDependentCutsSvc->getMaxPrimaryImpactAtEta(trackEta); + + if (std::abs(parm[Acts::BoundIndices::eBoundLoc0]) > maxD0) { + return true; + } + + return false; +} + +// This optional cut removes hits from the track based on the pattern track hits +// NOTE: this operation will not be used until the pattern track hits are implemented in ActsTrk +void patternTrackHitSelection( + const trackProxy_t &track, const trackProxy_t::ConstTrackStateProxy &ts, + Acts::ScoreBasedAmbiguityResolution::TrackStateTypes &trackStateType) { + bool ispatternTrack = false; + Acts::HashedString hash_nMeasSubDet = Acts::hashString("ispatternTrack"); + if (track.container().hasColumn(hash_nMeasSubDet)) { + ispatternTrack = track.component<unsigned int>(hash_nMeasSubDet); + } + if (ts.typeFlags().test(Acts::TrackStateFlag::OutlierFlag) && + ispatternTrack) { + trackStateType = + Acts::ScoreBasedAmbiguityResolution::TrackStateTypes::RejectedHit; + } else if (ts.typeFlags().test(Acts::TrackStateFlag::OutlierFlag) && + !ispatternTrack) { + // Copy the hit to the track + trackStateType = + Acts::ScoreBasedAmbiguityResolution::TrackStateTypes::Outlier; + } +} + +} // namespace ScoreBasedSolverCutsImpl + +} // namespace ActsTrk diff --git a/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedSolverCutsImpl.h b/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedSolverCutsImpl.h new file mode 100644 index 00000000000..ff50adb1bc4 --- /dev/null +++ b/Tracking/Acts/ActsTrackReconstruction/src/ScoreBasedSolverCutsImpl.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef ACTSTRKFINDING_SCOREBASEDSOLVERCUTSIMPL_H +#define ACTSTRKFINDING_SCOREBASEDSOLVERCUTSIMPL_H 1 + +#include "Acts/AmbiguityResolution/ScoreBasedAmbiguityResolution.hpp" +#include "Acts/EventData/VectorMultiTrajectory.hpp" +#include "Acts/EventData/VectorTrackContainer.hpp" +#include "ActsEvent/TrackContainer.h" + +// Athena +#include "AthenaMonitoringKernel/GenericMonitoringTool.h" +#include "AthenaMonitoringKernel/Monitored.h" +#include "InDetRecToolInterfaces/IInDetEtaDependentCutsSvc.h" + + +// Gaudi includes +#include "Gaudi/Property.h" +#include "GaudiKernel/ToolHandle.h" +#include "GaudiKernel/SystemOfUnits.h" + +namespace ActsTrk { +namespace ScoreBasedSolverCutsImpl { + +using trackProxy_t = ActsTrk::MutableTrackContainer::ConstTrackProxy; +/** Adds summary information to the track container */ +ActsTrk::MutableTrackContainer addSummaryInformation( + ActsTrk::TrackContainer trackContainer); + +/** Filter for tracks based on double holes */ +bool doubleHolesFilter(const trackProxy_t &track); + +/** Score modifier for tracks based on innermost pixel layer hits */ +void innermostPixelLayerHitsScore(const trackProxy_t &track, double &score); + +/** Score modifier for tracks based on contributing pixel layers */ +void ContribPixelLayersScore(const trackProxy_t &track, double &score); + +/** Filter for tracks based on eta dependent cuts */ +bool etaDependentCuts(const trackProxy_t &track, ServiceHandle<InDet::IInDetEtaDependentCutsSvc> etaDependentCutsSvc); + +/** Hit selection for tracks based on pattern track hits */ +void patternTrackHitSelection( + const trackProxy_t &track, const trackProxy_t::ConstTrackStateProxy &ts, + Acts::ScoreBasedAmbiguityResolution::TrackStateTypes &trackStateType); + +} // namespace ScoreBasedSolverCutsImpl +} // namespace ActsTrk +#endif // ACTSTRKFINDING_SCOREBASEDSOLVERCUTSIMPL_H \ No newline at end of file diff --git a/Tracking/Acts/ActsTrackReconstruction/src/detail/FitterHelperFunctions.h b/Tracking/Acts/ActsTrackReconstruction/src/detail/FitterHelperFunctions.h index 2f138f8b7bd..931c5bca719 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/detail/FitterHelperFunctions.h +++ b/Tracking/Acts/ActsTrackReconstruction/src/detail/FitterHelperFunctions.h @@ -65,6 +65,8 @@ namespace ActsTrk::detail::FitterHelperFunctions { [&] (auto N) -> bool { constexpr size_t kMeasurementSize = decltype(N)::value; + auto subspaceHelper = state.template projectorSubspaceHelper<kMeasurementSize>(); + typename Acts::TrackStateTraits<kMeasurementSize, true>::Calibrated calibrated{ state.template calibrated<Acts::MultiTrajectoryTraits::MeasurementSizeMax>().data()}; @@ -72,10 +74,8 @@ namespace ActsTrk::detail::FitterHelperFunctions { calibratedCovariance{state.template calibratedCovariance<Acts::MultiTrajectoryTraits::MeasurementSizeMax>().data()}; // Take the projector (measurement mapping function) - const auto H = - state.projector() - .template topLeftCorner<kMeasurementSize, Acts::BoundIndices::eBoundSize>() - .eval(); + // TODO use the subspace helper directly + const auto H = subspaceHelper.projector(); const auto residual = calibrated - H * state.predicted(); double chi2 = (residual.transpose() * (calibratedCovariance + H * state.predictedCovariance() * H.transpose()).inverse() * residual).value(); diff --git a/Tracking/Acts/ActsTrackReconstruction/src/detail/MeasurementCalibratorBase.icc b/Tracking/Acts/ActsTrackReconstruction/src/detail/MeasurementCalibratorBase.icc index 0bee6ccc35a..d223c24f62e 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/detail/MeasurementCalibratorBase.icc +++ b/Tracking/Acts/ActsTrackReconstruction/src/detail/MeasurementCalibratorBase.icc @@ -13,15 +13,15 @@ namespace ActsTrk::detail { switch (measType) { case xAOD::UncalibMeasType::StripClusterType: { const std::size_t projector_idx = boundType == Acts::SurfaceBounds::eAnnulus; - trackState.setBoundSubspaceIndices(s_stripSubspaceIndices[projector_idx]); + trackState.setProjectorSubspaceIndices(s_stripSubspaceIndices[projector_idx]); break; } case xAOD::UncalibMeasType::PixelClusterType: { - trackState.setBoundSubspaceIndices(s_pixelSubspaceIndices); + trackState.setProjectorSubspaceIndices(s_pixelSubspaceIndices); break; } case xAOD::UncalibMeasType::HGTDClusterType: { - trackState.setBoundSubspaceIndices(s_hgtdSubspaceIndices); + trackState.setProjectorSubspaceIndices(s_hgtdSubspaceIndices); break; } default: diff --git a/Tracking/Acts/ActsTrackReconstruction/src/detail/MeasurementSelector.h b/Tracking/Acts/ActsTrackReconstruction/src/detail/MeasurementSelector.h index e532d349dbc..bad6e8a1ee4 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/detail/MeasurementSelector.h +++ b/Tracking/Acts/ActsTrackReconstruction/src/detail/MeasurementSelector.h @@ -388,7 +388,7 @@ protected: trackState.setReferenceSurface(boundParams.referenceSurface().getSharedPtr()); - trackState.setBoundSubspaceIndices(subspaceIndices); + trackState.setProjectorSubspaceIndices(subspaceIndices); Acts::TrackStateType typeFlags = trackState.typeFlags(); if (trackState.referenceSurface().surfaceMaterial() != nullptr) { diff --git a/Tracking/Acts/ActsTrackReconstruction/test/MeasurementCalibratorBaseTest.cxx b/Tracking/Acts/ActsTrackReconstruction/test/MeasurementCalibratorBaseTest.cxx index f9720540650..6638338431c 100644 --- a/Tracking/Acts/ActsTrackReconstruction/test/MeasurementCalibratorBaseTest.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/test/MeasurementCalibratorBaseTest.cxx @@ -33,7 +33,7 @@ void checkList(const typename Acts::MultiTrajectory<trajectory_t>::TrackStatePro assert( trackState.effectiveCalibratedCovariance().size() == expectedLocCov.size() ); assert( trackState.effectiveCalibratedCovariance() == expectedLocCov.template cast<double>() ); std::cout << "- checking BoundSubspaceIndices" << std::endl; - assert( trackState.boundSubspaceIndices() == expectedBoundSpaceIndices ); + assert( trackState.projectorSubspaceIndices() == expectedBoundSpaceIndices ); } diff --git a/Tracking/Acts/ActsTrackReconstruction/test/TrkMeasurementCalibratorTest.cxx b/Tracking/Acts/ActsTrackReconstruction/test/TrkMeasurementCalibratorTest.cxx index f238240104d..61c22a13875 100644 --- a/Tracking/Acts/ActsTrackReconstruction/test/TrkMeasurementCalibratorTest.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/test/TrkMeasurementCalibratorTest.cxx @@ -196,5 +196,5 @@ int main() { assert( trackStateBackend.getTrackState(0).effectiveCalibratedCovariance().size() == 4 ); std::cout << "- checking BoundSubspaceIndices" << std::endl; Acts::BoundSubspaceIndices expectedBoundSpaceIndices{ Acts::eBoundLoc0, Acts::eBoundLoc1 }; - assert( trackStateBackend.getTrackState(0).boundSubspaceIndices() == expectedBoundSpaceIndices ); + assert( trackStateBackend.getTrackState(0).projectorSubspaceIndices() == expectedBoundSpaceIndices ); } -- GitLab