Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-06-01 07:07:36

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2019 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 http://mozilla.org/MPL/2.0/.
0008 
0009 #pragma once
0010 
0011 //#include "ACTFW/Validation/ProtoTrackClassification.hpp"
0012 #include "Acts/EventData/MultiTrajectory.hpp"
0013 #include "Acts/EventData/TrackParameters.hpp"
0014 
0015 #include "JugReco/IndexSourceLink.hpp"
0016 #include <unordered_map>
0017 #include <utility>
0018 
0019 namespace Jug {
0020 
0021   /// Associate a particle to its hit count within a proto track.
0022   struct ParticleHitCount {
0023     uint64_t    particleId;
0024     std::size_t hitCount;
0025   };
0026 
0027 using IndexedParams = std::unordered_map<size_t, Acts::BoundTrackParameters>;
0028 
0029 /// @brief Struct for truth track fitting/finding result with
0030 /// Acts::KalmanFitter/Acts::CombinatorialKalmanFilter
0031 ///
0032 /// It contains a MultiTrajectory with a vector of entry indices for individual
0033 /// trajectories, and a map of fitted parameters indexed by the entry index.
0034 /// In case of track fitting, there is at most one trajectory in the
0035 /// MultiTrajectory; In case of track finding, there could be multiple
0036 /// trajectories in the MultiTrajectory.
0037 ///
0038 /// @note The MultiTrajectory is thought to be empty if there is no entry index
0039 struct SimMultiTrajectory {
0040  public:
0041   /// @brief Default constructor
0042   ///
0043   SimMultiTrajectory() = default;
0044 
0045   /// @brief Constructor from multiTrajectory and fitted track parameters
0046   ///
0047   /// @param multiTraj The multiTrajectory
0048   /// @param tTips The entry indices for trajectories in multiTrajectory
0049   /// @param parameters The fitted track parameters indexed by trajectory entry
0050   /// index
0051   SimMultiTrajectory(const Acts::MultiTrajectory<IndexSourceLink>& multiTraj,
0052                      const std::vector<size_t>& tTips,
0053                      const IndexedParams& parameters)
0054       : m_multiTrajectory(multiTraj),
0055         m_trackTips(tTips),
0056         m_trackParameters(parameters) {}
0057 
0058   /// @brief Copy constructor
0059   ///
0060   /// @param rhs The source SimMultiTrajectory
0061   SimMultiTrajectory(const SimMultiTrajectory& rhs)
0062       : m_multiTrajectory(rhs.m_multiTrajectory),
0063         m_trackTips(rhs.m_trackTips),
0064         m_trackParameters(rhs.m_trackParameters) {}
0065 
0066   /// @brief Copy move constructor
0067   ///
0068   /// @param rhs The source SimMultiTrajectory
0069   SimMultiTrajectory(SimMultiTrajectory&& rhs)
0070       : m_multiTrajectory(std::move(rhs.m_multiTrajectory)),
0071         m_trackTips(std::move(rhs.m_trackTips)),
0072         m_trackParameters(std::move(rhs.m_trackParameters)) {}
0073 
0074   /// @brief Default destructor
0075   ///
0076   ~SimMultiTrajectory() = default;
0077 
0078   /// @brief assignment operator
0079   ///
0080   /// @param rhs The source SimMultiTrajectory
0081   SimMultiTrajectory& operator=(const SimMultiTrajectory& rhs) {
0082     m_multiTrajectory = rhs.m_multiTrajectory;
0083     m_trackTips = rhs.m_trackTips;
0084     m_trackParameters = rhs.m_trackParameters;
0085     return *this;
0086   }
0087 
0088   /// @brief assignment move operator
0089   ///
0090   /// @param rhs The source SimMultiTrajectory
0091   SimMultiTrajectory& operator=(SimMultiTrajectory&& rhs) {
0092     m_multiTrajectory = std::move(rhs.m_multiTrajectory);
0093     m_trackTips = std::move(rhs.m_trackTips);
0094     m_trackParameters = std::move(rhs.m_trackParameters);
0095     return *this;
0096   }
0097 
0098   /// @brief Indicator if a trajectory exists
0099   ///
0100   /// @param entryIndex The trajectory entry index
0101   ///
0102   /// @return Whether there is trajectory with provided entry index
0103   bool hasTrajectory(const size_t& entryIndex) const {
0104     return std::count(m_trackTips.begin(), m_trackTips.end(), entryIndex) > 0;
0105   }
0106 
0107   /// @brief Indicator if there is fitted track parameters for one trajectory
0108   ///
0109   /// @param entryIndex The trajectory entry index
0110   ///
0111   /// @return Whether having fitted track parameters or not
0112   bool hasTrackParameters(const size_t& entryIndex) const {
0113     return m_trackParameters.count(entryIndex) > 0;
0114   }
0115 
0116   /// @brief Getter for multiTrajectory
0117   ///
0118   /// @return The multiTrajectory with trajectory entry indices
0119   ///
0120   /// @note It could return an empty multiTrajectory
0121   std::pair<std::vector<size_t>, Acts::MultiTrajectory<IndexSourceLink>>
0122   trajectory() const {
0123     return std::make_pair(m_trackTips, m_multiTrajectory);
0124   }
0125 
0126   /// @brief Getter of fitted track parameters for one trajectory
0127   ///
0128   /// @param entryIndex The trajectory entry index
0129   ///
0130   /// @return The fitted track parameters of the trajectory
0131   const Acts::BoundTrackParameters& trackParameters(const size_t& entryIndex) const {
0132     auto it = m_trackParameters.find(entryIndex);
0133     if (it != m_trackParameters.end()) {
0134       return it->second;
0135     } else {
0136       throw std::runtime_error(
0137           "No fitted track parameters for trajectory with entry index = " +
0138           std::to_string(entryIndex));
0139     }
0140   }
0141 
0142   /// @brief Counter of associated truth particles for one trajectory
0143   ///
0144   /// @param entryIndex The trajectory entry index
0145   ///
0146   /// @return The truth particle counts in ascending order
0147   std::vector<ParticleHitCount> identifyMajorityParticle(
0148       const size_t& entryIndex) const;
0149 
0150  private:
0151   // The multiTrajectory
0152   Acts::MultiTrajectory<IndexSourceLink> m_multiTrajectory;
0153 
0154   // The entry indices of trajectories stored in multiTrajectory
0155   std::vector<size_t> m_trackTips = {};
0156 
0157   // The fitted parameters at the provided surface for individual trajectories
0158   IndexedParams m_trackParameters = {};
0159 };
0160 
0161 }  // namespace FW