diff --git a/ClassData.h b/ClassData.h index d1d0b07..4cfa849 100644 --- a/ClassData.h +++ b/ClassData.h @@ -43,8 +43,8 @@ class Data{ unsigned short Energy[MaxNChannels][MaxNData]; /// 15 bit unsigned short Energy2[MaxNChannels][MaxNData]; /// 15 bit, in PSD, Energy = Qshort, Energy2 = Qlong - std::vector Waveform1[MaxNChannels][MaxNData]; - std::vector Waveform2[MaxNChannels][MaxNData]; + std::vector Waveform1[MaxNChannels][MaxNData]; + std::vector Waveform2[MaxNChannels][MaxNData]; std::vector DigiWaveform1[MaxNChannels][MaxNData]; std::vector DigiWaveform2[MaxNChannels][MaxNData]; @@ -85,8 +85,8 @@ class Data{ bool SaveWaveToMemory; ///for temperary - std::vector tempWaveform1; - std::vector tempWaveform2; + std::vector tempWaveform1; + std::vector tempWaveform2; std::vector tempDigiWaveform1; std::vector tempDigiWaveform2; @@ -337,6 +337,7 @@ inline void Data::DecodeBuffer(bool fastDecode, int verbose){ ///Calculate trigger rate and first and last Timestamp for(int ch = 0; ch < MaxNChannels; ch++){ + //TODO ====== when NumEventsDecoded is too small, the trigger rate is not reliable? if( NumEventsDecoded[ch] > 0 ) IsNotRollOverFakeAgg = true; unsigned long long dTime = Timestamp[ch][NumEvents[ch]-1] - Timestamp[ch][NumEvents[ch] - NumEventsDecoded[ch]]; double sec = dTime * ch2ns / 1e9; @@ -427,7 +428,7 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe } } nEvents = (aggSize - 2) / (nSample/2 + 2 + hasExtra2 ); - if( verbose >= 2 ) printf("-------------------nEvents : %d \n", nEvents); + if( verbose >= 2 ) printf("----------------- nEvents : %d, fast decode : %d\n", nEvents, fastDecode); }else{ if( verbose >= 2 ) printf("does not has format info. unable to read buffer.\n"); return 0; @@ -460,33 +461,49 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe bool isTrigger1 = (( word >> 31 ) & 0x1 ); bool dp1 = (( word >> 30 ) & 0x1 ); unsigned short wave1 = (( word >> 16) & 0x3FFF); + short trace1 = 0; + if( wave1 & 0x2000){ + trace1 = static_cast(~wave1 + 1 + 0x3FFF); + trace1 = - trace1; + }else{ + trace1 = static_cast(wave1); + } + ///The CAEN manual is wrong, the bit [31:16] is anaprobe 2 bool isTrigger0 = (( word >> 15 ) & 0x1 ); bool dp0 = (( word >> 14 ) & 0x1 ); unsigned short wave0 = ( word & 0x3FFF); + short trace0 = 0; + if( wave0 & 0x2000){ + trace0 = static_cast(~wave0 + 1 + 0x3FFF); + trace0 = - trace0; + }else{ + trace0 = static_cast(wave0); + } if( SaveWaveToMemory){ if( hasDualTrace ){ - tempWaveform1.push_back(wave1); - tempWaveform2.push_back(wave0); - tempDigiWaveform1.push_back(dp0); - }else{ - tempWaveform1.push_back(wave1); - tempWaveform1.push_back(wave0); - tempDigiWaveform1.push_back(dp0); + tempWaveform1.push_back(trace1); + tempWaveform2.push_back(trace0); tempDigiWaveform1.push_back(dp1); + tempDigiWaveform2.push_back(dp0); + }else{ + tempWaveform1.push_back(trace1); + tempWaveform1.push_back(trace0); + tempDigiWaveform1.push_back(dp1); + tempDigiWaveform1.push_back(dp0); } } if( isTrigger0 == 1 ) triggerAtSample = 2*wi ; if( isTrigger1 == 1 ) triggerAtSample = 2*wi + 1; - if( verbose >= 4 && ev == 0 ){ + if( verbose >= 4 ){ if( !hasDualTrace ){ - printf("%4d| %5d, %d, %d \n", 2*wi, wave0, dp0, isTrigger0); - printf("%4d| %5d, %d, %d \n", 2*wi+1, wave1, dp1, isTrigger1); + printf("%4d| %5d, %d, %d \n", 2*wi, trace0, dp0, isTrigger0); + printf("%4d| %5d, %d, %d \n", 2*wi+1, trace1, dp1, isTrigger1); }else{ - printf("%4d| %5d, %5d | %d, %d | %d %d\n", wi, wave0, wave1, dp0, dp1, isTrigger0, isTrigger1); + printf("%4d| %5d, %5d | %d, %d | %d %d\n", wi, trace0, trace1, dp0, dp1, isTrigger0, isTrigger1); } } } @@ -524,7 +541,7 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe printf("PileUp or RollOver : %d\n", pileUpOrRollOver); printf("PileUp : %d , extra : 0x%03x, energy : %d \n", pileUp, extra, energy); printf(" lost event : %d \n", ((extra >> 0) & 0x1) ); - printf(" roll-over : %d (fake event)\n", ((extra >> 1) & 0x1) ); + printf(" roll-over : %d (is fake event)\n", ((extra >> 1) & 0x1) ); printf(" fake-event : %d \n", ((extra >> 3) & 0x1) ); printf(" input sat. : %d \n", ((extra >> 4) & 0x1) ); printf(" lost trg : %d \n", ((extra >> 5) & 0x1) ); @@ -641,7 +658,7 @@ inline int Data::DecodePSDDualChannelBlock(unsigned int ChannelMask, bool fastDe } nEvents = (aggSize -2) / (nSample/2 + 2 + hasExtra ); - if( verbose >= 2 ) printf("----------------- nEvents : %d \n", nEvents); + if( verbose >= 2 ) printf("----------------- nEvents : %d, fast decode : %d\n", nEvents, fastDecode); ///========= Decode an event for( unsigned int ev = 0; ev < nEvents ; ev++){ @@ -687,7 +704,7 @@ inline int Data::DecodePSDDualChannelBlock(unsigned int ChannelMask, bool fastDe tempDigiWaveform2.push_back(dp2b); } - if( verbose >= 3 && ev == 0 ){ + if( verbose >= 3 ){ printf("%4d| %5d, %d, %d \n", 2*wi, wavea, dp1a, dp2a); printf("%4d| %5d, %d, %d \n", 2*wi+1, waveb, dp1b, dp2b); } diff --git a/CustomWidgets.h b/CustomWidgets.h index 35b59ca..3162368 100644 --- a/CustomWidgets.h +++ b/CustomWidgets.h @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -102,6 +103,11 @@ public: setMouseTracking(true); } + void SetHRange(int min, int max) { + this->hRangeMin = min; + this->hRangeMax = max; + } + protected: bool viewportEvent(QEvent *event) override{ if (event->type() == QEvent::TouchBegin) { @@ -142,13 +148,18 @@ protected: case Qt::Key_Right: chart()->scroll(10, 0); break; case Qt::Key_Up: chart()->scroll(0, 10); break; case Qt::Key_Down: chart()->scroll(0, -10); break; - case Qt::Key_R : chart()->axes(Qt::Vertical).first()->setRange(-16384, 65536); break; + case Qt::Key_R : + chart()->axes(Qt::Vertical).first()->setRange(-(0x1FFF), 0x1FFF); + //chart()->axes(Qt::Horizontal).first()->setRange(hRangeMin, hRangeMax); + break; default: QGraphicsView::keyPressEvent(event); break; } } private: bool m_isTouching; + int hRangeMin; + int hRangeMax; QLabel * m_coordinateLabel; }; diff --git a/Scope.cpp b/Scope.cpp index 8f0654f..3fadc0d 100644 --- a/Scope.cpp +++ b/Scope.cpp @@ -23,7 +23,7 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh for( int i = 0; i < MaxNumberOfTrace; i++) { dataTrace[i] = new QLineSeries(); dataTrace[i]->setName("Trace " + QString::number(i)); - for(int j = 0; j < 100; j ++) dataTrace[i]->append(40*j, QRandomGenerator::global()->bounded(8000) + 8000); + for(int j = 0; j < 100; j ++) dataTrace[i]->append(40*j, QRandomGenerator::global()->bounded(8000)); plot->addSeries(dataTrace[i]); } @@ -39,8 +39,8 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh QValueAxis * yaxis = qobject_cast (plot->axes(Qt::Vertical).first()); QValueAxis * xaxis = qobject_cast (plot->axes(Qt::Horizontal).first()); yaxis->setTickCount(6); - yaxis->setTickInterval(16384); - yaxis->setRange(-16384, 65536); + yaxis->setTickInterval((0x1FFF)/4); + yaxis->setRange(-(0x1FFF), 0x1FFF); yaxis->setLabelFormat("%.0f"); xaxis->setRange(0, 5000); @@ -105,7 +105,7 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh } //================ Plot view rowID ++; - TraceView * plotView = new TraceView(plot); + plotView = new TraceView(plot, this); plotView->setRenderHints(QPainter::Antialiasing); layout->addWidget(plotView, rowID, 0, 1, 6); @@ -219,7 +219,7 @@ void Scope::StopScope(){ void Scope::UpdateScope(){ - printf("---- %s \n", __func__); + //printf("---- %s \n", __func__); if( !digi ) return; @@ -232,12 +232,12 @@ void Scope::UpdateScope(){ digiMTX[ID].lock(); leTriggerRate->setText(QString::number(data->TriggerRate[ch])); - unsigned short index = data->NumEvents[ch]; + unsigned short index = data->NumEvents[ch] - 1; unsigned short traceLength = data->Waveform1[ch][index].size(); if( data->TriggerRate[ch] > 0 ){ - printf("--- %d | %d \n", index, traceLength ); + //printf("--- %d | %d \n", index, traceLength ); QVector points; for( int i = 0; i < (int) (data->Waveform1[ch][index]).size() ; i++ ) points.append(QPointF(ch2ns * i, (data->Waveform1[ch][index])[i])); @@ -259,6 +259,7 @@ void Scope::UpdateScope(){ digiMTX[ID].unlock(); plot->axes(Qt::Horizontal).first()->setRange(0, ch2ns * traceLength); + //plotView->SetHRange(0, ch2ns * traceLength); } diff --git a/Scope.h b/Scope.h index c70effe..ee20cb5 100644 --- a/Scope.h +++ b/Scope.h @@ -59,6 +59,7 @@ private: bool enableSignalSlot; Trace * plot; + TraceView * plotView; QLineSeries * dataTrace[MaxNumberOfTrace]; // 2 analog, 2 digi RComboBox * cbScopeDigi; diff --git a/macro.h b/macro.h index d7c36c6..438bacf 100644 --- a/macro.h +++ b/macro.h @@ -1,8 +1,8 @@ #ifndef MACRO_H #define MACRO_H -#define MaxNPorts 4 -#define MaxNBoards 6 +#define MaxNPorts 1 +#define MaxNBoards 1 #define MaxNChannels 16 #define MaxRecordLength 0x3fff * 8 #define MaxSaveFileSize 1024 * 1024 * 1024 * 2 diff --git a/test.cpp b/test.cpp index 995ae61..16dbdf1 100644 --- a/test.cpp +++ b/test.cpp @@ -41,15 +41,21 @@ int main(int argc, char* argv[]){ dig[0]->StartACQ(); - for( int i = 0; i < 5; i ++ ){ - sleep(1); + for( int i = 0; i < 50; i ++ ){ + usleep(100*1000); dig[0]->ReadData(); - data->DecodeBuffer(false, true); + data->DecodeBuffer(false, 5); + data->PrintStat(); + + int index = data->NumEventsDecoded[0]; + printf("-------------- %ld \n", data->Waveform1[0][index].size()); + } dig[0]->StopACQ(); - data->PrintAllData(); + + //data->PrintAllData();