File indexing completed on 2026-06-27 08:32:20
0001
0002
0003 #ifndef EDM4HEP_MutableCluster_H
0004 #define EDM4HEP_MutableCluster_H
0005
0006 #include "edm4hep/ClusterObj.h"
0007
0008 #include "edm4hep/Cluster.h"
0009
0010 #include "edm4hep/CalorimeterHit.h"
0011 #include "edm4hep/CovMatrix3f.h"
0012 #include "edm4hep/Vector3f.h"
0013 #include "podio/RelationRange.h"
0014 #include <cstdint>
0015 #include <edm4hep/Constants.h>
0016 #include <vector>
0017
0018 #include "podio/utilities/MaybeSharedPtr.h"
0019
0020 #include <cstdint>
0021
0022 #if defined(PODIO_JSON_OUTPUT) && !defined(__CLING__)
0023 #include "nlohmann/json_fwd.hpp"
0024 #endif
0025
0026
0027 namespace edm4hep {
0028 class ClusterCollection;
0029 }
0030
0031 namespace edm4hep {
0032
0033
0034
0035
0036
0037 class MutableCluster {
0038
0039 friend class ClusterCollection;
0040 friend class ClusterMutableCollectionIterator;
0041 friend class Cluster;
0042
0043 public:
0044 using object_type = Cluster;
0045 using collection_type = ClusterCollection;
0046
0047
0048 MutableCluster() = default;
0049
0050
0051 MutableCluster(const std::int32_t type, const float energy, const float energyError,
0052 const edm4hep::Vector3f& position, const edm4hep::CovMatrix3f& positionError, const float iTheta,
0053 const float iPhi, const edm4hep::Vector3f& directionError);
0054
0055
0056 MutableCluster(const MutableCluster& other) = default;
0057
0058
0059 MutableCluster& operator=(MutableCluster other) &;
0060 MutableCluster&
0061 operator=(MutableCluster other) && = delete;
0062
0063
0064
0065 MutableCluster clone(bool cloneRelations = true) const;
0066
0067
0068 ~MutableCluster() = default;
0069
0070 public:
0071
0072 std::int32_t getType() const;
0073
0074
0075 float getEnergy() const;
0076
0077
0078 float getEnergyError() const;
0079
0080
0081 const edm4hep::Vector3f& getPosition() const;
0082
0083
0084 const edm4hep::CovMatrix3f& getPositionError() const;
0085
0086
0087
0088 float getITheta() const;
0089
0090
0091
0092 float getIPhi() const;
0093
0094
0095 const edm4hep::Vector3f& getDirectionError() const;
0096
0097
0098 void setType(const std::int32_t type);
0099
0100 std::int32_t& getType();
0101
0102 [[deprecated("use getType instead")]] std::int32_t& type();
0103
0104
0105 void setEnergy(const float energy);
0106
0107 float& getEnergy();
0108
0109 [[deprecated("use getEnergy instead")]] float& energy();
0110
0111
0112 void setEnergyError(const float energyError);
0113
0114 float& getEnergyError();
0115
0116 [[deprecated("use getEnergyError instead")]] float& energyError();
0117
0118
0119 void setPosition(const edm4hep::Vector3f& position);
0120
0121 edm4hep::Vector3f& getPosition();
0122
0123 [[deprecated("use getPosition instead")]] edm4hep::Vector3f& position();
0124
0125
0126 void setPositionError(const edm4hep::CovMatrix3f& positionError);
0127
0128 edm4hep::CovMatrix3f& getPositionError();
0129
0130 [[deprecated("use getPositionError instead")]] edm4hep::CovMatrix3f& positionError();
0131
0132
0133
0134 void setITheta(const float iTheta);
0135
0136
0137 float& getITheta();
0138
0139
0140 [[deprecated("use getITheta instead")]] float& iTheta();
0141
0142
0143
0144 void setIPhi(const float iPhi);
0145
0146
0147 float& getIPhi();
0148
0149
0150 [[deprecated("use getIPhi instead")]] float& iPhi();
0151
0152
0153 void setDirectionError(const edm4hep::Vector3f& directionError);
0154
0155 edm4hep::Vector3f& getDirectionError();
0156
0157 [[deprecated("use getDirectionError instead")]] edm4hep::Vector3f& directionError();
0158
0159 void addToClusters(const edm4hep::Cluster&);
0160 std::size_t clusters_size() const;
0161 edm4hep::Cluster getClusters(std::size_t) const;
0162 std::vector<edm4hep::Cluster>::const_iterator clusters_begin() const;
0163 std::vector<edm4hep::Cluster>::const_iterator clusters_end() const;
0164 podio::RelationRange<edm4hep::Cluster> getClusters() const;
0165 void addToHits(const edm4hep::CalorimeterHit&);
0166 std::size_t hits_size() const;
0167 edm4hep::CalorimeterHit getHits(std::size_t) const;
0168 std::vector<edm4hep::CalorimeterHit>::const_iterator hits_begin() const;
0169 std::vector<edm4hep::CalorimeterHit>::const_iterator hits_end() const;
0170 podio::RelationRange<edm4hep::CalorimeterHit> getHits() const;
0171 void addToShapeParameters(const float&);
0172 std::size_t shapeParameters_size() const;
0173 float getShapeParameters(std::size_t) const;
0174 std::vector<float>::const_iterator shapeParameters_begin() const;
0175 std::vector<float>::const_iterator shapeParameters_end() const;
0176 podio::RelationRange<float> getShapeParameters() const;
0177 void addToSubdetectorEnergies(const float&);
0178 std::size_t subdetectorEnergies_size() const;
0179 float getSubdetectorEnergies(std::size_t) const;
0180 std::vector<float>::const_iterator subdetectorEnergies_begin() const;
0181 std::vector<float>::const_iterator subdetectorEnergies_end() const;
0182 podio::RelationRange<float> getSubdetectorEnergies() const;
0183
0184
0185 float getPositionError(edm4hep::Cartesian dimI, edm4hep::Cartesian dimJ) const {
0186 return getPositionError().getValue(dimI, dimJ);
0187 }
0188
0189
0190 [[deprecated("Use getIPhi instead")]] float getPhi() const { return getIPhi(); }
0191
0192
0193 void setPositionError(float value, edm4hep::Cartesian dimI, edm4hep::Cartesian dimJ) {
0194 return getPositionError().setValue(value, dimI, dimJ);
0195 }
0196
0197
0198 [[deprecated("Use setIPhi instead")]] void setPhi(float value) { setIPhi(value); }
0199
0200
0201 bool isAvailable() const;
0202
0203 void unlink() { m_obj = podio::utils::MaybeSharedPtr<ClusterObj>{nullptr}; }
0204
0205 bool operator==(const MutableCluster& other) const { return m_obj == other.m_obj; }
0206 bool operator==(const Cluster& other) const;
0207
0208 bool operator!=(const MutableCluster& other) const { return !(*this == other); }
0209 bool operator!=(const Cluster& other) const { return !(*this == other); }
0210
0211
0212 bool operator<(const MutableCluster& other) const {
0213 return podio::detail::getOrderKey(*this) < podio::detail::getOrderKey(other);
0214 }
0215
0216 podio::ObjectID id() const { return getObjectID(); }
0217
0218 const podio::ObjectID getObjectID() const;
0219
0220 friend std::hash<MutableCluster>;
0221
0222 friend void swap(MutableCluster& a, MutableCluster& b) {
0223 using std::swap;
0224 swap(a.m_obj, b.m_obj);
0225 }
0226
0227 private:
0228
0229 explicit MutableCluster(podio::utils::MaybeSharedPtr<ClusterObj> obj);
0230
0231 podio::utils::MaybeSharedPtr<ClusterObj> m_obj{new ClusterObj{}, podio::utils::MarkOwned};
0232 };
0233
0234 #if defined(PODIO_JSON_OUTPUT) && !defined(__CLING__)
0235 void to_json(nlohmann::json& j, const MutableCluster& value);
0236 #endif
0237
0238 }
0239
0240 template <>
0241 struct std::hash<edm4hep::MutableCluster> {
0242 std::size_t operator()(const edm4hep::MutableCluster& obj) const {
0243 return std::hash<edm4hep::ClusterObj*>{}(obj.m_obj.get());
0244 }
0245 };
0246
0247 #endif