From cd7dfbd76dc027c4e6f5c48849914e9b0b3a812d Mon Sep 17 00:00:00 2001 From: "carina@hades" Date: Thu, 24 Aug 2023 13:27:16 -0400 Subject: [PATCH] various fixs and improvements duraing Encore run, rate ~ 1k/ch --- .vscode/settings.json | 4 ++- ClassData.h | 3 ++- DigiSettingsPanel.cpp | 8 ++++-- EventBuilder.cpp | 62 +++++++++++++++++++++++++++++++------------ FSUDAQ.cpp | 4 ++- Scope.cpp | 7 +++-- macro.h | 3 ++- 7 files changed, 66 insertions(+), 25 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 15a1c4b..4103ebb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -157,6 +157,8 @@ "source_location": "cpp", "splitpole.C": "cpp", "forward_list": "cpp", - "fstream": "cpp" + "fstream": "cpp", + "Analyzer.C": "cpp", + "process_Run.C": "cpp" } } \ No newline at end of file diff --git a/ClassData.h b/ClassData.h index 48e3243..01349b2 100644 --- a/ClassData.h +++ b/ClassData.h @@ -245,8 +245,9 @@ inline void Data::SaveData(){ } inline void Data::CloseSaveFile(){ - if( outFile != NULL ){ + if( outFile != nullptr ){ fclose(outFile); + outFile = nullptr; int result = chmod(outFileName.c_str(), S_IRUSR | S_IRGRP | S_IROTH); if( result != 0 ) printf("somewrong when set file (%s) to read only.", outFileName.c_str()); } diff --git a/DigiSettingsPanel.cpp b/DigiSettingsPanel.cpp index 4e74ca5..e28c402 100644 --- a/DigiSettingsPanel.cpp +++ b/DigiSettingsPanel.cpp @@ -194,9 +194,13 @@ DigiSettingsPanel::DigiSettingsPanel(Digitizer ** digi, unsigned int nDigi, QStr }); - bnClearBuffer = new QPushButton("Clear Buffer/FIFO", this); + bnClearBuffer = new QPushButton("Clear Buffer/FIFO/Data", this); buttonLayout->addWidget(bnClearBuffer, rowID, 2); - connect(bnClearBuffer, &QPushButton::clicked, this, [=](){ digi[ID]->WriteRegister(DPP::SoftwareClear_W, 1); UpdateBoardAndChannelsStatus();}); + connect(bnClearBuffer, &QPushButton::clicked, this, [=](){ + digi[ID]->WriteRegister(DPP::SoftwareClear_W, 1); + digi[ID]->GetData()->ClearData(); + UpdateBoardAndChannelsStatus(); + }); bnLoadSettings = new QPushButton("Load Settings", this); buttonLayout->addWidget(bnLoadSettings, rowID, 3); diff --git a/EventBuilder.cpp b/EventBuilder.cpp index 5af57e6..9ebfd96 100644 --- a/EventBuilder.cpp +++ b/EventBuilder.cpp @@ -61,11 +61,13 @@ int main(int argc, char **argv) { for( int i = 0; i < nFile; i++) printf("%2d | %s \n", i, inFileName[i].Data()); printf("=====================================\n"); printf(" Time Window = %u \n", timeWindow); - printf("=====================================\n"); + + printf("===================================== input files:\n"); ///============= sorting file by the serial number & order int ID[nFile]; /// serial+ order*1000; int type[nFile]; + unsigned int fileSize[nFile]; for( int i = 0; i < nFile; i++){ int snPos = inFileName[i].Index("_"); // first "_" //snPos = inFileName[i].Index("_", snPos + 1); @@ -79,12 +81,22 @@ int main(int argc, char **argv) { int order = atoi(&inFileName[i][snPos+13]); ID[i] = sn + order * 1000; + FILE * temp = fopen(inFileName[i].Data(), "rb"); + if( temp == NULL ) { + fileSize[i] = 0; + }else{ + fseek(temp, 0, SEEK_END); + fileSize[i] = ftell(temp); + } + fclose(temp); + + //printf("sn:%d, type:%d (%s), order:%d \n", sn, type[i], typeStr.Data(), order); } quickSort(&(ID[0]), &(type[0]), &(inFileName[0]), 0, nFile-1); for( int i = 0 ; i < nFile; i++){ - printf("%d | %6d | %3d | %s \n", i, ID[i], type[i], inFileName[i].Data()); + printf("%d | %6d | %3d | %s | %u\n", i, ID[i], type[i], inFileName[i].Data(), fileSize[i]); } //*======================================= Sort files in to group @@ -107,7 +119,7 @@ int main(int argc, char **argv) { } int nGroup = snList.size(); - printf("===================================== nGroup %d.\n", nGroup); + printf("===================================== number of file Group by digitizer %d.\n", nGroup); for( int i = 0; i < nGroup; i++){ printf("............ %d \n", snList[i]); for( int j = 0; j< (int) fileList[i].size(); j++){ @@ -170,6 +182,7 @@ int main(int argc, char **argv) { //*====================================== build events + printf("================= Building events....\n"); MultiBuilder * mb = new MultiBuilder(data, typeList, snList); mb->SetTimeWindow(timeWindow); @@ -177,30 +190,43 @@ int main(int argc, char **argv) { char * buffer = nullptr; unsigned int word[1]; // 4 byte = 32 bit + do{ /// fill the data class with some agg; + bool earlyTermination = false; int aggCount = 0; do{ for ( int i = 0; i < nGroup; i++){ if( inFile[i] == nullptr ) continue; size_t dummy = fread(word, 4, 1, inFile[i]); - if( dummy != 1) printf("fread error, should read 4 bytes, but read %ld x 4 byte, file pos: %ld byte (%s)\n", dummy, ftell(inFile[i]), fileList[i][inFileIndex[i]].Data()); - fseek(inFile[i], -4, SEEK_CUR); // rool back + if( dummy != 1) { + printf("fread error, should read 4 bytes, but read %ld x 4 byte, file pos: %ld byte (%s)\n", dummy, ftell(inFile[i]), fileList[i][inFileIndex[i]].Data()); + earlyTermination = true; + } - short header = ((word[0] >> 28 ) & 0xF); - if( header != 0xA ) break; - unsigned int aggSize = (word[0] & 0x0FFFFFFF) * 4; ///byte + if( earlyTermination == false){ + fseek(inFile[i], -4, SEEK_CUR); // rool back - buffer = new char[aggSize]; - dummy = fread(buffer, aggSize, 1, inFile[i]); - if( dummy != 1) printf("fread error, should read %d bytes, but read %ld x %d byte, file pos: %ld byte (%s)\n", aggSize, dummy, aggSize, ftell(inFile[i]), fileList[i][inFileIndex[i]].Data()); + short header = ((word[0] >> 28 ) & 0xF); + if( header != 0xA ) break; + unsigned int aggSize = (word[0] & 0x0FFFFFFF) * 4; ///byte - data[i]->DecodeBuffer(buffer, aggSize, false, 0); - data[i]->ClearBuffer(); + buffer = new char[aggSize]; + dummy = fread(buffer, aggSize, 1, inFile[i]); + if( dummy != 1) { + printf("fread error, should read %d bytes, but read %ld x %d byte, file pos: %ld byte (%s)\n", aggSize, dummy, aggSize, ftell(inFile[i]), fileList[i][inFileIndex[i]].Data()); + earlyTermination = true; + } - if( feof(inFile[i]) ){ + if( earlyTermination == false){ + data[i]->DecodeBuffer(buffer, aggSize, false, 0); + data[i]->ClearBuffer(); + } + } + + if( feof(inFile[i]) || earlyTermination ){ fclose(inFile[i]); inFile[i] = fopen(fileList[i][inFileIndex[i]+1], "r"); if( inFile[i] ){ @@ -210,7 +236,6 @@ int main(int argc, char **argv) { } } } - aggCount++; }while(aggCount < 10); // get 10 agg @@ -219,11 +244,13 @@ int main(int argc, char **argv) { ///----------- save to tree; long startIndex = mb->eventIndex - mb->eventBuilt + 1; - if( startIndex < 0 ) startIndex += MaxNEvent; + while( startIndex < 0 ) startIndex += MaxNEvent; //printf("startIndex : %ld, %ld\n", startIndex, mb->eventIndex); for( long i = startIndex; i <= mb->eventIndex; i++){ - evID ++; + multi = mb->events[i].size(); + if( multi > MAX_MULTI) break; + evID ++; for( int j = 0; j < multi; j ++){ bd[j] = mb->events[i][j].bd; ch[j] = mb->events[i][j].ch; @@ -262,6 +289,7 @@ int main(int argc, char **argv) { for( long i = startIndex; i <= mb->eventIndex; i++){ evID ++; multi = mb->events[i].size(); + if( multi > MAX_MULTI) break; for( int j = 0; j < multi; j ++){ bd[j] = mb->events[i][j].bd; ch[j] = mb->events[i][j].ch; diff --git a/FSUDAQ.cpp b/FSUDAQ.cpp index da462ca..c3ae86d 100644 --- a/FSUDAQ.cpp +++ b/FSUDAQ.cpp @@ -214,6 +214,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ cbAutoRun->addItem("Single 1 min", 1); cbAutoRun->addItem("Single 30 mins", 30); cbAutoRun->addItem("Single 60 mins", 60); + cbAutoRun->addItem("Single 120 mins", 120); cbAutoRun->addItem("Repeat 1 mins", -1); cbAutoRun->addItem("Repeat 60 mins", -60); cbAutoRun->addItem("Repeat 120 mins", -120); @@ -1079,11 +1080,11 @@ void MainWindow::StopACQ(){ void MainWindow::AutoRun(){ //TODO + runTimer->disconnect(runTimerConnection); if( chkSaveData->isChecked() == false){ StartACQ(); return; } - if( cbAutoRun->currentData().toInt() == 0 ){ StartACQ(); //disconnect(runTimer, runTimerConnection); @@ -1095,6 +1096,7 @@ void MainWindow::AutoRun(){ //TODO runTimerConnection = connect( runTimer, &QTimer::timeout, this, [=](){ needManualComment = false; + LogMsg("Time Up, Stopping ACQ..."); StopACQ(); if( cbAutoRun->currentData().toInt() < 0 ){ diff --git a/Scope.cpp b/Scope.cpp index 18533ac..0d58ffb 100644 --- a/Scope.cpp +++ b/Scope.cpp @@ -51,7 +51,7 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh xaxis->setTitleText("Time [ns]"); updateTraceThread = new TimingThread(); - updateTraceThread->SetWaitTimeinSec(0.5); + updateTraceThread->SetWaitTimeinSec(ScopeUpdateMiliSec / 1000.); connect(updateTraceThread, &TimingThread::timeUp, this, &Scope::UpdateScope); @@ -355,6 +355,9 @@ void Scope::UpdateScope(){ int index = data->DataIndex[ch]; int traceLength = data->Waveform1[ch][index].size(); + if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) traceLength = data->DigiWaveform1[ch][index].size(); + + if( traceLength > MaxDisplayTraceDataLength) traceLength = MaxDisplayTraceDataLength; // printf("--- %s| %d, %d, %d | %d | %d, %d\n", __func__, ch, data->LoopIndex[ch], index, traceLength, factor, tick2ns ); if( data->TriggerRate[ch] > 0 ){ @@ -370,7 +373,7 @@ void Scope::UpdateScope(){ } if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) { - for( int i = 0; i < (int) (data->DigiWaveform1[ch][index]).size() ; i++ ) { + for( int i = 0; i < traceLength ; i++ ) { points[0].append(QPointF(tick2ns * i * factor, (data->Waveform1[ch][index])[i])); if( i < (int) data->Waveform2[ch][index].size() ) points[1].append(QPointF(tick2ns * i * factor, (data->Waveform2[ch][index])[i])); if( i < (int) data->DigiWaveform1[ch][index].size() ) points[2].append(QPointF(tick2ns * i, (data->DigiWaveform1[ch][index])[i] * 1000)); diff --git a/macro.h b/macro.h index 4ee75ac..aebca58 100644 --- a/macro.h +++ b/macro.h @@ -10,7 +10,8 @@ #define MaxRecordLength 0x3fff * 8 #define MaxSaveFileSize 1024 * 1024 * 1024 * 2 -#define MaxDisplayTraceDataLength 2000 //data point, +#define MaxDisplayTraceDataLength 1250 //data point, +#define ScopeUpdateMiliSec 200 // msec #define MaxNumberOfTrace 4 // in an event #define SETTINGSIZE 2048