Jpp  15.0.0-rc.2
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JDAQFrame.hh
Go to the documentation of this file.
1 #ifndef __JDAQFRAME__
2 #define __JDAQFRAME__
3 
4 #include <stdlib.h>
5 #include <string.h>
6 #include <iterator>
7 #include <algorithm>
8 
12 
13 
14 /**
15  * \author mdejong
16  */
17 namespace KM3NETDAQ {
18 
19  /**
20  * Subset of data frame.
21  **/
23  {
24  public:
25 
26  typedef const JDAQHit* const_iterator;
27  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
28 
29 
30  /**
31  * Constructor.
32  *
33  * \param number_of_hits number of hits
34  * \param data pointer to data
35  */
36  JDAQFrameSubset(const int number_of_hits, const JDAQHit* data) :
37  numberOfHits(number_of_hits),
38  buffer(data)
39  {}
40 
41 
42  const_iterator begin() const { return buffer; }
43  const_iterator end() const { return buffer + numberOfHits; }
44 
47 
48  bool empty() const { return numberOfHits == 0; }
49 
50  int size() const { return numberOfHits; }
51 
52  const JDAQHit* data() const { return buffer; }
53 
54 
55  private:
56  const int numberOfHits;
57  const JDAQHit* buffer;
58  };
59 
60 
61  /**
62  * Data frame.
63  */
64  class JDAQFrame
65  {
66  public:
67 
68  typedef const JDAQHit* const_iterator;
69  typedef JDAQHit* iterator;
70  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
71  typedef std::reverse_iterator<iterator> reverse_iterator;
72 
73  friend size_t getSizeof(const JDAQFrame&);
74  friend JReader& operator>>(JReader&, JDAQFrame&);
75  friend JWriter& operator<<(JWriter&, const JDAQFrame&);
76 
77  /**
78  * Default constructor.
79  */
81  numberOfHits(0),
82  buffer(NULL)
83  {}
84 
85 
86  /**
87  * Copy constructor.
88  *
89  * \param frame JDAQ frame
90  */
91  JDAQFrame(const JDAQFrame& frame) :
92  numberOfHits(0),
93  buffer(NULL)
94  {
95  add(frame);
96  }
97 
98 
99  /**
100  * Constructor.
101  *
102  * \param number_of_hits number of hits
103  * \param data pointer to data
104  */
105  JDAQFrame(const int number_of_hits, const JDAQHit* data) :
106  numberOfHits(0),
107  buffer(NULL)
108  {
109  add(number_of_hits, data);
110  }
111 
112 
113  /**
114  * Destructor.
115  */
116  virtual ~JDAQFrame()
117  {
118  clear();
119  }
120 
121 
122  /**
123  * Clear data.
124  */
125  void clear()
126  {
127  if (buffer != NULL) {
128  free(buffer);
129  }
130 
131  numberOfHits = 0;
132  buffer = NULL;
133  }
134 
135 
136  const_iterator begin() const { return buffer; }
137  const_iterator end() const { return buffer + numberOfHits; }
138 
139 
140  iterator begin() { return buffer; }
141  iterator end() { return buffer + numberOfHits; }
142 
143 
146 
147 
150 
151 
152  bool empty() const { return numberOfHits == 0; }
153 
154  int size() const { return numberOfHits; }
155 
156  const JDAQHit* data() const { return buffer; }
157  JDAQHit* data() { return buffer; }
158 
159 
160  /**
161  * Get hit at given index.
162  *
163  * \param index index
164  * \return hit
165  */
166  const JDAQHit& operator[](int index) const
167  {
168  return buffer[index];
169  }
170 
171  /**
172  * Get subset of data.
173  *
174  * \param i1 first index of hit (included)
175  * \param i2 last index of hit (excluded)
176  * \return JDAQ frame
177  */
178  JDAQFrameSubset subset(const int i1, const int i2) const
179  {
180  return JDAQFrameSubset(i2 - i1, buffer + i1);
181  }
182 
183 
184  /**
185  * Add data.
186  *
187  * \param frame JDAQ frame
188  * \return this JDAQ frame
189  */
190  JDAQFrame& add(const JDAQFrame& frame)
191  {
192  return add(frame.numberOfHits, frame.buffer);
193  }
194 
195 
196  /**
197  * Add data.
198  *
199  * \param number_of_hits number of hits
200  * \param data pointer to data
201  * \return this data frame
202  */
203  JDAQFrame& add(const int number_of_hits, const JDAQHit* data)
204  {
205  if (number_of_hits > 0) {
206 
207  resize(numberOfHits + number_of_hits);
208 
209  memcpy(buffer + numberOfHits - number_of_hits, data, number_of_hits * sizeof(JDAQHit));
210  }
211 
212  return *this;
213  }
214 
215 
216  /**
217  * Swap data.
218  *
219  * \param frame JDAQ frame
220  */
221  void swap(JDAQFrame& frame)
222  {
223  std::swap(numberOfHits, frame.numberOfHits);
224  std::swap(buffer, frame.buffer);
225  }
226 
227 
228  int numberOfHits; // following comment line is used by rootcint
229  JDAQHit* buffer; // [numberOfHits]
230 
231 
232  ClassDef(JDAQFrame,1);
233 
234 
235  protected:
236  /**
237  * Resize internal buffer.
238  *
239  * This method increases the size of the buffer if necessary.
240  * Otherwise, the current size is maintained.
241  *
242  * \param number_of_hits total number of hits to allocate
243  */
244  void resize(const int number_of_hits)
245  {
246  if (number_of_hits > numberOfHits) {
247 
248  const int number_of_bytes = number_of_hits * sizeof(JDAQHit);
249 
250  if (buffer == NULL)
251  buffer = (JDAQHit*) malloc(number_of_bytes);
252  else
253  buffer = (JDAQHit*) realloc(buffer, number_of_bytes);
254 
255  if (buffer == NULL)
256  throw JDAQException("JDAQFrame::resize(): Memory exception.");
257 
258  numberOfHits = number_of_hits;
259  }
260  }
261  };
262 
263 
264  /**
265  * Equal operator for DAQ frames.
266  *
267  * \param first frame
268  * \param second frame
269  * \result true if first frame equal to second; else false
270  */
271  inline bool operator==(const JDAQFrame& first,
272  const JDAQFrame& second)
273  {
274  if (first.size() == second.size()) {
275 
276  for (JDAQFrame::const_iterator p = first.begin(), q = second.begin(); p != first.end(); ++p, ++q) {
277  if (*p != *q) {
278  return false;
279  }
280  }
281 
282  return true;
283 
284  } else {
285 
286  return false;
287  }
288  }
289 
290 
291  /**
292  * Not-equal operator for DAQ frames.
293  *
294  * \param first frame
295  * \param second frame
296  * \result true if first frame not equal to second; else false
297  */
298  inline bool operator!=(const JDAQFrame& first,
299  const JDAQFrame& second)
300  {
301  return !(first == second);
302  }
303 }
304 
305 #endif
bool operator==(const JDAQChronometer &first, const JDAQChronometer &second)
Equal operator for DAQ chronometers.
void clear()
Clear data.
Definition: JDAQFrame.hh:125
Interface for binary output.
const JDAQHit * const_iterator
Definition: JDAQFrame.hh:26
bool empty() const
Definition: JDAQFrame.hh:152
std::reverse_iterator< iterator > reverse_iterator
Definition: JDAQFrame.hh:71
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: JDAQFrame.hh:27
friend size_t getSizeof(const JDAQFrame &)
Get size of object.
Definition: JDAQFrameIO.hh:21
const JDAQHit * data() const
Definition: JDAQFrame.hh:156
const_iterator begin() const
Definition: JDAQFrame.hh:42
JDAQFrame()
Default constructor.
Definition: JDAQFrame.hh:80
const JDAQHit * const_iterator
Definition: JDAQFrame.hh:68
const JDAQHit & operator[](int index) const
Get hit at given index.
Definition: JDAQFrame.hh:166
then echo The file $DIR KM3NeT_00000001_00000000 root already please rename or remove it first
const_reverse_iterator rend() const
Definition: JDAQFrame.hh:145
Subset of data frame.
Definition: JDAQFrame.hh:22
void resize(const int number_of_hits)
Resize internal buffer.
Definition: JDAQFrame.hh:244
JDAQFrame(const JDAQFrame &frame)
Copy constructor.
Definition: JDAQFrame.hh:91
ClassDef(JDAQFrame, 1)
const JDAQHit * data() const
Definition: JDAQFrame.hh:52
const_reverse_iterator rbegin() const
Definition: JDAQFrame.hh:45
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: JDAQFrame.hh:70
reverse_iterator rend()
Definition: JDAQFrame.hh:149
Hit data structure.
Definition: JDAQHit.hh:34
const_iterator begin() const
Definition: JDAQFrame.hh:136
Data frame.
Definition: JDAQFrame.hh:64
JDAQFrame(const int number_of_hits, const JDAQHit *data)
Constructor.
Definition: JDAQFrame.hh:105
Interface for binary input.
JDAQFrame & add(const JDAQFrame &frame)
Add data.
Definition: JDAQFrame.hh:190
JDAQFrameSubset(const int number_of_hits, const JDAQHit *data)
Constructor.
Definition: JDAQFrame.hh:36
General exception.
JDAQHit * data()
Definition: JDAQFrame.hh:157
friend JWriter & operator<<(JWriter &, const JDAQFrame &)
Write DAQ frame to output.
Definition: JDAQFrameIO.hh:57
const_reverse_iterator rbegin() const
Definition: JDAQFrame.hh:144
virtual ~JDAQFrame()
Destructor.
Definition: JDAQFrame.hh:116
const JDAQHit * buffer
Definition: JDAQFrame.hh:57
const_reverse_iterator rend() const
Definition: JDAQFrame.hh:46
const_iterator end() const
Definition: JDAQFrame.hh:43
bool operator!=(const JDAQChronometer &first, const JDAQChronometer &second)
Not-equal operator for DAQ chronometers.
JDAQHit * iterator
Definition: JDAQFrame.hh:69
int size() const
Definition: JDAQFrame.hh:154
JDAQFrameSubset subset(const int i1, const int i2) const
Get subset of data.
Definition: JDAQFrame.hh:178
friend JReader & operator>>(JReader &, JDAQFrame &)
Read DAQ frame from input.
Definition: JDAQFrameIO.hh:34
reverse_iterator rbegin()
Definition: JDAQFrame.hh:148
JDAQFrame & add(const int number_of_hits, const JDAQHit *data)
Add data.
Definition: JDAQFrame.hh:203
const_iterator end() const
Definition: JDAQFrame.hh:137
void swap(JDAQFrame &frame)
Swap data.
Definition: JDAQFrame.hh:221