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

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