From 3b0c22c5d2154cb24ec897fab536ac0a65cd6d50 Mon Sep 17 00:00:00 2001 From: splitPoleDAQ Date: Fri, 12 Jan 2024 16:59:55 -0500 Subject: [PATCH] bug fix on event builder when load from other directory with underscore --- Aux/fsuReader.h | 96 +++++++++++++++++++++++++++++++++++++++++++++---- ClassData.h | 27 ++++++++++---- 2 files changed, 109 insertions(+), 14 deletions(-) diff --git a/Aux/fsuReader.h b/Aux/fsuReader.h index 74a6c61..b4bd076 100644 --- a/Aux/fsuReader.h +++ b/Aux/fsuReader.h @@ -7,7 +7,7 @@ class FSUReader{ ~FSUReader(); void ScanNumBlock(bool verbose = true); - int ReadNextBlock(bool fast = false, int verbose = 0); + int ReadNextBlock(bool fast = false, int verbose = 0, bool saveData = false); int ReadBlock(unsigned int ID, int verbose = 0); unsigned long GetTotNumBlock() const{ return totNumBlock;} @@ -21,6 +21,16 @@ class FSUReader{ int GetFileOrder() const{return order;} unsigned long GetFileByteSize() const {return inFileSize;} + std::vector GetBlockTimestamp() const {return blockTimeStamp;} + + std::vector GetTimestamp(int id) const {return timestamp[id];} + std::vector GetEnergy(int id) const {return energy[id];} + std::vector GetEnergy2(int id) const {return energy2[id];} + std::vector GetChannel(int id) const {return channel[id];} + std::vector GeFineTime(int id) const {return fineTime[id];} + + unsigned long GetHitCount() const{ return numHit;} + private: FILE * inFile; @@ -40,6 +50,21 @@ class FSUReader{ int numCh; std::vector blockPos; + std::vector blockTimeStamp; + + unsigned long numHit; + + std::vector> channel; + std::vector> energy; + std::vector> energy2; + std::vector> timestamp; + std::vector> fineTime; + + std::vector tempChannel; + std::vector tempEnergy; + std::vector tempEnergy2; + std::vector tempTimestamp; + std::vector tempFineTime; unsigned int word[1]; /// 4 byte size_t dummy; @@ -65,6 +90,12 @@ inline FSUReader::FSUReader(std::string fileName, bool verbose){ totNumBlock = 0; blockID = 0; blockPos.clear(); + blockTimeStamp.clear(); + + numHit = 0; + channel.clear(); + timestamp.clear(); + energy.clear(); //check is the file is *.fsu or *.fsu.X @@ -78,7 +109,13 @@ inline FSUReader::FSUReader(std::string fileName, bool verbose){ if(verbose) printf("It is a splitted dual block data *.fsu.X format, dual channel mask : %d \n", chMask); } - std::string fileNameNoExt = fileName.substr(0, found); + std::string fileNameNoExt; + size_t found2 = fileName.find_last_of('/'); + if( found == std::string::npos ){ + fileNameNoExt = fileName.substr(0, found); + }else{ + fileNameNoExt = fileName.substr(found2+1, found); + } // Split the string by underscores std::istringstream iss(fileNameNoExt); @@ -110,7 +147,7 @@ inline FSUReader::~FSUReader(){ } -inline int FSUReader::ReadNextBlock(bool fast, int verbose){ +inline int FSUReader::ReadNextBlock(bool fast, int verbose,bool saveData){ if( inFile == NULL ) return -1; if( feof(inFile) ) return -1; if( filePos >= inFileSize) return -1; @@ -135,7 +172,41 @@ inline int FSUReader::ReadNextBlock(bool fast, int verbose){ return -30; } + data->DecodeBuffer(buffer, aggSize, fast, verbose); // data will own the buffer + + if( saveData ){ + tempTimestamp.clear(); + tempEnergy.clear(); + tempEnergy2.clear(); + tempChannel.clear(); + tempFineTime.clear(); + + for( int ch = 0; ch < data->GetNChannel(); ch++){ + if( data->NumEventsDecoded[ch] == 0 ) continue; + + int start = data->DataIndex[ch] - data->NumEventsDecoded[ch] + 1; + int stop = data->DataIndex[ch]; + + for( int i = start; i <= stop; i++ ){ + i = i % MaxNData; + tempChannel.push_back(ch); + tempEnergy.push_back(data->Energy[ch][i]); + tempTimestamp.push_back(data->Timestamp[ch][i]); + tempEnergy2.push_back(data->Energy2[ch][i]); + tempFineTime.push_back(data->fineTime[ch][i]); + + numHit ++; + } + } + + timestamp.push_back(tempTimestamp); + energy.push_back(tempEnergy); + energy2.push_back(tempEnergy2); + channel.push_back(tempChannel); + fineTime.push_back(tempFineTime); + } + data->ClearTriggerRate(); data->ClearBuffer(); // this will clear the buffer. @@ -174,7 +245,7 @@ inline int FSUReader::ReadBlock(unsigned int ID, int verbose){ fseek(inFile, blockPos[ID], SEEK_CUR); filePos = blockPos[ID]; blockID = ID; - return ReadNextBlock(false, verbose); + return ReadNextBlock(false, verbose, false); } @@ -188,15 +259,26 @@ inline void FSUReader::ScanNumBlock(bool verbose){ fseek(inFile, 0L, SEEK_SET); filePos = 0; - while( ReadNextBlock(true) == 0 ){ + while( ReadNextBlock(true, false, true) == 0 ){ blockPos.push_back(filePos); + blockTimeStamp.push_back(data->aggTime); blockID ++; if(verbose) printf("%u, %.2f%% %u/%lu\n\033[A\r", blockID, filePos*100./inFileSize, filePos, inFileSize); } totNumBlock = blockID; - if(verbose) printf("\nScan complete: number of data Block : %lu\n", totNumBlock); - + if(verbose) { + printf("\nScan complete: number of data Block : %lu\n", totNumBlock); + printf( " number of hit : %lu\n", numHit); + + size_t sizeT = sizeof(std::vector) * timestamp.size(); + for (size_t i = 0; i < timestamp.size(); ++i) { + sizeT += sizeof(std::vector) + sizeof(unsigned long long) * timestamp[i].size(); + } + + printf("size of timestamp : %lu byte = %.2f kByte, = %.2f MByte\n", sizeT, sizeT/1024., sizeT/1024./1024.); + + } rewind(inFile); blockID = 0; filePos = 0; diff --git a/ClassData.h b/ClassData.h index 94ebe5b..43e47db 100644 --- a/ClassData.h +++ b/ClassData.h @@ -31,7 +31,7 @@ class Data{ int DPPType; std::string DPPTypeStr; /// only for saving fiel name unsigned short boardSN; - float tick2ns; /// use in convert the timestamp to ns, and use in TriggerRate calculation + int tick2ns; /// use in convert the timestamp to ns, and use in TriggerRate calculation unsigned int nByte; /// number of byte from read buffer uint32_t AllocatedSize; @@ -86,6 +86,7 @@ class Data{ void PrintStat(bool skipEmpty = true); void PrintAllData(bool tableMode = true, unsigned int maxRowDisplay = 0) const; + void PrintChData(unsigned short ch, unsigned int maxRowDisplay = 0) const; //^================= Saving data bool OpenSaveFile(std::string fileNamePrefix); // return false when fail @@ -360,6 +361,18 @@ inline void Data::PrintAllData(bool tableMode, unsigned int maxRowDisplay) const } } +inline void Data::PrintChData(unsigned short ch, unsigned int maxRowDisplay) const{ + + if( DataIndex[ch] < 0 ) printf("no data in ch-%d\n", ch); + printf("------------ ch : %d, DataIndex : %d, loop : %d\n", ch, DataIndex[ch], LoopIndex[ch]); + for( int ev = 0; ev <= (LoopIndex[ch] > 0 ? MaxNData : DataIndex[ch]) ; ev++){ + if( DPPType == DPPType::DPP_PHA_CODE || DPPType == DPPType::DPP_QDC_CODE ) printf("%4d, %5u, %15llu, %5u \n", ev, Energy[ch][ev], Timestamp[ch][ev], fineTime[ch][ev]); + if( DPPType == DPPType::DPP_PSD_CODE ) printf("%4d, %5u, %5u, %15llu, %5u \n", ev, Energy[ch][ev], Energy2[ch][ev], Timestamp[ch][ev], fineTime[ch][ev]); + if( maxRowDisplay > 0 && (unsigned int) ev > maxRowDisplay ) break; + } + +} + //^####################################################### //^####################################################### Decode inline unsigned int Data::ReadBuffer(unsigned int nWord, int verbose){ @@ -786,8 +799,8 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe //if( DataIndex[channel] > MaxNData ) ClearData(); // if any channel has more data then MaxNData, clear all stored data - if( verbose >= 1 ) printf("evt %4d(%2d) | ch : %2d, PileUp : %d , energy : %5d, rollOver: %d, timestamp : %10llu, triggerAt : %d, nSample : %d, %f sec\n", - DataIndex[channel], LoopIndex[channel], channel, pileUp, energy, rollOver, timeStamp, triggerAtSample, nSample , timeStamp * 4. / 1e9); + if( verbose >= 1 ) printf("evt %4d(%2d) | ch : %2d, PileUp : %d , energy : %5d, rollOver: %d, timestamp : %16llu (%10llu), triggerAt : %d, nSample : %d, %f sec\n", + DataIndex[channel], LoopIndex[channel], channel, pileUp, energy, rollOver, timeStamp * tick2ns, timeStamp, triggerAtSample, nSample , timeStamp * 4. / 1e9); } @@ -993,9 +1006,9 @@ inline int Data::DecodePSDDualChannelBlock(unsigned int ChannelMask, bool fastDe //if( verbose >= 2 ) printf("extra : 0x%08x, Qshort : %d, Qlong : %d \n", extra, Qshort, Qlong); if( verbose == 1 ) printf("ch : %2d, Qshort : %6d, Qlong : %6d, timestamp : %llu\n", - channel, Qshort, Qlong, timeStamp); + channel, Qshort, Qlong, timeStamp * tick2ns); if( verbose >= 2 ) printf("Qshort : %6d, Qlong : %6d, timestamp : %llu\n", - Qshort, Qlong, timeStamp); + Qshort, Qlong, timeStamp * tick2ns); @@ -1137,8 +1150,8 @@ inline int Data::DecodeQDCGroupedChannelBlock(unsigned int ChannelMask, bool fas DigiWaveform4[channel][DataIndex[channel]] = tempDigiWaveform4; } - if( verbose == 1 ) printf("ch : %2d, energy : %d, timestamp : %llu\n", channel, energy, timeStamp); - if( verbose > 1 ) printf("ch : %2d, energy : %d, timestamp : %llu, pileUp : %d, OverRange : %d\n", channel, energy, timeStamp, pileup, OverRange); + if( verbose == 1 ) printf("ch : %2d, energy : %d, timestamp : %llu\n", channel, energy, timeStamp * tick2ns); + if( verbose > 1 ) printf("ch : %2d, energy : %d, timestamp : %llu, pileUp : %d, OverRange : %d\n", channel, energy, timeStamp * tick2ns, pileup, OverRange); if( verbose == 1) printf("Decoded : %d, total : %ld \n", NumEventsDecoded[channel], TotNumNonPileUpEvents[channel]); }