add more on the main window
This commit is contained in:
parent
01641e38f4
commit
d36e8ef2ec
3
.vscode/c_cpp_properties.json
vendored
3
.vscode/c_cpp_properties.json
vendored
|
@ -4,7 +4,8 @@
|
||||||
"name": "Linux",
|
"name": "Linux",
|
||||||
"includePath": [
|
"includePath": [
|
||||||
"${workspaceFolder}/**",
|
"${workspaceFolder}/**",
|
||||||
"/usr/include/x86_64-linux-gnu/qt6/**"
|
"/usr/include/x86_64-linux-gnu/qt6/**",
|
||||||
|
"/opt/root/include/*"
|
||||||
],
|
],
|
||||||
"defines": [],
|
"defines": [],
|
||||||
"compilerPath": "/usr/bin/gcc",
|
"compilerPath": "/usr/bin/gcc",
|
||||||
|
|
6
.vscode/settings.json
vendored
Normal file
6
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"script.C": "cpp",
|
||||||
|
"SOLARIS_Qt6_DAQ.pro" : "makefile"
|
||||||
|
}
|
||||||
|
}
|
234
SolReader.h
Normal file
234
SolReader.h
Normal file
|
@ -0,0 +1,234 @@
|
||||||
|
#ifndef SOLREADER_H
|
||||||
|
#define SOLREADER_H
|
||||||
|
|
||||||
|
#include <stdio.h> /// for FILE
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <time.h> // 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<unsigned int> 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
|
|
@ -289,7 +289,7 @@ DigiSettings::DigiSettings(Digitizer2Gen * digi, unsigned short nDigi, QWidget *
|
||||||
|
|
||||||
QSignalMapper * onOffMapper = new QSignalMapper(tab);
|
QSignalMapper * onOffMapper = new QSignalMapper(tab);
|
||||||
connect(onOffMapper, &QSignalMapper::mappedInt, this, &DigiSettings::onChannelonOff);
|
connect(onOffMapper, &QSignalMapper::mappedInt, this, &DigiSettings::onChannelonOff);
|
||||||
|
|
||||||
QTabWidget * chTabWidget = new QTabWidget(tab); chLayout->addWidget(chTabWidget);
|
QTabWidget * chTabWidget = new QTabWidget(tab); chLayout->addWidget(chTabWidget);
|
||||||
|
|
||||||
{//.......... All Settings tab
|
{//.......... 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++){
|
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);
|
chLayout->addWidget(labChADCVetoWidth, rowID, colID);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------ set all channel
|
//------ set all channel
|
||||||
if( rowID == 0 || rowID >= 2){
|
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
|
{//------- Group trigger settings
|
||||||
|
|
|
@ -100,6 +100,7 @@ private:
|
||||||
bool bnClickStatus[MaxNumberOfChannel][MaxNumberOfChannel];
|
bool bnClickStatus[MaxNumberOfChannel][MaxNumberOfChannel];
|
||||||
|
|
||||||
QCheckBox * cbCh[MaxNumberOfDigitizer][MaxNumberOfChannel + 1]; // index = 64 is for all channels
|
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 * sbRecordLength[MaxNumberOfChannel + 1];
|
||||||
QSpinBox * sbPreTrigger[MaxNumberOfChannel + 1];
|
QSpinBox * sbPreTrigger[MaxNumberOfChannel + 1];
|
||||||
|
|
148
mainwindow.cpp
148
mainwindow.cpp
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QGridLayout>
|
#include <QGridLayout>
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QStorageInfo>
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
@ -18,6 +20,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
||||||
nDigi = 0;
|
nDigi = 0;
|
||||||
digiSerialNum.clear();
|
digiSerialNum.clear();
|
||||||
digiSetting = NULL;
|
digiSetting = NULL;
|
||||||
|
readDataThread = NULL;
|
||||||
|
|
||||||
QWidget * mainLayoutWidget = new QWidget(this);
|
QWidget * mainLayoutWidget = new QWidget(this);
|
||||||
setCentralWidget(mainLayoutWidget);
|
setCentralWidget(mainLayoutWidget);
|
||||||
|
@ -32,7 +35,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
||||||
QGridLayout * layout1 = new QGridLayout(box1);
|
QGridLayout * layout1 = new QGridLayout(box1);
|
||||||
|
|
||||||
bnProgramSettings = new QPushButton("Program Settings", this);
|
bnProgramSettings = new QPushButton("Program Settings", this);
|
||||||
bnProgramSettings->setEnabled(false);
|
connect(bnProgramSettings, &QPushButton::clicked, this, &MainWindow::ProgramSettings);
|
||||||
|
|
||||||
bnOpenDigitizers = new QPushButton("Open Digitizers", this);
|
bnOpenDigitizers = new QPushButton("Open Digitizers", this);
|
||||||
connect(bnOpenDigitizers, SIGNAL(clicked()), this, SLOT(bnOpenDigitizers_clicked()));
|
connect(bnOpenDigitizers, SIGNAL(clicked()), this, SLOT(bnOpenDigitizers_clicked()));
|
||||||
|
@ -45,11 +48,29 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
||||||
bnDigiSettings->setEnabled(false);
|
bnDigiSettings->setEnabled(false);
|
||||||
connect(bnDigiSettings, SIGNAL(clicked()), this, SLOT(OpenDigitizersSettings()));
|
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("<Exp Name>", this);
|
||||||
|
lExpName->setReadOnly(true);
|
||||||
|
|
||||||
layout1->addWidget(bnProgramSettings, 0, 0);
|
layout1->addWidget(bnProgramSettings, 0, 0);
|
||||||
layout1->addWidget(bnOpenDigitizers, 0, 1);
|
layout1->addWidget(bnOpenDigitizers, 0, 1);
|
||||||
layout1->addWidget(bnCloseDigitizers, 0, 2);
|
layout1->addWidget(bnCloseDigitizers, 0, 2);
|
||||||
layout1->addWidget(bnDigiSettings, 1, 1);
|
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 = new QPushButton("Stop ACQ", this);
|
||||||
bnStopACQ->setEnabled(false);
|
bnStopACQ->setEnabled(false);
|
||||||
connect(bnStopACQ, &QPushButton::clicked, this, &MainWindow::StopACQ);
|
connect(bnStopACQ, &QPushButton::clicked, this, &MainWindow::StopACQ);
|
||||||
|
|
||||||
layout2->addWidget(bnStartACQ, 0, 0);
|
QLabel * lbRunID = new QLabel("Run ID : ", this);
|
||||||
layout2->addWidget(bnStopACQ, 0, 1);
|
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(){
|
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;
|
//---- need manually delete
|
||||||
delete bnOpenDigitizers;
|
if( digiSetting != NULL ) delete digiSetting;
|
||||||
delete bnCloseDigitizers;
|
|
||||||
delete bnDigiSettings;
|
|
||||||
delete logInfo;
|
|
||||||
|
|
||||||
if( digi != NULL ){
|
if( digi != NULL ){
|
||||||
digi->CloseDigitizer();
|
digi->CloseDigitizer();
|
||||||
delete digi;
|
delete digi;
|
||||||
}
|
}
|
||||||
|
|
||||||
readDataThread->Stop();
|
if( readDataThread != NULL){
|
||||||
readDataThread->quit();
|
readDataThread->Stop();
|
||||||
readDataThread->wait();
|
readDataThread->quit();
|
||||||
delete readDataThread;
|
readDataThread->wait();
|
||||||
|
delete readDataThread;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,16 +226,18 @@ void MainWindow::bnOpenDigitizers_clicked(){
|
||||||
}else{
|
}else{
|
||||||
LogMsg("Cannot open digitizer");
|
LogMsg("Cannot open digitizer");
|
||||||
|
|
||||||
LogMsg("use a dummy.");
|
//LogMsg("use a dummy.");
|
||||||
|
//digi->SetDummy();
|
||||||
|
//digiSerialNum.push_back(0000);
|
||||||
|
//nDigi ++;
|
||||||
|
|
||||||
digi->SetDummy();
|
delete digi;
|
||||||
digiSerialNum.push_back(0000);
|
|
||||||
nDigi ++;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//######################################################################
|
||||||
void MainWindow::bnCloseDigitizers_clicked(){
|
void MainWindow::bnCloseDigitizers_clicked(){
|
||||||
if( digi != NULL ){
|
if( digi != NULL ){
|
||||||
digi->CloseDigitizer();
|
digi->CloseDigitizer();
|
||||||
|
@ -225,6 +270,73 @@ void MainWindow::OpenDigitizersSettings(){
|
||||||
digiSetting->show();
|
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){
|
void MainWindow::LogMsg(QString msg){
|
||||||
|
|
||||||
|
|
18
mainwindow.h
18
mainwindow.h
|
@ -57,9 +57,10 @@ public:
|
||||||
digi->ErrorMsg("ReadDataLoop()");
|
digi->ErrorMsg("ReadDataLoop()");
|
||||||
}
|
}
|
||||||
|
|
||||||
if( readCount % 1000 == 0 ) {
|
clock_gettime(CLOCK_REALTIME, &tb);
|
||||||
emit sendMsg("FileSize : " + QString::number(digi->GetFileSize()) + " Bytes");
|
//if( readCount % 1000 == 0 ) {
|
||||||
clock_gettime(CLOCK_REALTIME, &tb);
|
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;
|
//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);
|
//printf("%4d, duration : %10.0f, %6.1f\n", readCount, duration, 1e9/duration);
|
||||||
ta = tb;
|
ta = tb;
|
||||||
|
@ -98,6 +99,9 @@ private slots:
|
||||||
|
|
||||||
void OpenDigitizersSettings();
|
void OpenDigitizersSettings();
|
||||||
|
|
||||||
|
void SetupNewExp();
|
||||||
|
void ProgramSettings();
|
||||||
|
|
||||||
signals :
|
signals :
|
||||||
|
|
||||||
|
|
||||||
|
@ -111,6 +115,8 @@ private:
|
||||||
QPushButton * bnStartACQ;
|
QPushButton * bnStartACQ;
|
||||||
QPushButton * bnStopACQ;
|
QPushButton * bnStopACQ;
|
||||||
|
|
||||||
|
QPushButton * bnNewExp;
|
||||||
|
|
||||||
DigiSettings * digiSetting;
|
DigiSettings * digiSetting;
|
||||||
|
|
||||||
QPlainTextEdit * logInfo;
|
QPlainTextEdit * logInfo;
|
||||||
|
@ -125,7 +131,11 @@ private:
|
||||||
ReadDataThread * readDataThread;
|
ReadDataThread * readDataThread;
|
||||||
|
|
||||||
void LogMsg(QString msg);
|
void LogMsg(QString msg);
|
||||||
|
|
||||||
|
QString expName;
|
||||||
|
QString dataPath;
|
||||||
|
QString analysisPath;
|
||||||
|
int runID;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
85
script.C
Normal file
85
script.C
Normal file
|
@ -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;
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user