File indexing completed on 2026-09-05 09:05:57
0001
0002
0003 #ifndef EDM4EIC_CherenkovParticleIDCollection_H
0004 #define EDM4EIC_CherenkovParticleIDCollection_H
0005
0006
0007 #include "edm4eic/CherenkovParticleID.h"
0008 #include "edm4eic/MutableCherenkovParticleID.h"
0009 #include "edm4eic/CherenkovParticleIDObj.h"
0010 #include "edm4eic/CherenkovParticleIDCollectionData.h"
0011
0012
0013 #include "podio/ICollectionProvider.h"
0014 #include "podio/CollectionBase.h"
0015 #include "podio/detail/Pythonizations.h"
0016 #include "podio/utilities/TypeHelpers.h"
0017
0018 #if defined(PODIO_JSON_OUTPUT) && !defined(__CLING__)
0019 #include "nlohmann/json_fwd.hpp"
0020 #endif
0021
0022 #include <string_view>
0023 #include <vector>
0024 #include <algorithm>
0025 #include <ostream>
0026 #include <mutex>
0027 #include <memory>
0028 #include <cstddef>
0029
0030 namespace podio {
0031 struct RelationNames;
0032 }
0033
0034 namespace edm4eic {
0035
0036
0037
0038 class CherenkovParticleIDCollectionIterator {
0039 public:
0040 using value_type = CherenkovParticleID;
0041 using difference_type = ptrdiff_t;
0042 using reference = CherenkovParticleID;
0043 using pointer = CherenkovParticleID*;
0044 using iterator_category = std::input_iterator_tag;
0045
0046
0047 using iterator_concept = std::random_access_iterator_tag;
0048
0049 CherenkovParticleIDCollectionIterator(size_t index, const CherenkovParticleIDObjPointerContainer* collection) : m_index(index), m_object(podio::utils::MaybeSharedPtr<CherenkovParticleIDObj>{nullptr}), m_collection(collection) {}
0050 CherenkovParticleIDCollectionIterator() = default;
0051
0052 CherenkovParticleIDCollectionIterator(const CherenkovParticleIDCollectionIterator&) = default;
0053 CherenkovParticleIDCollectionIterator(CherenkovParticleIDCollectionIterator&&) = default;
0054 CherenkovParticleIDCollectionIterator& operator=(const CherenkovParticleIDCollectionIterator&) = default;
0055 CherenkovParticleIDCollectionIterator& operator=(CherenkovParticleIDCollectionIterator&&) = default;
0056 ~CherenkovParticleIDCollectionIterator() = default;
0057
0058 constexpr auto operator<=>(const CherenkovParticleIDCollectionIterator& other) const {
0059 return m_index <=> other.m_index;
0060 }
0061
0062 constexpr bool operator==(const CherenkovParticleIDCollectionIterator& x) const {
0063 return m_index == x.m_index;
0064 }
0065
0066 reference operator*() const;
0067 pointer operator->();
0068 CherenkovParticleIDCollectionIterator& operator++();
0069 CherenkovParticleIDCollectionIterator operator++(int);
0070 CherenkovParticleIDCollectionIterator& operator--();
0071 CherenkovParticleIDCollectionIterator operator--(int);
0072 CherenkovParticleIDCollectionIterator& operator+=(difference_type n);
0073 CherenkovParticleIDCollectionIterator operator+(difference_type n) const;
0074 friend CherenkovParticleIDCollectionIterator operator+(difference_type n, const CherenkovParticleIDCollectionIterator& it);
0075 CherenkovParticleIDCollectionIterator& operator-=(difference_type n);
0076 CherenkovParticleIDCollectionIterator operator-(difference_type n) const;
0077 reference operator[](difference_type n) const;
0078 difference_type operator-(const CherenkovParticleIDCollectionIterator& other) const;
0079
0080 private:
0081 size_t m_index{0};
0082 CherenkovParticleID m_object { podio::utils::MaybeSharedPtr<CherenkovParticleIDObj>{nullptr} };
0083 const CherenkovParticleIDObjPointerContainer* m_collection{nullptr};
0084 };
0085
0086
0087 class CherenkovParticleIDMutableCollectionIterator {
0088 public:
0089 using value_type = CherenkovParticleID;
0090 using difference_type = ptrdiff_t;
0091 using reference = MutableCherenkovParticleID;
0092 using pointer = MutableCherenkovParticleID*;
0093 using iterator_category = std::input_iterator_tag;
0094
0095
0096 using iterator_concept = std::random_access_iterator_tag;
0097
0098 CherenkovParticleIDMutableCollectionIterator(size_t index, const CherenkovParticleIDObjPointerContainer* collection) : m_index(index), m_object(podio::utils::MaybeSharedPtr<CherenkovParticleIDObj>{nullptr}), m_collection(collection) {}
0099 CherenkovParticleIDMutableCollectionIterator() = default;
0100
0101 CherenkovParticleIDMutableCollectionIterator(const CherenkovParticleIDMutableCollectionIterator&) = default;
0102 CherenkovParticleIDMutableCollectionIterator(CherenkovParticleIDMutableCollectionIterator&&) = default;
0103 CherenkovParticleIDMutableCollectionIterator& operator=(const CherenkovParticleIDMutableCollectionIterator&) = default;
0104 CherenkovParticleIDMutableCollectionIterator& operator=(CherenkovParticleIDMutableCollectionIterator&&) = default;
0105 ~CherenkovParticleIDMutableCollectionIterator() = default;
0106
0107 constexpr auto operator<=>(const CherenkovParticleIDMutableCollectionIterator& other) const {
0108 return m_index <=> other.m_index;
0109 }
0110
0111 constexpr bool operator==(const CherenkovParticleIDMutableCollectionIterator& x) const {
0112 return m_index == x.m_index;
0113 }
0114
0115 reference operator*() const;
0116 pointer operator->();
0117 CherenkovParticleIDMutableCollectionIterator& operator++();
0118 CherenkovParticleIDMutableCollectionIterator operator++(int);
0119 CherenkovParticleIDMutableCollectionIterator& operator--();
0120 CherenkovParticleIDMutableCollectionIterator operator--(int);
0121 CherenkovParticleIDMutableCollectionIterator& operator+=(difference_type n);
0122 CherenkovParticleIDMutableCollectionIterator operator+(difference_type n) const;
0123 friend CherenkovParticleIDMutableCollectionIterator operator+(difference_type n, const CherenkovParticleIDMutableCollectionIterator& it);
0124 CherenkovParticleIDMutableCollectionIterator& operator-=(difference_type n);
0125 CherenkovParticleIDMutableCollectionIterator operator-(difference_type n) const;
0126 reference operator[](difference_type n) const;
0127 difference_type operator-(const CherenkovParticleIDMutableCollectionIterator& other) const;
0128
0129 private:
0130 size_t m_index{0};
0131 MutableCherenkovParticleID m_object { podio::utils::MaybeSharedPtr<CherenkovParticleIDObj>{nullptr} };
0132 const CherenkovParticleIDObjPointerContainer* m_collection{nullptr};
0133 };
0134
0135
0136
0137
0138
0139 class CherenkovParticleIDCollection : public podio::CollectionBase {
0140 public:
0141 using value_type = CherenkovParticleID;
0142 using mutable_type = MutableCherenkovParticleID;
0143 using const_iterator = CherenkovParticleIDCollectionIterator;
0144 using iterator = CherenkovParticleIDMutableCollectionIterator;
0145 using difference_type = ptrdiff_t;
0146 using size_type = size_t;
0147 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
0148 using reverse_iterator = std::reverse_iterator<iterator>;
0149
0150 CherenkovParticleIDCollection() = default;
0151 CherenkovParticleIDCollection(CherenkovParticleIDCollectionData&& data, bool isSubsetColl);
0152
0153 CherenkovParticleIDCollection(const CherenkovParticleIDCollection& ) = delete;
0154 CherenkovParticleIDCollection& operator=(const CherenkovParticleIDCollection& ) = delete;
0155 CherenkovParticleIDCollection(CherenkovParticleIDCollection&&) = default;
0156 CherenkovParticleIDCollection& operator=(CherenkovParticleIDCollection&&) = default;
0157
0158 ~CherenkovParticleIDCollection() override;
0159 #if defined(__cpp_lib_containers_ranges)
0160 template<podio::detail::RangeConvertibleTo<value_type> R>
0161 CherenkovParticleIDCollection(std::from_range_t, R&& range);
0162 #endif
0163
0164
0165
0166 template<podio::detail::RangeConvertibleTo<value_type> R>
0167 static CherenkovParticleIDCollection from(R&& range);
0168
0169 constexpr static std::string_view typeName = "edm4eic::CherenkovParticleIDCollection";
0170 constexpr static std::string_view valueTypeName = "edm4eic::CherenkovParticleID";
0171 constexpr static std::string_view dataTypeName = "edm4eic::CherenkovParticleIDData";
0172
0173 void clear() final;
0174
0175
0176 static void __cppyy_pythonize__(PyObject* klass, const std::string& name){
0177 podio::detail::pythonizations::pythonize_subscript(klass, name);
0178 }
0179
0180
0181 void print(std::ostream& os=std::cout, bool flush=true) const final;
0182
0183
0184 MutableCherenkovParticleID create();
0185
0186
0187
0188 template<typename... Args>
0189 MutableCherenkovParticleID create(Args&&... args);
0190
0191
0192 std::size_t size() const final;
0193
0194
0195 std::size_t max_size() const final;
0196
0197
0198 bool empty() const final;
0199
0200
0201 const std::string_view getTypeName() const final { return typeName; }
0202
0203 const std::string_view getValueTypeName() const final { return valueTypeName; }
0204
0205 const std::string_view getDataTypeName() const final { return dataTypeName; }
0206
0207 podio::SchemaVersionT getSchemaVersion() const final;
0208
0209 bool isSubsetCollection() const final {
0210 return m_isSubsetColl;
0211 }
0212
0213 void setSubsetCollection(bool setSubset=true) final;
0214
0215
0216 CherenkovParticleID operator[](std::size_t index) const;
0217
0218 MutableCherenkovParticleID operator[](std::size_t index);
0219
0220 CherenkovParticleID at(std::size_t index) const;
0221
0222 MutableCherenkovParticleID at(std::size_t index);
0223
0224
0225
0226 void push_back(const MutableCherenkovParticleID& object);
0227
0228 void push_back(const CherenkovParticleID& object);
0229
0230 void prepareForWrite() const final;
0231 void prepareAfterRead() final;
0232 bool setReferences(const podio::ICollectionProvider* collectionProvider) final;
0233
0234
0235 podio::CollectionWriteBuffers getBuffers() final;
0236
0237 void setID(uint32_t ID) final {
0238 m_collectionID = ID;
0239 if (!m_isSubsetColl) {
0240 std::for_each(m_storage.entries.begin(), m_storage.entries.end(),
0241 [ID] (CherenkovParticleIDObj* obj) { obj->id = {obj->id.index, static_cast<uint32_t>(ID)}; }
0242 );
0243 }
0244 }
0245
0246 uint32_t getID() const final {
0247 return m_collectionID;
0248 }
0249
0250
0251 bool hasID() const final {
0252 return getID() != static_cast<uint32_t>(podio::ObjectID::untracked) &&
0253 getID() != static_cast<uint32_t>(podio::ObjectID::invalid);
0254 }
0255
0256 [[deprecated("isValid will be removed, use hasID() if you want to check if it has an ID, otherwise assume the "
0257 "collection is valid")]]
0258 bool isValid() const final {
0259 return hasID();
0260 }
0261
0262 size_t getDatamodelRegistryIndex() const final;
0263
0264
0265 iterator begin() {
0266 return iterator(0, &m_storage.entries);
0267 }
0268 const_iterator begin() const {
0269 return const_iterator(0, &m_storage.entries);
0270 }
0271 const_iterator cbegin() const {
0272 return begin();
0273 }
0274 iterator end() {
0275 return iterator(m_storage.entries.size(), &m_storage.entries);
0276 }
0277 const_iterator end() const {
0278 return const_iterator(m_storage.entries.size(), &m_storage.entries);
0279 }
0280 const_iterator cend() const {
0281 return end();
0282 }
0283
0284 reverse_iterator rbegin() {
0285 return reverse_iterator(end());
0286 }
0287 const_reverse_iterator rbegin() const {
0288 return const_reverse_iterator(end());
0289 }
0290 const_reverse_iterator crbegin() const {
0291 return rbegin();
0292 }
0293 reverse_iterator rend() {
0294 return reverse_iterator(begin());
0295 }
0296 const_reverse_iterator rend() const {
0297 return const_reverse_iterator(begin());
0298 }
0299 const_reverse_iterator crend() const {
0300 return rend();
0301 }
0302
0303
0304 std::vector<float> npe(const size_t nElem = 0) const;
0305 std::vector<float> refractiveIndex(const size_t nElem = 0) const;
0306 std::vector<float> photonEnergy(const size_t nElem = 0) const;
0307
0308 private:
0309
0310
0311
0312 friend class CherenkovParticleIDCollectionData;
0313
0314 mutable bool m_isPrepared{false};
0315 bool m_isSubsetColl{false};
0316 uint32_t m_collectionID{static_cast<uint32_t>(podio::ObjectID::untracked)};
0317 mutable std::unique_ptr<std::mutex> m_storageMtx{std::make_unique<std::mutex>()};
0318 mutable CherenkovParticleIDCollectionData m_storage{};
0319 };
0320
0321 std::ostream& operator<<(std::ostream& o, const CherenkovParticleIDCollection& v);
0322
0323 template<typename... Args>
0324 MutableCherenkovParticleID CherenkovParticleIDCollection::create(Args&&... args) {
0325 if (m_isSubsetColl) {
0326 throw std::logic_error("Cannot create new elements on a subset collection");
0327 }
0328 auto obj = new CherenkovParticleIDObj({static_cast<int>(m_storage.entries.size()), m_collectionID}, {std::forward<Args>(args)...});
0329 m_storage.entries.push_back(obj);
0330
0331
0332 obj->m_rawHitAssociations = new std::vector<edm4eic::MCRecoTrackerHitAssociation>();
0333 obj->m_hypotheses = new std::vector<edm4eic::CherenkovParticleIDHypothesis>();
0334 obj->m_thetaPhiPhotons = new std::vector<edm4hep::Vector2f>();
0335 m_storage.createRelations(obj);
0336 return MutableCherenkovParticleID(podio::utils::MaybeSharedPtr(obj));
0337 }
0338
0339
0340 #if defined(__cpp_lib_containers_ranges)
0341 template<podio::detail::RangeConvertibleTo<CherenkovParticleIDCollection::value_type> R>
0342 CherenkovParticleIDCollection::CherenkovParticleIDCollection(std::from_range_t, R&& range)
0343 : CherenkovParticleIDCollection() {
0344 setSubsetCollection(podio::detail::RangeOf<R, value_type>);
0345
0346 for (auto&& elem : range) {
0347 push_back(std::forward<decltype(elem)>(elem));
0348 }
0349 }
0350 #endif
0351
0352 template<podio::detail::RangeConvertibleTo<CherenkovParticleIDCollection::value_type> R>
0353 CherenkovParticleIDCollection CherenkovParticleIDCollection::from(R&& range) {
0354 CherenkovParticleIDCollection coll;
0355 if constexpr (podio::detail::RangeOf<R, value_type>) {
0356 coll.setSubsetCollection();
0357 }
0358
0359 for (auto&& elem : range) {
0360 coll.push_back(std::forward<decltype(elem)>(elem));
0361 }
0362
0363 return coll;
0364 }
0365
0366
0367 #if defined(PODIO_JSON_OUTPUT) && !defined(__CLING__)
0368 void to_json(nlohmann::json& j, const CherenkovParticleIDCollection& collection);
0369 #endif
0370
0371 }
0372
0373
0374
0375
0376
0377 #if defined(__clang__)
0378 #pragma clang diagnostic push
0379 #pragma clang diagnostic ignored "-Wunknown-warning-option"
0380 #pragma clang diagnostic ignored "-Wdeprecated-redundant-constexpr-static-def"
0381 #pragma clang diagnostic ignored "-Wdeprecated"
0382 constexpr std::string_view edm4eic::CherenkovParticleIDCollection::typeName;
0383 constexpr std::string_view edm4eic::CherenkovParticleIDCollection::valueTypeName;
0384 constexpr std::string_view edm4eic::CherenkovParticleIDCollection::dataTypeName;
0385 #pragma clang diagnostic pop
0386 #elif defined(__GNUC__)
0387 #pragma GCC diagnostic push
0388 #pragma GCC diagnostic ignored "-Wdeprecated"
0389 constexpr std::string_view edm4eic::CherenkovParticleIDCollection::typeName;
0390 constexpr std::string_view edm4eic::CherenkovParticleIDCollection::valueTypeName;
0391 constexpr std::string_view edm4eic::CherenkovParticleIDCollection::dataTypeName;
0392 #pragma GCC diagnostic pop
0393 #endif
0394
0395
0396 #endif