1#include "RawDataCnv/Util/ZddConverter.h"
2#include "ZddEvent/ZddBoard.h"
3#include "ZddEvent/ZddChannel.h"
11 if ( s_instance == 0 ) { s_instance =
new ZddConverter( runMode ); }
17 if ( s_instance != 0 )
35 uint32_t* pend = pdata + size;
37 while ( pdata < pend ) { pdata = decodeBoard( pdata, evt ); }
41 std::cout <<
"ZddConverter: there are problems within the event data size" << std::endl;
48uint32_t* ZddConverter::decodeBoard( uint32_t* pevt,
Event::ZddEvent* evt ) {
49 if ( ( pevt[0] >> 28 ) != 10 )
51 std::cout <<
"ZddConverter get wrong event marker!" << std::endl;
55 int size = pevt[0] & 0xFFFFFFF;
56 int board = pevt[1] >> 27;
57 uint32_t chMask = pevt[1] & 0xFF;
59 ZddBoard* zddBoard =
new ZddBoard( evt );
66 uint32_t* pend = pevt + size;
67 uint32_t* pchannel = pevt + 4;
69 while ( pchannel < pend )
71 while ( ( chMask & ( 1 << ich ) ) == 0 )
76 std::cout <<
"ZddConverter get wrong channel mask!" << std::endl;
80 ZddChannel* zddCh =
new ZddChannel();
81 zddCh->
setChId( board * 100 + ich );
83 pchannel = decodeChannel( pchannel, zddCh );
87 if ( pchannel != pend )
89 std::cout <<
"ZddConverter: there are problems within the channel data size" << std::endl;
96uint32_t* ZddConverter::decodeChannel( uint32_t* pch,
ZddChannel* zddCh ) {
97 uint32_t* pend = pch + pch[0];
98 uint32_t* pfrag = pch + 1;
108 while ( pfrag < pend )
110 uint32_t& ctrl_word = pfrag[0];
111 int size = ( ctrl_word & 0x1FFFFF ) * 4;
113 if ( ctrl_word >> 31 )
116 if ( ctrl_word == 0xFEFEFEFE )
121 if ( ( pfrag + size / 4 + 1 ) > pend )
123 std::cout <<
"BAD ZDD RAW DATA!" << std::endl;
129 zddFrag.
sample =
new unsigned char[size];
130 memcpy( zddFrag.
sample, pfrag + 1, size );
132 pfrag += size / 4 + 1;
133 if ( lstat < 0 ) ++nCtrlWord;
139 if ( lstat > 0 ) ++nCtrlWord;
158 if ( index < samples )
169ZddConverter::ZddConverter(
int runMode ) : m_runMode( runMode ) {}
171ZddConverter::~ZddConverter() {}
void addChannel(ZddChannel *ch)
void setBoardId(int boardId)
void setCounter(int counter)
void setTimeTag(int timeTag)
void addFragments(const ZddFragment &frag)
void setScanCode(int scanCode)
static ZddConverter * instance(int runMode=2)
bool convert(uint32_t *pdata, int size, Event::ZddEvent *evt)