snapshot, MaxNData = 100, MaxNEvent = 30, bug in OnlineEventBuilder

This commit is contained in:
splitPoleDAQ 2023-06-09 13:51:02 -04:00
parent 31a19f41ec
commit d9034fd8b1
10 changed files with 293 additions and 90 deletions

View File

@ -35,6 +35,7 @@ Analyzer::~Analyzer(){
} }
void Analyzer::StartThread(){ void Analyzer::StartThread(){
for( unsigned int i = 0; i < nDigi; i++) oeb[i]->ClearEvents();
buildTimerThread->start(); buildTimerThread->start();
} }
@ -56,17 +57,16 @@ void Analyzer::SetUpCanvas(){
h1 = new Histogram1D("testing", "x", 400, 0, 4000, this); h1 = new Histogram1D("testing", "x", 400, 0, 4000, this);
layout->addWidget(h1, 0, 1); layout->addWidget(h1, 0, 1);
std::random_device rd; // std::random_device rd;
std::mt19937 gen(rd()); // std::mt19937 gen(rd());
std::normal_distribution<double> distribution(2000.0, 1000); // std::normal_distribution<double> distribution(2000.0, 1000);
for( int i = 0; i < 1000 ; i++ ){ // for( int i = 0; i < 1000 ; i++ ){
double x = distribution(gen); // double x = distribution(gen);
double y = distribution(gen); // double y = distribution(gen);
h2->Fill(x, y); // h2->Fill(x, y);
h1->Fill(x); // h1->Fill(x);
} // }
// h1->UpdatePlot();
h1->UpdatePlot();
} }
@ -74,7 +74,7 @@ void Analyzer::UpdateHistograms(){
//Set with digitizer to be event build //Set with digitizer to be event build
digiMTX[0].lock(); digiMTX[0].lock();
oeb[0]->BuildEvents(100, false); oeb[0]->BuildEvents(100, true);
digiMTX[0].unlock(); digiMTX[0].unlock();
//============ Get events, and do analysis //============ Get events, and do analysis
@ -92,15 +92,18 @@ void Analyzer::UpdateHistograms(){
std::vector<dataPoint> event = oeb[0]->events[i]; std::vector<dataPoint> event = oeb[0]->events[i];
for( int k = 0; k < (int) event.size(); k++ ){ for( int k = 0; k < (int) event.size(); k++ ){
if( event[k].ch == 3 ) e1 = event[k].energy; if( event[k].ch == 9 ) e1 = event[k].energy;
if( event[k].ch == 4 ) e2 = event[k].energy; if( event[k].ch == 10 ) e2 = event[k].energy;
} }
h2->Fill(e1, e2); h2->Fill(e1, e2);
h1->Fill(e1);
//h1->Fill(e1);
} }
h2->UpdatePlot(); h2->UpdatePlot();
h1->UpdatePlot();
h2->PrintCutEntry();
} }

View File

