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

Go to the documentation of this file.
00001 //Dear emacs, this is -*- c++ -*-
00002 
00013 #include "eformat/write/ROSFragment.h"
00014 #include "eformat/write/SubDetectorFragment.h"
00015 #include "eformat/HeaderMarker.h"
00016 #include "eformat/Status.h"
00017 #include "ers/StreamFactory.h"
00018 #include <cstring>
00019 eformat::write::ROSFragment::ROSFragment 
00020 (uint32_t source_id, uint32_t run_no, uint32_t lvl1_id, uint32_t bc_id)
00021   : m_parent(0),
00022     m_child(0),
00023     m_last(0),
00024     m_next(0),
00025     m_extra_count(0)
00026 {
00027   m_header[0] = eformat::ROS; //marker
00028   m_header[1] = 11; //this header size + status size
00029   m_header[2] = 11; //this header size + status size
00030   m_header[3] = eformat::DEFAULT_VERSION; //format version
00031   m_header[4] = source_id;
00032   m_header[5] = 1; //number of status
00033   m_header[6] = 3; //number of fragment specific
00034   m_header[7] = run_no;
00035   m_header[8] = lvl1_id;
00036   m_header[9] = bc_id;
00037 
00038   //now initialize pages
00039   set(m_node[0], m_header, 6, &m_node[1]);
00040   set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00041   set(m_node[2], &m_header[6], 4, 0);
00042   ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d", 
00043               "Built (write) ros fragment from scratch, with", 
00044               ROSFragment::source_id(), ROSFragment::lvl1_id(), 
00045               ROSFragment::run_no());
00046 }
00047 
00048 eformat::write::ROSFragment::ROSFragment (uint32_t* ros)
00049   : m_parent(0),
00050     m_child(0),
00051     m_last(0),
00052     m_next(0),
00053     m_extra_count(0)
00054 {
00055   //now initialize pages
00056   set(m_node[0], ros, 6, &m_node[1]);
00057   set(m_node[1], &ros[6], ros[5], &m_node[2]);
00058   set(m_node[2], &ros[6+ros[5]], 4, &m_extra);
00059   eformat::write::set(m_extra, &ros[10+ros[5]], ros[1]-ros[2]);
00060   ++m_extra_count;
00061   ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d", 
00062               "Built (write) ros fragment from contiguous memory, with", 
00063               source_id(), lvl1_id(), run_no());
00064 }
00065 
00066 eformat::write::ROSFragment::ROSFragment (eformat::write::node_t* ros)
00067   : m_parent(0),
00068     m_child(0),
00069     m_last(0),
00070     m_next(0),
00071     m_extra_count(0)
00072 {
00073   //now initialize pages
00074   set(m_node[0], ros->base, 6, &m_node[1]);
00075   set(m_node[1], &ros->base[6], ros->base[5], &m_node[2]);
00076   set(m_node[2], &ros->base[6+ros->base[5]], 4, &m_extra);
00077   eformat::write::set(m_extra, &ros->base[10+ros->base[5]],
00078                       ros->size_word - ros->base[2], ros->next);
00079   m_extra_count += eformat::write::count(m_extra);
00080   ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d", 
00081               "Built (write) ros fragment from paged memory, with", 
00082               source_id(), lvl1_id(), run_no());
00083 }
00084 
00085 eformat::write::ROSFragment::ROSFragment ()
00086   : m_parent(0),
00087     m_child(0),
00088     m_last(0),
00089     m_next(0),
00090     m_extra_count(0)
00091 {
00092   m_header[0] = eformat::ROS; //marker
00093   m_header[1] = 11; //this header size + status size
00094   m_header[2] = 11; //this header size + status size
00095   m_header[3] = eformat::DEFAULT_VERSION; //format version
00096   m_header[4] = 0; //source identifier
00097   m_header[5] = 1; //number of status
00098   m_header[6] = 3; //number of fragment specific
00099   m_header[7] = 0; //run number
00100   m_header[8] = 0; //LVL1 identifier
00101   m_header[9] = 0; //bunch crossing identifier
00102 
00103   //now initialize pages
00104   set(m_node[0], m_header, 6, &m_node[1]);
00105   set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00106   set(m_node[2], &m_header[6], 4, 0);
00107   ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d", 
00108               "Built empty (write) ros fragment from scratch, with", 
00109               ROSFragment::source_id(), ROSFragment::lvl1_id(), 
00110               ROSFragment::run_no());
00111 }
00112 
00113 eformat::write::ROSFragment::ROSFragment 
00114 (const eformat::write::ROSFragment& other)
00115   : m_parent(0),
00116     m_child(0),
00117     m_last(0),
00118     m_next(0),
00119     m_extra_count(0)
00120 {
00121   *this = other;
00122   ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d", 
00123               "Built (write) ros fragment from copy, with", 
00124               ROSFragment::source_id(), ROSFragment::lvl1_id(),
00125               ROSFragment::run_no());
00126 }
00127 
00128 eformat::write::ROSFragment& eformat::write::ROSFragment::operator= 
00129   (const eformat::write::ROSFragment& other)
00130 {
00131   memcpy(reinterpret_cast<void*>(m_header),
00132          reinterpret_cast<const void*>(other.m_node[0].base), 
00133          6*sizeof(uint32_t));
00134   memcpy(reinterpret_cast<void*>(m_header+6),
00135          reinterpret_cast<const void*>(other.m_node[2].base),
00136          4*sizeof(uint32_t));
00137 
00138   //now initialize pages
00139   set(m_node[0], m_header, 6, &m_node[1]);
00140   set(m_node[1], other.m_node[1].base, other.m_node[1].size_word, &m_node[2]);
00141   set(m_node[2], &m_header[6], 4, 0);
00142   ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d", 
00143               "Copied (write) ros fragment, with", 
00144               ROSFragment::source_id(), ROSFragment::lvl1_id(),
00145               ROSFragment::run_no());
00146   return *this;
00147 }
00148 
00149 void eformat::write::ROSFragment::status (uint32_t n, const uint32_t* status)
00150 {
00151   if (m_parent) m_parent->size_change(m_node[0].base[1], 
00152                                       m_node[0].base[1]-m_node[0].base[5]+n);
00153   m_node[0].base[1] -= m_node[0].base[5]; //remove count from previous status
00154   m_node[0].base[2] -= m_node[0].base[5]; //remove count from previous status
00155   m_node[1].size_word = m_node[0].base[5] = n; //set new values
00156   m_node[0].base[1] += n;
00157   m_node[0].base[2] += n;
00158   m_node[1].base = const_cast<uint32_t*>(status);
00159 }
00160 
00161 void eformat::write::ROSFragment::size_change (uint32_t o, uint32_t n)
00162 { 
00163   uint32_t old_size = m_node[0].base[1];
00164   m_node[0].base[1] -= o;
00165   m_node[0].base[1] += n;
00166   if (m_parent) m_parent->size_change(old_size, m_node[0].base[1]);
00167 }
00168 
00169 void eformat::write::ROSFragment::append (eformat::write::ROBFragment* rob)
00170 {
00171   ERS_DEBUG_3("%s Source Id. = 0x%x to ros fragment with Source Id. = 0x%x", 
00172               "Appending rob fragment with",
00173               rob->source_id(), source_id());
00174   rob->parent(this);
00175   uint32_t old_size = m_node[0].base[1];
00176   m_node[0].base[1] += rob->size_word();
00177 
00178   //adjust `m_last' and `m_child' to point to the new last ROB
00179   if (m_last) m_last->next(rob);
00180   else m_child = rob;
00181   m_last = rob;
00182 
00183   //propagate changes to my parent
00184   if (m_parent) m_parent->size_change(old_size, m_node[0].base[1]);
00185 }
00186 
00187 uint32_t eformat::write::ROSFragment::page_count (void) const
00188 {
00189   uint32_t retval = 3 + m_extra_count;
00190   for (const ROBFragment* curr = m_child; curr; curr = curr->next())
00191     retval += curr->page_count();
00192   return retval;
00193 }
00194 
00195 const eformat::write::node_t* eformat::write::ROSFragment::bind (void)
00196 {
00197   //the header is already concatenated by construction
00198   eformat::write::node_t* last = &m_node[2];
00199   if (m_extra_count) {
00200     last = &m_extra;
00201     while (last->next) last = last->next;
00202   }
00203   for (const ROBFragment* curr = m_child; curr; curr = curr->next()) {
00204     last->next = const_cast<eformat::write::node_t*>(curr->bind());
00205     while (last->next) last = last->next; //advance until end
00206   }
00207   return m_node;
00208 }

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