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