@ -14,7 +14,7 @@
#include "CAENDigitizerType.h" #include "CAENDigitizerType.h"
#include "macro.h" #include "macro.h"
#define MaxNData 10000 /// store 10k events per channels #define MaxNData 50 /// store 10k events per channels
class Data{ class Data{
@ -37,8 +37,10 @@ class Data{
/// store data for event building and deduce the trigger rate. /// store data for event building and deduce the trigger rate.
//it is a circular memory //it is a circular memory
bool IsNotRollOverFakeAgg; bool IsNotRollOverFakeAgg;
int LoopIndex[MaxNChannels]; /// number of loop in the circular memory int LoopIndex[MaxNChannels]; /// number of loop in the circular memory
int DataIndex[MaxNChannels]; int DataIndex[MaxNChannels];
unsigned long long Timestamp[MaxNChannels][MaxNData]; /// 47 bit unsigned long long Timestamp[MaxNChannels][MaxNData]; /// 47 bit
unsigned short fineTime[MaxNChannels][MaxNData]; /// 10 bits, in unit of ch2ns / 1000 = ps unsigned short fineTime[MaxNChannels][MaxNData]; /// 10 bits, in unit of ch2ns / 1000 = ps
unsigned short Energy[MaxNChannels][MaxNData]; /// 15 bit unsigned short Energy[MaxNChannels][MaxNData]; /// 15 bit
@ -68,7 +70,7 @@ class Data{
void PrintStat() const; void PrintStat() const;
void PrintAllData() const; void PrintAllData(bool tableMode = true) const;
//^================= Saving data //^================= Saving data
bool OpenSaveFile(std::string fileNamePrefix); // return false when fail bool OpenSaveFile(std::string fileNamePrefix); // return false when fail
@ -84,6 +86,7 @@ class Data{
unsigned int nw; unsigned int nw;
//bool SaveWaveToMemory; //bool SaveWaveToMemory;
///for temperary ///for temperary
std::vector<short> tempWaveform1; std::vector<short> tempWaveform1;
std::vector<short> tempWaveform2; std::vector<short> tempWaveform2;
@ -225,6 +228,8 @@ inline void Data::SaveData(){
return; return;
} }
if( outFile == nullptr ) return;
if( outFileSize > (unsigned int) MaxSaveFileSize){ if( outFileSize > (unsigned int) MaxSaveFileSize){
FinishedOutFilesSize += ftell(outFile); FinishedOutFilesSize += ftell(outFile);
CloseSaveFile(); CloseSaveFile();
@ -263,14 +268,44 @@ inline void Data::PrintStat() const{
printf("---+--------+-----------+-----------+----------\n"); printf("---+--------+-----------+-----------+----------\n");
} }
inline void Data::PrintAllData() const{ inline void Data::PrintAllData(bool tableMode) const{
printf("============================= Print Data\n"); printf("============================= Print Data\n");
for( int ch = 0; ch < MaxNChannels ; ch++){
if( DataIndex[ch] < 0 ) continue; if( tableMode ){
printf("------------ ch : %d, DataIndex : %d, loop : %d\n", ch, DataIndex[ch], LoopIndex[ch]); int entry = 0;
for( int ev = 0; ev <= (LoopIndex[ch] > 0 ? MaxNData : DataIndex[ch]) ; ev++){
if( DPPType == V1730_DPP_PHA_CODE ) printf("%4d, %5u, %15llu, %5u \n", ev, Energy[ch][ev], Timestamp[ch][ev], fineTime[ch][ev]); int MaxEntry = 0;
if( DPPType == V1730_DPP_PSD_CODE ) printf("%4d, %5u, %5u, %15llu, %5u \n", ev, Energy[ch][ev], Energy2[ch][ev], Timestamp[ch][ev], fineTime[ch][ev]); printf("%4s|", "");
for( int ch = 0; ch < MaxNChannels; ch++){
if( LoopIndex[ch] > 0 ) {
MaxEntry = MaxNData-1;
}else{
if( DataIndex[ch] > MaxEntry ) MaxEntry = DataIndex[ch];
}
if( DataIndex[ch] < 0 ) continue;
printf(" %5s-%02d,%-9d |", "ch", ch, DataIndex[ch]);
}
printf("\n");
do{
printf("%4d|", entry );
for( int ch = 0; ch < MaxNChannels; ch++){
if( DataIndex[ch] < 0 ) continue;
printf(" %5d,%12lld |", Energy[ch][entry], Timestamp[ch][entry]);
}
printf("\n");
entry ++;
}while(entry <= MaxEntry);
}else{
for( int ch = 0; ch < MaxNChannels ; ch++){
if( DataIndex[ch] < 0 ) continue;
printf("------------ ch : %d, DataIndex : %d, loop : %d\n", ch, DataIndex[ch], LoopIndex[ch]);
for( int ev = 0; ev <= (LoopIndex[ch] > 0 ? MaxNData : DataIndex[ch]) ; ev++){
if( DPPType == V1730_DPP_PHA_CODE ) printf("%4d, %5u, %15llu, %5u \n", ev, Energy[ch][ev], Timestamp[ch][ev], fineTime[ch][ev]);
if( DPPType == V1730_DPP_PSD_CODE ) printf("%4d, %5u, %5u, %15llu, %5u \n", ev, Energy[ch][ev], Energy2[ch][ev], Timestamp[ch][ev], fineTime[ch][ev]);
}
} }
} }
} }
@ -616,7 +651,7 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe
if( rollOver == 0 ) { // non-time roll over fake event if( rollOver == 0 ) { // non-time roll over fake event
DataIndex[channel] ++; DataIndex[channel] ++;
if( DataIndex[channel] > MaxNData ) { if( DataIndex[channel] >= MaxNData ) {
LoopIndex[channel] ++; LoopIndex[channel] ++;
DataIndex[channel] = 0; DataIndex[channel] = 0;
} }
@ -803,7 +838,7 @@ inline int Data::DecodePSDDualChannelBlock(unsigned int ChannelMask, bool fastDe
if( isEnergyCorrect == 0 ) { if( isEnergyCorrect == 0 ) {
DataIndex[channel] ++; DataIndex[channel] ++;
if( DataIndex[channel] > MaxNData ) { if( DataIndex[channel] >= MaxNData ) {
LoopIndex[channel] ++; LoopIndex[channel] ++;
DataIndex[channel] = 0; DataIndex[channel] = 0;
} }

View File

@ -183,7 +183,6 @@ int main(int argc, char **argv) {
Data * data = new Data(); Data * data = new Data();
data->DPPType = typeCat[0][0]; data->DPPType = typeCat[0][0];
data->boardSN = idCat[0]; data->boardSN = idCat[0];
data->SetSaveWaveToMemory(true);
///============= Main Loop ///============= Main Loop
haha = fopen(inFileName[0], "r"); haha = fopen(inFileName[0], "r");

View File

@ -766,6 +766,8 @@ void MainWindow::UpdateScalar(){
if( scalar == nullptr ) return; if( scalar == nullptr ) return;
//if( !scalar->isVisible() ) return; //if( !scalar->isVisible() ) return;
digi[0]->GetData()->PrintAllData();
lbLastUpdateTime->setText("Last update: " + QDateTime::currentDateTime().toString("MM.dd hh:mm:ss")); lbLastUpdateTime->setText("Last update: " + QDateTime::currentDateTime().toString("MM.dd hh:mm:ss"));
//printf("----------------------\n"); //printf("----------------------\n");
@ -826,6 +828,8 @@ void MainWindow::StartACQ(){
readDataThread[i]->SetSaveData(chkSaveData->isChecked()); readDataThread[i]->SetSaveData(chkSaveData->isChecked());
LogMsg("Digi-" + QString::number(digi[i]->GetSerialNumber()) + " is starting ACQ." ); LogMsg("Digi-" + QString::number(digi[i]->GetSerialNumber()) + " is starting ACQ." );
digi[i]->WriteRegister(DPP::SoftwareClear_W, 1); digi[i]->WriteRegister(DPP::SoftwareClear_W, 1);
digi[i]->GetData()->ClearData();
digi[i]->StartACQ(); digi[i]->StartACQ();
readDataThread[i]->start(); readDataThread[i]->start();
} }

View File

@ -9,6 +9,8 @@ class Histogram1D : public QCustomPlot{
Q_OBJECT Q_OBJECT
public: public:
Histogram1D(QString title, QString xLabel, int xbin, double xmin, double xmax, QWidget * parent = nullptr) : QCustomPlot(parent){ Histogram1D(QString title, QString xLabel, int xbin, double xmin, double xmax, QWidget * parent = nullptr) : QCustomPlot(parent){
for( int i = 0; i < 3; i ++) txt[i] = nullptr;
Rebin(xbin, xmin, xmax); Rebin(xbin, xmin, xmax);
xAxis->setLabel(xLabel); xAxis->setLabel(xLabel);
@ -50,10 +52,10 @@ public:
txt[i]->position->setType(QCPItemPosition::ptAxisRectRatio); txt[i]->position->setType(QCPItemPosition::ptAxisRectRatio);
txt[i]->position->setCoords(0.1, 0.1 + 0.1*i);; txt[i]->position->setCoords(0.1, 0.1 + 0.1*i);;
txt[i]->setFont(QFont("Helvetica", 9)); txt[i]->setFont(QFont("Helvetica", 9));
if( i == 0 ) txt[i]->setText("Under Flow : 0");
if( i == 1 ) txt[i]->setText("Total Entry : 0");
if( i == 2 ) txt[i]->setText("Over Flow : 0");
} }
txt[0]->setText("Under Flow : 0");
txt[1]->setText("Total Entry : 0");
txt[2]->setText("Over Flow : 0");
usingMenu = false; usingMenu = false;
@ -122,6 +124,9 @@ public:
lineEdit[i] = new QLineEdit(&dialog); lineEdit[i] = new QLineEdit(&dialog);
layout.addRow(nameList[i] + " : ", lineEdit[i]); layout.addRow(nameList[i] + " : ", lineEdit[i]);
} }
lineEdit[0]->setText(QString::number(xBin));
lineEdit[1]->setText(QString::number(xMin));
lineEdit[2]->setText(QString::number(xMax));
QLabel * msg = new QLabel(&dialog); QLabel * msg = new QLabel(&dialog);
msg->setStyleSheet("color:red;"); msg->setStyleSheet("color:red;");
@ -212,6 +217,9 @@ public:
underFlow = 0; underFlow = 0;
overFlow = 0; overFlow = 0;
if( txt[0] ) txt[0]->setText("Under Flow : 0");
if( txt[1] ) txt[1]->setText("Total Entry : 0");
if( txt[2] ) txt[2]->setText("Over Flow : 0");
} }
void Fill(double value){ void Fill(double value){

View File

@ -19,20 +19,20 @@ class Histogram2D : public QCustomPlot{
public: public:
Histogram2D(QString title, QString xLabel, QString yLabel, int xbin, double xmin, double xmax, int ybin, double ymin, double ymax, QWidget * parent = nullptr) : QCustomPlot(parent){ Histogram2D(QString title, QString xLabel, QString yLabel, int xbin, double xmin, double xmax, int ybin, double ymin, double ymax, QWidget * parent = nullptr) : QCustomPlot(parent){
xMin = xmin;
xMax = xmax; for( int i = 0; i < 3; i ++ ){
yMin = ymin; for( int j = 0; j < 3; j ++ ){
yMax = ymax; box[i][j] = nullptr;
xBin = xbin; txt[i][j] = nullptr;
yBin = ybin; }
}
axisRect()->setupFullAxesBox(true); axisRect()->setupFullAxesBox(true);
xAxis->setLabel(xLabel); xAxis->setLabel(xLabel);
yAxis->setLabel(yLabel); yAxis->setLabel(yLabel);
colorMap = new QCPColorMap(xAxis, yAxis); colorMap = new QCPColorMap(xAxis, yAxis);
colorMap->data()->setSize(xBin, yBin); Rebin(xbin, xmin, xmax, ybin, ymin, ymax);
colorMap->data()->setRange(QCPRange(xMin, xMax), QCPRange(yMin, yMax));
colorMap->setInterpolate(false); colorMap->setInterpolate(false);
QCPTextElement *titleEle = new QCPTextElement(this, title, QFont("sans", 12)); QCPTextElement *titleEle = new QCPTextElement(this, title, QFont("sans", 12));
@ -52,8 +52,6 @@ public:
color.setColorStopAt( 1.0, QColor("yellow")); color.setColorStopAt( 1.0, QColor("yellow"));
colorMap->setGradient(color); colorMap->setGradient(color);
cutList.clear();
double xPosStart = 0.02; double xPosStart = 0.02;
double xPosStep = 0.07; double xPosStep = 0.07;
double yPosStart = 0.02; double yPosStart = 0.02;
@ -61,7 +59,6 @@ public:
for( int i = 0; i < 3; i ++ ){ for( int i = 0; i < 3; i ++ ){
for( int j = 0; j < 3; j ++ ){ for( int j = 0; j < 3; j ++ ){
entry[i][j] = 0;
box[i][j] = new QCPItemRect(this); box[i][j] = new QCPItemRect(this);
box[i][j]->topLeft->setType(QCPItemPosition::ptAxisRectRatio); box[i][j]->topLeft->setType(QCPItemPosition::ptAxisRectRatio);
@ -79,6 +76,9 @@ public:
} }
} }
cutList.clear();
cutEntryList.clear();
rescaleAxes(); rescaleAxes();
usingMenu = false; usingMenu = false;
@ -91,6 +91,7 @@ public:
line->setPen(QPen(Qt::gray, 1, Qt::DashLine)); line->setPen(QPen(Qt::gray, 1, Qt::DashLine));
line->setVisible(false); line->setVisible(false);
isBusy = false;
connect(this, &QCustomPlot::mouseMove, this, [=](QMouseEvent *event){ connect(this, &QCustomPlot::mouseMove, this, [=](QMouseEvent *event){
double x = xAxis->pixelToCoord(event->pos().x()); double x = xAxis->pixelToCoord(event->pos().x());
@ -112,9 +113,11 @@ public:
}); });
connect(this, &QCustomPlot::mousePress, this, [=](QMouseEvent * event){ connect(this, &QCustomPlot::mousePress, this, [=](QMouseEvent * event){
if (event->button() == Qt::LeftButton && !usingMenu && !isDrawCut){ if (event->button() == Qt::LeftButton && !usingMenu && !isDrawCut){
setSelectionRectMode(QCP::SelectionRectMode::srmZoom); setSelectionRectMode(QCP::SelectionRectMode::srmZoom);
} }
if (event->button() == Qt::LeftButton && isDrawCut){ if (event->button() == Qt::LeftButton && isDrawCut){
oldMouseX = xAxis->pixelToCoord(event->pos().x()); oldMouseX = xAxis->pixelToCoord(event->pos().x());
@ -140,7 +143,8 @@ public:
QAction * a1 = menu->addAction("UnZoom"); QAction * a1 = menu->addAction("UnZoom");
QAction * a2 = menu->addAction("Clear hist."); QAction * a2 = menu->addAction("Clear hist.");
QAction * a3 = menu->addAction("Toggle Stat."); QAction * a3 = menu->addAction("Toggle Stat.");
QAction * a4 = menu->addAction("Create a Cut"); QAction * a4 = menu->addAction("Rebin (clear histogram)");
QAction * a5 = menu->addAction("Create a Cut");
if( numCut > 0 ) { if( numCut > 0 ) {
menu->addSeparator(); menu->addSeparator();
menu->addAction("Add/Edit names to Cuts"); menu->addAction("Add/Edit names to Cuts");
@ -179,16 +183,21 @@ public:
usingMenu = false; usingMenu = false;
} }
if( selectedAction == a4 ){ if( selectedAction == a4){
rightMouseClickRebin();
usingMenu = false;
}
if( selectedAction == a5 ){
tempCut.clear(); tempCut.clear();
tempCutID ++; tempCutID ++;
isDrawCut= true; isDrawCut= true;
usingMenu = false; usingMenu = false;
numCut ++; numCut ++;
qDebug() << "#### Create Cut Plottable count : " << plottableCount() << ", numCut :" << numCut << ", " << lastPlottableID;
} }
if( selectedAction && selectedAction->text().contains("Delete ") ){ if( selectedAction && numCut > 0 && selectedAction->text().contains("Delete ") ){
QString haha = selectedAction->text(); QString haha = selectedAction->text();
int index1 = haha.indexOf("-"); int index1 = haha.indexOf("-");
int index2 = haha.indexOf("["); int index2 = haha.indexOf("[");
@ -204,6 +213,7 @@ public:
cutTextIDList[cutID] = -1; cutTextIDList[cutID] = -1;
plottableIDList[cutID] = -1; plottableIDList[cutID] = -1;
cutNameList[cutID] = ""; cutNameList[cutID] = "";
cutEntryList[cutID] = -1;
for( int i = cutID + 1; i < cutTextIDList.count() ; i++){ for( int i = cutID + 1; i < cutTextIDList.count() ; i++){
cutTextIDList[i] --; cutTextIDList[i] --;
@ -211,21 +221,19 @@ public:
} }
if( numCut == 0 ){ if( numCut == 0 ){
tempCutID = -1;
lastPlottableID = -1;
cutList.clear(); cutList.clear();
cutIDList.clear(); cutIDList.clear();
cutTextIDList.clear(); cutTextIDList.clear();
plottableIDList.clear(); plottableIDList.clear();
cutNameList.clear(); cutNameList.clear();
cutEntryList.clear();
} }
qDebug() << "================= delete Cut-" << cutID;
qDebug() << " cutIDList " << cutIDList ;
qDebug() << "plottableIDList " << plottableIDList << ", " << plottableCount();
qDebug() << " cutTextIDList " << cutTextIDList << ", " << itemCount();
} }
if( selectedAction && selectedAction->text().contains("Clear all Cuts") ){ if( selectedAction && numCut > 0 && selectedAction->text().contains("Clear all Cuts") ){
numCut = 0; numCut = 0;
tempCutID = -1; tempCutID = -1;
lastPlottableID = -1; lastPlottableID = -1;
@ -241,10 +249,11 @@ public:
cutTextIDList.clear(); cutTextIDList.clear();
plottableIDList.clear(); plottableIDList.clear();
cutNameList.clear(); cutNameList.clear();
cutEntryList.clear();
} }
if( selectedAction && selectedAction->text().contains("Add/Edit names to Cuts") ){ if( selectedAction && numCut > 0 && selectedAction->text().contains("Add/Edit names to Cuts") ){
QDialog dialog(this); QDialog dialog(this);
dialog.setWindowTitle("Add/Edit name of cuts "); dialog.setWindowTitle("Add/Edit name of cuts ");
@ -266,12 +275,6 @@ public:
replot(); replot();
}); });
} }
// QDialogButtonBox buttonBox(QDialogButtonBox::Cancel, Qt::Horizontal, &dialog);
// layout.addRow(&buttonBox);
// QObject::connect(&buttonBox, &QDialogButtonBox::rejected, [&]() { dialog.reject();});
dialog.exec(); dialog.exec();
} }
@ -289,7 +292,8 @@ public:
plottableIDList.push_back(plottableCount() -1 ); plottableIDList.push_back(plottableCount() -1 );
cutNameList.push_back("Cut-" + QString::number(cutList.count())); cutNameList.push_back("Cut-" + QString::number(cutList.count()));
//QCPItemText is not a plottable cutEntryList.push_back(0);
QCPItemText * text = new QCPItemText(this); QCPItemText * text = new QCPItemText(this);
text->setText(cutNameList.last()); text->setText(cutNameList.last());
text->position->setCoords(tempCut[0].rx(), tempCut[0].ry()); text->position->setCoords(tempCut[0].rx(), tempCut[0].ry());
@ -302,10 +306,10 @@ public:
cutList.push_back(tempCut); cutList.push_back(tempCut);
cutIDList.push_back(tempCutID); cutIDList.push_back(tempCutID);
qDebug() << "----------- end of create cut"; // qDebug() << "----------- end of create cut";
qDebug() << " cutIDList " << cutIDList ; // qDebug() << " cutIDList " << cutIDList ;
qDebug() << "plottableIDList " << plottableIDList << ", " << plottableCount(); // qDebug() << "plottableIDList " << plottableIDList << ", " << plottableCount();
qDebug() << " cutTextIDList " << cutTextIDList << ", " << itemCount(); // qDebug() << " cutTextIDList " << cutTextIDList << ", " << itemCount();
} }
}); });
@ -316,14 +320,37 @@ public:
}); });
} }
//^===================================
void Rebin(int xbin, double xmin, double xmax, int ybin, double ymin, double ymax){
xMin = xmin;
xMax = xmax;
yMin = ymin;
yMax = ymax;
xBin = xbin;
yBin = ybin;
colorMap->data()->clear();
colorMap->data()->setSize(xBin, yBin);
colorMap->data()->setRange(QCPRange(xMin, xMax), QCPRange(yMin, yMax));
for( int i = 0; i < 3; i ++){
for( int j = 0; j < 3; j ++){
entry[i][j] = 0;
if( txt[i][j] ) txt[i][j]->setText("0");
}
}
}
void UpdatePlot(){ void UpdatePlot(){
colorMap->rescaleDataRange(); colorMap->rescaleDataRange();
rescaleAxes(); //rescaleAxes();
replot(); replot();
} }
void Clear(){ void Clear(){
colorMap->data()->clear();
for( int i = 0; i < 3; i ++){ for( int i = 0; i < 3; i ++){
for( int j = 0; j < 3; j ++){ for( int j = 0; j < 3; j ++){
entry[i][j] = 0; entry[i][j] = 0;
@ -334,6 +361,7 @@ public:
} }
void Fill(double x, double y){ void Fill(double x, double y){
if( isBusy ) return;
int xIndex, yIndex; int xIndex, yIndex;
colorMap->data()->coordToCell(x, y, &xIndex, &yIndex); colorMap->data()->coordToCell(x, y, &xIndex, &yIndex);
//printf("%f, %d %d| %f, %d %d\n", x, xIndex, xBin, y, yIndex, yBin); //printf("%f, %d %d| %f, %d %d\n", x, xIndex, xBin, y, yIndex, yBin);
@ -350,6 +378,11 @@ public:
if( xk == 1 && yk == 1 ) { if( xk == 1 && yk == 1 ) {
double value = colorMap->data()->cell(xIndex, yIndex); double value = colorMap->data()->cell(xIndex, yIndex);
colorMap->data()->setCell(xIndex, yIndex, value + 1); colorMap->data()->setCell(xIndex, yIndex, value + 1);
for( int i = 0; i < cutList.count(); i++){
if( cutList[i].isEmpty() ) continue;
if( cutList[i].containsPoint(QPointF(x,y), Qt::OddEvenFill) ) cutEntryList[i] ++;
}
} }
} }
@ -378,10 +411,19 @@ public:
} }
replot(); replot();
qDebug() << "Plottable count : " << plottableCount() << ", cutList.count :" << cutList.count() << ", cutID :" << lastPlottableID; //qDebug() << "Plottable count : " << plottableCount() << ", cutList.count :" << cutList.count() << ", cutID :" << lastPlottableID;
} }
QList<QPolygonF> GetCutList() const{return cutList;} // this list may contain empty element QList<QPolygonF> GetCutList() const{return cutList;} // this list may contain empty element
QList<int> GetCutEntryList() const{ return cutEntryList;}
void PrintCutEntry() const{
if( numCut == 0 ) return;
printf("=============== There are %d cuts.\n", numCut);
for( int i = 0; i < cutList.count(); i++){
if( cutList[i].isEmpty() ) continue;
printf("%10s | %d \n", cutNameList[i].toStdString().c_str(), cutEntryList[i]);
}
}
private: private:
double xMin, xMax, yMin, yMax; double xMin, xMax, yMin, yMax;
@ -407,10 +449,111 @@ private:
QList<int> cutTextIDList; QList<int> cutTextIDList;
QList<int> plottableIDList; QList<int> plottableIDList;
QList<QString> cutNameList; QList<QString> cutNameList;
QList<int> cutEntryList;
QCPItemLine * line; QCPItemLine * line;
double oldMouseX = 0.0, oldMouseY = 0.0; double oldMouseX = 0.0, oldMouseY = 0.0;
bool isBusy;
//^======================== Right Mouse click action
void rightMouseClickRebin(){
QDialog dialog(this);
dialog.setWindowTitle("Rebin histogram");
QFormLayout layout(&dialog);
QLabel * info = new QLabel(&dialog);
info->setStyleSheet("color:red;");
info->setText("This will also clear histogram!!");
layout.addRow(info);
QStringList nameListX = {"Num. x-Bin", "x-Min", "x-Max"};
QLineEdit* lineEditX[3];
for (int i = 0; i < 3; ++i) {
lineEditX[i] = new QLineEdit(&dialog);
layout.addRow(nameListX[i] + " : ", lineEditX[i]);
}
lineEditX[0]->setText(QString::number(xBin));
lineEditX[1]->setText(QString::number(xMin));
lineEditX[2]->setText(QString::number(xMax));
QStringList nameListY = {"Num. y-Bin", "y-Min", "y-Max"};
QLineEdit* lineEditY[3];
for (int i = 0; i < 3; ++i) {
lineEditY[i] = new QLineEdit(&dialog);
layout.addRow(nameListY[i] + " : ", lineEditY[i]);
}
lineEditY[0]->setText(QString::number(yBin));
lineEditY[1]->setText(QString::number(yMin));
lineEditY[2]->setText(QString::number(yMax));
QLabel * msg = new QLabel(&dialog);
msg->setStyleSheet("color:red;");
layout.addRow(msg);
QDialogButtonBox buttonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, &dialog);
layout.addRow(&buttonBox);
double number[3][2];
QObject::connect(&buttonBox, &QDialogButtonBox::accepted, [&]() {
int OKcount = 0;
bool conversionOk = true;
for( int i = 0; i < 3; i++ ){
number[i][0] = lineEditX[i]->text().toDouble(&conversionOk);
if( conversionOk ){
OKcount++;
}else{
msg->setText(nameListX[i] + " is invalid.");
return;
}
}
for( int i = 0; i < 3; i++ ){
number[i][1] = lineEditY[i]->text().toDouble(&conversionOk);
if( conversionOk ){
OKcount++;
}else{
msg->setText(nameListY[i] + " is invalid.");
return;
}
}
if( OKcount == 6 ) {
if( number[0][0] <= 0 ) {
msg->setText( nameListX[0] + " is zero or negative" );
return;
}
if( number[0][0] <= 0 ) {
msg->setText( nameListX[0] + " is zero or negative" );
return;
}
if( number[2][0] > number[1][0] && number[2][1] > number[1][1] ) {
dialog.accept();
}else{
if( number[2][0] > number[1][0] ){
msg->setText(nameListX[2] + " is smaller than " + nameListX[1]);
}
if( number[2][1] > number[1][1] ){
msg->setText(nameListY[2] + " is smaller than " + nameListY[1]);
}
}
}
});
QObject::connect(&buttonBox, &QDialogButtonBox::rejected, [&]() { dialog.reject();});
if( dialog.exec() == QDialog::Accepted ){
isBusy = true;
Rebin((int)number[0][0], number[1][0], number[2][0], (int)number[0][1], number[1][1], number[2][1]);
rescaleAxes();
UpdatePlot();
isBusy = false;
}
}
}; };
#endif #endif

