Project
Loading...
Searching...
No Matches
EventHandler.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
13#include <optional>
14
15using namespace o2::phos;
16
17template <class CellInputType>
18EventHandler<CellInputType>::EventHandler(CellRange cells, TriggerRange triggers) : mTriggerRecordsCells(triggers),
19 mCells(cells)
20{
21}
22
23template <class CellInputType>
24EventHandler<CellInputType>::EventHandler(ClusterRange clusters, CellIndexRange cellIndices, TriggerRange triggersCluster, TriggerRange triggersCells) : mTriggerRecordsClusters(triggersCluster),
25 mTriggerRecordsCellIndices(triggersCells),
26 mClusters(clusters),
27 mClusterCellIndices(cellIndices)
28{
29}
30
31template <class CellInputType>
32EventHandler<CellInputType>::EventHandler(ClusterRange clusters, CellIndexRange cellIndices, CellRange cells, TriggerRange triggersCluster, TriggerRange triggersCellIndex, TriggerRange triggersCell) : mTriggerRecordsClusters(triggersCluster),
33 mTriggerRecordsCellIndices(triggersCellIndex),
34 mTriggerRecordsCells(triggersCell),
35 mClusters(clusters),
36 mClusterCellIndices(cellIndices),
37 mCells(cells)
38{
39}
40
41template <class CellInputType>
43{
44 int neventsClusters = mTriggerRecordsClusters.size(),
45 neventsCells = mTriggerRecordsCells.size();
46 if (neventsClusters) {
47 return neventsClusters;
48 } else if (neventsCells) {
49 return neventsCells;
50 } else {
51 return 0;
52 }
53}
54
55template <class CellInputType>
57{
58 std::optional<o2::InteractionRecord> irClusters, irCells;
59 if (mTriggerRecordsClusters.size()) {
60 if (static_cast<std::size_t>(eventID) >= mTriggerRecordsClusters.size()) {
61 throw RangeException(eventID, mTriggerRecordsClusters.size());
62 }
63 irClusters = mTriggerRecordsClusters[eventID].getBCData();
64 }
65 if (mTriggerRecordsCells.size()) {
66 if (static_cast<std::size_t>(eventID) >= mTriggerRecordsCells.size()) {
67 throw RangeException(eventID, mTriggerRecordsCells.size());
68 }
69 irCells = mTriggerRecordsCells[eventID].getBCData();
70 }
71 if (irClusters && irCells) {
72 if (compareInteractionRecords(irClusters.value(), irCells.value())) {
73 return irClusters.value();
74 } else {
75 throw InteractionRecordInvalidException(irClusters.value(), irCells.value());
76 }
77 } else if (irClusters) {
78 return irClusters.value();
79 } else if (irCells) {
80 return irCells.value();
81 }
83}
84
85template <class CellInputType>
87{
88 if (mTriggerRecordsClusters.size()) {
89 if (static_cast<std::size_t>(eventID) >= mTriggerRecordsClusters.size()) {
90 throw RangeException(eventID, mTriggerRecordsClusters.size());
91 }
92 auto& trgrecord = mTriggerRecordsClusters[eventID];
93 return ClusterRange(mClusters.data() + trgrecord.getFirstEntry(), trgrecord.getNumberOfObjects());
94 }
96}
97
98template <class CellInputType>
100{
101 if (mTriggerRecordsCells.size()) {
102 if (static_cast<std::size_t>(eventID) >= mTriggerRecordsCells.size()) {
103 throw RangeException(eventID, mTriggerRecordsCells.size());
104 }
105 auto& trgrecord = mTriggerRecordsCells[eventID];
106 return CellRange(mCells.data() + trgrecord.getFirstEntry(), trgrecord.getNumberOfObjects());
107 }
109}
110
111template <class CellInputType>
112std::vector<gsl::span<const o2::phos::MCLabel>> EventHandler<CellInputType>::getCellMCLabelForEvent(int eventID) const
113{
114 if (mCellLabels && mTriggerRecordsCells.size()) {
115 if (eventID >= mTriggerRecordsCells.size()) {
116 throw RangeException(eventID, mTriggerRecordsCells.size());
117 }
118 auto& trgrecord = mTriggerRecordsCells[eventID];
119 std::vector<gsl::span<const o2::phos::MCLabel>> eventlabels(trgrecord.getNumberOfObjects());
120 for (int index = 0; index < trgrecord.getNumberOfObjects(); index++) {
121 eventlabels[index] = mCellLabels->getLabels(trgrecord.getFirstEntry() + index);
122 }
123 return eventlabels;
124 }
126}
127
128template <class CellInputType>
130{
131 if (mTriggerRecordsCellIndices.size()) {
132 if (static_cast<std::size_t>(eventID) >= mTriggerRecordsCellIndices.size()) {
133 throw RangeException(eventID, mTriggerRecordsCellIndices.size());
134 }
135 auto& trgrecord = mTriggerRecordsCellIndices[eventID];
136 return CellIndexRange(mClusterCellIndices.data() + trgrecord.getFirstEntry(), trgrecord.getNumberOfObjects());
137 }
139}
140
141template <class CellInputType>
143{
144 mTriggerRecordsClusters = TriggerRange();
145 mTriggerRecordsCellIndices = TriggerRange();
146 mTriggerRecordsCells = TriggerRange();
147 mClusters = ClusterRange();
148 mClusterCellIndices = CellIndexRange();
149 mCells = CellRange();
150 mCellLabels = nullptr;
151}
152
153template <class CellInputType>
155{
156 EventData<CellInputType> outputEvent;
157 outputEvent.mInteractionRecord = getInteractionRecordForEvent(eventID);
158 if (hasClusters()) {
159 outputEvent.mClusters = getClustersForEvent(eventID);
160 }
161 if (hasClusterIndices()) {
162 outputEvent.mCellIndices = getClusterCellIndicesForEvent(eventID);
163 }
164 if (hasCells()) {
165 outputEvent.mCells = getCellsForEvent(eventID);
166 }
167 if (mCellLabels) {
168 outputEvent.mMCCellLabels = getCellMCLabelForEvent(eventID);
169 }
170
171 return outputEvent;
172}
173
174template <class CellInputType>
176{
177 return lhs.bc == rhs.bc && lhs.orbit == rhs.orbit;
178}
179
180template <class CellInputType>
181EventHandler<CellInputType>::EventIterator::EventIterator(const EventHandler<CellInputType>& handler, int eventID, bool forward) : mEventHandler(handler),
182 mCurrentEvent(),
183 mEventID(eventID),
184 mForward(forward)
185{
186 mCurrentEvent = mEventHandler.buildEvent(mEventID);
187}
188
189template <class CellInputType>
191{
192 return &mEventHandler == &rhs.mEventHandler && mEventID == rhs.mEventID && mForward == rhs.mForward;
193}
194
195template <class CellInputType>
197{
198 if (mForward) {
199 mEventID++;
200 } else {
201 mEventID--;
202 }
203 mCurrentEvent = mEventHandler.buildEvent(mEventID);
204 return *this;
205}
206
207template <class CellInputType>
209{
210 auto tmp = *this;
211 ++(*this);
212 return tmp;
213}
214
215template <class CellInputType>
217{
218 if (mForward) {
219 mEventID--;
220 } else {
221 mEventID++;
222 }
223 mCurrentEvent = mEventHandler.buildEvent(mEventID);
224 return *this;
225}
226
227template <class CellInputType>
229{
230 auto tmp = *this;
231 --(*this);
232 return tmp;
233}
234
EventIterator & operator++()
Prefix incrementation operator.
bool operator==(const EventIterator &rhs) const
Check for equalness.
EventIterator(const EventHandler &handler, int eventID, bool forward)
Constructor, initializing the iterator.
EventIterator & operator--()
Prefix decrementation operator.
Error handling in case the interaction records from various sources do not match.
Exception handling unitialized event handler.
Exception handling errors due to exceeding the range of triggers handled by the handler.
EventData< CellInputType > buildEvent(int eventID) const
Build event information for a given event number within the timeframe.
gsl::span< const CellInputType > CellRange
EventHandler()=default
Dummy constructor.
const CellRange getCellsForEvent(int eventID) const
Get range of cells belonging to the given event.
const CellIndexRange getClusterCellIndicesForEvent(int eventID) const
Get range of cluster cell indices belonging to the given event.
gsl::span< const int > CellIndexRange
const ClusterRange getClustersForEvent(int eventID) const
Get range of clusters belonging to the given event.
void reset()
Reset containers with empty ranges.
std::vector< gsl::span< const o2::phos::MCLabel > > getCellMCLabelForEvent(int eventID) const
Get vector of MC labels belonging to the given event.
InteractionRecord getInteractionRecordForEvent(int eventID) const
int getNumberOfEvents() const
gsl::span< const Cluster > ClusterRange
gsl::span< const TriggerRecord > TriggerRange
GLuint index
Definition glcorearb.h:781
InteractionRecord mInteractionRecord
Interaction record for the trigger corresponding to this event.
Definition EventData.h:29
std::vector< gsl::span< const o2::phos::MCLabel > > mMCCellLabels
span of MC labels for each cell
Definition EventData.h:33
gsl::span< const Cluster > mClusters
PHOS clusters.
Definition EventData.h:30
gsl::span< const int > mCellIndices
Cell indices in cluster.
Definition EventData.h:32
gsl::span< const InputType > mCells
PHOS cells / digits.
Definition EventData.h:31
std::vector< Cluster > clusters
std::vector< Cell > cells