diff --git a/ClassDigitizer2Gen.cpp b/ClassDigitizer2Gen.cpp index 541c16b..9c9b70d 100644 --- a/ClassDigitizer2Gen.cpp +++ b/ClassDigitizer2Gen.cpp @@ -223,7 +223,8 @@ void Digitizer2Gen::SetPHADataFormat(unsigned short dataFormat){ return; } } - + + if( evt ) delete evt; evt = new Event(); evt->SetDataType(dataFormat); dataStartIndetifier += dataFormat; diff --git a/mainwindow.cpp b/mainwindow.cpp index d8c9bbc..cc3b280 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -209,6 +209,8 @@ void MainWindow::StartACQ(){ digi[i]->ProgramPHA(false); digi[i]->SetPHADataFormat(1);// only save 1 trace + digi[i]->WriteValue("/ch/0..63/par/WaveAnalogProbe0", "ADCInput"); + //TODO =========================== save file remove("haha_000.sol"); // remove file digi[i]->OpenOutFile("haha");// haha_000.sol @@ -221,6 +223,7 @@ void MainWindow::StartACQ(){ bnStartACQ->setEnabled(false); bnStopACQ->setEnabled(true); + bnOpenScope->setEnabled(false); //updateTraceThread->start(); @@ -229,15 +232,9 @@ void MainWindow::StartACQ(){ void MainWindow::StopACQ(){ - updateTraceThread->Stop(); - updateTraceThread->quit(); - updateTraceThread->wait(); - for( int i = 0; i < nDigi; i++){ if( digi[i]->IsDummy () ) continue; digi[i]->StopACQ(); - - //readDataThread->Stop(); readDataThread[i]->quit(); readDataThread[i]->wait(); @@ -248,6 +245,10 @@ void MainWindow::StopACQ(){ LogMsg("Stop Run"); bnStartACQ->setEnabled(true); bnStopACQ->setEnabled(false); + bnOpenScope->setEnabled(true); + + runID ++; + leRunID->setText(QString::number(runID)); } @@ -332,31 +333,128 @@ void MainWindow::CloseDigitizers(){ //^###################################################################### Open Scope void MainWindow::OpenScope(){ + cbScopeDigi->clear(); ///thsi will also trigger QComboBox::currentIndexChanged cbScopeCh->clear(); - if( nDigi > 0 && digi != NULL) { + if( digi ) { + + for( int i = 0 ; i < nDigi; i++) { cbScopeDigi->addItem("Digi-" + QString::number(digi[i]->GetSerialNumber()), i); - //*---- set digitizer to take full trace; since in scope mode, no data saving, speed would be fast (How fast?) - //* when the input rate is faster than trigger rate, Digitizer will stop data taking. - - //digi[i]->WriteValue(); - //readDataThread[i]->SetScopeRun(true); - } - //if( nDigi == 1 ) cbScopeDigi->setEnabled(false); - //updateTraceThread->start(); - } + //*---- set digitizer to take full trace; since in scope mode, no data saving, speed would be fast (How fast?) + //* when the input rate is faster than trigger rate, Digitizer will stop data taking. + + int iDigi = cbScopeDigi->currentIndex(); + int ch = cbScopeCh->currentIndex(); + + if( digi[iDigi]->IsDummy() ) return; + + digi[iDigi]->Reset(); + digi[iDigi]->ProgramPHA(false); + + digi[iDigi]->WriteValue("/ch/0..63/par/ChEnable", "false"); + digi[iDigi]->WriteValue(("/ch/" + std::to_string(ch) + "/par/ChEnable").c_str(), "true"); + digi[iDigi]->SetPHADataFormat(0); + + digi[iDigi]->StartACQ(); + + readDataThread[iDigi]->SetScopeRun(true); + readDataThread[iDigi]->start(); + + updateTraceThread->start(); + bnStartACQ->setEnabled(false); + bnStopACQ->setEnabled(false); + } scope->show(); +} +void MainWindow::StopScope(){ + + updateTraceThread->Stop(); + updateTraceThread->quit(); + updateTraceThread->wait(); + + if(digi){ + for(int i = 0; i < nDigi; i++){ + if( digi[i]->IsDummy() ) continue; + digi[i]->StopACQ(); + + readDataThread[i]->quit(); + readDataThread[i]->wait(); + } + bnStartACQ->setEnabled(true); + bnStopACQ->setEnabled(true); + } + +} + +void MainWindow::UpdateScope(){ + + if( scope->isVisible() == false) return; + + int iDigi = cbScopeDigi->currentIndex(); + //int ch = cbScopeCh->currentIndex(); + + if( digi ){ + digiMTX.lock(); + unsigned int traceLength = digi[iDigi]->evt->traceLenght; + unsigned int dataLength = dataTrace->count(); + + if( traceLength < dataLength){ + for( unsigned int i = 0; i < traceLength; i++) { + dataTrace->replace(i, i, digi[iDigi]->evt->analog_probes[0][i]); + } + dataTrace->removePoints(traceLength, dataLength-traceLength); + }else{ + + for( unsigned int i = 0 ; i < traceLength; i++){ + if( i < dataLength ) { + dataTrace->replace(i, i, digi[iDigi]->evt->analog_probes[0][i]); + }else{ + dataTrace->append(i, digi[iDigi]->evt->analog_probes[0][i]); + } + + } + + } + digiMTX.unlock(); + + plot->axes(Qt::Vertical).first()->setRange(-1, 16000); /// this must be after createDefaultAxes(); + plot->axes(Qt::Horizontal).first()->setRange(0, traceLength); + } + +} + +void MainWindow::ProbeChange(QComboBox * cb[], const int size ){ + + QStandardItemModel * model[size] = {NULL}; + for( int i = 0; i < size; i++){ + model[i] = qobject_cast(cb[i]->model()); + } + + /// Enable all items + for( int i = 0; i < cb[0]->count(); i++) { + for( int j = 0; j < size; j ++ ) model[j]->item(i)->setEnabled(true); + } + + for( int i = 0; i < size; i++){ + int index = cb[i]->currentIndex(); + for( int j = 0; j < size; j++){ + if( i == j ) continue; + model[j]->item(index)->setEnabled(false); + } + } + } void MainWindow::SetUpPlot(){ //@--- this function run at start up scope = new QMainWindow(this); scope->setWindowTitle("Scope"); scope->setGeometry(0, 0, 1000, 800); + scope->setWindowFlags( scope->windowFlags() & ~Qt::WindowCloseButtonHint ); plot = new QChart(); dataTrace = new QLineSeries(); @@ -370,7 +468,7 @@ void MainWindow::SetUpPlot(){ //@--- this function run at start up updateTraceThread = new UpdateTraceThread(); connect(updateTraceThread, &UpdateTraceThread::updateTrace, this, &MainWindow::UpdateScope); - //*================ ad Widgets + //*================ add Widgets int rowID = -1; QWidget * layoutWidget = new QWidget(scope); scope->setCentralWidget(layoutWidget); @@ -394,11 +492,11 @@ void MainWindow::SetUpPlot(){ //@--- this function run at start up //------------ Probe selection cbAnaProbe[0] = new QComboBox(scope); - cbAnaProbe[0]->addItem("ADC Input"); - cbAnaProbe[0]->addItem("Time Filter"); - cbAnaProbe[0]->addItem("Trapazoid"); - cbAnaProbe[0]->addItem("Trap. Baseline"); - cbAnaProbe[0]->addItem("Trap. - Baseline"); + cbAnaProbe[0]->addItem("ADC Input", "ADCInput"); + cbAnaProbe[0]->addItem("Time Filter", "TimeFiler"); + cbAnaProbe[0]->addItem("Trapazoid", "EnergyFilter"); + cbAnaProbe[0]->addItem("Trap. Baseline", "EnergyFilterBaseline"); + cbAnaProbe[0]->addItem("Trap. - Baseline", "EnergyFilterMinusBaseline"); cbAnaProbe[1] = new QComboBox(scope); for( int i = 0; i < cbAnaProbe[0]->count() ; i++) cbAnaProbe[1]->addItem(cbAnaProbe[0]->itemText(i), cbAnaProbe[0]->itemData(i)); @@ -406,24 +504,31 @@ void MainWindow::SetUpPlot(){ //@--- this function run at start up connect(cbAnaProbe[0], &QComboBox::currentIndexChanged, this, [=](){ this->ProbeChange(cbAnaProbe, 2);}); connect(cbAnaProbe[1], &QComboBox::currentIndexChanged, this, [=](){ this->ProbeChange(cbAnaProbe, 2);}); + //connect(cbAnaProbe[0], &QComboBox::currentIndexChanged, this, [=](){ + // int iDigi = cbScopeDigi->currentIndex(); + // int ch = cbScopeCh->currentIndex(); + // char str[200] = ("/ch/" + std::to_string(ch) + "/par/WaveAnalogProbe0").c_str(); + // digi[iDigi]->WriteValue(str, (cbAnaProbe[0]->currentData()).toString().toStdString()); + //}); + cbAnaProbe[0]->setCurrentIndex(1); ///trigger the AnaProbeChange cbAnaProbe[0]->setCurrentIndex(0); cbAnaProbe[1]->setCurrentIndex(4); - cbDigProbe[0] = new QComboBox(scope); - cbDigProbe[0]->addItem("Trigger"); - cbDigProbe[0]->addItem("Time Filter Armed"); - cbDigProbe[0]->addItem("ReTrigger Guard"); - cbDigProbe[0]->addItem("Trap. basline Freeze"); - cbDigProbe[0]->addItem("Peaking"); - cbDigProbe[0]->addItem("Peak Ready"); - cbDigProbe[0]->addItem("Pile-up Guard"); - cbDigProbe[0]->addItem("ADC Saturate"); - cbDigProbe[0]->addItem("ADC Sat. Protection"); - cbDigProbe[0]->addItem("Post Sat. Event"); - cbDigProbe[0]->addItem("Trap. Saturate"); - cbDigProbe[0]->addItem("ACQ Inhibit"); + cbDigProbe[0]->addItem("Trigger", "Trigger"); + cbDigProbe[0]->addItem("Time Filter Armed", "TimeFilerArmed"); + cbDigProbe[0]->addItem("ReTrigger Guard", "ReTriggerGaurd"); + cbDigProbe[0]->addItem("Trap. basline Freeze", "EnergyFilterBaselineFreeze"); + cbDigProbe[0]->addItem("Peaking", "EnergyFilterPeaking"); + cbDigProbe[0]->addItem("Peak Ready", "EnergyFilterPeakReady"); + cbDigProbe[0]->addItem("Pile-up Guard", "EnergyFilterPileUpGuard"); + cbDigProbe[0]->addItem("Event Pile Up", "EventPileUp"); + cbDigProbe[0]->addItem("ADC Saturate", "ADCSaturation"); + cbDigProbe[0]->addItem("ADC Sat. Protection", "ADCSaturationProtection"); + cbDigProbe[0]->addItem("Post Sat. Event", "PostSaturationEvent"); + cbDigProbe[0]->addItem("Trap. Saturate", "EnergylterSaturation"); + cbDigProbe[0]->addItem("ACQ Inhibit", "AcquisitionInhibit"); cbDigProbe[1] = new QComboBox(scope); cbDigProbe[2] = new QComboBox(scope); @@ -460,46 +565,20 @@ void MainWindow::SetUpPlot(){ //@--- this function run at start up plotView->setRenderHints(QPainter::Antialiasing); layout->addWidget(plotView, rowID, 0, 1, 4); - //------------ testing button + //------------ close button rowID ++; - QPushButton * bnUpdate = new QPushButton("Random", scope); - layout->addWidget(bnUpdate, rowID, 0); - connect(bnUpdate, &QPushButton::clicked, this, &MainWindow::UpdateScope); - -} + QPushButton * bnStop = new QPushButton("Stop", scope); + layout->addWidget(bnStop, rowID, 2); + connect(bnStop, &QPushButton::clicked, this, &MainWindow::StopScope); -void MainWindow::ProbeChange(QComboBox * cb[], const int size ){ - - QStandardItemModel * model[size] = {NULL}; - for( int i = 0; i < size; i++){ - model[i] = qobject_cast(cb[i]->model()); - } - - /// Enable all items - for( int i = 0; i < cb[0]->count(); i++) { - for( int j = 0; j < size; j ++ ) model[j]->item(i)->setEnabled(true); - } - - for( int i = 0; i < size; i++){ - int index = cb[i]->currentIndex(); - for( int j = 0; j < size; j++){ - if( i == j ) continue; - model[j]->item(index)->setEnabled(false); - } - } - -} - -void MainWindow::UpdateScope(){ - - if( scope->isVisible() == false) return; - - for( int i = 0 ; i < dataTrace->count(); i++){ - dataTrace->replace(i, i, QRandomGenerator::global()->bounded(10)); - } + QPushButton * bnClose = new QPushButton("Close", scope); + layout->addWidget(bnClose, rowID, 3); + connect(bnClose, &QPushButton::clicked, this, &MainWindow::StopScope); + connect(bnClose, &QPushButton::clicked, scope, &QMainWindow::close); } + //^###################################################################### Open digitizer setting panel void MainWindow::OpenDigitizersSettings(){ LogMsg("Open digitizers Settings Panel"); diff --git a/mainwindow.h b/mainwindow.h index 804b04e..762a26f 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -75,7 +75,7 @@ class UpdateTraceThread : public QThread { Q_OBJECT public: UpdateTraceThread(QObject * parent = 0) : QThread(parent){ - waitTime = 5; + waitTime = 2; stop = false; } void Stop() {this->stop = true;} @@ -114,6 +114,7 @@ private slots: void CloseDigitizers(); void OpenScope(); + void StopScope(); void SetUpPlot(); void UpdateScope(); diff --git a/script.C b/script.C index 3e72958..7c83ea9 100644 --- a/script.C +++ b/script.C @@ -4,6 +4,7 @@ #include "TH2.h" #include "TStyle.h" #include "TCanvas.h" +#include "TGraph.h" void script(){ @@ -34,6 +35,8 @@ void script(){ TH2F * h2 = new TH2F("h2", "h2", 1000, startTime, endTime, 1000, 0, reader->GetTotalNumBlock()); TH1F * hTdiff = new TH1F("hTdiff", "hTdiff", 400, 0, 200000); + TGraph * g1 = new TGraph(); + uint64_t tOld = startTime; for( int i = 0; i < reader->GetTotalNumBlock() ; i++){ @@ -59,16 +62,21 @@ void script(){ tOld = evt->timestamp; } + if( i == 0){ + for( int i = 0; i < evt->traceLenght; i++){ + g1->AddPoint(i*8, evt->analog_probes[0][i]); + } + } } gStyle->SetOptStat("neiou"); - TCanvas * canvas = new TCanvas("c1", "c1", 1800, 600); - canvas->Divide(3,1); + TCanvas * canvas = new TCanvas("c1", "c1", 1200, 1200); + canvas->Divide(2,2); canvas->cd(1); hid->Draw(); canvas->cd(2); h1->SetMinimum(0); h1->Draw(); canvas->cd(3); hTdiff->Draw(); - + canvas->cd(4); g1->Draw("APl"); //printf("reader traceLength : %lu \n", evt->traceLenght); /*