/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Event/eformat/eformat-00-00-04/src/write/FullEventFragment.cxx

Go to the documentation of this file.
00001 //Dear emacs, this is -*- c++ -*-
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; //marker
00030   m_header[1] = 18; //this header size + status size
00031   m_header[2] = 18; //this header size + status size
00032   m_header[3] = eformat::DEFAULT_VERSION; //format version
00033   m_header[4] = source_id;
00034   m_header[5] = 1; //number of status
00035   m_header[6] = 10; //number of fragment specific
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   //now initialize pages
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; //marker
00063   m_header[1] = 18; //this header size + status size
00064   m_header[2] = 18; //this header size + status size
00065   m_header[3] = eformat::DEFAULT_VERSION; //format version
00066   m_header[4] = source_id;
00067   m_header[5] = 1; //number of status
00068   m_header[6] = 10; //number of fragment specific
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   //now initialize pages
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   //now initialize pages
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   //now initialize pages
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; //marker
00127   m_header[1] = 18; //this header size + status size
00128   m_header[2] = 18; //this header size + status size
00129   m_header[3] = eformat::DEFAULT_VERSION; //format version
00130   m_header[4] = 0; //source identifier
00131   m_header[5] = 1; //number of status
00132   m_header[6] = 10; //number of fragment specific
00133   m_header[7] = std::time(0);
00134   m_header[8] = 0; //global identifier
00135   m_header[9] = 0; //run number
00136   m_header[10] = 0; //LVL1 identifier
00137   m_header[11] = 0; //LVL1 type
00138   m_header[12] = 0; //LVL2 info
00139   m_header[13] = 0; //EF info [0]
00140   m_header[14] = 0; //EF info [1]
00141   m_header[15] = 0; //EF info [2]
00142   m_header[16] = 0; //EF info [3]
00143 
00144   //now initialize pages
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   //now initialize pages
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]; //remove count from previous status
00193   m_node[0].base[2] -= m_node[0].base[5]; //remove count from previous status
00194   m_node[1].size_word = m_node[0].base[5] = n; //set new values
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   //adjust `m_last' and `m_child' to point to the new last ROB
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   //the header is already concatenated by construction
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; //advance until end
00236   }
00237   return m_node;
00238 }

Generated on Tue Nov 29 22:58:26 2016 for BOSS_7.0.2 by  doxygen 1.4.7