[Major] remove histogram timing thread, make a new worker, move to a thread to fill histograms

This commit is contained in:
Ryan Tang 2024-08-28 16:45:23 -04:00
parent 55210083fc
commit 0a751eaab1
4 changed files with 163 additions and 144 deletions

View File

@ -36,7 +36,6 @@ FSUDAQ::FSUDAQ(QWidget *parent) : QMainWindow(parent){
scope = nullptr; scope = nullptr;
digiSettings = nullptr; digiSettings = nullptr;
singleHistograms = nullptr; singleHistograms = nullptr;
histThread = nullptr;
onlineAnalyzer = nullptr; onlineAnalyzer = nullptr;
runTimer = new QTimer(); runTimer = new QTimer();
breakAutoRepeat = true; breakAutoRepeat = true;
@ -323,17 +322,6 @@ FSUDAQ::~FSUDAQ(){
if( scope ) delete scope; if( scope ) delete scope;
if( histThread ){
if( !histThread->isStopped() ){
histThread->Stop();
histThread->quit();
histThread->wait();
}
delete histThread;
}
if( singleHistograms ) delete singleHistograms; if( singleHistograms ) delete singleHistograms;
if( onlineAnalyzer ) delete onlineAnalyzer; if( onlineAnalyzer ) delete onlineAnalyzer;
@ -743,12 +731,6 @@ void FSUDAQ::OpenDigitizers(){
} }
singleHistograms = new SingleSpectra(digi, nDigi, rawDataPath); singleHistograms = new SingleSpectra(digi, nDigi, rawDataPath);
histThread = new TimingThread(this);
histThread->SetWaitTimeinSec(singleHistograms->GetMaxFillTime()/1000.);
connect(histThread, &TimingThread::timeUp, this, [=](){
if( singleHistograms == nullptr && !singleHistograms->IsFillHistograms()) return;
singleHistograms->FillHistograms();
});
LogMsg("====== <font style=\"color: blue;\"><b>" + QString("Done. Opened %1 digitizer(s).").arg(nDigi) + "</b></font> ====="); LogMsg("====== <font style=\"color: blue;\"><b>" + QString("Done. Opened %1 digitizer(s).").arg(nDigi) + "</b></font> =====");
@ -784,22 +766,12 @@ void FSUDAQ::CloseDigitizers(){
scalarThread->exit(); scalarThread->exit();
CleanUpScalar(); CleanUpScalar();
if( histThread){
histThread->Stop();
histThread->quit();
histThread->wait();
delete histThread;
histThread = nullptr;
}
if( onlineAnalyzer ){ if( onlineAnalyzer ){
onlineAnalyzer->close(); onlineAnalyzer->close();
delete onlineAnalyzer; delete onlineAnalyzer;
onlineAnalyzer = nullptr; onlineAnalyzer = nullptr;
} }
if( singleHistograms ){ if( singleHistograms ){
singleHistograms->close(); singleHistograms->close();
delete singleHistograms; delete singleHistograms;
@ -1054,6 +1026,9 @@ void FSUDAQ::OpenScalar(){
void FSUDAQ::UpdateScalar(){ void FSUDAQ::UpdateScalar(){
DebugPrint("%s", "FSUDAQ"); DebugPrint("%s", "FSUDAQ");
// printf("================== FSUDAQ::%s\n", __func__);
if( digi == nullptr ) return; if( digi == nullptr ) return;
if( scalar == nullptr ) return; if( scalar == nullptr ) return;
//if( !scalar->isVisible() ) return; //if( !scalar->isVisible() ) return;
@ -1066,6 +1041,7 @@ void FSUDAQ::UpdateScalar(){
uint64_t totalFileSize = 0; uint64_t totalFileSize = 0;
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){ for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){
// printf("======== digi-%d\n", iDigi);
if( digi[iDigi]->IsBoardDisabled() ) continue; if( digi[iDigi]->IsBoardDisabled() ) continue;
uint32_t acqStatus = digi[iDigi]->GetACQStatusFromMemory(); uint32_t acqStatus = digi[iDigi]->GetACQStatusFromMemory();
@ -1107,6 +1083,7 @@ void FSUDAQ::UpdateScalar(){
} }
// digiMTX[iDigi].unlock(); // digiMTX[iDigi].unlock();
// printf("============= end of FSUDAQ::%s\n", __func__);
} }
@ -1181,7 +1158,7 @@ void FSUDAQ::StartACQ(){
} }
lbScalarACQStatus->setText("<font style=\"color: green;\"><b>ACQ On</b></font>"); lbScalarACQStatus->setText("<font style=\"color: green;\"><b>ACQ On</b></font>");
if( singleHistograms != nullptr ) histThread->start(); if( singleHistograms != nullptr ) singleHistograms->startWork();
bnStartACQ->setEnabled(false); bnStartACQ->setEnabled(false);
bnStartACQ->setStyleSheet(""); bnStartACQ->setStyleSheet("");
@ -1256,13 +1233,9 @@ void FSUDAQ::StopACQ(){
} }
if( onlineAnalyzer ) onlineAnalyzer->StopThread(); if( onlineAnalyzer ) onlineAnalyzer->StopThread();
if( singleHistograms ) singleHistograms->stopWork();
if( singleHistograms && histThread->isRunning()){
histThread->Stop();
histThread->quit();
histThread->wait();
singleHistograms->ClearInternalDataCount();
}
lbScalarACQStatus->setText("<font style=\"color: red;\"><b>ACQ Off</b></font>"); lbScalarACQStatus->setText("<font style=\"color: red;\"><b>ACQ Off</b></font>");
bnStartACQ->setEnabled(true); bnStartACQ->setEnabled(true);
@ -1755,19 +1728,14 @@ void FSUDAQ::OpenScope(){
} }
if( digiSettings ) digiSettings->setEnabled(!onOff); if( digiSettings ) digiSettings->setEnabled(!onOff);
if( singleHistograms ) {
if( singleHistograms ){ if( onOff ) {
if( onOff) { singleHistograms->startWork();
histThread->start();
}else{ }else{
if( histThread->isRunning()){ singleHistograms->stopWork();
histThread->Stop();
histThread->quit();
histThread->wait();
singleHistograms->ClearInternalDataCount();
}
} }
} }
}); });
connect(scope, &Scope::UpdateScaler, this, &FSUDAQ::UpdateScalar); connect(scope, &Scope::UpdateScaler, this, &FSUDAQ::UpdateScalar);

