Compare commits
16 Commits
c8d5d2d0c4
...
cf2cf51095
Author | SHA1 | Date | |
---|---|---|---|
|
cf2cf51095 | ||
|
f7b78a9f19 | ||
|
7ad3ed4af0 | ||
|
b79fd72fe7 | ||
|
ab61ee1bb0 | ||
|
ff5120395b | ||
|
952b352e8a | ||
|
513608e991 | ||
|
8fd4c92c2b | ||
|
dfe4c4738b | ||
|
3c8229fbfb | ||
|
03c3e79497 | ||
|
6d7daaa13c | ||
|
ff3f94e0de | ||
|
8a0503629c | ||
|
bedbe44164 |
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -6,6 +6,7 @@ FSUDAQ_Qt6
|
||||||
test
|
test
|
||||||
test_indep
|
test_indep
|
||||||
programSettings.txt
|
programSettings.txt
|
||||||
|
a4818_list.txt
|
||||||
EventBuilder
|
EventBuilder
|
||||||
EventBuilderNew
|
EventBuilderNew
|
||||||
EventBuilder2
|
EventBuilder2
|
||||||
|
|
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
|
@ -160,6 +160,7 @@
|
||||||
"fstream": "cpp",
|
"fstream": "cpp",
|
||||||
"Analyzer.C": "cpp",
|
"Analyzer.C": "cpp",
|
||||||
"process_Run.C": "cpp",
|
"process_Run.C": "cpp",
|
||||||
"EncoreAnalyzer.C": "cpp"
|
"EncoreAnalyzer.C": "cpp",
|
||||||
|
"qfiledialog": "cpp"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -113,9 +113,9 @@ int Digitizer::OpenDigitizer(int boardID, int portID, bool program, bool verbose
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ret == 0 ){
|
if( ret == 0 ){
|
||||||
if( LinkType == CAEN_DGTZ_USB ) printf("Open digitizer via USB, board : %d\n", boardID);
|
if( LinkType == CAEN_DGTZ_USB ) printf("### Open digitizer via USB, board : %d\n", boardID);
|
||||||
if( LinkType == CAEN_DGTZ_OpticalLink ) printf("Open digitizer via Optical Link, port : %d, board : %d\n", portID, boardID);
|
if( LinkType == CAEN_DGTZ_OpticalLink ) printf("### Open digitizer via Optical Link, port : %d, board : %d\n", portID, boardID);
|
||||||
if( LinkType == CAEN_DGTZ_USB_A4818 ) printf("Open digitizer via A4818, port : %d, board : %d\n", portID, boardID);
|
if( LinkType == CAEN_DGTZ_USB_A4818 ) printf("### Open digitizer via A4818, port : %d, board : %d\n", portID, boardID);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
|
@ -1258,40 +1258,40 @@ std::string Digitizer::GetDPPString(int DPPType){
|
||||||
void Digitizer::ErrorMsg(std::string header){
|
void Digitizer::ErrorMsg(std::string header){
|
||||||
switch (ret){
|
switch (ret){
|
||||||
///case CAEN_DGTZ_Success : /** 0 */ printf("%s | Operation completed successfully.\n", header.c_str()); break;
|
///case CAEN_DGTZ_Success : /** 0 */ printf("%s | Operation completed successfully.\n", header.c_str()); break;
|
||||||
case CAEN_DGTZ_CommError : /** -1 */ printf("%s %d | %d, Communication Error.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_CommError : /** -1 */ printf("%s digi-%d | %d, Communication Error.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_GenericError : /** -2 */ printf("%s %d | %d, Unspecified error.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_GenericError : /** -2 */ printf("%s digi-%d | %d, Unspecified error.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_InvalidParam : /** -3 */ printf("%s %d | %d, Invalid parameter.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_InvalidParam : /** -3 */ printf("%s digi-%d | %d, Invalid parameter.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_InvalidLinkType : /** -4 */ printf("%s %d | %d, Invalid Link Type.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_InvalidLinkType : /** -4 */ printf("%s digi-%d | %d, Invalid Link Type.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_InvalidHandle : /** -5 */ printf("%s %d | %d, Invalid device handler.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_InvalidHandle : /** -5 */ printf("%s digi-%d | %d, Invalid device handler.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_MaxDevicesError : /** -6 */ printf("%s %d | %d, Maximum number of devices exceeded.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_MaxDevicesError : /** -6 */ printf("%s digi-%d | %d, Maximum number of devices exceeded.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_BadBoardType : /** -7 */ printf("%s %d | %d, Operation not allowed on this type of board.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_BadBoardType : /** -7 */ printf("%s digi-%d | %d, Operation not allowed on this type of board.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_BadInterruptLev : /** -8 */ printf("%s %d | %d, The interrupt level is not allowed.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_BadInterruptLev : /** -8 */ printf("%s digi-%d | %d, The interrupt level is not allowed.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_BadEventNumber : /** -9 */ printf("%s %d | %d, The event number is bad.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_BadEventNumber : /** -9 */ printf("%s digi-%d | %d, The event number is bad.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_ReadDeviceRegisterFail : /** -10 */ printf("%s %d | %d, Unable to read the registry.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_ReadDeviceRegisterFail : /** -10 */ printf("%s digi-%d | %d, Unable to read the registry.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_WriteDeviceRegisterFail : /** -11 */ printf("%s %d | %d, Unable to write the registry.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_WriteDeviceRegisterFail : /** -11 */ printf("%s digi-%d | %d, Unable to write the registry.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_InvalidChannelNumber : /** -13 */ printf("%s %d | %d, The channel number is invalid.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_InvalidChannelNumber : /** -13 */ printf("%s digi-%d | %d, The channel number is invalid.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_ChannelBusy : /** -14 */ printf("%s %d | %d, The channel is busy.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_ChannelBusy : /** -14 */ printf("%s digi-%d | %d, The channel is busy.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_FPIOModeInvalid : /** -15 */ printf("%s %d | %d, Invalid FPIO mode.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_FPIOModeInvalid : /** -15 */ printf("%s digi-%d | %d, Invalid FPIO mode.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_WrongAcqMode : /** -16 */ printf("%s %d | %d, Wrong Acquistion mode.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_WrongAcqMode : /** -16 */ printf("%s digi-%d | %d, Wrong Acquistion mode.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_FunctionNotAllowed : /** -17 */ printf("%s %d | %d, This function is not allowed on this module.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_FunctionNotAllowed : /** -17 */ printf("%s digi-%d | %d, This function is not allowed on this module.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_Timeout : /** -18 */ printf("%s %d | %d, Communication Timeout.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_Timeout : /** -18 */ printf("%s digi-%d | %d, Communication Timeout.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_InvalidBuffer : /** -19 */ printf("%s %d | %d, The buffer is invalid.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_InvalidBuffer : /** -19 */ printf("%s digi-%d | %d, The buffer is invalid.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_EventNotFound : /** -20 */ printf("%s %d | %d, The event is not found.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_EventNotFound : /** -20 */ printf("%s digi-%d | %d, The event is not found.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_InvalidEvent : /** -21 */ printf("%s %d | %d, The event is invalid.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_InvalidEvent : /** -21 */ printf("%s digi-%d | %d, The event is invalid.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_OutOfMemory : /** -22 */ printf("%s %d | %d, Out of memory.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_OutOfMemory : /** -22 */ printf("%s digi-%d | %d, Out of memory.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_CalibrationError : /** -23 */ printf("%s %d | %d, Unable to calibrate the board.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_CalibrationError : /** -23 */ printf("%s digi-%d | %d, Unable to calibrate the board.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_DigitizerNotFound : /** -24 */ printf("%s %d | %d, Unbale to open the digitizer.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_DigitizerNotFound : /** -24 */ printf("%s digi-%d | %d, Unbale to open the digitizer.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_DigitizerAlreadyOpen : /** -25 */ printf("%s %d | %d, The digitizer is already open.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_DigitizerAlreadyOpen : /** -25 */ printf("%s digi-%d | %d, The digitizer is already open.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_DigitizerNotReady : /** -26 */ printf("%s %d | %d, The digitizer is not ready.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_DigitizerNotReady : /** -26 */ printf("%s digi-%d | %d, The digitizer is not ready.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_InterruptNotConfigured : /** -27 */ printf("%s %d | %d, The digitizer has no IRQ configured.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_InterruptNotConfigured : /** -27 */ printf("%s digi-%d | %d, The digitizer has no IRQ configured.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_DigitizerMemoryCorrupted: /** -28 */ printf("%s %d | %d, The digitizer flash memory is corrupted.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_DigitizerMemoryCorrupted: /** -28 */ printf("%s digi-%d | %d, The digitizer flash memory is corrupted.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_DPPFirmwareNotSupported : /** -29 */ printf("%s %d | %d, The digitier DPP firmware is not supported in this lib version.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_DPPFirmwareNotSupported : /** -29 */ printf("%s digi-%d | %d, The digitier DPP firmware is not supported in this lib version.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_InvalidLicense : /** -30 */ printf("%s %d | %d, Invalid firmware licence.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_InvalidLicense : /** -30 */ printf("%s digi-%d | %d, Invalid firmware licence.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_InvalidDigitizerStatus : /** -31 */ printf("%s %d | %d, The digitizer is found in a corrupted status.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_InvalidDigitizerStatus : /** -31 */ printf("%s digi-%d | %d, The digitizer is found in a corrupted status.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_UnsupportedTrace : /** -32 */ printf("%s %d | %d, The given trace is not supported.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_UnsupportedTrace : /** -32 */ printf("%s digi-%d | %d, The given trace is not supported.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_InvalidProbe : /** -33 */ printf("%s %d | %d, The given probe is not supported.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_InvalidProbe : /** -33 */ printf("%s digi-%d | %d, The given probe is not supported.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_UnsupportedBaseAddress : /** -34 */ printf("%s %d | %d, The base address is not supported.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_UnsupportedBaseAddress : /** -34 */ printf("%s digi-%d | %d, The base address is not supported.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
case CAEN_DGTZ_NotYetImplemented : /** -99 */ printf("%s %d | %d, The function is not yet implemented.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
case CAEN_DGTZ_NotYetImplemented : /** -99 */ printf("%s digi-%d | %d, The function is not yet implemented.\n", header.c_str(), BoardInfo.SerialNumber, ret); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1339,8 +1339,10 @@ void Digitizer::SetOptimialAggOrg(){
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t EventAgg = ReadRegister(DPP::QDC::NumberEventsPerAggregate, 0);
|
uint32_t EventAgg = ReadRegister(DPP::QDC::NumberEventsPerAggregate, 0);
|
||||||
|
if( EventAgg == 0 ) WriteRegister(DPP::QDC::NumberEventsPerAggregate, 30);
|
||||||
uint32_t chMask = ReadRegister(DPP::QDC::GroupEnableMask);
|
uint32_t chMask = ReadRegister(DPP::QDC::GroupEnableMask);
|
||||||
uint32_t RecordLen = ReadRegister(DPP::QDC::RecordLength_R, 0);
|
uint32_t RecordLen = ReadRegister(DPP::QDC::RecordLength_R, 0);
|
||||||
|
if( RecordLen == 0 ) SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, 0, -1);
|
||||||
|
|
||||||
uint32_t AggRead = ReadRegister(DPP::MaxAggregatePerBlockTransfer);
|
uint32_t AggRead = ReadRegister(DPP::MaxAggregatePerBlockTransfer);
|
||||||
uint32_t boardCfg = ReadRegister(DPP::BoardConfiguration);
|
uint32_t boardCfg = ReadRegister(DPP::BoardConfiguration);
|
||||||
|
@ -1359,7 +1361,9 @@ void Digitizer::SetOptimialAggOrg(){
|
||||||
printf(" Record Length (bit) : %u = %u sample = %u ns\n", RecordLen, RecordLen*8, RecordLen*8*16);
|
printf(" Record Length (bit) : %u = %u sample = %u ns\n", RecordLen, RecordLen*8, RecordLen*8*16);
|
||||||
printf("==============================================================\n");
|
printf("==============================================================\n");
|
||||||
|
|
||||||
|
|
||||||
int eventSize = 6 + 2 * Ex + traceOn * RecordLen * 8; // sample
|
int eventSize = 6 + 2 * Ex + traceOn * RecordLen * 8; // sample
|
||||||
|
printf(" estimated event size : %d sample \n", eventSize);
|
||||||
double maxAggOrg = log2( MemorySizekSample * 1024 / eventSize / EventAgg );
|
double maxAggOrg = log2( MemorySizekSample * 1024 / eventSize / EventAgg );
|
||||||
printf(" max Agg. Org. should be less than %.2f\n", maxAggOrg);
|
printf(" max Agg. Org. should be less than %.2f\n", maxAggOrg);
|
||||||
uint32_t aggOrg = std::floor(maxAggOrg) ;
|
uint32_t aggOrg = std::floor(maxAggOrg) ;
|
||||||
|
|
|
@ -90,6 +90,7 @@ class Digitizer{
|
||||||
bool IsConnected() {return isConnected;}
|
bool IsConnected() {return isConnected;}
|
||||||
|
|
||||||
void DisableBoard() {softwareDisable = true;}
|
void DisableBoard() {softwareDisable = true;}
|
||||||
|
void EnableBoard() {softwareDisable = false;}
|
||||||
bool IsBoardDisabled() const {return softwareDisable;}
|
bool IsBoardDisabled() const {return softwareDisable;}
|
||||||
|
|
||||||
void PrintBoard();
|
void PrintBoard();
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <QWaitCondition>
|
#include <QWaitCondition>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QCoreApplication>
|
||||||
|
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
#include "ClassDigitizer.h"
|
#include "ClassDigitizer.h"
|
||||||
|
@ -35,9 +36,13 @@ public:
|
||||||
stop = false;
|
stop = false;
|
||||||
readCount = 0;
|
readCount = 0;
|
||||||
clock_gettime(CLOCK_REALTIME, &t0);
|
clock_gettime(CLOCK_REALTIME, &t0);
|
||||||
ta = t0;
|
// ta = t0;
|
||||||
t1 = t0;
|
t1 = t0;
|
||||||
|
|
||||||
|
digiMTX[ID].lock();
|
||||||
|
digi->ReadACQStatus();
|
||||||
|
digiMTX[ID].unlock();
|
||||||
|
|
||||||
printf("ReadDataThread for digi-%d running.\n", digi->GetSerialNumber());
|
printf("ReadDataThread for digi-%d running.\n", digi->GetSerialNumber());
|
||||||
do{
|
do{
|
||||||
|
|
||||||
|
@ -77,20 +82,20 @@ public:
|
||||||
digi->ReadACQStatus();
|
digi->ReadACQStatus();
|
||||||
digiMTX[ID].unlock();
|
digiMTX[ID].unlock();
|
||||||
t2 = t1;
|
t2 = t1;
|
||||||
|
// QCoreApplication::processEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isSaveData && !stop ) {
|
// if( isSaveData && !stop ) {
|
||||||
clock_gettime(CLOCK_REALTIME, &tb);
|
// clock_gettime(CLOCK_REALTIME, &tb);
|
||||||
if( tb.tv_sec - ta.tv_sec > 2 ) {
|
// if( tb.tv_sec - ta.tv_sec > 2 ) {
|
||||||
digiMTX[ID].lock();
|
// digiMTX[ID].lock();
|
||||||
emit sendMsg("FileSize ("+ QString::number(digi->GetSerialNumber()) +"): " + QString::number(digi->GetData()->GetTotalFileSize()/1024./1024., 'f', 4) + " MB [" + QString::number(tb.tv_sec-t0.tv_sec) + " sec]");
|
// emit sendMsg("FileSize ("+ QString::number(digi->GetSerialNumber()) +"): " + QString::number(digi->GetData()->GetTotalFileSize()/1024./1024., 'f', 4) + " MB [" + QString::number(tb.tv_sec-t0.tv_sec) + " sec]");
|
||||||
//emit sendMsg("FileSize ("+ QString::number(digi->GetSerialNumber()) +"): " + QString::number(digi->GetData()->GetTotalFileSize()/1024./1024., 'f', 4) + " MB [" + QString::number(tb.tv_sec-t0.tv_sec) + " sec] (" + QString::number(readCount) + ")");
|
// //emit sendMsg("FileSize ("+ QString::number(digi->GetSerialNumber()) +"): " + QString::number(digi->GetData()->GetTotalFileSize()/1024./1024., 'f', 4) + " MB [" + QString::number(tb.tv_sec-t0.tv_sec) + " sec] (" + QString::number(readCount) + ")");
|
||||||
digiMTX[ID].unlock();
|
// digiMTX[ID].unlock();
|
||||||
// readCount = 0;
|
// // readCount = 0;
|
||||||
ta = tb;
|
// ta = tb;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
}while(!stop);
|
}while(!stop);
|
||||||
printf("ReadDataThread for digi-%d stopped.\n", digi->GetSerialNumber());
|
printf("ReadDataThread for digi-%d stopped.\n", digi->GetSerialNumber());
|
||||||
}
|
}
|
||||||
|
@ -104,7 +109,6 @@ private:
|
||||||
bool isSaveData;
|
bool isSaveData;
|
||||||
bool isScope;
|
bool isScope;
|
||||||
unsigned long readCount;
|
unsigned long readCount;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//^#======================================================= Timing Thread
|
//^#======================================================= Timing Thread
|
||||||
|
|
|
@ -97,8 +97,17 @@ DigiSettingsPanel::DigiSettingsPanel(Digitizer ** digi, unsigned int nDigi, QStr
|
||||||
SetUpInfo("Ch. Mem. Size ", memStr.toStdString() , infoLayout[ID], 3, 2);
|
SetUpInfo("Ch. Mem. Size ", memStr.toStdString() , infoLayout[ID], 3, 2);
|
||||||
|
|
||||||
uint32_t boardInfo = digi[ID]->GetSettingFromMemory(DPP::BoardInfo_R);
|
uint32_t boardInfo = digi[ID]->GetSettingFromMemory(DPP::BoardInfo_R);
|
||||||
printf("----------- boardInfo : 0x%08X \n", boardInfo);
|
// printf("----------- boardInfo : 0x%08X \n", boardInfo);
|
||||||
SetUpInfo("Board Type ", ((boardInfo >> 16) & 0xFF) == 0x10 ? "16-ch VME" : "8-ch Bd.", infoLayout[ID], 3, 4);
|
std::string boardInfoStr;
|
||||||
|
unsigned short boardTypeNumber = (boardInfo & 0xFF);
|
||||||
|
switch (boardTypeNumber){
|
||||||
|
case 0x04 : boardInfoStr = "64-ch VME"; break;
|
||||||
|
case 0x0E : boardInfoStr = ((boardInfo >> 16) & 0xFF) == 0x10 ? "16-ch VME" : "8-ch Bd."; break;
|
||||||
|
case 0x0B : boardInfoStr = ((boardInfo >> 16) & 0xFF) == 0x10 ? "16-ch VME" : "8-ch Bd."; break;
|
||||||
|
default : boardInfoStr = "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
SetUpInfo("Board Type ", boardInfoStr, infoLayout[ID], 3, 4);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,9 +228,17 @@ DigiSettingsPanel::DigiSettingsPanel(Digitizer ** digi, unsigned int nDigi, QStr
|
||||||
connect(bnLoadSettings, &QPushButton::clicked, this, &DigiSettingsPanel::LoadSetting);
|
connect(bnLoadSettings, &QPushButton::clicked, this, &DigiSettingsPanel::LoadSetting);
|
||||||
|
|
||||||
rowID ++; //---------------------------
|
rowID ++; //---------------------------
|
||||||
bnSendSoftwareTriggerSignal = new QPushButton("Send SW Trigger Signal", this);
|
// bnSendSoftwareTriggerSignal = new QPushButton("Send SW Trigger Signal", this);
|
||||||
buttonLayout->addWidget(bnSendSoftwareTriggerSignal, rowID, 0);
|
// buttonLayout->addWidget(bnSendSoftwareTriggerSignal, rowID, 0);
|
||||||
connect(bnSendSoftwareTriggerSignal, &QPushButton::clicked, this, [=](){ digi[ID]->WriteRegister(DPP::SoftwareTrigger_W, 1); UpdateBoardAndChannelsStatus();});
|
// connect(bnSendSoftwareTriggerSignal, &QPushButton::clicked, this, [=](){ digi[ID]->WriteRegister(DPP::SoftwareTrigger_W, 1); UpdateBoardAndChannelsStatus();});
|
||||||
|
|
||||||
|
bnSetNoTrace = new QPushButton("Set No Trace", this);
|
||||||
|
buttonLayout->addWidget(bnSetNoTrace, rowID, 0);
|
||||||
|
connect(bnSetNoTrace, &QPushButton::clicked, this, [=](){
|
||||||
|
for( unsigned int i = 0; i < nDigi; i++){
|
||||||
|
chkTraceRecording[i]->setChecked(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
bhAutoSetEventPulling = new QPushButton("Autoset Reading Conf.", this);
|
bhAutoSetEventPulling = new QPushButton("Autoset Reading Conf.", this);
|
||||||
buttonLayout->addWidget(bhAutoSetEventPulling, rowID, 1);
|
buttonLayout->addWidget(bhAutoSetEventPulling, rowID, 1);
|
||||||
|
@ -330,7 +347,6 @@ DigiSettingsPanel::DigiSettingsPanel(Digitizer ** digi, unsigned int nDigi, QStr
|
||||||
ID = index;
|
ID = index;
|
||||||
//if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) UpdatePanelFromMemory();
|
//if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) UpdatePanelFromMemory();
|
||||||
UpdatePanelFromMemory();
|
UpdatePanelFromMemory();
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1376,6 +1392,27 @@ void DigiSettingsPanel::SetUpChannelMask(unsigned int digiID){
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QLabel * blank = new QLabel(" ", this);
|
||||||
|
chLayout->addWidget(blank, 1, nChGrp );
|
||||||
|
|
||||||
|
cbDigiEnable[digiID] = new QCheckBox("Enable Digitizer",this);
|
||||||
|
cbDigiEnable[digiID]->setChecked(true);
|
||||||
|
|
||||||
|
chLayout->addWidget(cbDigiEnable[digiID], 1, nChGrp + 2 );
|
||||||
|
|
||||||
|
connect(cbDigiEnable[digiID], &QCheckBox::stateChanged, this, [=](int state){
|
||||||
|
if( state == Qt::Checked ){
|
||||||
|
digi[digiID]->EnableBoard();
|
||||||
|
cbDigiEnable[digiID]->setStyleSheet("");
|
||||||
|
tabWidget->setTabText(digiID, "Digi-" + QString::number(digi[digiID]->GetSerialNumber()));
|
||||||
|
}else{
|
||||||
|
digi[digiID]->DisableBoard();
|
||||||
|
cbDigiEnable[digiID]->setStyleSheet("color: red");
|
||||||
|
tabWidget->setTabText(digiID, "Digi-" + QString::number(digi[digiID]->GetSerialNumber()) + "(D)");
|
||||||
|
}
|
||||||
|
UpdateBoardAndChannelsStatus();
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DigiSettingsPanel::SetUpACQReadOutTab(){
|
void DigiSettingsPanel::SetUpACQReadOutTab(){
|
||||||
|
@ -2280,7 +2317,7 @@ void DigiSettingsPanel::SetUpChannel_PSD(){
|
||||||
SetUpSpinBox(sbThreshold[ID][ch], "", tabLayout, ch + 1, 2, DPP::PSD::TriggerThreshold, ch);
|
SetUpSpinBox(sbThreshold[ID][ch], "", tabLayout, ch + 1, 2, DPP::PSD::TriggerThreshold, ch);
|
||||||
SetUpComboBoxBit(cbTrigMode[ID][ch], "", tabLayout, ch + 1, 4, DPP::Bit_DPPAlgorithmControl_PHA::ListTrigMode, DPP::DPPAlgorithmControl, DPP::Bit_DPPAlgorithmControl_PHA::TriggerMode, 1, ch);
|
SetUpComboBoxBit(cbTrigMode[ID][ch], "", tabLayout, ch + 1, 4, DPP::Bit_DPPAlgorithmControl_PHA::ListTrigMode, DPP::DPPAlgorithmControl, DPP::Bit_DPPAlgorithmControl_PHA::TriggerMode, 1, ch);
|
||||||
SetUpSpinBox(sbTriggerHoldOff[ID][ch], "", tabLayout, ch + 1, 6, DPP::PSD::TriggerHoldOffWidth, ch);
|
SetUpSpinBox(sbTriggerHoldOff[ID][ch], "", tabLayout, ch + 1, 6, DPP::PSD::TriggerHoldOffWidth, ch);
|
||||||
SetUpComboBoxBit(cbLocalTriggerValid[ID][ch], "", tabLayout, ch + 1, 8, DPP::PSD::Bit_DPPAlgorithmControl2::ListLocalTrigValidMode, DPP::PHA::DPPAlgorithmControl2_G, DPP::PHA::Bit_DPPAlgorithmControl2::LocalTrigValidMode, 1, ch);
|
SetUpComboBoxBit(cbLocalTriggerValid[ID][ch], "", tabLayout, ch + 1, 8, DPP::PSD::Bit_DPPAlgorithmControl2::ListLocalTrigValidMode, DPP::PSD::DPPAlgorithmControl2_G, DPP::PSD::Bit_DPPAlgorithmControl2::LocalTrigValidMode, 1, ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( i == 1 ){
|
if( i == 1 ){
|
||||||
|
@ -2290,8 +2327,8 @@ void DigiSettingsPanel::SetUpChannel_PSD(){
|
||||||
QLabel * lb1 = new QLabel("Trig. Counter Flag [G]", this); lb1->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb1, 0, 6);
|
QLabel * lb1 = new QLabel("Trig. Counter Flag [G]", this); lb1->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb1, 0, 6);
|
||||||
}
|
}
|
||||||
SetUpSpinBox(sbShapedTrigWidth[ID][ch], "", tabLayout, ch + 1, 1, DPP::PSD::ShapedTriggerWidth, ch);
|
SetUpSpinBox(sbShapedTrigWidth[ID][ch], "", tabLayout, ch + 1, 1, DPP::PSD::ShapedTriggerWidth, ch);
|
||||||
SetUpComboBoxBit(cbLocalShapedTrigger[ID][ch], "", tabLayout, ch + 1, 3, DPP::PSD::Bit_DPPAlgorithmControl2::ListLocalShapeTrigMode, DPP::PHA::DPPAlgorithmControl2_G, DPP::PHA::Bit_DPPAlgorithmControl2::LocalShapeTriggerMode, 1, ch);
|
SetUpComboBoxBit(cbLocalShapedTrigger[ID][ch], "", tabLayout, ch + 1, 3, DPP::PSD::Bit_DPPAlgorithmControl2::ListLocalShapeTrigMode, DPP::PSD::DPPAlgorithmControl2_G, DPP::PSD::Bit_DPPAlgorithmControl2::LocalShapeTriggerMode, 1, ch);
|
||||||
SetUpComboBoxBit(cbTrigCount[ID][ch], "", tabLayout, ch + 1, 5, DPP::PSD::Bit_DPPAlgorithmControl2::ListTrigCounter, DPP::PHA::DPPAlgorithmControl2_G, DPP::PHA::Bit_DPPAlgorithmControl2::TriggerCounterFlag, 1, ch);
|
SetUpComboBoxBit(cbTrigCount[ID][ch], "", tabLayout, ch + 1, 5, DPP::PSD::Bit_DPPAlgorithmControl2::ListTrigCounter, DPP::PSD::DPPAlgorithmControl2_G, DPP::PSD::Bit_DPPAlgorithmControl2::TriggerCounterFlag, 1, ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( i == 2 ){
|
if( i == 2 ){
|
||||||
|
|
|
@ -106,7 +106,8 @@ private:
|
||||||
QPushButton * bnProgramPreDefined;
|
QPushButton * bnProgramPreDefined;
|
||||||
QPushButton * bnClearBuffer;
|
QPushButton * bnClearBuffer;
|
||||||
|
|
||||||
QPushButton * bnSendSoftwareTriggerSignal;
|
// QPushButton * bnSendSoftwareTriggerSignal;
|
||||||
|
QPushButton * bnSetNoTrace;
|
||||||
QPushButton * bhAutoSetEventPulling;
|
QPushButton * bhAutoSetEventPulling;
|
||||||
//QPushButton * bnSendSoftwareClockSyncSignal;
|
//QPushButton * bnSendSoftwareClockSyncSignal;
|
||||||
QPushButton * bnSaveSettings;
|
QPushButton * bnSaveSettings;
|
||||||
|
@ -134,6 +135,7 @@ private:
|
||||||
RComboBox * cbDigiProbe2[MaxNDigitizer];
|
RComboBox * cbDigiProbe2[MaxNDigitizer];
|
||||||
|
|
||||||
QPushButton * bnChEnableMask[MaxNDigitizer][MaxRegChannel];
|
QPushButton * bnChEnableMask[MaxNDigitizer][MaxRegChannel];
|
||||||
|
QCheckBox * cbDigiEnable[MaxNDigitizer];
|
||||||
RComboBox * cbAggOrg[MaxNDigitizer];
|
RComboBox * cbAggOrg[MaxNDigitizer];
|
||||||
RSpinBox * sbAggNum[MaxNDigitizer];
|
RSpinBox * sbAggNum[MaxNDigitizer];
|
||||||
QCheckBox * chkEnableExternalTrigger[MaxNDigitizer];
|
QCheckBox * chkEnableExternalTrigger[MaxNDigitizer];
|
||||||
|
|
166
FSUDAQ.cpp
166
FSUDAQ.cpp
|
@ -20,10 +20,13 @@
|
||||||
#include "analyzers/EncoreAnalyzer.h"
|
#include "analyzers/EncoreAnalyzer.h"
|
||||||
#include "analyzers/RAISOR1.h"
|
#include "analyzers/RAISOR1.h"
|
||||||
#include "analyzers/RAISOR2.h"
|
#include "analyzers/RAISOR2.h"
|
||||||
|
#include "analyzers/TEST.h"
|
||||||
#include "analyzers/MCP.h"
|
#include "analyzers/MCP.h"
|
||||||
|
#include "analyzers/MCPandPSD.h"
|
||||||
#include "analyzers/PID.h"
|
#include "analyzers/PID.h"
|
||||||
|
|
||||||
std::vector<std::string> onlineAnalyzerList = {"Coincident","Splie-Pole", "Encore", "RAISOR1", "MCP", "PID", "RAISOR2" };
|
|
||||||
|
std::vector<std::string> onlineAnalyzerList = {"Coincident","Splie-Pole", "Encore", "RAISOR1", "MCP", "PID", "RAISOR2", "TEST", "MCPandPSD" };
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
||||||
DebugPrint("%s", "FSUDAQ");
|
DebugPrint("%s", "FSUDAQ");
|
||||||
|
@ -44,6 +47,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
||||||
runRecord = nullptr;
|
runRecord = nullptr;
|
||||||
model = nullptr;
|
model = nullptr;
|
||||||
influx = nullptr;
|
influx = nullptr;
|
||||||
|
scalarCount = 0;
|
||||||
|
|
||||||
QWidget * mainLayoutWidget = new QWidget(this);
|
QWidget * mainLayoutWidget = new QWidget(this);
|
||||||
setCentralWidget(mainLayoutWidget);
|
setCentralWidget(mainLayoutWidget);
|
||||||
|
@ -61,7 +65,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
||||||
// cbOpenDigitizers->addItem("Open Digitizers (default program)", 2);
|
// cbOpenDigitizers->addItem("Open Digitizers (default program)", 2);
|
||||||
// cbOpenDigitizers->addItem("Open Digitizers + load Settings", 3);
|
// cbOpenDigitizers->addItem("Open Digitizers + load Settings", 3);
|
||||||
//cbOpenDigitizers->addItem("Open Digitizers via USB", 3);
|
//cbOpenDigitizers->addItem("Open Digitizers via USB", 3);
|
||||||
cbOpenDigitizers->addItem("Open Digitizers via A4818", 4);
|
cbOpenDigitizers->addItem("Open Digitizers via A4818(s)", 4);
|
||||||
layout->addWidget(cbOpenDigitizers, 0, 0);
|
layout->addWidget(cbOpenDigitizers, 0, 0);
|
||||||
connect(cbOpenDigitizers, &RComboBox::currentIndexChanged, this, &MainWindow::OpenDigitizers);
|
connect(cbOpenDigitizers, &RComboBox::currentIndexChanged, this, &MainWindow::OpenDigitizers);
|
||||||
|
|
||||||
|
@ -293,6 +297,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
||||||
|
|
||||||
CheckElog();
|
CheckElog();
|
||||||
|
|
||||||
|
|
||||||
|
LogMsg("====== <font style=\"color: blue;\"><b>FSU DAQ is ready.</b></font> ======");
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow(){
|
MainWindow::~MainWindow(){
|
||||||
|
@ -355,7 +363,6 @@ void MainWindow::OpenDataPath(){
|
||||||
|
|
||||||
LoadLastRunFile();
|
LoadLastRunFile();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::OpenRecord(){
|
void MainWindow::OpenRecord(){
|
||||||
|
@ -577,16 +584,38 @@ void MainWindow::OpenDigitizers(){
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
QString a4818PID = "26006";
|
QStringList a4818PIDs;
|
||||||
if( cbOpenDigitizers->currentData().toInt() == 4 ) {
|
if( cbOpenDigitizers->currentData().toInt() == 4 ) {
|
||||||
|
|
||||||
bool ok;
|
QString a4818Path = QDir::current().absolutePath() + "/a4818_list.txt";
|
||||||
a4818PID = QInputDialog::getText(nullptr, "A4818 PID", "Can be found on the A4818:", QLineEdit::Normal, "", &ok);
|
LogMsg("Looking <b>" + a4818Path + "</b>");
|
||||||
|
|
||||||
if ( !ok || a4818PID.isEmpty()) {
|
QFile file(a4818Path);
|
||||||
LogMsg("User cancel or fail to connect A4818 without PID");
|
|
||||||
|
if( !file.open(QIODevice::Text | QIODevice::ReadOnly) ) {
|
||||||
|
LogMsg("<b>" + a4818Path + "</b> not found.");
|
||||||
|
LogMsg("Please create such file and put the a4818 PIDs inseperate lines.");
|
||||||
|
return;
|
||||||
|
}else{
|
||||||
|
QTextStream in(&file);
|
||||||
|
QString line = in.readLine();
|
||||||
|
|
||||||
|
while( !line.isNull()){
|
||||||
|
a4818PIDs.push_back(line);
|
||||||
|
line = in.readLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( a4818PIDs.isEmpty()){
|
||||||
|
LogMsg("<b>" + a4818Path + "</b> is empty.");
|
||||||
cbOpenDigitizers->setCurrentIndex(0);
|
cbOpenDigitizers->setCurrentIndex(0);
|
||||||
return;
|
return;
|
||||||
|
}else{
|
||||||
|
|
||||||
|
if( a4818PIDs.size() > 4){
|
||||||
|
LogMsg("There are more than 4 a4818, please edit the MaxNPorts in macro.h and recompile.");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -599,8 +628,12 @@ void MainWindow::OpenDigitizers(){
|
||||||
logMsgHTMLMode = false;
|
logMsgHTMLMode = false;
|
||||||
nDigi = 0;
|
nDigi = 0;
|
||||||
std::vector<std::pair<int, int>> portList; //boardID, portID
|
std::vector<std::pair<int, int>> portList; //boardID, portID
|
||||||
for(int port = 0; port < MaxNPorts; port++){
|
|
||||||
if( cbOpenDigitizers->currentData().toInt() == 4 ) port = a4818PID.toInt();
|
if( cbOpenDigitizers->currentData().toInt() == 4 ) { //for A4818
|
||||||
|
|
||||||
|
for( int i = 0; i < std::min((int)a4818PIDs.size(), MaxNPorts); i++){
|
||||||
|
int port = a4818PIDs.at(i).toInt();
|
||||||
|
|
||||||
for( int board = 0; board < MaxNBoards; board ++){ /// max number of diasy chain
|
for( int board = 0; board < MaxNBoards; board ++){ /// max number of diasy chain
|
||||||
Digitizer dig;
|
Digitizer dig;
|
||||||
dig.OpenDigitizer(board, port);
|
dig.OpenDigitizer(board, port);
|
||||||
|
@ -608,13 +641,29 @@ void MainWindow::OpenDigitizers(){
|
||||||
nDigi++;
|
nDigi++;
|
||||||
portList.push_back(std::pair(board, port));
|
portList.push_back(std::pair(board, port));
|
||||||
LogMsg(QString("... Found at port: %1, board: %2. SN: %3 %4").arg(port).arg(board).arg(dig.GetSerialNumber(), 3, 10, QChar(' ')).arg(dig.GetDPPString().c_str()));
|
LogMsg(QString("... Found at port: %1, board: %2. SN: %3 %4").arg(port).arg(board).arg(dig.GetSerialNumber(), 3, 10, QChar(' ')).arg(dig.GetDPPString().c_str()));
|
||||||
}//else{
|
}
|
||||||
//LogMsg(QString("... Nothing at port: %1, board: %2.").arg(port).arg(board));
|
|
||||||
//}
|
|
||||||
dig.CloseDigitizer();
|
dig.CloseDigitizer();
|
||||||
QCoreApplication::processEvents(); //to prevent Qt said application not responding.
|
QCoreApplication::processEvents(); //to prevent Qt said application not responding.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}else{ // optical fiber
|
||||||
|
|
||||||
|
for(int port = 0; port < MaxNPorts; port++){
|
||||||
|
|
||||||
|
for( int board = 0; board < MaxNBoards; board ++){ /// max number of diasy chain
|
||||||
|
Digitizer dig;
|
||||||
|
dig.OpenDigitizer(board, port);
|
||||||
|
if( dig.IsConnected() ){
|
||||||
|
nDigi++;
|
||||||
|
portList.push_back(std::pair(board, port));
|
||||||
|
LogMsg(QString("... Found at port: %1, board: %2. SN: %3 %4").arg(port).arg(board).arg(dig.GetSerialNumber(), 3, 10, QChar(' ')).arg(dig.GetDPPString().c_str()));
|
||||||
|
}
|
||||||
|
dig.CloseDigitizer();
|
||||||
|
QCoreApplication::processEvents(); //to prevent Qt said application not responding.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
logMsgHTMLMode = true;
|
logMsgHTMLMode = true;
|
||||||
|
|
||||||
if( nDigi == 0 ) {
|
if( nDigi == 0 ) {
|
||||||
|
@ -692,7 +741,7 @@ void MainWindow::OpenDigitizers(){
|
||||||
canvas->FillHistograms();
|
canvas->FillHistograms();
|
||||||
});
|
});
|
||||||
|
|
||||||
LogMsg(QString("Done. Opened %1 digitizer(s).").arg(nDigi));
|
LogMsg("====== <font style=\"color: blue;\"><b>" + QString("Done. Opened %1 digitizer(s).").arg(nDigi) + "</b></font> =====");
|
||||||
|
|
||||||
WaitForDigitizersOpen(false);
|
WaitForDigitizersOpen(false);
|
||||||
bnStartACQ->setStyleSheet("background-color: green;");
|
bnStartACQ->setStyleSheet("background-color: green;");
|
||||||
|
@ -835,6 +884,7 @@ void MainWindow::SetupScalar(){
|
||||||
|
|
||||||
lbLastUpdateTime = nullptr;
|
lbLastUpdateTime = nullptr;
|
||||||
lbScalarACQStatus = nullptr;
|
lbScalarACQStatus = nullptr;
|
||||||
|
lbTotalFileSize = nullptr;
|
||||||
|
|
||||||
scalarThread = new TimingThread(scalar);
|
scalarThread = new TimingThread(scalar);
|
||||||
scalarThread->SetWaitTimeinSec(1.0);
|
scalarThread->SetWaitTimeinSec(1.0);
|
||||||
|
@ -845,11 +895,12 @@ void MainWindow::SetupScalar(){
|
||||||
if( digi[k]->GetNumInputCh() > maxNChannel ) maxNChannel = digi[k]->GetNumInputCh();
|
if( digi[k]->GetNumInputCh() > maxNChannel ) maxNChannel = digi[k]->GetNumInputCh();
|
||||||
}
|
}
|
||||||
|
|
||||||
scalar->setGeometry(0, 0, 100 + nDigi * 200, 200 + maxNChannel * 20);
|
scalar->setGeometry(0, 0, 50 + nDigi * 240, 160 + maxNChannel * 25);
|
||||||
|
|
||||||
if( lbLastUpdateTime == nullptr ){
|
if( lbLastUpdateTime == nullptr ){
|
||||||
lbLastUpdateTime = new QLabel("Last update : NA", scalar);
|
lbLastUpdateTime = new QLabel("Last update : NA", scalar);
|
||||||
lbScalarACQStatus = new QLabel("ACQ status", scalar);
|
lbScalarACQStatus = new QLabel("ACQ status", scalar);
|
||||||
|
lbTotalFileSize = new QLabel("Total File Size", scalar);
|
||||||
}
|
}
|
||||||
|
|
||||||
lbLastUpdateTime->setAlignment(Qt::AlignRight);
|
lbLastUpdateTime->setAlignment(Qt::AlignRight);
|
||||||
|
@ -860,13 +911,17 @@ void MainWindow::SetupScalar(){
|
||||||
scalarLayout->removeWidget(lbScalarACQStatus);
|
scalarLayout->removeWidget(lbScalarACQStatus);
|
||||||
scalarLayout->addWidget(lbScalarACQStatus, 0, 1 + nDigi);
|
scalarLayout->addWidget(lbScalarACQStatus, 0, 1 + nDigi);
|
||||||
|
|
||||||
int rowID = 3;
|
lbTotalFileSize->setAlignment(Qt::AlignCenter);
|
||||||
///==== create the header row
|
scalarLayout->removeWidget(lbTotalFileSize);
|
||||||
|
scalarLayout->addWidget(lbTotalFileSize, 1, 0, 1, 1 + 2*nDigi);
|
||||||
|
|
||||||
|
///==== create the header row
|
||||||
|
int rowID = 4;
|
||||||
for( int ch = 0; ch < maxNChannel; ch++){
|
for( int ch = 0; ch < maxNChannel; ch++){
|
||||||
|
|
||||||
if( ch == 0 ){
|
if( ch == 0 ){
|
||||||
QLabel * lbCH_H = new QLabel("Ch", scalar);
|
QLabel * lbCH_H = new QLabel("Ch", scalar);
|
||||||
|
lbCH_H->setAlignment(Qt::AlignCenter);
|
||||||
scalarLayout->addWidget(lbCH_H, rowID, 0);
|
scalarLayout->addWidget(lbCH_H, rowID, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -881,22 +936,16 @@ void MainWindow::SetupScalar(){
|
||||||
leAccept = new QLineEdit**[nDigi];
|
leAccept = new QLineEdit**[nDigi];
|
||||||
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){
|
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){
|
||||||
rowID = 2;
|
rowID = 2;
|
||||||
leTrigger[iDigi] = new QLineEdit *[digi[iDigi]->GetNumInputCh()];
|
|
||||||
leAccept[iDigi] = new QLineEdit *[digi[iDigi]->GetNumInputCh()];
|
|
||||||
uint32_t chMask = digi[iDigi]->GetRegChannelMask();
|
uint32_t chMask = digi[iDigi]->GetRegChannelMask();
|
||||||
for( int ch = 0; ch < digi[iDigi]->GetNumInputCh(); ch++){
|
|
||||||
|
|
||||||
if( ch == 0 ){
|
|
||||||
QWidget * hBox = new QWidget(scalar);
|
QWidget * hBox = new QWidget(scalar);
|
||||||
QHBoxLayout * hBoxLayout = new QHBoxLayout(hBox);
|
QHBoxLayout * hBoxLayout = new QHBoxLayout(hBox);
|
||||||
scalarLayout->addWidget(hBox, rowID, 2*iDigi+1, 1, 2);
|
scalarLayout->addWidget(hBox, rowID, 2*iDigi+1, 1, 2);
|
||||||
|
|
||||||
lbAggCount[iDigi] = new QLabel("AggCount/ReadCount", scalar);
|
|
||||||
lbAggCount[iDigi]->setAlignment(Qt::AlignLeft | Qt::AlignCenter);
|
|
||||||
hBoxLayout->addWidget(lbAggCount[iDigi]);
|
|
||||||
|
|
||||||
QLabel * lbDigi = new QLabel("Digi-" + QString::number(digi[iDigi]->GetSerialNumber()), scalar);
|
QLabel * lbDigi = new QLabel("Digi-" + QString::number(digi[iDigi]->GetSerialNumber()), scalar);
|
||||||
lbDigi->setAlignment(Qt::AlignRight | Qt::AlignCenter);
|
// QLabel * lbDigi = new QLabel(QString::number(digi[iDigi]->GetSerialNumber()), scalar);
|
||||||
|
// lbDigi->setAlignment(Qt::AlignRight | Qt::AlignCenter);
|
||||||
|
lbDigi->setAlignment(Qt::AlignCenter);
|
||||||
hBoxLayout->addWidget(lbDigi);
|
hBoxLayout->addWidget(lbDigi);
|
||||||
|
|
||||||
runStatus[iDigi] = new QPushButton("", scalar);
|
runStatus[iDigi] = new QPushButton("", scalar);
|
||||||
|
@ -906,24 +955,42 @@ void MainWindow::SetupScalar(){
|
||||||
runStatus[iDigi]->setToolTipDuration(-1);
|
runStatus[iDigi]->setToolTipDuration(-1);
|
||||||
hBoxLayout->addWidget(runStatus[iDigi]);
|
hBoxLayout->addWidget(runStatus[iDigi]);
|
||||||
|
|
||||||
rowID ++;
|
rowID = 3;
|
||||||
|
QWidget * hBox2 = new QWidget(scalar);
|
||||||
|
QHBoxLayout * hBoxLayout2 = new QHBoxLayout(hBox2);
|
||||||
|
scalarLayout->addWidget(hBox2, rowID, 2*iDigi+1, 1, 2);
|
||||||
|
|
||||||
|
lbAggCount[iDigi] = new QLabel("AggCount/ReadCount", scalar);
|
||||||
|
lbAggCount[iDigi]->setAlignment(Qt::AlignLeft | Qt::AlignCenter);
|
||||||
|
hBoxLayout2->addWidget(lbAggCount[iDigi]);
|
||||||
|
|
||||||
|
lbFileSize[iDigi] = new QLabel("File Size", scalar);
|
||||||
|
lbFileSize[iDigi]->setAlignment(Qt::AlignLeft | Qt::AlignCenter);
|
||||||
|
hBoxLayout2->addWidget(lbFileSize[iDigi]);
|
||||||
|
|
||||||
|
rowID = 4;
|
||||||
QLabel * lbA = new QLabel("Trig. [Hz]", scalar);
|
QLabel * lbA = new QLabel("Trig. [Hz]", scalar);
|
||||||
lbA->setAlignment(Qt::AlignCenter);
|
lbA->setAlignment(Qt::AlignCenter);
|
||||||
scalarLayout->addWidget(lbA, rowID, 2*iDigi+1);
|
scalarLayout->addWidget(lbA, rowID, 2*iDigi+1);
|
||||||
QLabel * lbB = new QLabel("Accp. [Hz]", scalar);
|
QLabel * lbB = new QLabel("Accp. [Hz]", scalar);
|
||||||
lbB->setAlignment(Qt::AlignCenter);
|
lbB->setAlignment(Qt::AlignCenter);
|
||||||
scalarLayout->addWidget(lbB, rowID, 2*iDigi+2);
|
scalarLayout->addWidget(lbB, rowID, 2*iDigi+2);
|
||||||
}
|
|
||||||
|
leTrigger[iDigi] = new QLineEdit *[digi[iDigi]->GetNumInputCh()];
|
||||||
|
leAccept[iDigi] = new QLineEdit *[digi[iDigi]->GetNumInputCh()];
|
||||||
|
|
||||||
|
for( int ch = 0; ch < digi[iDigi]->GetNumInputCh(); ch++){
|
||||||
|
|
||||||
rowID ++;
|
rowID ++;
|
||||||
leTrigger[iDigi][ch] = new QLineEdit(scalar);
|
leTrigger[iDigi][ch] = new QLineEdit(scalar);
|
||||||
leTrigger[iDigi][ch]->setReadOnly(true);
|
leTrigger[iDigi][ch]->setReadOnly(true);
|
||||||
|
leTrigger[iDigi][ch]->setFixedSize(120, 25);
|
||||||
leTrigger[iDigi][ch]->setAlignment(Qt::AlignRight);
|
leTrigger[iDigi][ch]->setAlignment(Qt::AlignRight);
|
||||||
scalarLayout->addWidget(leTrigger[iDigi][ch], rowID, 2*iDigi+1);
|
scalarLayout->addWidget(leTrigger[iDigi][ch], rowID, 2*iDigi+1);
|
||||||
|
|
||||||
leAccept[iDigi][ch] = new QLineEdit(scalar);
|
leAccept[iDigi][ch] = new QLineEdit(scalar);
|
||||||
leAccept[iDigi][ch]->setReadOnly(true);
|
leAccept[iDigi][ch]->setReadOnly(true);
|
||||||
|
leAccept[iDigi][ch]->setFixedSize(120, 25);
|
||||||
leAccept[iDigi][ch]->setAlignment(Qt::AlignRight);
|
leAccept[iDigi][ch]->setAlignment(Qt::AlignRight);
|
||||||
leAccept[iDigi][ch]->setStyleSheet("background-color: #F0F0F0;");
|
leAccept[iDigi][ch]->setStyleSheet("background-color: #F0F0F0;");
|
||||||
|
|
||||||
|
@ -984,7 +1051,9 @@ void MainWindow::UpdateScalar(){
|
||||||
|
|
||||||
// digi[0]->GetData()->PrintAllData();
|
// 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"));
|
||||||
|
lbLastUpdateTime->setText(QDateTime::currentDateTime().toString("MM/dd hh:mm:ss"));
|
||||||
|
scalarCount ++;
|
||||||
|
|
||||||
uint64_t totalFileSize = 0;
|
uint64_t totalFileSize = 0;
|
||||||
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){
|
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){
|
||||||
|
@ -993,9 +1062,9 @@ void MainWindow::UpdateScalar(){
|
||||||
uint32_t acqStatus = digi[iDigi]->GetACQStatusFromMemory();
|
uint32_t acqStatus = digi[iDigi]->GetACQStatusFromMemory();
|
||||||
//printf("Digi-%d : acq on/off ? : %d \n", digi[iDigi]->GetSerialNumber(), (acqStatus >> 2) & 0x1 );
|
//printf("Digi-%d : acq on/off ? : %d \n", digi[iDigi]->GetSerialNumber(), (acqStatus >> 2) & 0x1 );
|
||||||
if( ( acqStatus >> 2 ) & 0x1 ){
|
if( ( acqStatus >> 2 ) & 0x1 ){
|
||||||
runStatus[iDigi]->setStyleSheet("background-color : green;");
|
if( runStatus[iDigi]->styleSheet() == "") runStatus[iDigi]->setStyleSheet("background-color : green;");
|
||||||
}else{
|
}else{
|
||||||
runStatus[iDigi]->setStyleSheet("");
|
if( runStatus[iDigi]->styleSheet() != "") runStatus[iDigi]->setStyleSheet("");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(digiSettings && digiSettings->isVisible() && digiSettings->GetTabID() == iDigi) digiSettings->UpdateACQStatus(acqStatus);
|
if(digiSettings && digiSettings->isVisible() && digiSettings->GetTabID() == iDigi) digiSettings->UpdateACQStatus(acqStatus);
|
||||||
|
@ -1006,6 +1075,7 @@ void MainWindow::UpdateScalar(){
|
||||||
blockCountStr += "/" + QString::number(readDataThread[iDigi]->GetReadCount());
|
blockCountStr += "/" + QString::number(readDataThread[iDigi]->GetReadCount());
|
||||||
readDataThread[iDigi]->SetReadCountZero();
|
readDataThread[iDigi]->SetReadCountZero();
|
||||||
lbAggCount[iDigi]->setText(blockCountStr);
|
lbAggCount[iDigi]->setText(blockCountStr);
|
||||||
|
lbFileSize[iDigi]->setText(QString::number(digi[iDigi]->GetData()->GetTotalFileSize()/1024./1024., 'f', 3) + " MB");
|
||||||
|
|
||||||
digi[iDigi]->GetData()->CalTriggerRate(); //this will reset NumEventDecode & AggCount
|
digi[iDigi]->GetData()->CalTriggerRate(); //this will reset NumEventDecode & AggCount
|
||||||
if( chkSaveData->isChecked() ) totalFileSize += digi[iDigi]->GetData()->GetTotalFileSize();
|
if( chkSaveData->isChecked() ) totalFileSize += digi[iDigi]->GetData()->GetTotalFileSize();
|
||||||
|
@ -1021,16 +1091,22 @@ void MainWindow::UpdateScalar(){
|
||||||
leAccept[iDigi][i]->setText(b);
|
leAccept[iDigi][i]->setText(b);
|
||||||
|
|
||||||
if( influx && a != "inf" ){
|
if( influx && a != "inf" ){
|
||||||
influx->AddDataPoint("Rate,Bd="+std::to_string(digi[iDigi]->GetSerialNumber()) + ",Ch=" + QString::number(i).rightJustified(2, '0').toStdString() + " value=" + a.toStdString());
|
influx->AddDataPoint("TrigRate,Bd="+std::to_string(digi[iDigi]->GetSerialNumber()) + ",Ch=" + QString::number(i).rightJustified(2, '0').toStdString() + " value=" + a.toStdString());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
digiMTX[iDigi].unlock();
|
digiMTX[iDigi].unlock();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( influx ){
|
lbTotalFileSize->setText("Total Data Size : " + QString::number(totalFileSize/1024./1024., 'f', 3) + " MB");
|
||||||
|
|
||||||
|
repaint();
|
||||||
|
scalar->repaint();
|
||||||
|
|
||||||
|
if( influx && scalarCount >= 3){
|
||||||
if( chkSaveData->isChecked() ) {
|
if( chkSaveData->isChecked() ) {
|
||||||
influx->AddDataPoint("RunID value=" + std::to_string(runID));
|
influx->AddDataPoint("RunID value=" + std::to_string(runID));
|
||||||
influx->AddDataPoint("FileSize value=" + std::to_string(totalFileSize));
|
influx->AddDataPoint("FileSize value=" + std::to_string(totalFileSize));
|
||||||
|
@ -1038,6 +1114,7 @@ void MainWindow::UpdateScalar(){
|
||||||
//nflux->PrintDataPoints();
|
//nflux->PrintDataPoints();
|
||||||
influx->WriteData(dataBaseName.toStdString());
|
influx->WriteData(dataBaseName.toStdString());
|
||||||
influx->ClearDataPointsBuffer();
|
influx->ClearDataPointsBuffer();
|
||||||
|
scalarCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1103,6 +1180,7 @@ void MainWindow::StartACQ(){
|
||||||
bnStopACQ->setStyleSheet("background-color: red;");
|
bnStopACQ->setStyleSheet("background-color: red;");
|
||||||
bnOpenScope->setEnabled(false);
|
bnOpenScope->setEnabled(false);
|
||||||
cbAutoRun->setEnabled(false);
|
cbAutoRun->setEnabled(false);
|
||||||
|
bnSync->setEnabled(false);
|
||||||
|
|
||||||
if( digiSettings ) digiSettings->setEnabled(false);
|
if( digiSettings ) digiSettings->setEnabled(false);
|
||||||
|
|
||||||
|
@ -1132,6 +1210,9 @@ void MainWindow::StartACQ(){
|
||||||
|
|
||||||
void MainWindow::StopACQ(){
|
void MainWindow::StopACQ(){
|
||||||
DebugPrint("%s", "FSUDAQ");
|
DebugPrint("%s", "FSUDAQ");
|
||||||
|
|
||||||
|
QCoreApplication::processEvents();
|
||||||
|
|
||||||
if( digi == nullptr ) return;
|
if( digi == nullptr ) return;
|
||||||
|
|
||||||
bool commentResult = true;
|
bool commentResult = true;
|
||||||
|
@ -1181,6 +1262,7 @@ void MainWindow::StopACQ(){
|
||||||
bnStopACQ->setStyleSheet("");
|
bnStopACQ->setStyleSheet("");
|
||||||
bnOpenScope->setEnabled(true);
|
bnOpenScope->setEnabled(true);
|
||||||
cbAutoRun->setEnabled(true);
|
cbAutoRun->setEnabled(true);
|
||||||
|
bnSync->setEnabled(true);
|
||||||
|
|
||||||
if( scalar ){
|
if( scalar ){
|
||||||
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){
|
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){
|
||||||
|
@ -1221,6 +1303,9 @@ void MainWindow::StopACQ(){
|
||||||
chkSaveData->setEnabled(true);
|
chkSaveData->setEnabled(true);
|
||||||
bnDigiSettings->setEnabled(true);
|
bnDigiSettings->setEnabled(true);
|
||||||
|
|
||||||
|
repaint();
|
||||||
|
printf("================ end of %s \n", __func__);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::AutoRun(){
|
void MainWindow::AutoRun(){
|
||||||
|
@ -1631,7 +1716,8 @@ void MainWindow::WriteRunTimestamp(bool isStartRun){
|
||||||
//***************************************************************
|
//***************************************************************
|
||||||
//***************************************************************
|
//***************************************************************
|
||||||
void MainWindow::OpenScope(){
|
void MainWindow::OpenScope(){
|
||||||
|
DebugPrint("%s", "FSUDAQ");
|
||||||
|
QCoreApplication::processEvents();
|
||||||
if( scope == nullptr ) {
|
if( scope == nullptr ) {
|
||||||
scope = new Scope(digi, nDigi, readDataThread);
|
scope = new Scope(digi, nDigi, readDataThread);
|
||||||
connect(scope, &Scope::SendLogMsg, this, &MainWindow::LogMsg);
|
connect(scope, &Scope::SendLogMsg, this, &MainWindow::LogMsg);
|
||||||
|
@ -1704,7 +1790,6 @@ void MainWindow::OpenDigiSettings(){
|
||||||
digiSettings->show();
|
digiSettings->show();
|
||||||
digiSettings->activateWindow();
|
digiSettings->activateWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//***************************************************************
|
//***************************************************************
|
||||||
|
@ -1724,6 +1809,7 @@ void MainWindow::OpenCanvas(){
|
||||||
//***************************************************************
|
//***************************************************************
|
||||||
void MainWindow::OpenAnalyzer(){
|
void MainWindow::OpenAnalyzer(){
|
||||||
DebugPrint("%s", "FSUDAQ");
|
DebugPrint("%s", "FSUDAQ");
|
||||||
|
|
||||||
int id = cbAnalyzer->currentData().toInt();
|
int id = cbAnalyzer->currentData().toInt();
|
||||||
|
|
||||||
if( id < 0 ) return;
|
if( id < 0 ) return;
|
||||||
|
@ -1737,6 +1823,8 @@ void MainWindow::OpenAnalyzer(){
|
||||||
if( id == 4 ) onlineAnalyzer = new MCP(digi, nDigi);
|
if( id == 4 ) onlineAnalyzer = new MCP(digi, nDigi);
|
||||||
if( id == 5 ) onlineAnalyzer = new PID(digi, nDigi);
|
if( id == 5 ) onlineAnalyzer = new PID(digi, nDigi);
|
||||||
if( id == 6 ) onlineAnalyzer = new RAISOR2(digi, nDigi);
|
if( id == 6 ) onlineAnalyzer = new RAISOR2(digi, nDigi);
|
||||||
|
if( id == 7 ) onlineAnalyzer = new TEST(digi, nDigi);
|
||||||
|
if( id == 8 ) onlineAnalyzer = new MCPandPSD(digi, nDigi);
|
||||||
if( id >= 0 ) onlineAnalyzer->show();
|
if( id >= 0 ) onlineAnalyzer->show();
|
||||||
}else{
|
}else{
|
||||||
|
|
||||||
|
@ -1749,6 +1837,8 @@ void MainWindow::OpenAnalyzer(){
|
||||||
if( id == 4 ) onlineAnalyzer = new MCP(digi, nDigi);
|
if( id == 4 ) onlineAnalyzer = new MCP(digi, nDigi);
|
||||||
if( id == 5 ) onlineAnalyzer = new PID(digi, nDigi);
|
if( id == 5 ) onlineAnalyzer = new PID(digi, nDigi);
|
||||||
if( id == 6 ) onlineAnalyzer = new RAISOR2(digi, nDigi);
|
if( id == 6 ) onlineAnalyzer = new RAISOR2(digi, nDigi);
|
||||||
|
if( id == 7 ) onlineAnalyzer = new TEST(digi, nDigi);
|
||||||
|
if( id == 8 ) onlineAnalyzer = new MCPandPSD(digi, nDigi);
|
||||||
if( id >= 0 ){
|
if( id >= 0 ){
|
||||||
onlineAnalyzer->show();
|
onlineAnalyzer->show();
|
||||||
onlineAnalyzer->activateWindow();
|
onlineAnalyzer->activateWindow();
|
||||||
|
@ -1888,6 +1978,8 @@ void MainWindow::SetUpInflux(){
|
||||||
|
|
||||||
void MainWindow::CheckElog(){
|
void MainWindow::CheckElog(){
|
||||||
DebugPrint("%s", "FSUDAQ");
|
DebugPrint("%s", "FSUDAQ");
|
||||||
|
LogMsg("---- Checking elog... please wait....");
|
||||||
|
printf("---- Checking elog... please wait....\n");
|
||||||
if( elogIP != "" && elogName != "" && elogUser != "" && elogPWD != "" ){
|
if( elogIP != "" && elogName != "" && elogUser != "" && elogPWD != "" ){
|
||||||
WriteElog("Testing communication.", "Testing communication.", "Other", 0);
|
WriteElog("Testing communication.", "Testing communication.", "Other", 0);
|
||||||
AppendElog("test append elog.");
|
AppendElog("test append elog.");
|
||||||
|
@ -1900,16 +1992,18 @@ void MainWindow::CheckElog(){
|
||||||
|
|
||||||
if( elogID >= 0 ) {
|
if( elogID >= 0 ) {
|
||||||
LogMsg("Elog testing OK.");
|
LogMsg("Elog testing OK.");
|
||||||
|
printf("Elog testing OK.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//QMessageBox::information(nullptr, "Information", "Elog write Fail.\nPlease set the elog User and PWD in the programSettings.txt.\nline 6 = user.\nline 7 = pwd.");
|
//QMessageBox::information(nullptr, "Information", "Elog write Fail.\nPlease set the elog User and PWD in the programSettings.txt.\nline 6 = user.\nline 7 = pwd.");
|
||||||
LogMsg("Elog testing Fail");
|
LogMsg("Elog testing Fail");
|
||||||
|
printf("Elog testing Fail\n");
|
||||||
if( elogIP == "" ) LogMsg("no elog IP");
|
if( elogIP == "" ) LogMsg("no elog IP");
|
||||||
if( elogName == "" ) LogMsg("no elog Name");
|
if( elogName == "" ) LogMsg("no elog Name");
|
||||||
if( elogUser == "" ) LogMsg("no elog User name. Please set it in the programSettings.txt, line 6.");
|
if( elogUser == "" ) LogMsg("no elog User name. Please set it in the programSettings.txt, line 6.");
|
||||||
if( elogPWD == "" ) LogMsg("no elog User pwd. Please set it in the programSettings.txt, line 7.");
|
if( elogPWD == "" ) LogMsg("no elog User pwd. Please set it in the programSettings.txt, line 7.");
|
||||||
if( elogID < 0 ) LogMsg("Possible elog IP, Name, User name, or pwd incorrect");
|
if( elogID < 0 ) LogMsg("Possible elog IP, Name, User name, pwd incorrect, or elog not installed.");
|
||||||
leElogIP->setEnabled(false);
|
leElogIP->setEnabled(false);
|
||||||
leElogName->setEnabled(false);
|
leElogName->setEnabled(false);
|
||||||
|
|
||||||
|
|
3
FSUDAQ.h
3
FSUDAQ.h
|
@ -135,6 +135,7 @@ private:
|
||||||
QLineEdit * leDatabaseName;
|
QLineEdit * leDatabaseName;
|
||||||
QPushButton * bnLock;
|
QPushButton * bnLock;
|
||||||
QString influxToken;
|
QString influxToken;
|
||||||
|
short scalarCount;
|
||||||
|
|
||||||
//@----- Elog
|
//@----- Elog
|
||||||
QString elogIP;
|
QString elogIP;
|
||||||
|
@ -171,6 +172,8 @@ private:
|
||||||
QLabel * lbLastUpdateTime;
|
QLabel * lbLastUpdateTime;
|
||||||
QLabel * lbScalarACQStatus;
|
QLabel * lbScalarACQStatus;
|
||||||
QLabel * lbAggCount[MaxNDigitizer];
|
QLabel * lbAggCount[MaxNDigitizer];
|
||||||
|
QLabel * lbFileSize[MaxNDigitizer];
|
||||||
|
QLabel * lbTotalFileSize;
|
||||||
|
|
||||||
//@----- Run Record
|
//@----- Run Record
|
||||||
QMainWindow * runRecord;
|
QMainWindow * runRecord;
|
||||||
|
|
|
@ -46,6 +46,8 @@ HEADERS += ClassData.h \
|
||||||
analyzers/EncoreAnalyzer.h \
|
analyzers/EncoreAnalyzer.h \
|
||||||
analyzers/RAISOR1.h \
|
analyzers/RAISOR1.h \
|
||||||
analyzers/RAISOR2.h \
|
analyzers/RAISOR2.h \
|
||||||
|
analyzers/TEST.h \
|
||||||
|
analyzers/MCPandPSD.h \
|
||||||
analyzers/MCP.h \
|
analyzers/MCP.h \
|
||||||
analyzers/PID.h
|
analyzers/PID.h
|
||||||
SOURCES += ClassDigitizer.cpp \
|
SOURCES += ClassDigitizer.cpp \
|
||||||
|
|
|
@ -49,10 +49,13 @@ public:
|
||||||
colorScale->setType(QCPAxis::atRight);
|
colorScale->setType(QCPAxis::atRight);
|
||||||
colorMap->setColorScale(colorScale);
|
colorMap->setColorScale(colorScale);
|
||||||
|
|
||||||
|
|
||||||
QCPColorGradient color;
|
QCPColorGradient color;
|
||||||
|
color.setNanHandling(QCPColorGradient::NanHandling::nhNanColor);
|
||||||
|
color.setNanColor(QColor("white"));
|
||||||
color.clearColorStops();
|
color.clearColorStops();
|
||||||
color.setColorStopAt( 0.0, QColor("white" ));
|
// color.setColorStopAt( 0.0, QColor("white" ));
|
||||||
color.setColorStopAt( 0.000001, QColor("purple" ));
|
color.setColorStopAt( 0.0, QColor("purple" ));
|
||||||
color.setColorStopAt( 0.2, QColor("blue"));
|
color.setColorStopAt( 0.2, QColor("blue"));
|
||||||
color.setColorStopAt( 0.4, QColor("cyan"));
|
color.setColorStopAt( 0.4, QColor("cyan"));
|
||||||
color.setColorStopAt( 0.6, QColor("green"));
|
color.setColorStopAt( 0.6, QColor("green"));
|
||||||
|
@ -187,20 +190,23 @@ public:
|
||||||
void SetXTitle(QString xTitle) { xAxis->setLabel(xTitle); }
|
void SetXTitle(QString xTitle) { xAxis->setLabel(xTitle); }
|
||||||
void SetYTitle(QString yTitle) { yAxis->setLabel(yTitle); }
|
void SetYTitle(QString yTitle) { yAxis->setLabel(yTitle); }
|
||||||
void Rebin(int xbin, double xmin, double xmax, int ybin, double ymin, double ymax);
|
void Rebin(int xbin, double xmin, double xmax, int ybin, double ymin, double ymax);
|
||||||
|
void RebinY(int ybin, double ymin, double ymax);
|
||||||
|
|
||||||
void SetChannelMap(bool onOff, int tickStep = 1) { isChannelMap = onOff; this->tickStep = tickStep;}
|
void SetChannelMap(bool onOff, int tickStep = 1) { isChannelMap = onOff; this->tickStep = tickStep;}
|
||||||
|
|
||||||
void UpdatePlot(){
|
void UpdatePlot(){
|
||||||
QCPColorGradient color;
|
// QCPColorGradient color;
|
||||||
color.clearColorStops();
|
// color.clearColorStops();
|
||||||
color.setColorStopAt( 0.0, QColor("white" ));
|
// color.setNanColor(QColor("white"));
|
||||||
color.setColorStopAt( 1.0/entry[1][1], QColor("purple" ));
|
// // color.setColorStopAt( 0.0, QColor("white" ));
|
||||||
color.setColorStopAt( 0.2, QColor("blue"));
|
// // color.setColorStopAt( 1.0/entry[1][1], QColor("purple" ));
|
||||||
color.setColorStopAt( 0.4, QColor("cyan"));
|
// color.setColorStopAt( 0.0, QColor("purple" ));
|
||||||
color.setColorStopAt( 0.6, QColor("green"));
|
// color.setColorStopAt( 0.2, QColor("blue"));
|
||||||
color.setColorStopAt( 0.8, QColor("yellow"));
|
// color.setColorStopAt( 0.4, QColor("cyan"));
|
||||||
color.setColorStopAt( 1.0, QColor("red"));
|
// color.setColorStopAt( 0.6, QColor("green"));
|
||||||
colorMap->setGradient(color);
|
// color.setColorStopAt( 0.8, QColor("yellow"));
|
||||||
|
// color.setColorStopAt( 1.0, QColor("red"));
|
||||||
|
// colorMap->setGradient(color);
|
||||||
|
|
||||||
colorMap->rescaleDataRange();
|
colorMap->rescaleDataRange();
|
||||||
|
|
||||||
|
@ -287,7 +293,11 @@ inline void Histogram2D::Fill(double x, double y){
|
||||||
|
|
||||||
if( xk == 1 && yk == 1 ) {
|
if( xk == 1 && yk == 1 ) {
|
||||||
double value = colorMap->data()->cell(xIndex, yIndex);
|
double value = colorMap->data()->cell(xIndex, yIndex);
|
||||||
|
if( std::isnan(value) ){
|
||||||
|
colorMap->data()->setCell(xIndex, yIndex, 1);
|
||||||
|
}else{
|
||||||
colorMap->data()->setCell(xIndex, yIndex, value + 1);
|
colorMap->data()->setCell(xIndex, yIndex, value + 1);
|
||||||
|
}
|
||||||
|
|
||||||
for( int i = 0; i < cutList.count(); i++){
|
for( int i = 0; i < cutList.count(); i++){
|
||||||
if( cutList[i].isEmpty() ) continue;
|
if( cutList[i].isEmpty() ) continue;
|
||||||
|
@ -309,6 +319,12 @@ inline void Histogram2D::Rebin(int xbin, double xmin, double xmax, int ybin, do
|
||||||
colorMap->data()->setSize(xBin, yBin);
|
colorMap->data()->setSize(xBin, yBin);
|
||||||
colorMap->data()->setRange(QCPRange(xMin, xMax), QCPRange(yMin, yMax));
|
colorMap->data()->setRange(QCPRange(xMin, xMax), QCPRange(yMin, yMax));
|
||||||
|
|
||||||
|
for( int i = 0; i < xBin; i++){
|
||||||
|
for( int j = 0; j < yBin; j++){
|
||||||
|
colorMap->data()->setCell(i, j, NAN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( isChannelMap ){
|
if( isChannelMap ){
|
||||||
QCPAxis * xAxis = colorMap->keyAxis();
|
QCPAxis * xAxis = colorMap->keyAxis();
|
||||||
xAxis->ticker()->setTickCount(xbin/tickStep);
|
xAxis->ticker()->setTickCount(xbin/tickStep);
|
||||||
|
@ -324,6 +340,10 @@ inline void Histogram2D::Rebin(int xbin, double xmin, double xmax, int ybin, do
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void Histogram2D::RebinY(int ybin, double ymin, double ymax){
|
||||||
|
Rebin(xBin-2, xMin, xMax, ybin, ymin, ymax);
|
||||||
|
}
|
||||||
|
|
||||||
inline void Histogram2D::Clear(){
|
inline void Histogram2D::Clear(){
|
||||||
DebugPrint("%s", "Histogram2D");
|
DebugPrint("%s", "Histogram2D");
|
||||||
for( int i = 0; i < 3; i ++){
|
for( int i = 0; i < 3; i ++){
|
||||||
|
@ -335,6 +355,11 @@ inline void Histogram2D::Clear(){
|
||||||
colorMap->data()->clear();
|
colorMap->data()->clear();
|
||||||
colorMap->data()->setSize(xBin, yBin);
|
colorMap->data()->setSize(xBin, yBin);
|
||||||
colorMap->data()->setRange(QCPRange(xMin, xMax), QCPRange(yMin, yMax));
|
colorMap->data()->setRange(QCPRange(xMin, xMax), QCPRange(yMin, yMax));
|
||||||
|
for( int i = 0; i < xBin; i++){
|
||||||
|
for( int j = 0; j < yBin; j++){
|
||||||
|
colorMap->data()->setCell(i, j, NAN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UpdatePlot();
|
UpdatePlot();
|
||||||
}
|
}
|
||||||
|
|
135
Scope.cpp
135
Scope.cpp
|
@ -68,31 +68,6 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh
|
||||||
plot->addSeries(dataTrace[i]);
|
plot->addSeries(dataTrace[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// testing software trapezoid filter
|
|
||||||
// FILE * fileIn = fopen("wave.txt", "r");
|
|
||||||
// if( fileIn != nullptr ){
|
|
||||||
|
|
||||||
// char buf[500];
|
|
||||||
// int v1, v2;
|
|
||||||
|
|
||||||
// QVector<QPointF> points;
|
|
||||||
// QVector<QPointF> points1;
|
|
||||||
// while( fgets(buf, sizeof(buf), fileIn) != nullptr ){
|
|
||||||
|
|
||||||
// if (sscanf(buf, "%d, %d", &v1, &v2) == 2) {
|
|
||||||
// points.append(QPointF(v1, v2 + 7000));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// fclose(fileIn);
|
|
||||||
|
|
||||||
// points1 = TrapezoidFilter(points, 400/16, 100, 200, 1000);
|
|
||||||
|
|
||||||
// dataTrace[0]->replace(points);
|
|
||||||
// dataTrace[1]->replace(points1);
|
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
dataTrace[0]->setPen(QPen(Qt::red, 2));
|
dataTrace[0]->setPen(QPen(Qt::red, 2));
|
||||||
dataTrace[1]->setPen(QPen(Qt::blue, 2));
|
dataTrace[1]->setPen(QPen(Qt::blue, 2));
|
||||||
dataTrace[2]->setPen(QPen(Qt::darkYellow, 1));
|
dataTrace[2]->setPen(QPen(Qt::darkYellow, 1));
|
||||||
|
@ -191,7 +166,6 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
bnReadSettingsFromBoard = new QPushButton("Refresh Settings", this);
|
bnReadSettingsFromBoard = new QPushButton("Refresh Settings", this);
|
||||||
layout->addWidget(bnReadSettingsFromBoard, rowID, 2);
|
layout->addWidget(bnReadSettingsFromBoard, rowID, 2);
|
||||||
connect(bnReadSettingsFromBoard, &QPushButton::clicked, this, &Scope::ReadSettingsFromBoard);
|
connect(bnReadSettingsFromBoard, &QPushButton::clicked, this, &Scope::ReadSettingsFromBoard);
|
||||||
|
@ -257,18 +231,21 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh
|
||||||
layout->addWidget(bnScopeStart, rowID, 0);
|
layout->addWidget(bnScopeStart, rowID, 0);
|
||||||
connect(bnScopeStart, &QPushButton::clicked, this, [=](){this->StartScope();});
|
connect(bnScopeStart, &QPushButton::clicked, this, [=](){this->StartScope();});
|
||||||
|
|
||||||
|
chkSoleRun = new QCheckBox("Only this channel", this);
|
||||||
|
layout->addWidget(chkSoleRun, rowID, 1);
|
||||||
|
|
||||||
bnScopeStop = new QPushButton("Stop", this);
|
bnScopeStop = new QPushButton("Stop", this);
|
||||||
layout->addWidget(bnScopeStop, rowID, 1);
|
layout->addWidget(bnScopeStop, rowID, 2);
|
||||||
connect(bnScopeStop, &QPushButton::clicked, this, &Scope::StopScope);
|
connect(bnScopeStop, &QPushButton::clicked, this, &Scope::StopScope);
|
||||||
|
|
||||||
QLabel * lbTriggerRate = new QLabel("Trigger Rate [Hz] : ", this);
|
QLabel * lbTriggerRate = new QLabel("Trigger Rate [Hz] : ", this);
|
||||||
lbTriggerRate->setAlignment(Qt::AlignCenter | Qt::AlignRight);
|
lbTriggerRate->setAlignment(Qt::AlignCenter | Qt::AlignRight);
|
||||||
layout->addWidget(lbTriggerRate, rowID, 2);
|
layout->addWidget(lbTriggerRate, rowID, 3);
|
||||||
|
|
||||||
leTriggerRate = new QLineEdit(this);
|
leTriggerRate = new QLineEdit(this);
|
||||||
leTriggerRate->setAlignment(Qt::AlignRight);
|
leTriggerRate->setAlignment(Qt::AlignRight);
|
||||||
leTriggerRate->setReadOnly(true);
|
leTriggerRate->setReadOnly(true);
|
||||||
layout->addWidget(leTriggerRate, rowID, 3);
|
layout->addWidget(leTriggerRate, rowID, 4);
|
||||||
|
|
||||||
QPushButton * bnClose = new QPushButton("Close", this);
|
QPushButton * bnClose = new QPushButton("Close", this);
|
||||||
layout->addWidget(bnClose, rowID, 6);
|
layout->addWidget(bnClose, rowID, 6);
|
||||||
|
@ -365,6 +342,59 @@ void Scope::StartScope(){
|
||||||
//TODO set other channel to be no trace;
|
//TODO set other channel to be no trace;
|
||||||
emit UpdateOtherPanels();
|
emit UpdateOtherPanels();
|
||||||
|
|
||||||
|
if( chkSoleRun->isChecked() ){
|
||||||
|
|
||||||
|
int ID = cbScopeDigi->currentIndex();
|
||||||
|
int ch = cbScopeCh->currentIndex();
|
||||||
|
oldDigi = ID;
|
||||||
|
oldCh = ch;
|
||||||
|
|
||||||
|
//save present settings, channleMap, trigger condition
|
||||||
|
traceOn[ID] = digi[ID]->IsRecordTrace();
|
||||||
|
digi[ID]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, 1, -1);
|
||||||
|
chMask = digi[ID]->GetSettingFromMemory(DPP::RegChannelEnableMask);
|
||||||
|
|
||||||
|
if( digi[ID]->GetDPPType() == DPPTypeCode::DPP_PHA_CODE ){
|
||||||
|
dppAlg = digi[ID]->GetSettingFromMemory(DPP::DPPAlgorithmControl, ch);
|
||||||
|
dppAlg2 = digi[ID]->GetSettingFromMemory(DPP::PHA::DPPAlgorithmControl2_G, ch);
|
||||||
|
|
||||||
|
digi[ID]->SetBits(DPP::DPPAlgorithmControl, DPP::Bit_DPPAlgorithmControl_PHA::TriggerMode, 0, ch);
|
||||||
|
digi[ID]->SetBits(DPP::DPPAlgorithmControl, DPP::Bit_DPPAlgorithmControl_PHA::DisableSelfTrigger, 0, ch);
|
||||||
|
|
||||||
|
digi[ID]->SetBits(DPP::PHA::DPPAlgorithmControl2_G, DPP::PHA::Bit_DPPAlgorithmControl2::LocalShapeTriggerMode, 0, ch);
|
||||||
|
digi[ID]->SetBits(DPP::PHA::DPPAlgorithmControl2_G, DPP::PHA::Bit_DPPAlgorithmControl2::LocalTrigValidMode, 0, ch);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if( digi[ID]->GetDPPType() == DPPTypeCode::DPP_PSD_CODE ){
|
||||||
|
dppAlg = digi[ID]->GetSettingFromMemory(DPP::DPPAlgorithmControl, ch);
|
||||||
|
dppAlg2 = digi[ID]->GetSettingFromMemory(DPP::PSD::DPPAlgorithmControl2_G, ch);
|
||||||
|
|
||||||
|
digi[ID]->SetBits(DPP::DPPAlgorithmControl, DPP::Bit_DPPAlgorithmControl_PHA::TriggerMode, 0, ch);
|
||||||
|
digi[ID]->SetBits(DPP::DPPAlgorithmControl, DPP::Bit_DPPAlgorithmControl_PHA::DisableSelfTrigger, 0, ch);
|
||||||
|
|
||||||
|
digi[ID]->SetBits(DPP::PSD::DPPAlgorithmControl2_G, DPP::PSD::Bit_DPPAlgorithmControl2::LocalShapeTriggerMode, 0, ch);
|
||||||
|
digi[ID]->SetBits(DPP::PSD::DPPAlgorithmControl2_G, DPP::PSD::Bit_DPPAlgorithmControl2::LocalTrigValidMode, 0, ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( digi[ID]->GetDPPType() == DPPTypeCode::DPP_QDC_CODE ){
|
||||||
|
dppAlg = digi[ID]->GetSettingFromMemory(DPP::QDC::DPPAlgorithmControl, ch);
|
||||||
|
digi[ID]->SetBits(DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::TriggerMode, 0, ch); //set self-triiger
|
||||||
|
}
|
||||||
|
|
||||||
|
digi[ID]->WriteRegister(DPP::RegChannelEnableMask, (1 << ch));
|
||||||
|
|
||||||
|
//=========== start
|
||||||
|
digi[ID]->WriteRegister(DPP::SoftwareClear_W, 1);
|
||||||
|
|
||||||
|
readDataThread[ID]->SetScopeMode(true);
|
||||||
|
readDataThread[ID]->SetSaveData(false);
|
||||||
|
|
||||||
|
digi[ID]->StartACQ();
|
||||||
|
readDataThread[ID]->start();
|
||||||
|
|
||||||
|
}else{
|
||||||
|
|
||||||
for( int iDigi = (int)nDigi-1 ; iDigi >= 0; iDigi --){
|
for( int iDigi = (int)nDigi-1 ; iDigi >= 0; iDigi --){
|
||||||
|
|
||||||
traceOn[iDigi] = digi[iDigi]->IsRecordTrace(); //remember setting
|
traceOn[iDigi] = digi[iDigi]->IsRecordTrace(); //remember setting
|
||||||
|
@ -390,6 +420,8 @@ void Scope::StartScope(){
|
||||||
// printf("----- readDataThread running ? %d.\n", readDataThread[iDigi]->isRunning());
|
// printf("----- readDataThread running ? %d.\n", readDataThread[iDigi]->isRunning());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
updateTraceThread->start();
|
updateTraceThread->start();
|
||||||
updateScalarThread->start();
|
updateScalarThread->start();
|
||||||
|
|
||||||
|
@ -398,6 +430,8 @@ void Scope::StartScope(){
|
||||||
bnScopeStop->setEnabled(true);
|
bnScopeStop->setEnabled(true);
|
||||||
bnScopeStop->setStyleSheet("background-color: red;");
|
bnScopeStop->setStyleSheet("background-color: red;");
|
||||||
|
|
||||||
|
chkSoleRun->setEnabled(false);
|
||||||
|
|
||||||
EnableControl(false);
|
EnableControl(false);
|
||||||
|
|
||||||
TellACQOnOff(true);
|
TellACQOnOff(true);
|
||||||
|
@ -419,12 +453,50 @@ void Scope::StopScope(){
|
||||||
updateScalarThread->quit();
|
updateScalarThread->quit();
|
||||||
updateScalarThread->exit();
|
updateScalarThread->exit();
|
||||||
|
|
||||||
|
if( chkSoleRun->isChecked() ){
|
||||||
|
|
||||||
|
//int ID = cbScopeDigi->currentIndex();
|
||||||
|
int ID = oldDigi;
|
||||||
|
|
||||||
|
if( readDataThread[ID]->isRunning() ){
|
||||||
|
readDataThread[ID]->Stop();
|
||||||
|
readDataThread[ID]->quit();
|
||||||
|
readDataThread[ID]->wait();
|
||||||
|
readDataThread[ID]->SetScopeMode(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
digiMTX[ID].lock();
|
||||||
|
digi[ID]->StopACQ();
|
||||||
|
digi[ID]->ReadACQStatus();
|
||||||
|
digiMTX[ID].unlock();
|
||||||
|
|
||||||
|
//restore setting
|
||||||
|
digi[ID]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, traceOn[ID], -1);
|
||||||
|
digi[ID]->WriteRegister(DPP::RegChannelEnableMask, chMask);
|
||||||
|
|
||||||
|
if( digi[ID]->GetDPPType() == DPPTypeCode::DPP_PHA_CODE ){
|
||||||
|
digi[ID]->WriteRegister(DPP::DPPAlgorithmControl, dppAlg, oldCh);
|
||||||
|
digi[ID]->WriteRegister(DPP::PHA::DPPAlgorithmControl2_G, dppAlg2, oldCh);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( digi[ID]->GetDPPType() == DPPTypeCode::DPP_PSD_CODE ){
|
||||||
|
digi[ID]->WriteRegister(DPP::DPPAlgorithmControl, dppAlg, oldCh);
|
||||||
|
digi[ID]->WriteRegister(DPP::PSD::DPPAlgorithmControl2_G, dppAlg2, oldCh);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( digi[ID]->GetDPPType() == DPPTypeCode::DPP_QDC_CODE ){
|
||||||
|
digi[ID]->WriteRegister(DPP::QDC::DPPAlgorithmControl, dppAlg, oldCh);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
|
||||||
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){
|
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){
|
||||||
|
|
||||||
if( readDataThread[iDigi]->isRunning() ){
|
if( readDataThread[iDigi]->isRunning() ){
|
||||||
readDataThread[iDigi]->Stop();
|
readDataThread[iDigi]->Stop();
|
||||||
readDataThread[iDigi]->quit();
|
readDataThread[iDigi]->quit();
|
||||||
readDataThread[iDigi]->wait();
|
readDataThread[iDigi]->wait();
|
||||||
|
readDataThread[iDigi]->SetScopeMode(false);
|
||||||
}
|
}
|
||||||
digiMTX[iDigi].lock();
|
digiMTX[iDigi].lock();
|
||||||
digi[iDigi]->StopACQ();
|
digi[iDigi]->StopACQ();
|
||||||
|
@ -437,6 +509,8 @@ void Scope::StopScope(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
emit UpdateOtherPanels();
|
emit UpdateOtherPanels();
|
||||||
|
|
||||||
bnScopeStart->setEnabled(true);
|
bnScopeStart->setEnabled(true);
|
||||||
|
@ -444,6 +518,7 @@ void Scope::StopScope(){
|
||||||
bnScopeStop->setEnabled(false);
|
bnScopeStop->setEnabled(false);
|
||||||
bnScopeStop->setStyleSheet("");
|
bnScopeStop->setStyleSheet("");
|
||||||
|
|
||||||
|
chkSoleRun->setEnabled(true);
|
||||||
runStatus->setStyleSheet("");
|
runStatus->setStyleSheet("");
|
||||||
|
|
||||||
EnableControl(true);
|
EnableControl(true);
|
||||||
|
@ -1230,7 +1305,7 @@ void Scope::UpdatePanel_QDC(){
|
||||||
sbDCOffset->setValue((1.0 - haha * 1.0 / 0xFFFF) * 100 );
|
sbDCOffset->setValue((1.0 - haha * 1.0 / 0xFFFF) * 100 );
|
||||||
|
|
||||||
//UpdateSpinBox(sbReordLength, DPP::QDC::RecordLength);
|
//UpdateSpinBox(sbReordLength, DPP::QDC::RecordLength);
|
||||||
sbReordLength->setValue(digi[ID]->ReadQDCRecordLength());
|
sbReordLength->setValue(digi[ID]->ReadQDCRecordLength() * 8 * 16);
|
||||||
UpdateSpinBox(sbPreTrigger, DPP::QDC::PreTrigger);
|
UpdateSpinBox(sbPreTrigger, DPP::QDC::PreTrigger);
|
||||||
|
|
||||||
UpdateSpinBox(sbShortGate, DPP::QDC::GateWidth);
|
UpdateSpinBox(sbShortGate, DPP::QDC::GateWidth);
|
||||||
|
|
6
Scope.h
6
Scope.h
|
@ -80,9 +80,12 @@ private:
|
||||||
bool isACQStarted;
|
bool isACQStarted;
|
||||||
int tick2ns;
|
int tick2ns;
|
||||||
int factor; // whether dual trace or not
|
int factor; // whether dual trace or not
|
||||||
bool traceOn[MaxNDigitizer];
|
|
||||||
int AggPerRead[MaxNDigitizer];
|
int AggPerRead[MaxNDigitizer];
|
||||||
|
|
||||||
|
bool traceOn[MaxNDigitizer];
|
||||||
|
uint32_t dppAlg, dppAlg2, chMask; //for single channel run
|
||||||
|
unsigned short oldCh, oldDigi;
|
||||||
|
|
||||||
ReadDataThread ** readDataThread;
|
ReadDataThread ** readDataThread;
|
||||||
TimingThread * updateTraceThread;
|
TimingThread * updateTraceThread;
|
||||||
TimingThread * updateScalarThread;
|
TimingThread * updateScalarThread;
|
||||||
|
@ -105,6 +108,7 @@ private:
|
||||||
QGroupBox * settingGroup;
|
QGroupBox * settingGroup;
|
||||||
QGridLayout * settingLayout;
|
QGridLayout * settingLayout;
|
||||||
|
|
||||||
|
QCheckBox * chkSoleRun;
|
||||||
QPushButton * runStatus;
|
QPushButton * runStatus;
|
||||||
|
|
||||||
/// common to PSD and PHA
|
/// common to PSD and PHA
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
#include "SingleSpectra.h"
|
#include "SingleSpectra.h"
|
||||||
|
|
||||||
#include <QValueAxis>
|
#include <QValueAxis>
|
||||||
#include <QRandomGenerator>
|
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
#include <QStandardItemModel>
|
#include <QStandardItemModel>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QRandomGenerator>
|
|
||||||
|
|
||||||
SingleSpectra::SingleSpectra(Digitizer ** digi, unsigned int nDigi, QString rawDataPath, QMainWindow * parent) : QMainWindow(parent){
|
SingleSpectra::SingleSpectra(Digitizer ** digi, unsigned int nDigi, QString rawDataPath, QMainWindow * parent) : QMainWindow(parent){
|
||||||
DebugPrint("%s", "SingleSpectra");
|
DebugPrint("%s", "SingleSpectra");
|
||||||
|
@ -13,11 +11,12 @@ SingleSpectra::SingleSpectra(Digitizer ** digi, unsigned int nDigi, QString rawD
|
||||||
this->nDigi = nDigi;
|
this->nDigi = nDigi;
|
||||||
this->rawDataPath = rawDataPath;
|
this->rawDataPath = rawDataPath;
|
||||||
|
|
||||||
maxFillTimeinMilliSec = 500;
|
maxFillTimeinMilliSec = 1000;
|
||||||
|
maxFillTimePerDigi = maxFillTimeinMilliSec/nDigi;
|
||||||
|
|
||||||
isSignalSlotActive = true;
|
isSignalSlotActive = true;
|
||||||
|
|
||||||
setWindowTitle("1-D Histograms");
|
setWindowTitle("Single Histograms");
|
||||||
setGeometry(0, 0, 1000, 800);
|
setGeometry(0, 0, 1000, 800);
|
||||||
//setWindowFlags( this->windowFlags() & ~Qt::WindowCloseButtonHint );
|
//setWindowFlags( this->windowFlags() & ~Qt::WindowCloseButtonHint );
|
||||||
|
|
||||||
|
@ -69,15 +68,103 @@ SingleSpectra::SingleSpectra(Digitizer ** digi, unsigned int nDigi, QString rawD
|
||||||
for( unsigned int i = 0; i < nDigi; i++){
|
for( unsigned int i = 0; i < nDigi; i++){
|
||||||
for( int j = 0; j < digi[i]->GetNumInputCh(); j++){
|
for( int j = 0; j < digi[i]->GetNumInputCh(); j++){
|
||||||
if( hist[i][j] ) hist[i][j]->Clear();
|
if( hist[i][j] ) hist[i][j]->Clear();
|
||||||
// lastFilledIndex[i][j] = -1;
|
|
||||||
// loopFilledIndex[i][j] = 0;
|
|
||||||
}
|
}
|
||||||
if( hist2D[i] ) hist2D[i]->Clear();
|
if( hist2D[i] ) hist2D[i]->Clear();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
QPushButton * bnRebinDigi = new QPushButton("Rebin Energy", this);
|
||||||
|
ctrlLayout->addWidget(bnRebinDigi, 0, 6, 1, 2);
|
||||||
|
connect(bnRebinDigi, &QPushButton::clicked, this, [=](){
|
||||||
|
int ID = cbDigi->currentIndex();
|
||||||
|
int ch = cbCh->currentIndex();
|
||||||
|
|
||||||
|
int a_Bin;
|
||||||
|
float a_Min, a_Max;
|
||||||
|
|
||||||
|
if( ch >= 0 ){
|
||||||
|
a_Bin = hist[ID][ch]->GetNBin();
|
||||||
|
a_Min = hist[ID][ch]->GetXMin();
|
||||||
|
a_Max = hist[ID][ch]->GetXMax();
|
||||||
|
}else{
|
||||||
|
a_Bin = hist2D[ID]->GetYNBin();
|
||||||
|
a_Min = hist2D[ID]->GetYMin();
|
||||||
|
a_Max = hist2D[ID]->GetYMax();
|
||||||
|
}
|
||||||
|
|
||||||
|
//pop up a dialog for nBin and ranhe
|
||||||
|
|
||||||
|
QDialog dialog(this);
|
||||||
|
dialog.setWindowTitle("Rebin histograms");
|
||||||
|
|
||||||
|
QFormLayout layout(&dialog);
|
||||||
|
|
||||||
|
QLabel * info = new QLabel(&dialog);
|
||||||
|
info->setStyleSheet("color:red;");
|
||||||
|
info->setText("This will also clear histogram!!");
|
||||||
|
layout.addRow(info);
|
||||||
|
|
||||||
|
QStringList nameList = {"Num. Bin", "x-Min", "x-Max"};
|
||||||
|
QLineEdit* lineEdit[3];
|
||||||
|
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
lineEdit[i] = new QLineEdit(&dialog);
|
||||||
|
layout.addRow(nameList[i] + " : ", lineEdit[i]);
|
||||||
|
}
|
||||||
|
lineEdit[0]->setText(QString::number(a_Bin));
|
||||||
|
lineEdit[1]->setText(QString::number(a_Min));
|
||||||
|
lineEdit[2]->setText(QString::number(a_Max));
|
||||||
|
|
||||||
|
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];
|
||||||
|
|
||||||
|
QObject::connect(&buttonBox, &QDialogButtonBox::accepted, [&]() {
|
||||||
|
int OKcount = 0;
|
||||||
|
bool conversionOk = true;
|
||||||
|
for( int i = 0; i < 3; i++ ){
|
||||||
|
number[i] = lineEdit[i]->text().toDouble(&conversionOk);
|
||||||
|
if( conversionOk ){
|
||||||
|
OKcount++;
|
||||||
|
}else{
|
||||||
|
msg->setText(nameList[i] + " is invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( OKcount == 3 ) {
|
||||||
|
if( number[2] > number[1] ) {
|
||||||
|
dialog.accept();
|
||||||
|
}else{
|
||||||
|
msg->setText(nameList[2] + " is smaller than " + nameList[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
QObject::connect(&buttonBox, &QDialogButtonBox::rejected, [&]() { dialog.reject();});
|
||||||
|
|
||||||
|
if( dialog.exec() == QDialog::Accepted ){
|
||||||
|
if( hist2D[ID] ) {
|
||||||
|
hist2D[ID]->RebinY((int)number[0], number[1], number[2]);
|
||||||
|
hist2D[ID]->rescaleAxes();
|
||||||
|
hist2D[ID]->UpdatePlot();
|
||||||
|
}
|
||||||
|
for( int j = 0; j < digi[ID]->GetNumInputCh(); j++){
|
||||||
|
if( hist[ID][j] ) {
|
||||||
|
hist[ID][j]->Rebin((int)number[0], number[1], number[2]);
|
||||||
|
hist[ID][j]->UpdatePlot();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
QCheckBox * chkIsFillHistogram = new QCheckBox("Fill Histograms", this);
|
QCheckBox * chkIsFillHistogram = new QCheckBox("Fill Histograms", this);
|
||||||
ctrlLayout->addWidget(chkIsFillHistogram, 0, 6);
|
ctrlLayout->addWidget(chkIsFillHistogram, 0, 8);
|
||||||
connect(chkIsFillHistogram, &QCheckBox::stateChanged, this, [=](int state){ fillHistograms = state;});
|
connect(chkIsFillHistogram, &QCheckBox::stateChanged, this, [=](int state){ fillHistograms = state;});
|
||||||
chkIsFillHistogram->setChecked(false);
|
chkIsFillHistogram->setChecked(false);
|
||||||
fillHistograms = false;
|
fillHistograms = false;
|
||||||
|
@ -205,47 +292,69 @@ void SingleSpectra::FillHistograms(){
|
||||||
// DebugPrint("%s", "SingleSpectra");
|
// DebugPrint("%s", "SingleSpectra");
|
||||||
if( !fillHistograms ) return;
|
if( !fillHistograms ) return;
|
||||||
|
|
||||||
unsigned short maxFillTimePerDigi = maxFillTimeinMilliSec/nDigi;
|
|
||||||
timespec t0, t1;
|
timespec t0, t1;
|
||||||
|
|
||||||
for( int i = 0; i < nDigi; i++){
|
QVector<int> randomDigiList = generateNonRepeatedCombination(nDigi);
|
||||||
|
|
||||||
|
// qDebug() << randomDigiList;
|
||||||
|
|
||||||
|
for( int i = 0; i < nDigi; i++){
|
||||||
|
int ID = randomDigiList[i];
|
||||||
|
|
||||||
|
QVector<int> randomChList = generateNonRepeatedCombination(digi[ID]->GetNumInputCh());
|
||||||
|
|
||||||
|
// qDebug() << randomChList;
|
||||||
|
|
||||||
|
digiMTX[ID].lock();
|
||||||
|
|
||||||
|
// digi[ID]->GetData()->PrintAllData();
|
||||||
|
|
||||||
digiMTX[i].lock();
|
|
||||||
clock_gettime(CLOCK_REALTIME, &t0);
|
clock_gettime(CLOCK_REALTIME, &t0);
|
||||||
for( int ch = 0; ch < digi[i]->GetNumInputCh(); ch ++ ){
|
for( int k = 0; k < digi[ID]->GetNumInputCh(); k ++ ){
|
||||||
int lastIndex = digi[i]->GetData()->GetDataIndex(ch);
|
int ch = randomChList[k];
|
||||||
|
int lastIndex = digi[ID]->GetData()->GetDataIndex(ch);
|
||||||
|
// printf("--- ch %2d | last index %d \n", ch, lastIndex);
|
||||||
if( lastIndex < 0 ) continue;
|
if( lastIndex < 0 ) continue;
|
||||||
|
|
||||||
int loopIndex = digi[i]->GetData()->GetLoopIndex(ch);
|
int loopIndex = digi[ID]->GetData()->GetLoopIndex(ch);
|
||||||
|
|
||||||
int temp1 = lastIndex + loopIndex * digi[i]->GetData()->GetDataSize();
|
int temp1 = lastIndex + loopIndex * digi[ID]->GetData()->GetDataSize();
|
||||||
int temp2 = lastFilledIndex[i][ch] + loopFilledIndex[i][ch] * digi[i]->GetData()->GetDataSize();
|
int temp2 = lastFilledIndex[ID][ch] + loopFilledIndex[ID][ch] * digi[ID]->GetData()->GetDataSize() + 1;
|
||||||
|
|
||||||
|
// printf("loopIndx : %d | ID now : %d, ID old : %d \n", loopIndex, temp1, temp2);
|
||||||
|
|
||||||
// printf("%d |%d %d \n", ch, temp2, temp1);
|
|
||||||
if( temp1 <= temp2 ) continue;
|
if( temp1 <= temp2 ) continue;
|
||||||
|
|
||||||
if( temp1 - temp2 > digi[i]->GetData()->GetDataSize() ) { //DefaultDataSize = 10k
|
if( temp1 - temp2 > digi[ID]->GetData()->GetDataSize() ) { //DefaultDataSize = 10k
|
||||||
temp2 = temp1 - digi[i]->GetData()->GetDataSize();
|
temp2 = temp1 - digi[ID]->GetData()->GetDataSize();
|
||||||
lastFilledIndex[i][ch] = lastIndex;
|
lastFilledIndex[ID][ch] = lastIndex;
|
||||||
lastFilledIndex[i][ch] = loopIndex - 1;
|
lastFilledIndex[ID][ch] = loopIndex - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// printf("ch %d | regulated ID now %d new %d | last fill idx %d\n", ch, temp2, temp1, lastFilledIndex[ID][ch]);
|
||||||
|
|
||||||
for( int j = 0 ; j <= temp1 - temp2; j ++){
|
for( int j = 0 ; j <= temp1 - temp2; j ++){
|
||||||
lastFilledIndex[i][ch] ++;
|
lastFilledIndex[ID][ch] ++;
|
||||||
if( lastFilledIndex[i][ch] > digi[i]->GetData()->GetDataSize() ) {
|
if( lastFilledIndex[ID][ch] > digi[ID]->GetData()->GetDataSize() ) {
|
||||||
lastFilledIndex[i][ch] = 0;
|
lastFilledIndex[ID][ch] = 0;
|
||||||
loopFilledIndex[i][ch] ++;
|
loopFilledIndex[ID][ch] ++;
|
||||||
}
|
}
|
||||||
hist[i][ch]->Fill( digi[i]->GetData()->GetEnergy(ch, lastFilledIndex[i][ch]));
|
|
||||||
hist2D[i]->Fill(ch, digi[i]->GetData()->GetEnergy(ch, lastFilledIndex[i][ch]));
|
uShort data = digi[ID]->GetData()->GetEnergy(ch, lastFilledIndex[ID][ch]);
|
||||||
|
|
||||||
|
// printf(" ch: %d, last fill idx : %d | %d \n", ch, lastFilledIndex[ID][ch], data);
|
||||||
|
|
||||||
|
hist[ID][ch]->Fill( data );
|
||||||
|
hist2D[ID]->Fill(ch, data);
|
||||||
}
|
}
|
||||||
if( histVisibility[i][ch] ) hist[i][ch]->UpdatePlot();
|
if( histVisibility[ID][ch] ) hist[ID][ch]->UpdatePlot();
|
||||||
if( hist2DVisibility[i] ) hist2D[i]->UpdatePlot();
|
|
||||||
|
|
||||||
clock_gettime(CLOCK_REALTIME, &t1);
|
clock_gettime(CLOCK_REALTIME, &t1);
|
||||||
if( t1.tv_nsec - t0.tv_nsec + (t1.tv_sec - t0.tv_sec)*1e9 > maxFillTimePerDigi * 1e6 ) break;
|
if( t1.tv_nsec - t0.tv_nsec + (t1.tv_sec - t0.tv_sec)*1e9 > maxFillTimePerDigi * 1e6 ) break;
|
||||||
}
|
}
|
||||||
digiMTX[i].unlock();
|
|
||||||
|
if( hist2DVisibility[ID] ) hist2D[ID]->UpdatePlot();
|
||||||
|
digiMTX[ID].unlock();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -340,3 +449,14 @@ void SingleSpectra::LoadSetting(){
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QVector<int> SingleSpectra::generateNonRepeatedCombination(int size) {
|
||||||
|
QVector<int> combination;
|
||||||
|
for (int i = 0; i < size; ++i) combination.append(i);
|
||||||
|
|
||||||
|
for (int i = 0; i < size - 1; ++i) {
|
||||||
|
int j = QRandomGenerator::global()->bounded(i, size);
|
||||||
|
combination.swapItemsAt(i, j);
|
||||||
|
}
|
||||||
|
return combination;
|
||||||
|
}
|
|
@ -10,6 +10,8 @@
|
||||||
#include <QLineEdit>
|
#include <QLineEdit>
|
||||||
#include <QGridLayout>
|
#include <QGridLayout>
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
|
#include <QVector>
|
||||||
|
#include <QRandomGenerator>
|
||||||
|
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
#include "ClassDigitizer.h"
|
#include "ClassDigitizer.h"
|
||||||
|
@ -38,6 +40,8 @@ public:
|
||||||
void SetMaxFillTime(unsigned short milliSec) { maxFillTimeinMilliSec = milliSec;}
|
void SetMaxFillTime(unsigned short milliSec) { maxFillTimeinMilliSec = milliSec;}
|
||||||
unsigned short GetMaxFillTime() const {return maxFillTimeinMilliSec;};
|
unsigned short GetMaxFillTime() const {return maxFillTimeinMilliSec;};
|
||||||
|
|
||||||
|
QVector<int> generateNonRepeatedCombination(int size);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void FillHistograms();
|
void FillHistograms();
|
||||||
void ChangeHistView();
|
void ChangeHistView();
|
||||||
|
@ -70,6 +74,7 @@ private:
|
||||||
QString rawDataPath;
|
QString rawDataPath;
|
||||||
|
|
||||||
unsigned short maxFillTimeinMilliSec;
|
unsigned short maxFillTimeinMilliSec;
|
||||||
|
unsigned short maxFillTimePerDigi;
|
||||||
|
|
||||||
bool isSignalSlotActive;
|
bool isSignalSlotActive;
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "CustomWidgets.h"
|
#include "CustomWidgets.h"
|
||||||
#include "MultiBuilder.h"
|
#include "MultiBuilder.h"
|
||||||
#include "ClassInfluxDB.h"
|
#include "ClassInfluxDB.h"
|
||||||
|
#include "math.h"
|
||||||
|
|
||||||
/**************************************
|
/**************************************
|
||||||
|
|
||||||
|
@ -32,6 +33,7 @@ derivative class should define the SetUpCanvas() and UpdateHistogram();
|
||||||
#include "Histogram1D.h"
|
#include "Histogram1D.h"
|
||||||
#include "Histogram2D.h"
|
#include "Histogram2D.h"
|
||||||
|
|
||||||
|
|
||||||
//^==============================================
|
//^==============================================
|
||||||
//^==============================================
|
//^==============================================
|
||||||
class Analyzer : public QMainWindow{
|
class Analyzer : public QMainWindow{
|
||||||
|
|
128
analyzers/MCP.h
128
analyzers/MCP.h
|
@ -8,7 +8,11 @@
|
||||||
*
|
*
|
||||||
* ******************************************/
|
* ******************************************/
|
||||||
#include "Analyser.h"
|
#include "Analyser.h"
|
||||||
|
#include <cmath>
|
||||||
|
#include "math.h"
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
//#define M_PI 3.14159265
|
||||||
|
|
||||||
class MCP : public Analyzer{
|
class MCP : public Analyzer{
|
||||||
|
|
||||||
|
@ -18,14 +22,14 @@ public:
|
||||||
MCP(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent = nullptr): Analyzer(digi, nDigi, parent){
|
MCP(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent = nullptr): Analyzer(digi, nDigi, parent){
|
||||||
|
|
||||||
|
|
||||||
SetUpdateTimeInSec(1.0);
|
SetUpdateTimeInSec(2.0);
|
||||||
|
|
||||||
RedefineEventBuilder({0}); // only builder for the 0-th digitizer.
|
RedefineEventBuilder({0}); // only builder for the 0-th digitizer.
|
||||||
tick2ns = digi[0]->GetTick2ns();
|
tick2ns = digi[0]->GetTick2ns();
|
||||||
|
|
||||||
SetBackwardBuild(false, 100); // using normal building (acceding in time) or backward building, int the case of backward building, default events to be build is 100.
|
SetBackwardBuild(false, 100); // using normal building (acceding in time) or backward building, int the case of backward building, default events to be build is 100.
|
||||||
evtbder = GetEventBuilder();
|
evtbder = GetEventBuilder();
|
||||||
evtbder->SetTimeWindow(500);
|
evtbder->SetTimeWindow(500); //ns
|
||||||
|
|
||||||
//========== use the influx from the Analyzer
|
//========== use the influx from the Analyzer
|
||||||
influx = new InfluxDB("https://fsunuc.physics.fsu.edu/influx/");
|
influx = new InfluxDB("https://fsunuc.physics.fsu.edu/influx/");
|
||||||
|
@ -47,19 +51,24 @@ private:
|
||||||
|
|
||||||
Histogram2D * hPID;
|
Histogram2D * hPID;
|
||||||
|
|
||||||
Histogram2D * hXX; // X1 versus X2 : e[1] versus e[0]
|
//Histogram2D * hXX; // X1 versus X2 : e[1] versus e[0]
|
||||||
Histogram2D * hYY; // Y1 versus Y2 : e[3] versus e[2]
|
//Histogram2D * hYY; // Y1 versus Y2 : e[3] versus e[2]
|
||||||
|
|
||||||
Histogram1D * hX; // X position:((e[0]-e[1])/(e[0]+e[1]))
|
Histogram1D * hX; // X position:((e[0]+e[1])/(e[0]+e[1]+e[2]+e[3]))
|
||||||
Histogram1D * hY; // Y position:((e[2]-e[3])/(e[2]+e[3]))
|
Histogram1D * hY; // Y position:((e[2]+e[3])/((e[0]+e[1]+e[2]+e[3])))
|
||||||
|
|
||||||
Histogram2D * hXY; // 2D position plot: ((e[2]-e[3])/(e[2]+e[3])) versus ((e[0]-e[1])/(e[0]+e[1]))
|
Histogram1D * hXr; // X position angle rotated
|
||||||
|
Histogram1D * hYr; // Y position angle rotated
|
||||||
|
|
||||||
|
Histogram2D * hXY; // 2D position plot: ((e[2]+e[3])/((e[0]+e[1]+e[2]+e[3]))) versus ((e[0]+e[1])/(e[0]+e[1]+e[2]+e[3]))
|
||||||
|
Histogram2D * hXYr;
|
||||||
Histogram1D * he0; // e0: signal 0
|
Histogram1D * he0; // e0: signal 0
|
||||||
Histogram1D * he1; // e1: signal 1
|
Histogram1D * he1; // e1: signal 1
|
||||||
Histogram1D * he2; // e2: signal 2
|
Histogram1D * he2; // e2: signal 2
|
||||||
Histogram1D * he3; // e3: signal 3
|
Histogram1D * he3; // e3: signal 3
|
||||||
|
|
||||||
|
Histogram1D * ht; // time window
|
||||||
|
|
||||||
|
|
||||||
int tick2ns;
|
int tick2ns;
|
||||||
|
|
||||||
|
@ -80,33 +89,44 @@ inline void MCP::SetUpCanvas(){
|
||||||
hPID = new Histogram2D("MCP", "E", "dE", 100, 0, 5000, 100, 0, 5000, this);
|
hPID = new Histogram2D("MCP", "E", "dE", 100, 0, 5000, 100, 0, 5000, this);
|
||||||
layout->addWidget(hPID, 0, 0);
|
layout->addWidget(hPID, 0, 0);
|
||||||
|
|
||||||
hXY = new Histogram2D("2D position plot", "X position", "Y position", 100, -1, 1, 100, -1, 1, this);
|
|
||||||
layout->addWidget(hXY, 0, 1);
|
|
||||||
|
|
||||||
hXX = new Histogram2D("X1 versus X2", "X2", "X1", 100, 0, 5000, 100, 0, 5000, this);
|
|
||||||
layout->addWidget(hXX, 0, 2);
|
|
||||||
|
|
||||||
hYY = new Histogram2D("Y1 versus Y2", "Y2", "Y1", 100, 0, 3000, 100, 0, 3000, this);
|
hXYr = new Histogram2D("2D rot posi", "Xr position", "Yr position", 200, -0.5, 0.5, 200, -0.5, 0.5, this);
|
||||||
layout->addWidget(hYY, 1, 0);
|
layout->addWidget(hXYr, 0, 1);
|
||||||
|
|
||||||
hX = new Histogram1D("X position", "X", 300, -1, 1, this);
|
hXY = new Histogram2D("2D position plot", "X position", "Y position", 500, 0, 1, 500, 0, 1, this);
|
||||||
layout->addWidget(hX, 1, 1);
|
layout->addWidget(hXY, 0, 2);
|
||||||
|
|
||||||
hY = new Histogram1D("Y position", "Y", 300, -1, 1, this);
|
ht = new Histogram1D("Time Window", "t", 50, 0, 500, this);
|
||||||
layout->addWidget(hY, 1, 2);
|
layout->addWidget(ht, 0, 3);
|
||||||
/* UNCOMMENT THESE LINES TO SEE INDIVIDUAL SIGNALS
|
|
||||||
he0 = new Histogram1D("Signal 0", "e0", 300, -1, 1, this);
|
|
||||||
layout->addWidget(he0, 0, 3);
|
|
||||||
|
|
||||||
he1 = new Histogram1D("Signal 1", "e1", 300, -1, 1, this);
|
|
||||||
layout->addWidget(he1, 0, 4);
|
|
||||||
|
|
||||||
he2 = new Histogram1D("Signal 2", "e2", 300, -1, 1, this);
|
hX = new Histogram1D("X position", "X", 250, 0, 1, this);
|
||||||
layout->addWidget(he2, 1, 3);
|
layout->addWidget(hX, 2, 0);
|
||||||
|
|
||||||
he3 = new Histogram1D("Signal 3", "e3", 300, -1, 1, this);
|
hY = new Histogram1D("Y position", "Y", 250, 0, 1, this);
|
||||||
layout->addWidget(he3, 1, 4);
|
layout->addWidget(hY, 2, 1);
|
||||||
*/
|
|
||||||
|
hXr = new Histogram1D("Angle rot X posi", "Xr", 250, -0.5, 0.5, this);
|
||||||
|
layout->addWidget(hXr, 2, 2);
|
||||||
|
|
||||||
|
hYr = new Histogram1D("Angle rot Y posi", "Yr", 250, -0.5, 0.5, this);
|
||||||
|
layout->addWidget(hYr, 2, 3);
|
||||||
|
// UNCOMMENT FOLLOWING 8 LINES TO SEE INDIVIDUAL SIGNALS
|
||||||
|
he0 = new Histogram1D("Signal 0", "e0", 200, 0, 8000, this);
|
||||||
|
layout->addWidget(he0, 1, 0);
|
||||||
|
|
||||||
|
he1 = new Histogram1D("Signal 1", "e1", 200, 0, 8000, this);
|
||||||
|
layout->addWidget(he1, 1, 1);
|
||||||
|
|
||||||
|
he2 = new Histogram1D("Signal 2", "e2", 200, 0, 8000, this);
|
||||||
|
layout->addWidget(he2, 1, 2);
|
||||||
|
|
||||||
|
he3 = new Histogram1D("Signal 3", "e3", 200, 0, 8000, this);
|
||||||
|
layout->addWidget(he3, 1, 3);
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void MCP::UpdateHistograms(){
|
inline void MCP::UpdateHistograms(){
|
||||||
|
@ -120,6 +140,7 @@ inline void MCP::UpdateHistograms(){
|
||||||
if( eventBuilt == 0 ) return;
|
if( eventBuilt == 0 ) return;
|
||||||
|
|
||||||
//============ Get the cut list, if any
|
//============ Get the cut list, if any
|
||||||
|
|
||||||
QList<QPolygonF> cutList = hPID->GetCutList();
|
QList<QPolygonF> cutList = hPID->GetCutList();
|
||||||
const int nCut = cutList.count();
|
const int nCut = cutList.count();
|
||||||
unsigned long long tMin[nCut] = {0xFFFFFFFFFFFFFFFF}, tMax[nCut] = {0};
|
unsigned long long tMin[nCut] = {0xFFFFFFFFFFFFFFFF}, tMax[nCut] = {0};
|
||||||
|
@ -135,11 +156,24 @@ inline void MCP::UpdateHistograms(){
|
||||||
//printf("-------------- %ld\n", i);
|
//printf("-------------- %ld\n", i);
|
||||||
|
|
||||||
if( event.size() == 0 ) return;
|
if( event.size() == 0 ) return;
|
||||||
|
//if( event.size() < 2 ) return;
|
||||||
|
cout<< "event size " << event.size() <<endl;
|
||||||
|
|
||||||
|
e0 = 0;
|
||||||
|
e1 = 0;
|
||||||
|
e2 = 0;
|
||||||
|
e3 = 0;
|
||||||
|
|
||||||
|
t0 = 0;
|
||||||
|
t1 = 0;
|
||||||
|
t2 = 0;
|
||||||
|
t3 = 0;
|
||||||
|
|
||||||
|
|
||||||
for( int k = 0; k < (int) event.size(); k++ ){
|
for( int k = 0; k < (int) event.size(); k++ ){
|
||||||
//event[k].Print();
|
//event[k].Print();
|
||||||
if( event[k].ch == 0 ) {dE = event[k].energy; dE_t = event[k].timestamp;}
|
if( event[k].ch == 2 ) {dE = event[k].energy; dE_t = event[k].timestamp;}
|
||||||
if( event[k].ch == 1 ) {E = event[k].energy; E_t = event[k].timestamp;}
|
if( event[k].ch == 2 ) {E = event[k].energy; E_t = event[k].timestamp;}
|
||||||
|
|
||||||
if( event[k].ch == 2 ) {e0 = event[k].energy; t0 = event[k].timestamp;}
|
if( event[k].ch == 2 ) {e0 = event[k].energy; t0 = event[k].timestamp;}
|
||||||
if( event[k].ch == 3 ) {e1= event[k].energy; t1 = event[k].timestamp;}
|
if( event[k].ch == 3 ) {e1= event[k].energy; t1 = event[k].timestamp;}
|
||||||
|
@ -148,21 +182,36 @@ inline void MCP::UpdateHistograms(){
|
||||||
if( event[k].ch == 5 ) {e3= event[k].energy; t3 = event[k].timestamp;}
|
if( event[k].ch == 5 ) {e3= event[k].energy; t3 = event[k].timestamp;}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if (e0>10 && e1>10 && e2>10 && e3>10) {
|
||||||
|
float_t rotation_angle = 31.;
|
||||||
|
double_t Xr = (((e1+e2)/(e0+e1+e2+e3))-0.51)*cos(-rotation_angle*M_PI/180)-(((e2+e3)/(e0+e1+e2+e3))-0.51)*sin(-rotation_angle*M_PI/180);
|
||||||
|
double_t Yr = (((e1+e2)/(e0+e1+e2+e3))-0.51)*sin(-rotation_angle*M_PI/180)+(((e2+e3)/(e0+e1+e2+e3))-0.51)*cos(-rotation_angle*M_PI/180);
|
||||||
|
|
||||||
// printf("(E, dE) = (%f, %f)\n", E, dE);
|
|
||||||
hPID->Fill(E + RandomGauss(0, 100), dE+ RandomGauss(0, 100)); // x, y
|
hPID->Fill(E + RandomGauss(0, 100), dE+ RandomGauss(0, 100)); // x, y
|
||||||
hXX->Fill(e1, e0); //
|
|
||||||
hYY->Fill(e3, e2);
|
hXY->Fill(((e1+e2)/(e0+e1+e2+e3)),((e2+e3)/(e0+e1+e2+e3)));
|
||||||
hXY->Fill(((e0-e1)/(e0+e1)),((e2-e3)/(e2+e3)));
|
hXYr->Fill(Xr,Yr);
|
||||||
hX->Fill(((e0-e1)/(e0+e1)));
|
hX->Fill(((e1+e2)/(e0+e1+e2+e3)));
|
||||||
hY->Fill(((e2-e3)/(e2+e3)));
|
hY->Fill(((e2+e3)/(e0+e1+e2+e3)));
|
||||||
|
hXr->Fill(Xr);
|
||||||
|
hYr->Fill(Yr);
|
||||||
|
}
|
||||||
|
|
||||||
he0->Fill(e0);
|
he0->Fill(e0);
|
||||||
he1->Fill(e1);
|
he1->Fill(e1);
|
||||||
he2->Fill(e2);
|
he2->Fill(e2);
|
||||||
he3->Fill(e3);
|
he3->Fill(e3);
|
||||||
|
|
||||||
|
ht->Fill(max(max(t0,t1),max(t2,t3))-min(min(t0,t1),min(t2,t3)));
|
||||||
|
|
||||||
|
// cout << "t0: " << t0 << endl;
|
||||||
|
// cout << "t1: " << t1 << endl;
|
||||||
|
// cout << "t2: " << t2 << endl;
|
||||||
|
// cout << "t3: " << t3 << endl;
|
||||||
|
// cout << "time window " << max(max(t0,t1),max(t2,t3))-min(min(t0,t1),min(t2,t3)) <<endl;
|
||||||
|
// cout <<"---------------------" << endl;
|
||||||
//check events inside any Graphical cut and extract the rate
|
//check events inside any Graphical cut and extract the rate
|
||||||
|
|
||||||
for(int p = 0; p < cutList.count(); p++ ){
|
for(int p = 0; p < cutList.count(); p++ ){
|
||||||
if( cutList[p].isEmpty() ) continue;
|
if( cutList[p].isEmpty() ) continue;
|
||||||
if( cutList[p].containsPoint(QPointF(E, dE), Qt::OddEvenFill) ){
|
if( cutList[p].containsPoint(QPointF(E, dE), Qt::OddEvenFill) ){
|
||||||
|
@ -172,18 +221,23 @@ inline void MCP::UpdateHistograms(){
|
||||||
//printf(".... %d \n", count[p]);
|
//printf(".... %d \n", count[p]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hPID->UpdatePlot();
|
hPID->UpdatePlot();
|
||||||
hXX->UpdatePlot();//
|
//hXX->UpdatePlot();//
|
||||||
hYY->UpdatePlot();
|
//hYY->UpdatePlot();
|
||||||
hXY->UpdatePlot();
|
hXY->UpdatePlot();
|
||||||
|
hXYr->UpdatePlot();
|
||||||
hX->UpdatePlot();
|
hX->UpdatePlot();
|
||||||
hY->UpdatePlot();
|
hY->UpdatePlot();
|
||||||
|
hXr->UpdatePlot();
|
||||||
|
hYr->UpdatePlot();
|
||||||
he0->UpdatePlot();
|
he0->UpdatePlot();
|
||||||
he1->UpdatePlot();
|
he1->UpdatePlot();
|
||||||
he2->UpdatePlot();
|
he2->UpdatePlot();
|
||||||
he3->UpdatePlot();
|
he3->UpdatePlot();
|
||||||
|
ht->UpdatePlot();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
362
analyzers/MCPandPSD.h
Normal file
362
analyzers/MCPandPSD.h
Normal file
|
@ -0,0 +1,362 @@
|
||||||
|
#ifndef MCPandPSD_h
|
||||||
|
#define MCPandPSD_h
|
||||||
|
|
||||||
|
/*********************************************
|
||||||
|
* This is online analyzer for RASIOR, ANL
|
||||||
|
*
|
||||||
|
* Created by Ryan @ 2023-10-16
|
||||||
|
*
|
||||||
|
* ******************************************/
|
||||||
|
#include "Analyser.h"
|
||||||
|
#include <cmath>
|
||||||
|
#include "math.h"
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
|
class MCPandPSD : public Analyzer{
|
||||||
|
|
||||||
|
public:
|
||||||
|
MCPandPSD(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent = nullptr): Analyzer(digi, nDigi, parent){
|
||||||
|
|
||||||
|
|
||||||
|
SetUpdateTimeInSec(4.0);
|
||||||
|
|
||||||
|
RedefineEventBuilder({0}); // only builder for the 0-th digitizer.
|
||||||
|
tick2ns = digi[0]->GetTick2ns();
|
||||||
|
|
||||||
|
SetBackwardBuild(false, 100); // using normal building (acceding in time) or backward building, int the case of backward building, default events to be build is 100.
|
||||||
|
evtbder = GetEventBuilder();
|
||||||
|
evtbder->SetTimeWindow(500);
|
||||||
|
|
||||||
|
//========== use the influx from the Analyzer
|
||||||
|
influx = new InfluxDB("https://fsunuc.physics.fsu.edu/influx/");
|
||||||
|
dataBaseName = "testing";
|
||||||
|
|
||||||
|
SetUpCanvas(); // see below
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
void SetUpCanvas();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void UpdateHistograms();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
MultiBuilder *evtbder;
|
||||||
|
|
||||||
|
//Histogram2D * hPID;
|
||||||
|
|
||||||
|
Histogram2D * hXYE; // 2D energy plot: e[2]+e[3] versus e[0]+e[1]
|
||||||
|
|
||||||
|
Histogram1D * hX; // X position:((e[0]-e[1])/(e[0]+e[1]))
|
||||||
|
Histogram1D * hY; // Y position:((e[2]-e[3])/(e[2]+e[3]))
|
||||||
|
|
||||||
|
Histogram1D * hXmcp; // X position
|
||||||
|
Histogram1D * hYmcp; // Y position
|
||||||
|
|
||||||
|
Histogram2D * hXY; // 2D position plot: ((e[2]-e[3])/(e[2]+e[3])) versus ((e[0]-e[1])/(e[0]+e[1]))
|
||||||
|
Histogram2D * hXYMCP; // 2D position plot for MCP: ((e[2]+e[3])/((e[0]+e[1]+e[2]+e[3]))) versus ((e[0]+e[1])/(e[0]+e[1]+e[2]+e[3]))
|
||||||
|
Histogram2D * hXYr; // 2D position plot rotated for MCP:
|
||||||
|
|
||||||
|
|
||||||
|
Histogram2D * hXEdE1; //X energy versus dE signal 1
|
||||||
|
Histogram2D * hYEdE1; //Y energy versus dE signal 1
|
||||||
|
|
||||||
|
Histogram2D * hXEdE2; //X energy versus dE signal 2
|
||||||
|
Histogram2D * hYEdE2; //Y energy versus dE signal 2
|
||||||
|
/*
|
||||||
|
Histogram1D * he0; // e0: signal 0 from PSD
|
||||||
|
Histogram1D * he1; // e1: signal 1 from PSD
|
||||||
|
Histogram1D * he2; // e2: signal 2 from PSD
|
||||||
|
Histogram1D * he3; // e3: signal 3 from PSD
|
||||||
|
|
||||||
|
Histogram1D * hmcp0; // s0: signal 0 from MCP
|
||||||
|
Histogram1D * hmcp1; // s1: signal 1 from MCP
|
||||||
|
Histogram1D * hmcp2; // s2: signal 2 from MCP
|
||||||
|
Histogram1D * hmcp3; // s3: signal 3 from MCP
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
int tick2ns;
|
||||||
|
|
||||||
|
//float dE, E;
|
||||||
|
//unsigned long long dE_t, E_t;
|
||||||
|
|
||||||
|
float e0, e1, e2, e3, dE1, dE2;
|
||||||
|
unsigned long long t0, t1, t2, t3, dE1_t, dE2_t;
|
||||||
|
|
||||||
|
float s0, s1, s2, s3;
|
||||||
|
unsigned long long s_t0, s_t1, s_t2, s_t3;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline void MCPandPSD::SetUpCanvas(){
|
||||||
|
|
||||||
|
setGeometry(0, 0, 1500, 2000);
|
||||||
|
|
||||||
|
//============ histograms
|
||||||
|
//hPID = new Histogram2D("RAISOR2", "E", "dE", 100, 0, 11000, 100, 0, 11000, this);
|
||||||
|
//layout->addWidget(hPID, 0, 0);
|
||||||
|
|
||||||
|
hXY = new Histogram2D("2D position plot PSD_E", "X position", "Y position", 200, -1, 1, 200, -1, 1, this);
|
||||||
|
layout->addWidget(hXY, 0, 0);
|
||||||
|
|
||||||
|
hX = new Histogram1D("X position", "X", 300, -1, 1, this);
|
||||||
|
layout->addWidget(hX, 0, 1);
|
||||||
|
|
||||||
|
hY = new Histogram1D("Y position", "Y", 300, -1, 1, this);
|
||||||
|
layout->addWidget(hY, 0, 2);
|
||||||
|
/*
|
||||||
|
he0 = new Histogram1D("PSD_E 0", "e0", 200, 0, 8000, this);
|
||||||
|
layout->addWidget(he0, 0, 1);
|
||||||
|
|
||||||
|
he1 = new Histogram1D("PSD_E 1", "e1", 200, 0, 8000, this);
|
||||||
|
layout->addWidget(he1, 0, 2);
|
||||||
|
|
||||||
|
he2 = new Histogram1D("PSD_E 2", "e2", 200, 0, 8000, this);
|
||||||
|
layout->addWidget(he2, 0, 3);
|
||||||
|
|
||||||
|
he3 = new Histogram1D("PSD_E 3", "e3", 200, 0, 8000, this);
|
||||||
|
layout->addWidget(he3, 0, 4);
|
||||||
|
*/
|
||||||
|
hXYMCP = new Histogram2D("2D position MCP", "X position", "Y position", 500, 0, 1, 500, 0, 1, this);
|
||||||
|
layout->addWidget(hXYMCP, 1, 1);
|
||||||
|
|
||||||
|
hXYr = new Histogram2D("2D rot pos MCP", "Xr position", "Yr position", 200, -0.5, 0.5, 200, -0.5, 0.5, this);
|
||||||
|
layout->addWidget(hXYr, 1, 0);
|
||||||
|
/*
|
||||||
|
hmcp0 = new Histogram1D("MCP 0", "s0", 200, 0, 8000, this);
|
||||||
|
layout->addWidget(hmcp0, 1, 1);
|
||||||
|
|
||||||
|
hmcp1 = new Histogram1D("MCP 1", "s1", 200, 0, 8000, this);
|
||||||
|
layout->addWidget(hmcp1, 1, 2);
|
||||||
|
|
||||||
|
hmcp2 = new Histogram1D("MCP 2", "s2", 200, 0, 8000, this);
|
||||||
|
layout->addWidget(hmcp2, 1, 3);
|
||||||
|
|
||||||
|
hmcp3 = new Histogram1D("MCP 3", "s3", 200, 0, 8000, this);
|
||||||
|
layout->addWidget(hmcp3, 1, 4);
|
||||||
|
*/
|
||||||
|
hXmcp = new Histogram1D("X pos rot MCP", "X", 250, -0.5, 0.5, this);
|
||||||
|
layout->addWidget(hXmcp, 1, 2);
|
||||||
|
|
||||||
|
hYmcp = new Histogram1D("Y pos rot MCP", "Y", 250, -0.5, 0.5, this);
|
||||||
|
layout->addWidget(hYmcp, 1, 3);
|
||||||
|
|
||||||
|
hXEdE1 = new Histogram2D("X energy versus dE signal 1", "Ex", "dE signal 1", 100, 0, 8000, 100, 0, 8000, this);
|
||||||
|
layout->addWidget(hXEdE1, 2, 0);
|
||||||
|
|
||||||
|
hYEdE1 = new Histogram2D("Y energy versus dE signal 1", "Ey", "dE signal 1", 100, 0, 8000, 100, 0, 8000, this);
|
||||||
|
layout->addWidget(hYEdE1, 2, 1);
|
||||||
|
|
||||||
|
hXEdE2 = new Histogram2D("X energy versus dE signal 2", "Ex", "dE signal 2", 100, 0, 8000, 100, 0, 8000, this);
|
||||||
|
layout->addWidget(hXEdE2, 2, 2);
|
||||||
|
|
||||||
|
hYEdE2 = new Histogram2D("Y energy versus dE signal 2", "Ey", "dE signal 2", 100, 0, 8000, 100, 0, 8000, this);
|
||||||
|
layout->addWidget(hYEdE2, 2, 3);
|
||||||
|
|
||||||
|
hXYE = new Histogram2D("2D energy plot", "Ex", "Ey", 100, 0, 8000, 100, 0, 8000, this);
|
||||||
|
layout->addWidget(hXYE, 0, 3);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void MCPandPSD::UpdateHistograms(){
|
||||||
|
|
||||||
|
if( this->isVisible() == false ) return;
|
||||||
|
|
||||||
|
BuildEvents(false); // call the event builder to build events
|
||||||
|
|
||||||
|
//============ Get events, and do analysis
|
||||||
|
long eventBuilt = evtbder->eventBuilt;
|
||||||
|
if( eventBuilt == 0 ) return;
|
||||||
|
|
||||||
|
//============ Get the cut list, if any
|
||||||
|
/*
|
||||||
|
QList<QPolygonF> cutList = hPID->GetCutList();
|
||||||
|
const int nCut = cutList.count();
|
||||||
|
unsigned long long tMin[nCut] = {0xFFFFFFFFFFFFFFFF}, tMax[nCut] = {0};
|
||||||
|
unsigned int count[nCut]={0};
|
||||||
|
|
||||||
|
QList<QPolygonF> cutList1 = hXEdE1->GetCutList();
|
||||||
|
const int nCut1 = cutList1.count();
|
||||||
|
unsigned long long tMin1[nCut1] = {0xFFFFFFFFFFFFFFFF}, tMax1[nCut1] = {0};
|
||||||
|
unsigned int count1[nCut1]={0};
|
||||||
|
|
||||||
|
QList<QPolygonF> cutList2 = hYEdE1->GetCutList();
|
||||||
|
const int nCut2 = cutList2.count();
|
||||||
|
unsigned long long tMin2[nCut2] = {0xFFFFFFFFFFFFFFFF}, tMax2[nCut2] = {0};
|
||||||
|
unsigned int count2[nCut2]={0};
|
||||||
|
|
||||||
|
QList<QPolygonF> cutList3 = hXY->GetCutList();
|
||||||
|
const int nCut3 = cutList3.count();
|
||||||
|
unsigned long long tMin3[nCut3] = {0xFFFFFFFFFFFFFFFF}, tMax3[nCut3] = {0};
|
||||||
|
unsigned int count3[nCut3]={0};
|
||||||
|
*/
|
||||||
|
//============ Processing data and fill histograms
|
||||||
|
long eventIndex = evtbder->eventIndex;
|
||||||
|
long eventStart = eventIndex - eventBuilt + 1;
|
||||||
|
if(eventStart < 0 ) eventStart += MaxNEvent;
|
||||||
|
|
||||||
|
for( long i = eventStart ; i <= eventIndex; i ++ ){
|
||||||
|
std::vector<Hit> event = evtbder->events[i];
|
||||||
|
//printf("-------------- %ld\n", i);
|
||||||
|
|
||||||
|
if( event.size() == 0 ) return;
|
||||||
|
|
||||||
|
|
||||||
|
if( event.size() == 0 ) return;
|
||||||
|
//if( event.size() < 2 ) return;
|
||||||
|
cout<< "event size " << event.size() <<endl;
|
||||||
|
|
||||||
|
s0 = 0;
|
||||||
|
s1 = 0;
|
||||||
|
s2 = 0;
|
||||||
|
s3 = 0;
|
||||||
|
|
||||||
|
s_t0 = 0;
|
||||||
|
s_t1 = 0;
|
||||||
|
s_t2 = 0;
|
||||||
|
s_t3 = 0;
|
||||||
|
|
||||||
|
for( int k = 0; k < (int) event.size(); k++ ){
|
||||||
|
//event[k].Print();
|
||||||
|
|
||||||
|
if( event[k].ch == 2 ) {s0 = event[k].energy; s_t0 = event[k].timestamp;} //
|
||||||
|
if( event[k].ch == 3 ) {s1= event[k].energy; s_t1 = event[k].timestamp;} // The 4 output signals from the
|
||||||
|
if( event[k].ch == 4 ) {s2 = event[k].energy; s_t2 = event[k].timestamp;} // MCP detector
|
||||||
|
if( event[k].ch == 5 ) {s3= event[k].energy; s_t3 = event[k].timestamp;} //
|
||||||
|
|
||||||
|
if( event[k].ch == 10 ) {e0 = event[k].energy; t0 = event[k].timestamp;} //
|
||||||
|
if( event[k].ch == 11 ) {e1= event[k].energy; t1 = event[k].timestamp;} // The 4 output signals from the
|
||||||
|
if( event[k].ch == 12 ) {e2 = event[k].energy; t2 = event[k].timestamp;} // position sensitive E detector
|
||||||
|
if( event[k].ch == 13 ) {e3= event[k].energy; t3 = event[k].timestamp;} //
|
||||||
|
|
||||||
|
if( event[k].ch == 14 ) {dE1 = event[k].energy; dE1_t = event[k].timestamp;} // The 2 output signals from the
|
||||||
|
if( event[k].ch == 15 ) {dE2= event[k].energy; dE2_t = event[k].timestamp;} // square dE detector
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s0>10 && s1>10 && s2>10 && s3>10) {
|
||||||
|
float_t rotation_angle = 31.;
|
||||||
|
double_t Xr = (((s1+s2)/(s0+s1+s2+s3))-0.51)*cos(-rotation_angle*M_PI/180)-(((s2+s3)/(s0+s1+s2+s3))-0.51)*sin(-rotation_angle*M_PI/180);
|
||||||
|
double_t Yr = (((s1+s2)/(s0+s1+s2+s3))-0.51)*sin(-rotation_angle*M_PI/180)+(((s2+s3)/(s0+s1+s2+s3))-0.51)*cos(-rotation_angle*M_PI/180);
|
||||||
|
// printf("(E, dE) = (%f, %f)\n", E, dE);
|
||||||
|
//hPID->Fill(E + RandomGauss(0, 100), dE+ RandomGauss(0, 100)); // x, y
|
||||||
|
|
||||||
|
hXY->Fill(((e0-e1)/(e0+e1)),((e3-e2)/(e2+e3)));
|
||||||
|
hXYMCP->Fill(((s1+s2)/(s0+s1+s2+s3)),((s2+s3)/(s0+s1+s2+s3)));
|
||||||
|
|
||||||
|
hX->Fill(((e0-e1)/(e0+e1)));
|
||||||
|
hY->Fill(((e3-e2)/(e2+e3)));
|
||||||
|
hXmcp->Fill(Xr);
|
||||||
|
hYmcp->Fill(Yr);
|
||||||
|
hXEdE1->Fill((e0+e1),dE1);
|
||||||
|
hYEdE1->Fill(e2+e3,dE1);
|
||||||
|
hXEdE2->Fill(e0+e1,dE2);
|
||||||
|
hYEdE2->Fill(e2+e3,dE2);
|
||||||
|
hXYE->Fill(e0+e1,e2+e3);
|
||||||
|
hXYr->Fill(Xr,Yr);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
he0->Fill(e0);
|
||||||
|
he1->Fill(e1);
|
||||||
|
he2->Fill(e2);
|
||||||
|
he3->Fill(e3);
|
||||||
|
|
||||||
|
hmcp0->Fill(s0);
|
||||||
|
hmcp1->Fill(s1);
|
||||||
|
hmcp2->Fill(s2);
|
||||||
|
hmcp3->Fill(s3);
|
||||||
|
*/
|
||||||
|
//check events inside any Graphical cut and extract the rate
|
||||||
|
/*
|
||||||
|
for(int p = 0; p < cutList.count(); p++ ){
|
||||||
|
if( cutList[p].isEmpty() ) continue;
|
||||||
|
if( cutList[p].containsPoint(QPointF(E, dE), Qt::OddEvenFill) ){
|
||||||
|
if( dE_t < tMin[p] ) tMin[p] = dE_t;
|
||||||
|
if( dE_t > tMax[p] ) tMax[p] = dE_t;
|
||||||
|
count[p] ++;
|
||||||
|
//printf(".... %d \n", count[p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int p = 0; p < cutList1.count(); p++ ){
|
||||||
|
if( cutList1[p].isEmpty() ) continue;
|
||||||
|
if( cutList1[p].containsPoint(QPointF((e0+e1), dE1), Qt::OddEvenFill) ){
|
||||||
|
if( dE1_t < tMin1[p] ) tMin1[p] = dE1_t;
|
||||||
|
if( dE1_t > tMax1[p] ) tMax1[p] = dE1_t;
|
||||||
|
count1[p] ++;
|
||||||
|
//printf("hXX.... %d \n", count1[p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int p = 0; p < cutList2.count(); p++ ){
|
||||||
|
if( cutList2[p].isEmpty() ) continue;
|
||||||
|
if( cutList2[p].containsPoint(QPointF((e2+e3), dE1), Qt::OddEvenFill) ){
|
||||||
|
if( dE1_t < tMin2[p] ) tMin2[p] = dE1_t;
|
||||||
|
if( dE1_t > tMax2[p] ) tMax2[p] = dE1_t;
|
||||||
|
count2[p] ++;
|
||||||
|
//printf("hXX.... %d \n", count2[p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int p = 0; p < cutList3.count(); p++ ){
|
||||||
|
if( cutList3[p].isEmpty() ) continue;
|
||||||
|
if( cutList3[p].containsPoint(QPointF(((e0-e1)/(e0+e1)), ((e2-e3)/(e2+e3))), Qt::OddEvenFill) ){
|
||||||
|
if( ((t2-t3)/(t2+t3)) < tMin3[p] ) tMin3[p] = ((t2-t3)/(t2+t3));
|
||||||
|
if( ((t2-t3)/(t2+t3)) > tMax3[p] ) tMax3[p] = ((t2-t3)/(t2+t3));
|
||||||
|
count3[p] ++;
|
||||||
|
//printf("hXX.... %d \n", count3[p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
//hPID->UpdatePlot();
|
||||||
|
hXY->UpdatePlot();
|
||||||
|
hXYr->UpdatePlot();
|
||||||
|
hXYMCP->UpdatePlot();
|
||||||
|
|
||||||
|
hX->UpdatePlot();
|
||||||
|
hY->UpdatePlot();
|
||||||
|
hXmcp->UpdatePlot();
|
||||||
|
hYmcp->UpdatePlot();
|
||||||
|
hXEdE1->UpdatePlot();
|
||||||
|
hYEdE1->UpdatePlot();
|
||||||
|
hXEdE2->UpdatePlot();
|
||||||
|
hYEdE2->UpdatePlot();
|
||||||
|
hXYE->UpdatePlot();
|
||||||
|
/*
|
||||||
|
he0->UpdatePlot();
|
||||||
|
he1->UpdatePlot();
|
||||||
|
he2->UpdatePlot();
|
||||||
|
he3->UpdatePlot();
|
||||||
|
|
||||||
|
hmcp0->UpdatePlot();
|
||||||
|
hmcp1->UpdatePlot();
|
||||||
|
hmcp2->UpdatePlot();
|
||||||
|
hmcp3->UpdatePlot();
|
||||||
|
*/
|
||||||
|
//========== output to Influx
|
||||||
|
/*
|
||||||
|
QList<QString> cutNameList = hPID->GetCutNameList();
|
||||||
|
for( int p = 0; p < cutList.count(); p ++){
|
||||||
|
if( cutList[p].isEmpty() ) continue;
|
||||||
|
double dT = (tMax[p]-tMin[p]) * tick2ns / 1e9; // tick to sec
|
||||||
|
double rate = count[p]*1.0/(dT);
|
||||||
|
//printf("%llu %llu, %f %d\n", tMin[p], tMax[p], dT, count[p]);
|
||||||
|
//printf("%10s | %d | %f Hz \n", cutNameList[p].toStdString().c_str(), count[p], rate);
|
||||||
|
|
||||||
|
influx->AddDataPoint("Cut,name=" + cutNameList[p].toStdString()+ " value=" + std::to_string(rate));
|
||||||
|
influx->WriteData(dataBaseName);
|
||||||
|
influx->ClearDataPointsBuffer();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -18,7 +18,7 @@ public:
|
||||||
PID(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent = nullptr): Analyzer(digi, nDigi, parent){
|
PID(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent = nullptr): Analyzer(digi, nDigi, parent){
|
||||||
|
|
||||||
|
|
||||||
SetUpdateTimeInSec(1.0);
|
SetUpdateTimeInSec(2.0);
|
||||||
|
|
||||||
RedefineEventBuilder({0}); // only builder for the 0-th digitizer.
|
RedefineEventBuilder({0}); // only builder for the 0-th digitizer.
|
||||||
tick2ns = digi[0]->GetTick2ns();
|
tick2ns = digi[0]->GetTick2ns();
|
||||||
|
@ -45,7 +45,7 @@ private:
|
||||||
|
|
||||||
MultiBuilder *evtbder;
|
MultiBuilder *evtbder;
|
||||||
|
|
||||||
Histogram2D * hPID;
|
//Histogram2D * hPID;
|
||||||
|
|
||||||
Histogram1D * hdE; // raw dE (ch=1): ch1
|
Histogram1D * hdE; // raw dE (ch=1): ch1
|
||||||
Histogram1D * hE; // raw E (ch=4) : ch4
|
Histogram1D * hE; // raw E (ch=4) : ch4
|
||||||
|
@ -76,26 +76,29 @@ inline void PID::SetUpCanvas(){
|
||||||
|
|
||||||
//============ histograms
|
//============ histograms
|
||||||
|
|
||||||
hdEE = new Histogram2D("dE vs E", "E[ch]", "dE[ch]", 100, 0, 7000, 100, 0, 4000, this);
|
//hPID = new Histogram2D("RAISOR", "E", "dE", 100, 0, 5000, 100, 0, 5000, this);
|
||||||
|
//layout->addWidget(hPID, 2, 0);
|
||||||
|
|
||||||
|
hdEE = new Histogram2D("dE vs E", "E[ch]", "dE[ch]", 500, -100, 10000, 500, -100, 10000, this);
|
||||||
layout->addWidget(hdEE, 0, 0, 1, 2);
|
layout->addWidget(hdEE, 0, 0, 1, 2);
|
||||||
|
|
||||||
hdE = new Histogram1D("raw dE (ch=1)", "dE [ch]", 300, 0, 2500, this);
|
hdE = new Histogram1D("raw dE (ch=1)", "dE [ch]", 300, 0, 8000, this);
|
||||||
layout->addWidget(hdE, 0, 2);
|
layout->addWidget(hdE, 0, 2);
|
||||||
|
|
||||||
hdEdT = new Histogram2D("dE vs TOF", "TOF [ns]", "dE", 100, 0, 500, 100, 0, 4000, this);
|
hdEdT = new Histogram2D("dE vs TOF", "TOF [ns]", "dE", 100, 0, 500, 100, 0, 4000, this);
|
||||||
layout->addWidget(hdEdT, 0, 3);
|
layout->addWidget(hdEdT, 1, 3);
|
||||||
|
|
||||||
hE = new Histogram1D("raw E (ch=4)", "E [ch]", 300, 0, 5000, this);
|
hE = new Histogram1D("raw E (ch=4)", "E [ch]", 300, 0, 10000, this);
|
||||||
layout->addWidget(hE, 0, 4);
|
layout->addWidget(hE, 0, 3);
|
||||||
|
|
||||||
hdEtotE = new Histogram2D("dE vs TotE", "TotE[ch]", "dE[ch]", 100, 0, 8000, 100, 0, 4000, this);
|
hdEtotE = new Histogram2D("dE vs TotE", "TotE[ch]", "dE[ch]", 500, 0, 10000, 500, 0, 10000, this);
|
||||||
layout->addWidget(hdEtotE, 1, 0, 1, 2);
|
layout->addWidget(hdEtotE, 1, 0, 1, 2);
|
||||||
|
|
||||||
hdT = new Histogram1D("raw dT (ch=7)", "dT [ch]", 300, 0, 1000, this);
|
hdT = new Histogram1D("raw dT (ch=7)", "dT [ch]", 300, 0, 1000, this);
|
||||||
layout->addWidget(hdT, 1, 2);
|
layout->addWidget(hdT, 1, 2);
|
||||||
|
|
||||||
hTotE = new Histogram1D("total energy (dE+E)", "TotE [ch]", 300, 0, 7000, this);
|
hTotE = new Histogram1D("total energy (dE+E)", "TotE [ch]", 300, 0, 16000, this);
|
||||||
layout->addWidget(hTotE, 1, 3);
|
layout->addWidget(hTotE, 0, 4);
|
||||||
|
|
||||||
hTWin = new Histogram1D("coincidence time window", "TWin [ns]", 300, 0, 500, this);
|
hTWin = new Histogram1D("coincidence time window", "TWin [ns]", 300, 0, 500, this);
|
||||||
layout->addWidget(hTWin, 1, 4);
|
layout->addWidget(hTWin, 1, 4);
|
||||||
|
@ -113,10 +116,21 @@ inline void PID::UpdateHistograms(){
|
||||||
if( eventBuilt == 0 ) return;
|
if( eventBuilt == 0 ) return;
|
||||||
|
|
||||||
//============ Get the cut list, if any
|
//============ Get the cut list, if any
|
||||||
|
/*
|
||||||
QList<QPolygonF> cutList = hPID->GetCutList();
|
QList<QPolygonF> cutList = hPID->GetCutList();
|
||||||
const int nCut = cutList.count();
|
const int nCut = cutList.count();
|
||||||
unsigned long long tMin[nCut] = {0xFFFFFFFFFFFFFFFF}, tMax[nCut] = {0};
|
unsigned long long tMin[nCut] = {0xFFFFFFFFFFFFFFFF}, tMax[nCut] = {0};
|
||||||
unsigned int count[nCut]={0};
|
unsigned int count[nCut]={0};
|
||||||
|
*/
|
||||||
|
QList<QPolygonF> cutList1 = hdEE->GetCutList();
|
||||||
|
const int nCut1 = cutList1.count();
|
||||||
|
unsigned long long tMin1[nCut1] = {0xFFFFFFFFFFFFFFFF}, tMax1[nCut1] = {0};
|
||||||
|
unsigned int count1[nCut1]={0};
|
||||||
|
|
||||||
|
QList<QPolygonF> cutList2 = hdEtotE->GetCutList();
|
||||||
|
const int nCut2 = cutList2.count();
|
||||||
|
unsigned long long tMin2[nCut2] = {0xFFFFFFFFFFFFFFFF}, tMax2[nCut2] = {0};
|
||||||
|
unsigned int count2[nCut2]={0};
|
||||||
|
|
||||||
//============ Processing data and fill histograms
|
//============ Processing data and fill histograms
|
||||||
long eventIndex = evtbder->eventIndex;
|
long eventIndex = evtbder->eventIndex;
|
||||||
|
@ -131,24 +145,26 @@ inline void PID::UpdateHistograms(){
|
||||||
|
|
||||||
for( int k = 0; k < (int) event.size(); k++ ){
|
for( int k = 0; k < (int) event.size(); k++ ){
|
||||||
//event[k].Print();
|
//event[k].Print();
|
||||||
if( event[k].ch == 0 ) {ch1 = event[k].energy; t1 = event[k].timestamp;}
|
if( event[k].ch == 6 ) {ch1 = event[k].energy; t1 = event[k].timestamp;}
|
||||||
if( event[k].ch == 1 ) {ch4 = event[k].energy; t4 = event[k].timestamp;}
|
if( event[k].ch == 7 ) {ch4 = event[k].energy; t4 = event[k].timestamp;}
|
||||||
if( event[k].ch == 2 ) {ch7 = event[k].energy; t7 = event[k].timestamp;}
|
if( event[k].ch == 1 ) {ch7 = event[k].energy; t7 = event[k].timestamp;}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// printf("(E, dE) = (%f, %f)\n", E, dE);
|
// printf("(E, dE) = (%f, %f)\n", E, dE);
|
||||||
hPID->Fill(ch4 + RandomGauss(0, 100), ch1 + RandomGauss(0, 100)); // x, y
|
//hPID->Fill(ch4 , ch1); // x, y
|
||||||
|
//etotal = ch1*0.25*0.25 + ch4
|
||||||
hdE->Fill(ch1);
|
hdE->Fill(ch1);
|
||||||
hE->Fill(ch4);
|
hE->Fill(ch4);
|
||||||
hdT->Fill(ch7);
|
hdT->Fill(ch7);
|
||||||
hTotE->Fill(ch1+ch4);
|
hTotE->Fill(ch1*0.25*0.25 + ch4);
|
||||||
hdEE->Fill(ch4,ch1);
|
hdEE->Fill(ch4,ch1);
|
||||||
hdEtotE->Fill(ch1+ch4+ RandomGauss(0, 100),ch1+ RandomGauss(0, 100));
|
hdEtotE->Fill(ch1*0.25*0.25 + ch4,ch1);
|
||||||
hdEdT->Fill((t7-t1)*1e9,ch1);
|
hdEdT->Fill((t7-t1)*1e9,ch1);
|
||||||
hTWin->Fill((t4-t1)*1e9);
|
hTWin->Fill((t4-t1)*1e9);
|
||||||
|
|
||||||
//check events inside any Graphical cut and extract the rate
|
//check events inside any Graphical cut and extract the rate
|
||||||
|
/*
|
||||||
for(int p = 0; p < cutList.count(); p++ ){
|
for(int p = 0; p < cutList.count(); p++ ){
|
||||||
if( cutList[p].isEmpty() ) continue;
|
if( cutList[p].isEmpty() ) continue;
|
||||||
if( cutList[p].containsPoint(QPointF(ch4, ch1), Qt::OddEvenFill) ){
|
if( cutList[p].containsPoint(QPointF(ch4, ch1), Qt::OddEvenFill) ){
|
||||||
|
@ -158,10 +174,34 @@ inline void PID::UpdateHistograms(){
|
||||||
//printf(".... %d \n", count[p]);
|
//printf(".... %d \n", count[p]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
for(int p = 0; p < cutList1.count(); p++ ){
|
||||||
|
if( cutList1[p].isEmpty() ) continue;
|
||||||
|
if( cutList1[p].containsPoint(QPointF(ch4, ch1), Qt::OddEvenFill) ){
|
||||||
|
if( t1 < tMin1[p] ) tMin1[p] = t1;
|
||||||
|
if( t1 > tMax1[p] ) tMax1[p] = t1;
|
||||||
|
count1[p] ++;
|
||||||
|
//printf("hdEE.... %d \n", count1[p]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hPID->UpdatePlot();
|
for(int p = 0; p < cutList2.count(); p++ ){
|
||||||
|
if( cutList2[p].isEmpty() ) continue;
|
||||||
|
if( cutList2[p].containsPoint(QPointF(ch1+ch4,ch1), Qt::OddEvenFill) ){
|
||||||
|
if( t1 < tMin2[p] ) tMin2[p] = t1;
|
||||||
|
if( t1 > tMax2[p] ) tMax2[p] = t1;
|
||||||
|
count2[p] ++;
|
||||||
|
//printf("hdEtotE.... %d \n", count2[p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for(int p = 0; p < cutList2.count(); p++ ){
|
||||||
|
printf("hdEE.... %d %d \n", p, count1[p]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//hPID->UpdatePlot();
|
||||||
hdE->UpdatePlot();
|
hdE->UpdatePlot();
|
||||||
hE->UpdatePlot();
|
hE->UpdatePlot();
|
||||||
hdT->UpdatePlot();
|
hdT->UpdatePlot();
|
||||||
|
@ -170,7 +210,7 @@ inline void PID::UpdateHistograms(){
|
||||||
hdEtotE->UpdatePlot();
|
hdEtotE->UpdatePlot();
|
||||||
hdEdT->UpdatePlot();
|
hdEdT->UpdatePlot();
|
||||||
hTWin->UpdatePlot();
|
hTWin->UpdatePlot();
|
||||||
|
/*
|
||||||
//========== output to Influx
|
//========== output to Influx
|
||||||
QList<QString> cutNameList = hPID->GetCutNameList();
|
QList<QString> cutNameList = hPID->GetCutNameList();
|
||||||
for( int p = 0; p < cutList.count(); p ++){
|
for( int p = 0; p < cutList.count(); p ++){
|
||||||
|
@ -184,6 +224,7 @@ inline void PID::UpdateHistograms(){
|
||||||
influx->WriteData(dataBaseName);
|
influx->WriteData(dataBaseName);
|
||||||
influx->ClearDataPointsBuffer();
|
influx->ClearDataPointsBuffer();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,133 +0,0 @@
|
||||||
#ifndef RASIOR_h
|
|
||||||
#define RASIOR_h
|
|
||||||
|
|
||||||
/*********************************************
|
|
||||||
* This is online analyzer for RASIOR, ANL
|
|
||||||
*
|
|
||||||
* Created by Ryan @ 2023-10-16
|
|
||||||
*
|
|
||||||
* ******************************************/
|
|
||||||
#include "Analyser.h"
|
|
||||||
|
|
||||||
|
|
||||||
class RAISOR : public Analyzer{
|
|
||||||
|
|
||||||
public:
|
|
||||||
RAISOR(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent = nullptr): Analyzer(digi, nDigi, parent){
|
|
||||||
|
|
||||||
|
|
||||||
SetUpdateTimeInSec(1.0);
|
|
||||||
|
|
||||||
RedefineEventBuilder({0}); // only builder for the 0-th digitizer.
|
|
||||||
tick2ns = digi[0]->GetTick2ns();
|
|
||||||
|
|
||||||
SetBackwardBuild(false, 100); // using normal building (acceding in time) or backward building, int the case of backward building, default events to be build is 100.
|
|
||||||
evtbder = GetEventBuilder();
|
|
||||||
evtbder->SetTimeWindow(500);
|
|
||||||
|
|
||||||
//========== use the influx from the Analyzer
|
|
||||||
influx = new InfluxDB("https://fsunuc.physics.fsu.edu/influx/");
|
|
||||||
dataBaseName = "testing";
|
|
||||||
|
|
||||||
SetUpCanvas(); // see below
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
void SetUpCanvas();
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void UpdateHistograms();
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
MultiBuilder *evtbder;
|
|
||||||
|
|
||||||
Histogram2D * hPID;
|
|
||||||
|
|
||||||
int tick2ns;
|
|
||||||
|
|
||||||
float dE, E;
|
|
||||||
unsigned long long dE_t, E_t;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
inline void RAISOR::SetUpCanvas(){
|
|
||||||
|
|
||||||
setGeometry(0, 0, 500, 500);
|
|
||||||
|
|
||||||
//============ histograms
|
|
||||||
hPID = new Histogram2D("RAISOR", "E", "dE", 100, 0, 5000, 100, 0, 20000, this);
|
|
||||||
layout->addWidget(hPID, 0, 0);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void RAISOR::UpdateHistograms(){
|
|
||||||
|
|
||||||
if( this->isVisible() == false ) return;
|
|
||||||
|
|
||||||
BuildEvents(false); // call the event builder to build events
|
|
||||||
|
|
||||||
//============ Get events, and do analysis
|
|
||||||
long eventBuilt = evtbder->eventBuilt;
|
|
||||||
if( eventBuilt == 0 ) return;
|
|
||||||
|
|
||||||
//============ Get the cut list, if any
|
|
||||||
QList<QPolygonF> cutList = hPID->GetCutList();
|
|
||||||
const int nCut = cutList.count();
|
|
||||||
unsigned long long tMin[nCut] = {0xFFFFFFFFFFFFFFFF}, tMax[nCut] = {0};
|
|
||||||
unsigned int count[nCut]={0};
|
|
||||||
|
|
||||||
//============ Processing data and fill histograms
|
|
||||||
long eventIndex = evtbder->eventIndex;
|
|
||||||
long eventStart = eventIndex - eventBuilt + 1;
|
|
||||||
if(eventStart < 0 ) eventStart += MaxNEvent;
|
|
||||||
|
|
||||||
for( long i = eventStart ; i <= eventIndex; i ++ ){
|
|
||||||
std::vector<Hit> event = evtbder->events[i];
|
|
||||||
//printf("-------------- %ld\n", i);
|
|
||||||
|
|
||||||
if( event.size() == 0 ) return;
|
|
||||||
|
|
||||||
for( int k = 0; k < (int) event.size(); k++ ){
|
|
||||||
//event[k].Print();
|
|
||||||
if( event[k].ch == 0 ) {dE = event[k].energy; dE_t = event[k].timestamp;}
|
|
||||||
if( event[k].ch == 1 ) {E = event[k].energy; E_t = event[k].timestamp;}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// printf("(E, dE) = (%f, %f)\n", E, dE);
|
|
||||||
hPID->Fill(E + RandomGauss(0, 100), dE+ RandomGauss(0, 100)); // x, y
|
|
||||||
|
|
||||||
//check events inside any Graphical cut and extract the rate
|
|
||||||
for(int p = 0; p < cutList.count(); p++ ){
|
|
||||||
if( cutList[p].isEmpty() ) continue;
|
|
||||||
if( cutList[p].containsPoint(QPointF(E, dE), Qt::OddEvenFill) ){
|
|
||||||
if( dE_t < tMin[p] ) tMin[p] = dE_t;
|
|
||||||
if( dE_t > tMax[p] ) tMax[p] = dE_t;
|
|
||||||
count[p] ++;
|
|
||||||
//printf(".... %d \n", count[p]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hPID->UpdatePlot();
|
|
||||||
|
|
||||||
//========== output to Influx
|
|
||||||
QList<QString> cutNameList = hPID->GetCutNameList();
|
|
||||||
for( int p = 0; p < cutList.count(); p ++){
|
|
||||||
if( cutList[p].isEmpty() ) continue;
|
|
||||||
double dT = (tMax[p]-tMin[p]) * tick2ns / 1e9; // tick to sec
|
|
||||||
double rate = count[p]*1.0/(dT);
|
|
||||||
//printf("%llu %llu, %f %d\n", tMin[p], tMax[p], dT, count[p]);
|
|
||||||
//printf("%10s | %d | %f Hz \n", cutNameList[p].toStdString().c_str(), count[p], rate);
|
|
||||||
|
|
||||||
influx->AddDataPoint("Cut,name=" + cutNameList[p].toStdString()+ " value=" + std::to_string(rate));
|
|
||||||
influx->WriteData(dataBaseName);
|
|
||||||
influx->ClearDataPointsBuffer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -164,6 +164,12 @@ inline void RAISOR1::UpdateHistograms(){
|
||||||
unsigned long long tMin[nCut] = {0xFFFFFFFFFFFFFFFF}, tMax[nCut] = {0};
|
unsigned long long tMin[nCut] = {0xFFFFFFFFFFFFFFFF}, tMax[nCut] = {0};
|
||||||
unsigned int count[nCut]={0};
|
unsigned int count[nCut]={0};
|
||||||
|
|
||||||
|
|
||||||
|
QList<QPolygonF> cutList1 = hXX->GetCutList();
|
||||||
|
const int nCut1 = cutList1.count();
|
||||||
|
unsigned long long tMin1[nCut1] = {0xFFFFFFFFFFFFFFFF}, tMax1[nCut1] = {0};
|
||||||
|
unsigned int count1[nCut1]={0};
|
||||||
|
|
||||||
//============ Processing data and fill histograms
|
//============ Processing data and fill histograms
|
||||||
long eventIndex = evtbder->eventIndex;
|
long eventIndex = evtbder->eventIndex;
|
||||||
long eventStart = eventIndex - eventBuilt + 1;
|
long eventStart = eventIndex - eventBuilt + 1;
|
||||||
|
@ -174,29 +180,11 @@ inline void RAISOR1::UpdateHistograms(){
|
||||||
//printf("-------------- %ld\n", i);
|
//printf("-------------- %ld\n", i);
|
||||||
|
|
||||||
if( event.size() == 0 ) return;
|
if( event.size() == 0 ) return;
|
||||||
/*
|
|
||||||
int E = energy[chX1] +energy[chX2] ;//+ gRandom->Gaus(0, 500);
|
|
||||||
int dE = energy[chY1] + energy[chY2] ;//+ gRandom->Gaus(0, 500);
|
|
||||||
float X = 0;
|
|
||||||
//float Y = 0;
|
|
||||||
if( energy[chX1] !=0 && energy[chX2] !=0) {
|
|
||||||
X = ((float)energy[chX1] - (float)energy[chX2])/((float)energy[chX1] + (float)energy[chX2]);
|
|
||||||
hXX->Fill(energy[chX1],energy[chX2]);
|
|
||||||
//hXE->Fill(E,X);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
if( energy[chY1] !=0 && energy[chY2] !=0 ) {
|
|
||||||
Y = ((float)energy[chY1] - (float)energy[chY2])/((float)energy[chY1] + (float)energy[chY2]);
|
|
||||||
hYY->Fill(energy[chY1],energy[chY2]);
|
|
||||||
hYE->Fill(dE,X);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
for( int k = 0; k < (int) event.size(); k++ ){
|
for( int k = 0; k < (int) event.size(); k++ ){
|
||||||
//event[k].Print();
|
//event[k].Print();
|
||||||
if( event[k].ch == 8 ) {dE = event[k].energy; dE_t = event[k].timestamp;} // Surface Barrier dE detector
|
if( event[k].ch == 8 ) {dE = event[k].energy; dE_t = event[k].timestamp;} // Surface Barrier dE detector
|
||||||
if( event[k].ch == 9 ) {E = event[k].energy; E_t = event[k].timestamp;} // Surface Barrier E detector
|
if( event[k].ch == 8 ) {E = event[k].energy; E_t = event[k].timestamp;} // Surface Barrier E detector
|
||||||
|
|
||||||
if( event[k].ch == 10 ) {e0 = event[k].energy; t0 = event[k].timestamp;} //
|
if( event[k].ch == 10 ) {e0 = event[k].energy; t0 = event[k].timestamp;} //
|
||||||
if( event[k].ch == 11 ) {e1= event[k].energy; t1 = event[k].timestamp;} // The 4 output signals from the
|
if( event[k].ch == 11 ) {e1= event[k].energy; t1 = event[k].timestamp;} // The 4 output signals from the
|
||||||
|
@ -231,9 +219,20 @@ inline void RAISOR1::UpdateHistograms(){
|
||||||
if( dE_t < tMin[p] ) tMin[p] = dE_t;
|
if( dE_t < tMin[p] ) tMin[p] = dE_t;
|
||||||
if( dE_t > tMax[p] ) tMax[p] = dE_t;
|
if( dE_t > tMax[p] ) tMax[p] = dE_t;
|
||||||
count[p] ++;
|
count[p] ++;
|
||||||
//printf(".... %d \n", count[p]);
|
printf("hPID.... %d \n", count[p]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(int p = 0; p < cutList1.count(); p++ ){
|
||||||
|
if( cutList1[p].isEmpty() ) continue;
|
||||||
|
if( cutList1[p].containsPoint(QPointF(e1, e0), Qt::OddEvenFill) ){
|
||||||
|
if( t0 < tMin1[p] ) tMin1[p] = t0;
|
||||||
|
if( t0 > tMax1[p] ) tMax1[p] = t0;
|
||||||
|
count1[p] ++;
|
||||||
|
printf("hXX.... %d \n", count1[p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hPID->UpdatePlot();
|
hPID->UpdatePlot();
|
||||||
|
|
|
@ -16,7 +16,7 @@ public:
|
||||||
RAISOR2(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent = nullptr): Analyzer(digi, nDigi, parent){
|
RAISOR2(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent = nullptr): Analyzer(digi, nDigi, parent){
|
||||||
|
|
||||||
|
|
||||||
SetUpdateTimeInSec(1.0);
|
SetUpdateTimeInSec(4.0);
|
||||||
|
|
||||||
RedefineEventBuilder({0}); // only builder for the 0-th digitizer.
|
RedefineEventBuilder({0}); // only builder for the 0-th digitizer.
|
||||||
tick2ns = digi[0]->GetTick2ns();
|
tick2ns = digi[0]->GetTick2ns();
|
||||||
|
@ -100,22 +100,22 @@ inline void RAISOR2::SetUpCanvas(){
|
||||||
setGeometry(0, 0, 1500, 2000);
|
setGeometry(0, 0, 1500, 2000);
|
||||||
|
|
||||||
//============ histograms
|
//============ histograms
|
||||||
hPID = new Histogram2D("RAISOR2", "E", "dE", 100, 0, 2000, 100, 0, 2000, this);
|
hPID = new Histogram2D("RAISOR2", "E", "dE", 100, 0, 11000, 100, 0, 11000, this);
|
||||||
layout->addWidget(hPID, 0, 0);
|
layout->addWidget(hPID, 0, 0);
|
||||||
|
|
||||||
hXY = new Histogram2D("2D position plot", "X position", "Y position", 100, -1, 1, 100, -1, 1, this);
|
hXY = new Histogram2D("2D position plot", "X position", "Y position", 200, -1, 1, 200, -1, 1, this);
|
||||||
layout->addWidget(hXY, 0, 1);
|
layout->addWidget(hXY, 0, 1);
|
||||||
|
|
||||||
hXX = new Histogram2D("X1 versus X2", "X2", "X1", 100, 0, 5000, 100, 0, 5000, this);
|
hXX = new Histogram2D("X1 versus X2", "X2", "X1", 100, 0, 8000, 100, 0, 8000, this);
|
||||||
layout->addWidget(hXX, 0, 2);
|
layout->addWidget(hXX, 0, 2);
|
||||||
|
|
||||||
hYY = new Histogram2D("Y1 versus Y2", "Y2", "Y1", 100, 0, 3000, 100, 0, 3000, this);
|
hYY = new Histogram2D("Y1 versus Y2", "Y2", "Y1", 100, 0, 8000, 100, 0, 8000, this);
|
||||||
layout->addWidget(hYY, 0, 3);
|
layout->addWidget(hYY, 0, 3);
|
||||||
|
|
||||||
hXE = new Histogram1D("X energy", "Ex", 300, 0, 8000, this);
|
hXE = new Histogram1D("X energy", "Ex", 300, 0, 8000, this);
|
||||||
layout->addWidget(hXE, 1, 0);
|
layout->addWidget(hXE, 1, 0);
|
||||||
|
|
||||||
hYE = new Histogram1D("Y energy", "Ey", 300, 0, 4000, this);
|
hYE = new Histogram1D("Y energy", "Ey", 300, 0, 8000, this);
|
||||||
layout->addWidget(hYE, 1, 1);
|
layout->addWidget(hYE, 1, 1);
|
||||||
|
|
||||||
hX = new Histogram1D("X position", "X", 300, -1, 1, this);
|
hX = new Histogram1D("X position", "X", 300, -1, 1, this);
|
||||||
|
@ -124,25 +124,25 @@ inline void RAISOR2::SetUpCanvas(){
|
||||||
hY = new Histogram1D("Y position", "Y", 300, -1, 1, this);
|
hY = new Histogram1D("Y position", "Y", 300, -1, 1, this);
|
||||||
layout->addWidget(hY, 1, 3);
|
layout->addWidget(hY, 1, 3);
|
||||||
|
|
||||||
hXPE = new Histogram2D("X energy versus X position", "X position", "X energy", 100, -1, 1, 100, -2000, 20000, this);
|
hXPE = new Histogram2D("X energy versus X position", "X position", "X energy", 100, -1, 1, 100, 0, 8000, this);
|
||||||
layout->addWidget(hXPE, 0, 4);
|
layout->addWidget(hXPE, 0, 4);
|
||||||
|
|
||||||
hYPE = new Histogram2D("Y energy versus Y position", "Y position", "Y energy", 100, -1, 1, 100, 0, 5000, this);
|
hYPE = new Histogram2D("Y energy versus Y position", "Y position", "Y energy", 100, -1, 1, 100, 0, 8000, this);
|
||||||
layout->addWidget(hYPE, 1, 4);
|
layout->addWidget(hYPE, 1, 4);
|
||||||
|
|
||||||
hXEdE1 = new Histogram2D("X energy versus dE signal 1", "Ex", "dE signal 1", 100, -200, 20000, 100, -200, 10000, this);
|
hXEdE1 = new Histogram2D("X energy versus dE signal 1", "Ex", "dE signal 1", 100, 0, 8000, 100, 0, 8000, this);
|
||||||
layout->addWidget(hXEdE1, 2, 0);
|
layout->addWidget(hXEdE1, 2, 0);
|
||||||
|
|
||||||
hYEdE1 = new Histogram2D("Y energy versus dE signal 1", "Ey", "dE signal 1", 100, 0, 6000, 100, 0, 6000, this);
|
hYEdE1 = new Histogram2D("Y energy versus dE signal 1", "Ey", "dE signal 1", 100, 0, 8000, 100, 0, 8000, this);
|
||||||
layout->addWidget(hYEdE1, 2, 1);
|
layout->addWidget(hYEdE1, 2, 1);
|
||||||
|
|
||||||
hXEdE2 = new Histogram2D("X energy versus dE signal 2", "Ex", "dE signal 2", 100, -500, 20000, 100, -500, 15000, this);
|
hXEdE2 = new Histogram2D("X energy versus dE signal 2", "Ex", "dE signal 2", 100, 0, 8000, 100, 0, 8000, this);
|
||||||
layout->addWidget(hXEdE2, 2, 2);
|
layout->addWidget(hXEdE2, 2, 2);
|
||||||
|
|
||||||
hYEdE2 = new Histogram2D("Y energy versus dE signal 2", "Ey", "dE signal 2", 100, -500, 5000, 100, -500, 12000, this);
|
hYEdE2 = new Histogram2D("Y energy versus dE signal 2", "Ey", "dE signal 2", 100, 0, 8000, 100, 0, 8000, this);
|
||||||
layout->addWidget(hYEdE2, 2, 3);
|
layout->addWidget(hYEdE2, 2, 3);
|
||||||
|
|
||||||
hXYE = new Histogram2D("2D energy plot", "Ex", "Ey", 100, 0, 10000, 100, 0, 6000, this);
|
hXYE = new Histogram2D("2D energy plot", "Ex", "Ey", 100, 0, 8000, 100, 0, 8000, this);
|
||||||
layout->addWidget(hXYE, 2, 4);
|
layout->addWidget(hXYE, 2, 4);
|
||||||
|
|
||||||
|
|
||||||
|
@ -164,6 +164,20 @@ inline void RAISOR2::UpdateHistograms(){
|
||||||
unsigned long long tMin[nCut] = {0xFFFFFFFFFFFFFFFF}, tMax[nCut] = {0};
|
unsigned long long tMin[nCut] = {0xFFFFFFFFFFFFFFFF}, tMax[nCut] = {0};
|
||||||
unsigned int count[nCut]={0};
|
unsigned int count[nCut]={0};
|
||||||
|
|
||||||
|
QList<QPolygonF> cutList1 = hXEdE1->GetCutList();
|
||||||
|
const int nCut1 = cutList1.count();
|
||||||
|
unsigned long long tMin1[nCut1] = {0xFFFFFFFFFFFFFFFF}, tMax1[nCut1] = {0};
|
||||||
|
unsigned int count1[nCut1]={0};
|
||||||
|
|
||||||
|
QList<QPolygonF> cutList2 = hYEdE1->GetCutList();
|
||||||
|
const int nCut2 = cutList2.count();
|
||||||
|
unsigned long long tMin2[nCut2] = {0xFFFFFFFFFFFFFFFF}, tMax2[nCut2] = {0};
|
||||||
|
unsigned int count2[nCut2]={0};
|
||||||
|
|
||||||
|
QList<QPolygonF> cutList3 = hXY->GetCutList();
|
||||||
|
const int nCut3 = cutList3.count();
|
||||||
|
unsigned long long tMin3[nCut3] = {0xFFFFFFFFFFFFFFFF}, tMax3[nCut3] = {0};
|
||||||
|
unsigned int count3[nCut3]={0};
|
||||||
//============ Processing data and fill histograms
|
//============ Processing data and fill histograms
|
||||||
long eventIndex = evtbder->eventIndex;
|
long eventIndex = evtbder->eventIndex;
|
||||||
long eventStart = eventIndex - eventBuilt + 1;
|
long eventStart = eventIndex - eventBuilt + 1;
|
||||||
|
@ -174,29 +188,11 @@ inline void RAISOR2::UpdateHistograms(){
|
||||||
//printf("-------------- %ld\n", i);
|
//printf("-------------- %ld\n", i);
|
||||||
|
|
||||||
if( event.size() == 0 ) return;
|
if( event.size() == 0 ) return;
|
||||||
/*
|
|
||||||
int E = energy[chX1] +energy[chX2] ;//+ gRandom->Gaus(0, 500);
|
|
||||||
int dE = energy[chY1] + energy[chY2] ;//+ gRandom->Gaus(0, 500);
|
|
||||||
float X = 0;
|
|
||||||
//float Y = 0;
|
|
||||||
if( energy[chX1] !=0 && energy[chX2] !=0) {
|
|
||||||
X = ((float)energy[chX1] - (float)energy[chX2])/((float)energy[chX1] + (float)energy[chX2]);
|
|
||||||
hXX->Fill(energy[chX1],energy[chX2]);
|
|
||||||
//hXE->Fill(E,X);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
if( energy[chY1] !=0 && energy[chY2] !=0 ) {
|
|
||||||
Y = ((float)energy[chY1] - (float)energy[chY2])/((float)energy[chY1] + (float)energy[chY2]);
|
|
||||||
hYY->Fill(energy[chY1],energy[chY2]);
|
|
||||||
hYE->Fill(dE,X);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
for( int k = 0; k < (int) event.size(); k++ ){
|
for( int k = 0; k < (int) event.size(); k++ ){
|
||||||
//event[k].Print();
|
//event[k].Print();
|
||||||
if( event[k].ch == 8 ) {dE = event[k].energy; dE_t = event[k].timestamp;} // Surface Barrier dE detector
|
if( event[k].ch == 14 ) {dE = event[k].energy; dE_t = event[k].timestamp;} // Surface Barrier dE detector
|
||||||
if( event[k].ch == 9 ) {E = event[k].energy; E_t = event[k].timestamp;} // Surface Barrier E detector
|
if( event[k].ch == 15 ) {E = event[k].energy; E_t = event[k].timestamp;} // Surface Barrier E detector
|
||||||
|
|
||||||
if( event[k].ch == 10 ) {e0 = event[k].energy; t0 = event[k].timestamp;} //
|
if( event[k].ch == 10 ) {e0 = event[k].energy; t0 = event[k].timestamp;} //
|
||||||
if( event[k].ch == 11 ) {e1= event[k].energy; t1 = event[k].timestamp;} // The 4 output signals from the
|
if( event[k].ch == 11 ) {e1= event[k].energy; t1 = event[k].timestamp;} // The 4 output signals from the
|
||||||
|
@ -211,13 +207,13 @@ inline void RAISOR2::UpdateHistograms(){
|
||||||
hPID->Fill(E + RandomGauss(0, 100), dE+ RandomGauss(0, 100)); // x, y
|
hPID->Fill(E + RandomGauss(0, 100), dE+ RandomGauss(0, 100)); // x, y
|
||||||
hXX->Fill(e1 , e0); //
|
hXX->Fill(e1 , e0); //
|
||||||
hYY->Fill(e3, e2);
|
hYY->Fill(e3, e2);
|
||||||
hXY->Fill(((e0-e1)/(e0+e1)),((e2-e3)/(e2+e3)));
|
hXY->Fill(((e0-e1)/(e0+e1)),((e3-e2)/(e2+e3)));
|
||||||
hXE->Fill(e0+e1);
|
hXE->Fill(e0+e1);
|
||||||
hYE->Fill(e2+e3);
|
hYE->Fill(e2+e3);
|
||||||
hX->Fill(((e0-e1)/(e0+e1)));
|
hX->Fill(((e0-e1)/(e0+e1)));
|
||||||
hY->Fill(((e2-e3)/(e2+e3)));
|
hY->Fill(((e3-e2)/(e2+e3)));
|
||||||
hXPE->Fill(((e0-e1)/(e0+e1)),(e0+e1));
|
hXPE->Fill(((e0-e1)/(e0+e1)),(e0+e1));
|
||||||
hYPE->Fill(((e2-e3)/(e2+e3)),(e2+e3));
|
hYPE->Fill(((e3-e2)/(e2+e3)),(e2+e3));
|
||||||
hXEdE1->Fill((e0+e1),dE1);
|
hXEdE1->Fill((e0+e1),dE1);
|
||||||
hYEdE1->Fill(e2+e3,dE1);
|
hYEdE1->Fill(e2+e3,dE1);
|
||||||
hXEdE2->Fill(e0+e1,dE2);
|
hXEdE2->Fill(e0+e1,dE2);
|
||||||
|
@ -234,6 +230,37 @@ inline void RAISOR2::UpdateHistograms(){
|
||||||
//printf(".... %d \n", count[p]);
|
//printf(".... %d \n", count[p]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(int p = 0; p < cutList1.count(); p++ ){
|
||||||
|
if( cutList1[p].isEmpty() ) continue;
|
||||||
|
if( cutList1[p].containsPoint(QPointF((e0+e1), dE1), Qt::OddEvenFill) ){
|
||||||
|
if( dE1_t < tMin1[p] ) tMin1[p] = dE1_t;
|
||||||
|
if( dE1_t > tMax1[p] ) tMax1[p] = dE1_t;
|
||||||
|
count1[p] ++;
|
||||||
|
//printf("hXX.... %d \n", count1[p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int p = 0; p < cutList2.count(); p++ ){
|
||||||
|
if( cutList2[p].isEmpty() ) continue;
|
||||||
|
if( cutList2[p].containsPoint(QPointF((e2+e3), dE1), Qt::OddEvenFill) ){
|
||||||
|
if( dE1_t < tMin2[p] ) tMin2[p] = dE1_t;
|
||||||
|
if( dE1_t > tMax2[p] ) tMax2[p] = dE1_t;
|
||||||
|
count2[p] ++;
|
||||||
|
//printf("hXX.... %d \n", count2[p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int p = 0; p < cutList3.count(); p++ ){
|
||||||
|
if( cutList3[p].isEmpty() ) continue;
|
||||||
|
if( cutList3[p].containsPoint(QPointF(((e0-e1)/(e0+e1)), ((e2-e3)/(e2+e3))), Qt::OddEvenFill) ){
|
||||||
|
if( ((t2-t3)/(t2+t3)) < tMin3[p] ) tMin3[p] = ((t2-t3)/(t2+t3));
|
||||||
|
if( ((t2-t3)/(t2+t3)) > tMax3[p] ) tMax3[p] = ((t2-t3)/(t2+t3));
|
||||||
|
count3[p] ++;
|
||||||
|
//printf("hXX.... %d \n", count3[p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hPID->UpdatePlot();
|
hPID->UpdatePlot();
|
||||||
|
|
273
analyzers/TEST.h
Normal file
273
analyzers/TEST.h
Normal file
|
@ -0,0 +1,273 @@
|
||||||
|
#ifndef TEST_h
|
||||||
|
#define TEST_h
|
||||||
|
|
||||||
|
/*********************************************
|
||||||
|
* This is online analyzer for RASIOR, ANL
|
||||||
|
*
|
||||||
|
* Created by Ryan @ 2023-10-16
|
||||||
|
*
|
||||||
|
* ******************************************/
|
||||||
|
#include "Analyser.h"
|
||||||
|
|
||||||
|
|
||||||
|
class TEST : public Analyzer{
|
||||||
|
|
||||||
|
public:
|
||||||
|
TEST(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent = nullptr): Analyzer(digi, nDigi, parent){
|
||||||
|
|
||||||
|
|
||||||
|
SetUpdateTimeInSec(4.0);
|
||||||
|
|
||||||
|
RedefineEventBuilder({0}); // only builder for the 0-th digitizer.
|
||||||
|
tick2ns = digi[0]->GetTick2ns();
|
||||||
|
|
||||||
|
SetBackwardBuild(false, 100); // using normal building (acceding in time) or backward building, int the case of backward building, default events to be build is 100.
|
||||||
|
evtbder = GetEventBuilder();
|
||||||
|
evtbder->SetTimeWindow(500);
|
||||||
|
|
||||||
|
//========== use the influx from the Analyzer
|
||||||
|
influx = new InfluxDB("https://fsunuc.physics.fsu.edu/influx/");
|
||||||
|
dataBaseName = "testing";
|
||||||
|
|
||||||
|
SetUpCanvas(); // see below
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
void SetUpCanvas();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void UpdateHistograms();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
MultiBuilder *evtbder;
|
||||||
|
|
||||||
|
Histogram2D * hPID;
|
||||||
|
|
||||||
|
Histogram2D * hXX; // X1 versus X2 : e[1] versus e[0]
|
||||||
|
Histogram2D * hYY; // Y1 versus Y2 : e[3] versus e[2]
|
||||||
|
|
||||||
|
Histogram1D * hXE; // X energy: e[0]+e[1]
|
||||||
|
Histogram1D * hYE; // Y energy: e[2]+e[3]
|
||||||
|
|
||||||
|
Histogram2D * hXYE; // 2D energy plot: e[2]+e[3] versus e[0]+e[1]
|
||||||
|
|
||||||
|
Histogram1D * hX; // X position:((e[0]-e[1])/(e[0]+e[1]))
|
||||||
|
Histogram1D * hY; // Y position:((e[2]-e[3])/(e[2]+e[3]))
|
||||||
|
|
||||||
|
Histogram2D * hXY; // 2D position plot: ((e[2]-e[3])/(e[2]+e[3])) versus ((e[0]-e[1])/(e[0]+e[1]))
|
||||||
|
|
||||||
|
|
||||||
|
Histogram2D * hXPE; // X position versus X energy: ((e[0]-e[1])/(e[0]+e[1])) versus (e[0]+e[1])
|
||||||
|
Histogram2D * hYPE; // Y position versus Y energy: ((e[2]-e[3])/(e[2]+e[3])) versus (e[2]+e[3])
|
||||||
|
|
||||||
|
//TH1F * hX1, * hX2, * hY1, *hY2;
|
||||||
|
|
||||||
|
Histogram2D * hXEdE1; //X energy versus dE signal 1
|
||||||
|
Histogram2D * hYEdE1; //Y energy versus dE signal 1
|
||||||
|
|
||||||
|
Histogram2D * hXEdE2; //X energy versus dE signal 2
|
||||||
|
Histogram2D * hYEdE2; //Y energy versus dE signal 2
|
||||||
|
|
||||||
|
Histogram1D * hX1, * hX2, * hY1, * hY2;
|
||||||
|
|
||||||
|
int chX1, chX2; // yellow, Red
|
||||||
|
int chY1, chY2; // Blue, White
|
||||||
|
|
||||||
|
int tick2ns;
|
||||||
|
|
||||||
|
float dE, E;
|
||||||
|
unsigned long long dE_t, E_t;
|
||||||
|
|
||||||
|
float e0, e1, e2, e3, dE1, dE2;
|
||||||
|
unsigned long long t0, t1, t2, t3, dE1_t, dE2_t;
|
||||||
|
//unsigned Int_t * energy;
|
||||||
|
//unsigned long energy;
|
||||||
|
/*
|
||||||
|
chX1 = 0; // left
|
||||||
|
chX2 = 1; // right
|
||||||
|
|
||||||
|
chY1 = 2; // top
|
||||||
|
chY2 = 3; // bottom
|
||||||
|
*/
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline void TEST::SetUpCanvas(){
|
||||||
|
|
||||||
|
setGeometry(0, 0, 1500, 2000);
|
||||||
|
|
||||||
|
//============ histograms
|
||||||
|
hPID = new Histogram2D("Test", "E", "dE", 100, 0, 11500, 100, 0, 11500, this);
|
||||||
|
layout->addWidget(hPID, 0, 0);
|
||||||
|
|
||||||
|
hXY = new Histogram2D("2D position plot", "X position", "Y position", 100, -100, 100, 100, -100, 100, this);
|
||||||
|
layout->addWidget(hXY, 0, 1);
|
||||||
|
|
||||||
|
hXX = new Histogram2D("X1 versus X2", "X2", "X1", 100, 0, 12500, 100, 0, 12500, this);
|
||||||
|
layout->addWidget(hXX, 0, 2);
|
||||||
|
|
||||||
|
hYY = new Histogram2D("Y1 versus Y2", "Y2", "Y1", 100, -2000, 12500, 100, -2000, 12500, this);
|
||||||
|
layout->addWidget(hYY, 0, 3);
|
||||||
|
|
||||||
|
hXE = new Histogram1D("X energy", "Ex", 300, -500, 25000, this);
|
||||||
|
layout->addWidget(hXE, 1, 0);
|
||||||
|
|
||||||
|
hYE = new Histogram1D("Y energy", "Ey", 300, -500, 25000, this);
|
||||||
|
layout->addWidget(hYE, 1, 1);
|
||||||
|
|
||||||
|
hX = new Histogram1D("X position", "X", 300, -1, 1, this);
|
||||||
|
layout->addWidget(hX, 1, 2);
|
||||||
|
|
||||||
|
hY = new Histogram1D("Y position", "Y", 300, -1, 1, this);
|
||||||
|
layout->addWidget(hY, 1, 3);
|
||||||
|
|
||||||
|
hXPE = new Histogram2D("X energy versus X position", "X position", "X energy", 100, -1, 1, 100, -2000, 25000, this);
|
||||||
|
layout->addWidget(hXPE, 0, 4);
|
||||||
|
|
||||||
|
hYPE = new Histogram2D("Y energy versus Y position", "Y position", "Y energy", 100, -1000, 1000, 100, -2000, 30000, this);
|
||||||
|
layout->addWidget(hYPE, 1, 4);
|
||||||
|
|
||||||
|
hXEdE1 = new Histogram2D("X energy versus dE signal 1", "Ex", "dE signal 1", 100, -500, 25000, 100, -200, 12500, this);
|
||||||
|
layout->addWidget(hXEdE1, 2, 0);
|
||||||
|
|
||||||
|
hYEdE1 = new Histogram2D("Y energy versus dE signal 1", "Ey", "dE signal 1", 100, -500, 25000, 100, -2000, 12500, this);
|
||||||
|
layout->addWidget(hYEdE1, 2, 1);
|
||||||
|
|
||||||
|
hXEdE2 = new Histogram2D("X energy versus dE signal 2", "Ex", "dE signal 2", 100, -500, 25000, 100, -500, 12500, this);
|
||||||
|
layout->addWidget(hXEdE2, 2, 2);
|
||||||
|
|
||||||
|
hYEdE2 = new Histogram2D("Y energy versus dE signal 2", "Ey", "dE signal 2", 100, -500, 25000, 100, -2000, 12500, this);
|
||||||
|
layout->addWidget(hYEdE2, 2, 3);
|
||||||
|
|
||||||
|
hXYE = new Histogram2D("2D energy plot", "Ex", "Ey", 100, 0, 25000, 100, 0, 30000, this);
|
||||||
|
layout->addWidget(hXYE, 2, 4);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void TEST::UpdateHistograms(){
|
||||||
|
|
||||||
|
if( this->isVisible() == false ) return;
|
||||||
|
|
||||||
|
BuildEvents(false); // call the event builder to build events
|
||||||
|
|
||||||
|
//============ Get events, and do analysis
|
||||||
|
long eventBuilt = evtbder->eventBuilt;
|
||||||
|
if( eventBuilt == 0 ) return;
|
||||||
|
|
||||||
|
//============ Get the cut list, if any
|
||||||
|
QList<QPolygonF> cutList = hPID->GetCutList();
|
||||||
|
const int nCut = cutList.count();
|
||||||
|
unsigned long long tMin[nCut] = {0xFFFFFFFFFFFFFFFF}, tMax[nCut] = {0};
|
||||||
|
unsigned int count[nCut]={0};
|
||||||
|
|
||||||
|
QList<QPolygonF> cutList1 = hXX->GetCutList();
|
||||||
|
const int nCut1 = cutList1.count();
|
||||||
|
unsigned long long tMin1[nCut1] = {0xFFFFFFFFFFFFFFFF}, tMax1[nCut1] = {0};
|
||||||
|
unsigned int count1[nCut1]={0};
|
||||||
|
|
||||||
|
//============ Processing data and fill histograms
|
||||||
|
long eventIndex = evtbder->eventIndex;
|
||||||
|
long eventStart = eventIndex - eventBuilt + 1;
|
||||||
|
if(eventStart < 0 ) eventStart += MaxNEvent;
|
||||||
|
|
||||||
|
for( long i = eventStart ; i <= eventIndex; i ++ ){
|
||||||
|
std::vector<Hit> event = evtbder->events[i];
|
||||||
|
//printf("-------------- %ld\n", i);
|
||||||
|
|
||||||
|
if( event.size() == 0 ) return;
|
||||||
|
|
||||||
|
|
||||||
|
for( int k = 0; k < (int) event.size(); k++ ){
|
||||||
|
//event[k].Print();
|
||||||
|
if( event[k].ch == 8 ) {dE = event[k].energy; dE_t = event[k].timestamp;} // Surface Barrier dE detector
|
||||||
|
if( event[k].ch == 8 ) {E = event[k].energy; E_t = event[k].timestamp;} // Surface Barrier E detector
|
||||||
|
|
||||||
|
if( event[k].ch == 8 ) {e0 = event[k].energy; t0 = event[k].timestamp;} //
|
||||||
|
if( event[k].ch == 8 ) {e1= event[k].energy; t1 = event[k].timestamp;} // The 4 output signals from the
|
||||||
|
if( event[k].ch == 8 ) {e2 = event[k].energy; t2 = event[k].timestamp;} // position sensitive E detector
|
||||||
|
if( event[k].ch == 8 ) {e3= event[k].energy; t3 = event[k].timestamp;} //
|
||||||
|
|
||||||
|
if( event[k].ch == 8 ) {dE1 = event[k].energy; dE1_t = event[k].timestamp;} // The 2 output signals from the
|
||||||
|
if( event[k].ch == 8 ) {dE2= event[k].energy; dE2_t = event[k].timestamp;} // square dE detector
|
||||||
|
}
|
||||||
|
|
||||||
|
// printf("(E, dE) = (%f, %f)\n", E, dE);
|
||||||
|
hPID->Fill(E + RandomGauss(0, 100), dE + RandomGauss(0, 100)); // x, y
|
||||||
|
//hXX->Fill(e1 + RandomGauss(0, 100), e0 + RandomGauss(0, 100)); //
|
||||||
|
hXX->Fill(e1, e0 ); //
|
||||||
|
hYY->Fill(e3 + RandomGauss(0, 100), e2 + RandomGauss(0, 100));
|
||||||
|
hXY->Fill(((e0-e1)/(e0+e1)) + RandomGauss(0, 100),((e2-e3)/(e2+e3)) + RandomGauss(0, 100));
|
||||||
|
hXE->Fill(e0+e1);
|
||||||
|
hYE->Fill(e2+e3);
|
||||||
|
hX->Fill(((e0-e1)/(e0+e1)));
|
||||||
|
hY->Fill(((e2-e3)/(e2+e3)));
|
||||||
|
hXPE->Fill(((e0-e1)/(e0+e1)) + RandomGauss(0, 100),(e0+e1) + RandomGauss(0, 100));
|
||||||
|
hYPE->Fill(((e2-e3)/(e2+e3)) + RandomGauss(0, 100),(e2+e3) + RandomGauss(0, 100));
|
||||||
|
hXEdE1->Fill((e0+e1)+ RandomGauss(0, 100),dE1 + RandomGauss(0, 100));
|
||||||
|
hYEdE1->Fill((e2+e3) + RandomGauss(0, 100),dE1 + RandomGauss(0, 100));
|
||||||
|
hXEdE2->Fill((e0+e1)+ RandomGauss(0, 100),dE2 + RandomGauss(0, 100));
|
||||||
|
hYEdE2->Fill((e2+e3)+ RandomGauss(0, 100),dE2 + + RandomGauss(0, 100));
|
||||||
|
hXYE->Fill((e0+e1) + RandomGauss(0, 100),(e2+e3) + RandomGauss(0, 100));
|
||||||
|
|
||||||
|
//check events inside any Graphical cut and extract the rate
|
||||||
|
for(int p = 0; p < cutList.count(); p++ ){
|
||||||
|
if( cutList[p].isEmpty() ) continue;
|
||||||
|
if( cutList[p].containsPoint(QPointF(E, dE), Qt::OddEvenFill) ){
|
||||||
|
if( dE_t < tMin[p] ) tMin[p] = dE_t;
|
||||||
|
if( dE_t > tMax[p] ) tMax[p] = dE_t;
|
||||||
|
count[p] ++;
|
||||||
|
//printf(".... %d \n", count[p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int p = 0; p < cutList1.count(); p++ ){
|
||||||
|
if( cutList1[p].isEmpty() ) continue;
|
||||||
|
if( cutList1[p].containsPoint(QPointF(e1, e0), Qt::OddEvenFill) ){
|
||||||
|
if( t0 < tMin1[p] ) tMin1[p] = t0;
|
||||||
|
if( t0 > tMax1[p] ) tMax1[p] = t0;
|
||||||
|
count1[p] ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int p = 0; p < cutList1.count(); p++ ){
|
||||||
|
printf("hXX.... %d %d \n", p, count1[p]);
|
||||||
|
}
|
||||||
|
|
||||||
|
hPID->UpdatePlot();
|
||||||
|
hXY->UpdatePlot();
|
||||||
|
hXX->UpdatePlot();
|
||||||
|
hYY->UpdatePlot();
|
||||||
|
hXE->UpdatePlot();
|
||||||
|
hYE->UpdatePlot();
|
||||||
|
hX->UpdatePlot();
|
||||||
|
hY->UpdatePlot();
|
||||||
|
hXPE->UpdatePlot();
|
||||||
|
hYPE->UpdatePlot();
|
||||||
|
hXEdE1->UpdatePlot();
|
||||||
|
hYEdE1->UpdatePlot();
|
||||||
|
hXEdE2->UpdatePlot();
|
||||||
|
hYEdE2->UpdatePlot();
|
||||||
|
hXYE->UpdatePlot();
|
||||||
|
|
||||||
|
//========== output to Influx
|
||||||
|
QList<QString> cutNameList = hPID->GetCutNameList();
|
||||||
|
for( int p = 0; p < cutList.count(); p ++){
|
||||||
|
if( cutList[p].isEmpty() ) continue;
|
||||||
|
double dT = (tMax[p]-tMin[p]) * tick2ns / 1e9; // tick to sec
|
||||||
|
double rate = count[p]*1.0/(dT);
|
||||||
|
//printf("%llu %llu, %f %d\n", tMin[p], tMax[p], dT, count[p]);
|
||||||
|
//printf("%10s | %d | %f Hz \n", cutNameList[p].toStdString().c_str(), count[p], rate);
|
||||||
|
|
||||||
|
influx->AddDataPoint("Cut,name=" + cutNameList[p].toStdString()+ " value=" + std::to_string(rate));
|
||||||
|
influx->WriteData(dataBaseName);
|
||||||
|
influx->ClearDataPointsBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
2
macro.h
2
macro.h
|
@ -11,7 +11,7 @@
|
||||||
#define MaxRecordLength 0x3fff * 8
|
#define MaxRecordLength 0x3fff * 8
|
||||||
#define MaxSaveFileSize 1024 * 1024 * 1024 * 2
|
#define MaxSaveFileSize 1024 * 1024 * 1024 * 2
|
||||||
|
|
||||||
#define MaxDisplayTraceTimeLength 10000 //ns
|
#define MaxDisplayTraceTimeLength 20000 //ns
|
||||||
#define ScopeUpdateMiliSec 200 // msec
|
#define ScopeUpdateMiliSec 200 // msec
|
||||||
#define MaxNumberOfTrace 5 // in an event
|
#define MaxNumberOfTrace 5 // in an event
|
||||||
|
|
||||||
|
|
24
main.cpp
24
main.cpp
|
@ -1,14 +1,34 @@
|
||||||
#include "FSUDAQ.h"
|
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
|
||||||
|
#include "FSUDAQ.h"
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include <sys/resource.h>
|
||||||
|
|
||||||
|
// class CustomApplication : public QApplication{
|
||||||
|
// public:
|
||||||
|
// CustomApplication(int &argc, char **argv) : QApplication(argc, argv) {}
|
||||||
|
|
||||||
|
// protected:
|
||||||
|
// bool notify(QObject *receiver, QEvent *event) override{
|
||||||
|
// qDebug() << event->type() << "Receiver:" << receiver;
|
||||||
|
// return QApplication::notify(receiver, event);
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
|
||||||
int main(int argc, char *argv[]){
|
int main(int argc, char *argv[]){
|
||||||
|
|
||||||
|
// CustomApplication a(argc, argv);
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
|
||||||
|
setpriority(PRIO_PROCESS, 0, -20);
|
||||||
|
|
||||||
bool isLock = false;
|
bool isLock = false;
|
||||||
int pid = 0;
|
int pid = 0;
|
||||||
QFile lockFile(DAQLockFile);
|
QFile lockFile(DAQLockFile);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user