diff --git a/Projects/Athena/build_externals.sh b/Projects/Athena/build_externals.sh index 5072f561d131a972689a9b6f145479e2830b5c10..5896722a80c9f7f7c42bf9c18f80d12bd588f3bf 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 48b7a2dbcfb85e27e4bc99b42d4dac0ff36fc70d..bf405b3e22d3699e9694c0d62555854b9f0156d4 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 80707bcd9f6447da5cce368504e0748398f11d65..bde1720e1fcb2914ee627f884aaee540dae280c4 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 391db61e81da7793d3254d4d18723eca059dc221..d37f0944353b3d35f14d20946c6d040175e8831e 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 e2663623fc5dd5ed7f746d6b7c73724a2a224c5f..6db9e366cfb0c0a6bf88c5c2639ef4fc71f77212 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 41cb9558acaaf250e649bd73f9a94cbbe7173f72..8d9bdd9144760e2f230c19497dace9dc9f3f3e6a 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 72737cb62b08ded1cb9fcfc6a1b449c30d334d1d..c25306ceee3cefc0b3d628158bccb5417aec5aa1 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 463e3cdded56a31182f1fa313e09fd0b4dbf96dc..a045237c68abb9b99d858562df43db6029c91ae9 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 b1afa3328767809ba385ca717038ec8b2717fd33..02b97f11144da714b536322700e13e66922d6018 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 2c94bf5f48dc8f83dfb9196b1f4107d200c07c6a..0c77bd629821f4d03bdd823c319733d5f9ccfb45 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 569b565b0249db92d7a55eb118b2a64004aac0fb..3c8a3e94e2163a4b982e6695f3abc7bb7947c934 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 22741b9245d6436a807a39956c6c3db5d40bd4c1..c38da6af34c5f00b6b40ab25b4100a1139daf28a 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 8a270eb8265593938d80963827b9afc2de66598b..16dc8177b83878b5f4b7687d25ad53b203af9e72 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 effd7fc0431e870173a430d82a28fc56cd32c7b7..321c28fb835381bad5397cbe59a101dc5f6b9e51 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 2db3613518c5282251962d216e9f186952da53cf..535ee88f85d248d58d6ceab5d5628f5fb1a37391 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 7fdb741fe676ff1ff767d0be194ad502a3dd40fa..2293cbae4ef6a99d7b5520985ddf6738014e86e1 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 7c83e3fc0ca935fdfc57b89f575c6cc09be482aa..54445bbc2f5a08c177dc83c33c88787384b451b6 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 f304095f245daead3301e923bb9a4bf80d2c4779..0288330b53170a4aa5a66763100d9569c798a700 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 df17574386143e9056b22a8b4c62c2b9676fbaba..d9b7dc7697a15a47c3e6d60ff53351f23f48ce3c 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 614610b7c30c884fe457e70c4e0b1b1b2dfe4755..1ff1dab6e12b561783c0094319e547045e450aa0 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 a551dca5d2b2840971c70137aada8c287ed5b8cd..a30ac0cbce38fdba8930df6433b12bbbdabf8bca 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 b890ddd179f54caffa8b887aad8834695446a88f..fcc84ca85f633945033c0fd38aed228d81b2b27b 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 0000000000000000000000000000000000000000..dde8f305c920f5eaff9d510026fa43251080a301 --- /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 0000000000000000000000000000000000000000..ff50adb1bc44b599d99752e2ad0e96723e1267b9 --- /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 2f138f8b7bd419d0811f46ae58d2b66e96ae3826..931c5bca719dfd0cf97e130b02b52721ac0d1a84 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 0bee6ccc35accf93e46c87c8e37513a2c1833057..d223c24f62e9682af1f7f4d93762e478bdd963b8 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 e532d349dbc40a21fa9e52d32c5525bcafbde6f8..bad6e8a1ee42f5b950261e8d08184b4653358b98 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 f972054065044334a8771be67438709248a4b101..6638338431cbea77c4ff54f60846dfb6089cbab2 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 f238240104d055ef4458d551a5be9fc0c03186d0..61c22a13875639208b0992efef4ef595fd6ca6e6 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 ); }