111 lines
3.4 KiB
C++
111 lines
3.4 KiB
C++
//This file contains structures and functions used for processing the HIT2017 files
|
|
#include <fstream>
|
|
#include <iostream>
|
|
|
|
using namespace std;
|
|
|
|
#define DATA_SAMPLES_PER_SENSOR 64
|
|
#define DATA_SENSORS_PER_BOARD 2
|
|
|
|
//**** Structure definitions ****
|
|
|
|
typedef struct SyncFrame
|
|
{
|
|
//unsigned short channel_id;
|
|
unsigned short local_ctr;// local counter // 16 bits, possibly different for each board
|
|
unsigned short global_ctr; //global counter same for all board up to 512
|
|
unsigned short sma_state; //external signal input (external timestamper)
|
|
//these files are additional compared to STM side
|
|
unsigned short dummy = 0xFFFF; //spacer for nice structure packing
|
|
int device_nr; //device number
|
|
int data_ok; //0 = not ok, anything else is ok
|
|
} SyncFrame;
|
|
|
|
typedef struct BufferData
|
|
{
|
|
SyncFrame sync_frame;
|
|
unsigned short sensor_data[DATA_SENSORS_PER_BOARD * DATA_SAMPLES_PER_SENSOR];
|
|
} BufferData;
|
|
|
|
//**** Interface functions ****
|
|
|
|
//Read some data from a binary HIT2017 file
|
|
// The data are grouped in block of BufferData type. Each block is a single frame
|
|
// from one detector board. If there are more than 1 board, the data is ordered sequentially:
|
|
// B1F1 B2F1 .. BmF1 B1F2 B2F2 .. BmF2 .. B1Fn B2Fn .. BmFn
|
|
// where Bx stands for board x (1..m) and Fx stands for frame x (1..n)
|
|
// User can read files in smaller blocks by specifying the first block and the number of blocks
|
|
// to be read. The function will return the number of correctly read blocks.
|
|
// The user must allocate memory for the data before running the function.
|
|
// If smaller number of blocks was read than specified, the remaining data in the
|
|
// allocated memory should be considered invalid.
|
|
//Parameters:
|
|
// filename: name of the file to read (with extension)
|
|
// first: number of first data record (starting with 0)
|
|
// nr: number of data records to be read (one record is one board!
|
|
// dataptr: a pointer to an allocaced memory block with min size = sizeof(BufferData)*nr
|
|
//Returned value: number of records read.
|
|
int hit_read_binary_file(const char* file, int first, int nr, BufferData* dataptr);
|
|
|
|
|
|
|
|
|
|
|
|
//**** Function bodies ****
|
|
|
|
int hit_read_binary_file(const char* filename, int first, int nr, BufferData* dataptr)
|
|
{
|
|
|
|
ifstream file(filename, ifstream::in | ifstream::binary);
|
|
|
|
if (!file.is_open()){
|
|
return -1; //file could not be opened
|
|
}
|
|
//seek to right position
|
|
file.seekg(first*sizeof(BufferData));
|
|
|
|
//read data
|
|
file.read((char*)dataptr, nr*sizeof(BufferData));
|
|
int blocks_read = file.gcount() / sizeof(BufferData);
|
|
|
|
// //close the file
|
|
file.close();
|
|
|
|
return blocks_read;
|
|
}
|
|
|
|
int getFileSize(const char* filename)
|
|
{
|
|
ifstream file(filename, ifstream::in | ifstream::binary);
|
|
|
|
if(!file.is_open())
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
file.seekg(0, ios::end);
|
|
int fileSize = file.tellg();
|
|
file.close();
|
|
|
|
return fileSize;
|
|
}
|
|
|
|
int getBlock(const char* filename,int block)
|
|
{
|
|
ifstream file(filename, ifstream::in | ifstream::binary);
|
|
|
|
if(!file.is_open())
|
|
{
|
|
return -1;
|
|
}
|
|
file.seekg (block*sizeof(BufferData));
|
|
|
|
BufferData* dataptr = new BufferData();
|
|
file.read ((char*)dataptr ,sizeof(BufferData));
|
|
file.close();
|
|
cout << dataptr->sync_frame.device_nr << endl;
|
|
cout << dataptr->sensor_data[127] << endl;
|
|
|
|
return 0;
|
|
}
|