has the decode.C for decoding the saved data

This commit is contained in:
carina@hades 2022-10-07 18:52:15 -04:00
parent e556977729
commit 7e24189527
3 changed files with 65 additions and 22 deletions

2
.gitignore vendored
View File

@ -3,6 +3,8 @@
*.cxx *.cxx
*.bin *.bin
*.txt
*.fsu
test test
FSUDAQ FSUDAQ

View File

@ -56,7 +56,7 @@ class Data{
void PrintBuffer(); //Incorrect void PrintBuffer(); //Incorrect
void DecodeBuffer(bool fastDecode, int verbose = 0); void DecodeBuffer(bool fastDecode, int verbose = 0);
void DecodeBuffer(char * buffer, bool fastDecode, int verbose = 0); // for outside data void DecodeBuffer(char * buffer, unsigned int size, bool fastDecode, int verbose = 0); // for outside data
void PrintStat(); void PrintStat();
@ -107,13 +107,11 @@ inline void Data::AllocateMemory(){
printf("Allocated %d byte for buffer \n", BufferSize); printf("Allocated %d byte for buffer \n", BufferSize);
///for( int i = 0 ; i < MaxNChannels ; i++ ) Events[i] = (CAEN_DGTZ_DPP_PHA_Event_t *) malloc( BufferSize); ///for( int i = 0 ; i < MaxNChannels ; i++ ) Events[i] = (CAEN_DGTZ_DPP_PHA_Event_t *) malloc( BufferSize);
///printf("Allocated %d byte for Events for each channel \n", BufferSize); ///printf("Allocated %d byte for Events for each channel \n", BufferSize);
} }
inline void Data::ClearTriggerRate(){ for( int i = 0 ; i < MaxNChannels; i++) TriggerRate[i] = 0.0; } inline void Data::ClearTriggerRate(){ for( int i = 0 ; i < MaxNChannels; i++) TriggerRate[i] = 0.0; }
inline void Data::ClearData(){ inline void Data::ClearData(){
nByte = 0; nByte = 0;
AllocatedSize = 0; AllocatedSize = 0;
BufferSize = 0; BufferSize = 0;
@ -138,16 +136,6 @@ inline void Data::ClearData(){
tempDigiWaveform2.clear(); tempDigiWaveform2.clear();
} }
inline unsigned int Data::ReadBuffer(unsigned int nWord, int verbose){
if( buffer == NULL ) return 0;
unsigned int word = 0;
for( int i = 0 ; i < 4 ; i++) word += ((buffer[i + 4 * nWord] & 0xFF) << 8*i);
if( verbose >= 2) printf("%d | 0x%08x\n", nWord, word);
return word;
}
inline void Data::SaveBuffer(const char * fileName){ inline void Data::SaveBuffer(const char * fileName){
char saveFileName[100]; char saveFileName[100];
@ -192,8 +180,18 @@ inline void Data::PrintBuffer(){
} }
//####################################################### Decode //####################################################### Decode
inline void Data::DecodeBuffer(char * buffer, bool fastDecode, int verbose){ inline unsigned int Data::ReadBuffer(unsigned int nWord, int verbose){
if( buffer == NULL ) return 0;
unsigned int word = 0;
for( int i = 0 ; i < 4 ; i++) word += ((buffer[i + 4 * nWord] & 0xFF) << 8*i);
if( verbose >= 2) printf("%6d | 0x%08X | ", nWord, word);
return word;
}
inline void Data::DecodeBuffer(char * buffer, unsigned int size, bool fastDecode, int verbose){
this->buffer = buffer; this->buffer = buffer;
this->nByte = size;
DecodeBuffer(fastDecode, verbose); DecodeBuffer(fastDecode, verbose);
} }
@ -212,25 +210,25 @@ inline void Data::DecodeBuffer(bool fastDecode, int verbose){
nw = 0; nw = 0;
do{ do{
if( verbose >= 2 ) printf("######################################### Board Agg.\n"); if( verbose >= 1 ) printf("######################################### Board Agg.\n");
unsigned int word = ReadBuffer(nw, verbose); unsigned int word = ReadBuffer(nw, verbose);
if( ( (word >> 28) & 0xF ) == 0xA ) { /// start of Board Agg if( ( (word >> 28) & 0xF ) == 0xA ) { /// start of Board Agg
unsigned int nWord = word & 0x0FFFFFFF ; unsigned int nWord = word & 0x0FFFFFFF ;
if( verbose >= 2 ) printf(" number of words in this Agg : %d \n", nWord); if( verbose >= 1 ) printf("Number of words in this Agg : %u \n", nWord);
nw = nw + 1; word = ReadBuffer(nw, verbose); nw = nw + 1; word = ReadBuffer(nw, verbose);
unsigned int BoardID = ((word >> 27) & 0x1F); unsigned int BoardID = ((word >> 27) & 0x1F);
bool BoardFailFlag = ((word >> 26) & 0x1 ); bool BoardFailFlag = ((word >> 26) & 0x1 );
unsigned int ChannelMask = ( word & 0xFF ) ; unsigned int ChannelMask = ( word & 0xFF ) ;
if( verbose >= 2 ) printf("Board ID : %d, FailFlag = %d, ChannelMask = 0x%x\n", BoardID, BoardFailFlag, ChannelMask); if( verbose >= 1 ) printf("Board ID : %d, FailFlag = %d, ChannelMask = 0x%X\n", BoardID, BoardFailFlag, ChannelMask);
nw = nw + 2; nw = nw + 2;
unsigned int AggCounter = ReadBuffer(nw, verbose); unsigned int AggCounter = ReadBuffer(nw, verbose);
if( verbose >= 2 ) printf("Agg Counter : %d \n", AggCounter); if( verbose >= 2 ) printf("Agg Counter : %u \n", AggCounter);
for( int chMask = 0; chMask < MaxNChannels/2 ; chMask ++ ){ for( int chMask = 0; chMask < MaxNChannels/2 ; chMask ++ ){
if( ((ChannelMask >> chMask) & 0x1 ) == 0 ) continue; if( ((ChannelMask >> chMask) & 0x1 ) == 0 ) continue;
if( verbose >= 2 ) printf("---------------------- Dual Channel Block : %d, nw : %d\n", chMask *2, nw); if( verbose >= 2 ) printf("---------------------- Dual Channel Block, ch Mask : %d, nw : %d\n", chMask *2, nw);
if( DPPType == V1730_DPP_PHA_CODE ) { if( DPPType == V1730_DPP_PHA_CODE ) {
if ( DecodePHADualChannelBlock(chMask, fastDecode, verbose) < 0 ) break; if ( DecodePHADualChannelBlock(chMask, fastDecode, verbose) < 0 ) break;
@ -263,7 +261,7 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe
bool hasFormatInfo = ((word >> 31) & 0x1); bool hasFormatInfo = ((word >> 31) & 0x1);
unsigned int aggSize = ( word & 0x7FFFFFFF ) ; unsigned int aggSize = ( word & 0x7FFFFFFF ) ;
if( verbose >= 2 ) printf(" size : %d \n", aggSize); if( verbose >= 2 ) printf("Dual Channel size : %d \n", aggSize);
unsigned int nSample = 0; /// wave form; unsigned int nSample = 0; /// wave form;
unsigned int nEvents = 0; unsigned int nEvents = 0;
unsigned int extra2Option = 0; unsigned int extra2Option = 0;
@ -284,8 +282,11 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe
hasDualTrace = ( (word >> 31 ) & 0x1 ); hasDualTrace = ( (word >> 31 ) & 0x1 );
if( verbose >= 2 ) { if( verbose >= 2 ) {
printf("dualTrace : %d, Energy : %d, Time: %d, Wave : %d, Extra2: %d \n", printf("DualTrace : %d, Energy : %d, Time: %d, Wave : %d, Extra2: %d \n",
hasDualTrace, hasEnergy, hasTimeStamp, hasWaveForm, hasExtra2); hasDualTrace, hasEnergy, hasTimeStamp, hasWaveForm, hasExtra2);
}
if( verbose >= 3){
if( hasExtra2 ){ if( hasExtra2 ){
printf("...... extra 2 : "); printf("...... extra 2 : ");
switch (extra2Option){ switch (extra2Option){
@ -404,6 +405,7 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe
unsigned long long timeStamp = (extTimeStamp << 30) ; unsigned long long timeStamp = (extTimeStamp << 30) ;
timeStamp = timeStamp + timeStamp0; timeStamp = timeStamp + timeStamp0;
if( verbose >= 2) printf("TimeStamp : %llu\n", timeStamp);
nw = nw +1 ; word = ReadBuffer(nw, verbose); nw = nw +1 ; word = ReadBuffer(nw, verbose);
unsigned int extra = (( word >> 16) & 0x3FF); unsigned int extra = (( word >> 16) & 0x3FF);
unsigned int energy = (word & 0x7FFF); unsigned int energy = (word & 0x7FFF);
@ -411,7 +413,7 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe
bool pileUp = (extra & 0x200); bool pileUp = (extra & 0x200);
bool rollOver = (extra & 0x002); bool rollOver = (extra & 0x002);
if( verbose >= 2 ) { if( verbose >= 3 ) {
printf("PileUp : %d , extra : 0x%03x, energy : %d \n", pileUp, extra, energy); printf("PileUp : %d , extra : 0x%03x, energy : %d \n", pileUp, extra, energy);
printf(" lost event : %d \n", ((extra >> 0) & 0x1) ); printf(" lost event : %d \n", ((extra >> 0) & 0x1) );

39
decode.C Normal file
View File

@ -0,0 +1,39 @@
#include "ClassData.h"
void decode() {
FILE * haha = fopen("ExpName_run000_323_000.fsu", "r");
fseek(haha, 0L, SEEK_END);
size_t inFileSize = ftell(haha);
printf("file size : %d Byte\n", (int) inFileSize);
fclose(haha);
Data * data = new Data();
data->DPPType = V1730_DPP_PHA_CODE;
haha = fopen("ExpName_run000_323_000.fsu", "r");
printf("pos : %d \n", (int) ftell(haha));
do{
unsigned int word[1]; /// 4 bytes
size_t dump = fread(word, 4, 1, haha);
fseek(haha, -4, SEEK_CUR);
unsigned int aggSize = (word[0] & 0x0FFFFFFF) * 4; ///byte
short header = ((word[0] >> 28 ) & 0xF);
if( header != 10 ) break;
printf("-------- %7d word = %d bytes\n", aggSize/4, aggSize);
char * buffer = new char[aggSize];
dump = fread(buffer, aggSize, 1, haha);
data->DecodeBuffer(buffer, aggSize, 0, 2);
if( ftell(haha) >= 12046*10 ) break;
}while(!feof(haha) );
fclose(haha);
}