File indexing completed on 2025-09-17 08:55:02
0001
0002
0003 #ifndef EDM4EIC_MutableReconstructedParticle_H
0004 #define EDM4EIC_MutableReconstructedParticle_H
0005
0006 #include "edm4eic/ReconstructedParticleObj.h"
0007
0008 #include "edm4eic/ReconstructedParticle.h"
0009
0010 #include "edm4eic/Cluster.h"
0011 #include "edm4eic/Cov4f.h"
0012 #include "edm4eic/Track.h"
0013 #include "edm4hep/ParticleID.h"
0014 #include "edm4hep/Vector3f.h"
0015 #include "podio/RelationRange.h"
0016 #include <cstdint>
0017 #include <vector>
0018
0019 #include "podio/utilities/MaybeSharedPtr.h"
0020
0021 #include <cstdint>
0022
0023 #if defined(PODIO_JSON_OUTPUT) && !defined(__CLING__)
0024 #include "nlohmann/json_fwd.hpp"
0025 #endif
0026
0027
0028 namespace edm4eic {
0029 class ReconstructedParticleCollection;
0030 class Vertex;
0031 class MutableVertex;
0032 }
0033 namespace edm4hep {
0034 class ParticleID;
0035 class MutableParticleID;
0036 }
0037
0038
0039 namespace edm4eic {
0040
0041
0042
0043
0044
0045
0046 class MutableReconstructedParticle {
0047
0048 friend class ReconstructedParticleCollection;
0049 friend class ReconstructedParticleMutableCollectionIterator;
0050 friend class ReconstructedParticle;
0051
0052 public:
0053 using object_type = ReconstructedParticle;
0054 using collection_type = ReconstructedParticleCollection;
0055
0056
0057 MutableReconstructedParticle();
0058
0059
0060 MutableReconstructedParticle(const std::int32_t type, const float energy, const edm4hep::Vector3f& momentum, const edm4hep::Vector3f& referencePoint, const float charge, const float mass, const float goodnessOfPID, const edm4eic::Cov4f& covMatrix, const std::int32_t PDG);
0061
0062
0063 MutableReconstructedParticle(const MutableReconstructedParticle& other) = default;
0064
0065
0066 MutableReconstructedParticle& operator=(MutableReconstructedParticle other) &;
0067 MutableReconstructedParticle& operator=(MutableReconstructedParticle other) && = delete;
0068
0069
0070
0071 MutableReconstructedParticle clone(bool cloneRelations=true) const;
0072
0073
0074 ~MutableReconstructedParticle() = default;
0075
0076
0077 public:
0078
0079
0080 std::int32_t getType() const;
0081
0082
0083 float getEnergy() const;
0084
0085
0086 const edm4hep::Vector3f& getMomentum() const;
0087
0088
0089 const edm4hep::Vector3f& getReferencePoint() const;
0090
0091
0092 float getCharge() const;
0093
0094
0095 float getMass() const;
0096
0097
0098 float getGoodnessOfPID() const;
0099
0100
0101 const edm4eic::Cov4f& getCovMatrix() const;
0102
0103
0104 std::int32_t getPDG() const;
0105
0106
0107
0108 const edm4eic::Vertex getStartVertex() const;
0109
0110 const edm4hep::ParticleID getParticleIDUsed() const;
0111
0112
0113 void setType(const std::int32_t type);
0114
0115 std::int32_t& getType();
0116
0117 [[deprecated("use getType instead")]]
0118 std::int32_t& type();
0119
0120
0121 void setEnergy(const float energy);
0122
0123 float& getEnergy();
0124
0125 [[deprecated("use getEnergy instead")]]
0126 float& energy();
0127
0128
0129 void setMomentum(const edm4hep::Vector3f& momentum);
0130
0131 edm4hep::Vector3f& getMomentum();
0132
0133 [[deprecated("use getMomentum instead")]]
0134 edm4hep::Vector3f& momentum();
0135
0136
0137 void setReferencePoint(const edm4hep::Vector3f& referencePoint);
0138
0139 edm4hep::Vector3f& getReferencePoint();
0140
0141 [[deprecated("use getReferencePoint instead")]]
0142 edm4hep::Vector3f& referencePoint();
0143
0144
0145 void setCharge(const float charge);
0146
0147 float& getCharge();
0148
0149 [[deprecated("use getCharge instead")]]
0150 float& charge();
0151
0152
0153 void setMass(const float mass);
0154
0155 float& getMass();
0156
0157 [[deprecated("use getMass instead")]]
0158 float& mass();
0159
0160
0161 void setGoodnessOfPID(const float goodnessOfPID);
0162
0163 float& getGoodnessOfPID();
0164
0165 [[deprecated("use getGoodnessOfPID instead")]]
0166 float& goodnessOfPID();
0167
0168
0169 void setCovMatrix(const edm4eic::Cov4f& covMatrix);
0170
0171 edm4eic::Cov4f& getCovMatrix();
0172
0173 [[deprecated("use getCovMatrix instead")]]
0174 edm4eic::Cov4f& covMatrix();
0175
0176
0177 void setPDG(const std::int32_t PDG);
0178
0179 std::int32_t& getPDG();
0180
0181 [[deprecated("use getPDG instead")]]
0182 std::int32_t& PDG();
0183
0184
0185
0186 void setStartVertex(const edm4eic::Vertex& value);
0187
0188 void setParticleIDUsed(const edm4hep::ParticleID& value);
0189
0190 void addToClusters(const edm4eic::Cluster&);
0191 std::size_t clusters_size() const;
0192 edm4eic::Cluster getClusters(std::size_t) const;
0193 std::vector<edm4eic::Cluster>::const_iterator clusters_begin() const;
0194 std::vector<edm4eic::Cluster>::const_iterator clusters_end() const;
0195 podio::RelationRange<edm4eic::Cluster> getClusters() const;
0196 void addToTracks(const edm4eic::Track&);
0197 std::size_t tracks_size() const;
0198 edm4eic::Track getTracks(std::size_t) const;
0199 std::vector<edm4eic::Track>::const_iterator tracks_begin() const;
0200 std::vector<edm4eic::Track>::const_iterator tracks_end() const;
0201 podio::RelationRange<edm4eic::Track> getTracks() const;
0202 void addToParticles(const edm4eic::ReconstructedParticle&);
0203 std::size_t particles_size() const;
0204 edm4eic::ReconstructedParticle getParticles(std::size_t) const;
0205 std::vector<edm4eic::ReconstructedParticle>::const_iterator particles_begin() const;
0206 std::vector<edm4eic::ReconstructedParticle>::const_iterator particles_end() const;
0207 podio::RelationRange<edm4eic::ReconstructedParticle> getParticles() const;
0208 void addToParticleIDs(const edm4hep::ParticleID&);
0209 std::size_t particleIDs_size() const;
0210 edm4hep::ParticleID getParticleIDs(std::size_t) const;
0211 std::vector<edm4hep::ParticleID>::const_iterator particleIDs_begin() const;
0212 std::vector<edm4hep::ParticleID>::const_iterator particleIDs_end() const;
0213 podio::RelationRange<edm4hep::ParticleID> getParticleIDs() const;
0214
0215 bool isCompound() const {return particles_size() > 0;}
0216
0217
0218
0219
0220 bool isAvailable() const;
0221
0222 void unlink() { m_obj = podio::utils::MaybeSharedPtr<ReconstructedParticleObj>{nullptr}; }
0223
0224 bool operator==(const MutableReconstructedParticle& other) const { return m_obj == other.m_obj; }
0225 bool operator==(const ReconstructedParticle& other) const;
0226
0227 bool operator!=(const MutableReconstructedParticle& other) const { return !(*this == other); }
0228 bool operator!=(const ReconstructedParticle& other) const { return !(*this == other); }
0229
0230
0231 bool operator<(const MutableReconstructedParticle& other) const { return podio::detail::getOrderKey(*this) < podio::detail::getOrderKey(other); }
0232
0233 podio::ObjectID id() const { return getObjectID(); }
0234
0235 const podio::ObjectID getObjectID() const;
0236
0237 friend std::hash<MutableReconstructedParticle>;
0238
0239 friend void swap(MutableReconstructedParticle& a, MutableReconstructedParticle& b) {
0240 using std::swap;
0241 swap(a.m_obj, b.m_obj);
0242 }
0243
0244 private:
0245
0246 explicit MutableReconstructedParticle(podio::utils::MaybeSharedPtr<ReconstructedParticleObj> obj);
0247
0248 podio::utils::MaybeSharedPtr<ReconstructedParticleObj> m_obj{nullptr};
0249 };
0250
0251 #if defined(PODIO_JSON_OUTPUT) && !defined(__CLING__)
0252 void to_json(nlohmann::json& j, const MutableReconstructedParticle& value);
0253 #endif
0254
0255
0256 }
0257
0258
0259
0260 template<>
0261 struct std::hash<edm4eic::MutableReconstructedParticle> {
0262 std::size_t operator()(const edm4eic::MutableReconstructedParticle& obj) const {
0263 return std::hash<edm4eic::ReconstructedParticleObj*>{}(obj.m_obj.get());
0264 }
0265 };
0266
0267
0268 #endif