File indexing completed on 2026-11-11 09:33:35
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Geometry/GeometryHierarchyMap.hpp"
0012 #include "Acts/Utilities/Logger.hpp"
0013 #include "ActsExamples/EventData/Index.hpp"
0014 #include "ActsExamples/EventData/Measurement.hpp"
0015 #include "ActsExamples/EventData/SimParticle.hpp"
0016 #include "ActsExamples/EventData/TruthMatching.hpp"
0017 #include "ActsExamples/Framework/DataHandle.hpp"
0018 #include "ActsExamples/Framework/IAlgorithm.hpp"
0019 #include "ActsExamples/Framework/ProcessCode.hpp"
0020
0021 #include <limits>
0022 #include <string>
0023
0024 #include <boost/container/small_vector.hpp>
0025
0026 namespace ActsExamples {
0027
0028
0029 class ParticleSelector final : public IAlgorithm {
0030 public:
0031 struct MeasurementCounter {
0032 static constexpr std::uint32_t perLayerCapMax =
0033 std::numeric_limits<std::uint32_t>::max();
0034
0035
0036 struct CounterElement {
0037 Acts::GeometryHierarchyMap<std::uint32_t> geometryMap;
0038 std::uint32_t threshold{};
0039 std::uint32_t perLayerCap{perLayerCapMax};
0040
0041 CounterElement(
0042 std::vector<Acts::GeometryHierarchyMap<std::uint32_t>::InputElement>&&
0043 geometryMap_,
0044 std::uint32_t threshold_, std::uint32_t perLayerCap_ = perLayerCapMax)
0045 : geometryMap(std::move(geometryMap_)),
0046 threshold(threshold_),
0047 perLayerCap(perLayerCap_) {}
0048 };
0049
0050 boost::container::small_vector<CounterElement, 4> counters;
0051
0052 bool isValidParticle(
0053 const SimParticle& particle,
0054 const InverseMultimap<SimBarcode>& particleMeasurementsMap,
0055 const MeasurementContainer& measurements) const;
0056
0057 void addCounter(const std::vector<Acts::GeometryIdentifier>& identifiers,
0058 std::uint32_t threshold,
0059 std::uint32_t perLayerCap = perLayerCapMax) {
0060 std::vector<Acts::GeometryHierarchyMap<unsigned int>::InputElement>
0061 elements;
0062 for (const auto& id : identifiers) {
0063 elements.emplace_back(id, 0);
0064 }
0065 counters.emplace_back(std::move(elements), threshold, perLayerCap);
0066 }
0067 };
0068
0069 struct Config {
0070
0071 std::string inputParticles;
0072
0073
0074 std::string inputParticleMeasurementsMap;
0075
0076
0077 std::string inputMeasurements;
0078
0079 std::string outputParticles;
0080
0081
0082 double rhoMin = 0;
0083 double rhoMax = std::numeric_limits<double>::infinity();
0084
0085 double absZMin = 0;
0086 double absZMax = std::numeric_limits<double>::infinity();
0087
0088 double timeMin = -std::numeric_limits<double>::infinity();
0089 double timeMax = std::numeric_limits<double>::infinity();
0090
0091 double phiMin = -std::numeric_limits<double>::infinity();
0092 double phiMax = std::numeric_limits<double>::infinity();
0093 double etaMin = -std::numeric_limits<double>::infinity();
0094 double etaMax = std::numeric_limits<double>::infinity();
0095 double absEtaMin = 0;
0096 double absEtaMax = std::numeric_limits<double>::infinity();
0097
0098 double ptMin = 0;
0099 double ptMax = std::numeric_limits<double>::infinity();
0100
0101 double mMin = 0;
0102 double mMax = std::numeric_limits<double>::infinity();
0103
0104 std::size_t hitsMin = 0;
0105 std::size_t hitsMax = std::numeric_limits<std::size_t>::max();
0106
0107 std::size_t measurementsMin = 0;
0108 std::size_t measurementsMax = std::numeric_limits<std::size_t>::max();
0109
0110 bool removeCharged = false;
0111
0112 bool removeNeutral = false;
0113
0114 bool removeSecondaries = false;
0115
0116 std::vector<int> excludeAbsPdgs;
0117
0118
0119 std::uint64_t minPrimaryVertexId = 0;
0120
0121 std::uint64_t maxPrimaryVertexId =
0122 std::numeric_limits<std::uint64_t>::max();
0123
0124
0125 MeasurementCounter measurementCounter;
0126 };
0127
0128 explicit ParticleSelector(
0129 const Config& config,
0130 std::unique_ptr<const Acts::Logger> logger = nullptr);
0131
0132 ProcessCode execute(const AlgorithmContext& ctx) const final;
0133
0134
0135 const Config& config() const { return m_cfg; }
0136
0137 private:
0138 void logSelectionConfig() const;
0139
0140 Config m_cfg;
0141
0142 ReadDataHandle<SimParticleContainer> m_inputParticles{this, "InputParticles"};
0143 ReadDataHandle<ParticleMeasurementsMap> m_inputParticleMeasurementsMap{
0144 this, "InputParticleMeasurementsMap"};
0145 ReadDataHandle<MeasurementContainer> m_inputMeasurements{this,
0146 "InputMeasurements"};
0147
0148 WriteDataHandle<SimParticleContainer> m_outputParticles{this,
0149 "OutputParticles"};
0150 };
0151
0152 }