added read raw data (but very slow, seperated the Event into Event.h

This commit is contained in:
Ryan Tang 2023-01-11 16:14:12 -05:00
parent 35f6ee70c4
commit 338aeb0475
5 changed files with 293 additions and 216 deletions

View File

@ -32,10 +32,12 @@ void Digitizer2Gen::Initialization(){
gateway = ""; gateway = "";
outFileIndex = 0; outFileIndex = 0;
dataStartIndetifier = 0xA345; dataStartIndetifier = 0xAAA0;
outFile = NULL; outFile = NULL;
outFileSize = 0; outFileSize = 0;
evt = NULL;
} }
//########################################### Handles functions //########################################### Handles functions
@ -145,20 +147,7 @@ int Digitizer2Gen::OpenDigitizer(const char * url){
printf(" ADC bits : %d\n", adcBits); printf(" ADC bits : %d\n", adcBits);
printf(" ADC rate : %d Msps, ch2ns : %d ns\n", adcRate, ch2ns); printf(" ADC rate : %d Msps, ch2ns : %d ns\n", adcRate, ch2ns);
printf(" Channels : %d\n", nChannels); printf(" Channels : %d\n", nChannels);
///========== get endpoint and endpoint folder handle
ret = CAEN_FELib_GetHandle(handle, "/endpoint/dpppha", &ep_handle);
if (ret != CAEN_FELib_Success) {
ErrorMsg("Get Handle");
return -2;
}
ret = CAEN_FELib_GetParentHandle(ep_handle, NULL, &ep_folder_handle);
if (ret != CAEN_FELib_Success) {
ErrorMsg("GetParentHandle");
return -3;
}
///SendCommand("/cmd/reset"); ///SendCommand("/cmd/reset");
@ -193,17 +182,36 @@ void Digitizer2Gen::StopACQ(){
void Digitizer2Gen::SetPHADataFormat(unsigned dataFormat){ void Digitizer2Gen::SetPHADataFormat(unsigned dataFormat){
ret = CAEN_FELib_SetValue(ep_folder_handle, "/par/activeendpoint", "dpppha"); ///========== get endpoint and endpoint folder handle
if (ret != CAEN_FELib_Success) { if( dataFormat < 15 ){
ErrorMsg("Set active endpoint");
return; ret = CAEN_FELib_GetHandle(handle, "/endpoint/dpppha", &ep_handle);
ret |= CAEN_FELib_GetParentHandle(ep_handle, NULL, &ep_folder_handle);
ret |= CAEN_FELib_SetValue(ep_folder_handle, "/par/activeendpoint", "dpppha");
if (ret != CAEN_FELib_Success) {
ErrorMsg("Set active endpoint");
return;
}
}else{
ret = CAEN_FELib_GetHandle(handle, "/endpoint/raw", &ep_handle);
ret |= CAEN_FELib_GetParentHandle(ep_handle, NULL, &ep_folder_handle);
ret |= CAEN_FELib_SetValue(ep_folder_handle, "/par/activeendpoint", "raw");
if (ret != CAEN_FELib_Success) {
ErrorMsg("Set active endpoint");
return;
}
} }
dataFormatID = dataFormat; evt = new Event();
evt->SetDataType(dataFormat);
if( dataFormatID == 0 ){ dataStartIndetifier += dataFormat;
ret = CAEN_FELib_SetReadDataFormat(ep_handle, " \
[ \ if( dataFormat == 0 ){
ret = CAEN_FELib_SetReadDataFormat(ep_handle,
"[ \
{ \"name\" : \"CHANNEL\", \"type\" : \"U8\" }, \ { \"name\" : \"CHANNEL\", \"type\" : \"U8\" }, \
{ \"name\" : \"TIMESTAMP\", \"type\" : \"U64\" }, \ { \"name\" : \"TIMESTAMP\", \"type\" : \"U64\" }, \
{ \"name\" : \"FINE_TIMESTAMP\", \"type\" : \"U16\" }, \ { \"name\" : \"FINE_TIMESTAMP\", \"type\" : \"U16\" }, \
@ -230,13 +238,12 @@ void Digitizer2Gen::SetPHADataFormat(unsigned dataFormat){
{ \"name\" : \"FLUSH\", \"type\" : \"BOOL\" }, \ { \"name\" : \"FLUSH\", \"type\" : \"BOOL\" }, \
{ \"name\" : \"AGGREGATE_COUNTER\", \"type\" : \"U32\" }, \ { \"name\" : \"AGGREGATE_COUNTER\", \"type\" : \"U32\" }, \
{ \"name\" : \"EVENT_SIZE\", \"type\" : \"SIZE_T\" } \ { \"name\" : \"EVENT_SIZE\", \"type\" : \"SIZE_T\" } \
] \ ]");
");
} }
if( dataFormatID == 1 ){ if( dataFormat == 1 ){
ret = CAEN_FELib_SetReadDataFormat(ep_handle, " \ ret = CAEN_FELib_SetReadDataFormat(ep_handle,
[ \ "[ \
{ \"name\" : \"CHANNEL\", \"type\" : \"U8\" }, \ { \"name\" : \"CHANNEL\", \"type\" : \"U8\" }, \
{ \"name\" : \"TIMESTAMP\", \"type\" : \"U64\" }, \ { \"name\" : \"TIMESTAMP\", \"type\" : \"U64\" }, \
{ \"name\" : \"FINE_TIMESTAMP\", \"type\" : \"U16\" }, \ { \"name\" : \"FINE_TIMESTAMP\", \"type\" : \"U16\" }, \
@ -252,13 +259,12 @@ void Digitizer2Gen::SetPHADataFormat(unsigned dataFormat){
{ \"name\" : \"FLUSH\", \"type\" : \"BOOL\" }, \ { \"name\" : \"FLUSH\", \"type\" : \"BOOL\" }, \
{ \"name\" : \"AGGREGATE_COUNTER\", \"type\" : \"U32\" }, \ { \"name\" : \"AGGREGATE_COUNTER\", \"type\" : \"U32\" }, \
{ \"name\" : \"EVENT_SIZE\", \"type\" : \"SIZE_T\" } \ { \"name\" : \"EVENT_SIZE\", \"type\" : \"SIZE_T\" } \
] \ ]");
");
} }
if( dataFormatID == 2 ){ if( dataFormat == 2 ){
ret = CAEN_FELib_SetReadDataFormat(ep_handle, " \ ret = CAEN_FELib_SetReadDataFormat(ep_handle,
[ \ "[ \
{ \"name\" : \"CHANNEL\", \"type\" : \"U8\" }, \ { \"name\" : \"CHANNEL\", \"type\" : \"U8\" }, \
{ \"name\" : \"TIMESTAMP\", \"type\" : \"U64\" }, \ { \"name\" : \"TIMESTAMP\", \"type\" : \"U64\" }, \
{ \"name\" : \"FINE_TIMESTAMP\", \"type\" : \"U16\" }, \ { \"name\" : \"FINE_TIMESTAMP\", \"type\" : \"U16\" }, \
@ -271,18 +277,26 @@ void Digitizer2Gen::SetPHADataFormat(unsigned dataFormat){
{ \"name\" : \"FLUSH\", \"type\" : \"BOOL\" }, \ { \"name\" : \"FLUSH\", \"type\" : \"BOOL\" }, \
{ \"name\" : \"AGGREGATE_COUNTER\", \"type\" : \"U32\" }, \ { \"name\" : \"AGGREGATE_COUNTER\", \"type\" : \"U32\" }, \
{ \"name\" : \"EVENT_SIZE\", \"type\" : \"SIZE_T\" } \ { \"name\" : \"EVENT_SIZE\", \"type\" : \"SIZE_T\" } \
] \ ]");
");
} }
if( dataFormatID == 3 ){ if( dataFormat == 3 ){
ret = CAEN_FELib_SetReadDataFormat(ep_handle, " \ ret = CAEN_FELib_SetReadDataFormat(ep_handle,
[ \ "[ \
{ \"name\" : \"CHANNEL\", \"type\" : \"U8\" }, \ { \"name\" : \"CHANNEL\", \"type\" : \"U8\" }, \
{ \"name\" : \"TIMESTAMP\", \"type\" : \"U64\" }, \ { \"name\" : \"TIMESTAMP\", \"type\" : \"U64\" }, \
{ \"name\" : \"ENERGY\", \"type\" : \"U16\" } \ { \"name\" : \"ENERGY\", \"type\" : \"U16\" } \
] \ ]");
"); }
if( dataFormat == 15 ){
ret = CAEN_FELib_SetReadDataFormat(ep_handle,
" [ \
{ \"name\": \"DATA\", \"type\": \"U8\", \"dim\": 1 }, \
{ \"name\": \"SIZE\", \"type\": \"SIZE_T\" }, \
{ \"name\": \"N_EVENTS\", \"type\": \"U32\" } \
]"
);
} }
if (ret != CAEN_FELib_Success) { if (ret != CAEN_FELib_Success) {
@ -294,75 +308,77 @@ void Digitizer2Gen::SetPHADataFormat(unsigned dataFormat){
int Digitizer2Gen::ReadData(){ int Digitizer2Gen::ReadData(){
//printf("========= %s \n", __func__); //printf("========= %s \n", __func__);
if( dataFormatID == 0){ if( evt->dataType == 0){
ret = CAEN_FELib_ReadData(ep_handle, 100, ret = CAEN_FELib_ReadData(ep_handle, 100,
&evt.channel, &evt->channel,
&evt.timestamp, &evt->timestamp,
&evt.fine_timestamp, &evt->fine_timestamp,
&evt.timestamp_ns, &evt->timestamp_ns,
&evt.energy, &evt->energy,
&evt.analog_probes0, &evt->analog_probes[0],
&evt.analog_probes1, &evt->analog_probes[1],
&evt.digital_probes0, &evt->digital_probes[0],
&evt.digital_probes1, &evt->digital_probes[1],
&evt.digital_probes2, &evt->digital_probes[2],
&evt.digital_probes3, &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],
&evt.digital_probes_type[1], &evt->digital_probes_type[1],
&evt.digital_probes_type[2], &evt->digital_probes_type[2],
&evt.digital_probes_type[3], &evt->digital_probes_type[3],
&evt.traceLenght, &evt->traceLenght,
&evt.flags_low_priority, &evt->flags_low_priority,
&evt.flags_high_priority, &evt->flags_high_priority,
&evt.trigger_threashold, &evt->trigger_threashold,
&evt.downSampling, &evt->downSampling,
&evt.board_fail, &evt->board_fail,
&evt.flush, &evt->flush,
&evt.aggCounter, &evt->aggCounter,
&evt.event_size &evt->event_size
); );
evt.timestamp_us = (evt.timestamp*8 + evt.fine_timestamp*0.0078125)/1000.; }else if( evt->dataType == 1){
}else if( dataFormatID == 1){
ret = CAEN_FELib_ReadData(ep_handle, 100, ret = CAEN_FELib_ReadData(ep_handle, 100,
&evt.channel, &evt->channel,
&evt.timestamp, &evt->timestamp,
&evt.fine_timestamp, &evt->fine_timestamp,
&evt.energy, &evt->energy,
&evt.analog_probes0, &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,
&evt.flags_high_priority, &evt->flags_high_priority,
&evt.trigger_threashold, &evt->trigger_threashold,
&evt.downSampling, &evt->downSampling,
&evt.board_fail, &evt->board_fail,
&evt.flush, &evt->flush,
&evt.aggCounter, &evt->aggCounter,
&evt.event_size &evt->event_size
); );
}else if( dataFormatID == 2){ }else if( evt->dataType == 2){
ret = CAEN_FELib_ReadData(ep_handle, 100, ret = CAEN_FELib_ReadData(ep_handle, 100,
&evt.channel, &evt->channel,
&evt.timestamp, &evt->timestamp,
&evt.fine_timestamp, &evt->fine_timestamp,
&evt.energy, &evt->energy,
&evt.flags_low_priority, &evt->flags_low_priority,
&evt.flags_high_priority, &evt->flags_high_priority,
&evt.trigger_threashold, &evt->trigger_threashold,
&evt.downSampling, &evt->downSampling,
&evt.board_fail, &evt->board_fail,
&evt.flush, &evt->flush,
&evt.aggCounter, &evt->aggCounter,
&evt.event_size &evt->event_size
); );
}else if( dataFormatID == 3){ }else if( evt->dataType == 3){
ret = CAEN_FELib_ReadData(ep_handle, 100, ret = CAEN_FELib_ReadData(ep_handle, 100,
&evt.channel, &evt->channel,
&evt.timestamp, &evt->timestamp,
&evt.energy &evt->energy
); );
}else if( evt->dataType == 15){
ret = CAEN_FELib_ReadData(ep_handle, 100, evt->data, &evt->dataSize, &evt->n_events );
//printf("data size: %lu byte\n", evt.dataSize);
}else{ }else{
return CAEN_FELib_UNKNOWN; return CAEN_FELib_UNKNOWN;
} }
@ -402,58 +418,57 @@ void Digitizer2Gen::SaveDataToFile(){
outFile = fopen(outFileName, "a+"); outFile = fopen(outFileName, "a+");
} }
if( dataFormatID == 0){ if( evt->dataType == 0){
fwrite(&dataStartIndetifier, 2, 1, outFile); fwrite(&dataStartIndetifier, 2, 1, outFile);
fwrite(&evt.channel, 1, 1, outFile); fwrite(&evt->channel, 1, 1, outFile);
fwrite(&evt.energy, 2, 1, outFile); fwrite(&evt->energy, 2, 1, outFile);
fwrite(&evt.timestamp, 6, 1, outFile); fwrite(&evt->timestamp, 6, 1, outFile);
fwrite(&evt.fine_timestamp, 2, 1, outFile); fwrite(&evt->fine_timestamp, 2, 1, outFile);
fwrite(&evt.flags_high_priority, 1, 1, outFile); fwrite(&evt->flags_high_priority, 1, 1, outFile);
fwrite(&evt.flags_low_priority, 2, 1, outFile); fwrite(&evt->flags_low_priority, 2, 1, outFile);
fwrite(&evt.traceLenght, 8, 1, outFile); fwrite(&evt->downSampling, 1, 1, outFile);
fwrite(&evt.analog_probes_type[0], 1, 1, outFile); fwrite(&evt->board_fail, 1, 1, outFile);
fwrite(evt.analog_probes0, evt.traceLenght*4, 1, outFile); fwrite(&evt->flush, 1, 1, outFile);
}else if( dataFormatID == 1){ fwrite(&evt->trigger_threashold, 2, 1, outFile);
fwrite(&evt->event_size, 8, 1, outFile);
fwrite(&evt->aggCounter, 4, 1, outFile);
fwrite(&evt->traceLenght, 8, 1, outFile);
fwrite(evt->analog_probes_type, 2, 1, outFile);
fwrite(evt->digital_probes_type, 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->digital_probes[0], 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[3], evt->traceLenght, 1, outFile);
}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);
fwrite(&evt.energy, 2, 1, outFile); fwrite(&evt->energy, 2, 1, outFile);
fwrite(&evt.timestamp, 6, 1, outFile); fwrite(&evt->timestamp, 6, 1, outFile);
fwrite(&evt.fine_timestamp, 2, 1, outFile); fwrite(&evt->fine_timestamp, 2, 1, outFile);
fwrite(&evt.flags_high_priority, 1, 1, outFile); fwrite(&evt->flags_high_priority, 1, 1, outFile);
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_probes0, evt.traceLenght*4, 1, outFile); fwrite(&evt->analog_probes[0], evt->traceLenght*4, 1, outFile);
}else if( dataFormatID == 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);
fwrite(&evt.energy, 2, 1, outFile); fwrite(&evt->energy, 2, 1, outFile);
fwrite(&evt.timestamp, 6, 1, outFile); fwrite(&evt->timestamp, 6, 1, outFile);
fwrite(&evt.fine_timestamp, 2, 1, outFile); fwrite(&evt->fine_timestamp, 2, 1, outFile);
fwrite(&evt.flags_high_priority, 1, 1, outFile); fwrite(&evt->flags_high_priority, 1, 1, outFile);
fwrite(&evt.flags_low_priority, 2, 1, outFile); fwrite(&evt->flags_low_priority, 2, 1, outFile);
}else if( dataFormatID == 3){ }else if( evt->dataType == 3){
//fwrite(&dataStartIndetifier, 2, 1, outFile); fwrite(&dataStartIndetifier, 2, 1, outFile);
fwrite(&evt.channel, 1, 1, outFile); fwrite(&evt->channel, 1, 1, outFile);
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){
fwrite(evt->data, evt->dataSize, 1, outFile);
} }
// tested speed, 64 readout and save cost ~ 200 us. ~ 5 kHz;
//fwrite(evt.digital_probes_type, sizeof(evt.digital_probes_type), 1, outFile);
//fwrite(evt.analog_probes1, evt.traceLenght*4, 1, outFile);
//fwrite(evt.digital_probes0, evt.traceLenght, 1, outFile);
//fwrite(evt.digital_probes1, evt.traceLenght, 1, outFile);
//fwrite(evt.digital_probes2, evt.traceLenght, 1, outFile);
//fwrite(evt.digital_probes3, evt.traceLenght, 1, outFile);
//fwrite(evt.GetWord1(), 8, 1, outFile);
//fwrite(evt.GetWord2(), 8, 1, outFile);
//fwrite(evt.GetWord3(), 8, 1, outFile);
//fwrite(evt.GetWord4(), 8, 1, outFile);
//for(int i = 0; i < evt.traceLenght; i++){
// fwrite(evt.GetWordTrace(i), 8, 1, outFile);
//}
outFileSize = ftell(outFile); // unsigned int = Max ~4GB outFileSize = ftell(outFile); // unsigned int = Max ~4GB
} }
@ -472,7 +487,7 @@ void Digitizer2Gen::ProgramPHA(bool testPulse){
}else{ }else{
WriteValue("/par/GlobalTriggerSource", "SwTrg"); WriteValue("/par/GlobalTriggerSource", "SwTrg");
} }
WriteValue("/par/TestPulsePeriod" , "25000"); // 0.05 msec = 20kHz WriteValue("/par/TestPulsePeriod" , "500000"); // 0.5 msec = 2kHz
WriteValue("/par/TestPulseWidth" , "16"); WriteValue("/par/TestPulseWidth" , "16");
// Wave configuration // Wave configuration

View File

@ -6,62 +6,10 @@
#include <cstdlib> #include <cstdlib>
#include <string> #include <string>
#include "Event.h"
//#include "Parameter.h" //#include "Parameter.h"
#define MaxOutFileSize 2*1024*1024*1024 #define MaxOutFileSize 2*1024*1024*1024
#define MaxTraceLenght 2048
#define DataStartIndetifier 0xA345
struct event {
uint8_t channel; // 6 bit
uint16_t energy; // 16 bit
uint64_t timestamp; // 48 bit
uint16_t fine_timestamp; // 16 bit
uint64_t timestamp_ns; // 51 bit fine_timestamp not included
double timestamp_us;
uint16_t flags_low_priority; // 12 bit
uint16_t flags_high_priority; // 8 bit
size_t traceLenght; // 64 bit
uint8_t downSampling; // 8 bit
bool board_fail;
bool flush;
uint8_t analog_probes_type[2]; // 3 bit
uint8_t digital_probes_type[4]; // 4 bit
int32_t analog_probes0[MaxTraceLenght]; // 18 bit
int32_t analog_probes1[MaxTraceLenght];
uint8_t digital_probes0[MaxTraceLenght]; // 1 bit
uint8_t digital_probes1[MaxTraceLenght];
uint8_t digital_probes2[MaxTraceLenght];
uint8_t digital_probes3[MaxTraceLenght];
uint16_t trigger_threashold; // 16 bit
size_t event_size; // 64 bit
uint32_t aggCounter; // 32 bit
void PrintEnergyTimeStamp(){
printf("ch: %2d, energy: %u, timestamp: %lu ch, traceLenght: %lu\n", channel, energy, timestamp, traceLenght);
}
void PrintAll(){
printf("============== ch : %2d (0x%2X), fail: %d, flush: %d\n", channel, channel, board_fail, flush);
printf("energy: %u, timestamp: %lu, fine_timestamp: %u \n", energy, timestamp, fine_timestamp);
printf("flag (high): 0x%2X, (low): 0x%3X, traceLength: %lu\n", flags_high_priority, flags_low_priority, traceLenght);
printf("Agg counter : %u, trigger : %u, downSampling: %u \n", aggCounter, trigger_threashold, downSampling);
printf("AnaProbe Type: %u, %u\n", analog_probes_type[0], analog_probes_type[1]);
printf("DigProbe Type: %u, %u, %u, %u\n", digital_probes_type[0], digital_probes_type[1], digital_probes_type[2], digital_probes_type[3]);
}
void PrintTrace(){
for(int i = 0; i < traceLenght; i++){
printf("%4d| %6d %6d %1d %1d %1d %1d\n", i, analog_probes0[i],
analog_probes1[i],
digital_probes0[i],
digital_probes1[i],
digital_probes2[i],
digital_probes3[i]);
}
}
};
class Digitizer2Gen { class Digitizer2Gen {
private: private:
@ -91,12 +39,6 @@ class Digitizer2Gen {
std::string ErrorMsg(const char * funcName); std::string ErrorMsg(const char * funcName);
unsigned int dataFormatID; // 0 = all data,
// 1 = analog trace-0 only + flags
// 2 = no trace, only ch, energy, timestamp, fine_timestamp + flags
// 3 = only ch, energy, timestamp, minimum
unsigned short outFileIndex; unsigned short outFileIndex;
unsigned short dataStartIndetifier; unsigned short dataStartIndetifier;
std::string outFileNameBase; std::string outFileNameBase;
@ -123,7 +65,11 @@ class Digitizer2Gen {
void StartACQ(); void StartACQ();
void StopACQ(); void StopACQ();
void SetPHADataFormat(unsigned dataFormat); void SetPHADataFormat(unsigned dataFormat); // 0 = all data,
// 1 = analog trace-0 only + flags
// 2 = no trace, only ch, energy, timestamp, fine_timestamp + flags
// 3 = only ch, energy, timestamp, minimum
// 15 = raw data
int ReadData(); int ReadData();
void ReadDataRaw(); //not impletmented void ReadDataRaw(); //not impletmented
@ -133,7 +79,7 @@ class Digitizer2Gen {
unsigned short GetCh2ns() {return ch2ns;} unsigned short GetCh2ns() {return ch2ns;}
uint64_t GetHandle() {return handle;} uint64_t GetHandle() {return handle;}
event evt; Event *evt;
void OpenOutFile(std::string fileName); void OpenOutFile(std::string fileName);
void CloseOutFile(); void CloseOutFile();
void SaveDataToFile(); void SaveDataToFile();

114
Event.h Normal file
View File

@ -0,0 +1,114 @@
#ifndef EVENT_H
#define EVENT_H
#include <stdio.h>
#include <cstdlib>
#include <stdint.h>
#define MaxTraceLenght 2048
class Event {
public:
unsigned short dataType;
///============= for dpp-pha
uint8_t channel; // 6 bit
uint16_t energy; // 16 bit
uint64_t timestamp; // 48 bit
uint16_t fine_timestamp; // 16 bit
uint64_t timestamp_ns; // 51 bit fine_timestamp not included
uint16_t flags_low_priority; // 12 bit
uint16_t flags_high_priority; // 8 bit
size_t traceLenght; // 64 bit
uint8_t downSampling; // 8 bit
bool board_fail;
bool flush;
uint8_t analog_probes_type[2]; // 3 bit
uint8_t digital_probes_type[4]; // 4 bit
int32_t * analog_probes[2]; // 18 bit
uint8_t * digital_probes[2]; // 1 bit
uint16_t trigger_threashold; // 16 bit
size_t event_size; // 64 bit
uint32_t aggCounter; // 32 bit
///============= for raw
uint8_t * data;
size_t dataSize; /// number of byte of the data, size/8 = word [64 bits]
uint32_t n_events;
Event(){
analog_probes[0] = NULL;
analog_probes[1] = NULL;
digital_probes[0] = NULL;
digital_probes[1] = NULL;
digital_probes[2] = NULL;
digital_probes[3] = NULL;
data = NULL;
}
~Event(){
ClearMemory();
}
void ClearMemory(){
if( data != NULL ) delete data;
if( analog_probes != NULL) {
delete analog_probes[0];
delete analog_probes[1];
}
if( digital_probes != NULL) {
delete digital_probes[0];
delete digital_probes[1];
delete digital_probes[2];
delete digital_probes[3];
}
}
void SetDataType(unsigned int type){
dataType = type;
ClearMemory();
if( dataType != 0xF){
analog_probes[0] = new int32_t[MaxTraceLenght];
analog_probes[1] = new int32_t[MaxTraceLenght];
digital_probes[0] = new uint8_t[MaxTraceLenght];
digital_probes[1] = new uint8_t[MaxTraceLenght];
digital_probes[2] = new uint8_t[MaxTraceLenght];
digital_probes[3] = new uint8_t[MaxTraceLenght];
}else{
data = new uint8_t[20*1024*1024];
}
}
void PrintEnergyTimeStamp(){
printf("ch: %2d, energy: %u, timestamp: %lu ch, traceLenght: %lu\n", channel, energy, timestamp, traceLenght);
}
void PrintAll(){
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("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("AnaProbe Type: %u, %u\n", analog_probes_type[0], analog_probes_type[1]);
printf("DigProbe Type: %u, %u, %u, %u\n", digital_probes_type[0], digital_probes_type[1], digital_probes_type[2], digital_probes_type[3]);
}
void PrintAllTrace(){
for(int i = 0; i < traceLenght; i++){
printf("%4d| %6d %6d %1d %1d %1d %1d\n", i, analog_probes[0][i],
analog_probes[1][i],
digital_probes[0][i],
digital_probes[1][i],
digital_probes[2][i],
digital_probes[3][i]);
}
}
};
#endif

View File

@ -7,9 +7,9 @@ all: test test_indep ClassDigitizer2Gen.o
test_indep : test_indep.cpp test_indep : test_indep.cpp
$(CC) $(COPTS) -o test_indep test_indep.cpp $(CAENLIBS) $(CC) $(COPTS) -o test_indep test_indep.cpp $(CAENLIBS)
test : test.cpp ClassDigitizer2Gen.o test : test.cpp ClassDigitizer2Gen.o
$(CC) $(COPTS) -o test test.cpp ClassDigitizer2Gen.o $(CAENLIBS) $(CC) $(COPTS) -o test test.cpp ClassDigitizer2Gen.o $(CAENLIBS)
ClassDigitizer2Gen.o : ClassDigitizer2Gen.cpp ClassDigitizer2Gen.h Parameter.h ClassDigitizer2Gen.o : ClassDigitizer2Gen.cpp ClassDigitizer2Gen.h Event.h
$(CC) $(COPTS) -c ClassDigitizer2Gen.cpp $(CAENLIBS) $(CC) $(COPTS) -c ClassDigitizer2Gen.cpp $(CAENLIBS)

View File

@ -49,7 +49,7 @@ int main(int argc, char* argv[]){
digi->SetPHADataFormat(1); digi->SetPHADataFormat(0);
digi->OpenOutFile("haha"); digi->OpenOutFile("haha");
@ -71,13 +71,15 @@ int main(int argc, char* argv[]){
digi->SaveDataToFile(); //digi->SaveDataToFile();
if( digi->evt.channel == 63 ) { if( digi->evt->channel == 63 ) {
clock_gettime(CLOCK_REALTIME, &t1); clock_gettime(CLOCK_REALTIME, &t1);
printf("%5d | t1-t0 : %10ld\n", i, t1.tv_nsec-t0.tv_nsec); printf("%5d | t1-t0 : %10ld\n", i, t1.tv_nsec-t0.tv_nsec);
t0 = t1; t0 = t1;
} }
}else{
printf("something wrong when ReadData()");
} }
} }