9 #include <daq/rawdata/modules/DeSerializerFILE.h>
10 #include <rawdata/dataobjects/PreRawCOPPERFormat_latest.h>
11 #include <rawdata/dataobjects/RawFTSW.h>
31 setDescription(
"Encode DataStore into RingBuffer");
35 addParam(
"inputFileName", m_fname_in,
"Input binary filename",
string(
""));
36 addParam(
"inputRepetitionTimes", m_repetition_max,
37 "Input repetition times to read the input file", 0);
40 B2INFO(
"DeSerializerFILE: Constructor done.");
45 DeSerializerFILEModule::~DeSerializerFILEModule()
49 void DeSerializerFILEModule::fileOpen()
51 m_fp_in = fopen(m_fname_in.c_str(),
"r");
54 sprintf(err_buf,
"[FATAL] Cannot open an input file(%s): %s : Exiting...\n",
55 strerror(errno), m_fname_in.c_str());
56 print_err.PrintError(err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
62 void DeSerializerFILEModule::initialize()
64 B2INFO(
"DeSerializerFILE: initialize() started.");
68 m_eventMetaDataPtr.registerInDataStore();
70 memset(time_array0, 0,
sizeof(time_array0));
71 memset(time_array1, 0,
sizeof(time_array1));
72 memset(time_array2, 0,
sizeof(time_array2));
73 memset(time_array3, 0,
sizeof(time_array3));
74 memset(time_array4, 0,
sizeof(time_array4));
75 memset(time_array5, 0,
sizeof(time_array5));
78 m_rawDataBlock.registerInDataStore();
79 m_rawCOPPER.registerInDataStore();
80 m_rawSVD.registerInDataStore();
81 m_rawCDC.registerInDataStore();
82 m_rawTOP.registerInDataStore();
83 m_rawARICH.registerInDataStore();
84 m_rawECL.registerInDataStore();
85 m_rawKLM.registerInDataStore();
90 B2INFO(
"DeSerializerFILE: initialize() done.");
95 int* DeSerializerFILEModule::readOneDataBlock(
int* delete_flag,
int* size_word,
int* data_type)
103 int temp_size_word = 0;
105 int bytes_to_read =
sizeof(int);
110 if ((read_size = fread((
char*)(&temp_size_word), 1, bytes_to_read, m_fp_in)) != bytes_to_read) {
112 if (m_repetition_max > m_repetition_cnt) {
122 sprintf(err_buf,
"[FATAL] Failed to read header(%s).", strerror(errno));
123 print_err.PrintError(err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
128 recvd_byte += read_size;
130 int start_word = 0, stop_word = 0;
132 if (temp_size_word == 0x7fff0008) {
134 *data_type = COPPER_DATABLOCK;
138 pos_data_length = PreRawCOPPERFormat_latest::POS_DATA_LENGTH;
141 stop_word = pos_data_length;
142 int* length_buf = readfromFILE(m_fp_in, pos_data_length, start_word, stop_word);
145 *size_word = length_buf[ pos_data_length - 1 ] +
146 PreRawCOPPERFormat_latest::SIZE_COPPER_DRIVER_HEADER + PreRawCOPPERFormat_latest::SIZE_COPPER_DRIVER_TRAILER
147 + m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS + m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS;
148 start_word = 1 + pos_data_length + m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS;
149 stop_word = *size_word - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS;
151 temp_buf = readfromFILE(m_fp_in, *size_word, start_word, stop_word);
154 temp_buf[ m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS ] = 0x7fff0008;
155 memcpy((temp_buf + m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS + 1),
156 length_buf,
sizeof(
int) * pos_data_length);
160 *data_type = RAW_DATABLOCK;
161 *size_word = temp_size_word;
163 stop_word = *size_word;
164 temp_buf = readfromFILE(m_fp_in, *size_word, start_word, stop_word);
171 int* DeSerializerFILEModule::readfromFILE(FILE* fp_in,
const int size_word,
const int start_word,
const int stop_word)
177 temp_buf =
new int[ size_word ];
179 memset(temp_buf, 0, size_word *
sizeof(
int));
180 temp_buf[ 0 ] = size_word;
181 int recvd_byte = start_word *
sizeof(int);
182 int bytes_to_read = stop_word *
sizeof(int);
185 if ((read_size = fread((
char*)temp_buf + recvd_byte, 1, bytes_to_read - recvd_byte, fp_in)) < 0) {
191 sprintf(err_buf,
"[FATAL] Failed to read header. Exiting...");
192 print_err.PrintError(err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
195 recvd_byte += read_size;
197 if (bytes_to_read != recvd_byte) {
199 sprintf(err_buf,
"[FATAL] Read less bytes(%d) than expected(%d). Exiting...\n",
200 recvd_byte, bytes_to_read);
201 print_err.PrintError(err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
209 void DeSerializerFILEModule::event()
212 if (m_start_flag == 0) {
217 if (m_start_flag == 0) {
218 B2INFO(
"DeSerializerFILE: event() started.");
219 m_start_time = getTimeSec();
230 unsigned int prev_eve_num = 0;
243 if (m_prev_buf_flag == 1) {
244 temp_buf = m_prev_buf;
245 size_word = temp_buf[ 0 ];
249 temp_buf = readOneDataBlock(&delete_flag, &size_word, &data_type);
252 if (temp_buf == 0x0) {
253 printf(
"[DEBUG] End of file\n");
258 if (data_type == COPPER_DATABLOCK) {
264 temp_rawcopper.
SetBuffer(temp_buf, size_word, 0, num_events, num_nodes);
267 printf(
"[FATAL] Sorry. This version does not support fillNewCOPPERheader()");
273 unsigned int temp_cur_evenum = 0, temp_cur_copper_ctr = 0;
277 m_dummy_evenum - 2, &temp_cur_evenum,
278 m_dummy_evenum - 2, &temp_cur_copper_ctr,
279 m_prev_exprunsubrun_no, &m_exprunsubrun_no);
281 }
catch (
string err_str) {
282 print_err.PrintError(m_shmflag, &g_status, err_str);
285 m_prev_run_no = m_run_no;
298 temp_rawdblk.
SetBuffer(temp_buf, size_word, 0, num_nodes, num_events);
301 unsigned int eve_num;
306 temp_raw_ftsw.
SetBuffer(temp_buf, size_word, 0, num_nodes, num_events);
307 eve_num = temp_raw_ftsw.
GetEveNo(block_num);
310 temp_raw_copper.
SetBuffer(temp_buf, size_word, 0, num_nodes, num_events);
311 eve_num = temp_raw_copper.
GetEveNo(block_num);
312 subsysid = temp_raw_copper.
GetNodeID(block_num);
315 if (eve_num != prev_eve_num && first_flag != 0) {
317 m_prev_buf = temp_buf;
320 prev_eve_num = eve_num;
324 (ary.
appendNew())->SetBuffer(temp_buf, size_word, 1, num_nodes, num_events);
335 (ary.
appendNew())->SetBuffer(temp_buf, size_word, 1, 1, 1);
356 m_totbytes += size_word *
sizeof(int);
362 m_eventMetaDataPtr.
create();
363 m_eventMetaDataPtr->setExperiment(0);
364 m_eventMetaDataPtr->setRun(0);
365 m_eventMetaDataPtr->setEvent(prev_eve_num);
367 m_eventMetaDataPtr->setEndOfData();
370 if (n_basf2evt % 100 == 0) {
371 printf(
"[DEBUG] Processing Evt # %d...\n", prev_eve_num);