60 while( (
data[pos++] & 0xFFFF0000) == 0xADD00000 ) {
63 if( pos + 2 >=
ndata ) {
64 std::cerr <<
"No data, only padding in this event" << std::endl;
92 auto length =
data[pos++];
95 std::cerr <<
"Wrong number of data words (" << (int)
nsamples+5;
96 std::cerr <<
") for data remaning data size (";
97 std::cerr <<
ndata-pos <<
")" << std::endl;
103 auto specheader =
data[pos++];
111 for( UInt_t i = 0; i <
nsamples; i++ ) {
115 auto val32 =
data[pos++];
116 unsigned char my_hit_ch_id = (val32 & 0xf0000000) >> 28;
117 unsigned char n_hit_in_cha = (val32 & 0xf000000) >> 24;
118 bool more_than_1_hit_in_cha = (val32 & 0x400000) >> 22;
119 bool only_one_hit_in_cha = (val32 & 0x100000) >> 20;
121 if( more_than_1_hit_in_cha ){
127 if( only_one_hit_in_cha )
128 std::cerr <<
"Error: One hit and multiple hits flagged" << std::endl;
134 else if( only_one_hit_in_cha ) {
138 bool hit_time_sign = (val32 & 0x8000) >> 15;
151 unsigned char my_hit_ch_id2 = (val32 & 0xf0000000) >> 28;
153 bool my_adc_sign = (val32 & 0x800000) >> 23;
156 if( my_hit_ch_id != my_hit_ch_id2 ){
157 std::cerr <<
"Hit IDs don't match in channels: ";
158 std::cerr << (int)my_hit_ch_id <<
" & ";
159 std::cerr << (int)my_hit_ch_id2 << std::endl;
165 if( my_hit_ch_id >=
set->GetNumberOfFebexChannels() ) {
166 std::cerr <<
"Bad hit ID: " << (int)my_hit_ch_id;
167 std::cerr << std::endl;
173 if( only_one_hit_in_cha ) {
182 if(
set->GetMbsEventMode() )
189 febex_data->SetPileup( more_than_1_hit_in_cha );
207 auto spectrailer =
data[pos++];
208 if( ((spectrailer & 0xff000000) >> 24) != 0xbf ){
209 std::cerr <<
"Invalid special trailer: ";
210 std::cerr << ((spectrailer & 0xff000000) >> 24);
211 std::cerr << std::endl;
223 std::cerr <<
"Wrong number of trace samples (" << (int)
nsamples+2;
224 std::cerr <<
") for data remaning data size (";
225 std::cerr <<
ndata-pos <<
")" << std::endl;
231 unsigned int trace_header =
data[pos++];
232 if( ((trace_header & 0xff000000) >> 24) != 0xaa ){
233 std::cerr <<
"Invalid trace header: ";
234 std::cerr << ((trace_header & 0xff000000) >> 24);
235 std::cerr << std::endl;
240 bool adc_type = (trace_header & 0x800000) >> 23;
241 bool filter_on = (trace_header & 0x80000) >> 19;
242 bool filter_mode = (trace_header & 0x40000) >> 18;
244 for( UInt_t i = 0; i <
nsamples; i++ ) {
246 auto sample_packet =
data[pos++];
258 if( adc_type )
febex_data->AddSample( ( sample_packet >> 16 ) & 0x00003FFF );
259 else febex_data->AddSample( ( sample_packet >> 16 ) & 0x00000FFF );
261 bool filter_sign = (sample_packet & 0x800000) >> 23;
262 int filter_energy = sample_packet & 0x7fffff;
263 if( filter_sign ) filter_energy *= -1.0;
272 febex_data->AddSample( sample_packet & 0x00003FFF );
273 febex_data->AddSample( ( sample_packet >> 16 ) & 0x00003FFF );
279 febex_data->AddSample( sample_packet & 0x00000FFF );
280 febex_data->AddSample( ( sample_packet >> 16 ) & 0x00000FFF );
298 if(
set->GetMbsEventMode() )
315 auto tracetrailer =
data[pos++];
316 if( ((tracetrailer & 0xff000000) >> 24) != 0xbb ){
317 std::cerr <<
"Invalid trace trailer: ";
318 std::cerr << ((tracetrailer & 0xff000000) >> 24);
319 std::cerr << std::endl;
377 unsigned long long time_corr;
437 std::shared_ptr<MiniballDataPackets> data_packet =
438 std::make_shared<MiniballDataPackets>(
info_data );
440 data_map.push_back( std::make_pair<unsigned long,double>(
465 std::shared_ptr<MiniballDataPackets> data_packet =
466 std::make_shared<MiniballDataPackets>(
febex_data );
468 data_map.push_back( std::make_pair<unsigned long,double>(
502 unsigned long start_subevt,
509 std::ifstream input_file( input_file_name, std::ios::in|std::ios::binary );
510 if( !input_file.is_open() ){
512 std::cout <<
"Cannot open " << input_file_name << std::endl;
521 input_file.seekg( 0, input_file.end );
522 unsigned long long size_end = input_file.tellg();
523 input_file.seekg( 0, input_file.beg );
524 unsigned long long size_beg = input_file.tellg();
525 unsigned long long FILE_SIZE = size_end - size_beg;
528 unsigned long BLOCKS_NUM = FILE_SIZE /
set->GetBlockSize();
531 if( FILE_SIZE %
set->GetBlockSize() != 0 ){
533 std::cout <<
" *WARNING* " << __PRETTY_FUNCTION__;
534 std::cout <<
"\tMissing data blocks?" << std::endl;
538 sslogs <<
"\t File size = " << FILE_SIZE << std::endl;
539 sslogs <<
"\tBlock size = " <<
set->GetBlockSize() << std::endl;
540 sslogs <<
"\t N blocks = " << BLOCKS_NUM << std::endl;
542 std::cout <<
sslogs.str() << std::endl;
543 sslogs.str( std::string() );
549 std::cout <<
"Opening file: " << input_file_name << std::endl;
555 unsigned long mbsevt = 0, nblock = 0;
556 for( mbsevt = 0; ; mbsevt++ ){
560 if( nblock % 200 == 0 || nblock+1 == BLOCKS_NUM ) {
563 float percent = (float)(nblock+1)*100.0/(float)BLOCKS_NUM;
568 prog->SetPosition( percent );
569 gSystem->ProcessEvents();
574 std::cout <<
" " << std::setw(8) << std::setprecision(4);
575 std::cout << percent <<
"%\r";
586 std::cout <<
"Bad event ID in data" << std::endl;
594 if( mbsevt < start_subevt || ( (
long)mbsevt > end_subevt && end_subevt > 0 ) )
606 std::cout << std::endl;
607 std::cout <<
"Number of single hits = " <<
n_single_hits << std::endl;
608 std::cout <<
"Number of double hits = " <<
n_double_hits << std::endl;