7#include "THaCodaFile.h"
19 int localtime = (int) time(0);
20 int ROCCount = ROCList.size();
21 int wordcount = (8 + ROCCount*3);
22 std::vector<UInt_t> header;
23 header.push_back(0xFF501001);
24 header.push_back(wordcount);
25 header.push_back(0xFF212000 | ROCCount);
27 header.push_back(0x010a0004);
30 header.push_back(0x0);
33 header.push_back(localtime);
34 header.push_back(0x0);
36 header.push_back(0x1850001);
37 header.push_back(0xc0da);
38 for(
auto it = ROCList.begin(); it != ROCList.end(); it++){
40 int roc = (*it << 24);
41 header.push_back(roc | base);
42 header.push_back(0x4D6F636B);
43 header.push_back(0x4D6F636B);
54 buffer[1] = ((0xffd1 << 16) | (0x01 << 8));
55 buffer[2] = localtime;
56 buffer[3] = runnumber;
65 buffer[1] = ((0xffd2 << 16) | (0x01 << 8) );
66 buffer[2] = localtime;
68 buffer[4] = eventcount;
76 buffer[1] = ((0xffd3 << 16) | (0x01 << 8) );
77 buffer[2] = localtime;
79 buffer[4] = eventcount;
87 buffer[1] = ((0xffd4 << 16) | (0x01 << 8) );
88 buffer[2] = localtime;
90 buffer[4] = eventcount;
119 fEvtTag = (buffer[1] & 0xffff0000) >> 16;
124 QwWarning <<
"MultiBlock is not properly supported! block_size = "
159 QwDebug << Form(
"buffer[0-1] 0x%x 0x%x ; ", buffer[0], buffer[1]);
171 if( tag >= 0xff00 ) {
193 QwWarning <<
"CodaDecoder:: WARNING: Undefined CODA 3 event type, tag = "
194 <<
"0x" << std::hex << tag << std::dec <<
QwLog::endl;
253 char *cbuf = (
char *)buffer;
254 size_t elen =
sizeof(int)*(buffer[0]+1);
257 for (
size_t ii=0; ii<elen; ii++)
QwMessage << cbuf[ii];
265 out << Form(
"Event Number: %d; Length: %d; Tag: 0x%x; Bank data type: 0x%x ",
267 << Form(
"Evt type: 0x%x; Evt number %d; fWordsSoFar %d",
275 const char*
const HERE =
"Coda3EventDecoder::trigBankDecode";
286 Error(HERE,
"CODA 3 format error: %s", e.what() );
297 uint32_t blkSize, uint32_t tsroc )
300 throw std::invalid_argument(
"CODA block size must be > 0");
303 len = evbuffer[0] + 1;
304 tag = (evbuffer[1] & 0xffff0000) >> 16;
305 nrocs = evbuffer[1] & 0xff;
307 const uint32_t* p = evbuffer + 2;
313 uint32_t slen = *p & 0xffff;
316 const uint32_t *q = (p+1);
319 evTS =
reinterpret_cast<const uint64_t*
>(++q);
331 if( p-evbuffer >=
len )
338 uint32_t slen = *p & 0xffff;
339 if( slen != (blkSize-1)/2 + 1 )
341 evType = (
const uint16_t*) (p + 1);
353 for( uint32_t i = 0; i <
nrocs; ++i ) {
354 if( p-evbuffer >=
len )
355 throw coda_format_error(
"Past end of bank while scanning trigger bank segments");
356 uint32_t slen = *p & 0xffff;
357 uint32_t rocnum = (*p & 0xff000000) >> 24;
362 if( rocnum == tsroc ) {
379 assert(i <
tbank.blksize);
380 if( i >=
tbank.blksize )
386 memcpy(×tamp, &
tbank.evTS[i],
sizeof(timestamp));
389 else if(
tbank.TSROC ) {
390 UInt_t struct_size =
tbank.withTriggerBits() ? 3 : 2;
393 memcpy(×tamp,
tbank.TSROC + struct_size * i,
sizeof(timestamp));
398 if(
tbank.withTriggerBits() ){
400 uint32_t trigger_word;
401 memcpy(&trigger_word, &
tbank.TSROC[2 + 3 * i],
sizeof(trigger_word));
429 QwWarning <<
"Skipping to the end of the event and setting everything to false (0)!" <<
QwLog::endl;
An options class which parses command line, config file and environment.
#define QwVerbose
Predefined log drain for verbose messages.
#define QwError
Predefined log drain for errors.
#define QwWarning
Predefined log drain for warnings.
#define QwMessage
Predefined log drain for regular messages.
#define QwDebug
Predefined log drain for debugging output.
CODA version 3 event decoder implementation.
void EncodePauseEventHeader(int *buffer, int eventcount, int localtime) override
static const UInt_t SCALER_EVTYPE
std::vector< UInt_t > EncodePHYSEventHeader(std::vector< ROCID_t > &ROCList) override
Int_t trigBankDecode(UInt_t *buffer)
void trigBankErrorHandler(Int_t flag)
void printUserEvent(const UInt_t *buffer)
static const UInt_t SBSSCALER_EVTYPE
void EncodeGoEventHeader(int *buffer, int eventcount, int localtime) override
static const UInt_t HV_DATA_EVTYPE
static const UInt_t DAQCONFIG_FILE2
Int_t LoadTrigBankInfo(UInt_t index_buffer)
void PrintDecoderInfo(QwLog &out) override
static const UInt_t DAQCONFIG_FILE1
void EncodeEndEventHeader(int *buffer, int eventcount, int localtime) override
UInt_t InterpretBankTag(UInt_t tag)
void EncodePrestartEventHeader(int *buffer, int runnumber, int runtype, int localtime) override
static const UInt_t PRESCALE_EVTYPE
Int_t DecodeEventIDBank(UInt_t *buffer) override
bool withTimeStamp() const
uint32_t Fill(const uint32_t *evbuffer, uint32_t blkSize, uint32_t tsroc)
void ProcessPause(UInt_t local_time, UInt_t evt_count)
void ProcessGo(UInt_t local_time, UInt_t evt_count)
void ProcessPrestart(UInt_t local_time, UInt_t local_runnumber, UInt_t local_runtype)
void ProcessEnd(UInt_t local_time, UInt_t evt_count)
void ProcessControlEvent(UInt_t evtype, UInt_t *buffer)
Logging and output management system with configurable verbosity levels.
static std::ostream & endl(std::ostream &)
End of the line.
UInt_t fEvtNumber
CODA event number; only defined for physics events.