Compare commits

..

No commits in common. "cf2cf510958d16f330597881516201b50dc7ff82" and "c8d5d2d0c4456ca391306dd29effe5008a505740" have entirely different histories.

25 changed files with 484 additions and 1507 deletions

1
.gitignore vendored
View File

@ -6,7 +6,6 @@ FSUDAQ_Qt6
test
test_indep
programSettings.txt
a4818_list.txt
EventBuilder
EventBuilderNew
EventBuilder2

View File

@ -160,7 +160,6 @@
"fstream": "cpp",
"Analyzer.C": "cpp",
"process_Run.C": "cpp",
"EncoreAnalyzer.C": "cpp",
"qfiledialog": "cpp"
"EncoreAnalyzer.C": "cpp"
}
}

View File

@ -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) ;

View File

@ -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();

View File

@ -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

View File

@ -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 ){

View File

@ -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];

View File

@ -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);

View File

@ -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;

View File

@ -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 \

View File

@ -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
View File

@ -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);

View File

@ -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

View File

@ -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;
}

View File

@ -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;

View File

@ -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{

View File

@ -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();

View File

@ -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

View File

@ -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
View 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

View File

@ -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();

View File

@ -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();

View File

@ -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

View File

@ -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

View File

@ -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);