BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
ROBFragment.cxx
Go to the documentation of this file.
1// Dear emacs, this is -*- c++ -*-
2
3/**
4 * @file ROBFragment.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 ROB fragment writing helper class
11 */
12
13#include "eformat/write/ROBFragment.h"
14#include "eformat/HeaderMarker.h"
15#include "eformat/Status.h"
16#include "eformat/write/ROSFragment.h"
17#include "ers/StreamFactory.h"
18#include <cstring>
19
21 uint32_t lvl1_id, uint32_t bc_id, uint32_t lvl1_type,
22 uint32_t detev_type, uint32_t ndata,
23 const uint32_t* data, uint32_t status_position )
24 : m_parent( 0 ), m_next( 0 ) {
25 m_header[0] = eformat::ROB; // marker
26 m_header[1] = 21 + ndata; // total fragment size in words
27 m_header[2] = 8; // this header size + status size
28 m_header[3] = eformat::DEFAULT_VERSION; // format version
29 m_header[4] = source_id;
30 m_header[5] = 1; // number of status
31 m_header[6] = 0; // number of fragment specific
32 m_rod_header[0] = eformat::ROD; // ROD marker
33 m_rod_header[1] = 9; // ROD header size
34 m_rod_header[2] = eformat::DEFAULT_VERSION; // format version
35 m_rod_header[3] = source_id;
36 m_rod_header[4] = run_no;
37 m_rod_header[5] = lvl1_id;
38 m_rod_header[6] = bc_id;
39 m_rod_header[7] = lvl1_type;
40 m_rod_header[8] = detev_type;
41 m_rod_trailer[0] = 1; // number of status in the ROD
42 m_rod_trailer[1] = ndata; // number of data words in the ROD
43 m_rod_trailer[2] = status_position;
44
45 // now initialize pages
46 set( m_node[0], m_header, 6, &m_node[1] );
47 set( m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2] );
48 set( m_node[2], &m_header[6], 1, &m_node[3] ); // specific part
49 if ( m_rod_trailer[2] == eformat::STATUS_FRONT )
50 {
51 set( m_node[3], m_rod_header, 9, &m_node[4] );
52 set( m_node[4], &eformat::DEFAULT_STATUS, 1, &m_node[5] ); // status
53 set( m_node[5], data, ndata, &m_node[6] ); // data
54 }
55 else
56 {
57 set( m_node[3], m_rod_header, 9, &m_node[5] );
58 set( m_node[5], data, ndata, &m_node[4] ); // data
59 set( m_node[4], &eformat::DEFAULT_STATUS, 1, &m_node[6] ); // status
60 }
61 set( m_node[6], m_rod_trailer, 3, 0 );
62 ERS_DEBUG_3( "%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
63 "Built (write) rob/rod fragment from scratch, with", ROBFragment::source_id(),
65}
66
67eformat::write::ROBFragment::ROBFragment() : m_parent( 0 ), m_next( 0 ) {
68 m_header[0] = eformat::ROB; // marker
69 m_header[1] = 21;
70 m_header[2] = 8; // this header size + status size
71 m_header[3] = eformat::DEFAULT_VERSION; // format version
72 m_header[4] = 0; // source identifier of the ROB fragment
73 m_header[5] = 1; // number of status
74 m_header[6] = 0; // number of fragment specific
75 m_rod_header[0] = eformat::ROD; // ROD marker
76 m_rod_header[1] = 9; // ROD header size
77 m_rod_header[2] = eformat::DEFAULT_VERSION; // format version
78 m_rod_header[3] = 0; // source identifier of the ROD fragment
79 m_rod_header[4] = 0; // run number
80 m_rod_header[5] = 0; // LVL1 identifier
81 m_rod_header[6] = 0; // bunch crossing identifier
82 m_rod_header[7] = 0; // LVL1 type
83 m_rod_header[8] = 0; // detector event type
84 m_rod_trailer[0] = 1; // number of status in the ROD
85 m_rod_trailer[1] = 0; // number of data words in the ROD
86 m_rod_trailer[2] = eformat::STATUS_FRONT; // status block position
87
88 // now initialize pages
89 set( m_node[0], m_header, 6, &m_node[1] );
90 set( m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2] );
91 set( m_node[2], &m_header[6], 1, &m_node[3] ); // specific part
92 if ( m_rod_trailer[2] == eformat::STATUS_FRONT )
93 {
94 set( m_node[3], m_rod_header, 9, &m_node[4] );
95 set( m_node[4], &eformat::DEFAULT_STATUS, 1, &m_node[5] ); // status
96 set( m_node[5], 0, 0, &m_node[6] ); // data
97 }
98 else
99 {
100 set( m_node[3], m_rod_header, 9, &m_node[5] );
101 set( m_node[5], 0, 0, &m_node[4] ); // data
102 set( m_node[4], &eformat::DEFAULT_STATUS, 1, &m_node[6] ); // status
103 }
104 set( m_node[6], m_rod_trailer, 3, 0 );
105 ERS_DEBUG_3( "%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
106 "Built (write) empty rob/rod fragment, with", ROBFragment::source_id(),
107 rod_lvl1_id(), rod_run_no() );
108}
109
111 : m_parent( 0 ), m_next( 0 ) {
112 *this = other;
113 ERS_DEBUG_3( "%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
114 "Built new (write) rob/rod fragment from copy, with", ROBFragment::source_id(),
115 rod_lvl1_id(), rod_run_no() );
116}
117
119 : m_parent( 0 ), m_next( 0 ) {
120 m_header[0] = eformat::ROB; // marker
121 m_header[1] = 8 + size_word; // total fragment size in words
122 m_header[2] = 8; // this header size + status size
123 m_header[3] = eformat::DEFAULT_VERSION; // format version
124 m_header[4] = rod[3];
125 m_header[5] = 1; // number of status
126 m_header[6] = 0; // number of fragment specific
127
128 // now initialize pages
129 set( m_node[0], m_header, 6, &m_node[1] );
130 set( m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2] );
131 set( m_node[2], &m_header[6], 1, &m_node[3] );
132 set( m_node[6], &rod[size_word - 3], 3, 0 ); // ROD trailer
133 if ( m_node[6].base[2] == eformat::STATUS_FRONT )
134 {
135 set( m_node[3], rod, 9, &m_node[4] ); // ROD header
136 set( m_node[4], &rod[9], m_node[6].base[0], &m_node[5] ); // status
137 set( m_node[5], &rod[9 + m_node[6].base[0]], m_node[6].base[1], &m_node[6] );
138 }
139 else
140 {
141 set( m_node[3], rod, 9, &m_node[5] ); // ROD header
142 set( m_node[4], &rod[9 + m_node[6].base[1]], m_node[6].base[0], &m_node[6] );
143 set( m_node[5], &rod[9], m_node[6].base[1], &m_node[4] ); // data
144 }
145 ERS_DEBUG_3( "%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
146 "Built (write) rob/rod fragment from rod on memory, with", source_id(),
147 rod_lvl1_id(), rod_run_no() );
148}
149
150eformat::write::ROBFragment::ROBFragment( uint32_t* rob ) : m_parent( 0 ), m_next( 0 ) {
151 // now initialize pages
152 set( m_node[0], rob, 6, &m_node[1] );
153 set( m_node[1], &rob[6], rob[5], &m_node[2] );
154 set( m_node[2], &rob[6 + rob[5]], 1, &m_node[3] );
155 set( m_node[6], &rob[rob[1] - 3], 3, 0 ); // ROD trailer
156 if ( m_node[6].base[2] == eformat::STATUS_FRONT )
157 {
158 set( m_node[3], &rob[rob[2]], 9, &m_node[4] ); // ROD header
159 set( m_node[4], &rob[rob[2] + 9], m_node[6].base[0], &m_node[5] ); // status
160 set( m_node[5], &rob[rob[2] + 9 + m_node[6].base[0]], m_node[6].base[1],
161 &m_node[6] ); // data
162 }
163 else
164 {
165 set( m_node[3], &rob[rob[2]], 9, &m_node[5] ); // ROD header
166 set( m_node[4], &rob[rob[2] + 9 + m_node[6].base[1]], m_node[6].base[0], &m_node[6] );
167 set( m_node[5], &rob[rob[2] + 9], m_node[6].base[1], &m_node[4] ); // data
168 }
169 ERS_DEBUG_3( "%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
170 "Built (write) rob/rod fragment from cont. memory, with", source_id(),
171 rod_lvl1_id(), rod_run_no() );
172}
173
176 // get the ROB header
177 memcpy( reinterpret_cast<void*>( m_header ),
178 reinterpret_cast<const void*>( other.m_node[0].base ), 6 * sizeof( uint32_t ) );
179 m_header[6] = other.m_node[2].base[0];
180 memcpy( reinterpret_cast<void*>( m_rod_header ),
181 reinterpret_cast<const void*>( other.m_node[3].base ), 9 * sizeof( uint32_t ) );
182 memcpy( reinterpret_cast<void*>( m_rod_trailer ),
183 reinterpret_cast<const void*>( other.m_node[6].base ), 3 * sizeof( uint32_t ) );
184
185 // now re-initialize the pages
186 set( m_node[0], m_header, 6, &m_node[1] );
187 set( m_node[1], other.m_node[1].base, other.m_node[1].size_word, &m_node[2] );
188 set( m_node[2], &m_header[6], 1, &m_node[3] ); // specific part
189 if ( m_rod_trailer[2] == eformat::STATUS_FRONT )
190 {
191 set( m_node[3], m_rod_header, 9, &m_node[4] );
192 set( m_node[4], other.m_node[4].base, other.m_node[4].size_word, &m_node[5] ); // status
193 set( m_node[5], other.m_node[5].base, other.m_node[5].size_word, &m_node[6] ); // data
194 }
195 else
196 {
197 set( m_node[3], m_rod_header, 9, &m_node[5] );
198 set( m_node[5], other.m_node[5].base, other.m_node[5].size_word, &m_node[4] ); // data
199 set( m_node[4], other.m_node[4].base, other.m_node[4].size_word, &m_node[6] ); // status
200 }
201 set( m_node[6], m_rod_trailer, 3, 0 );
202 ERS_DEBUG_3( "%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
203 "Copied (write) rob/rod fragment with", ROBFragment::source_id(), rod_lvl1_id(),
204 rod_run_no() );
205
206 return *this;
207}
208
209void eformat::write::ROBFragment::status( uint32_t n, const uint32_t* status ) {
210 if ( m_parent )
211 m_parent->size_change( m_node[0].base[1], m_node[0].base[1] - m_node[0].base[5] + n );
212 m_node[0].base[1] -= m_node[0].base[5]; // remove count from previous status
213 m_node[0].base[2] -= m_node[0].base[5]; // remove count from previous status
214 m_node[1].size_word = m_node[0].base[5] = n; // set new values
215 m_node[0].base[1] += n;
216 m_node[0].base[2] += n;
217 m_node[1].base = const_cast<uint32_t*>( status );
218}
219
220void eformat::write::ROBFragment::rod_status( uint32_t n, const uint32_t* status ) {
221 if ( m_parent )
222 m_parent->size_change( m_node[0].base[1], m_node[0].base[1] - m_node[6].base[0] + n );
223 m_node[0].base[1] -= m_node[6].base[0]; // remove count from previous status
224 m_node[4].size_word = m_node[6].base[0] = n; // set new values
225 m_node[0].base[1] += n; // set ROB header's total fragment size
226 m_node[4].base = const_cast<uint32_t*>( status );
227}
228
230 if ( v == m_node[6].base[2] ) return; // do nothing in this case:)
231 m_node[6].base[2] = v;
232 if ( m_node[6].base[2] == eformat::STATUS_FRONT )
233 {
234 m_node[3].next = &m_node[4];
235 m_node[4].next = &m_node[5];
236 m_node[5].next = &m_node[6];
237 }
238 else
239 {
240 m_node[3].next = &m_node[5];
241 m_node[5].next = &m_node[4];
242 m_node[4].next = &m_node[6];
243 }
244}
245
246void eformat::write::ROBFragment::rod_data( uint32_t n, const uint32_t* data ) {
247 if ( m_parent )
248 m_parent->size_change( m_node[0].base[1], m_node[0].base[1] - m_node[6].base[1] + n );
249
250 // remove count from previous data size
251 m_node[0].base[1] -= m_node[6].base[1];
252 m_node[5].size_word = m_node[6].base[1] = n; // set new values
253 m_node[0].base[1] += n; // set ROB header's total fragment size back
254 m_node[5].base = const_cast<uint32_t*>( data );
255}
const Int_t n
TTree * data
#define ERS_DEBUG_3(...)
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
Definition KarLud.h:35
void status(uint32_t n, const uint32_t *status)
void status_position(uint32_t v)
ROBFragment & operator=(const ROBFragment &other)
void set(node_t &i, const uint32_t *b, size_t l, node_t *n=0)
Definition node.cxx:16
const uint32_t STATUS_FRONT
status goes in front of data block