cannot get trace, need to review the Digitizer Class using test.cpp

This commit is contained in:
splitPoleDAQ 2023-04-19 18:08:20 -04:00
parent 0000be1d44
commit 4a80fcc10d
9 changed files with 143 additions and 46 deletions

2
.gitignore vendored
View File

@ -8,6 +8,8 @@ programSettings.txt
data data
*.txt
*~ *~
*.autosave *.autosave
moc_* moc_*

View File

@ -34,7 +34,8 @@ class Data{
unsigned short NumEventsDecoded[MaxNChannels]; /// reset at every decode unsigned short NumEventsDecoded[MaxNChannels]; /// reset at every decode
unsigned short NumNonPileUpDecoded[MaxNChannels]; /// reset at every decode unsigned short NumNonPileUpDecoded[MaxNChannels]; /// reset at every decode
/// store data for event building /// store data for event building and deduce the trigger rate.
//TODO... make it a circular memory
bool IsNotRollOverFakeAgg; bool IsNotRollOverFakeAgg;
unsigned short NumEvents[MaxNChannels]; /// max 65535, reset only clear Data unsigned short NumEvents[MaxNChannels]; /// max 65535, reset only clear Data
unsigned long long Timestamp[MaxNChannels][MaxNData]; /// 47 bit unsigned long long Timestamp[MaxNChannels][MaxNData]; /// 47 bit
@ -68,7 +69,7 @@ class Data{
void PrintStat() const; void PrintStat() const;
void PrintData() const; void PrintAllData() const;
//^================= Saving data //^================= Saving data
void OpenSaveFile(std::string fileNamePrefix); void OpenSaveFile(std::string fileNamePrefix);
@ -178,6 +179,7 @@ inline void Data::ClearData(){
inline void Data::ClearBuffer(){ inline void Data::ClearBuffer(){
delete buffer; delete buffer;
buffer = nullptr;
AllocatedSize = 0; AllocatedSize = 0;
nByte = 0; nByte = 0;
} }
@ -245,7 +247,7 @@ inline void Data::PrintBuffer() const{
} }
} }
inline void Data::PrintData() const{ inline void Data::PrintAllData() const{
printf("============================= Print Data\n"); printf("============================= Print Data\n");
for( int ch = 0; ch < MaxNChannels ; ch++){ for( int ch = 0; ch < MaxNChannels ; ch++){
if( NumEvents[ch] == 0 ) continue; if( NumEvents[ch] == 0 ) continue;
@ -280,12 +282,8 @@ inline void Data::DecodeBuffer(bool fastDecode, int verbose){
return; return;
} }
if( nByte == 0 ) { if( nByte == 0 ) return;
return;
}
nw = 0; nw = 0;
ClearTriggerRate(); ClearTriggerRate();
do{ do{
@ -722,7 +720,6 @@ inline int Data::DecodePSDDualChannelBlock(unsigned int ChannelMask, bool fastDe
NumEvents[channel] ++; NumEvents[channel] ++;
NumEventsDecoded[channel] ++; NumEventsDecoded[channel] ++;
TotNumEvents[channel] ++; TotNumEvents[channel] ++;
} }
if( NumEvents[channel] >= MaxNData ) ClearData(); if( NumEvents[channel] >= MaxNData ) ClearData();

View File

@ -288,7 +288,7 @@ int Digitizer::ProgramPHABoard(){
printf("======== program board PHA\n"); printf("======== program board PHA\n");
ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::RecordLength_G + 0x7000, 62); ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::RecordLength_G + 0x7000, 62);
ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::BoardConfiguration, 0x0F8915); /// has Extra2 ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::BoardConfiguration, 0x0F8915); /// has Extra2, dual trace, input and trap-baseline
///ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::BoardConfiguration, 0x0D8115); /// diable Extra2 ///ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::BoardConfiguration, 0x0D8115); /// diable Extra2
//TODO change to write register //TODO change to write register
@ -369,6 +369,7 @@ void Digitizer::StopACQ(){
printf("\n\e[1m\e[33m====== Acquisition STOPPED for Board %d\e[0m\n", boardID); printf("\n\e[1m\e[33m====== Acquisition STOPPED for Board %d\e[0m\n", boardID);
AcqRun = false; AcqRun = false;
data->ClearTriggerRate(); data->ClearTriggerRate();
data->ClearBuffer();
} }
unsigned int Digitizer::CalByteForBuffer(){ unsigned int Digitizer::CalByteForBuffer(){
@ -906,6 +907,7 @@ void Digitizer::SetPreTriggerDuration(unsigned int ns, int ch)
void Digitizer::SetDCOffset(float offsetPrecentage, int ch) { WriteRegister( Register::DPP::ChannelDCOffset, uint( 0xFFFF * (1.0-offsetPrecentage)), ch ); ErrorMsg(__func__);} void Digitizer::SetDCOffset(float offsetPrecentage, int ch) { WriteRegister( Register::DPP::ChannelDCOffset, uint( 0xFFFF * (1.0-offsetPrecentage)), ch ); ErrorMsg(__func__);}
void Digitizer::SetVetoWidth(uint32_t bit, int ch) { WriteRegister( Register::DPP::VetoWidth, bit, ch); ErrorMsg(__func__);} void Digitizer::SetVetoWidth(uint32_t bit, int ch) { WriteRegister( Register::DPP::VetoWidth, bit, ch); ErrorMsg(__func__);}
void Digitizer::SetTriggerPolarity(bool RiseingIsZero, int ch ){ void Digitizer::SetTriggerPolarity(bool RiseingIsZero, int ch ){
if( !isConnected ) return; if( !isConnected ) return;
if ( DPPType >= 128 ) return; /// do thing for DPP firmware if ( DPPType >= 128 ) return; /// do thing for DPP firmware
@ -926,7 +928,7 @@ void Digitizer::SetDPPAlgorithmControl(uint32_t bit, int ch){
if( ret != 0 ) ErrorMsg(__func__); if( ret != 0 ) ErrorMsg(__func__);
} }
unsigned int Digitizer::ReadBits(Reg address, unsigned int bitLength, unsigned int bitSmallestPos, int ch ){ unsigned int Digitizer::ReadBits(Register::Reg address, unsigned int bitLength, unsigned int bitSmallestPos, int ch ){
int tempCh = ch; int tempCh = ch;
if (ch < 0 && address < 0x8000 ) tempCh = 0; /// take ch-0 if (ch < 0 && address < 0x8000 ) tempCh = 0; /// take ch-0
uint32_t bit = ReadRegister(address, tempCh); uint32_t bit = ReadRegister(address, tempCh);
@ -934,7 +936,7 @@ unsigned int Digitizer::ReadBits(Reg address, unsigned int bitLength, unsigned i
return bit; return bit;
} }
void Digitizer::SetBits(Reg address, unsigned int bitValue, unsigned int bitLength, unsigned int bitSmallestPos, int ch){ void Digitizer::SetBits(Register::Reg address, unsigned int bitValue, unsigned int bitLength, unsigned int bitSmallestPos, int ch){
///printf("address : 0x%X, value : 0x%X, len : %d, pos : %d, ch : %d \n", address, bitValue, bitLength, bitSmallestPos, ch); ///printf("address : 0x%X, value : 0x%X, len : %d, pos : %d, ch : %d \n", address, bitValue, bitLength, bitSmallestPos, ch);
uint32_t bit ; uint32_t bit ;
uint32_t bitmask = (uint(pow(2, bitLength)-1) << bitSmallestPos); uint32_t bitmask = (uint(pow(2, bitLength)-1) << bitSmallestPos);

View File

@ -76,7 +76,7 @@ class Digitizer{
void PrintBoard() ; void PrintBoard() ;
virtual int ProgramBoard() ; /// program a generic board, no program channel virtual int ProgramBoard() ; /// program a generic board, no program channel
int ProgramPHABoard() ; /// program a default PHA board int ProgramPHABoard() ; /// program a default PHA board with dual trace
//^================ ACQ control //^================ ACQ control
void StopACQ(); void StopACQ();
@ -138,6 +138,12 @@ class Digitizer{
void SaveSettingToFile (Register::Reg registerAddress, unsigned int value, unsigned short ch = 0); /// also save to memory void SaveSettingToFile (Register::Reg registerAddress, unsigned int value, unsigned short ch = 0); /// also save to memory
unsigned int ReadSettingFromFile (Register::Reg registerAddress, unsigned short ch = 0); /// read from setting binary unsigned int ReadSettingFromFile (Register::Reg registerAddress, unsigned short ch = 0); /// read from setting binary
//============ old methods, that only manipulate digitizer register, not setting in memory
// void SetTriggerPolarity(bool RiseingIsZero, int ch );
// void SetDPPAlgorithmControl(uint32_t bit, int ch);
// unsigned int ReadBits(Register::Reg address, unsigned int bitLength, unsigned int bitSmallestPos, int ch );
// void SetBits(Register::Reg address, unsigned int bitValue, unsigned int bitLength, unsigned int bitSmallestPos, int ch);
}; };

View File

@ -84,7 +84,7 @@ public:
} }
void Stop() { this->stop = true;} void Stop() { this->stop = true;}
void SetWaitTimeinSec(float sec) {waitTime = sec * 10 ;} void SetWaitTimeinSec(float sec) {waitTime = sec * 10 ;}
unsigned int GetWaitTimeinSec() const {return waitTime/10;} float GetWaitTimeinSec() const {return waitTime/10.;}
void run(){ void run(){
unsigned int count = 0; unsigned int count = 0;
stop = false; stop = false;
@ -92,12 +92,12 @@ public:
usleep(100000); usleep(100000);
count ++; count ++;
if( count % waitTime == 0){ if( count % waitTime == 0){
emit updataScalar(); emit timeUp();
} }
}while(!stop); }while(!stop);
} }
signals: signals:
void updataScalar(); void timeUp();
private: private:
bool stop; bool stop;
unsigned int waitTime; unsigned int waitTime;

View File

@ -183,7 +183,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
lbScalarACQStatus = nullptr; lbScalarACQStatus = nullptr;
scalarThread = new TimingThread(); scalarThread = new TimingThread();
connect(scalarThread, &TimingThread::updataScalar, this, &MainWindow::UpdateScalar); connect(scalarThread, &TimingThread::timeUp, this, &MainWindow::UpdateScalar);
} }
@ -370,10 +370,15 @@ void MainWindow::OpenDigitizers(){
readDataThread = new ReadDataThread * [nDigi]; readDataThread = new ReadDataThread * [nDigi];
for( unsigned int i = 0; i < nDigi; i++){ for( unsigned int i = 0; i < nDigi; i++){
digi[i] = new Digitizer(portList[i].first, portList[i].second); digi[i] = new Digitizer(portList[i].first, portList[i].second);
//TODO === load settings
digi[i]->Reset();
digi[i]->ProgramPHABoard();
readDataThread[i] = new ReadDataThread(digi[i], i); readDataThread[i] = new ReadDataThread(digi[i], i);
connect(readDataThread[i], &ReadDataThread::sendMsg, this, &MainWindow::LogMsg); connect(readDataThread[i], &ReadDataThread::sendMsg, this, &MainWindow::LogMsg);
} }
digi[0]->SaveAllSettingsAsText("setting.txt");
LogMsg(QString("Done. Opened %1 digitizer(s).").arg(nDigi)); LogMsg(QString("Done. Opened %1 digitizer(s).").arg(nDigi));
WaitForDigitizersOpen(false); WaitForDigitizersOpen(false);
@ -571,6 +576,9 @@ void MainWindow::StartACQ(){
} }
lbScalarACQStatus->setText("<font style=\"color: green;\"><b>ACQ On</b></font>"); lbScalarACQStatus->setText("<font style=\"color: green;\"><b>ACQ On</b></font>");
bnStartACQ->setEnabled(false);
bnStopACQ->setEnabled(true);
} }
void MainWindow::StopACQ(){ void MainWindow::StopACQ(){
@ -597,6 +605,9 @@ void MainWindow::StopACQ(){
} }
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);
bnStopACQ->setEnabled(false);
} }
void MainWindow::AutoRun(){ void MainWindow::AutoRun(){
@ -707,6 +718,7 @@ void MainWindow::OpenScope(){
scope->show(); scope->show();
}else{ }else{
scope->show(); scope->show();
scope->activateWindow();
} }
} }

