00001 #include "RawDataCnv/Util/MucConverter.h" 00002 00003 MucConverter* MucConverter::s_instance = 0; 00004 00005 MucConverter* MucConverter::instance() 00006 { 00007 if ( s_instance == 0 ) { 00008 s_instance = new MucConverter(); 00009 } 00010 00011 return s_instance; 00012 } 00013 00014 void MucConverter::destroy() 00015 { 00016 if ( s_instance != 0 ) { 00017 delete s_instance; 00018 s_instance = 0; 00019 } 00020 } 00021 00022 StatusCode MucConverter::convert(const BufferHolder& src, MucDigiCol* des) 00023 { 00024 uint32_t REId, TEId, FecData, StrSqc; 00025 uint32_t nbuf = src.nBuf(); 00026 00027 for (uint32_t i = 0; i < nbuf; ++i) { 00028 uint32_t* buf = src(i); 00029 uint32_t bufSize = src.bufSize(i); 00030 for (uint32_t j = 0; j < bufSize; ++j) { 00031 m_builder.unPack(buf[j], REId, FecData, StrSqc); 00032 TEId = m_builder.getTEID( REId ); 00033 if ( TEId == 0xFFFFFFFF ) continue; 00034 00035 uint32_t teidBase = TEId & 0xFF0FFFFF; 00036 uint32_t teid; 00037 for (uint32_t k = 0; FecData != 0 && k < 16; FecData >>= 1, ++k) { 00038 if ((FecData & 1) == 0) continue; 00039 if (StrSqc == 0) { 00040 teid = teidBase + 15 -k; 00041 } 00042 else { 00043 teid = teidBase + k; 00044 } 00045 MucDigi* mucDigi = new MucDigi(teid); 00046 des->push_back( mucDigi ); 00047 } 00048 } 00049 } 00050 00051 return StatusCode::SUCCESS; 00052 } 00053 00054 StatusCode MucConverter::convert(MucDigiCol* src, WriteRawEvent*& des) 00055 { 00056 return m_builder.pack(src, des); 00057 } 00058 00059 MucConverter::MucConverter() 00060 { 00061 } 00062 00063 MucConverter::~MucConverter() 00064 { 00065 }