00001
00002
00013 #ifndef EFORMAT_WRITE_FULLEVENTFRAGMENT_H
00014 #define EFORMAT_WRITE_FULLEVENTFRAGMENT_H
00015
00016 #include "eformat/write/SubDetectorFragment.h"
00017 #include <cstring>
00018
00019 namespace eformat {
00020
00021 namespace write {
00022
00026 class FullEventFragment {
00027
00028 public:
00029
00044 FullEventFragment (uint32_t source_id,
00045 uint32_t global_id, uint32_t run_no,
00046 uint32_t lvl1_id, uint32_t lvl1_type,
00047 uint32_t lvl2_info, const uint32_t* ef_info);
00048
00064 FullEventFragment (uint32_t source_id, uint32_t use_time,
00065 uint32_t global_id, uint32_t run_no,
00066 uint32_t lvl1_id, uint32_t lvl1_type,
00067 uint32_t lvl2_info, const uint32_t* ef_info);
00068
00075 FullEventFragment (uint32_t* fe);
00076
00087 FullEventFragment (eformat::write::node_t* fe);
00088
00093 FullEventFragment ();
00094
00106 FullEventFragment (const FullEventFragment& other);
00107
00111 virtual ~FullEventFragment () {}
00112
00124 FullEventFragment& operator= (const FullEventFragment& other);
00125
00134 void status (uint32_t n, const uint32_t* status);
00135
00139 inline uint32_t nstatus (void) const { return m_node[0].base[5]; }
00140
00144 inline const uint32_t* status (void) const { return m_node[1].base; }
00145
00151 inline void minor_version (uint16_t v)
00152 { m_node[0].base[3] = eformat::DEFAULT_VERSION | v; }
00153
00157 inline uint16_t minor_version (void) const
00158 { return 0xffff & m_node[0].base[3]; }
00159
00165 inline void source_id (uint32_t s)
00166 { m_node[0].base[4] = s; }
00167
00171 inline uint32_t source_id (void) const
00172 { return m_node[0].base[4]; }
00173
00179 inline void time (uint32_t s)
00180 { m_node[2].base[1] = s; }
00181
00185 inline uint32_t time (void) const
00186 { return m_node[2].base[1]; }
00187
00193 inline void global_id (uint32_t s)
00194 { m_node[2].base[2] = s; }
00195
00199 inline uint32_t global_id (void) const
00200 { return m_node[2].base[2]; }
00201
00207 inline void run_no (uint32_t s)
00208 { m_node[2].base[3] = s; }
00209
00213 inline uint32_t run_no (void) const
00214 { return m_node[2].base[3]; }
00215
00221 inline void lvl1_id (uint32_t s)
00222 { m_node[2].base[4] = s; }
00223
00227 inline uint32_t lvl1_id (void) const
00228 { return m_node[2].base[4]; }
00229
00235 inline void lvl1_trigger_type (uint32_t s)
00236 { m_node[2].base[5] = s; }
00237
00241 inline uint32_t lvl1_trigger_type (void) const
00242 { return m_node[2].base[5]; }
00243
00249 inline void lvl2_trigger_info (uint32_t s)
00250 { m_node[2].base[6] = s; }
00251
00255 inline uint32_t lvl2_trigger_info (void) const
00256 { return m_node[2].base[6]; }
00257
00263 inline void event_filter_info (const uint32_t* s)
00264 { memcpy(&m_node[2].base[7], s, 4*sizeof(uint32_t)); }
00265
00269 inline const uint32_t* event_filter_info (void) const
00270 { return &m_node[2].base[7]; }
00271
00277 inline uint32_t meta_size_word (void) const
00278 { return m_node[0].base[2]; }
00279
00283 inline uint32_t size_word (void) const
00284 { return m_node[0].base[1]; }
00285
00299 void append (eformat::write::SubDetectorFragment* sd);
00300
00306 inline const SubDetectorFragment* first_child (void) const
00307 { return m_child; }
00308
00316 inline void size_change (uint32_t o, uint32_t n)
00317 { m_node[0].base[1] -= o; m_node[0].base[1] += n; }
00318
00328 uint32_t page_count (void) const;
00329
00335 const eformat::write::node_t* bind (void);
00336
00337 const eformat::write::node_t* rebind (void){return m_node;};
00338 private:
00339
00340 uint32_t m_header[17];
00341 eformat::write::node_t m_node[3];
00342 eformat::write::SubDetectorFragment* m_child;
00343 eformat::write::SubDetectorFragment* m_last;
00344 eformat::write::node_t m_extra;
00345 uint32_t m_extra_count;
00346
00347 };
00348
00349 }
00350
00351 }
00352
00353 #endif