View File

@ -7,6 +7,15 @@ OnlineEventBuilder::OnlineEventBuilder(Digitizer * digi){
data = digi->GetData(); data = digi->GetData();
nCh = digi->GetNChannels(); nCh = digi->GetNChannels();
ClearEvents();
}
OnlineEventBuilder::~OnlineEventBuilder(){
}
void OnlineEventBuilder::ClearEvents(){
eventIndex = -1; eventIndex = -1;
for( int i = 0; i < MaxNEvent; i++ ) events[i].clear(); for( int i = 0; i < MaxNEvent; i++ ) events[i].clear();
@ -19,12 +28,6 @@ OnlineEventBuilder::OnlineEventBuilder(Digitizer * digi){
earlistCh = -1; earlistCh = -1;
nExhaushedCh = 0; nExhaushedCh = 0;
}
OnlineEventBuilder::~OnlineEventBuilder(){
} }
void OnlineEventBuilder::FindEarlistTimeAndCh(){ void OnlineEventBuilder::FindEarlistTimeAndCh(){
@ -79,19 +82,23 @@ void OnlineEventBuilder::BuildEvents(unsigned short timeWindow, bool verbose){
eventbuilt = 0; eventbuilt = 0;
data->PrintAllData();
//======= Start building event //======= Start building event
do{ do{
eventIndex ++; eventIndex ++;
if( eventIndex >= MaxNEvent ) eventIndex = 0; if( eventIndex >= MaxNEvent ) eventIndex = 0;
events[eventIndex].clear();
eventbuilt ++; eventbuilt ++;
unsigned long long dT =0; unsigned long long dT =0;
dataPoint dp = {0, 0, 0}; dataPoint dp = {0, 0, 0};
for( unsigned int i = 0; i < nCh; i++){ for( unsigned int i = 0; i < nCh; i++){
int ch = (i + earlistCh ) % nCh; int ch = (i + earlistCh ) % nCh;
//printf("------ %d | %d | %d | %d\n", ch, data->DataIndex[ch], nextIndex[ch], chExhaused[ch]);
if( chExhaused[ch] ) continue; if( chExhaused[ch] ) continue;
if( nextIndex[ch] > data->DataIndex[ch]) { if( nextIndex[ch] > data->DataIndex[ch]) {
nExhaushedCh ++; nExhaushedCh ++;
@ -103,7 +110,7 @@ void OnlineEventBuilder::BuildEvents(unsigned short timeWindow, bool verbose){
unsigned long long time = data->Timestamp[ch][nextIndex[ch]]; unsigned long long time = data->Timestamp[ch][nextIndex[ch]];
if( time - earlistTime < timeWindow ){ if( time >= earlistTime && (time - earlistTime < timeWindow) ){
dp.ch = ch; dp.ch = ch;
dp.energy = data->Energy[ch][nextIndex[ch]]; dp.energy = data->Energy[ch][nextIndex[ch]];
dp.timeStamp = time; dp.timeStamp = time;
@ -127,21 +134,23 @@ void OnlineEventBuilder::BuildEvents(unsigned short timeWindow, bool verbose){
FindEarlistTimeAndCh(); FindEarlistTimeAndCh();
if( verbose ){ if( verbose ){
printf(">>>>>>>>>>>>>>>>>>>>>>>>> Event ID : %ld\n", eventIndex); printf(">>>>>>>>>>>>>>>>>>>>>>>>> Event ID : %ld, multiplicity : %ld\n", eventIndex, events[eventIndex].size());
for( int i = 0; i <(int) events[eventIndex].size(); i++){ for( int i = 0; i <(int) events[eventIndex].size(); i++){
printf("%02d | %5d %llu \n", events[eventIndex][i].ch, events[eventIndex][i].energy, events[eventIndex][i].timeStamp); int chxxx = events[eventIndex][i].ch;
printf("%02d | %d | %5d %llu \n", chxxx, nextIndex[chxxx], events[eventIndex][i].energy, events[eventIndex][i].timeStamp);
} }
if( nExhaushedCh == nCh ) { if( nExhaushedCh == nCh ) {
printf("######################### no more event to be built\n"); printf("######################### no more event to be built\n");
break; break;
} }
printf("----- next ch : %d, next earlist Time : %llu \n", earlistCh, earlistTime); printf("----- next ch : %d, next earlist Time : %llu.\n", earlistCh, earlistTime);
} }
if( latestTime - earlistTime <= timeWindow ) { if( latestTime - earlistTime <= timeWindow ) {
if( verbose ) { if( verbose ) {
printf("######################### left over data for next build\n"); printf("######################### left over data for next build, latesTime : %llu.\n", latestTime);
} }
break; break;
} }

View File

@ -14,7 +14,7 @@ Use another class to hold the event data and methods.
#include "macro.h" #include "macro.h"
#include "ClassDigitizer.h" #include "ClassDigitizer.h"
#define MaxNEvent 10000 #define MaxNEvent 30
struct dataPoint{ struct dataPoint{
unsigned short ch; unsigned short ch;
@ -28,6 +28,7 @@ public:
OnlineEventBuilder(Digitizer * digi); OnlineEventBuilder(Digitizer * digi);
~OnlineEventBuilder(); ~OnlineEventBuilder();
void ClearEvents();
void BuildEvents(unsigned short timeWindow, bool verbose = false); void BuildEvents(unsigned short timeWindow, bool verbose = false);
long eventIndex; long eventIndex;

View File

@ -240,7 +240,7 @@ void Scope::StartScope(){
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){ for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){
traceOn[iDigi] = digi[iDigi]->IsRecordTrace(); //remember setting traceOn[iDigi] = digi[iDigi]->IsRecordTrace(); //remember setting
digi[iDigi]->GetData()->ClearData();
digi[iDigi]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, 1, -1); digi[iDigi]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, 1, -1);
digi[iDigi]->StartACQ(); digi[iDigi]->StartACQ();
@ -330,15 +330,15 @@ void Scope::UpdateScope(){
if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) { if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) {
for( int i = 0; i < (int) (data->Waveform1[ch][index]).size() ; i++ ) { for( int i = 0; i < (int) (data->Waveform1[ch][index]).size() ; i++ ) {
points[0].append(QPointF(ch2ns * i * factor, (data->Waveform1[ch][index])[i])); points[0].append(QPointF(ch2ns * i * factor, (data->Waveform1[ch][index])[i]));
points[1].append(QPointF(ch2ns * i * factor, (data->Waveform2[ch][index])[i])); if( i < (int) data->Waveform2[ch][index].size() ) points[1].append(QPointF(ch2ns * i * factor, (data->Waveform2[ch][index])[i]));
points[2].append(QPointF(ch2ns * i * factor, (data->DigiWaveform1[ch][index])[i] * 1000)); if( i < (int) data->DigiWaveform1[ch][index].size() ) points[2].append(QPointF(ch2ns * i * factor, (data->DigiWaveform1[ch][index])[i] * 1000));
points[3].append(QPointF(ch2ns * i * factor, (data->DigiWaveform2[ch][index])[i] * 1000 + 500)); if( i < (int) data->DigiWaveform2[ch][index].size() ) points[3].append(QPointF(ch2ns * i * factor, (data->DigiWaveform2[ch][index])[i] * 1000 + 500));
} }
} }
if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) { if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) {
for( int i = 0; i < (int) (data->DigiWaveform1[ch][index]).size() ; i++ ) { for( int i = 0; i < (int) (data->DigiWaveform1[ch][index]).size() ; i++ ) {
if( i < (int) data->Waveform1[ch][index].size() ) points[0].append(QPointF(ch2ns * i * factor, (data->Waveform1[ch][index])[i])); points[0].append(QPointF(ch2ns * i * factor, (data->Waveform1[ch][index])[i]));
if( i < (int) data->Waveform2[ch][index].size() ) points[1].append(QPointF(ch2ns * i * factor, (data->Waveform2[ch][index])[i])); if( i < (int) data->Waveform2[ch][index].size() ) points[1].append(QPointF(ch2ns * i * factor, (data->Waveform2[ch][index])[i]));
if( i < (int) data->DigiWaveform1[ch][index].size() ) points[2].append(QPointF(ch2ns * i, (data->DigiWaveform1[ch][index])[i] * 1000)); if( i < (int) data->DigiWaveform1[ch][index].size() ) points[2].append(QPointF(ch2ns * i, (data->DigiWaveform1[ch][index])[i] * 1000));
if( i < (int) data->DigiWaveform2[ch][index].size() ) points[3].append(QPointF(ch2ns * i, (data->DigiWaveform2[ch][index])[i] * 1000 + 500)); if( i < (int) data->DigiWaveform2[ch][index].size() ) points[3].append(QPointF(ch2ns * i, (data->DigiWaveform2[ch][index])[i] * 1000 + 500));

View File

@ -48,10 +48,11 @@ int main(int argc, char* argv[]){
OnlineEventBuilder * eb = new OnlineEventBuilder( dig[0] ); OnlineEventBuilder * eb = new OnlineEventBuilder( dig[0] );
Data * data = dig[0]->GetData(); Data * data = dig[0]->GetData();
data->ClearData();
data->OpenSaveFile("haha"); // data->OpenSaveFile("haha");
printf("################# DPP Type : %d , %s\n", data->DPPType, data->DPPTypeStr.c_str()); // printf("################# DPP Type : %d , %s\n", data->DPPType, data->DPPTypeStr.c_str());
dig[0]->StartACQ(); dig[0]->StartACQ();
@ -66,6 +67,7 @@ int main(int argc, char* argv[]){
// int index = data->NumEventsDecoded[0]; // int index = data->NumEventsDecoded[0];
// printf("-------------- %ld \n", data->Waveform1[0][index].size()); // printf("-------------- %ld \n", data->Waveform1[0][index].size());
data->PrintAllData();
eb->BuildEvents(100); eb->BuildEvents(100);
} }
@ -73,7 +75,6 @@ int main(int argc, char* argv[]){
dig[0]->StopACQ(); dig[0]->StopACQ();
data->PrintAllData();