Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-11 07:49:56

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
0008 
0009 #pragma once
0010 
0011 #include "Acts/Definitions/Units.hpp"
0012 #include "Acts/Material/Interactions.hpp"
0013 #include "Acts/Seeding/SeedConfirmationRangeConfig.hpp"
0014 #include "Acts/Utilities/Delegate.hpp"
0015 
0016 #include <cmath>
0017 #include <memory>
0018 #include <numbers>
0019 
0020 namespace Acts {
0021 
0022 // forward declaration to avoid cyclic dependence
0023 template <typename T>
0024 class SeedFilter;
0025 
0026 /// @brief Structure that holds configuration parameters for the orthogonal seed finder algorithm
0027 template <typename SpacePoint>
0028 struct SeedFinderOrthogonalConfig {
0029   std::shared_ptr<Acts::SeedFilter<SpacePoint>> seedFilter;
0030 
0031   /// Seeding parameters for geometry settings and detector ROI
0032 
0033   // Limiting location of all measurements
0034   float phiMin = -std::numbers::pi_v<float>;
0035   float phiMax = std::numbers::pi_v<float>;
0036   /// limiting location of measurements
0037   float zMin = -2800 * Acts::UnitConstants::mm;
0038   float zMax = 2800 * Acts::UnitConstants::mm;
0039   float rMax = 600 * Acts::UnitConstants::mm;
0040   /// @warning If rMin is smaller than impactMax, the bin size will be 2*pi,
0041   /// which will make seeding very slow!
0042   float rMin = 33 * Acts::UnitConstants::mm;
0043 
0044   /// Seeding parameters used to define the region of interest for middle
0045   /// space-point
0046 
0047   /// Radial range for middle space-point
0048   /// The range can be defined manually with (rMinMiddle, rMaxMiddle). If
0049   /// useVariableMiddleSPRange is set to false and the vector rRangeMiddleSP is
0050   /// empty, we use (rMinMiddle, rMaxMiddle) to cut the middle space-points
0051   float rMinMiddle = 60.f * Acts::UnitConstants::mm;
0052   float rMaxMiddle = 120.f * Acts::UnitConstants::mm;
0053   /// If useVariableMiddleSPRange is set to false, the vector rRangeMiddleSP can
0054   /// be used to define a fixed r range for each z bin: {{rMin, rMax}, ...}
0055   bool useVariableMiddleSPRange = true;
0056   /// Range defined in vector for each z bin
0057   std::vector<std::vector<float>> rRangeMiddleSP;
0058   /// If useVariableMiddleSPRange is true, the radial range will be calculated
0059   /// based on the maximum and minimum r values of the space-points in the event
0060   /// and a deltaR (deltaRMiddleMinSPRange, deltaRMiddleMaxSPRange)
0061   float deltaRMiddleMinSPRange = 10. * Acts::UnitConstants::mm;
0062   float deltaRMiddleMaxSPRange = 10. * Acts::UnitConstants::mm;
0063 
0064   /// Vector containing minimum and maximum z boundaries for cutting middle
0065   /// space-points
0066   std::pair<float, float> zOutermostLayers{-2700 * Acts::UnitConstants::mm,
0067                                            2700 * Acts::UnitConstants::mm};
0068 
0069   /// Seeding parameters used to define the cuts on space-point doublets
0070 
0071   /// Minimum radial distance between middle-outer doublet components
0072   float deltaRMinTopSP = std::numeric_limits<float>::quiet_NaN();
0073   /// Maximum radial distance between middle-outer doublet components
0074   float deltaRMaxTopSP = std::numeric_limits<float>::quiet_NaN();
0075   /// Minimum radial distance between inner-middle doublet components
0076   float deltaRMinBottomSP = std::numeric_limits<float>::quiet_NaN();
0077   /// Maximum radial distance between inner-middle doublet components
0078   float deltaRMaxBottomSP = std::numeric_limits<float>::quiet_NaN();
0079 
0080   /// Shrink the phi range of middle space-point (analogous to phi bin size in
0081   /// grid from default seeding + number of phi bins used in search)
0082   float deltaPhiMax = 0.085;
0083 
0084   /// Maximum value of z-distance between space-points in doublet
0085   float deltaZMax =
0086       std::numeric_limits<float>::infinity() * Acts::UnitConstants::mm;
0087 
0088   /// Maximum allowed cotTheta between two space-points in doublet, used to
0089   /// check if forward angle is within bounds
0090   float cotThetaMax = 7.40627;  // equivalent to 2.7 eta (pseudorapidity)
0091 
0092   /// Limiting location of collision region in z-axis used to check if doublet
0093   /// origin is within reasonable bounds
0094   float collisionRegionMin = -150 * Acts::UnitConstants::mm;
0095   float collisionRegionMax = +150 * Acts::UnitConstants::mm;
0096 
0097   /// Enable cut on the compatibility between interaction point and doublet,
0098   /// this is an useful approximation to speed up the seeding
0099   bool interactionPointCut = false;
0100 
0101   /// Seeding parameters used to define the cuts on space-point triplets
0102 
0103   /// Minimum transverse momentum (pT) used to check the r-z slope compatibility
0104   /// of triplets with maximum multiple scattering effect (produced by the
0105   /// minimum allowed pT particle) + a certain uncertainty term. Check the
0106   /// documentation for more information
0107   /// https://acts.readthedocs.io/en/latest/core/reconstruction/pattern_recognition/seeding.html
0108   float minPt = 400. * Acts::UnitConstants::MeV;
0109   /// Number of sigmas of scattering angle to be considered in the minimum pT
0110   /// scattering term
0111   float sigmaScattering = 5;
0112   /// Term that accounts for the thickness of scattering medium in radiation
0113   /// lengths in the Lynch & Dahl correction to the Highland equation default is
0114   /// 5%
0115   /// TODO: necessary to make amount of material dependent on detector region?
0116   float radLengthPerSeed = 0.05;
0117   /// Maximum transverse momentum for scattering calculation
0118   float maxPtScattering = 10 * Acts::UnitConstants::GeV;
0119   /// Maximum value of impact parameter estimation of the seed candidates
0120   float impactMax = 20. * Acts::UnitConstants::mm;
0121   /// Parameter which can loosen the tolerance of the track seed to form a
0122   /// helix. This is useful for e.g. misaligned seeding.
0123   float helixCutTolerance = 1.;
0124 
0125   /// Seeding parameters used for quality seed confirmation
0126 
0127   /// Enable quality seed confirmation, this is different than default seeding
0128   /// confirmation because it can also be defined for different (r, z) regions
0129   /// of the detector (e.g. forward or central region) by SeedConfirmationRange.
0130   /// Seeds are classified as "high-quality" seeds and normal quality seeds.
0131   /// Normal quality seeds are only selected if no other "high-quality" seeds
0132   /// has been found for that inner-middle doublet.
0133   bool seedConfirmation = false;
0134   /// Contains parameters for central seed confirmation
0135   SeedConfirmationRangeConfig centralSeedConfirmationRange;
0136   /// Contains parameters for forward seed confirmation
0137   SeedConfirmationRangeConfig forwardSeedConfirmationRange;
0138   /// Maximum number (minus one) of accepted seeds per middle space-point
0139   unsigned int maxSeedsPerSpM = 5;
0140 
0141   /// Other parameters
0142 
0143   /// derived values, set on SeedFinder construction
0144   float highland = 0;
0145   float maxScatteringAngle2 = 0;
0146 
0147   // Delegate to apply experiment specific cuts
0148   Delegate<bool(float /*bottomRadius*/, float /*cotTheta*/)> experimentCuts{
0149       DelegateFuncTag<&noopExperimentCuts>{}};
0150 
0151   bool isInInternalUnits = true;
0152   //[[deprecated("SeedFinderOrthogonalConfig uses internal units")]]
0153   SeedFinderOrthogonalConfig toInternalUnits() const { return *this; }
0154 
0155   SeedFinderOrthogonalConfig calculateDerivedQuantities() const {
0156     SeedFinderOrthogonalConfig config = *this;
0157     config.highland = approximateHighlandScattering(config.radLengthPerSeed);
0158     config.maxScatteringAngle2 = std::pow(config.highland / config.minPt, 2);
0159     return config;
0160   }
0161 };
0162 
0163 }  // namespace Acts