From d36e8ef2ece29673beca138279d1d3ceedcbc686 Mon Sep 17 00:00:00 2001 From: "Ryan@WorkStation" Date: Tue, 31 Jan 2023 18:59:12 -0500 Subject: [PATCH] add more on the main window --- .vscode/c_cpp_properties.json | 3 +- .vscode/settings.json | 6 + SolReader.h | 234 ++++++++++++++++++++++++++++++++++ digiSettings.cpp | 10 +- digiSettings.h | 1 + mainwindow.cpp | 148 ++++++++++++++++++--- mainwindow.h | 18 ++- script.C | 85 ++++++++++++ 8 files changed, 476 insertions(+), 29 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 SolReader.h create mode 100644 script.C diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index df5eaf1..fec381b 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -4,7 +4,8 @@ "name": "Linux", "includePath": [ "${workspaceFolder}/**", - "/usr/include/x86_64-linux-gnu/qt6/**" + "/usr/include/x86_64-linux-gnu/qt6/**", + "/opt/root/include/*" ], "defines": [], "compilerPath": "/usr/bin/gcc", diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..14f4af5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "script.C": "cpp", + "SOLARIS_Qt6_DAQ.pro" : "makefile" + } +} \ No newline at end of file diff --git a/SolReader.h b/SolReader.h new file mode 100644 index 0000000..e126a59 --- /dev/null +++ b/SolReader.h @@ -0,0 +1,234 @@ +#ifndef SOLREADER_H +#define SOLREADER_H + +#include /// for FILE +#include +#include +#include +#include +#include // time in nano-sec + +#include "Event.h" + +class SolReader { + private: + FILE * inFile; + unsigned int inFileSize; + unsigned int filePos; + unsigned int totNumBlock; + + unsigned short blockStartIdentifier; + unsigned int numBlock; + bool isScanned; + + void init(); + + std::vector blockPos; + + public: + SolReader(); + SolReader(std::string fileName, unsigned short dataType); + ~SolReader(); + + void OpenFile(std::string fileName); + int ReadNextBlock(int opt = 0); // opt = 0, noraml, 1, fast + int ReadBlock(unsigned int index); + + void ScanNumBlock(); + + unsigned int GetNumBlock() {return numBlock;} + unsigned int GetTotalNumBlock() {return totNumBlock;} + unsigned int GetFilePos() {return filePos;} + unsigned int GetFileSize() {return inFileSize;} + + void RewindFile(); + + Event * evt; + +}; + +void SolReader::init(){ + inFileSize = 0; + numBlock = 0; + filePos = 0; + totNumBlock = 0; + evt = new Event(); + + isScanned = false; + + blockPos.clear(); + +} + +SolReader::SolReader(){ + init(); +} + +SolReader::SolReader(std::string fileName, unsigned short dataType = 0){ + init(); + OpenFile(fileName); + evt->SetDataType(dataType); +} + +SolReader::~SolReader(){ + if( !inFile ) fclose(inFile); + delete evt; +} + +inline void SolReader::OpenFile(std::string fileName){ + inFile = fopen(fileName.c_str(), "r"); + if( inFile == NULL ){ + printf("Cannot open file : %s \n", fileName.c_str()); + }else{ + fseek(inFile, 0L, SEEK_END); + inFileSize = ftell(inFile); + rewind(inFile); + } +} + +inline int SolReader::ReadBlock(unsigned int index){ + if( isScanned == false) return -1; + if( index >= totNumBlock )return -1; + fseek(inFile, 0L, SEEK_SET); + + printf("-----------%u, %u\n", index, blockPos[index]); + + fseek(inFile, blockPos[index], SEEK_CUR); + + numBlock = index; + + return ReadNextBlock(); +} + +inline int SolReader::ReadNextBlock(int opt){ + if( inFile == NULL ) return -1; + if( feof(inFile) ) return -1; + if( filePos >= inFileSize) return -1; + + fread(&blockStartIdentifier, 2, 1, inFile); + + if( (blockStartIdentifier & 0xAAA0) != 0xAAA0 ) { + printf("header fail.\n"); + return -2 ; + } + + if( ( blockStartIdentifier & 0xF ) == 15 ){ + evt->SetDataType(15); + } + evt->dataType = blockStartIdentifier & 0xF; + + if( evt->dataType == 0){ + if( opt == 0 ){ + fread(&evt->channel, 1, 1, inFile); + fread(&evt->energy, 2, 1, inFile); + fread(&evt->timestamp, 6, 1, inFile); + fread(&evt->fine_timestamp, 2, 1, inFile); + fread(&evt->flags_high_priority, 1, 1, inFile); + fread(&evt->flags_low_priority, 2, 1, inFile); + fread(&evt->downSampling, 1, 1, inFile); + fread(&evt->board_fail, 1, 1, inFile); + fread(&evt->flush, 1, 1, inFile); + fread(&evt->trigger_threashold, 2, 1, inFile); + fread(&evt->event_size, 8, 1, inFile); + fread(&evt->aggCounter, 4, 1, inFile); + }else{ + fseek(inFile, 31, SEEK_CUR); + } + fread(&evt->traceLenght, 8, 1, inFile); + if( opt == 0){ + fread(evt->analog_probes_type, 2, 1, inFile); + fread(evt->digital_probes_type, 4, 1, inFile); + fread(evt->analog_probes[0], evt->traceLenght*4, 1, inFile); + fread(evt->analog_probes[1], evt->traceLenght*4, 1, inFile); + fread(evt->digital_probes[0], evt->traceLenght, 1, inFile); + fread(evt->digital_probes[1], evt->traceLenght, 1, inFile); + fread(evt->digital_probes[2], evt->traceLenght, 1, inFile); + fread(evt->digital_probes[3], evt->traceLenght, 1, inFile); + }else{ + fseek(inFile, 6 + evt->traceLenght*(12), SEEK_CUR); + } + }else if( evt->dataType == 1){ + if( opt == 0 ){ + fread(&evt->channel, 1, 1, inFile); + fread(&evt->energy, 2, 1, inFile); + fread(&evt->timestamp, 6, 1, inFile); + fread(&evt->fine_timestamp, 2, 1, inFile); + fread(&evt->flags_high_priority, 1, 1, inFile); + fread(&evt->flags_low_priority, 2, 1, inFile); + }else{ + fseek(inFile, 14, SEEK_CUR); + } + fread(&evt->traceLenght, 8, 1, inFile); + if( opt == 0){ + fread(&evt->analog_probes_type[0], 1, 1, inFile); + fread(evt->analog_probes[0], evt->traceLenght*4, 1, inFile); + }else{ + fseek(inFile, 1 + evt->traceLenght*4, SEEK_CUR); + } + }else if( evt->dataType == 2){ + if( opt == 0 ){ + fread(&evt->channel, 1, 1, inFile); + fread(&evt->energy, 2, 1, inFile); + fread(&evt->timestamp, 6, 1, inFile); + fread(&evt->fine_timestamp, 2, 1, inFile); + fread(&evt->flags_high_priority, 1, 1, inFile); + fread(&evt->flags_low_priority, 2, 1, inFile); + }else{ + fseek(inFile, 14, SEEK_CUR); + } + }else if( evt->dataType == 3){ + if( opt == 0 ){ + fread(&evt->channel, 1, 1, inFile); + fread(&evt->energy, 2, 1, inFile); + fread(&evt->timestamp, 6, 1, inFile); + }else{ + fseek(inFile, 9, SEEK_CUR); + } + }else if( evt->dataType == 15){ + fread(&evt->dataSize, 8, 1, inFile); + if( opt == 0){ + fread(evt->data, evt->dataSize, 1, inFile); + }else{ + fseek(inFile, evt->dataSize, SEEK_CUR); + } + } + + numBlock ++; + filePos = ftell(inFile); + return 0; +} + +void SolReader::RewindFile(){ + rewind(inFile); + filePos = 0; + numBlock = 0; +} + +void SolReader::ScanNumBlock(){ + if( inFile == NULL ) return; + if( feof(inFile) ) return; + + numBlock = 0; + blockPos.clear(); + + blockPos.push_back(0); + + while( ReadNextBlock(1) == 0){ + blockPos.push_back(filePos); + printf("%u, %.2f%% %u/%u\n\033[A\r", numBlock, filePos*100./inFileSize, filePos, inFileSize); + } + + totNumBlock = numBlock; + numBlock = 0; + isScanned = true; + printf("\nScan complete: number of data Block : %u\n", totNumBlock); + rewind(inFile); + filePos = 0; + + //for( int i = 0; i < totNumBlock; i++){ + // printf("%7d | %u \n", i, blockPos[i]); + //} + +} + +#endif \ No newline at end of file diff --git a/digiSettings.cpp b/digiSettings.cpp index de9a310..1055725 100644 --- a/digiSettings.cpp +++ b/digiSettings.cpp @@ -289,7 +289,7 @@ DigiSettings::DigiSettings(Digitizer2Gen * digi, unsigned short nDigi, QWidget * QSignalMapper * onOffMapper = new QSignalMapper(tab); connect(onOffMapper, &QSignalMapper::mappedInt, this, &DigiSettings::onChannelonOff); - + QTabWidget * chTabWidget = new QTabWidget(tab); chLayout->addWidget(chTabWidget); {//.......... All Settings tab @@ -336,9 +336,7 @@ DigiSettings::DigiSettings(Digitizer2Gen * digi, unsigned short nDigi, QWidget * } } - - - + /* for( unsigned short rowID = 0; rowID < digi->GetNChannels() + 2; rowID++){ @@ -408,7 +406,7 @@ DigiSettings::DigiSettings(Digitizer2Gen * digi, unsigned short nDigi, QWidget * chLayout->addWidget(labChADCVetoWidth, rowID, colID); } - + //------ set all channel if( rowID == 0 || rowID >= 2){ @@ -587,7 +585,7 @@ DigiSettings::DigiSettings(Digitizer2Gen * digi, unsigned short nDigi, QWidget * } - }*/ //-- end of ch loop; + } */ //-- end of ch loop; } {//------- Group trigger settings diff --git a/digiSettings.h b/digiSettings.h index 2f98027..8af28c7 100644 --- a/digiSettings.h +++ b/digiSettings.h @@ -100,6 +100,7 @@ private: bool bnClickStatus[MaxNumberOfChannel][MaxNumberOfChannel]; QCheckBox * cbCh[MaxNumberOfDigitizer][MaxNumberOfChannel + 1]; // index = 64 is for all channels + //QCheckBox * cbCh[MaxNumberOfChannel + 1]; // index = 64 is for all channels QSpinBox * sbRecordLength[MaxNumberOfChannel + 1]; QSpinBox * sbPreTrigger[MaxNumberOfChannel + 1]; diff --git a/mainwindow.cpp b/mainwindow.cpp index c0b17eb..2f952f4 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2,6 +2,8 @@ #include #include +#include +#include #include @@ -18,6 +20,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ nDigi = 0; digiSerialNum.clear(); digiSetting = NULL; + readDataThread = NULL; QWidget * mainLayoutWidget = new QWidget(this); setCentralWidget(mainLayoutWidget); @@ -32,7 +35,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ QGridLayout * layout1 = new QGridLayout(box1); bnProgramSettings = new QPushButton("Program Settings", this); - bnProgramSettings->setEnabled(false); + connect(bnProgramSettings, &QPushButton::clicked, this, &MainWindow::ProgramSettings); bnOpenDigitizers = new QPushButton("Open Digitizers", this); connect(bnOpenDigitizers, SIGNAL(clicked()), this, SLOT(bnOpenDigitizers_clicked())); @@ -45,11 +48,29 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ bnDigiSettings->setEnabled(false); connect(bnDigiSettings, SIGNAL(clicked()), this, SLOT(OpenDigitizersSettings())); + QPushButton * bnSOLSettings = new QPushButton("SOLARIS Settings", this); + bnSOLSettings->setEnabled(false); + + QPushButton * bnOpenScope = new QPushButton("Open scope", this); + bnOpenScope->setEnabled(false); + + bnNewExp = new QPushButton("New/Change Exp", this); + connect(bnNewExp, &QPushButton::clicked, this, &MainWindow::SetupNewExp); + + QLineEdit * lExpName = new QLineEdit("", this); + lExpName->setReadOnly(true); layout1->addWidget(bnProgramSettings, 0, 0); layout1->addWidget(bnOpenDigitizers, 0, 1); layout1->addWidget(bnCloseDigitizers, 0, 2); layout1->addWidget(bnDigiSettings, 1, 1); + layout1->addWidget(bnSOLSettings, 1, 2); + + layout1->addWidget(bnNewExp, 2, 0); + layout1->addWidget(lExpName, 2, 1); + layout1->addWidget(bnOpenScope, 2, 2); + + for( int i = 0; i < layout1->columnCount(); i++) layout1->setColumnStretch(i, 1); } @@ -67,9 +88,26 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ bnStopACQ = new QPushButton("Stop ACQ", this); bnStopACQ->setEnabled(false); connect(bnStopACQ, &QPushButton::clicked, this, &MainWindow::StopACQ); - - layout2->addWidget(bnStartACQ, 0, 0); - layout2->addWidget(bnStopACQ, 0, 1); + + QLabel * lbRunID = new QLabel("Run ID : ", this); + lbRunID->setAlignment(Qt::AlignRight | Qt::AlignCenter); + QLineEdit * runID = new QLineEdit(this); + runID->setReadOnly(true); + + QLabel * lbRunComment = new QLabel("Run Comment : ", this); + lbRunComment->setAlignment(Qt::AlignRight | Qt::AlignCenter); + QLineEdit * runComment = new QLineEdit(this); + runComment->setReadOnly(true); + + layout2->addWidget(lbRunID, 0, 0); + layout2->addWidget(runID, 0, 1); + layout2->addWidget(bnStartACQ, 0, 2); + layout2->addWidget(bnStopACQ, 0, 3); + layout2->addWidget(lbRunComment, 1, 0); + layout2->addWidget(runComment, 1, 1, 1, 3); + + layout2->setColumnStretch(0, 0.3); + for( int i = 0; i < layout2->columnCount(); i++) layout2->setColumnStretch(i, 1); } @@ -99,23 +137,28 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ MainWindow::~MainWindow(){ - delete digiSetting; + //---- may be no need to delete as thay are child of this + //delete bnProgramSettings; + //delete bnOpenDigitizers; + //delete bnCloseDigitizers; + //delete bnDigiSettings; + //delete bnNewExp; + //delete logInfo; - delete bnProgramSettings; - delete bnOpenDigitizers; - delete bnCloseDigitizers; - delete bnDigiSettings; - delete logInfo; + //---- need manually delete + if( digiSetting != NULL ) delete digiSetting; if( digi != NULL ){ digi->CloseDigitizer(); delete digi; } - readDataThread->Stop(); - readDataThread->quit(); - readDataThread->wait(); - delete readDataThread; + if( readDataThread != NULL){ + readDataThread->Stop(); + readDataThread->quit(); + readDataThread->wait(); + delete readDataThread; + } } @@ -183,16 +226,18 @@ void MainWindow::bnOpenDigitizers_clicked(){ }else{ LogMsg("Cannot open digitizer"); - LogMsg("use a dummy."); + //LogMsg("use a dummy."); + //digi->SetDummy(); + //digiSerialNum.push_back(0000); + //nDigi ++; - digi->SetDummy(); - digiSerialNum.push_back(0000); - nDigi ++; + delete digi; } } +//###################################################################### void MainWindow::bnCloseDigitizers_clicked(){ if( digi != NULL ){ digi->CloseDigitizer(); @@ -225,6 +270,73 @@ void MainWindow::OpenDigitizersSettings(){ digiSetting->show(); } } +//###################################################################### + +void MainWindow::SetupNewExp(){ + + QDialog dialog(this); + dialog.setWindowTitle("Setup / change Experiment"); + dialog.setGeometry(0, 0, 500, 500); + + QVBoxLayout * layout = new QVBoxLayout(&dialog); + + //------- instruction + QLabel *label = new QLabel("Here list the pass experiments. ", &dialog); + layout->addWidget(label); + + //------- get and list the git repository + QPlainTextEdit * gitList = new QPlainTextEdit(&dialog); + layout->addWidget(gitList); + gitList->setReadOnly(true); + + //------- get harddisk space; + //QStorageInfo storage("/path/to/drive"); + QStorageInfo storage = QStorageInfo::root(); + qint64 availableSpace = storage.bytesAvailable(); + + QLabel * lbDiskSpace = new QLabel("Disk space avalible " + QString::number(availableSpace/1024./1024./1024.) + " [GB]", &dialog); + layout->addWidget(lbDiskSpace); + + //------- type existing or new experiment + QLineEdit * input = new QLineEdit(&dialog); + layout->addWidget(input); + + + QPushButton *button1 = new QPushButton("OK", &dialog); + layout->addWidget(button1); + QObject::connect(button1, &QPushButton::clicked, &dialog, &QDialog::accept); + + dialog.exec(); + +} + +void MainWindow::ProgramSettings(){ + + QDialog dialog(this); + dialog.setWindowTitle("Program Settings"); + dialog.setGeometry(0, 0, 500, 500); + + QGridLayout * layout = new QGridLayout(&dialog); + + //-------- data Path + QLabel *lbDataPath = new QLabel("Data Path", &dialog); layout->addWidget(lbDataPath, 0, 0); + QLineEdit * lDataPath = new QLineEdit("/path/to/data", &dialog); layout->addWidget(lDataPath, 0, 1, 1, 2); + //-------- analysis Path + + //-------- IP search range + + //-------- DataBase IP + + //-------- DataBase name + + //-------- Elog IP + + QPushButton *button1 = new QPushButton("OK", &dialog); + layout->addWidget(button1, 2, 1); + QObject::connect(button1, &QPushButton::clicked, &dialog, &QDialog::accept); + + dialog.exec(); +} void MainWindow::LogMsg(QString msg){ diff --git a/mainwindow.h b/mainwindow.h index e7b977d..1fa9a5a 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -57,9 +57,10 @@ public: digi->ErrorMsg("ReadDataLoop()"); } - if( readCount % 1000 == 0 ) { - emit sendMsg("FileSize : " + QString::number(digi->GetFileSize()) + " Bytes"); - clock_gettime(CLOCK_REALTIME, &tb); + clock_gettime(CLOCK_REALTIME, &tb); + //if( readCount % 1000 == 0 ) { + if( tb.tv_sec - ta.tv_sec > 2 ) { + emit sendMsg("FileSize : " + QString::number(digi->GetFileSize()/1024./1024.) + " MB"); //double duration = tb.tv_nsec-ta.tv_nsec + tb.tv_sec*1e+9 - ta.tv_sec*1e+9; //printf("%4d, duration : %10.0f, %6.1f\n", readCount, duration, 1e9/duration); ta = tb; @@ -98,6 +99,9 @@ private slots: void OpenDigitizersSettings(); + void SetupNewExp(); + void ProgramSettings(); + signals : @@ -111,6 +115,8 @@ private: QPushButton * bnStartACQ; QPushButton * bnStopACQ; + QPushButton * bnNewExp; + DigiSettings * digiSetting; QPlainTextEdit * logInfo; @@ -125,7 +131,11 @@ private: ReadDataThread * readDataThread; void LogMsg(QString msg); - + + QString expName; + QString dataPath; + QString analysisPath; + int runID; }; diff --git a/script.C b/script.C new file mode 100644 index 0000000..3e72958 --- /dev/null +++ b/script.C @@ -0,0 +1,85 @@ +#include "SolReader.h" +#include "TH1.h" +#include "TMath.h" +#include "TH2.h" +#include "TStyle.h" +#include "TCanvas.h" + + +void script(){ + + SolReader * reader = new SolReader("haha_000.sol"); + Event * evt = reader->evt; + + printf("----------file size: %u Byte\n", reader->GetFileSize()); + + reader->ScanNumBlock(); + + if( reader->GetTotalNumBlock() == 0 ) return; + + unsigned long startTime, endTime; + reader->ReadBlock(0); + startTime = evt->timestamp; + reader->ReadBlock(reader->GetTotalNumBlock() - 1); + endTime = evt->timestamp; + + double duration = double(endTime - startTime)*8./1e9; + printf("============== %lu ns = %.4f sec.\n", (endTime - startTime)*8, duration); + printf(" avarge rate (16ch): %f Hz\n", reader->GetTotalNumBlock()/duration/16); + reader->RewindFile(); + + + TH1F * hid = new TH1F("hid", "hid", 64, 0, 64); + TH1F * h1 = new TH1F("h1", "h1", duration, startTime, endTime); + TH2F * h2 = new TH2F("h2", "h2", 1000, startTime, endTime, 1000, 0, reader->GetTotalNumBlock()); + TH1F * hTdiff = new TH1F("hTdiff", "hTdiff", 400, 0, 200000); + + uint64_t tOld = startTime; + + for( int i = 0; i < reader->GetTotalNumBlock() ; i++){ + //for( int i = 0; i < 8 ; i++){ + + reader->ReadNextBlock(); + + if( i < 8 ){ + printf("########################## nBlock : %u, %u/%u\n", reader->GetNumBlock(), + reader->GetFilePos(), + reader->GetFileSize()); + evt->PrintAll(); + //evt->PrintAllTrace(); + } + + hid->Fill(evt->channel); + if( evt->channel == 0 ) h1->Fill(evt->timestamp); + h2->Fill(evt->timestamp, i); + + if( i > 0 ){ + hTdiff->Fill(evt->timestamp - tOld); + if( evt->timestamp < tOld) printf("-------- time not sorted."); + tOld = evt->timestamp; + } + + } + + gStyle->SetOptStat("neiou"); + + TCanvas * canvas = new TCanvas("c1", "c1", 1800, 600); + canvas->Divide(3,1); + canvas->cd(1); hid->Draw(); + canvas->cd(2); h1->SetMinimum(0); h1->Draw(); + canvas->cd(3); hTdiff->Draw(); + + //printf("reader traceLength : %lu \n", evt->traceLenght); + + /* + for( int i = 0; i < evt->traceLenght; i++){ + + printf("%4d| %d\n", i, evt->analog_probes[0][i]); + + } + */ + + evt = NULL; + delete reader; + +} \ No newline at end of file