View File

@ -194,7 +194,7 @@ private:
//@----- SingleSpectra //@----- SingleSpectra
SingleSpectra * singleHistograms; SingleSpectra * singleHistograms;
TimingThread * histThread; // TimingThread * histThread;
//@----- Analyzer //@----- Analyzer
Analyzer * onlineAnalyzer; Analyzer * onlineAnalyzer;

View File

@ -18,8 +18,6 @@ SingleSpectra::SingleSpectra(Digitizer ** digi, unsigned int nDigi, QString rawD
isSignalSlotActive = true; isSignalSlotActive = true;
setWindowTitle("Single Histograms"); setWindowTitle("Single Histograms");
//setWindowFlags( this->windowFlags() & ~Qt::WindowCloseButtonHint );
//====== resize window if screen too small //====== resize window if screen too small
QScreen * screen = QGuiApplication::primaryScreen(); QScreen * screen = QGuiApplication::primaryScreen();
@ -29,7 +27,6 @@ SingleSpectra::SingleSpectra(Digitizer ** digi, unsigned int nDigi, QString rawD
}else{ }else{
setGeometry(0, 0, 1000, 800); setGeometry(0, 0, 1000, 800);
} }
// setGeometry(0, 0, 1000, 800);
QWidget * layoutWidget = new QWidget(this); QWidget * layoutWidget = new QWidget(this);
setCentralWidget(layoutWidget); setCentralWidget(layoutWidget);
@ -174,11 +171,10 @@ SingleSpectra::SingleSpectra(Digitizer ** digi, unsigned int nDigi, QString rawD
}); });
QCheckBox * chkIsFillHistogram = new QCheckBox("Fill Histograms", this); chkIsFillHistogram = new QCheckBox("Fill Histograms", this);
ctrlLayout->addWidget(chkIsFillHistogram, 0, 8); ctrlLayout->addWidget(chkIsFillHistogram, 0, 8);
connect(chkIsFillHistogram, &QCheckBox::stateChanged, this, [=](int state){ fillHistograms = state;});
chkIsFillHistogram->setChecked(false); chkIsFillHistogram->setChecked(false);
fillHistograms = false; isFillingHistograms = false;
QLabel * lbSettingPath = new QLabel( settingPath , this); QLabel * lbSettingPath = new QLabel( settingPath , this);
ctrlLayout->addWidget(lbSettingPath, 1, 0, 1, 6); ctrlLayout->addWidget(lbSettingPath, 1, 0, 1, 6);
@ -237,10 +233,28 @@ SingleSpectra::SingleSpectra(Digitizer ** digi, unsigned int nDigi, QString rawD
ClearInternalDataCount(); ClearInternalDataCount();
workerThread = new QThread(this);
histWorker = new HistWorker(this);
timer = new QTimer(this);
histWorker->moveToThread(workerThread);
// Setup the timer to trigger every second
connect(timer, &QTimer::timeout, histWorker, &HistWorker::FillHistograms);
workerThread->start();
} }
SingleSpectra::~SingleSpectra(){ SingleSpectra::~SingleSpectra(){
DebugPrint("%s", "SingleSpectra"); DebugPrint("%s", "SingleSpectra");
timer->stop();
if( workerThread->isRunning() ){
workerThread->quit();
workerThread->wait();
}
SaveSetting(); SaveSetting();
for( unsigned int i = 0; i < nDigi; i++ ){ for( unsigned int i = 0; i < nDigi; i++ ){
@ -309,82 +323,6 @@ void SingleSpectra::ChangeHistView(){
} }
void SingleSpectra::FillHistograms(){
// DebugPrint("%s", "SingleSpectra");
if( !fillHistograms ) return;
timespec t0, t1;
QVector<int> randomDigiList = generateNonRepeatedCombination(nDigi);
// qDebug() << randomDigiList;
for( int i = 0; i < nDigi; i++){
int ID = randomDigiList[i];
QVector<int> randomChList = generateNonRepeatedCombination(digi[ID]->GetNumInputCh());
// qDebug() << randomChList;
// digiMTX[ID].lock();
// digi[ID]->GetData()->PrintAllData();
clock_gettime(CLOCK_REALTIME, &t0);
for( int k = 0; k < digi[ID]->GetNumInputCh(); k ++ ){
int ch = randomChList[k];
int lastIndex = digi[ID]->GetData()->GetDataIndex(ch);
// printf("--- ch %2d | last index %d \n", ch, lastIndex);
if( lastIndex < 0 ) continue;
int loopIndex = digi[ID]->GetData()->GetLoopIndex(ch);
int temp1 = lastIndex + loopIndex * digi[ID]->GetData()->GetDataSize();
int temp2 = lastFilledIndex[ID][ch] + loopFilledIndex[ID][ch] * digi[ID]->GetData()->GetDataSize() + 1;
// printf("loopIndx : %d | ID now : %d, ID old : %d \n", loopIndex, temp1, temp2);
if( temp1 <= temp2 ) continue;
if( temp1 - temp2 > digi[ID]->GetData()->GetDataSize() ) { //DefaultDataSize = 10k
temp2 = temp1 - digi[ID]->GetData()->GetDataSize();
lastFilledIndex[ID][ch] = lastIndex;
lastFilledIndex[ID][ch] = loopIndex - 1;
}
// printf("ch %d | regulated ID now %d new %d | last fill idx %d\n", ch, temp2, temp1, lastFilledIndex[ID][ch]);
for( int j = 0 ; j <= temp1 - temp2; j ++){
lastFilledIndex[ID][ch] ++;
if( lastFilledIndex[ID][ch] > digi[ID]->GetData()->GetDataSize() ) {
lastFilledIndex[ID][ch] = 0;
loopFilledIndex[ID][ch] ++;
}
uShort data = digi[ID]->GetData()->GetEnergy(ch, lastFilledIndex[ID][ch]);
// printf(" ch: %d, last fill idx : %d | %d \n", ch, lastFilledIndex[ID][ch], data);
hist[ID][ch]->Fill( data );
if( digi[i]->GetDPPType() == DPPTypeCode::DPP_PSD_CODE ){
uShort e2 = digi[ID]->GetData()->GetEnergy2(ch, lastFilledIndex[ID][ch]);
// printf("%u \n", e2);
hist[ID][ch]->Fill( e2, 1);
}
hist2D[ID]->Fill(ch, data);
}
if( histVisibility[ID][ch] ) hist[ID][ch]->UpdatePlot();
clock_gettime(CLOCK_REALTIME, &t1);
if( t1.tv_nsec - t0.tv_nsec + (t1.tv_sec - t0.tv_sec)*1e9 > maxFillTimePerDigi * 1e6 ) break;
}
if( hist2DVisibility[ID] ) hist2D[ID]->UpdatePlot();
// digiMTX[ID].unlock();
}
}
void SingleSpectra::SaveSetting(){ void SingleSpectra::SaveSetting(){
DebugPrint("%s", "SingleSpectra"); DebugPrint("%s", "SingleSpectra");

View File

@ -20,6 +20,7 @@
#include "Histogram1D.h" #include "Histogram1D.h"
#include "Histogram2D.h" #include "Histogram2D.h"
class HistWorker; //Forward decalration
//^==================================================== //^====================================================
//^==================================================== //^====================================================
@ -31,8 +32,8 @@ public:
~SingleSpectra(); ~SingleSpectra();
void ClearInternalDataCount(); void ClearInternalDataCount();
void SetFillHistograms(bool onOff) { fillHistograms = onOff;} // void SetFillHistograms(bool onOff) { fillHistograms = onOff;}
bool IsFillHistograms() const {return fillHistograms;} // bool IsFillHistograms() const {return fillHistograms;}
void LoadSetting(); void LoadSetting();
void SaveSetting(); void SaveSetting();
@ -42,20 +43,39 @@ public:
QVector<int> generateNonRepeatedCombination(int size); QVector<int> generateNonRepeatedCombination(int size);
public slots:
void FillHistograms();
void ChangeHistView();
private: /// This should be private....
int lastFilledIndex[MaxNDigitizer][MaxNChannels];
int loopFilledIndex[MaxNDigitizer][MaxNChannels];
bool histVisibility[MaxNDigitizer][MaxNChannels];
bool hist2DVisibility[MaxNDigitizer];
unsigned short maxFillTimePerDigi;
bool isFillingHistograms;
Histogram1D * hist[MaxNDigitizer][MaxNChannels];
Histogram2D * hist2D[MaxNDigitizer];
Digitizer ** digi; Digitizer ** digi;
unsigned short nDigi; unsigned short nDigi;
Histogram1D * hist[MaxNDigitizer][MaxNChannels]; void startWork(){
Histogram2D * hist2D[MaxNDigitizer]; printf("timer start\n");
timer->start(maxFillTimeinMilliSec);
}
void stopWork(){
printf("timer stop\n");
timer->stop();
ClearInternalDataCount();
}
QCheckBox * chkIsFillHistogram;
public slots:
// void FillHistograms();
void ChangeHistView();
private:
bool histVisibility[MaxNDigitizer][MaxNChannels];
bool hist2DVisibility[MaxNDigitizer];
RComboBox * cbDivision; RComboBox * cbDivision;
@ -66,17 +86,110 @@ private:
QGridLayout * histLayout; QGridLayout * histLayout;
int oldBd, oldCh; int oldBd, oldCh;
int lastFilledIndex[MaxNDigitizer][MaxNChannels];
int loopFilledIndex[MaxNDigitizer][MaxNChannels];
bool fillHistograms;
QString settingPath; QString settingPath;
unsigned short maxFillTimeinMilliSec; unsigned short maxFillTimeinMilliSec;
unsigned short maxFillTimePerDigi;
bool isSignalSlotActive; bool isSignalSlotActive;
QThread * workerThread;
HistWorker * histWorker;
QTimer * timer;
}; };
//^#======================================================== HistWorker
class HistWorker : public QObject{
Q_OBJECT
public:
HistWorker(SingleSpectra * parent): SS(parent){}
public slots:
void FillHistograms(){
// printf("%s | %d %d \n", __func__, SS->chkIsFillHistogram->checkState(), SS->isFillingHistograms);
if( SS->chkIsFillHistogram->checkState() == Qt::Unchecked ) return;
if( SS->isFillingHistograms) return;
SS->isFillingHistograms = true;
timespec t0, t1;
QVector<int> randomDigiList = SS->generateNonRepeatedCombination(SS->nDigi);
// qDebug() << randomDigiList;
for( int i = 0; i < SS->nDigi; i++){
int ID = randomDigiList[i];
QVector<int> randomChList = SS->generateNonRepeatedCombination(SS->digi[ID]->GetNumInputCh());
// qDebug() << randomChList;
// digiMTX[ID].lock();
// digi[ID]->GetData()->PrintAllData();
clock_gettime(CLOCK_REALTIME, &t0);
for( int k = 0; k < SS->digi[ID]->GetNumInputCh(); k ++ ){
int ch = randomChList[k];
int lastIndex = SS->digi[ID]->GetData()->GetDataIndex(ch);
if( lastIndex < 0 ) continue;
printf("--- ch %2d | last index %d \n", ch, lastIndex);
int loopIndex = SS->digi[ID]->GetData()->GetLoopIndex(ch);
int temp1 = lastIndex + loopIndex * SS->digi[ID]->GetData()->GetDataSize();
int temp2 = SS->lastFilledIndex[ID][ch] + SS->loopFilledIndex[ID][ch] * SS->digi[ID]->GetData()->GetDataSize() + 1;
// printf("loopIndx : %d | ID now : %d, ID old : %d \n", loopIndex, temp1, temp2);
if( temp1 <= temp2 ) continue;
if( temp1 - temp2 > SS->digi[ID]->GetData()->GetDataSize() ) { //DefaultDataSize = 10k
temp2 = temp1 - SS->digi[ID]->GetData()->GetDataSize();
SS->lastFilledIndex[ID][ch] = lastIndex;
SS->lastFilledIndex[ID][ch] = loopIndex - 1;
}
// printf("ch %d | regulated ID now %d new %d | last fill idx %d\n", ch, temp2, temp1, lastFilledIndex[ID][ch]);
for( int j = 0 ; j <= temp1 - temp2; j ++){
SS->lastFilledIndex[ID][ch] ++;
if( SS->lastFilledIndex[ID][ch] > SS->digi[ID]->GetData()->GetDataSize() ) {
SS->lastFilledIndex[ID][ch] = 0;
SS->loopFilledIndex[ID][ch] ++;
}
uShort data = SS->digi[ID]->GetData()->GetEnergy(ch, SS->lastFilledIndex[ID][ch]);
// printf(" ch: %d, last fill idx : %d | %d \n", ch, lastFilledIndex[ID][ch], data);
SS->hist[ID][ch]->Fill( data );
if( SS->digi[i]->GetDPPType() == DPPTypeCode::DPP_PSD_CODE ){
uShort e2 = SS->digi[ID]->GetData()->GetEnergy2(ch, SS->lastFilledIndex[ID][ch]);
// printf("%u \n", e2);
SS->hist[ID][ch]->Fill( e2, 1);
}
SS->hist2D[ID]->Fill(ch, data);
}
if( SS->histVisibility[ID][ch] ) SS->hist[ID][ch]->UpdatePlot();
clock_gettime(CLOCK_REALTIME, &t1);
if( t1.tv_nsec - t0.tv_nsec + (t1.tv_sec - t0.tv_sec)*1e9 > SS->maxFillTimePerDigi * 1e6 ) break;
}
if( SS->hist2DVisibility[ID] ) SS->hist2D[ID]->UpdatePlot();
// digiMTX[ID].unlock();
}
SS->isFillingHistograms = false;
emit workDone();
}
signals:
void workDone();
private:
SingleSpectra * SS;
};
#endif #endif