Jpp  17.2.1-pre0
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 frame
90  */
91  JDAQFrame(const JDAQFrame& frame) :
92  numberOfHits(0),
93  buffer(NULL)
94  {
95  add(frame);
96  }
97 
98 
99  /**
100  * Move constructor.
101  *
102  * \param frame frame
103  */
104  JDAQFrame(JDAQFrame&& frame) :
105  numberOfHits(frame.numberOfHits),
106  buffer (frame.buffer)
107  {
108  frame.numberOfHits = 0;
109  frame.buffer = NULL;
110  }
111 
112 
113  /**
114  * Constructor.
115  *
116  * \param number_of_hits number of hits
117  * \param data pointer to data
118  */
119  JDAQFrame(const int number_of_hits, const JDAQHit* data) :
120  numberOfHits(0),
121  buffer(NULL)
122  {
123  add(number_of_hits, data);
124  }
125 
126 
127  /**
128  * Destructor.
129  */
130  virtual ~JDAQFrame()
131  {
132  clear();
133  }
134 
135 
136  /**
137  * Assignment operator.
138  *
139  * \param frame frame
140  * \return this frame
141  */
143  {
144  add(frame);
145 
146  return *this;
147  }
148 
149 
150  /**
151  * Clear data.
152  */
153  void clear()
154  {
155  if (buffer != NULL) {
156  free(buffer);
157  }
158 
159  numberOfHits = 0;
160  buffer = NULL;
161  }
162 
163 
164  const_iterator begin() const { return buffer; }
165  const_iterator end() const { return buffer + numberOfHits; }
166 
167 
168  iterator begin() { return buffer; }
169  iterator end() { return buffer + numberOfHits; }
170 
171 
174 
175 
178 
179 
180  bool empty() const { return numberOfHits == 0; }
181 
182  int size() const { return numberOfHits; }
183 
184  const JDAQHit* data() const { return buffer; }
185  JDAQHit* data() { return buffer; }
186 
187 
188  /**
189  * Get hit at given index.
190  *
191  * \param index index
192  * \return hit
193  */
194  const JDAQHit& operator[](int index) const
195  {
196  return buffer[index];
197  }
198 
199  /**
200  * Get subset of data.
201  *
202  * \param i1 first index of hit (included)
203  * \param i2 last index of hit (excluded)
204  * \return frame
205  */
206  JDAQFrameSubset subset(const int i1, const int i2) const
207  {
208  return JDAQFrameSubset(i2 - i1, buffer + i1);
209  }
210 
211 
212  /**
213  * Add data.
214  *
215  * \param frame frame
216  * \return this frame
217  */
218  JDAQFrame& add(const JDAQFrame& frame)
219  {
220  return add(frame.numberOfHits, frame.buffer);
221  }
222 
223 
224  /**
225  * Add data.
226  *
227  * \param number_of_hits number of hits
228  * \param data pointer to data
229  * \return this data frame
230  */
231  JDAQFrame& add(const int number_of_hits, const JDAQHit* data)
232  {
233  if (number_of_hits > 0) {
234 
235  resize(numberOfHits + number_of_hits);
236 
237  memcpy(buffer + numberOfHits - number_of_hits, data, number_of_hits * sizeof(JDAQHit));
238  }
239 
240  return *this;
241  }
242 
243 
244  /**
245  * Swap data.
246  *
247  * \param frame frame
248  */
249  void swap(JDAQFrame& frame)
250  {
251  std::swap(numberOfHits, frame.numberOfHits);
252  std::swap(buffer, frame.buffer);
253  }
254 
255 
256  int numberOfHits; // following comment line is used by rootcint
257  JDAQHit* buffer; // [numberOfHits]
258 
259 
260  ClassDef(JDAQFrame,1);
261 
262 
263  protected:
264  /**
265  * Resize internal buffer.
266  *
267  * This method increases the size of the buffer if necessary.
268  * Otherwise, the current size is maintained.
269  *
270  * \param number_of_hits total number of hits to allocate
271  */
272  void resize(const int number_of_hits)
273  {
274  if (number_of_hits > numberOfHits) {
275 
276  const int number_of_bytes = number_of_hits * sizeof(JDAQHit);
277 
278  if (buffer == NULL)
279  buffer = (JDAQHit*) malloc(number_of_bytes);
280  else
281  buffer = (JDAQHit*) realloc(buffer, number_of_bytes);
282 
283  if (buffer == NULL) {
284  throw JDAQException("JDAQFrame::resize(): Memory exception.");
285  }
286 
287  numberOfHits = number_of_hits;
288  }
289  }
290  };
291 
292 
293  /**
294  * Equal operator for DAQ frames.
295  *
296  * \param first frame
297  * \param second frame
298  * \result true if first frame equal to second; else false
299  */
300  inline bool operator==(const JDAQFrame& first,
301  const JDAQFrame& second)
302  {
303  if (first.size() == second.size()) {
304 
305  for (JDAQFrame::const_iterator p = first.begin(), q = second.begin(); p != first.end(); ++p, ++q) {
306  if (*p != *q) {
307  return false;
308  }
309  }
310 
311  return true;
312 
313  } else {
314 
315  return false;
316  }
317  }
318 
319 
320  /**
321  * Not-equal operator for DAQ frames.
322  *
323  * \param first frame
324  * \param second frame
325  * \result true if first frame not equal to second; else false
326  */
327  inline bool operator!=(const JDAQFrame& first,
328  const JDAQFrame& second)
329  {
330  return !(first == second);
331  }
332 }
333 
334 #endif
bool operator==(const JDAQChronometer &first, const JDAQChronometer &second)
Equal operator for DAQ chronometers.
void clear()
Clear data.
Definition: JDAQFrame.hh:153
Interface for binary output.
const JDAQHit * const_iterator
Definition: JDAQFrame.hh:26
JDAQFrame & operator=(const JDAQFrame &frame)
Assignment operator.
Definition: JDAQFrame.hh:142
bool empty() const
Definition: JDAQFrame.hh:180
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:184
const_iterator begin() const
Definition: JDAQFrame.hh:42
JDAQFrame()
Default constructor.
Definition: JDAQFrame.hh:80
const JDAQHit * const_iterator
Definition: JDAQFrame.hh:68
JDAQFrame(JDAQFrame &&frame)
Move constructor.
Definition: JDAQFrame.hh:104
const JDAQHit & operator[](int index) const
Get hit at given index.
Definition: JDAQFrame.hh:194
then echo The file $DIR KM3NeT_00000001_00000000 root already please rename or remove it first
const_reverse_iterator rend() const
Definition: JDAQFrame.hh:173
Subset of data frame.
Definition: JDAQFrame.hh:22
void resize(const int number_of_hits)
Resize internal buffer.
Definition: JDAQFrame.hh:272
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:177
Hit data structure.
Definition: JDAQHit.hh:34
const_iterator begin() const
Definition: JDAQFrame.hh:164
Data frame.
Definition: JDAQFrame.hh:64
JDAQFrame(const int number_of_hits, const JDAQHit *data)
Constructor.
Definition: JDAQFrame.hh:119
Interface for binary input.
JDAQFrame & add(const JDAQFrame &frame)
Add data.
Definition: JDAQFrame.hh:218
JDAQFrameSubset(const int number_of_hits, const JDAQHit *data)
Constructor.
Definition: JDAQFrame.hh:36
General exception.
JDAQHit * data()
Definition: JDAQFrame.hh:185
friend JWriter & operator<<(JWriter &, const JDAQFrame &)
Write DAQ frame to output.
Definition: JDAQFrameIO.hh:57
const_reverse_iterator rbegin() const
Definition: JDAQFrame.hh:172
virtual ~JDAQFrame()
Destructor.
Definition: JDAQFrame.hh:130
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:182
JDAQFrameSubset subset(const int i1, const int i2) const
Get subset of data.
Definition: JDAQFrame.hh:206
friend JReader & operator>>(JReader &, JDAQFrame &)
Read DAQ frame from input.
Definition: JDAQFrameIO.hh:34
reverse_iterator rbegin()
Definition: JDAQFrame.hh:176
JDAQFrame & add(const int number_of_hits, const JDAQHit *data)
Add data.
Definition: JDAQFrame.hh:231
const_iterator end() const
Definition: JDAQFrame.hh:165
void swap(JDAQFrame &frame)
Swap data.
Definition: JDAQFrame.hh:249