110
Scope.cpp
View File

@ -50,8 +50,7 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh
updateTraceThread = new TimingThread(); updateTraceThread = new TimingThread();
updateTraceThread->SetWaitTimeinSec(0.5); updateTraceThread->SetWaitTimeinSec(0.5);
connect(updateTraceThread, &TimingThread::timeUp, this, &Scope::UpdateScope);
//connect(updateTraceThread, &UpdateTraceThread::updateTrace, this, &Scope::UpdateScope);
//*================================== UI //*================================== UI
int rowID = -1; int rowID = -1;
@ -86,11 +85,9 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh
for( int i = 0; i < digi[ID]->GetNChannels(); i++) cbScopeCh->addItem("Ch-" + QString::number(i)); for( int i = 0; i < digi[ID]->GetNChannels(); i++) cbScopeCh->addItem("Ch-" + QString::number(i));
//---Setup SettingGroup //---Setup SettingGroup
if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) { CleanUpSettingsGroupBox();
SetUpPHAPanel(); if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) SetUpPHAPanel();
}else{ if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) SetUpPSDPanel();
CleanUpSettingsGroupBox();
}
}); });
@ -130,7 +127,6 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh
rowID ++; rowID ++;
bnScopeStart = new QPushButton("Start", this); bnScopeStart = new QPushButton("Start", this);
layout->addWidget(bnScopeStart, rowID, 0); layout->addWidget(bnScopeStart, rowID, 0);
bnScopeStart->setEnabled(false);
connect(bnScopeStart, &QPushButton::clicked, this, [=](){this->StartScope();}); connect(bnScopeStart, &QPushButton::clicked, this, [=](){this->StartScope();});
bnScopeStop = new QPushButton("Stop", this); bnScopeStop = new QPushButton("Stop", this);
@ -150,8 +146,6 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh
layout->addWidget(bnClose, rowID, 5); layout->addWidget(bnClose, rowID, 5);
connect(bnClose, &QPushButton::clicked, this, &Scope::close); connect(bnClose, &QPushButton::clicked, this, &Scope::close);
layout->setColumnStretch(0, 1); layout->setColumnStretch(0, 1);
layout->setColumnStretch(1, 1); layout->setColumnStretch(1, 1);
layout->setColumnStretch(2, 1); layout->setColumnStretch(2, 1);
@ -161,6 +155,9 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh
enableSignalSlot = true; enableSignalSlot = true;
bnScopeStart->setEnabled(true);
bnScopeStop->setEnabled(false);
} }
@ -177,11 +174,91 @@ Scope::~Scope(){
//*======================================================= //*=======================================================
//*======================================================= //*=======================================================
void Scope::StartScope(){ void Scope::StartScope(){
if( !digi ) return;
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){
digi[iDigi]->GetData()->SetSaveWaveToMemory(true);
digi[iDigi]->StartACQ();
readDataThread[iDigi]->SetScopeMode(true);
readDataThread[iDigi]->SetSaveData(false);
readDataThread[iDigi]->start();
}
updateTraceThread->start();
bnScopeStart->setEnabled(false);
bnScopeStop->setEnabled(true);
} }
void Scope::StopScope(){ void Scope::StopScope(){
if( !digi ) return;
updateTraceThread->Stop();
updateTraceThread->quit();
updateTraceThread->exit();
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){
digi[iDigi]->StopACQ();
readDataThread[iDigi]->quit();
readDataThread[iDigi]->wait();
}
bnScopeStart->setEnabled(true);
bnScopeStop->setEnabled(false);
}
void Scope::UpdateScope(){
printf("---- %s \n", __func__);
if( !digi ) return;
int ID = cbScopeDigi->currentIndex();
int ch = cbScopeCh->currentIndex();
int ch2ns = digi[ID]->GetCh2ns();
Data * data = digi[ID]->GetData();
digiMTX[ID].lock();
leTriggerRate->setText(QString::number(data->TriggerRate[ch]));
unsigned short index = data->NumEvents[ch];
unsigned short traceLength = data->Waveform1[ch][index].size();
if( data->TriggerRate[ch] > 0 ){
printf("--- %d | %d \n", index, traceLength );
QVector<QPointF> points;
for( int i = 0; i < (int) (data->Waveform1[ch][index]).size() ; i++ ) points.append(QPointF(ch2ns * i, (data->Waveform1[ch][index])[i]));
dataTrace[0]->replace(points);
points.clear();
for( int i = 0; i < (int) (data->Waveform2[ch][index]).size() ; i++ ) points.append(QPointF(ch2ns * i, (data->Waveform2[ch][index])[i]));
dataTrace[1]->replace(points);
points.clear();
for( int i = 0; i < (int) (data->DigiWaveform1[ch][index]).size() ; i++ ) points.append(QPointF(ch2ns * i, (data->DigiWaveform1[ch][index])[i] * 1000));
dataTrace[2]->replace(points);
points.clear();
for( int i = 0; i < (int) (data->DigiWaveform2[ch][index]).size() ; i++ ) points.append(QPointF(ch2ns * i, (data->DigiWaveform2[ch][index])[i] * 1000));
dataTrace[3]->replace(points);
}
digiMTX[ID].unlock();
plot->axes(Qt::Horizontal).first()->setRange(0, ch2ns * traceLength);
} }
@ -243,8 +320,6 @@ void Scope::SetUpSpinBox(RSpinBox * &sb, QString str, int row, int col, const Re
void Scope::CleanUpSettingsGroupBox(){ void Scope::CleanUpSettingsGroupBox(){
printf("-- %s\n", __func__);
QList<QLabel *> labelChildren1 = settingGroup->findChildren<QLabel *>(); QList<QLabel *> labelChildren1 = settingGroup->findChildren<QLabel *>();
for( int i = 0; i < labelChildren1.size(); i++) delete labelChildren1[i]; for( int i = 0; i < labelChildren1.size(); i++) delete labelChildren1[i];
@ -255,12 +330,9 @@ void Scope::CleanUpSettingsGroupBox(){
for( int i = 0; i < labelChildren3.size(); i++) delete labelChildren3[i]; for( int i = 0; i < labelChildren3.size(); i++) delete labelChildren3[i];
} }
void Scope::SetUpPHAPanel(){ void Scope::SetUpPHAPanel(){
CleanUpSettingsGroupBox();
printf("-- %s\n", __func__);
SetUpSpinBox(sbReordLength, "Record Length [ns]", 0, 0, Register::DPP::RecordLength_G); SetUpSpinBox(sbReordLength, "Record Length [ns]", 0, 0, Register::DPP::RecordLength_G);
SetUpSpinBox(sbPreTrigger, "Pre Trigger [ns]", 0, 2, Register::DPP::PreTrigger); SetUpSpinBox(sbPreTrigger, "Pre Trigger [ns]", 0, 2, Register::DPP::PreTrigger);
@ -275,6 +347,10 @@ void Scope::SetUpPHAPanel(){
SetUpSpinBox(sbDecayTime, "Decay Time [ns]", 2, 4, Register::DPP::PHA::DecayTime); SetUpSpinBox(sbDecayTime, "Decay Time [ns]", 2, 4, Register::DPP::PHA::DecayTime);
SetUpSpinBox(sbPeakingTime, "Peaking Time [ns]", 2, 6, Register::DPP::PHA::PeakingTime); SetUpSpinBox(sbPeakingTime, "Peaking Time [ns]", 2, 6, Register::DPP::PHA::PeakingTime);
} }
void Scope::SetUpPSDPanel(){
SetUpSpinBox(sbReordLength, "Record Length [ns]", 0, 0, Register::DPP::RecordLength_G);
SetUpSpinBox(sbPreTrigger, "Pre Trigger [ns]", 0, 2, Register::DPP::PreTrigger);
}

13
Scope.h
View File

@ -31,21 +31,22 @@ public:
Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataThread, QMainWindow * parent = nullptr); Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataThread, QMainWindow * parent = nullptr);
~Scope(); ~Scope();
public slots:
private slots: private slots:
void StartScope(); void StartScope();
void StopScope(); void StopScope();
void UpdateScope();
signals:
private:
void SetUpComboBox(RComboBox * &cb, QString str, int row, int col, const Register::Reg para); void SetUpComboBox(RComboBox * &cb, QString str, int row, int col, const Register::Reg para);
void SetUpSpinBox(RSpinBox * &sb, QString str, int row, int col, const Register::Reg para); void SetUpSpinBox(RSpinBox * &sb, QString str, int row, int col, const Register::Reg para);
void CleanUpSettingsGroupBox(); void CleanUpSettingsGroupBox();
void SetUpPHAPanel(); void SetUpPHAPanel();
void SetUpPSDPanel();
signals:
private:
Digitizer ** digi; Digitizer ** digi;
unsigned short nDigi; unsigned short nDigi;

View File

@ -38,17 +38,18 @@ int main(int argc, char* argv[]){
const float ch2ns = dig[0]->GetCh2ns(); const float ch2ns = dig[0]->GetCh2ns();
Data * data = dig[0]->GetData(); Data * data = dig[0]->GetData();
data->Allocate80MBMemory();
dig[0]->StartACQ(); dig[0]->StartACQ();
sleep(3); for( int i = 0; i < 5; i ++ ){
sleep(1);
dig[0]->ReadData(); dig[0]->ReadData();
data->DecodeBuffer(false, true);
data->SaveBuffer("test"); }
dig[0]->StopACQ();
data->PrintAllData();