Compare commits
No commits in common. "cf2cf510958d16f330597881516201b50dc7ff82" and "c8d5d2d0c4456ca391306dd29effe5008a505740" have entirely different histories.
cf2cf51095
...
c8d5d2d0c4
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -6,7 +6,6 @@ FSUDAQ_Qt6
|
|||
test
|
||||
test_indep
|
||||
programSettings.txt
|
||||
a4818_list.txt
|
||||
EventBuilder
|
||||
EventBuilderNew
|
||||
EventBuilder2
|
||||
|
|
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
|
@ -160,7 +160,6 @@
|
|||
"fstream": "cpp",
|
||||
"Analyzer.C": "cpp",
|
||||
"process_Run.C": "cpp",
|
||||
"EncoreAnalyzer.C": "cpp",
|
||||
"qfiledialog": "cpp"
|
||||
"EncoreAnalyzer.C": "cpp"
|
||||
}
|
||||
}
|
|
@ -113,9 +113,9 @@ int Digitizer::OpenDigitizer(int boardID, int portID, bool program, bool verbose
|
|||
}
|
||||
|
||||
if( ret == 0 ){
|
||||
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_USB_A4818 ) printf("### Open digitizer via A4818, port : %d, board : %d\n", portID, 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_USB_A4818 ) printf("Open digitizer via A4818, port : %d, board : %d\n", portID, boardID);
|
||||
}
|
||||
|
||||
if (ret != 0) {
|
||||
|
@ -1258,40 +1258,40 @@ std::string Digitizer::GetDPPString(int DPPType){
|
|||
void Digitizer::ErrorMsg(std::string header){
|
||||
switch (ret){
|
||||
///case CAEN_DGTZ_Success : /** 0 */ printf("%s | Operation completed successfully.\n", header.c_str()); 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 digi-%d | %d, Unspecified error.\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 digi-%d | %d, Invalid Link Type.\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 digi-%d | %d, Maximum number of devices exceeded.\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 digi-%d | %d, The interrupt level is not allowed.\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 digi-%d | %d, Unable to read 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 digi-%d | %d, The channel number is invalid.\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 digi-%d | %d, Invalid FPIO 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 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 digi-%d | %d, Communication Timeout.\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 digi-%d | %d, The event is not found.\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 digi-%d | %d, Out of memory.\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 digi-%d | %d, Unbale to open the digitizer.\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 digi-%d | %d, The digitizer is not ready.\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 digi-%d | %d, The digitizer flash memory is corrupted.\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 digi-%d | %d, Invalid firmware licence.\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 digi-%d | %d, The given trace 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 digi-%d | %d, The base address is not supported.\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;
|
||||
case CAEN_DGTZ_CommError : /** -1 */ printf("%s %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_InvalidParam : /** -3 */ printf("%s %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_InvalidHandle : /** -5 */ printf("%s %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_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_BadInterruptLev : /** -8 */ printf("%s %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_ReadDeviceRegisterFail : /** -10 */ printf("%s %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_InvalidChannelNumber : /** -13 */ printf("%s %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_FPIOModeInvalid : /** -15 */ printf("%s %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_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_Timeout : /** -18 */ printf("%s %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_EventNotFound : /** -20 */ printf("%s %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_OutOfMemory : /** -22 */ printf("%s %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_DigitizerNotFound : /** -24 */ printf("%s %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_DigitizerNotReady : /** -26 */ printf("%s %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_DigitizerMemoryCorrupted: /** -28 */ printf("%s %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_InvalidLicense : /** -30 */ printf("%s %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_UnsupportedTrace : /** -32 */ printf("%s %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_UnsupportedBaseAddress : /** -34 */ printf("%s %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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1339,10 +1339,8 @@ void Digitizer::SetOptimialAggOrg(){
|
|||
}
|
||||
|
||||
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 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 boardCfg = ReadRegister(DPP::BoardConfiguration);
|
||||
|
@ -1361,9 +1359,7 @@ void Digitizer::SetOptimialAggOrg(){
|
|||
printf(" Record Length (bit) : %u = %u sample = %u ns\n", RecordLen, RecordLen*8, RecordLen*8*16);
|
||||
printf("==============================================================\n");
|
||||
|
||||
|
||||
int eventSize = 6 + 2 * Ex + traceOn * RecordLen * 8; // sample
|
||||
printf(" estimated event size : %d sample \n", eventSize);
|
||||
double maxAggOrg = log2( MemorySizekSample * 1024 / eventSize / EventAgg );
|
||||
printf(" max Agg. Org. should be less than %.2f\n", maxAggOrg);
|
||||
uint32_t aggOrg = std::floor(maxAggOrg) ;
|
||||
|
|
|
@ -90,7 +90,6 @@ class Digitizer{
|
|||
bool IsConnected() {return isConnected;}
|
||||
|
||||
void DisableBoard() {softwareDisable = true;}
|
||||
void EnableBoard() {softwareDisable = false;}
|
||||
bool IsBoardDisabled() const {return softwareDisable;}
|
||||
|
||||
void PrintBoard();
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
#include <QMutex>
|
||||
#include <QWaitCondition>
|
||||
#include <QMessageBox>
|
||||
#include <QCoreApplication>
|
||||
|
||||
#include "macro.h"
|
||||
#include "ClassDigitizer.h"
|
||||
|
@ -36,13 +35,9 @@ public:
|
|||
stop = false;
|
||||
readCount = 0;
|
||||
clock_gettime(CLOCK_REALTIME, &t0);
|
||||
// ta = t0;
|
||||
ta = t0;
|
||||
t1 = t0;
|
||||
|
||||
digiMTX[ID].lock();
|
||||
digi->ReadACQStatus();
|
||||
digiMTX[ID].unlock();
|
||||
|
||||
printf("ReadDataThread for digi-%d running.\n", digi->GetSerialNumber());
|
||||
do{
|
||||
|
||||
|
@ -82,20 +77,20 @@ public:
|
|||
digi->ReadACQStatus();
|
||||
digiMTX[ID].unlock();
|
||||
t2 = t1;
|
||||
// QCoreApplication::processEvents();
|
||||
}
|
||||
|
||||
// if( isSaveData && !stop ) {
|
||||
// clock_gettime(CLOCK_REALTIME, &tb);
|
||||
// if( tb.tv_sec - ta.tv_sec > 2 ) {
|
||||
// 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] (" + QString::number(readCount) + ")");
|
||||
// digiMTX[ID].unlock();
|
||||
// // readCount = 0;
|
||||
// ta = tb;
|
||||
// }
|
||||
// }
|
||||
if( isSaveData && !stop ) {
|
||||
clock_gettime(CLOCK_REALTIME, &tb);
|
||||
if( tb.tv_sec - ta.tv_sec > 2 ) {
|
||||
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] (" + QString::number(readCount) + ")");
|
||||
digiMTX[ID].unlock();
|
||||
// readCount = 0;
|
||||
ta = tb;
|
||||
}
|
||||
}
|
||||
|
||||
}while(!stop);
|
||||
printf("ReadDataThread for digi-%d stopped.\n", digi->GetSerialNumber());
|
||||
}
|
||||
|
@ -109,6 +104,7 @@ private:
|
|||
bool isSaveData;
|
||||
bool isScope;
|
||||
unsigned long readCount;
|
||||
|
||||
};
|
||||
|
||||
//^#======================================================= Timing Thread
|
||||
|
|
|
@ -97,17 +97,8 @@ DigiSettingsPanel::DigiSettingsPanel(Digitizer ** digi, unsigned int nDigi, QStr
|
|||
SetUpInfo("Ch. Mem. Size ", memStr.toStdString() , infoLayout[ID], 3, 2);
|
||||
|
||||
uint32_t boardInfo = digi[ID]->GetSettingFromMemory(DPP::BoardInfo_R);
|
||||
// printf("----------- boardInfo : 0x%08X \n", boardInfo);
|
||||
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);
|
||||
printf("----------- boardInfo : 0x%08X \n", boardInfo);
|
||||
SetUpInfo("Board Type ", ((boardInfo >> 16) & 0xFF) == 0x10 ? "16-ch VME" : "8-ch Bd.", infoLayout[ID], 3, 4);
|
||||
|
||||
}
|
||||
|
||||
|
@ -228,17 +219,9 @@ DigiSettingsPanel::DigiSettingsPanel(Digitizer ** digi, unsigned int nDigi, QStr
|
|||
connect(bnLoadSettings, &QPushButton::clicked, this, &DigiSettingsPanel::LoadSetting);
|
||||
|
||||
rowID ++; //---------------------------
|
||||
// bnSendSoftwareTriggerSignal = new QPushButton("Send SW Trigger Signal", this);
|
||||
// buttonLayout->addWidget(bnSendSoftwareTriggerSignal, rowID, 0);
|
||||
// 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);
|
||||
}
|
||||
});
|
||||
bnSendSoftwareTriggerSignal = new QPushButton("Send SW Trigger Signal", this);
|
||||
buttonLayout->addWidget(bnSendSoftwareTriggerSignal, rowID, 0);
|
||||
connect(bnSendSoftwareTriggerSignal, &QPushButton::clicked, this, [=](){ digi[ID]->WriteRegister(DPP::SoftwareTrigger_W, 1); UpdateBoardAndChannelsStatus();});
|
||||
|
||||
bhAutoSetEventPulling = new QPushButton("Autoset Reading Conf.", this);
|
||||
buttonLayout->addWidget(bhAutoSetEventPulling, rowID, 1);
|
||||
|
@ -347,6 +330,7 @@ DigiSettingsPanel::DigiSettingsPanel(Digitizer ** digi, unsigned int nDigi, QStr
|
|||
ID = index;
|
||||
//if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) UpdatePanelFromMemory();
|
||||
UpdatePanelFromMemory();
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -1392,27 +1376,6 @@ 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(){
|
||||
|
@ -2317,7 +2280,7 @@ void DigiSettingsPanel::SetUpChannel_PSD(){
|
|||
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);
|
||||
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::PSD::DPPAlgorithmControl2_G, DPP::PSD::Bit_DPPAlgorithmControl2::LocalTrigValidMode, 1, 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);
|
||||
}
|
||||
|
||||
if( i == 1 ){
|
||||
|
@ -2327,8 +2290,8 @@ void DigiSettingsPanel::SetUpChannel_PSD(){
|
|||
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);
|
||||
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::PSD::DPPAlgorithmControl2_G, DPP::PSD::Bit_DPPAlgorithmControl2::TriggerCounterFlag, 1, 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(cbTrigCount[ID][ch], "", tabLayout, ch + 1, 5, DPP::PSD::Bit_DPPAlgorithmControl2::ListTrigCounter, DPP::PHA::DPPAlgorithmControl2_G, DPP::PHA::Bit_DPPAlgorithmControl2::TriggerCounterFlag, 1, ch);
|
||||
}
|
||||
|
||||
if( i == 2 ){
|
||||
|
|
|
@ -106,8 +106,7 @@ private:
|
|||
QPushButton * bnProgramPreDefined;
|
||||
QPushButton * bnClearBuffer;
|
||||
|
||||
// QPushButton * bnSendSoftwareTriggerSignal;
|
||||
QPushButton * bnSetNoTrace;
|
||||
QPushButton * bnSendSoftwareTriggerSignal;
|
||||
QPushButton * bhAutoSetEventPulling;
|
||||
//QPushButton * bnSendSoftwareClockSyncSignal;
|
||||
QPushButton * bnSaveSettings;
|
||||
|
@ -135,7 +134,6 @@ private:
|
|||
RComboBox * cbDigiProbe2[MaxNDigitizer];
|
||||
|
||||
QPushButton * bnChEnableMask[MaxNDigitizer][MaxRegChannel];
|
||||
QCheckBox * cbDigiEnable[MaxNDigitizer];
|
||||
RComboBox * cbAggOrg[MaxNDigitizer];
|
||||
RSpinBox * sbAggNum[MaxNDigitizer];
|
||||
QCheckBox * chkEnableExternalTrigger[MaxNDigitizer];
|
||||
|
|
164
FSUDAQ.cpp
164
FSUDAQ.cpp
|
@ -20,13 +20,10 @@
|
|||
#include "analyzers/EncoreAnalyzer.h"
|
||||
#include "analyzers/RAISOR1.h"
|
||||
#include "analyzers/RAISOR2.h"
|
||||
#include "analyzers/TEST.h"
|
||||
#include "analyzers/MCP.h"
|
||||
#include "analyzers/MCPandPSD.h"
|
||||
#include "analyzers/PID.h"
|
||||
|
||||
|
||||
std::vector<std::string> onlineAnalyzerList = {"Coincident","Splie-Pole", "Encore", "RAISOR1", "MCP", "PID", "RAISOR2", "TEST", "MCPandPSD" };
|
||||
std::vector<std::string> onlineAnalyzerList = {"Coincident","Splie-Pole", "Encore", "RAISOR1", "MCP", "PID", "RAISOR2" };
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
||||
DebugPrint("%s", "FSUDAQ");
|
||||
|
@ -47,7 +44,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
|||
runRecord = nullptr;
|
||||
model = nullptr;
|
||||
influx = nullptr;
|
||||
scalarCount = 0;
|
||||
|
||||
QWidget * mainLayoutWidget = new QWidget(this);
|
||||
setCentralWidget(mainLayoutWidget);
|
||||
|
@ -65,7 +61,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
|||
// cbOpenDigitizers->addItem("Open Digitizers (default program)", 2);
|
||||
// cbOpenDigitizers->addItem("Open Digitizers + load Settings", 3);
|
||||
//cbOpenDigitizers->addItem("Open Digitizers via USB", 3);
|
||||
cbOpenDigitizers->addItem("Open Digitizers via A4818(s)", 4);
|
||||
cbOpenDigitizers->addItem("Open Digitizers via A4818", 4);
|
||||
layout->addWidget(cbOpenDigitizers, 0, 0);
|
||||
connect(cbOpenDigitizers, &RComboBox::currentIndexChanged, this, &MainWindow::OpenDigitizers);
|
||||
|
||||
|
@ -297,10 +293,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
|||
|
||||
CheckElog();
|
||||
|
||||
|
||||
LogMsg("====== <font style=\"color: blue;\"><b>FSU DAQ is ready.</b></font> ======");
|
||||
|
||||
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow(){
|
||||
|
@ -363,6 +355,7 @@ void MainWindow::OpenDataPath(){
|
|||
|
||||
LoadLastRunFile();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::OpenRecord(){
|
||||
|
@ -584,38 +577,16 @@ void MainWindow::OpenDigitizers(){
|
|||
// return;
|
||||
// }
|
||||
|
||||
QStringList a4818PIDs;
|
||||
QString a4818PID = "26006";
|
||||
if( cbOpenDigitizers->currentData().toInt() == 4 ) {
|
||||
|
||||
QString a4818Path = QDir::current().absolutePath() + "/a4818_list.txt";
|
||||
LogMsg("Looking <b>" + a4818Path + "</b>");
|
||||
bool ok;
|
||||
a4818PID = QInputDialog::getText(nullptr, "A4818 PID", "Can be found on the A4818:", QLineEdit::Normal, "", &ok);
|
||||
|
||||
QFile file(a4818Path);
|
||||
|
||||
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.");
|
||||
if ( !ok || a4818PID.isEmpty()) {
|
||||
LogMsg("User cancel or fail to connect A4818 without PID");
|
||||
cbOpenDigitizers->setCurrentIndex(0);
|
||||
return;
|
||||
}else{
|
||||
|
||||
if( a4818PIDs.size() > 4){
|
||||
LogMsg("There are more than 4 a4818, please edit the MaxNPorts in macro.h and recompile.");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -628,29 +599,8 @@ void MainWindow::OpenDigitizers(){
|
|||
logMsgHTMLMode = false;
|
||||
nDigi = 0;
|
||||
std::vector<std::pair<int, int>> portList; //boardID, portID
|
||||
|
||||
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
|
||||
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.
|
||||
}
|
||||
}
|
||||
|
||||
}else{ // optical fiber
|
||||
|
||||
for(int port = 0; port < MaxNPorts; port++){
|
||||
|
||||
if( cbOpenDigitizers->currentData().toInt() == 4 ) port = a4818PID.toInt();
|
||||
for( int board = 0; board < MaxNBoards; board ++){ /// max number of diasy chain
|
||||
Digitizer dig;
|
||||
dig.OpenDigitizer(board, port);
|
||||
|
@ -658,12 +608,13 @@ void MainWindow::OpenDigitizers(){
|
|||
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()));
|
||||
}
|
||||
}//else{
|
||||
//LogMsg(QString("... Nothing at port: %1, board: %2.").arg(port).arg(board));
|
||||
//}
|
||||
dig.CloseDigitizer();
|
||||
QCoreApplication::processEvents(); //to prevent Qt said application not responding.
|
||||
}
|
||||
}
|
||||
}
|
||||
logMsgHTMLMode = true;
|
||||
|
||||
if( nDigi == 0 ) {
|
||||
|
@ -741,7 +692,7 @@ void MainWindow::OpenDigitizers(){
|
|||
canvas->FillHistograms();
|
||||
});
|
||||
|
||||
LogMsg("====== <font style=\"color: blue;\"><b>" + QString("Done. Opened %1 digitizer(s).").arg(nDigi) + "</b></font> =====");
|
||||
LogMsg(QString("Done. Opened %1 digitizer(s).").arg(nDigi));
|
||||
|
||||
WaitForDigitizersOpen(false);
|
||||
bnStartACQ->setStyleSheet("background-color: green;");
|
||||
|
@ -884,7 +835,6 @@ void MainWindow::SetupScalar(){
|
|||
|
||||
lbLastUpdateTime = nullptr;
|
||||
lbScalarACQStatus = nullptr;
|
||||
lbTotalFileSize = nullptr;
|
||||
|
||||
scalarThread = new TimingThread(scalar);
|
||||
scalarThread->SetWaitTimeinSec(1.0);
|
||||
|
@ -895,12 +845,11 @@ void MainWindow::SetupScalar(){
|
|||
if( digi[k]->GetNumInputCh() > maxNChannel ) maxNChannel = digi[k]->GetNumInputCh();
|
||||
}
|
||||
|
||||
scalar->setGeometry(0, 0, 50 + nDigi * 240, 160 + maxNChannel * 25);
|
||||
scalar->setGeometry(0, 0, 100 + nDigi * 200, 200 + maxNChannel * 20);
|
||||
|
||||
if( lbLastUpdateTime == nullptr ){
|
||||
lbLastUpdateTime = new QLabel("Last update : NA", scalar);
|
||||
lbScalarACQStatus = new QLabel("ACQ status", scalar);
|
||||
lbTotalFileSize = new QLabel("Total File Size", scalar);
|
||||
}
|
||||
|
||||
lbLastUpdateTime->setAlignment(Qt::AlignRight);
|
||||
|
@ -911,17 +860,13 @@ void MainWindow::SetupScalar(){
|
|||
scalarLayout->removeWidget(lbScalarACQStatus);
|
||||
scalarLayout->addWidget(lbScalarACQStatus, 0, 1 + nDigi);
|
||||
|
||||
lbTotalFileSize->setAlignment(Qt::AlignCenter);
|
||||
scalarLayout->removeWidget(lbTotalFileSize);
|
||||
scalarLayout->addWidget(lbTotalFileSize, 1, 0, 1, 1 + 2*nDigi);
|
||||
|
||||
int rowID = 3;
|
||||
///==== create the header row
|
||||
int rowID = 4;
|
||||
|
||||
for( int ch = 0; ch < maxNChannel; ch++){
|
||||
|
||||
if( ch == 0 ){
|
||||
QLabel * lbCH_H = new QLabel("Ch", scalar);
|
||||
lbCH_H->setAlignment(Qt::AlignCenter);
|
||||
scalarLayout->addWidget(lbCH_H, rowID, 0);
|
||||
}
|
||||
|
||||
|
@ -936,16 +881,22 @@ void MainWindow::SetupScalar(){
|
|||
leAccept = new QLineEdit**[nDigi];
|
||||
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){
|
||||
rowID = 2;
|
||||
leTrigger[iDigi] = new QLineEdit *[digi[iDigi]->GetNumInputCh()];
|
||||
leAccept[iDigi] = new QLineEdit *[digi[iDigi]->GetNumInputCh()];
|
||||
uint32_t chMask = digi[iDigi]->GetRegChannelMask();
|
||||
for( int ch = 0; ch < digi[iDigi]->GetNumInputCh(); ch++){
|
||||
|
||||
if( ch == 0 ){
|
||||
QWidget * hBox = new QWidget(scalar);
|
||||
QHBoxLayout * hBoxLayout = new QHBoxLayout(hBox);
|
||||
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(QString::number(digi[iDigi]->GetSerialNumber()), scalar);
|
||||
// lbDigi->setAlignment(Qt::AlignRight | Qt::AlignCenter);
|
||||
lbDigi->setAlignment(Qt::AlignCenter);
|
||||
lbDigi->setAlignment(Qt::AlignRight | Qt::AlignCenter);
|
||||
hBoxLayout->addWidget(lbDigi);
|
||||
|
||||
runStatus[iDigi] = new QPushButton("", scalar);
|
||||
|
@ -955,42 +906,24 @@ void MainWindow::SetupScalar(){
|
|||
runStatus[iDigi]->setToolTipDuration(-1);
|
||||
hBoxLayout->addWidget(runStatus[iDigi]);
|
||||
|
||||
rowID = 3;
|
||||
QWidget * hBox2 = new QWidget(scalar);
|
||||
QHBoxLayout * hBoxLayout2 = new QHBoxLayout(hBox2);
|
||||
scalarLayout->addWidget(hBox2, rowID, 2*iDigi+1, 1, 2);
|
||||
rowID ++;
|
||||
|
||||
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);
|
||||
lbA->setAlignment(Qt::AlignCenter);
|
||||
scalarLayout->addWidget(lbA, rowID, 2*iDigi+1);
|
||||
QLabel * lbB = new QLabel("Accp. [Hz]", scalar);
|
||||
lbB->setAlignment(Qt::AlignCenter);
|
||||
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 ++;
|
||||
leTrigger[iDigi][ch] = new QLineEdit(scalar);
|
||||
leTrigger[iDigi][ch]->setReadOnly(true);
|
||||
leTrigger[iDigi][ch]->setFixedSize(120, 25);
|
||||
leTrigger[iDigi][ch]->setAlignment(Qt::AlignRight);
|
||||
scalarLayout->addWidget(leTrigger[iDigi][ch], rowID, 2*iDigi+1);
|
||||
|
||||
leAccept[iDigi][ch] = new QLineEdit(scalar);
|
||||
leAccept[iDigi][ch]->setReadOnly(true);
|
||||
leAccept[iDigi][ch]->setFixedSize(120, 25);
|
||||
leAccept[iDigi][ch]->setAlignment(Qt::AlignRight);
|
||||
leAccept[iDigi][ch]->setStyleSheet("background-color: #F0F0F0;");
|
||||
|
||||
|
@ -1051,9 +984,7 @@ void MainWindow::UpdateScalar(){
|
|||
|
||||
// digi[0]->GetData()->PrintAllData();
|
||||
|
||||
// lbLastUpdateTime->setText("Last update: " + QDateTime::currentDateTime().toString("MM.dd hh:mm:ss"));
|
||||
lbLastUpdateTime->setText(QDateTime::currentDateTime().toString("MM/dd hh:mm:ss"));
|
||||
scalarCount ++;
|
||||
lbLastUpdateTime->setText("Last update: " + QDateTime::currentDateTime().toString("MM.dd hh:mm:ss"));
|
||||
|
||||
uint64_t totalFileSize = 0;
|
||||
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){
|
||||
|
@ -1062,9 +993,9 @@ void MainWindow::UpdateScalar(){
|
|||
uint32_t acqStatus = digi[iDigi]->GetACQStatusFromMemory();
|
||||
//printf("Digi-%d : acq on/off ? : %d \n", digi[iDigi]->GetSerialNumber(), (acqStatus >> 2) & 0x1 );
|
||||
if( ( acqStatus >> 2 ) & 0x1 ){
|
||||
if( runStatus[iDigi]->styleSheet() == "") runStatus[iDigi]->setStyleSheet("background-color : green;");
|
||||
runStatus[iDigi]->setStyleSheet("background-color : green;");
|
||||
}else{
|
||||
if( runStatus[iDigi]->styleSheet() != "") runStatus[iDigi]->setStyleSheet("");
|
||||
runStatus[iDigi]->setStyleSheet("");
|
||||
}
|
||||
|
||||
if(digiSettings && digiSettings->isVisible() && digiSettings->GetTabID() == iDigi) digiSettings->UpdateACQStatus(acqStatus);
|
||||
|
@ -1075,7 +1006,6 @@ void MainWindow::UpdateScalar(){
|
|||
blockCountStr += "/" + QString::number(readDataThread[iDigi]->GetReadCount());
|
||||
readDataThread[iDigi]->SetReadCountZero();
|
||||
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
|
||||
if( chkSaveData->isChecked() ) totalFileSize += digi[iDigi]->GetData()->GetTotalFileSize();
|
||||
|
@ -1091,22 +1021,16 @@ void MainWindow::UpdateScalar(){
|
|||
leAccept[iDigi][i]->setText(b);
|
||||
|
||||
if( influx && a != "inf" ){
|
||||
influx->AddDataPoint("TrigRate,Bd="+std::to_string(digi[iDigi]->GetSerialNumber()) + ",Ch=" + QString::number(i).rightJustified(2, '0').toStdString() + " value=" + a.toStdString());
|
||||
influx->AddDataPoint("Rate,Bd="+std::to_string(digi[iDigi]->GetSerialNumber()) + ",Ch=" + QString::number(i).rightJustified(2, '0').toStdString() + " value=" + a.toStdString());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
digiMTX[iDigi].unlock();
|
||||
|
||||
}
|
||||
|
||||
lbTotalFileSize->setText("Total Data Size : " + QString::number(totalFileSize/1024./1024., 'f', 3) + " MB");
|
||||
|
||||
repaint();
|
||||
scalar->repaint();
|
||||
|
||||
if( influx && scalarCount >= 3){
|
||||
if( influx ){
|
||||
if( chkSaveData->isChecked() ) {
|
||||
influx->AddDataPoint("RunID value=" + std::to_string(runID));
|
||||
influx->AddDataPoint("FileSize value=" + std::to_string(totalFileSize));
|
||||
|
@ -1114,7 +1038,6 @@ void MainWindow::UpdateScalar(){
|
|||
//nflux->PrintDataPoints();
|
||||
influx->WriteData(dataBaseName.toStdString());
|
||||
influx->ClearDataPointsBuffer();
|
||||
scalarCount = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1180,7 +1103,6 @@ void MainWindow::StartACQ(){
|
|||
bnStopACQ->setStyleSheet("background-color: red;");
|
||||
bnOpenScope->setEnabled(false);
|
||||
cbAutoRun->setEnabled(false);
|
||||
bnSync->setEnabled(false);
|
||||
|
||||
if( digiSettings ) digiSettings->setEnabled(false);
|
||||
|
||||
|
@ -1210,9 +1132,6 @@ void MainWindow::StartACQ(){
|
|||
|
||||
void MainWindow::StopACQ(){
|
||||
DebugPrint("%s", "FSUDAQ");
|
||||
|
||||
QCoreApplication::processEvents();
|
||||
|
||||
if( digi == nullptr ) return;
|
||||
|
||||
bool commentResult = true;
|
||||
|
@ -1262,7 +1181,6 @@ void MainWindow::StopACQ(){
|
|||
bnStopACQ->setStyleSheet("");
|
||||
bnOpenScope->setEnabled(true);
|
||||
cbAutoRun->setEnabled(true);
|
||||
bnSync->setEnabled(true);
|
||||
|
||||
if( scalar ){
|
||||
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){
|
||||
|
@ -1303,9 +1221,6 @@ void MainWindow::StopACQ(){
|
|||
chkSaveData->setEnabled(true);
|
||||
bnDigiSettings->setEnabled(true);
|
||||
|
||||
repaint();
|
||||
printf("================ end of %s \n", __func__);
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::AutoRun(){
|
||||
|
@ -1716,8 +1631,7 @@ void MainWindow::WriteRunTimestamp(bool isStartRun){
|
|||
//***************************************************************
|
||||
//***************************************************************
|
||||
void MainWindow::OpenScope(){
|
||||
DebugPrint("%s", "FSUDAQ");
|
||||
QCoreApplication::processEvents();
|
||||
|
||||
if( scope == nullptr ) {
|
||||
scope = new Scope(digi, nDigi, readDataThread);
|
||||
connect(scope, &Scope::SendLogMsg, this, &MainWindow::LogMsg);
|
||||
|
@ -1790,6 +1704,7 @@ void MainWindow::OpenDigiSettings(){
|
|||
digiSettings->show();
|
||||
digiSettings->activateWindow();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//***************************************************************
|
||||
|
@ -1809,7 +1724,6 @@ void MainWindow::OpenCanvas(){
|
|||
//***************************************************************
|
||||
void MainWindow::OpenAnalyzer(){
|
||||
DebugPrint("%s", "FSUDAQ");
|
||||
|
||||
int id = cbAnalyzer->currentData().toInt();
|
||||
|
||||
if( id < 0 ) return;
|
||||
|
@ -1823,8 +1737,6 @@ void MainWindow::OpenAnalyzer(){
|
|||
if( id == 4 ) onlineAnalyzer = new MCP(digi, nDigi);
|
||||
if( id == 5 ) onlineAnalyzer = new PID(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();
|
||||
}else{
|
||||
|
||||
|
@ -1837,8 +1749,6 @@ void MainWindow::OpenAnalyzer(){
|
|||
if( id == 4 ) onlineAnalyzer = new MCP(digi, nDigi);
|
||||
if( id == 5 ) onlineAnalyzer = new PID(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();
|
||||
onlineAnalyzer->activateWindow();
|
||||
|
@ -1978,8 +1888,6 @@ void MainWindow::SetUpInflux(){
|
|||
|
||||
void MainWindow::CheckElog(){
|
||||
DebugPrint("%s", "FSUDAQ");
|
||||
LogMsg("---- Checking elog... please wait....");
|
||||
printf("---- Checking elog... please wait....\n");
|
||||
if( elogIP != "" && elogName != "" && elogUser != "" && elogPWD != "" ){
|
||||
WriteElog("Testing communication.", "Testing communication.", "Other", 0);
|
||||
AppendElog("test append elog.");
|
||||
|
@ -1992,18 +1900,16 @@ void MainWindow::CheckElog(){
|
|||
|
||||
if( elogID >= 0 ) {
|
||||
LogMsg("Elog testing OK.");
|
||||
printf("Elog testing OK.\n");
|
||||
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.");
|
||||
LogMsg("Elog testing Fail");
|
||||
printf("Elog testing Fail\n");
|
||||
if( elogIP == "" ) LogMsg("no elog IP");
|
||||
if( elogName == "" ) LogMsg("no elog Name");
|
||||
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( elogID < 0 ) LogMsg("Possible elog IP, Name, User name, pwd incorrect, or elog not installed.");
|
||||
if( elogID < 0 ) LogMsg("Possible elog IP, Name, User name, or pwd incorrect");
|
||||
leElogIP->setEnabled(false);
|
||||
leElogName->setEnabled(false);
|
||||
|
||||
|
|
3
FSUDAQ.h
3
FSUDAQ.h
|
@ -135,7 +135,6 @@ private:
|
|||
QLineEdit * leDatabaseName;
|
||||
QPushButton * bnLock;
|
||||
QString influxToken;
|
||||
short scalarCount;
|
||||
|
||||
//@----- Elog
|
||||
QString elogIP;
|
||||
|
@ -172,8 +171,6 @@ private:
|
|||
QLabel * lbLastUpdateTime;
|
||||
QLabel * lbScalarACQStatus;
|
||||
QLabel * lbAggCount[MaxNDigitizer];
|
||||
QLabel * lbFileSize[MaxNDigitizer];
|
||||
QLabel * lbTotalFileSize;
|
||||
|
||||
//@----- Run Record
|
||||
QMainWindow * runRecord;
|
||||
|
|
|
@ -46,8 +46,6 @@ HEADERS += ClassData.h \
|
|||
analyzers/EncoreAnalyzer.h \
|
||||
analyzers/RAISOR1.h \
|
||||
analyzers/RAISOR2.h \
|
||||
analyzers/TEST.h \
|
||||
analyzers/MCPandPSD.h \
|
||||
analyzers/MCP.h \
|
||||
analyzers/PID.h
|
||||
SOURCES += ClassDigitizer.cpp \
|
||||
|
|
|
@ -49,13 +49,10 @@ public:
|
|||
colorScale->setType(QCPAxis::atRight);
|
||||
colorMap->setColorScale(colorScale);
|
||||
|
||||
|
||||
QCPColorGradient color;
|
||||
color.setNanHandling(QCPColorGradient::NanHandling::nhNanColor);
|
||||
color.setNanColor(QColor("white"));
|
||||
color.clearColorStops();
|
||||
// color.setColorStopAt( 0.0, QColor("white" ));
|
||||
color.setColorStopAt( 0.0, QColor("purple" ));
|
||||
color.setColorStopAt( 0.0, QColor("white" ));
|
||||
color.setColorStopAt( 0.000001, QColor("purple" ));
|
||||
color.setColorStopAt( 0.2, QColor("blue"));
|
||||
color.setColorStopAt( 0.4, QColor("cyan"));
|
||||
color.setColorStopAt( 0.6, QColor("green"));
|
||||
|
@ -190,23 +187,20 @@ public:
|
|||
void SetXTitle(QString xTitle) { xAxis->setLabel(xTitle); }
|
||||
void SetYTitle(QString yTitle) { yAxis->setLabel(yTitle); }
|
||||
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 UpdatePlot(){
|
||||
// QCPColorGradient color;
|
||||
// color.clearColorStops();
|
||||
// color.setNanColor(QColor("white"));
|
||||
// // color.setColorStopAt( 0.0, QColor("white" ));
|
||||
// // color.setColorStopAt( 1.0/entry[1][1], QColor("purple" ));
|
||||
// color.setColorStopAt( 0.0, QColor("purple" ));
|
||||
// color.setColorStopAt( 0.2, QColor("blue"));
|
||||
// color.setColorStopAt( 0.4, QColor("cyan"));
|
||||
// color.setColorStopAt( 0.6, QColor("green"));
|
||||
// color.setColorStopAt( 0.8, QColor("yellow"));
|
||||
// color.setColorStopAt( 1.0, QColor("red"));
|
||||
// colorMap->setGradient(color);
|
||||
QCPColorGradient color;
|
||||
color.clearColorStops();
|
||||
color.setColorStopAt( 0.0, QColor("white" ));
|
||||
color.setColorStopAt( 1.0/entry[1][1], QColor("purple" ));
|
||||
color.setColorStopAt( 0.2, QColor("blue"));
|
||||
color.setColorStopAt( 0.4, QColor("cyan"));
|
||||
color.setColorStopAt( 0.6, QColor("green"));
|
||||
color.setColorStopAt( 0.8, QColor("yellow"));
|
||||
color.setColorStopAt( 1.0, QColor("red"));
|
||||
colorMap->setGradient(color);
|
||||
|
||||
colorMap->rescaleDataRange();
|
||||
|
||||
|
@ -293,11 +287,7 @@ inline void Histogram2D::Fill(double x, double y){
|
|||
|
||||
if( xk == 1 && yk == 1 ) {
|
||||
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);
|
||||
}
|
||||
|
||||
for( int i = 0; i < cutList.count(); i++){
|
||||
if( cutList[i].isEmpty() ) continue;
|
||||
|
@ -319,12 +309,6 @@ inline void Histogram2D::Rebin(int xbin, double xmin, double xmax, int ybin, do
|
|||
colorMap->data()->setSize(xBin, yBin);
|
||||
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 ){
|
||||
QCPAxis * xAxis = colorMap->keyAxis();
|
||||
xAxis->ticker()->setTickCount(xbin/tickStep);
|
||||
|
@ -340,10 +324,6 @@ 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(){
|
||||
DebugPrint("%s", "Histogram2D");
|
||||
for( int i = 0; i < 3; i ++){
|
||||
|
@ -355,11 +335,6 @@ inline void Histogram2D::Clear(){
|
|||
colorMap->data()->clear();
|
||||
colorMap->data()->setSize(xBin, yBin);
|
||||
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();
|
||||
}
|
||||
|
|
135
Scope.cpp
135
Scope.cpp
|
@ -68,6 +68,31 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh
|
|||
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[1]->setPen(QPen(Qt::blue, 2));
|
||||
dataTrace[2]->setPen(QPen(Qt::darkYellow, 1));
|
||||
|
@ -166,6 +191,7 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh
|
|||
|
||||
});
|
||||
|
||||
|
||||
bnReadSettingsFromBoard = new QPushButton("Refresh Settings", this);
|
||||
layout->addWidget(bnReadSettingsFromBoard, rowID, 2);
|
||||
connect(bnReadSettingsFromBoard, &QPushButton::clicked, this, &Scope::ReadSettingsFromBoard);
|
||||
|
@ -231,21 +257,18 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh
|
|||
layout->addWidget(bnScopeStart, rowID, 0);
|
||||
connect(bnScopeStart, &QPushButton::clicked, this, [=](){this->StartScope();});
|
||||
|
||||
chkSoleRun = new QCheckBox("Only this channel", this);
|
||||
layout->addWidget(chkSoleRun, rowID, 1);
|
||||
|
||||
bnScopeStop = new QPushButton("Stop", this);
|
||||
layout->addWidget(bnScopeStop, rowID, 2);
|
||||
layout->addWidget(bnScopeStop, rowID, 1);
|
||||
connect(bnScopeStop, &QPushButton::clicked, this, &Scope::StopScope);
|
||||
|
||||
QLabel * lbTriggerRate = new QLabel("Trigger Rate [Hz] : ", this);
|
||||
lbTriggerRate->setAlignment(Qt::AlignCenter | Qt::AlignRight);
|
||||
layout->addWidget(lbTriggerRate, rowID, 3);
|
||||
layout->addWidget(lbTriggerRate, rowID, 2);
|
||||
|
||||
leTriggerRate = new QLineEdit(this);
|
||||
leTriggerRate->setAlignment(Qt::AlignRight);
|
||||
leTriggerRate->setReadOnly(true);
|
||||
layout->addWidget(leTriggerRate, rowID, 4);
|
||||
layout->addWidget(leTriggerRate, rowID, 3);
|
||||
|
||||
QPushButton * bnClose = new QPushButton("Close", this);
|
||||
layout->addWidget(bnClose, rowID, 6);
|
||||
|
@ -342,59 +365,6 @@ void Scope::StartScope(){
|
|||
//TODO set other channel to be no trace;
|
||||
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 --){
|
||||
|
||||
traceOn[iDigi] = digi[iDigi]->IsRecordTrace(); //remember setting
|
||||
|
@ -420,8 +390,6 @@ void Scope::StartScope(){
|
|||
// printf("----- readDataThread running ? %d.\n", readDataThread[iDigi]->isRunning());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
updateTraceThread->start();
|
||||
updateScalarThread->start();
|
||||
|
||||
|
@ -430,8 +398,6 @@ void Scope::StartScope(){
|
|||
bnScopeStop->setEnabled(true);
|
||||
bnScopeStop->setStyleSheet("background-color: red;");
|
||||
|
||||
chkSoleRun->setEnabled(false);
|
||||
|
||||
EnableControl(false);
|
||||
|
||||
TellACQOnOff(true);
|
||||
|
@ -453,50 +419,12 @@ void Scope::StopScope(){
|
|||
updateScalarThread->quit();
|
||||
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 ++){
|
||||
|
||||
if( readDataThread[iDigi]->isRunning() ){
|
||||
readDataThread[iDigi]->Stop();
|
||||
readDataThread[iDigi]->quit();
|
||||
readDataThread[iDigi]->wait();
|
||||
readDataThread[iDigi]->SetScopeMode(false);
|
||||
}
|
||||
digiMTX[iDigi].lock();
|
||||
digi[iDigi]->StopACQ();
|
||||
|
@ -509,8 +437,6 @@ void Scope::StopScope(){
|
|||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
emit UpdateOtherPanels();
|
||||
|
||||
bnScopeStart->setEnabled(true);
|
||||
|
@ -518,7 +444,6 @@ void Scope::StopScope(){
|
|||
bnScopeStop->setEnabled(false);
|
||||
bnScopeStop->setStyleSheet("");
|
||||
|
||||
chkSoleRun->setEnabled(true);
|
||||
runStatus->setStyleSheet("");
|
||||
|
||||
EnableControl(true);
|
||||
|
@ -1305,7 +1230,7 @@ void Scope::UpdatePanel_QDC(){
|
|||
sbDCOffset->setValue((1.0 - haha * 1.0 / 0xFFFF) * 100 );
|
||||
|
||||
//UpdateSpinBox(sbReordLength, DPP::QDC::RecordLength);
|
||||
sbReordLength->setValue(digi[ID]->ReadQDCRecordLength() * 8 * 16);
|
||||
sbReordLength->setValue(digi[ID]->ReadQDCRecordLength());
|
||||
UpdateSpinBox(sbPreTrigger, DPP::QDC::PreTrigger);
|
||||
|
||||
UpdateSpinBox(sbShortGate, DPP::QDC::GateWidth);
|
||||
|
|
6
Scope.h
6
Scope.h
|
@ -80,11 +80,8 @@ private:
|
|||
bool isACQStarted;
|
||||
int tick2ns;
|
||||
int factor; // whether dual trace or not
|
||||
int AggPerRead[MaxNDigitizer];
|
||||
|
||||
bool traceOn[MaxNDigitizer];
|
||||
uint32_t dppAlg, dppAlg2, chMask; //for single channel run
|
||||
unsigned short oldCh, oldDigi;
|
||||
int AggPerRead[MaxNDigitizer];
|
||||
|
||||
ReadDataThread ** readDataThread;
|
||||
TimingThread * updateTraceThread;
|
||||
|
@ -108,7 +105,6 @@ private:
|
|||
QGroupBox * settingGroup;
|
||||
QGridLayout * settingLayout;
|
||||
|
||||
QCheckBox * chkSoleRun;
|
||||
QPushButton * runStatus;
|
||||
|
||||
/// common to PSD and PHA
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
#include "SingleSpectra.h"
|
||||
|
||||
#include <QValueAxis>
|
||||
#include <QRandomGenerator>
|
||||
#include <QGroupBox>
|
||||
#include <QStandardItemModel>
|
||||
#include <QLabel>
|
||||
#include <QRandomGenerator>
|
||||
|
||||
SingleSpectra::SingleSpectra(Digitizer ** digi, unsigned int nDigi, QString rawDataPath, QMainWindow * parent) : QMainWindow(parent){
|
||||
DebugPrint("%s", "SingleSpectra");
|
||||
|
@ -11,12 +13,11 @@ SingleSpectra::SingleSpectra(Digitizer ** digi, unsigned int nDigi, QString rawD
|
|||
this->nDigi = nDigi;
|
||||
this->rawDataPath = rawDataPath;
|
||||
|
||||
maxFillTimeinMilliSec = 1000;
|
||||
maxFillTimePerDigi = maxFillTimeinMilliSec/nDigi;
|
||||
maxFillTimeinMilliSec = 500;
|
||||
|
||||
isSignalSlotActive = true;
|
||||
|
||||
setWindowTitle("Single Histograms");
|
||||
setWindowTitle("1-D Histograms");
|
||||
setGeometry(0, 0, 1000, 800);
|
||||
//setWindowFlags( this->windowFlags() & ~Qt::WindowCloseButtonHint );
|
||||
|
||||
|
@ -68,103 +69,15 @@ SingleSpectra::SingleSpectra(Digitizer ** digi, unsigned int nDigi, QString rawD
|
|||
for( unsigned int i = 0; i < nDigi; i++){
|
||||
for( int j = 0; j < digi[i]->GetNumInputCh(); j++){
|
||||
if( hist[i][j] ) hist[i][j]->Clear();
|
||||
// lastFilledIndex[i][j] = -1;
|
||||
// loopFilledIndex[i][j] = 0;
|
||||
}
|
||||
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);
|
||||
ctrlLayout->addWidget(chkIsFillHistogram, 0, 8);
|
||||
ctrlLayout->addWidget(chkIsFillHistogram, 0, 6);
|
||||
connect(chkIsFillHistogram, &QCheckBox::stateChanged, this, [=](int state){ fillHistograms = state;});
|
||||
chkIsFillHistogram->setChecked(false);
|
||||
fillHistograms = false;
|
||||
|
@ -292,69 +205,47 @@ void SingleSpectra::FillHistograms(){
|
|||
// DebugPrint("%s", "SingleSpectra");
|
||||
if( !fillHistograms ) return;
|
||||
|
||||
unsigned short maxFillTimePerDigi = maxFillTimeinMilliSec/nDigi;
|
||||
timespec t0, t1;
|
||||
|
||||
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);
|
||||
for( int k = 0; k < digi[ID]->GetNumInputCh(); k ++ ){
|
||||
int ch = randomChList[k];
|
||||
int lastIndex = digi[ID]->GetData()->GetDataIndex(ch);
|
||||
// printf("--- ch %2d | last index %d \n", ch, lastIndex);
|
||||
for( int ch = 0; ch < digi[i]->GetNumInputCh(); ch ++ ){
|
||||
int lastIndex = digi[i]->GetData()->GetDataIndex(ch);
|
||||
if( lastIndex < 0 ) continue;
|
||||
|
||||
int loopIndex = digi[ID]->GetData()->GetLoopIndex(ch);
|
||||
int loopIndex = digi[i]->GetData()->GetLoopIndex(ch);
|
||||
|
||||
int temp1 = lastIndex + loopIndex * digi[ID]->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);
|
||||
int temp1 = lastIndex + loopIndex * digi[i]->GetData()->GetDataSize();
|
||||
int temp2 = lastFilledIndex[i][ch] + loopFilledIndex[i][ch] * digi[i]->GetData()->GetDataSize();
|
||||
|
||||
// printf("%d |%d %d \n", ch, temp2, temp1);
|
||||
if( temp1 <= temp2 ) continue;
|
||||
|
||||
if( temp1 - temp2 > digi[ID]->GetData()->GetDataSize() ) { //DefaultDataSize = 10k
|
||||
temp2 = temp1 - digi[ID]->GetData()->GetDataSize();
|
||||
lastFilledIndex[ID][ch] = lastIndex;
|
||||
lastFilledIndex[ID][ch] = loopIndex - 1;
|
||||
if( temp1 - temp2 > digi[i]->GetData()->GetDataSize() ) { //DefaultDataSize = 10k
|
||||
temp2 = temp1 - digi[i]->GetData()->GetDataSize();
|
||||
lastFilledIndex[i][ch] = lastIndex;
|
||||
lastFilledIndex[i][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 ++){
|
||||
lastFilledIndex[ID][ch] ++;
|
||||
if( lastFilledIndex[ID][ch] > digi[ID]->GetData()->GetDataSize() ) {
|
||||
lastFilledIndex[ID][ch] = 0;
|
||||
loopFilledIndex[ID][ch] ++;
|
||||
lastFilledIndex[i][ch] ++;
|
||||
if( lastFilledIndex[i][ch] > digi[i]->GetData()->GetDataSize() ) {
|
||||
lastFilledIndex[i][ch] = 0;
|
||||
loopFilledIndex[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);
|
||||
hist[i][ch]->Fill( digi[i]->GetData()->GetEnergy(ch, lastFilledIndex[i][ch]));
|
||||
hist2D[i]->Fill(ch, digi[i]->GetData()->GetEnergy(ch, lastFilledIndex[i][ch]));
|
||||
}
|
||||
if( histVisibility[ID][ch] ) hist[ID][ch]->UpdatePlot();
|
||||
if( histVisibility[i][ch] ) hist[i][ch]->UpdatePlot();
|
||||
if( hist2DVisibility[i] ) hist2D[i]->UpdatePlot();
|
||||
|
||||
clock_gettime(CLOCK_REALTIME, &t1);
|
||||
if( t1.tv_nsec - t0.tv_nsec + (t1.tv_sec - t0.tv_sec)*1e9 > maxFillTimePerDigi * 1e6 ) break;
|
||||
}
|
||||
|
||||
if( hist2DVisibility[ID] ) hist2D[ID]->UpdatePlot();
|
||||
digiMTX[ID].unlock();
|
||||
digiMTX[i].unlock();
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -449,14 +340,3 @@ 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,8 +10,6 @@
|
|||
#include <QLineEdit>
|
||||
#include <QGridLayout>
|
||||
#include <QGroupBox>
|
||||
#include <QVector>
|
||||
#include <QRandomGenerator>
|
||||
|
||||
#include "macro.h"
|
||||
#include "ClassDigitizer.h"
|
||||
|
@ -40,8 +38,6 @@ public:
|
|||
void SetMaxFillTime(unsigned short milliSec) { maxFillTimeinMilliSec = milliSec;}
|
||||
unsigned short GetMaxFillTime() const {return maxFillTimeinMilliSec;};
|
||||
|
||||
QVector<int> generateNonRepeatedCombination(int size);
|
||||
|
||||
public slots:
|
||||
void FillHistograms();
|
||||
void ChangeHistView();
|
||||
|
@ -74,7 +70,6 @@ private:
|
|||
QString rawDataPath;
|
||||
|
||||
unsigned short maxFillTimeinMilliSec;
|
||||
unsigned short maxFillTimePerDigi;
|
||||
|
||||
bool isSignalSlotActive;
|
||||
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
#include "CustomWidgets.h"
|
||||
#include "MultiBuilder.h"
|
||||
#include "ClassInfluxDB.h"
|
||||
#include "math.h"
|
||||
|
||||
/**************************************
|
||||
|
||||
|
@ -33,7 +32,6 @@ derivative class should define the SetUpCanvas() and UpdateHistogram();
|
|||
#include "Histogram1D.h"
|
||||
#include "Histogram2D.h"
|
||||
|
||||
|
||||
//^==============================================
|
||||
//^==============================================
|
||||
class Analyzer : public QMainWindow{
|
||||
|
|
128
analyzers/MCP.h
128
analyzers/MCP.h
|
@ -8,11 +8,7 @@
|
|||
*
|
||||
* ******************************************/
|
||||
#include "Analyser.h"
|
||||
#include <cmath>
|
||||
#include "math.h"
|
||||
#include <algorithm>
|
||||
|
||||
//#define M_PI 3.14159265
|
||||
|
||||
class MCP : public Analyzer{
|
||||
|
||||
|
@ -22,14 +18,14 @@ public:
|
|||
MCP(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent = nullptr): Analyzer(digi, nDigi, parent){
|
||||
|
||||
|
||||
SetUpdateTimeInSec(2.0);
|
||||
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); //ns
|
||||
evtbder->SetTimeWindow(500);
|
||||
|
||||
//========== use the influx from the Analyzer
|
||||
influx = new InfluxDB("https://fsunuc.physics.fsu.edu/influx/");
|
||||
|
@ -51,24 +47,19 @@ private:
|
|||
|
||||
Histogram2D * hPID;
|
||||
|
||||
//Histogram2D * hXX; // X1 versus X2 : e[1] versus e[0]
|
||||
//Histogram2D * hYY; // Y1 versus Y2 : e[3] versus e[2]
|
||||
Histogram2D * hXX; // X1 versus X2 : e[1] versus e[0]
|
||||
Histogram2D * hYY; // Y1 versus Y2 : e[3] versus e[2]
|
||||
|
||||
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[0]+e[1]+e[2]+e[3])))
|
||||
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 * hXr; // X position angle rotated
|
||||
Histogram1D * hYr; // Y position angle rotated
|
||||
Histogram2D * hXY; // 2D position plot: ((e[2]-e[3])/(e[2]+e[3])) versus ((e[0]-e[1])/(e[0]+e[1]))
|
||||
|
||||
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 * he1; // e1: signal 1
|
||||
Histogram1D * he2; // e2: signal 2
|
||||
Histogram1D * he3; // e3: signal 3
|
||||
|
||||
Histogram1D * ht; // time window
|
||||
|
||||
|
||||
int tick2ns;
|
||||
|
||||
|
@ -89,44 +80,33 @@ inline void MCP::SetUpCanvas(){
|
|||
hPID = new Histogram2D("MCP", "E", "dE", 100, 0, 5000, 100, 0, 5000, this);
|
||||
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);
|
||||
|
||||
hXYr = new Histogram2D("2D rot posi", "Xr position", "Yr position", 200, -0.5, 0.5, 200, -0.5, 0.5, this);
|
||||
layout->addWidget(hXYr, 0, 1);
|
||||
hYY = new Histogram2D("Y1 versus Y2", "Y2", "Y1", 100, 0, 3000, 100, 0, 3000, this);
|
||||
layout->addWidget(hYY, 1, 0);
|
||||
|
||||
hXY = new Histogram2D("2D position plot", "X position", "Y position", 500, 0, 1, 500, 0, 1, this);
|
||||
layout->addWidget(hXY, 0, 2);
|
||||
hX = new Histogram1D("X position", "X", 300, -1, 1, this);
|
||||
layout->addWidget(hX, 1, 1);
|
||||
|
||||
ht = new Histogram1D("Time Window", "t", 50, 0, 500, this);
|
||||
layout->addWidget(ht, 0, 3);
|
||||
hY = new Histogram1D("Y position", "Y", 300, -1, 1, this);
|
||||
layout->addWidget(hY, 1, 2);
|
||||
/* 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);
|
||||
|
||||
hX = new Histogram1D("X position", "X", 250, 0, 1, this);
|
||||
layout->addWidget(hX, 2, 0);
|
||||
he2 = new Histogram1D("Signal 2", "e2", 300, -1, 1, this);
|
||||
layout->addWidget(he2, 1, 3);
|
||||
|
||||
hY = new Histogram1D("Y position", "Y", 250, 0, 1, this);
|
||||
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);
|
||||
|
||||
|
||||
//
|
||||
he3 = new Histogram1D("Signal 3", "e3", 300, -1, 1, this);
|
||||
layout->addWidget(he3, 1, 4);
|
||||
*/
|
||||
}
|
||||
|
||||
inline void MCP::UpdateHistograms(){
|
||||
|
@ -140,7 +120,6 @@ inline void MCP::UpdateHistograms(){
|
|||
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};
|
||||
|
@ -156,24 +135,11 @@ inline void MCP::UpdateHistograms(){
|
|||
//printf("-------------- %ld\n", i);
|
||||
|
||||
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++ ){
|
||||
//event[k].Print();
|
||||
if( event[k].ch == 2 ) {dE = event[k].energy; dE_t = event[k].timestamp;}
|
||||
if( event[k].ch == 2 ) {E = event[k].energy; E_t = event[k].timestamp;}
|
||||
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;}
|
||||
|
||||
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;}
|
||||
|
@ -182,36 +148,21 @@ inline void MCP::UpdateHistograms(){
|
|||
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
|
||||
|
||||
hXY->Fill(((e1+e2)/(e0+e1+e2+e3)),((e2+e3)/(e0+e1+e2+e3)));
|
||||
hXYr->Fill(Xr,Yr);
|
||||
hX->Fill(((e1+e2)/(e0+e1+e2+e3)));
|
||||
hY->Fill(((e2+e3)/(e0+e1+e2+e3)));
|
||||
hXr->Fill(Xr);
|
||||
hYr->Fill(Yr);
|
||||
}
|
||||
|
||||
hXX->Fill(e1, e0); //
|
||||
hYY->Fill(e3, e2);
|
||||
hXY->Fill(((e0-e1)/(e0+e1)),((e2-e3)/(e2+e3)));
|
||||
hX->Fill(((e0-e1)/(e0+e1)));
|
||||
hY->Fill(((e2-e3)/(e2+e3)));
|
||||
he0->Fill(e0);
|
||||
he1->Fill(e1);
|
||||
he2->Fill(e2);
|
||||
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
|
||||
|
||||
for(int p = 0; p < cutList.count(); p++ ){
|
||||
if( cutList[p].isEmpty() ) continue;
|
||||
if( cutList[p].containsPoint(QPointF(E, dE), Qt::OddEvenFill) ){
|
||||
|
@ -221,23 +172,18 @@ inline void MCP::UpdateHistograms(){
|
|||
//printf(".... %d \n", count[p]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
hPID->UpdatePlot();
|
||||
//hXX->UpdatePlot();//
|
||||
//hYY->UpdatePlot();
|
||||
hXX->UpdatePlot();//
|
||||
hYY->UpdatePlot();
|
||||
hXY->UpdatePlot();
|
||||
hXYr->UpdatePlot();
|
||||
hX->UpdatePlot();
|
||||
hY->UpdatePlot();
|
||||
hXr->UpdatePlot();
|
||||
hYr->UpdatePlot();
|
||||
he0->UpdatePlot();
|
||||
he1->UpdatePlot();
|
||||
he2->UpdatePlot();
|
||||
he3->UpdatePlot();
|
||||
ht->UpdatePlot();
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,362 +0,0 @@
|
|||
#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){
|
||||
|
||||
|
||||
SetUpdateTimeInSec(2.0);
|
||||
SetUpdateTimeInSec(1.0);
|
||||
|
||||
RedefineEventBuilder({0}); // only builder for the 0-th digitizer.
|
||||
tick2ns = digi[0]->GetTick2ns();
|
||||
|
@ -45,7 +45,7 @@ private:
|
|||
|
||||
MultiBuilder *evtbder;
|
||||
|
||||
//Histogram2D * hPID;
|
||||
Histogram2D * hPID;
|
||||
|
||||
Histogram1D * hdE; // raw dE (ch=1): ch1
|
||||
Histogram1D * hE; // raw E (ch=4) : ch4
|
||||
|
@ -76,29 +76,26 @@ inline void PID::SetUpCanvas(){
|
|||
|
||||
//============ histograms
|
||||
|
||||
//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);
|
||||
hdEE = new Histogram2D("dE vs E", "E[ch]", "dE[ch]", 100, 0, 7000, 100, 0, 4000, this);
|
||||
layout->addWidget(hdEE, 0, 0, 1, 2);
|
||||
|
||||
hdE = new Histogram1D("raw dE (ch=1)", "dE [ch]", 300, 0, 8000, this);
|
||||
hdE = new Histogram1D("raw dE (ch=1)", "dE [ch]", 300, 0, 2500, this);
|
||||
layout->addWidget(hdE, 0, 2);
|
||||
|
||||
hdEdT = new Histogram2D("dE vs TOF", "TOF [ns]", "dE", 100, 0, 500, 100, 0, 4000, this);
|
||||
layout->addWidget(hdEdT, 1, 3);
|
||||
layout->addWidget(hdEdT, 0, 3);
|
||||
|
||||
hE = new Histogram1D("raw E (ch=4)", "E [ch]", 300, 0, 10000, this);
|
||||
layout->addWidget(hE, 0, 3);
|
||||
hE = new Histogram1D("raw E (ch=4)", "E [ch]", 300, 0, 5000, this);
|
||||
layout->addWidget(hE, 0, 4);
|
||||
|
||||
hdEtotE = new Histogram2D("dE vs TotE", "TotE[ch]", "dE[ch]", 500, 0, 10000, 500, 0, 10000, this);
|
||||
hdEtotE = new Histogram2D("dE vs TotE", "TotE[ch]", "dE[ch]", 100, 0, 8000, 100, 0, 4000, this);
|
||||
layout->addWidget(hdEtotE, 1, 0, 1, 2);
|
||||
|
||||
hdT = new Histogram1D("raw dT (ch=7)", "dT [ch]", 300, 0, 1000, this);
|
||||
layout->addWidget(hdT, 1, 2);
|
||||
|
||||
hTotE = new Histogram1D("total energy (dE+E)", "TotE [ch]", 300, 0, 16000, this);
|
||||
layout->addWidget(hTotE, 0, 4);
|
||||
hTotE = new Histogram1D("total energy (dE+E)", "TotE [ch]", 300, 0, 7000, this);
|
||||
layout->addWidget(hTotE, 1, 3);
|
||||
|
||||
hTWin = new Histogram1D("coincidence time window", "TWin [ns]", 300, 0, 500, this);
|
||||
layout->addWidget(hTWin, 1, 4);
|
||||
|
@ -116,21 +113,10 @@ inline void PID::UpdateHistograms(){
|
|||
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 = 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
|
||||
long eventIndex = evtbder->eventIndex;
|
||||
|
@ -145,26 +131,24 @@ inline void PID::UpdateHistograms(){
|
|||
|
||||
for( int k = 0; k < (int) event.size(); k++ ){
|
||||
//event[k].Print();
|
||||
if( event[k].ch == 6 ) {ch1 = event[k].energy; t1 = event[k].timestamp;}
|
||||
if( event[k].ch == 7 ) {ch4 = event[k].energy; t4 = event[k].timestamp;}
|
||||
if( event[k].ch == 1 ) {ch7 = event[k].energy; t7 = event[k].timestamp;}
|
||||
if( event[k].ch == 0 ) {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 == 2 ) {ch7 = event[k].energy; t7 = event[k].timestamp;}
|
||||
|
||||
}
|
||||
|
||||
// printf("(E, dE) = (%f, %f)\n", E, dE);
|
||||
//hPID->Fill(ch4 , ch1); // x, y
|
||||
//etotal = ch1*0.25*0.25 + ch4
|
||||
hPID->Fill(ch4 + RandomGauss(0, 100), ch1 + RandomGauss(0, 100)); // x, y
|
||||
hdE->Fill(ch1);
|
||||
hE->Fill(ch4);
|
||||
hdT->Fill(ch7);
|
||||
hTotE->Fill(ch1*0.25*0.25 + ch4);
|
||||
hTotE->Fill(ch1+ch4);
|
||||
hdEE->Fill(ch4,ch1);
|
||||
hdEtotE->Fill(ch1*0.25*0.25 + ch4,ch1);
|
||||
hdEtotE->Fill(ch1+ch4+ RandomGauss(0, 100),ch1+ RandomGauss(0, 100));
|
||||
hdEdT->Fill((t7-t1)*1e9,ch1);
|
||||
hTWin->Fill((t4-t1)*1e9);
|
||||
|
||||
//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(ch4, ch1), Qt::OddEvenFill) ){
|
||||
|
@ -174,34 +158,10 @@ inline void PID::UpdateHistograms(){
|
|||
//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]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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();
|
||||
hPID->UpdatePlot();
|
||||
hdE->UpdatePlot();
|
||||
hE->UpdatePlot();
|
||||
hdT->UpdatePlot();
|
||||
|
@ -210,7 +170,7 @@ inline void PID::UpdateHistograms(){
|
|||
hdEtotE->UpdatePlot();
|
||||
hdEdT->UpdatePlot();
|
||||
hTWin->UpdatePlot();
|
||||
/*
|
||||
|
||||
//========== output to Influx
|
||||
QList<QString> cutNameList = hPID->GetCutNameList();
|
||||
for( int p = 0; p < cutList.count(); p ++){
|
||||
|
@ -224,7 +184,6 @@ inline void PID::UpdateHistograms(){
|
|||
influx->WriteData(dataBaseName);
|
||||
influx->ClearDataPointsBuffer();
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
|
133
analyzers/RAISOR.h
Normal file
133
analyzers/RAISOR.h
Normal file
|
@ -0,0 +1,133 @@
|
|||
#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,12 +164,6 @@ inline void RAISOR1::UpdateHistograms(){
|
|||
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;
|
||||
|
@ -180,11 +174,29 @@ inline void RAISOR1::UpdateHistograms(){
|
|||
//printf("-------------- %ld\n", i);
|
||||
|
||||
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++ ){
|
||||
//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 == 9 ) {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 == 11 ) {e1= event[k].energy; t1 = event[k].timestamp;} // The 4 output signals from the
|
||||
|
@ -219,20 +231,9 @@ inline void RAISOR1::UpdateHistograms(){
|
|||
if( dE_t < tMin[p] ) tMin[p] = dE_t;
|
||||
if( dE_t > tMax[p] ) tMax[p] = dE_t;
|
||||
count[p] ++;
|
||||
printf("hPID.... %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(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();
|
||||
|
|
|
@ -16,7 +16,7 @@ public:
|
|||
RAISOR2(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent = nullptr): Analyzer(digi, nDigi, parent){
|
||||
|
||||
|
||||
SetUpdateTimeInSec(4.0);
|
||||
SetUpdateTimeInSec(1.0);
|
||||
|
||||
RedefineEventBuilder({0}); // only builder for the 0-th digitizer.
|
||||
tick2ns = digi[0]->GetTick2ns();
|
||||
|
@ -100,22 +100,22 @@ inline void RAISOR2::SetUpCanvas(){
|
|||
setGeometry(0, 0, 1500, 2000);
|
||||
|
||||
//============ histograms
|
||||
hPID = new Histogram2D("RAISOR2", "E", "dE", 100, 0, 11000, 100, 0, 11000, this);
|
||||
hPID = new Histogram2D("RAISOR2", "E", "dE", 100, 0, 2000, 100, 0, 2000, this);
|
||||
layout->addWidget(hPID, 0, 0);
|
||||
|
||||
hXY = new Histogram2D("2D position plot", "X position", "Y position", 200, -1, 1, 200, -1, 1, this);
|
||||
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, 8000, 100, 0, 8000, this);
|
||||
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, 8000, 100, 0, 8000, this);
|
||||
hYY = new Histogram2D("Y1 versus Y2", "Y2", "Y1", 100, 0, 3000, 100, 0, 3000, this);
|
||||
layout->addWidget(hYY, 0, 3);
|
||||
|
||||
hXE = new Histogram1D("X energy", "Ex", 300, 0, 8000, this);
|
||||
layout->addWidget(hXE, 1, 0);
|
||||
|
||||
hYE = new Histogram1D("Y energy", "Ey", 300, 0, 8000, this);
|
||||
hYE = new Histogram1D("Y energy", "Ey", 300, 0, 4000, this);
|
||||
layout->addWidget(hYE, 1, 1);
|
||||
|
||||
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);
|
||||
layout->addWidget(hY, 1, 3);
|
||||
|
||||
hXPE = new Histogram2D("X energy versus X position", "X position", "X energy", 100, -1, 1, 100, 0, 8000, this);
|
||||
hXPE = new Histogram2D("X energy versus X position", "X position", "X energy", 100, -1, 1, 100, -2000, 20000, this);
|
||||
layout->addWidget(hXPE, 0, 4);
|
||||
|
||||
hYPE = new Histogram2D("Y energy versus Y position", "Y position", "Y energy", 100, -1, 1, 100, 0, 8000, this);
|
||||
hYPE = new Histogram2D("Y energy versus Y position", "Y position", "Y energy", 100, -1, 1, 100, 0, 5000, this);
|
||||
layout->addWidget(hYPE, 1, 4);
|
||||
|
||||
hXEdE1 = new Histogram2D("X energy versus dE signal 1", "Ex", "dE signal 1", 100, 0, 8000, 100, 0, 8000, this);
|
||||
hXEdE1 = new Histogram2D("X energy versus dE signal 1", "Ex", "dE signal 1", 100, -200, 20000, 100, -200, 10000, 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);
|
||||
hYEdE1 = new Histogram2D("Y energy versus dE signal 1", "Ey", "dE signal 1", 100, 0, 6000, 100, 0, 6000, 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);
|
||||
hXEdE2 = new Histogram2D("X energy versus dE signal 2", "Ex", "dE signal 2", 100, -500, 20000, 100, -500, 15000, 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);
|
||||
hYEdE2 = new Histogram2D("Y energy versus dE signal 2", "Ey", "dE signal 2", 100, -500, 5000, 100, -500, 12000, this);
|
||||
layout->addWidget(hYEdE2, 2, 3);
|
||||
|
||||
hXYE = new Histogram2D("2D energy plot", "Ex", "Ey", 100, 0, 8000, 100, 0, 8000, this);
|
||||
hXYE = new Histogram2D("2D energy plot", "Ex", "Ey", 100, 0, 10000, 100, 0, 6000, this);
|
||||
layout->addWidget(hXYE, 2, 4);
|
||||
|
||||
|
||||
|
@ -164,20 +164,6 @@ inline void RAISOR2::UpdateHistograms(){
|
|||
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;
|
||||
|
@ -188,11 +174,29 @@ inline void RAISOR2::UpdateHistograms(){
|
|||
//printf("-------------- %ld\n", i);
|
||||
|
||||
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++ ){
|
||||
//event[k].Print();
|
||||
if( event[k].ch == 14 ) {dE = event[k].energy; dE_t = event[k].timestamp;} // Surface Barrier dE detector
|
||||
if( event[k].ch == 15 ) {E = event[k].energy; E_t = event[k].timestamp;} // Surface Barrier E 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 == 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
|
||||
|
@ -207,13 +211,13 @@ inline void RAISOR2::UpdateHistograms(){
|
|||
hPID->Fill(E + RandomGauss(0, 100), dE+ RandomGauss(0, 100)); // x, y
|
||||
hXX->Fill(e1, e0); //
|
||||
hYY->Fill(e3, e2);
|
||||
hXY->Fill(((e0-e1)/(e0+e1)),((e3-e2)/(e2+e3)));
|
||||
hXY->Fill(((e0-e1)/(e0+e1)),((e2-e3)/(e2+e3)));
|
||||
hXE->Fill(e0+e1);
|
||||
hYE->Fill(e2+e3);
|
||||
hX->Fill(((e0-e1)/(e0+e1)));
|
||||
hY->Fill(((e3-e2)/(e2+e3)));
|
||||
hY->Fill(((e2-e3)/(e2+e3)));
|
||||
hXPE->Fill(((e0-e1)/(e0+e1)),(e0+e1));
|
||||
hYPE->Fill(((e3-e2)/(e2+e3)),(e2+e3));
|
||||
hYPE->Fill(((e2-e3)/(e2+e3)),(e2+e3));
|
||||
hXEdE1->Fill((e0+e1),dE1);
|
||||
hYEdE1->Fill(e2+e3,dE1);
|
||||
hXEdE2->Fill(e0+e1,dE2);
|
||||
|
@ -230,37 +234,6 @@ inline void RAISOR2::UpdateHistograms(){
|
|||
//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();
|
||||
|
|
273
analyzers/TEST.h
273
analyzers/TEST.h
|
@ -1,273 +0,0 @@
|
|||
#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 MaxSaveFileSize 1024 * 1024 * 1024 * 2
|
||||
|
||||
#define MaxDisplayTraceTimeLength 20000 //ns
|
||||
#define MaxDisplayTraceTimeLength 10000 //ns
|
||||
#define ScopeUpdateMiliSec 200 // msec
|
||||
#define MaxNumberOfTrace 5 // in an event
|
||||
|
||||
|
|
24
main.cpp
24
main.cpp
|
@ -1,34 +1,14 @@
|
|||
#include "FSUDAQ.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QMessageBox>
|
||||
#include <QProcess>
|
||||
#include <QPushButton>
|
||||
#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[]){
|
||||
|
||||
// CustomApplication a(argc, argv);
|
||||
QApplication a(argc, argv);
|
||||
|
||||
setpriority(PRIO_PROCESS, 0, -20);
|
||||
|
||||
bool isLock = false;
|
||||
int pid = 0;
|
||||
QFile lockFile(DAQLockFile);
|
||||
|
|
Loading…
Reference in New Issue
Block a user