fix data saving bug, added SolReader
This commit is contained in:
parent
338aeb0475
commit
6cf0d30d8b
50
.vscode/settings.json
vendored
Normal file
50
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"cctype": "cpp",
|
||||||
|
"clocale": "cpp",
|
||||||
|
"cmath": "cpp",
|
||||||
|
"cstdarg": "cpp",
|
||||||
|
"cstddef": "cpp",
|
||||||
|
"cstdio": "cpp",
|
||||||
|
"cstdlib": "cpp",
|
||||||
|
"cstring": "cpp",
|
||||||
|
"cwchar": "cpp",
|
||||||
|
"cwctype": "cpp",
|
||||||
|
"array": "cpp",
|
||||||
|
"atomic": "cpp",
|
||||||
|
"bit": "cpp",
|
||||||
|
"*.tcc": "cpp",
|
||||||
|
"compare": "cpp",
|
||||||
|
"concepts": "cpp",
|
||||||
|
"cstdint": "cpp",
|
||||||
|
"deque": "cpp",
|
||||||
|
"list": "cpp",
|
||||||
|
"string": "cpp",
|
||||||
|
"unordered_map": "cpp",
|
||||||
|
"vector": "cpp",
|
||||||
|
"exception": "cpp",
|
||||||
|
"algorithm": "cpp",
|
||||||
|
"functional": "cpp",
|
||||||
|
"iterator": "cpp",
|
||||||
|
"memory": "cpp",
|
||||||
|
"memory_resource": "cpp",
|
||||||
|
"numeric": "cpp",
|
||||||
|
"random": "cpp",
|
||||||
|
"string_view": "cpp",
|
||||||
|
"system_error": "cpp",
|
||||||
|
"tuple": "cpp",
|
||||||
|
"type_traits": "cpp",
|
||||||
|
"utility": "cpp",
|
||||||
|
"initializer_list": "cpp",
|
||||||
|
"iosfwd": "cpp",
|
||||||
|
"limits": "cpp",
|
||||||
|
"new": "cpp",
|
||||||
|
"numbers": "cpp",
|
||||||
|
"ostream": "cpp",
|
||||||
|
"stdexcept": "cpp",
|
||||||
|
"streambuf": "cpp",
|
||||||
|
"cinttypes": "cpp",
|
||||||
|
"typeinfo": "cpp",
|
||||||
|
"script.C": "cpp"
|
||||||
|
}
|
||||||
|
}
|
|
@ -180,7 +180,7 @@ void Digitizer2Gen::StopACQ(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Digitizer2Gen::SetPHADataFormat(unsigned dataFormat){
|
void Digitizer2Gen::SetPHADataFormat(unsigned short dataFormat){
|
||||||
|
|
||||||
///========== get endpoint and endpoint folder handle
|
///========== get endpoint and endpoint folder handle
|
||||||
if( dataFormat < 15 ){
|
if( dataFormat < 15 ){
|
||||||
|
@ -307,7 +307,7 @@ void Digitizer2Gen::SetPHADataFormat(unsigned dataFormat){
|
||||||
|
|
||||||
int Digitizer2Gen::ReadData(){
|
int Digitizer2Gen::ReadData(){
|
||||||
//printf("========= %s \n", __func__);
|
//printf("========= %s \n", __func__);
|
||||||
|
|
||||||
if( evt->dataType == 0){
|
if( evt->dataType == 0){
|
||||||
ret = CAEN_FELib_ReadData(ep_handle, 100,
|
ret = CAEN_FELib_ReadData(ep_handle, 100,
|
||||||
&evt->channel,
|
&evt->channel,
|
||||||
|
@ -315,12 +315,12 @@ int Digitizer2Gen::ReadData(){
|
||||||
&evt->fine_timestamp,
|
&evt->fine_timestamp,
|
||||||
&evt->timestamp_ns,
|
&evt->timestamp_ns,
|
||||||
&evt->energy,
|
&evt->energy,
|
||||||
&evt->analog_probes[0],
|
evt->analog_probes[0],
|
||||||
&evt->analog_probes[1],
|
evt->analog_probes[1],
|
||||||
&evt->digital_probes[0],
|
evt->digital_probes[0],
|
||||||
&evt->digital_probes[1],
|
evt->digital_probes[1],
|
||||||
&evt->digital_probes[2],
|
evt->digital_probes[2],
|
||||||
&evt->digital_probes[3],
|
evt->digital_probes[3],
|
||||||
&evt->analog_probes_type[0],
|
&evt->analog_probes_type[0],
|
||||||
&evt->analog_probes_type[1],
|
&evt->analog_probes_type[1],
|
||||||
&evt->digital_probes_type[0],
|
&evt->digital_probes_type[0],
|
||||||
|
@ -343,7 +343,7 @@ int Digitizer2Gen::ReadData(){
|
||||||
&evt->timestamp,
|
&evt->timestamp,
|
||||||
&evt->fine_timestamp,
|
&evt->fine_timestamp,
|
||||||
&evt->energy,
|
&evt->energy,
|
||||||
&evt->analog_probes[0],
|
evt->analog_probes[0],
|
||||||
&evt->analog_probes_type[0],
|
&evt->analog_probes_type[0],
|
||||||
&evt->traceLenght,
|
&evt->traceLenght,
|
||||||
&evt->flags_low_priority,
|
&evt->flags_low_priority,
|
||||||
|
@ -435,12 +435,12 @@ void Digitizer2Gen::SaveDataToFile(){
|
||||||
fwrite(&evt->traceLenght, 8, 1, outFile);
|
fwrite(&evt->traceLenght, 8, 1, outFile);
|
||||||
fwrite(evt->analog_probes_type, 2, 1, outFile);
|
fwrite(evt->analog_probes_type, 2, 1, outFile);
|
||||||
fwrite(evt->digital_probes_type, 4, 1, outFile);
|
fwrite(evt->digital_probes_type, 4, 1, outFile);
|
||||||
fwrite(&evt->analog_probes[0], evt->traceLenght*4, 1, outFile);
|
fwrite(evt->analog_probes[0], evt->traceLenght*4, 1, outFile);
|
||||||
fwrite(&evt->analog_probes[1], evt->traceLenght*4, 1, outFile);
|
fwrite(evt->analog_probes[1], evt->traceLenght*4, 1, outFile);
|
||||||
fwrite(&evt->digital_probes[0], evt->traceLenght, 1, outFile);
|
fwrite(evt->digital_probes[0], evt->traceLenght, 1, outFile);
|
||||||
fwrite(&evt->digital_probes[1], evt->traceLenght, 1, outFile);
|
fwrite(evt->digital_probes[1], evt->traceLenght, 1, outFile);
|
||||||
fwrite(&evt->digital_probes[2], evt->traceLenght, 1, outFile);
|
fwrite(evt->digital_probes[2], evt->traceLenght, 1, outFile);
|
||||||
fwrite(&evt->digital_probes[3], evt->traceLenght, 1, outFile);
|
fwrite(evt->digital_probes[3], evt->traceLenght, 1, outFile);
|
||||||
}else if( evt->dataType == 1){
|
}else if( evt->dataType == 1){
|
||||||
fwrite(&dataStartIndetifier, 2, 1, outFile);
|
fwrite(&dataStartIndetifier, 2, 1, outFile);
|
||||||
fwrite(&evt->channel, 1, 1, outFile);
|
fwrite(&evt->channel, 1, 1, outFile);
|
||||||
|
@ -451,7 +451,7 @@ void Digitizer2Gen::SaveDataToFile(){
|
||||||
fwrite(&evt->flags_low_priority, 2, 1, outFile);
|
fwrite(&evt->flags_low_priority, 2, 1, outFile);
|
||||||
fwrite(&evt->traceLenght, 8, 1, outFile);
|
fwrite(&evt->traceLenght, 8, 1, outFile);
|
||||||
fwrite(&evt->analog_probes_type[0], 1, 1, outFile);
|
fwrite(&evt->analog_probes_type[0], 1, 1, outFile);
|
||||||
fwrite(&evt->analog_probes[0], evt->traceLenght*4, 1, outFile);
|
fwrite(evt->analog_probes[0], evt->traceLenght*4, 1, outFile);
|
||||||
}else if( evt->dataType == 2){
|
}else if( evt->dataType == 2){
|
||||||
fwrite(&dataStartIndetifier, 2, 1, outFile);
|
fwrite(&dataStartIndetifier, 2, 1, outFile);
|
||||||
fwrite(&evt->channel, 1, 1, outFile);
|
fwrite(&evt->channel, 1, 1, outFile);
|
||||||
|
@ -466,6 +466,8 @@ void Digitizer2Gen::SaveDataToFile(){
|
||||||
fwrite(&evt->energy, 2, 1, outFile);
|
fwrite(&evt->energy, 2, 1, outFile);
|
||||||
fwrite(&evt->timestamp, 6, 1, outFile);
|
fwrite(&evt->timestamp, 6, 1, outFile);
|
||||||
}else if( evt->dataType == 15){
|
}else if( evt->dataType == 15){
|
||||||
|
fwrite(&dataStartIndetifier, 2, 1, outFile);
|
||||||
|
fwrite(&evt->dataSize, 8, 1, outFile);
|
||||||
fwrite(evt->data, evt->dataSize, 1, outFile);
|
fwrite(evt->data, evt->dataSize, 1, outFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -496,10 +498,10 @@ void Digitizer2Gen::ProgramPHA(bool testPulse){
|
||||||
WriteValue("/ch/0..63/par/ChPreTriggerS" , "100");
|
WriteValue("/ch/0..63/par/ChPreTriggerS" , "100");
|
||||||
WriteValue("/ch/0..63/par/WaveResolution" , "RES8"); /// 8 ns
|
WriteValue("/ch/0..63/par/WaveResolution" , "RES8"); /// 8 ns
|
||||||
WriteValue("/ch/0..63/par/WaveAnalogProbe0" , "ADCInput");
|
WriteValue("/ch/0..63/par/WaveAnalogProbe0" , "ADCInput");
|
||||||
WriteValue("/ch/0..63/par/WaveAnalogProbe1" , "TimeFilter");
|
WriteValue("/ch/0..63/par/WaveAnalogProbe1" , "EnergyFilter");
|
||||||
WriteValue("/ch/0..63/par/WaveDigitalProbe0" , "Trigger");
|
WriteValue("/ch/0..63/par/WaveDigitalProbe0" , "Trigger");
|
||||||
WriteValue("/ch/0..63/par/WaveDigitalProbe1" , "TimeFilterArmed");
|
WriteValue("/ch/0..63/par/WaveDigitalProbe1" , "TimeFilterArmed");
|
||||||
WriteValue("/ch/0..63/par/WaveDigitalProbe2" , "EnergyFilterBaselineFreeze");
|
WriteValue("/ch/0..63/par/WaveDigitalProbe2" , "EnergyFilterPeaking");
|
||||||
WriteValue("/ch/0..63/par/WaveDigitalProbe3" , "EnergyFilterPeakReady");
|
WriteValue("/ch/0..63/par/WaveDigitalProbe3" , "EnergyFilterPeakReady");
|
||||||
|
|
||||||
// Event configuration
|
// Event configuration
|
||||||
|
@ -507,7 +509,7 @@ void Digitizer2Gen::ProgramPHA(bool testPulse){
|
||||||
|
|
||||||
// Filter parameters
|
// Filter parameters
|
||||||
WriteValue("/ch/0..63/par/TimeFilterRiseTimeS" , "10");
|
WriteValue("/ch/0..63/par/TimeFilterRiseTimeS" , "10");
|
||||||
WriteValue("/ch/0..63/par/TriggerThr" , "3");
|
WriteValue("/ch/0..63/par/TriggerThr" , "100");
|
||||||
WriteValue("/ch/0..63/par/PulsePolarity" , "Positive");
|
WriteValue("/ch/0..63/par/PulsePolarity" , "Positive");
|
||||||
WriteValue("/ch/0..63/par/EnergyFilterBaselineAvg" , "Medium");
|
WriteValue("/ch/0..63/par/EnergyFilterBaselineAvg" , "Medium");
|
||||||
WriteValue("/ch/0..63/par/EnergyFilterFineGain" , "1.0");
|
WriteValue("/ch/0..63/par/EnergyFilterFineGain" , "1.0");
|
||||||
|
@ -526,7 +528,6 @@ void Digitizer2Gen::ProgramPHA(bool testPulse){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string Digitizer2Gen::ErrorMsg(const char * funcName){
|
std::string Digitizer2Gen::ErrorMsg(const char * funcName){
|
||||||
printf("======== %s | %s\n",__func__, funcName);
|
printf("======== %s | %s\n",__func__, funcName);
|
||||||
char msg[1024];
|
char msg[1024];
|
||||||
|
|
|
@ -65,7 +65,7 @@ class Digitizer2Gen {
|
||||||
void StartACQ();
|
void StartACQ();
|
||||||
void StopACQ();
|
void StopACQ();
|
||||||
|
|
||||||
void SetPHADataFormat(unsigned dataFormat); // 0 = all data,
|
void SetPHADataFormat(unsigned short dataFormat); // 0 = all data,
|
||||||
// 1 = analog trace-0 only + flags
|
// 1 = analog trace-0 only + flags
|
||||||
// 2 = no trace, only ch, energy, timestamp, fine_timestamp + flags
|
// 2 = no trace, only ch, energy, timestamp, fine_timestamp + flags
|
||||||
// 3 = only ch, energy, timestamp, minimum
|
// 3 = only ch, energy, timestamp, minimum
|
||||||
|
|
75
Event.h
75
Event.h
|
@ -27,7 +27,7 @@ class Event {
|
||||||
uint8_t analog_probes_type[2]; // 3 bit
|
uint8_t analog_probes_type[2]; // 3 bit
|
||||||
uint8_t digital_probes_type[4]; // 4 bit
|
uint8_t digital_probes_type[4]; // 4 bit
|
||||||
int32_t * analog_probes[2]; // 18 bit
|
int32_t * analog_probes[2]; // 18 bit
|
||||||
uint8_t * digital_probes[2]; // 1 bit
|
uint8_t * digital_probes[4]; // 1 bit
|
||||||
uint16_t trigger_threashold; // 16 bit
|
uint16_t trigger_threashold; // 16 bit
|
||||||
size_t event_size; // 64 bit
|
size_t event_size; // 64 bit
|
||||||
uint32_t aggCounter; // 32 bit
|
uint32_t aggCounter; // 32 bit
|
||||||
|
@ -54,24 +54,22 @@ class Event {
|
||||||
void ClearMemory(){
|
void ClearMemory(){
|
||||||
if( data != NULL ) delete data;
|
if( data != NULL ) delete data;
|
||||||
|
|
||||||
if( analog_probes != NULL) {
|
if( analog_probes[0] != NULL) delete analog_probes[0];
|
||||||
delete analog_probes[0];
|
if( analog_probes[1] != NULL) delete analog_probes[1];
|
||||||
delete analog_probes[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
if( digital_probes != NULL) {
|
if( digital_probes[0] != NULL) delete digital_probes[0];
|
||||||
delete digital_probes[0];
|
if( digital_probes[1] != NULL) delete digital_probes[1];
|
||||||
delete digital_probes[1];
|
if( digital_probes[2] != NULL) delete digital_probes[2];
|
||||||
delete digital_probes[2];
|
if( digital_probes[3] != NULL) delete digital_probes[3];
|
||||||
delete digital_probes[3];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetDataType(unsigned int type){
|
void SetDataType(unsigned int type){
|
||||||
dataType = type;
|
dataType = type;
|
||||||
ClearMemory();
|
ClearMemory();
|
||||||
|
|
||||||
if( dataType != 0xF){
|
if( dataType == 0xF){
|
||||||
|
data = new uint8_t[20*1024*1024];
|
||||||
|
}else{
|
||||||
analog_probes[0] = new int32_t[MaxTraceLenght];
|
analog_probes[0] = new int32_t[MaxTraceLenght];
|
||||||
analog_probes[1] = new int32_t[MaxTraceLenght];
|
analog_probes[1] = new int32_t[MaxTraceLenght];
|
||||||
|
|
||||||
|
@ -79,8 +77,7 @@ class Event {
|
||||||
digital_probes[1] = new uint8_t[MaxTraceLenght];
|
digital_probes[1] = new uint8_t[MaxTraceLenght];
|
||||||
digital_probes[2] = new uint8_t[MaxTraceLenght];
|
digital_probes[2] = new uint8_t[MaxTraceLenght];
|
||||||
digital_probes[3] = new uint8_t[MaxTraceLenght];
|
digital_probes[3] = new uint8_t[MaxTraceLenght];
|
||||||
}else{
|
|
||||||
data = new uint8_t[20*1024*1024];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -89,13 +86,57 @@ class Event {
|
||||||
printf("ch: %2d, energy: %u, timestamp: %lu ch, traceLenght: %lu\n", channel, energy, timestamp, traceLenght);
|
printf("ch: %2d, energy: %u, timestamp: %lu ch, traceLenght: %lu\n", channel, energy, timestamp, traceLenght);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string AnaProbeType(uint8_t probeType){
|
||||||
|
switch(probeType){
|
||||||
|
case 0: return "ADC";
|
||||||
|
case 1: return "Time filter";
|
||||||
|
case 2: return "Energy filter";
|
||||||
|
default : return "none";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string DigiProbeType(uint8_t probeType){
|
||||||
|
switch(probeType){
|
||||||
|
case 0: return "Trigger";
|
||||||
|
case 1: return "Time filter armed";
|
||||||
|
case 2: return "Re-trigger guard";
|
||||||
|
case 3: return "Energy filter baseline freeze";
|
||||||
|
case 4: return "Energy filter peaking";
|
||||||
|
case 5: return "Energy filter peaking ready";
|
||||||
|
case 6: return "Energy filter pile-up guard";
|
||||||
|
case 7: return "Event pile-up";
|
||||||
|
case 8: return "ADC saturation";
|
||||||
|
case 9: return "ADC saturation protection";
|
||||||
|
case 10: return "Post-saturation event";
|
||||||
|
case 11: return "Energy filter saturation";
|
||||||
|
case 12: return "Signal inhibit";
|
||||||
|
default : return "none";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PrintAll(){
|
void PrintAll(){
|
||||||
|
printf("============= Type : %u\n", dataType);
|
||||||
printf("ch : %2d (0x%02X), fail: %d, flush: %d\n", channel, channel, board_fail, flush);
|
printf("ch : %2d (0x%02X), fail: %d, flush: %d\n", channel, channel, board_fail, flush);
|
||||||
printf("energy: %u, timestamp: %lu, fine_timestamp: %u \n", energy, timestamp, fine_timestamp);
|
printf("energy: %u, timestamp: %lu, fine_timestamp: %u \n", energy, timestamp, fine_timestamp);
|
||||||
printf("flag (high): 0x%02X, (low): 0x%03X, traceLength: %lu\n", flags_high_priority, flags_low_priority, traceLenght);
|
printf("flag (high): 0x%02X, (low): 0x%03X, traceLength: %lu\n", flags_high_priority, flags_low_priority, traceLenght);
|
||||||
printf("Agg counter : %u, trigger : %u, downSampling: %u \n", aggCounter, trigger_threashold, downSampling);
|
printf("Agg counter : %u, trigger Thr.: %u, downSampling: %u \n", aggCounter, trigger_threashold, downSampling);
|
||||||
printf("AnaProbe Type: %u, %u\n", analog_probes_type[0], analog_probes_type[1]);
|
printf("AnaProbe Type: %s(%u), %s(%u)\n", AnaProbeType(analog_probes_type[0]).c_str(), analog_probes_type[0],
|
||||||
printf("DigProbe Type: %u, %u, %u, %u\n", digital_probes_type[0], digital_probes_type[1], digital_probes_type[2], digital_probes_type[3]);
|
AnaProbeType(analog_probes_type[1]).c_str(), analog_probes_type[1]);
|
||||||
|
printf("DigProbe Type: %s(%u), %s(%u), %s(%u), %s(%u)\n", DigiProbeType(digital_probes_type[0]).c_str(), digital_probes_type[0],
|
||||||
|
DigiProbeType(digital_probes_type[1]).c_str(), digital_probes_type[1],
|
||||||
|
DigiProbeType(digital_probes_type[2]).c_str(), digital_probes_type[2],
|
||||||
|
DigiProbeType(digital_probes_type[3]).c_str(), digital_probes_type[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintTrace(unsigned short ID){
|
||||||
|
for(int i = 0; i < traceLenght; i++){
|
||||||
|
if( ID == 0 ) printf("%4d| %6d\n", i, analog_probes[0][i]);
|
||||||
|
if( ID == 1 ) printf("%4d| %6d\n", i, analog_probes[1][i]);
|
||||||
|
if( ID == 2 ) printf("%4d| %u\n", i, digital_probes[0][i]);
|
||||||
|
if( ID == 3 ) printf("%4d| %u\n", i, digital_probes[1][i]);
|
||||||
|
if( ID == 4 ) printf("%4d| %u\n", i, digital_probes[2][i]);
|
||||||
|
if( ID == 5 ) printf("%4d| %u\n", i, digital_probes[3][i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintAllTrace(){
|
void PrintAllTrace(){
|
||||||
|
|
191
SolReader.h
Normal file
191
SolReader.h
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
#ifndef SOLREADER_H
|
||||||
|
#define SOLREADER_H
|
||||||
|
|
||||||
|
#include <stdio.h> /// for FILE
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <time.h> // time in nano-sec
|
||||||
|
|
||||||
|
#include "Event.h"
|
||||||
|
|
||||||
|
class SolReader {
|
||||||
|
private:
|
||||||
|
FILE * inFile;
|
||||||
|
unsigned int inFileSize;
|
||||||
|
unsigned int filePos;
|
||||||
|
unsigned int totNumBlock;
|
||||||
|
|
||||||
|
unsigned short blockStart;
|
||||||
|
unsigned int numBlock;
|
||||||
|
|
||||||
|
void init();
|
||||||
|
|
||||||
|
public:
|
||||||
|
SolReader();
|
||||||
|
SolReader(std::string fileName, unsigned short dataType);
|
||||||
|
~SolReader();
|
||||||
|
|
||||||
|
void OpenFile(std::string fileName);
|
||||||
|
int ReadBlock(int opt); // opt = 0, noraml, 1, fast
|
||||||
|
|
||||||
|
void ScanNumBlock();
|
||||||
|
|
||||||
|
unsigned int GetNumBlock(){return numBlock;}
|
||||||
|
|
||||||
|
Event * evt;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
void SolReader::init(){
|
||||||
|
numBlock = 0;
|
||||||
|
filePos = 0;
|
||||||
|
totNumBlock = 0;
|
||||||
|
evt = new Event();
|
||||||
|
}
|
||||||
|
|
||||||
|
SolReader::SolReader(){
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
SolReader::SolReader(std::string fileName, unsigned short dataType = 0){
|
||||||
|
init();
|
||||||
|
OpenFile(fileName);
|
||||||
|
evt->SetDataType(dataType);
|
||||||
|
}
|
||||||
|
|
||||||
|
SolReader::~SolReader(){
|
||||||
|
if( !inFile ) fclose(inFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void SolReader::OpenFile(std::string fileName){
|
||||||
|
inFile = fopen(fileName.c_str(), "r");
|
||||||
|
if( inFile == NULL ){
|
||||||
|
printf("Cannot open file : %s \n", fileName.c_str());
|
||||||
|
}else{
|
||||||
|
fseek(inFile, 0L, SEEK_END);
|
||||||
|
inFileSize = ftell(inFile);
|
||||||
|
rewind(inFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int SolReader::ReadBlock(int opt = 0){
|
||||||
|
if( inFile == NULL ) return -1;
|
||||||
|
if( feof(inFile) ) return -1;
|
||||||
|
if( inFileSize < filePos) return -1;
|
||||||
|
|
||||||
|
fread(&blockStart, 2, 1, inFile);
|
||||||
|
|
||||||
|
if( (blockStart & 0xAAA0) != 0xAAA0 ) {
|
||||||
|
printf("header fail.\n");
|
||||||
|
return -2 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( blockStart & 0xF ) == 15 ){
|
||||||
|
evt->SetDataType(15);
|
||||||
|
}
|
||||||
|
evt->dataType = blockStart & 0xF;
|
||||||
|
|
||||||
|
if( evt->dataType == 0){
|
||||||
|
if( opt == 0 ){
|
||||||
|
fread(&evt->channel, 1, 1, inFile);
|
||||||
|
fread(&evt->energy, 2, 1, inFile);
|
||||||
|
fread(&evt->timestamp, 6, 1, inFile);
|
||||||
|
fread(&evt->fine_timestamp, 2, 1, inFile);
|
||||||
|
fread(&evt->flags_high_priority, 1, 1, inFile);
|
||||||
|
fread(&evt->flags_low_priority, 2, 1, inFile);
|
||||||
|
fread(&evt->downSampling, 1, 1, inFile);
|
||||||
|
fread(&evt->board_fail, 1, 1, inFile);
|
||||||
|
fread(&evt->flush, 1, 1, inFile);
|
||||||
|
fread(&evt->trigger_threashold, 2, 1, inFile);
|
||||||
|
fread(&evt->event_size, 8, 1, inFile);
|
||||||
|
fread(&evt->aggCounter, 4, 1, inFile);
|
||||||
|
}else{
|
||||||
|
fseek(inFile, 31, SEEK_CUR);
|
||||||
|
}
|
||||||
|
fread(&evt->traceLenght, 8, 1, inFile);
|
||||||
|
if( opt == 0){
|
||||||
|
fread(evt->analog_probes_type, 2, 1, inFile);
|
||||||
|
fread(evt->digital_probes_type, 4, 1, inFile);
|
||||||
|
fread(evt->analog_probes[0], evt->traceLenght*4, 1, inFile);
|
||||||
|
fread(evt->analog_probes[1], evt->traceLenght*4, 1, inFile);
|
||||||
|
fread(evt->digital_probes[0], evt->traceLenght, 1, inFile);
|
||||||
|
fread(evt->digital_probes[1], evt->traceLenght, 1, inFile);
|
||||||
|
fread(evt->digital_probes[2], evt->traceLenght, 1, inFile);
|
||||||
|
fread(evt->digital_probes[3], evt->traceLenght, 1, inFile);
|
||||||
|
}else{
|
||||||
|
fseek(inFile, 6 + evt->traceLenght*(12), SEEK_CUR);
|
||||||
|
}
|
||||||
|
}else if( evt->dataType == 1){
|
||||||
|
if( opt == 0 ){
|
||||||
|
fread(&evt->channel, 1, 1, inFile);
|
||||||
|
fread(&evt->energy, 2, 1, inFile);
|
||||||
|
fread(&evt->timestamp, 6, 1, inFile);
|
||||||
|
fread(&evt->fine_timestamp, 2, 1, inFile);
|
||||||
|
fread(&evt->flags_high_priority, 1, 1, inFile);
|
||||||
|
fread(&evt->flags_low_priority, 2, 1, inFile);
|
||||||
|
}else{
|
||||||
|
fseek(inFile, 14, SEEK_CUR);
|
||||||
|
}
|
||||||
|
fread(&evt->traceLenght, 8, 1, inFile);
|
||||||
|
if( opt == 0){
|
||||||
|
fread(&evt->analog_probes_type[0], 1, 1, inFile);
|
||||||
|
fread(evt->analog_probes[0], evt->traceLenght*4, 1, inFile);
|
||||||
|
}else{
|
||||||
|
fseek(inFile, 1 + evt->traceLenght*4, SEEK_CUR);
|
||||||
|
}
|
||||||
|
}else if( evt->dataType == 2){
|
||||||
|
if( opt == 0 ){
|
||||||
|
fread(&evt->channel, 1, 1, inFile);
|
||||||
|
fread(&evt->energy, 2, 1, inFile);
|
||||||
|
fread(&evt->timestamp, 6, 1, inFile);
|
||||||
|
fread(&evt->fine_timestamp, 2, 1, inFile);
|
||||||
|
fread(&evt->flags_high_priority, 1, 1, inFile);
|
||||||
|
fread(&evt->flags_low_priority, 2, 1, inFile);
|
||||||
|
}else{
|
||||||
|
fseek(inFile, 14, SEEK_CUR);
|
||||||
|
}
|
||||||
|
}else if( evt->dataType == 3){
|
||||||
|
if( opt == 0 ){
|
||||||
|
fread(&evt->channel, 1, 1, inFile);
|
||||||
|
fread(&evt->energy, 2, 1, inFile);
|
||||||
|
fread(&evt->timestamp, 6, 1, inFile);
|
||||||
|
}else{
|
||||||
|
fseek(inFile, 9, SEEK_CUR);
|
||||||
|
}
|
||||||
|
}else if( evt->dataType == 15){
|
||||||
|
fread(&evt->dataSize, 8, 1, inFile);
|
||||||
|
if( opt == 0){
|
||||||
|
fread(evt->data, evt->dataSize, 1, inFile);
|
||||||
|
}else{
|
||||||
|
fseek(inFile, evt->dataSize, SEEK_CUR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
numBlock ++;
|
||||||
|
filePos = ftell(inFile);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SolReader::ScanNumBlock(){
|
||||||
|
if( inFile == NULL ) return;
|
||||||
|
if( feof(inFile) ) return;
|
||||||
|
|
||||||
|
while( ReadBlock(1) == 0){
|
||||||
|
//printf("%u, traceLen %lu, %u/%u\n", numBlock, evt->traceLenght, filePos, inFileSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
totNumBlock = numBlock;
|
||||||
|
numBlock = 0;
|
||||||
|
|
||||||
|
printf("Scan complete: number of data Block : %u\n", totNumBlock);
|
||||||
|
|
||||||
|
rewind(inFile);
|
||||||
|
filePos = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
28
script.C
Normal file
28
script.C
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#include "SolReader.h"
|
||||||
|
|
||||||
|
void script(){
|
||||||
|
|
||||||
|
SolReader * reader = new SolReader("haha_000.sol");
|
||||||
|
Event * evt = reader->evt;
|
||||||
|
|
||||||
|
reader->ScanNumBlock();
|
||||||
|
|
||||||
|
|
||||||
|
for( int i = 0; i < 2; i++){
|
||||||
|
printf("########### nBlock : %u\n", reader->GetNumBlock());
|
||||||
|
reader->ReadBlock();
|
||||||
|
evt->PrintAll();
|
||||||
|
reader->evt->PrintAllTrace();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//printf("reader traceLength : %lu \n", evt->traceLenght);
|
||||||
|
|
||||||
|
/*
|
||||||
|
for( int i = 0; i < evt->traceLenght; i++){
|
||||||
|
|
||||||
|
printf("%4d| %d\n", i, evt->analog_probes[0][i]);
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
6
test.cpp
6
test.cpp
|
@ -12,6 +12,8 @@ int main(int argc, char* argv[]){
|
||||||
printf("\t CAEN firmware DPP-PHA testing \n");
|
printf("\t CAEN firmware DPP-PHA testing \n");
|
||||||
printf("##########################################\n");
|
printf("##########################################\n");
|
||||||
|
|
||||||
|
remove("haha_000.sol");
|
||||||
|
|
||||||
const char * url = "dig2://192.168.0.100/";
|
const char * url = "dig2://192.168.0.100/";
|
||||||
|
|
||||||
Digitizer2Gen * digi = new Digitizer2Gen();
|
Digitizer2Gen * digi = new Digitizer2Gen();
|
||||||
|
@ -69,9 +71,7 @@ int main(int argc, char* argv[]){
|
||||||
//printf("0x%016lX \n", *(digi->evt.GetWord3()));
|
//printf("0x%016lX \n", *(digi->evt.GetWord3()));
|
||||||
//printf("0x%016lX \n", *(digi->evt.GetWord4()));
|
//printf("0x%016lX \n", *(digi->evt.GetWord4()));
|
||||||
|
|
||||||
|
digi->SaveDataToFile();
|
||||||
|
|
||||||
//digi->SaveDataToFile();
|
|
||||||
|
|
||||||
if( digi->evt->channel == 63 ) {
|
if( digi->evt->channel == 63 ) {
|
||||||
clock_gettime(CLOCK_REALTIME, &t1);
|
clock_gettime(CLOCK_REALTIME, &t1);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user