00001
00002
00013 #include "eformat/write/SubDetectorFragment.h"
00014 #include "eformat/write/FullEventFragment.h"
00015 #include "eformat/HeaderMarker.h"
00016 #include "eformat/Status.h"
00017 #include "ers/StreamFactory.h"
00018 #include <ctime>
00019
00020 eformat::write::FullEventFragment::FullEventFragment
00021 (uint32_t source_id, uint32_t use_time,
00022 uint32_t global_id, uint32_t run_no,
00023 uint32_t lvl1_id, uint32_t lvl1_type,
00024 uint32_t lvl2_info, const uint32_t* ef_info)
00025 : m_child(0),
00026 m_last(0),
00027 m_extra_count(0)
00028 {
00029 m_header[0] = eformat::FULL_EVENT;
00030 m_header[1] = 18;
00031 m_header[2] = 18;
00032 m_header[3] = eformat::DEFAULT_VERSION;
00033 m_header[4] = source_id;
00034 m_header[5] = 1;
00035 m_header[6] = 10;
00036 m_header[7] = use_time;
00037 m_header[8] = global_id;
00038 m_header[9] = run_no;
00039 m_header[10] = lvl1_id;
00040 m_header[11] = lvl1_type;
00041 m_header[12] = lvl2_info;
00042 memcpy(&m_header[13], ef_info, 4*sizeof(uint32_t));
00043
00044
00045 set(m_node[0], m_header, 6, &m_node[1]);
00046 set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00047 set(m_node[2], &m_header[6], 11, 0);
00048 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
00049 "Built (write) full event from scratch, with",
00050 FullEventFragment::source_id(), FullEventFragment::lvl1_id(),
00051 FullEventFragment::run_no());
00052 }
00053
00054 eformat::write::FullEventFragment::FullEventFragment
00055 (uint32_t source_id, uint32_t global_id, uint32_t run_no,
00056 uint32_t lvl1_id, uint32_t lvl1_type,
00057 uint32_t lvl2_info, const uint32_t* ef_info)
00058 : m_child(0),
00059 m_last(0),
00060 m_extra_count(0)
00061 {
00062 m_header[0] = eformat::FULL_EVENT;
00063 m_header[1] = 18;
00064 m_header[2] = 18;
00065 m_header[3] = eformat::DEFAULT_VERSION;
00066 m_header[4] = source_id;
00067 m_header[5] = 1;
00068 m_header[6] = 10;
00069 m_header[7] = std::time(0);
00070 m_header[8] = global_id;
00071 m_header[9] = run_no;
00072 m_header[10] = lvl1_id;
00073 m_header[11] = lvl1_type;
00074 m_header[12] = lvl2_info;
00075 memcpy(&m_header[13], ef_info, 4*sizeof(uint32_t));
00076
00077
00078 set(m_node[0], m_header, 6, &m_node[1]);
00079 set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00080 set(m_node[2], &m_header[6], 11, 0);
00081 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
00082 "Built (write) full event from scratch, with",
00083 FullEventFragment::source_id(), FullEventFragment::lvl1_id(),
00084 FullEventFragment::run_no());
00085 }
00086
00087 eformat::write::FullEventFragment::FullEventFragment (uint32_t* fe)
00088 : m_child(0),
00089 m_last(0),
00090 m_extra_count(0)
00091 {
00092
00093 set(m_node[0], fe, 6, &m_node[1]);
00094 set(m_node[1], &fe[6], fe[5], &m_node[2]);
00095 set(m_node[2], &fe[6+fe[5]], 11, 0);
00096 eformat::write::set(m_extra, &fe[17+fe[5]], fe[1]-fe[2], 0);
00097 ++m_extra_count;
00098 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
00099 "Built (write) full event from contiguos memory, with",
00100 source_id(), lvl1_id(), run_no());
00101 }
00102
00103 eformat::write::FullEventFragment::FullEventFragment
00104 (eformat::write::node_t* fe)
00105 : m_child(0),
00106 m_last(0),
00107 m_extra_count(0)
00108 {
00109
00110 set(m_node[0], fe->base, 6, &m_node[1]);
00111 set(m_node[1], &fe->base[6], fe->base[5], &m_node[2]);
00112 set(m_node[2], &fe->base[6+fe->base[5]], 11, 0);
00113 eformat::write::set(m_extra, &fe->base[17+fe->base[5]],
00114 fe->size_word - fe->base[2], fe->next);
00115 m_extra_count += eformat::write::count(m_extra);
00116 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
00117 "Built (write) full event from paged memory, with",
00118 source_id(), lvl1_id(), run_no());
00119 }
00120
00121 eformat::write::FullEventFragment::FullEventFragment ()
00122 : m_child(0),
00123 m_last(0),
00124 m_extra_count(0)
00125 {
00126 m_header[0] = eformat::FULL_EVENT;
00127 m_header[1] = 18;
00128 m_header[2] = 18;
00129 m_header[3] = eformat::DEFAULT_VERSION;
00130 m_header[4] = 0;
00131 m_header[5] = 1;
00132 m_header[6] = 10;
00133 m_header[7] = std::time(0);
00134 m_header[8] = 0;
00135 m_header[9] = 0;
00136 m_header[10] = 0;
00137 m_header[11] = 0;
00138 m_header[12] = 0;
00139 m_header[13] = 0;
00140 m_header[14] = 0;
00141 m_header[15] = 0;
00142 m_header[16] = 0;
00143
00144
00145 set(m_node[0], m_header, 6, &m_node[1]);
00146 set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00147 set(m_node[2], &m_header[6], 11, 0);
00148 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
00149 "Built empty (write) full event from scratch, with",
00150 FullEventFragment::source_id(), FullEventFragment::lvl1_id(),
00151 FullEventFragment::run_no());
00152 }
00153
00154 eformat::write::FullEventFragment::FullEventFragment
00155 (const eformat::write::FullEventFragment& other)
00156 : m_child(0),
00157 m_last(0),
00158 m_extra_count(0)
00159 {
00160 *this = other;
00161 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
00162 "Built (write) full event from copy, with",
00163 FullEventFragment::source_id(), FullEventFragment::lvl1_id(),
00164 FullEventFragment::run_no());
00165 }
00166
00167 eformat::write::FullEventFragment&
00168 eformat::write::FullEventFragment::operator=
00169 (const eformat::write::FullEventFragment& other)
00170 {
00171 memcpy(reinterpret_cast<void*>(m_header),
00172 reinterpret_cast<const void*>(other.m_node[0].base),
00173 6*sizeof(uint32_t));
00174 memcpy(reinterpret_cast<void*>(m_header+6),
00175 reinterpret_cast<const void*>(other.m_node[2].base),
00176 11*sizeof(uint32_t));
00177
00178
00179 set(m_node[0], m_header, 6, &m_node[1]);
00180 set(m_node[1], other.m_node[1].base, other.m_node[1].size_word, &m_node[2]);
00181 set(m_node[2], &m_header[6], 11, 0);
00182 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
00183 "Copied (write) full event, with",
00184 FullEventFragment::source_id(), FullEventFragment::lvl1_id(),
00185 FullEventFragment::run_no());
00186 return *this;
00187 }
00188
00189 void eformat::write::FullEventFragment::status
00190 (uint32_t n, const uint32_t* status)
00191 {
00192 m_node[0].base[1] -= m_node[0].base[5];
00193 m_node[0].base[2] -= m_node[0].base[5];
00194 m_node[1].size_word = m_node[0].base[5] = n;
00195 m_node[0].base[1] += n;
00196 m_node[0].base[2] += n;
00197 m_node[1].base = const_cast<uint32_t*>(status);
00198 }
00199
00200 void eformat::write::FullEventFragment::append
00201 (eformat::write::SubDetectorFragment* sd)
00202 {
00203 ERS_DEBUG_3("%s Source Id. = 0x%x to full event with Source Id. = 0x%x",
00204 "Appending subdetector with",
00205 sd->source_id(), source_id());
00206 sd->parent(this);
00207 m_node[0].base[1] += sd->size_word();
00208
00209
00210 if (m_last) m_last->next(sd);
00211 else m_child = sd;
00212 m_last = sd;
00213 }
00214
00215 uint32_t eformat::write::FullEventFragment::page_count (void) const
00216 {
00217 uint32_t retval = 3 + m_extra_count;
00218 for (const SubDetectorFragment* curr = m_child; curr; curr = curr->next())
00219 retval += curr->page_count();
00220 return retval;
00221 }
00222
00223 const eformat::write::node_t*
00224 eformat::write::FullEventFragment::bind (void)
00225 {
00226
00227 eformat::write::node_t* last = &m_node[2];
00228 if (m_extra_count) {
00229 last = &m_extra;
00230 while (last->next) last = last->next;
00231 }
00232 for (SubDetectorFragment* curr = m_child; curr;
00233 curr = const_cast<SubDetectorFragment*>(curr->next())) {
00234 last->next = const_cast<eformat::write::node_t*>(curr->bind());
00235 while (last->next) last = last->next;
00236 }
00237 return m_node;
00238 }