BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
FullEventFragment.cxx
Go to the documentation of this file.
1// Dear emacs, this is -*- c++ -*-
2
3/**
4 * @file SubDetectorFragment.cxx
5 * @author <a href="mailto:Andre.dos.Anjos@cern.ch">Andre DOS ANJOS</a>
6 * $Author: zhangy $
7 * $Revision: 1.1.1.1 $
8 * $Date: 2009/06/19 07:35:41 $
9 *
10 * Implements the SubDetector fragment writing helper class
11 */
12
13#include "eformat/write/FullEventFragment.h"
14#include "eformat/HeaderMarker.h"
15#include "eformat/Status.h"
16#include "eformat/write/SubDetectorFragment.h"
17#include "ers/StreamFactory.h"
18#include <ctime>
19
21 uint32_t global_id, uint32_t run_no,
22 uint32_t lvl1_id, uint32_t lvl1_type,
23 uint32_t lvl2_info,
24 const uint32_t* ef_info )
25 : m_child( 0 ), m_last( 0 ), m_extra_count( 0 ) {
26 m_header[0] = eformat::FULL_EVENT; // marker
27 m_header[1] = 18; // this header size + status size
28 m_header[2] = 18; // this header size + status size
29 m_header[3] = eformat::DEFAULT_VERSION; // format version
30 m_header[4] = source_id;
31 m_header[5] = 1; // number of status
32 m_header[6] = 10; // number of fragment specific
33 m_header[7] = use_time;
34 m_header[8] = global_id;
35 m_header[9] = run_no;
36 m_header[10] = lvl1_id;
37 m_header[11] = lvl1_type;
38 m_header[12] = lvl2_info;
39 memcpy( &m_header[13], ef_info, 4 * sizeof( uint32_t ) );
40
41 // now initialize pages
42 set( m_node[0], m_header, 6, &m_node[1] );
43 set( m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2] );
44 set( m_node[2], &m_header[6], 11, 0 );
45 ERS_DEBUG_3( "%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
46 "Built (write) full event from scratch, with", FullEventFragment::source_id(),
48}
49
51 uint32_t run_no, uint32_t lvl1_id,
52 uint32_t lvl1_type, uint32_t lvl2_info,
53 const uint32_t* ef_info )
54 : m_child( 0 ), m_last( 0 ), m_extra_count( 0 ) {
55 m_header[0] = eformat::FULL_EVENT; // marker
56 m_header[1] = 18; // this header size + status size
57 m_header[2] = 18; // this header size + status size
58 m_header[3] = eformat::DEFAULT_VERSION; // format version
59 m_header[4] = source_id;
60 m_header[5] = 1; // number of status
61 m_header[6] = 10; // number of fragment specific
62 m_header[7] = std::time( 0 );
63 m_header[8] = global_id;
64 m_header[9] = run_no;
65 m_header[10] = lvl1_id;
66 m_header[11] = lvl1_type;
67 m_header[12] = lvl2_info;
68 memcpy( &m_header[13], ef_info, 4 * sizeof( uint32_t ) );
69
70 // now initialize pages
71 set( m_node[0], m_header, 6, &m_node[1] );
72 set( m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2] );
73 set( m_node[2], &m_header[6], 11, 0 );
74 ERS_DEBUG_3( "%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
75 "Built (write) full event from scratch, with", FullEventFragment::source_id(),
77}
78
80 : m_child( 0 ), m_last( 0 ), m_extra_count( 0 ) {
81 // now initialize pages
82 set( m_node[0], fe, 6, &m_node[1] );
83 set( m_node[1], &fe[6], fe[5], &m_node[2] );
84 set( m_node[2], &fe[6 + fe[5]], 11, 0 );
85 eformat::write::set( m_extra, &fe[17 + fe[5]], fe[1] - fe[2], 0 );
86 ++m_extra_count;
87 ERS_DEBUG_3( "%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
88 "Built (write) full event from contiguos memory, with", source_id(), lvl1_id(),
89 run_no() );
90}
91
93 : m_child( 0 ), m_last( 0 ), m_extra_count( 0 ) {
94 // now initialize pages
95 set( m_node[0], fe->base, 6, &m_node[1] );
96 set( m_node[1], &fe->base[6], fe->base[5], &m_node[2] );
97 set( m_node[2], &fe->base[6 + fe->base[5]], 11, 0 );
98 eformat::write::set( m_extra, &fe->base[17 + fe->base[5]], fe->size_word - fe->base[2],
99 fe->next );
100 m_extra_count += eformat::write::count( m_extra );
101 ERS_DEBUG_3( "%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
102 "Built (write) full event from paged memory, with", source_id(), lvl1_id(),
103 run_no() );
104}
105
107 : m_child( 0 ), m_last( 0 ), m_extra_count( 0 ) {
108 m_header[0] = eformat::FULL_EVENT; // marker
109 m_header[1] = 18; // this header size + status size
110 m_header[2] = 18; // this header size + status size
111 m_header[3] = eformat::DEFAULT_VERSION; // format version
112 m_header[4] = 0; // source identifier
113 m_header[5] = 1; // number of status
114 m_header[6] = 10; // number of fragment specific
115 m_header[7] = std::time( 0 );
116 m_header[8] = 0; // global identifier
117 m_header[9] = 0; // run number
118 m_header[10] = 0; // LVL1 identifier
119 m_header[11] = 0; // LVL1 type
120 m_header[12] = 0; // LVL2 info
121 m_header[13] = 0; // EF info [0]
122 m_header[14] = 0; // EF info [1]
123 m_header[15] = 0; // EF info [2]
124 m_header[16] = 0; // EF info [3]
125
126 // now initialize pages
127 set( m_node[0], m_header, 6, &m_node[1] );
128 set( m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2] );
129 set( m_node[2], &m_header[6], 11, 0 );
130 ERS_DEBUG_3( "%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
131 "Built empty (write) full event from scratch, with",
134}
135
138 : m_child( 0 ), m_last( 0 ), m_extra_count( 0 ) {
139 *this = other;
140 ERS_DEBUG_3( "%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
141 "Built (write) full event from copy, with", FullEventFragment::source_id(),
143}
144
146 const eformat::write::FullEventFragment& other ) {
147 memcpy( reinterpret_cast<void*>( m_header ),
148 reinterpret_cast<const void*>( other.m_node[0].base ), 6 * sizeof( uint32_t ) );
149 memcpy( reinterpret_cast<void*>( m_header + 6 ),
150 reinterpret_cast<const void*>( other.m_node[2].base ), 11 * sizeof( uint32_t ) );
151
152 // now initialize pages
153 set( m_node[0], m_header, 6, &m_node[1] );
154 set( m_node[1], other.m_node[1].base, other.m_node[1].size_word, &m_node[2] );
155 set( m_node[2], &m_header[6], 11, 0 );
156 ERS_DEBUG_3( "%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
157 "Copied (write) full event, with", FullEventFragment::source_id(),
159 return *this;
160}
161
162void eformat::write::FullEventFragment::status( uint32_t n, const uint32_t* status ) {
163 m_node[0].base[1] -= m_node[0].base[5]; // remove count from previous status
164 m_node[0].base[2] -= m_node[0].base[5]; // remove count from previous status
165 m_node[1].size_word = m_node[0].base[5] = n; // set new values
166 m_node[0].base[1] += n;
167 m_node[0].base[2] += n;
168 m_node[1].base = const_cast<uint32_t*>( status );
169}
170
172 ERS_DEBUG_3( "%s Source Id. = 0x%x to full event with Source Id. = 0x%x",
173 "Appending subdetector with", sd->source_id(), source_id() );
174 sd->parent( this );
175 m_node[0].base[1] += sd->size_word();
176
177 // adjust `m_last' and `m_child' to point to the new last ROB
178 if ( m_last ) m_last->next( sd );
179 else m_child = sd;
180 m_last = sd;
181}
182
184 uint32_t retval = 3 + m_extra_count;
185 for ( const SubDetectorFragment* curr = m_child; curr; curr = curr->next() )
186 retval += curr->page_count();
187 return retval;
188}
189
191 // the header is already concatenated by construction
192 eformat::write::node_t* last = &m_node[2];
193 if ( m_extra_count )
194 {
195 last = &m_extra;
196 while ( last->next ) last = last->next;
197 }
198 for ( SubDetectorFragment* curr = m_child; curr;
199 curr = const_cast<SubDetectorFragment*>( curr->next() ) )
200 {
201 last->next = const_cast<eformat::write::node_t*>( curr->bind() );
202 while ( last->next ) last = last->next; // advance until end
203 }
204 return m_node;
205}
const Int_t n
#define ERS_DEBUG_3(...)
void append(eformat::write::SubDetectorFragment *sd)
const eformat::write::node_t * bind(void)
void status(uint32_t n, const uint32_t *status)
FullEventFragment & operator=(const FullEventFragment &other)
uint32_t count(const node_t &list)
Definition node.cxx:38
void set(node_t &i, const uint32_t *b, size_t l, node_t *n=0)
Definition node.cxx:16
uint32_t * base
The base address for this page.
size_t size_word
The size, in 4-byte words for this page.