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

Go to the documentation of this file.
00001 //Dear emacs, this is -*- c++ -*-
00002 
00013 #include "eformat/write/ROBFragment.h"
00014 #include "eformat/write/ROSFragment.h"
00015 #include "eformat/HeaderMarker.h"
00016 #include "eformat/Status.h"
00017 #include <cstring>
00018 #include "ers/StreamFactory.h"
00019 
00020 eformat::write::ROBFragment::ROBFragment 
00021 (uint32_t source_id, 
00022  uint32_t run_no, 
00023  uint32_t lvl1_id,
00024  uint32_t bc_id, 
00025  uint32_t lvl1_type, 
00026  uint32_t detev_type,
00027  uint32_t ndata, const uint32_t* data, uint32_t status_position)
00028   : m_parent(0),
00029     m_next(0)
00030 {
00031   m_header[0] = eformat::ROB; //marker
00032   m_header[1] = 21 + ndata; //total fragment size in words
00033   m_header[2] = 8; //this header size + status size
00034   m_header[3] = eformat::DEFAULT_VERSION; //format version
00035   m_header[4] = source_id;
00036   m_header[5] = 1; //number of status
00037   m_header[6] = 0; //number of fragment specific
00038   m_rod_header[0] = eformat::ROD; //ROD marker
00039   m_rod_header[1] = 9; //ROD header size
00040   m_rod_header[2] = eformat::DEFAULT_VERSION; //format version
00041   m_rod_header[3] = source_id;
00042   m_rod_header[4] = run_no;
00043   m_rod_header[5] = lvl1_id;
00044   m_rod_header[6] = bc_id;
00045   m_rod_header[7] = lvl1_type;
00046   m_rod_header[8] = detev_type;
00047   m_rod_trailer[0] = 1; //number of status in the ROD
00048   m_rod_trailer[1] = ndata; //number of data words in the ROD
00049   m_rod_trailer[2] = status_position;
00050 
00051   //now initialize pages
00052   set(m_node[0], m_header, 6, &m_node[1]);
00053   set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00054   set(m_node[2], &m_header[6], 1, &m_node[3]); //specific part
00055   if (m_rod_trailer[2] == eformat::STATUS_FRONT) {
00056     set(m_node[3], m_rod_header, 9, &m_node[4]);
00057     set(m_node[4], &eformat::DEFAULT_STATUS, 1, &m_node[5]); //status
00058     set(m_node[5], data, ndata, &m_node[6]); //data
00059   }
00060   else {
00061     set(m_node[3], m_rod_header, 9, &m_node[5]);
00062     set(m_node[5], data, ndata, &m_node[4]); //data
00063     set(m_node[4], &eformat::DEFAULT_STATUS, 1, &m_node[6]); //status
00064   }
00065   set(m_node[6], m_rod_trailer, 3, 0);
00066   ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d", 
00067               "Built (write) rob/rod fragment from scratch, with",
00068               ROBFragment::source_id(), rod_lvl1_id(), rod_run_no());
00069 }
00070 
00071 eformat::write::ROBFragment::ROBFragment ()
00072   : m_parent(0),
00073     m_next(0)
00074 {
00075   m_header[0] = eformat::ROB; //marker
00076   m_header[1] = 21;
00077   m_header[2] = 8; //this header size + status size
00078   m_header[3] = eformat::DEFAULT_VERSION; //format version
00079   m_header[4] = 0; //source identifier of the ROB fragment
00080   m_header[5] = 1; //number of status
00081   m_header[6] = 0; //number of fragment specific
00082   m_rod_header[0] = eformat::ROD; //ROD marker
00083   m_rod_header[1] = 9; //ROD header size
00084   m_rod_header[2] = eformat::DEFAULT_VERSION; //format version
00085   m_rod_header[3] = 0; //source identifier of the ROD fragment
00086   m_rod_header[4] = 0; //run number
00087   m_rod_header[5] = 0; //LVL1 identifier
00088   m_rod_header[6] = 0; //bunch crossing identifier
00089   m_rod_header[7] = 0; //LVL1 type
00090   m_rod_header[8] = 0; //detector event type
00091   m_rod_trailer[0] = 1; //number of status in the ROD
00092   m_rod_trailer[1] = 0; //number of data words in the ROD
00093   m_rod_trailer[2] = eformat::STATUS_FRONT; //status block position
00094 
00095   //now initialize pages
00096   set(m_node[0], m_header, 6, &m_node[1]);
00097   set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00098   set(m_node[2], &m_header[6], 1, &m_node[3]); //specific part
00099   if (m_rod_trailer[2] == eformat::STATUS_FRONT) {
00100     set(m_node[3], m_rod_header, 9, &m_node[4]);
00101     set(m_node[4], &eformat::DEFAULT_STATUS, 1, &m_node[5]); //status
00102     set(m_node[5], 0, 0, &m_node[6]); //data
00103   }
00104   else {
00105     set(m_node[3], m_rod_header, 9, &m_node[5]);
00106     set(m_node[5], 0, 0, &m_node[4]); //data
00107     set(m_node[4], &eformat::DEFAULT_STATUS, 1, &m_node[6]); //status
00108   }
00109   set(m_node[6], m_rod_trailer, 3, 0);
00110   ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d",
00111               "Built (write) empty rob/rod fragment, with",
00112               ROBFragment::source_id(), rod_lvl1_id(), rod_run_no());
00113 }
00114 
00115 eformat::write::ROBFragment::ROBFragment 
00116 (const eformat::write::ROBFragment& other)
00117   : m_parent(0),
00118     m_next(0)
00119 {
00120   *this = other;
00121   ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d", 
00122               "Built new (write) rob/rod fragment from copy, with",
00123               ROBFragment::source_id(), rod_lvl1_id(), rod_run_no());
00124 }
00125 
00126 eformat::write::ROBFragment::ROBFragment (uint32_t* rod, uint32_t size_word)
00127   : m_parent(0),
00128     m_next(0)
00129 {
00130   m_header[0] = eformat::ROB; //marker
00131   m_header[1] = 8 + size_word; //total fragment size in words
00132   m_header[2] = 8; //this header size + status size
00133   m_header[3] = eformat::DEFAULT_VERSION; //format version
00134   m_header[4] = rod[3];
00135   m_header[5] = 1; //number of status
00136   m_header[6] = 0; //number of fragment specific
00137   
00138   //now initialize pages
00139   set(m_node[0], m_header, 6, &m_node[1]);
00140   set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
00141   set(m_node[2], &m_header[6], 1, &m_node[3]);
00142   set(m_node[6], &rod[size_word-3], 3, 0); //ROD trailer
00143   if (m_node[6].base[2] == eformat::STATUS_FRONT) {
00144     set(m_node[3], rod, 9, &m_node[4]); //ROD header
00145     set(m_node[4], &rod[9], m_node[6].base[0], &m_node[5]); //status
00146     set(m_node[5], &rod[9+m_node[6].base[0]], m_node[6].base[1], &m_node[6]);
00147   }
00148   else {
00149     set(m_node[3], rod, 9, &m_node[5]); //ROD header
00150     set(m_node[4], &rod[9+m_node[6].base[1]], m_node[6].base[0], &m_node[6]);
00151     set(m_node[5], &rod[9], m_node[6].base[1], &m_node[4]); //data
00152   }
00153   ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d", 
00154               "Built (write) rob/rod fragment from rod on memory, with",
00155               source_id(), rod_lvl1_id(), rod_run_no());
00156 }
00157 
00158 eformat::write::ROBFragment::ROBFragment (uint32_t* rob)
00159   : m_parent(0),
00160     m_next(0)
00161 {
00162   //now initialize pages
00163   set(m_node[0], rob, 6, &m_node[1]);
00164   set(m_node[1], &rob[6], rob[5], &m_node[2]);
00165   set(m_node[2], &rob[6+rob[5]], 1, &m_node[3]);
00166   set(m_node[6], &rob[rob[1]-3], 3, 0); //ROD trailer
00167   if (m_node[6].base[2] == eformat::STATUS_FRONT) {
00168     set(m_node[3], &rob[rob[2]], 9, &m_node[4]); //ROD header
00169     set(m_node[4], &rob[rob[2]+9], m_node[6].base[0], &m_node[5]); //status
00170     set(m_node[5], &rob[rob[2]+9+m_node[6].base[0]], m_node[6].base[1], 
00171         &m_node[6]); //data
00172   }
00173   else {
00174     set(m_node[3], &rob[rob[2]], 9, &m_node[5]); //ROD header
00175     set(m_node[4], &rob[rob[2]+9+m_node[6].base[1]], m_node[6].base[0], 
00176         &m_node[6]);
00177     set(m_node[5], &rob[rob[2]+9], m_node[6].base[1], &m_node[4]); //data
00178   }
00179   ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d", 
00180               "Built (write) rob/rod fragment from cont. memory, with",
00181               source_id(), rod_lvl1_id(), rod_run_no());
00182 }
00183 
00184 eformat::write::ROBFragment& eformat::write::ROBFragment::operator= 
00185   (const eformat::write::ROBFragment& other)
00186 {
00187   //get the ROB header
00188   memcpy(reinterpret_cast<void*>(m_header),
00189          reinterpret_cast<const void*>(other.m_node[0].base), 
00190          6*sizeof(uint32_t));
00191   m_header[6] = other.m_node[2].base[0];
00192   memcpy(reinterpret_cast<void*>(m_rod_header),
00193          reinterpret_cast<const void*>(other.m_node[3].base),
00194          9*sizeof(uint32_t));
00195   memcpy(reinterpret_cast<void*>(m_rod_trailer), 
00196          reinterpret_cast<const void*>(other.m_node[6].base),
00197          3*sizeof(uint32_t));
00198 
00199   //now re-initialize the pages
00200   set(m_node[0], m_header, 6, &m_node[1]);
00201   set(m_node[1], other.m_node[1].base, other.m_node[1].size_word, &m_node[2]);
00202   set(m_node[2], &m_header[6], 1, &m_node[3]); //specific part
00203   if (m_rod_trailer[2] == eformat::STATUS_FRONT) {
00204     set(m_node[3], m_rod_header, 9, &m_node[4]);
00205     set(m_node[4], other.m_node[4].base, 
00206         other.m_node[4].size_word, &m_node[5]); //status
00207     set(m_node[5], other.m_node[5].base, 
00208         other.m_node[5].size_word, &m_node[6]); //data
00209   }
00210   else {
00211     set(m_node[3], m_rod_header, 9, &m_node[5]);
00212     set(m_node[5], other.m_node[5].base, 
00213         other.m_node[5].size_word, &m_node[4]); //data
00214     set(m_node[4], other.m_node[4].base, 
00215         other.m_node[4].size_word, &m_node[6]); //status
00216   }
00217   set(m_node[6], m_rod_trailer, 3, 0);
00218   ERS_DEBUG_3("%s Source Id. = 0x%x., LVL1 Id. = %d, Run Number = %d", 
00219               "Copied (write) rob/rod fragment with",
00220               ROBFragment::source_id(), rod_lvl1_id(), rod_run_no());
00221 
00222   return *this;
00223 }
00224 
00225 void eformat::write::ROBFragment::status (uint32_t n, const uint32_t* status)
00226 { 
00227   if (m_parent) m_parent->size_change(m_node[0].base[1],
00228                                       m_node[0].base[1]-m_node[0].base[5]+n);
00229   m_node[0].base[1] -= m_node[0].base[5]; //remove count from previous status
00230   m_node[0].base[2] -= m_node[0].base[5]; //remove count from previous status
00231   m_node[1].size_word = m_node[0].base[5] = n; //set new values
00232   m_node[0].base[1] += n;
00233   m_node[0].base[2] += n;
00234   m_node[1].base = const_cast<uint32_t*>(status);
00235 }
00236 
00237 void eformat::write::ROBFragment::rod_status (uint32_t n, 
00238                                               const uint32_t* status)
00239 { 
00240   if (m_parent) m_parent->size_change(m_node[0].base[1], 
00241                                       m_node[0].base[1]-m_node[6].base[0]+n);
00242   m_node[0].base[1] -= m_node[6].base[0]; //remove count from previous status
00243   m_node[4].size_word = m_node[6].base[0] = n; //set new values
00244   m_node[0].base[1] += n; //set ROB header's total fragment size
00245   m_node[4].base = const_cast<uint32_t*>(status); 
00246 }
00247 
00248 void eformat::write::ROBFragment::status_position (uint32_t v)
00249 { 
00250   if (v == m_node[6].base[2]) return; //do nothing in this case:)
00251   m_node[6].base[2] = v;
00252   if (m_node[6].base[2] == eformat::STATUS_FRONT) {
00253     m_node[3].next = &m_node[4];
00254     m_node[4].next = &m_node[5];
00255     m_node[5].next = &m_node[6];
00256   }
00257   else {
00258     m_node[3].next = &m_node[5];
00259     m_node[5].next = &m_node[4];
00260     m_node[4].next = &m_node[6];
00261   }
00262 }
00263 
00264 void eformat::write::ROBFragment::rod_data (uint32_t n, const uint32_t* data)
00265 {
00266   if (m_parent) m_parent->size_change(m_node[0].base[1], 
00267                                       m_node[0].base[1]-m_node[6].base[1]+n);
00268 
00269   //remove count from previous data size
00270   m_node[0].base[1] -= m_node[6].base[1]; 
00271   m_node[5].size_word = m_node[6].base[1] = n; //set new values
00272   m_node[0].base[1] += n; //set ROB header's total fragment size back
00273   m_node[5].base = const_cast<uint32_t*>(data); 
00274 }

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