diff --git a/Tracking/Acts/ActsConfig/python/ActsTrkSeedingConfig.py b/Tracking/Acts/ActsConfig/python/ActsTrkSeedingConfig.py index 95ca32850e5045b736a3161f0b895effcf7f5773..cde2149ac8982e34ddf3ba82d704b3e375a5d8dd 100644 --- a/Tracking/Acts/ActsConfig/python/ActsTrkSeedingConfig.py +++ b/Tracking/Acts/ActsConfig/python/ActsTrkSeedingConfig.py @@ -19,6 +19,19 @@ def ActsTrkITkPixelSeedingToolCfg(flags, acc.setPrivateTools(CompFactory.ActsTrk.SeedingTool(name = "ActsSeedingTool_ITkPixel", **kwargs)) return acc +def ActsTrkITkFastPixelSeedingToolCfg(flags, + **kwargs) -> ComponentAccumulator: + acc = ComponentAccumulator() + ## For ITkPixel + kwargs.setdefault("numSeedIncrement" , float("inf")) + kwargs.setdefault("deltaZMax" , float("inf")) + kwargs.setdefault("maxPtScattering", float("inf")) + + ## Additional cuts for fast seed configuration + + acc.setPrivateTools(CompFactory.ActsTrk.SeedingTool(name = "ActsFastSeedingTool_ITkPixel", **kwargs)) + return acc + def ActsTrkITkStripSeedingToolCfg(flags, **kwargs) -> ComponentAccumulator: acc = ComponentAccumulator() @@ -134,7 +147,11 @@ def ActsTrkSiSpacePointsSeedMakerCfg(flags, if flags.Acts.SeedingStrategy is SeedingStrategy.Orthogonal: seedTool_pixel = acc.popToolsAndMerge(ActsTrkITkPixelOrthogonalSeedingToolCfg(flags)) else: - seedTool_pixel = acc.popToolsAndMerge(ActsTrkITkPixelSeedingToolCfg(flags)) + if flags.Tracking.doITkFastTracking: + kwargs.setdefault("useFastTracking", True) + seedTool_pixel = acc.popToolsAndMerge(ActsTrkITkFastPixelSeedingToolCfg(flags)) + else: + seedTool_pixel = acc.popToolsAndMerge(ActsTrkITkPixelSeedingToolCfg(flags)) seedTool_strip = None if 'SeedToolStrip' not in kwargs: @@ -178,7 +195,11 @@ def ActsTrkITkPixelSeedingCfg(flags, if flags.Acts.SeedingStrategy is SeedingStrategy.Orthogonal: seedTool = acc.popToolsAndMerge(ActsTrkITkPixelOrthogonalSeedingToolCfg(flags)) else: - seedTool = acc.popToolsAndMerge(ActsTrkITkPixelSeedingToolCfg(flags)) + if flags.Tracking.doITkFastTracking: + kwargs.setdefault("useFastTracking", True) + seedTool = acc.popToolsAndMerge(ActsTrkITkFastPixelSeedingToolCfg(flags)) + else: + seedTool = acc.popToolsAndMerge(ActsTrkITkPixelSeedingToolCfg(flags)) kwargs.setdefault('InputSpacePoints', ['ITkPixelSpacePoints']) kwargs.setdefault('OutputSeeds', 'ITkPixelSeeds') @@ -187,7 +208,6 @@ def ActsTrkITkPixelSeedingCfg(flags, kwargs.setdefault('ATLASConverterTool', converterTool) kwargs.setdefault('TrackParamsEstimationTool', trackEstimationTool) kwargs.setdefault('OutputEstimatedTrackParameters', 'ITkPixelEstimatedTrackParams') - kwargs.setdefault('UsePixel', True) kwargs.setdefault('DetectorElements', 'ITkPixelDetectorElementCollection') if flags.Acts.doMonitoring: @@ -228,7 +248,6 @@ def ActsTrkITkStripSeedingCfg(flags, kwargs.setdefault('ATLASConverterTool', converterTool) kwargs.setdefault('TrackParamsEstimationTool', trackEstimationTool) kwargs.setdefault('OutputEstimatedTrackParameters', 'ITkStripEstimatedTrackParams') - kwargs.setdefault('UsePixel', False) kwargs.setdefault('DetectorElements', 'ITkStripDetectorElementCollection') if flags.Acts.doMonitoring: diff --git a/Tracking/Acts/ActsTrackReconstruction/src/SeedingAlg.cxx b/Tracking/Acts/ActsTrackReconstruction/src/SeedingAlg.cxx index c242c28e0ae9d44ce56a5ebbd86a26b5ea514231..52b716cdff9d717c09ea47a4977c0c5f0c20aa66 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/SeedingAlg.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/src/SeedingAlg.cxx @@ -31,6 +31,8 @@ namespace ActsTrk { StatusCode SeedingAlg::initialize() { ATH_MSG_INFO( "Initializing " << name() << " ... " ); + if (m_fastTracking) + ATH_MSG_INFO( " using fast tracking configuration."); // Retrieve seed tool ATH_CHECK( m_seedsTool.retrieve() ); @@ -115,14 +117,15 @@ namespace ActsTrk { number_input_space_points += handle->size(); } - // TODO: Write some lines to check which SPs you want to use from the input container - // At the time being we fill a vector with all SPs available. + // Apply selection on which SPs you want to use from the input container std::vector<const xAOD::SpacePoint*> selectedSpacePoints; selectedSpacePoints.reserve(number_input_space_points); for (const auto* collection : all_input_collections) { for (const auto* sp : *collection) { - selectedSpacePoints.push_back( sp ); + if (m_fastTracking and skipSpacePoint(sp->x()-beamPos.x(), sp->y()-beamPos.y(), sp->z()-beamPos.z())) + continue; + selectedSpacePoints.push_back( sp ); } } diff --git a/Tracking/Acts/ActsTrackReconstruction/src/SeedingAlg.h b/Tracking/Acts/ActsTrackReconstruction/src/SeedingAlg.h index eb6dfcc3a568b9348a6fac52f3a16114f469b570..95721fee8cc11871134a41e7c3f66e0bcd29f37f 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/SeedingAlg.h +++ b/Tracking/Acts/ActsTrackReconstruction/src/SeedingAlg.h @@ -65,8 +65,22 @@ namespace ActsTrk { SG::WriteHandleKey< ActsTrk::SeedContainer > m_seedKey {this,"OutputSeeds","","Output Seeds"}; SG::WriteHandleKey< ActsTrk::BoundTrackParametersContainer > m_actsTrackParamsKey {this, "OutputEstimatedTrackParameters", "", ""}; - Gaudi::Property< bool > m_usePixel {this, "UsePixel", true}; + Gaudi::Property< bool > m_fastTracking {this, "useFastTracking", false}; + bool skipSpacePoint(float x, float y, float z) const; }; + + inline bool SeedingAlg::skipSpacePoint(float x, float y, float z) const { + float R = std::hypotf(x,y); + // At small R, we remove space points beyond |z|=200 + if (std::abs(z) > 200. && R < 50.) + return true; + // We also remove space points beyond eta=4. if their z is larger + // than the max seed z0 (150.) + float cotTheta = 27.2899; // (4.0 eta) --> 27.2899 = 1/tan(2*arctan(exp(-4))) + if (std::abs(z) - 150. > cotTheta * R) + return true; + return false; + } } // namespace diff --git a/Tracking/Acts/ActsTrackReconstruction/src/SiSpacePointsSeedMaker.cxx b/Tracking/Acts/ActsTrackReconstruction/src/SiSpacePointsSeedMaker.cxx index 763264d63a31c521723b4472daad575edf0ed47e..9e715747a25cf2d4bc8ed387582ee67ee44d23e9 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/SiSpacePointsSeedMaker.cxx +++ b/Tracking/Acts/ActsTrackReconstruction/src/SiSpacePointsSeedMaker.cxx @@ -28,6 +28,7 @@ #include "TTree.h" +#include <cmath> namespace ActsTrk { @@ -45,6 +46,7 @@ namespace ActsTrk { ATH_MSG_DEBUG( " " << m_strip ); ATH_MSG_DEBUG( " " << m_useOverlap ); ATH_MSG_DEBUG( " " << m_writeNtuple ); + ATH_MSG_DEBUG( " " << m_fastTracking ); if (not m_pixel and not m_strip) { ATH_MSG_ERROR("Activate seeding on at least one between Pixel and Strip space point collections!"); @@ -133,6 +135,9 @@ namespace ActsTrk { r[1] = static_cast<float>(globPos.y()); r[2] = static_cast<float>(globPos.z()); + if (m_fastTracking and skipSpacePoint(r[0]-data.xbeam[0], r[1]-data.ybeam[0], r[2]-data.zbeam[0])) + return; + // adding additional information from strip or pixel if (not sp->clusterList().second) pixInform(sp, r); @@ -148,11 +153,27 @@ namespace ActsTrk { SiSpacePointsSeedMaker::newSpacePoint(InDet::SiSpacePointsSeedMakerEventData& data, const xAOD::SpacePoint* const& sp) const { + if (m_fastTracking and skipSpacePoint(sp->x()-data.xbeam[0], sp->y()-data.ybeam[0], sp->z()-data.zbeam[0])) + return; + data.v_ActsSpacePointForSeed.emplace_back(sp); data.ns++; data.nsaz++; } + bool SiSpacePointsSeedMaker::skipSpacePoint(float x, float y, float z) const { + float R = std::hypotf(x,y); + // At small R, we remove space points beyond |z|=200 + if (std::abs(z) > 200. && R < 50.) + return true; + // We also remove space points beyond eta=4. if their z is larger + // than the max seed z0 (150.) + float cotTheta = 27.2899; // (4.0 eta) --> 27.2899 = 1/tan(2*arctan(exp(-4))) + if (std::abs(z) - 150. > cotTheta * R) + return true; + return false; + } + void SiSpacePointsSeedMaker::pixInform(const Trk::SpacePoint* const& sp, float *r) { diff --git a/Tracking/Acts/ActsTrackReconstruction/src/SiSpacePointsSeedMaker.h b/Tracking/Acts/ActsTrackReconstruction/src/SiSpacePointsSeedMaker.h index be8a046dfe92287e9a6954ad19af4430457bc2c8..253d998ca69c7d03dd8d21b059caa8d70b69175f 100644 --- a/Tracking/Acts/ActsTrackReconstruction/src/SiSpacePointsSeedMaker.h +++ b/Tracking/Acts/ActsTrackReconstruction/src/SiSpacePointsSeedMaker.h @@ -150,6 +150,7 @@ namespace ActsTrk { void newSpacePoint(InDet::SiSpacePointsSeedMakerEventData& data, const xAOD::SpacePoint* const& sp) const; + bool skipSpacePoint(float x, float y, float z) const; static void pixInform(const Trk::SpacePoint* const& sp, float* r) ; static void stripInform(InDet::SiSpacePointsSeedMakerEventData& data, @@ -200,7 +201,6 @@ namespace ActsTrk { Gaudi::Property< bool > m_doSpacePointConversion {this, "doSpacePointConversion", true, "Convert Trk::SpacePoint container into xAOD::SpacePoint container"}; Gaudi::Property< bool > m_doSeedConversion {this, "doSeedConversion", true, "Convert ActsTrk::Seed into ITk::SiSpacePointsProSeed"}; - private: // Validation Gaudi::Property< bool > m_writeNtuple {this, "WriteNtuple", false};