3#ifndef EICD_PMTHitCollection_H
4#define EICD_PMTHitCollection_H
14#include "podio/ICollectionProvider.h"
15#include "podio/CollectionBase.h"
16#include "podio/CollectionIDTable.h"
18#ifdef PODIO_JSON_OUTPUT
19#include "nlohmann/json.hpp"
43 return m_index != x.m_index;
65 return m_index != x.m_index;
107 template<
typename... Args>
111 size_t size() const final;
114 std::
string getTypeName() const final {
return std::string(
"eicd::PMTHitCollection"); }
121 return m_isSubsetColl;
127 PMTHit operator[](
unsigned int index) const;
131 PMTHit at(
unsigned int index) const;
141 bool setReferences(const podio::ICollectionProvider* collectionProvider) final;
148 if (!m_isSubsetColl) {
150 [ID] (
PMTHitObj* obj) { obj->id = {obj->id.index, static_cast<int>(ID)}; }
157 return m_collectionID;
166 return iterator(0, &m_storage.entries);
172 return iterator(m_storage.entries.size(), &m_storage.entries);
175 return const_iterator(m_storage.entries.size(), &m_storage.entries);
178 template<
size_t arraysize>
179 const std::array<std::uint64_t, arraysize> cellID()
const;
180 template<
size_t arraysize>
181 const std::array<float, arraysize> npe()
const;
182 template<
size_t arraysize>
183 const std::array<float, arraysize> time()
const;
184 template<
size_t arraysize>
185 const std::array<float, arraysize> timeError()
const;
186 template<
size_t arraysize>
187 const std::array<edm4hep::Vector3f, arraysize> position()
const;
188 template<
size_t arraysize>
189 const std::array<edm4hep::Vector3f, arraysize> dimension()
const;
190 template<
size_t arraysize>
191 const std::array<std::int32_t, arraysize> sector()
const;
192 template<
size_t arraysize>
193 const std::array<edm4hep::Vector3f, arraysize> local()
const;
201 bool m_isValid{
false};
202 mutable bool m_isPrepared{
false};
203 bool m_isSubsetColl{
false};
204 int m_collectionID{0};
205 mutable std::unique_ptr<std::mutex> m_storageMtx{std::make_unique<std::mutex>()};
206 mutable PMTHitCollectionData m_storage{};
209std::ostream&
operator<<(std::ostream& o,
const PMTHitCollection& v);
211template<
typename... Args>
213 if (m_isSubsetColl) {
214 throw std::logic_error(
"Cannot create new elements on a subset collection");
216 const int size = m_storage.entries.size();
217 auto obj =
new PMTHitObj({size, m_collectionID}, {std::forward<Args>(args)...});
218 m_storage.entries.push_back(obj);
223template<
size_t arraysize>
224const std::array<std::uint64_t, arraysize> PMTHitCollection::cellID()
const {
225 std::array<std::uint64_t, arraysize> tmp{};
226 const auto valid_size = std::min(arraysize, m_storage.entries.size());
227 for (
unsigned i = 0; i < valid_size; ++i) {
228 tmp[i] = m_storage.entries[i]->data.cellID;
233template<
size_t arraysize>
234const std::array<float, arraysize> PMTHitCollection::npe()
const {
235 std::array<float, arraysize> tmp{};
236 const auto valid_size = std::min(arraysize, m_storage.entries.size());
237 for (
unsigned i = 0; i < valid_size; ++i) {
238 tmp[i] = m_storage.entries[i]->data.npe;
243template<
size_t arraysize>
244const std::array<float, arraysize> PMTHitCollection::time()
const {
245 std::array<float, arraysize> tmp{};
246 const auto valid_size = std::min(arraysize, m_storage.entries.size());
247 for (
unsigned i = 0; i < valid_size; ++i) {
248 tmp[i] = m_storage.entries[i]->data.time;
253template<
size_t arraysize>
254const std::array<float, arraysize> PMTHitCollection::timeError()
const {
255 std::array<float, arraysize> tmp{};
256 const auto valid_size = std::min(arraysize, m_storage.entries.size());
257 for (
unsigned i = 0; i < valid_size; ++i) {
258 tmp[i] = m_storage.entries[i]->data.timeError;
263template<
size_t arraysize>
264const std::array<edm4hep::Vector3f, arraysize> PMTHitCollection::position()
const {
265 std::array<edm4hep::Vector3f, arraysize> tmp{};
266 const auto valid_size = std::min(arraysize, m_storage.entries.size());
267 for (
unsigned i = 0; i < valid_size; ++i) {
268 tmp[i] = m_storage.entries[i]->data.position;
273template<
size_t arraysize>
274const std::array<edm4hep::Vector3f, arraysize> PMTHitCollection::dimension()
const {
275 std::array<edm4hep::Vector3f, arraysize> tmp{};
276 const auto valid_size = std::min(arraysize, m_storage.entries.size());
277 for (
unsigned i = 0; i < valid_size; ++i) {
278 tmp[i] = m_storage.entries[i]->data.dimension;
283template<
size_t arraysize>
284const std::array<std::int32_t, arraysize> PMTHitCollection::sector()
const {
285 std::array<std::int32_t, arraysize> tmp{};
286 const auto valid_size = std::min(arraysize, m_storage.entries.size());
287 for (
unsigned i = 0; i < valid_size; ++i) {
288 tmp[i] = m_storage.entries[i]->data.sector;
293template<
size_t arraysize>
294const std::array<edm4hep::Vector3f, arraysize> PMTHitCollection::local()
const {
295 std::array<edm4hep::Vector3f, arraysize> tmp{};
296 const auto valid_size = std::min(arraysize, m_storage.entries.size());
297 for (
unsigned i = 0; i < valid_size; ++i) {
298 tmp[i] = m_storage.entries[i]->data.local;
304#ifdef PODIO_JSON_OUTPUT
Definition: MutablePMTHit.h:28
Definition: PMTHitCollectionData.h:28
PMTHitObjPointerContainer entries
Definition: PMTHitCollectionData.h:33
Definition: PMTHitCollection.h:82
iterator end()
Definition: PMTHitCollection.h:171
void prepareForWrite() const final
Definition: PMTHitCollection.cc:68
void setSubsetCollection(bool setSubset=true) final
Definition: PMTHitCollection.cc:41
std::string getDataTypeName() const final
fully qualified type name of stored POD elements - with namespace
Definition: PMTHitCollection.h:118
podio::CollectionBuffers getBuffers() final
Get the collection buffers for this collection.
Definition: PMTHitCollection.cc:133
PMTHitCollection & operator=(PMTHitCollection &&)=default
bool isValid() const final
Definition: PMTHitCollection.h:160
PMTHitCollection(PMTHitCollection &&)=default
const_iterator begin() const
Definition: PMTHitCollection.h:168
std::string getTypeName() const final
fully qualified type name
Definition: PMTHitCollection.h:114
MutablePMTHit create()
Append a new object to the collection, and return this object.
Definition: PMTHitCollection.cc:52
std::string getValueTypeName() const final
fully qualified type name of elements - with namespace
Definition: PMTHitCollection.h:116
bool isSubsetCollection() const final
Definition: PMTHitCollection.h:120
void setID(unsigned ID) final
Definition: PMTHitCollection.h:146
PMTHitCollection()
Definition: PMTHitCollection.cc:13
unsigned getID() const final
Definition: PMTHitCollection.h:156
PMTHitCollection(const PMTHitCollection &)=delete
iterator begin()
Definition: PMTHitCollection.h:165
PMTHit at(unsigned int index) const
Returns the const object of given index.
Definition: PMTHitCollection.cc:25
void push_back(PMTHit object)
Append object to the collection.
Definition: PMTHitCollection.cc:108
PMTHitCollection & operator=(const PMTHitCollection &)=delete
size_t size() const final
number of elements in the collection
Definition: PMTHitCollection.cc:37
bool setReferences(const podio::ICollectionProvider *collectionProvider) final
Definition: PMTHitCollection.cc:104
void clear() final
Definition: PMTHitCollection.cc:63
const_iterator end() const
Definition: PMTHitCollection.h:174
void prepareAfterRead() final
Definition: PMTHitCollection.cc:89
~PMTHitCollection()
Definition: PMTHitCollection.cc:16
Definition: PMTHitCollection.h:35
PMTHitCollectionIterator & operator++()
Definition: PMTHitCollection.cc:157
PMTHit * operator->()
Definition: PMTHitCollection.cc:152
PMTHit operator*()
Definition: PMTHitCollection.cc:147
PMTHitCollectionIterator & operator=(const PMTHitCollectionIterator &)=delete
PMTHitCollectionIterator(size_t index, const PMTHitObjPointerContainer *collection)
Definition: PMTHitCollection.h:37
PMTHitCollectionIterator(const PMTHitCollectionIterator &)=delete
bool operator!=(const PMTHitCollectionIterator &x) const
Definition: PMTHitCollection.h:42
Definition: PMTHitCollection.h:57
bool operator!=(const PMTHitMutableCollectionIterator &x) const
Definition: PMTHitCollection.h:64
PMTHitMutableCollectionIterator & operator=(const PMTHitMutableCollectionIterator &)=delete
MutablePMTHit * operator->()
Definition: PMTHitCollection.cc:169
PMTHitMutableCollectionIterator(const PMTHitMutableCollectionIterator &)=delete
PMTHitMutableCollectionIterator & operator++()
Definition: PMTHitCollection.cc:174
PMTHitMutableCollectionIterator(size_t index, const PMTHitObjPointerContainer *collection)
Definition: PMTHitCollection.h:59
MutablePMTHit operator*()
Definition: PMTHitCollection.cc:164
Definition: PMTHitObj.h:17
Definition: CalorimeterHit.cc:13
std::deque< PMTHitObj * > PMTHitObjPointerContainer
Definition: PMTHitCollectionData.h:20
std::ostream & operator<<(std::ostream &o, const CalorimeterHit &value)
Definition: CalorimeterHit.cc:93