testes many things with pulser (except backward event building). All parts looks good at 10 Hz
This commit is contained in:
parent
33e2a7ee56
commit
d246bb8dcf
11
Analyser.cpp
11
Analyser.cpp
|
@ -11,6 +11,9 @@ Analyzer::Analyzer(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent )
|
||||||
setWindowTitle("Online Analyzer");
|
setWindowTitle("Online Analyzer");
|
||||||
setGeometry(0, 0, 1000, 800);
|
setGeometry(0, 0, 1000, 800);
|
||||||
|
|
||||||
|
influx = nullptr;
|
||||||
|
dataBaseName = "";
|
||||||
|
|
||||||
mb = new MultiBuilder(digi, nDigi);
|
mb = new MultiBuilder(digi, nDigi);
|
||||||
|
|
||||||
buildTimerThread = new TimingThread(this);
|
buildTimerThread = new TimingThread(this);
|
||||||
|
@ -28,7 +31,7 @@ Analyzer::Analyzer(Digitizer ** digi, unsigned int nDigi, QMainWindow * parent )
|
||||||
}
|
}
|
||||||
|
|
||||||
Analyzer::~Analyzer(){
|
Analyzer::~Analyzer(){
|
||||||
|
delete influx;
|
||||||
delete mb;
|
delete mb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,15 +54,15 @@ void Analyzer::StopThread(){
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Analyzer::BuildEvents(){
|
void Analyzer::BuildEvents(bool verbose){
|
||||||
|
|
||||||
unsigned int nData = mb->GetNumOfDigitizer();
|
unsigned int nData = mb->GetNumOfDigitizer();
|
||||||
std::vector<int> idList = mb->GetDigiIDList();
|
std::vector<int> idList = mb->GetDigiIDList();
|
||||||
for( unsigned int i = 0; i < nData; i++ ) digiMTX[idList[i]].lock();
|
for( unsigned int i = 0; i < nData; i++ ) digiMTX[idList[i]].lock();
|
||||||
if( isBuildBackward ){
|
if( isBuildBackward ){
|
||||||
mb->BuildEventsBackWard(0);
|
mb->BuildEventsBackWard(maxNumEventBuilt, verbose);
|
||||||
}else{
|
}else{
|
||||||
mb->BuildEvents(0, 0, 0);
|
mb->BuildEvents(0, 0, verbose);
|
||||||
}
|
}
|
||||||
for( unsigned int i = 0; i < nData; i++ ) digiMTX[idList[i]].unlock();
|
for( unsigned int i = 0; i < nData; i++ ) digiMTX[idList[i]].unlock();
|
||||||
|
|
||||||
|
|
11
Analyser.h
11
Analyser.h
|
@ -15,8 +15,8 @@
|
||||||
#include "ClassDigitizer.h"
|
#include "ClassDigitizer.h"
|
||||||
#include "CustomThreads.h"
|
#include "CustomThreads.h"
|
||||||
#include "CustomWidgets.h"
|
#include "CustomWidgets.h"
|
||||||
//#include "OnlineEventBuilder.h"
|
|
||||||
#include "MultiBuilder.h"
|
#include "MultiBuilder.h"
|
||||||
|
#include "influxdb.h"
|
||||||
|
|
||||||
/**************************************
|
/**************************************
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ public:
|
||||||
MultiBuilder * GetEventBuilder() { return mb;}
|
MultiBuilder * GetEventBuilder() { return mb;}
|
||||||
|
|
||||||
void RedefineEventBuilder(std::vector<int> idList);
|
void RedefineEventBuilder(std::vector<int> idList);
|
||||||
void SetBackwardBuild(bool TF) { isBuildBackward = TF;}
|
void SetBackwardBuild(bool TF, int maxNumEvent = 100) { isBuildBackward = TF; maxNumEventBuilt = maxNumEvent;}
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void StartThread();
|
void StartThread();
|
||||||
|
@ -58,9 +58,12 @@ private slots:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QGridLayout * layout;
|
QGridLayout * layout;
|
||||||
void BuildEvents();
|
void BuildEvents(bool verbose = false);
|
||||||
void SetUpdateTimeInSec(double sec = 1.0) {waitTimeinSec = sec; buildTimerThread->SetWaitTimeinSec(waitTimeinSec);}
|
void SetUpdateTimeInSec(double sec = 1.0) {waitTimeinSec = sec; buildTimerThread->SetWaitTimeinSec(waitTimeinSec);}
|
||||||
|
|
||||||
|
InfluxDB * influx;
|
||||||
|
std::string dataBaseName;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Digitizer ** digi;
|
Digitizer ** digi;
|
||||||
unsigned short nDigi;
|
unsigned short nDigi;
|
||||||
|
@ -69,7 +72,9 @@ private:
|
||||||
|
|
||||||
MultiBuilder * mb;
|
MultiBuilder * mb;
|
||||||
bool isBuildBackward;
|
bool isBuildBackward;
|
||||||
|
int maxNumEventBuilt;
|
||||||
TimingThread * buildTimerThread;
|
TimingThread * buildTimerThread;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
12
ClassData.h
12
ClassData.h
|
@ -23,7 +23,7 @@ class Data{
|
||||||
int DPPType;
|
int DPPType;
|
||||||
std::string DPPTypeStr;
|
std::string DPPTypeStr;
|
||||||
unsigned short boardSN;
|
unsigned short boardSN;
|
||||||
float ch2ns; /// only use in TriggerRate calculation
|
float tick2ns; /// only use in TriggerRate calculation
|
||||||
|
|
||||||
unsigned int nByte; /// number of byte from read buffer
|
unsigned int nByte; /// number of byte from read buffer
|
||||||
uint32_t AllocatedSize;
|
uint32_t AllocatedSize;
|
||||||
|
@ -42,7 +42,7 @@ class Data{
|
||||||
int DataIndex[MaxNChannels];
|
int DataIndex[MaxNChannels];
|
||||||
|
|
||||||
unsigned long long Timestamp[MaxNChannels][MaxNData]; /// 47 bit
|
unsigned long long Timestamp[MaxNChannels][MaxNData]; /// 47 bit
|
||||||
unsigned short fineTime[MaxNChannels][MaxNData]; /// 10 bits, in unit of ch2ns / 1000 = ps
|
unsigned short fineTime[MaxNChannels][MaxNData]; /// 10 bits, in unit of tick2ns / 1000 = ps
|
||||||
unsigned short Energy[MaxNChannels][MaxNData]; /// 15 bit
|
unsigned short Energy[MaxNChannels][MaxNData]; /// 15 bit
|
||||||
unsigned short Energy2[MaxNChannels][MaxNData]; /// 15 bit, in PSD, Energy = Qshort, Energy2 = Qlong
|
unsigned short Energy2[MaxNChannels][MaxNData]; /// 15 bit, in PSD, Energy = Qshort, Energy2 = Qlong
|
||||||
bool PileUp[MaxNChannels][MaxNData]; /// pile up flag
|
bool PileUp[MaxNChannels][MaxNData]; /// pile up flag
|
||||||
|
@ -113,7 +113,7 @@ class Data{
|
||||||
//==========================================
|
//==========================================
|
||||||
|
|
||||||
inline Data::Data(){
|
inline Data::Data(){
|
||||||
ch2ns = 2.0;
|
tick2ns = 2.0;
|
||||||
boardSN = 0;
|
boardSN = 0;
|
||||||
DPPType = V1730_DPP_PHA_CODE;
|
DPPType = V1730_DPP_PHA_CODE;
|
||||||
DPPTypeStr = "";
|
DPPTypeStr = "";
|
||||||
|
@ -414,7 +414,7 @@ inline void Data::DecodeBuffer(bool fastDecode, int verbose){
|
||||||
//printf("%d %d| %d %d \n", DataIndex[ch], NumEventsDecoded[ch], indexStart, DataIndex[ch] );
|
//printf("%d %d| %d %d \n", DataIndex[ch], NumEventsDecoded[ch], indexStart, DataIndex[ch] );
|
||||||
|
|
||||||
unsigned long long dTime = Timestamp[ch][DataIndex[ch]] - Timestamp[ch][indexStart];
|
unsigned long long dTime = Timestamp[ch][DataIndex[ch]] - Timestamp[ch][indexStart];
|
||||||
double sec = dTime * ch2ns / 1e9;
|
double sec = dTime * tick2ns / 1e9;
|
||||||
|
|
||||||
TriggerRate[ch] = NumEventsDecoded[ch]/sec;
|
TriggerRate[ch] = NumEventsDecoded[ch]/sec;
|
||||||
NonPileUpRate[ch] = NumNonPileUpDecoded[ch]/sec;
|
NonPileUpRate[ch] = NumNonPileUpDecoded[ch]/sec;
|
||||||
|
@ -430,9 +430,9 @@ inline void Data::DecodeBuffer(bool fastDecode, int verbose){
|
||||||
|
|
||||||
if( calIndexes[ch][0] > -1 && calIndexes[ch][1] > -1 && nEvent > 10 ){
|
if( calIndexes[ch][0] > -1 && calIndexes[ch][1] > -1 && nEvent > 10 ){
|
||||||
unsigned long long dTime = Timestamp[ch][calIndexes[ch][1]] - Timestamp[ch][calIndexes[ch][0]];
|
unsigned long long dTime = Timestamp[ch][calIndexes[ch][1]] - Timestamp[ch][calIndexes[ch][0]];
|
||||||
double sec = dTime * ch2ns / 1e9;
|
double sec = dTime * tick2ns / 1e9;
|
||||||
|
|
||||||
//printf(" %10llu %10llu, %f = %f sec, rate = %f \n", Timestamp[ch][calIndexes[ch][0]], Timestamp[ch][calIndexes[ch][1]], ch2ns, sec, nEvent / sec);
|
//printf(" %10llu %10llu, %f = %f sec, rate = %f \n", Timestamp[ch][calIndexes[ch][0]], Timestamp[ch][calIndexes[ch][1]], tick2ns, sec, nEvent / sec);
|
||||||
|
|
||||||
TriggerRate[ch] = nEvent / sec;
|
TriggerRate[ch] = nEvent / sec;
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ void Digitizer::Initalization(){
|
||||||
ADCbits = 1;
|
ADCbits = 1;
|
||||||
DPPType = 0;
|
DPPType = 0;
|
||||||
ADCFullSize = 0;
|
ADCFullSize = 0;
|
||||||
ch2ns = 0;
|
tick2ns = 0;
|
||||||
BoardInfo = {};
|
BoardInfo = {};
|
||||||
|
|
||||||
channelMask = 0xFFFF;
|
channelMask = 0xFFFF;
|
||||||
|
@ -59,7 +59,7 @@ void Digitizer::Reset(){
|
||||||
|
|
||||||
void Digitizer::PrintBoard (){
|
void Digitizer::PrintBoard (){
|
||||||
printf("Connected to Model %s with handle %d using %s\n", BoardInfo.ModelName, handle, LinkType == CAEN_DGTZ_USB ? "USB" : "Optical Link");
|
printf("Connected to Model %s with handle %d using %s\n", BoardInfo.ModelName, handle, LinkType == CAEN_DGTZ_USB ? "USB" : "Optical Link");
|
||||||
printf("Sampling rate : %.0f MHz = %.1f ns \n", 1000/ch2ns, ch2ns);
|
printf("Sampling rate : %.0f MHz = %.1f ns \n", 1000/tick2ns, tick2ns);
|
||||||
printf("Number of Channels : %d = 0x%X\n", NChannel, channelMask);
|
printf("Number of Channels : %d = 0x%X\n", NChannel, channelMask);
|
||||||
printf("SerialNumber :\e[1m\e[33m %d\e[0m\n", BoardInfo.SerialNumber);
|
printf("SerialNumber :\e[1m\e[33m %d\e[0m\n", BoardInfo.SerialNumber);
|
||||||
printf("DPPType : %d (%s)\n", DPPType, GetDPPString().c_str());
|
printf("DPPType : %d (%s)\n", DPPType, GetDPPString().c_str());
|
||||||
|
@ -103,11 +103,11 @@ int Digitizer::OpenDigitizer(int boardID, int portID, bool program, bool verbose
|
||||||
NChannel = BoardInfo.Channels;
|
NChannel = BoardInfo.Channels;
|
||||||
channelMask = pow(2, NChannel)-1;
|
channelMask = pow(2, NChannel)-1;
|
||||||
switch(BoardInfo.Model){
|
switch(BoardInfo.Model){
|
||||||
case CAEN_DGTZ_V1730: ch2ns = 2.0; break; ///ns -> 500 MSamples/s
|
case CAEN_DGTZ_V1730: tick2ns = 2.0; break; ///ns -> 500 MSamples/s
|
||||||
case CAEN_DGTZ_V1725: ch2ns = 4.0; break; ///ns -> 250 MSamples/s
|
case CAEN_DGTZ_V1725: tick2ns = 4.0; break; ///ns -> 250 MSamples/s
|
||||||
default : ch2ns = 4.0; break;
|
default : tick2ns = 4.0; break;
|
||||||
}
|
}
|
||||||
data->ch2ns = ch2ns;
|
data->tick2ns = tick2ns;
|
||||||
data->boardSN = BoardInfo.SerialNumber;
|
data->boardSN = BoardInfo.SerialNumber;
|
||||||
ADCbits = BoardInfo.ADC_NBits;
|
ADCbits = BoardInfo.ADC_NBits;
|
||||||
ADCFullSize = (unsigned int)( pow(2, ADCbits) -1 );
|
ADCFullSize = (unsigned int)( pow(2, ADCbits) -1 );
|
||||||
|
@ -739,8 +739,8 @@ int Digitizer::LoadSettingBinaryToMemory(std::string fileName){
|
||||||
if( dummy != 0 ) printf("reach the end of file (read %ld).\n", dummy);
|
if( dummy != 0 ) printf("reach the end of file (read %ld).\n", dummy);
|
||||||
|
|
||||||
uint32_t boardInfo = GetSettingFromMemory(DPP::BoardInfo_R);
|
uint32_t boardInfo = GetSettingFromMemory(DPP::BoardInfo_R);
|
||||||
if( (boardInfo & 0xFF) == 0x0E ) ch2ns = 4.0;
|
if( (boardInfo & 0xFF) == 0x0E ) tick2ns = 4.0;
|
||||||
if( (boardInfo & 0xFF) == 0x0B ) ch2ns = 2.0;
|
if( (boardInfo & 0xFF) == 0x0B ) tick2ns = 2.0;
|
||||||
|
|
||||||
///Should seperate file<->memory, memory<->board
|
///Should seperate file<->memory, memory<->board
|
||||||
///ProgramSettingsToBoard(); /// do nothing if not connected.
|
///ProgramSettingsToBoard(); /// do nothing if not connected.
|
||||||
|
|
|
@ -31,7 +31,7 @@ class Digitizer{
|
||||||
int ADCbits; /// ADC bit
|
int ADCbits; /// ADC bit
|
||||||
int DPPType; /// DPP verion
|
int DPPType; /// DPP verion
|
||||||
unsigned int ADCFullSize; /// pow(2, ADCbits) - 1
|
unsigned int ADCFullSize; /// pow(2, ADCbits) - 1
|
||||||
float ch2ns; /// channel to ns
|
float tick2ns; /// channel to ns
|
||||||
CAEN_DGTZ_BoardInfo_t BoardInfo;
|
CAEN_DGTZ_BoardInfo_t BoardInfo;
|
||||||
|
|
||||||
//^----- adjustable parameters
|
//^----- adjustable parameters
|
||||||
|
@ -105,7 +105,7 @@ class Digitizer{
|
||||||
int GetSerialNumber() const {return BoardInfo.SerialNumber;}
|
int GetSerialNumber() const {return BoardInfo.SerialNumber;}
|
||||||
int GetChannelMask() { channelMask = GetSettingFromMemory(DPP::ChannelEnableMask); return channelMask;}
|
int GetChannelMask() { channelMask = GetSettingFromMemory(DPP::ChannelEnableMask); return channelMask;}
|
||||||
bool GetChannelOnOff(unsigned ch) { channelMask = GetSettingFromMemory(DPP::ChannelEnableMask); return (channelMask & ( 1 << ch) );}
|
bool GetChannelOnOff(unsigned ch) { channelMask = GetSettingFromMemory(DPP::ChannelEnableMask); return (channelMask & ( 1 << ch) );}
|
||||||
float GetCh2ns() const {return ch2ns;}
|
float GetTick2ns() const {return tick2ns;}
|
||||||
int GetNChannels() const {return NChannel;}
|
int GetNChannels() const {return NChannel;}
|
||||||
int GetHandle() const {return handle;}
|
int GetHandle() const {return handle;}
|
||||||
int GetDPPType() const {return DPPType;}
|
int GetDPPType() const {return DPPType;}
|
||||||
|
|
|
@ -74,7 +74,7 @@ DigiSettingsPanel::DigiSettingsPanel(Digitizer ** digi, unsigned int nDigi, QStr
|
||||||
|
|
||||||
SetUpInfo( "S/N No. ", std::to_string(digi[ID]->GetSerialNumber()), infoLayout[ID], 1, 0);
|
SetUpInfo( "S/N No. ", std::to_string(digi[ID]->GetSerialNumber()), infoLayout[ID], 1, 0);
|
||||||
SetUpInfo( "No. Ch. ", std::to_string(digi[ID]->GetNChannels()), infoLayout[ID], 1, 2);
|
SetUpInfo( "No. Ch. ", std::to_string(digi[ID]->GetNChannels()), infoLayout[ID], 1, 2);
|
||||||
SetUpInfo("Sampling Rate ", std::to_string((int) digi[ID]->GetCh2ns()) + " ns = " + std::to_string( (int) (1000/digi[ID]->GetCh2ns())) + " MHz" , infoLayout[ID], 1, 4);
|
SetUpInfo("Sampling Rate ", std::to_string((int) digi[ID]->GetTick2ns()) + " ns = " + std::to_string( (int) (1000/digi[ID]->GetTick2ns())) + " MHz" , infoLayout[ID], 1, 4);
|
||||||
|
|
||||||
SetUpInfo("ADC bit ", std::to_string(digi[ID]->GetADCBits()), infoLayout[ID], 2, 0);
|
SetUpInfo("ADC bit ", std::to_string(digi[ID]->GetADCBits()), infoLayout[ID], 2, 0);
|
||||||
SetUpInfo("ROC version ", digi[ID]->GetROCVersion(), infoLayout[ID], 2, 2);
|
SetUpInfo("ROC version ", digi[ID]->GetROCVersion(), infoLayout[ID], 2, 2);
|
||||||
|
@ -733,8 +733,8 @@ void DigiSettingsPanel::SetUpSpinBox(RSpinBox * &sb, QString label, QGridLayout
|
||||||
sb->setSingleStep(1);
|
sb->setSingleStep(1);
|
||||||
sb->setMaximum(para.GetMaxBit());
|
sb->setMaximum(para.GetMaxBit());
|
||||||
}else{
|
}else{
|
||||||
sb->setMaximum(para.GetMaxBit() * para.GetPartialStep() * digi[ID]->GetCh2ns());
|
sb->setMaximum(para.GetMaxBit() * para.GetPartialStep() * digi[ID]->GetTick2ns());
|
||||||
sb->setSingleStep(para.GetPartialStep() * digi[ID]->GetCh2ns());
|
sb->setSingleStep(para.GetPartialStep() * digi[ID]->GetTick2ns());
|
||||||
}
|
}
|
||||||
|
|
||||||
if( para == DPP::DPPAlgorithmControl ) {
|
if( para == DPP::DPPAlgorithmControl ) {
|
||||||
|
@ -770,7 +770,7 @@ void DigiSettingsPanel::SetUpSpinBox(RSpinBox * &sb, QString label, QGridLayout
|
||||||
}
|
}
|
||||||
|
|
||||||
if( para == DPP::PSD::CFDSetting ){
|
if( para == DPP::PSD::CFDSetting ){
|
||||||
digi[ID]->SetBits(para, DPP::PSD::Bit_CFDSetting::CFDDealy, sb->value()/digi[ID]->GetCh2ns(), chID);
|
digi[ID]->SetBits(para, DPP::PSD::Bit_CFDSetting::CFDDealy, sb->value()/digi[ID]->GetTick2ns(), chID);
|
||||||
UpdatePanelFromMemory();
|
UpdatePanelFromMemory();
|
||||||
emit UpdateOtherPanels();
|
emit UpdateOtherPanels();
|
||||||
return;
|
return;
|
||||||
|
@ -783,7 +783,7 @@ void DigiSettingsPanel::SetUpSpinBox(RSpinBox * &sb, QString label, QGridLayout
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t bit = para.GetPartialStep() == -1 ? sb->value() : sb->value() / para.GetPartialStep() / digi[ID]->GetCh2ns();
|
uint32_t bit = para.GetPartialStep() == -1 ? sb->value() : sb->value() / para.GetPartialStep() / digi[ID]->GetTick2ns();
|
||||||
|
|
||||||
digi[ID]->WriteRegister(para, bit, chID);
|
digi[ID]->WriteRegister(para, bit, chID);
|
||||||
if( para.IsCoupled() == true && chID >= 0 ) digi[ID]->WriteRegister(para, bit, chID%2 == 0 ? chID + 1 : chID - 1);
|
if( para.IsCoupled() == true && chID >= 0 ) digi[ID]->WriteRegister(para, bit, chID%2 == 0 ? chID + 1 : chID - 1);
|
||||||
|
@ -964,8 +964,8 @@ void DigiSettingsPanel::SetUpGlobalTriggerMaskAndFrontPanelMask(QGridLayout * &
|
||||||
|
|
||||||
sbGlbMajCoinWin[ID] = new RSpinBox(this);
|
sbGlbMajCoinWin[ID] = new RSpinBox(this);
|
||||||
sbGlbMajCoinWin[ID]->setMinimum(0);
|
sbGlbMajCoinWin[ID]->setMinimum(0);
|
||||||
sbGlbMajCoinWin[ID]->setMaximum(0xF * 4 * digi[ID]->GetCh2ns() );
|
sbGlbMajCoinWin[ID]->setMaximum(0xF * 4 * digi[ID]->GetTick2ns() );
|
||||||
sbGlbMajCoinWin[ID]->setSingleStep(4 * digi[ID]->GetCh2ns());
|
sbGlbMajCoinWin[ID]->setSingleStep(4 * digi[ID]->GetTick2ns());
|
||||||
maskLayout->addWidget(sbGlbMajCoinWin[ID], 1, 10);
|
maskLayout->addWidget(sbGlbMajCoinWin[ID], 1, 10);
|
||||||
connect(sbGlbMajCoinWin[ID], &RSpinBox::valueChanged, this, [=](){
|
connect(sbGlbMajCoinWin[ID], &RSpinBox::valueChanged, this, [=](){
|
||||||
if( !enableSignalSlot ) return;
|
if( !enableSignalSlot ) return;
|
||||||
|
@ -982,7 +982,7 @@ void DigiSettingsPanel::SetUpGlobalTriggerMaskAndFrontPanelMask(QGridLayout * &
|
||||||
}
|
}
|
||||||
|
|
||||||
sbGlbMajCoinWin[ID]->setStyleSheet("");
|
sbGlbMajCoinWin[ID]->setStyleSheet("");
|
||||||
digi[ID]->SetBits(DPP::GlobalTriggerMask, DPP::Bit_GlobalTriggerMask::MajorCoinWin, sbGlbMajCoinWin[ID]->value() / 4 / digi[ID]->GetCh2ns(), -1);
|
digi[ID]->SetBits(DPP::GlobalTriggerMask, DPP::Bit_GlobalTriggerMask::MajorCoinWin, sbGlbMajCoinWin[ID]->value() / 4 / digi[ID]->GetTick2ns(), -1);
|
||||||
});
|
});
|
||||||
|
|
||||||
//*============================================
|
//*============================================
|
||||||
|
@ -2581,7 +2581,7 @@ void DigiSettingsPanel::UpdatePanelFromMemory(){
|
||||||
//&###########################################################
|
//&###########################################################
|
||||||
void DigiSettingsPanel::UpdateSpinBox(RSpinBox * &sb, Reg para, int ch){
|
void DigiSettingsPanel::UpdateSpinBox(RSpinBox * &sb, Reg para, int ch){
|
||||||
|
|
||||||
int ch2ns = digi[ID]->GetCh2ns();
|
int tick2ns = digi[ID]->GetTick2ns();
|
||||||
int pStep = para.GetPartialStep();
|
int pStep = para.GetPartialStep();
|
||||||
|
|
||||||
uint32_t value = digi[ID]->GetSettingFromMemory(para, ch);
|
uint32_t value = digi[ID]->GetSettingFromMemory(para, ch);
|
||||||
|
@ -2593,7 +2593,7 @@ void DigiSettingsPanel::UpdateSpinBox(RSpinBox * &sb, Reg para, int ch){
|
||||||
}
|
}
|
||||||
|
|
||||||
if( para == DPP::PSD::CFDSetting ){
|
if( para == DPP::PSD::CFDSetting ){
|
||||||
sb->setValue( ( value & DPP::PSD::CFDSetting.GetMaxBit() ) * ch2ns );
|
sb->setValue( ( value & DPP::PSD::CFDSetting.GetMaxBit() ) * tick2ns );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2602,9 +2602,9 @@ void DigiSettingsPanel::UpdateSpinBox(RSpinBox * &sb, Reg para, int ch){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sb->setValue( pStep > 0 ? value * pStep * ch2ns : value);
|
sb->setValue( pStep > 0 ? value * pStep * tick2ns : value);
|
||||||
|
|
||||||
//printf("%d, %s | %d %d %u, %f\n", para.GetNameChar(), ch, ch2ns, pStep, value, sb->value());
|
//printf("%d, %s | %d %d %u, %f\n", para.GetNameChar(), ch, tick2ns, pStep, value, sb->value());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
719
Histogram2D.h
719
Histogram2D.h
|
@ -136,143 +136,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
//^================= right click
|
//^================= right click
|
||||||
if (event->button() == Qt::RightButton) {
|
if (event->button() == Qt::RightButton) rightMouseClickMenu(event);
|
||||||
usingMenu = true;
|
|
||||||
setSelectionRectMode(QCP::SelectionRectMode::srmNone);
|
|
||||||
|
|
||||||
QMenu *menu = new QMenu(this);
|
|
||||||
menu->setAttribute(Qt::WA_DeleteOnClose);
|
|
||||||
|
|
||||||
QAction * a1 = menu->addAction("UnZoom");
|
|
||||||
QAction * a2 = menu->addAction("Clear hist.");
|
|
||||||
QAction * a3 = menu->addAction("Toggle Stat.");
|
|
||||||
QAction * a4 = menu->addAction("Rebin (clear histogram)");
|
|
||||||
QAction * a5 = menu->addAction("Create a Cut");
|
|
||||||
if( numCut > 0 ) {
|
|
||||||
menu->addSeparator();
|
|
||||||
menu->addAction("Add/Edit names to Cuts");
|
|
||||||
menu->addAction("Clear all Cuts");
|
|
||||||
}
|
|
||||||
for( int i = 0; i < cutList.size(); i++){
|
|
||||||
if( cutList[i].isEmpty()) continue;
|
|
||||||
QString haha = "";
|
|
||||||
menu->addAction("Delete " + cutNameList[i] + " ["+ colorCycle[cutIDList[i]%colorCycle.count()].second+"]");
|
|
||||||
}
|
|
||||||
|
|
||||||
QAction *selectedAction = menu->exec(event->globalPosition().toPoint());
|
|
||||||
|
|
||||||
if( selectedAction == a1 ){
|
|
||||||
xAxis->setRangeLower(xMin);
|
|
||||||
xAxis->setRangeUpper(xMax);
|
|
||||||
yAxis->setRangeLower(yMin);
|
|
||||||
yAxis->setRangeUpper(yMax);
|
|
||||||
replot();
|
|
||||||
usingMenu = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( selectedAction == a2 ) {
|
|
||||||
Clear();
|
|
||||||
usingMenu = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( selectedAction == a3 ){
|
|
||||||
for( int i = 0; i < 3; i ++ ){
|
|
||||||
for( int j = 0; j < 3; j ++ ){
|
|
||||||
box[i][j]->setVisible( !box[i][j]->visible());
|
|
||||||
txt[i][j]->setVisible( !txt[i][j]->visible());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
replot();
|
|
||||||
usingMenu = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( selectedAction == a4){
|
|
||||||
rightMouseClickRebin();
|
|
||||||
usingMenu = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( selectedAction == a5 ){
|
|
||||||
tempCut.clear();
|
|
||||||
tempCutID ++;
|
|
||||||
isDrawCut= true;
|
|
||||||
usingMenu = false;
|
|
||||||
numCut ++;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( selectedAction && numCut > 0 && selectedAction->text().contains("Delete ") ){
|
|
||||||
|
|
||||||
QString haha = selectedAction->text();
|
|
||||||
int index1 = haha.indexOf("-");
|
|
||||||
int index2 = haha.indexOf("[");
|
|
||||||
int cutID = haha.mid(index1+1, index2-index1-1).remove(' ').toInt();
|
|
||||||
|
|
||||||
removeItem(cutTextIDList[cutID]);
|
|
||||||
removePlottable(plottableIDList[cutID]);
|
|
||||||
replot();
|
|
||||||
|
|
||||||
numCut --;
|
|
||||||
cutList[cutID].clear();
|
|
||||||
cutIDList[cutID] = -1;
|
|
||||||
cutTextIDList[cutID] = -1;
|
|
||||||
plottableIDList[cutID] = -1;
|
|
||||||
cutNameList[cutID] = "";
|
|
||||||
cutEntryList[cutID] = -1;
|
|
||||||
|
|
||||||
for( int i = cutID + 1; i < cutTextIDList.count() ; i++){
|
|
||||||
cutTextIDList[i] --;
|
|
||||||
plottableIDList[i] --;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( numCut == 0 ){
|
|
||||||
tempCutID = -1;
|
|
||||||
lastPlottableID = -1;
|
|
||||||
cutList.clear();
|
|
||||||
cutIDList.clear();
|
|
||||||
cutTextIDList.clear();
|
|
||||||
plottableIDList.clear();
|
|
||||||
cutNameList.clear();
|
|
||||||
cutEntryList.clear();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( selectedAction && numCut > 0 && selectedAction->text().contains("Clear all Cuts") ){
|
|
||||||
ClearAllCuts();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( selectedAction && numCut > 0 && selectedAction->text().contains("Add/Edit names to Cuts") ){
|
|
||||||
|
|
||||||
QDialog dialog(this);
|
|
||||||
dialog.setWindowTitle("Add/Edit name of cuts ");
|
|
||||||
|
|
||||||
QFormLayout layout(&dialog);
|
|
||||||
|
|
||||||
for(int i = 0; i < cutTextIDList.count(); i++){
|
|
||||||
if( cutTextIDList[i] < 0 ) continue;
|
|
||||||
QLineEdit * le = new QLineEdit(&dialog);
|
|
||||||
layout.addRow(colorCycle[i%colorCycle.count()].second, le);
|
|
||||||
le->setText( cutNameList[i] );
|
|
||||||
connect(le, &QLineEdit::textChanged, this, [=](){
|
|
||||||
le->setStyleSheet("color : blue;");
|
|
||||||
});
|
|
||||||
connect(le, &QLineEdit::returnPressed, this, [=](){
|
|
||||||
le->setStyleSheet("");
|
|
||||||
cutNameList[i] = le->text();
|
|
||||||
((QCPItemText *) this->item(cutTextIDList[i]))->setText(le->text());
|
|
||||||
replot();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
dialog.exec();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
}///================= end of right click
|
|
||||||
});
|
});
|
||||||
|
|
||||||
//connect( this, &QCustomPlot::mouseDoubleClick, this, [=](QMouseEvent *event){
|
//connect( this, &QCustomPlot::mouseDoubleClick, this, [=](QMouseEvent *event){
|
||||||
|
@ -310,134 +174,26 @@ public:
|
||||||
|
|
||||||
connect(this, &QCustomPlot::mouseRelease, this, [=](){
|
connect(this, &QCustomPlot::mouseRelease, this, [=](){
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//^===================================
|
//^===================================
|
||||||
|
|
||||||
void Rebin(int xbin, double xmin, double xmax, int ybin, double ymin, double ymax){
|
void Rebin(int xbin, double xmin, double xmax, int ybin, double ymin, double ymax);
|
||||||
xMin = xmin;
|
|
||||||
xMax = xmax;
|
|
||||||
yMin = ymin;
|
|
||||||
yMax = ymax;
|
|
||||||
xBin = xbin;
|
|
||||||
yBin = ybin;
|
|
||||||
|
|
||||||
colorMap->data()->clear();
|
void UpdatePlot(){ colorMap->rescaleDataRange(); replot(); }
|
||||||
colorMap->data()->setSize(xBin, yBin);
|
|
||||||
colorMap->data()->setRange(QCPRange(xMin, xMax), QCPRange(yMin, yMax));
|
|
||||||
|
|
||||||
for( int i = 0; i < 3; i ++){
|
void Clear(); // Clear Data and histrogram
|
||||||
for( int j = 0; j < 3; j ++){
|
|
||||||
entry[i][j] = 0;
|
|
||||||
if( txt[i][j] ) txt[i][j]->setText("0");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
void Fill(double x, double y);
|
||||||
|
|
||||||
void UpdatePlot(){
|
void DrawCut();
|
||||||
colorMap->rescaleDataRange();
|
void ClearAllCuts();
|
||||||
//rescaleAxes();
|
|
||||||
replot();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Clear(){
|
|
||||||
|
|
||||||
for( int i = 0; i < 3; i ++){
|
|
||||||
for( int j = 0; j < 3; j ++){
|
|
||||||
entry[i][j] = 0;
|
|
||||||
txt[i][j]->setText("0");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
colorMap->data()->clear();
|
|
||||||
UpdatePlot();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Fill(double x, double y){
|
|
||||||
if( isBusy ) return;
|
|
||||||
int xIndex, yIndex;
|
|
||||||
colorMap->data()->coordToCell(x, y, &xIndex, &yIndex);
|
|
||||||
//printf("%f, %d %d| %f, %d %d\n", x, xIndex, xBin, y, yIndex, yBin);
|
|
||||||
|
|
||||||
int xk = 1, yk = 1;
|
|
||||||
if( xIndex < 0 ) xk = 0;
|
|
||||||
if( xIndex >= xBin ) xk = 2;
|
|
||||||
if( yIndex < 0 ) yk = 0;
|
|
||||||
if( yIndex >= yBin ) yk = 2;
|
|
||||||
entry[xk][yk] ++;
|
|
||||||
|
|
||||||
txt[xk][yk]->setText(QString::number(entry[xk][yk]));
|
|
||||||
|
|
||||||
if( xk == 1 && yk == 1 ) {
|
|
||||||
double value = colorMap->data()->cell(xIndex, yIndex);
|
|
||||||
colorMap->data()->setCell(xIndex, yIndex, value + 1);
|
|
||||||
|
|
||||||
for( int i = 0; i < cutList.count(); i++){
|
|
||||||
if( cutList[i].isEmpty() ) continue;
|
|
||||||
if( cutList[i].containsPoint(QPointF(x,y), Qt::OddEvenFill) ) cutEntryList[i] ++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DrawCut(){
|
|
||||||
|
|
||||||
//The histogram is the 1st plottable.
|
|
||||||
// the lastPlottableID should be numCut+ 1
|
|
||||||
if( lastPlottableID != numCut ){
|
|
||||||
removePlottable(lastPlottableID);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tempCut.size() > 0) {
|
|
||||||
QCPCurve *polygon = new QCPCurve(xAxis, yAxis);
|
|
||||||
lastPlottableID = plottableCount() - 1;
|
|
||||||
|
|
||||||
int colorID = tempCutID% colorCycle.count();
|
|
||||||
QPen pen(colorCycle[colorID].first);
|
|
||||||
pen.setWidth(1);
|
|
||||||
polygon->setPen(pen);
|
|
||||||
|
|
||||||
QVector<QCPCurveData> dataPoints;
|
|
||||||
for (const QPointF& point : tempCut) {
|
|
||||||
dataPoints.append(QCPCurveData(dataPoints.size(), point.x(), point.y()));
|
|
||||||
}
|
|
||||||
polygon->data()->set(dataPoints, false);
|
|
||||||
}
|
|
||||||
replot();
|
|
||||||
|
|
||||||
//qDebug() << "Plottable count : " << plottableCount() << ", cutList.count :" << cutList.count() << ", cutID :" << lastPlottableID;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClearAllCuts(){
|
|
||||||
numCut = 0;
|
|
||||||
tempCutID = -1;
|
|
||||||
lastPlottableID = -1;
|
|
||||||
cutList.clear();
|
|
||||||
cutIDList.clear();
|
|
||||||
for( int i = cutTextIDList.count() - 1; i >= 0 ; i--){
|
|
||||||
if( cutTextIDList[i] < 0 ) continue;
|
|
||||||
removeItem(cutTextIDList[i]);
|
|
||||||
removePlottable(plottableIDList[i]);
|
|
||||||
}
|
|
||||||
replot();
|
|
||||||
|
|
||||||
cutTextIDList.clear();
|
|
||||||
plottableIDList.clear();
|
|
||||||
cutNameList.clear();
|
|
||||||
cutEntryList.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QPolygonF> GetCutList() const{return cutList;} // this list may contain empty element
|
QList<QPolygonF> GetCutList() const{return cutList;} // this list may contain empty element
|
||||||
QList<int> GetCutEntryList() const{ return cutEntryList;}
|
QList<int> GetCutEntryList() const{ return cutEntryList;}
|
||||||
void PrintCutEntry() const{
|
QList<QString> GetCutNameList() const { return cutNameList;}
|
||||||
if( numCut == 0 ) return;
|
void PrintCutEntry() const;
|
||||||
printf("=============== There are %d cuts.\n", numCut);
|
|
||||||
for( int i = 0; i < cutList.count(); i++){
|
|
||||||
if( cutList[i].isEmpty() ) continue;
|
|
||||||
printf("%10s | %d \n", cutNameList[i].toStdString().c_str(), cutEntryList[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double xMin, xMax, yMin, yMax;
|
double xMin, xMax, yMin, yMax;
|
||||||
|
@ -470,104 +226,367 @@ private:
|
||||||
|
|
||||||
bool isBusy;
|
bool isBusy;
|
||||||
|
|
||||||
//^======================== Right Mouse click action
|
void rightMouseClickMenu(QMouseEvent * event);
|
||||||
void rightMouseClickRebin(){
|
void rightMouseClickRebin();
|
||||||
QDialog dialog(this);
|
|
||||||
dialog.setWindowTitle("Rebin histogram");
|
|
||||||
|
|
||||||
QFormLayout layout(&dialog);
|
|
||||||
|
|
||||||
QLabel * info = new QLabel(&dialog);
|
|
||||||
info->setStyleSheet("color:red;");
|
|
||||||
info->setText("This will also clear histogram!!");
|
|
||||||
layout.addRow(info);
|
|
||||||
|
|
||||||
QStringList nameListX = {"Num. x-Bin", "x-Min", "x-Max"};
|
|
||||||
QLineEdit* lineEditX[3];
|
|
||||||
for (int i = 0; i < 3; ++i) {
|
|
||||||
lineEditX[i] = new QLineEdit(&dialog);
|
|
||||||
layout.addRow(nameListX[i] + " : ", lineEditX[i]);
|
|
||||||
}
|
|
||||||
lineEditX[0]->setText(QString::number(xBin));
|
|
||||||
lineEditX[1]->setText(QString::number(xMin));
|
|
||||||
lineEditX[2]->setText(QString::number(xMax));
|
|
||||||
|
|
||||||
QStringList nameListY = {"Num. y-Bin", "y-Min", "y-Max"};
|
|
||||||
QLineEdit* lineEditY[3];
|
|
||||||
for (int i = 0; i < 3; ++i) {
|
|
||||||
lineEditY[i] = new QLineEdit(&dialog);
|
|
||||||
layout.addRow(nameListY[i] + " : ", lineEditY[i]);
|
|
||||||
}
|
|
||||||
lineEditY[0]->setText(QString::number(yBin));
|
|
||||||
lineEditY[1]->setText(QString::number(yMin));
|
|
||||||
lineEditY[2]->setText(QString::number(yMax));
|
|
||||||
|
|
||||||
QLabel * msg = new QLabel(&dialog);
|
|
||||||
msg->setStyleSheet("color:red;");
|
|
||||||
layout.addRow(msg);
|
|
||||||
|
|
||||||
QDialogButtonBox buttonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, &dialog);
|
|
||||||
layout.addRow(&buttonBox);
|
|
||||||
|
|
||||||
double number[3][2];
|
|
||||||
|
|
||||||
QObject::connect(&buttonBox, &QDialogButtonBox::accepted, [&]() {
|
|
||||||
int OKcount = 0;
|
|
||||||
bool conversionOk = true;
|
|
||||||
for( int i = 0; i < 3; i++ ){
|
|
||||||
number[i][0] = lineEditX[i]->text().toDouble(&conversionOk);
|
|
||||||
if( conversionOk ){
|
|
||||||
OKcount++;
|
|
||||||
}else{
|
|
||||||
msg->setText(nameListX[i] + " is invalid.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for( int i = 0; i < 3; i++ ){
|
|
||||||
number[i][1] = lineEditY[i]->text().toDouble(&conversionOk);
|
|
||||||
if( conversionOk ){
|
|
||||||
OKcount++;
|
|
||||||
}else{
|
|
||||||
msg->setText(nameListY[i] + " is invalid.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( OKcount == 6 ) {
|
|
||||||
if( number[0][0] <= 0 ) {
|
|
||||||
msg->setText( nameListX[0] + " is zero or negative" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if( number[0][0] <= 0 ) {
|
|
||||||
msg->setText( nameListX[0] + " is zero or negative" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( number[2][0] > number[1][0] && number[2][1] > number[1][1] ) {
|
|
||||||
dialog.accept();
|
|
||||||
}else{
|
|
||||||
if( number[2][0] > number[1][0] ){
|
|
||||||
msg->setText(nameListX[2] + " is smaller than " + nameListX[1]);
|
|
||||||
}
|
|
||||||
if( number[2][1] > number[1][1] ){
|
|
||||||
msg->setText(nameListY[2] + " is smaller than " + nameListY[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
QObject::connect(&buttonBox, &QDialogButtonBox::rejected, [&]() { dialog.reject();});
|
|
||||||
|
|
||||||
if( dialog.exec() == QDialog::Accepted ){
|
|
||||||
isBusy = true;
|
|
||||||
Rebin((int)number[0][0], number[1][0], number[2][0], (int)number[0][1], number[1][1], number[2][1]);
|
|
||||||
rescaleAxes();
|
|
||||||
UpdatePlot();
|
|
||||||
isBusy = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//^###############################################
|
||||||
|
//^###############################################
|
||||||
|
|
||||||
|
inline void Histogram2D::Fill(double x, double y){
|
||||||
|
if( isBusy ) return;
|
||||||
|
int xIndex, yIndex;
|
||||||
|
colorMap->data()->coordToCell(x, y, &xIndex, &yIndex);
|
||||||
|
//printf("%f, %d %d| %f, %d %d\n", x, xIndex, xBin, y, yIndex, yBin);
|
||||||
|
|
||||||
|
int xk = 1, yk = 1;
|
||||||
|
if( xIndex < 0 ) xk = 0;
|
||||||
|
if( xIndex >= xBin ) xk = 2;
|
||||||
|
if( yIndex < 0 ) yk = 0;
|
||||||
|
if( yIndex >= yBin ) yk = 2;
|
||||||
|
entry[xk][yk] ++;
|
||||||
|
|
||||||
|
txt[xk][yk]->setText(QString::number(entry[xk][yk]));
|
||||||
|
|
||||||
|
if( xk == 1 && yk == 1 ) {
|
||||||
|
double value = colorMap->data()->cell(xIndex, yIndex);
|
||||||
|
colorMap->data()->setCell(xIndex, yIndex, value + 1);
|
||||||
|
|
||||||
|
for( int i = 0; i < cutList.count(); i++){
|
||||||
|
if( cutList[i].isEmpty() ) continue;
|
||||||
|
if( cutList[i].containsPoint(QPointF(x,y), Qt::OddEvenFill) ) cutEntryList[i] ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Histogram2D::Rebin(int xbin, double xmin, double xmax, int ybin, double ymin, double ymax){
|
||||||
|
xMin = xmin;
|
||||||
|
xMax = xmax;
|
||||||
|
yMin = ymin;
|
||||||
|
yMax = ymax;
|
||||||
|
xBin = xbin;
|
||||||
|
yBin = ybin;
|
||||||
|
|
||||||
|
colorMap->data()->clear();
|
||||||
|
colorMap->data()->setSize(xBin, yBin);
|
||||||
|
colorMap->data()->setRange(QCPRange(xMin, xMax), QCPRange(yMin, yMax));
|
||||||
|
|
||||||
|
for( int i = 0; i < 3; i ++){
|
||||||
|
for( int j = 0; j < 3; j ++){
|
||||||
|
entry[i][j] = 0;
|
||||||
|
if( txt[i][j] ) txt[i][j]->setText("0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Histogram2D::Clear(){
|
||||||
|
for( int i = 0; i < 3; i ++){
|
||||||
|
for( int j = 0; j < 3; j ++){
|
||||||
|
entry[i][j] = 0;
|
||||||
|
txt[i][j]->setText("0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
colorMap->data()->clear();
|
||||||
|
colorMap->data()->setSize(xBin, yBin);
|
||||||
|
colorMap->data()->setRange(QCPRange(xMin, xMax), QCPRange(yMin, yMax));
|
||||||
|
|
||||||
|
UpdatePlot();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Histogram2D::ClearAllCuts(){
|
||||||
|
numCut = 0;
|
||||||
|
tempCutID = -1;
|
||||||
|
lastPlottableID = -1;
|
||||||
|
cutList.clear();
|
||||||
|
cutIDList.clear();
|
||||||
|
for( int i = cutTextIDList.count() - 1; i >= 0 ; i--){
|
||||||
|
if( cutTextIDList[i] < 0 ) continue;
|
||||||
|
removeItem(cutTextIDList[i]);
|
||||||
|
removePlottable(plottableIDList[i]);
|
||||||
|
}
|
||||||
|
replot();
|
||||||
|
|
||||||
|
cutTextIDList.clear();
|
||||||
|
plottableIDList.clear();
|
||||||
|
cutNameList.clear();
|
||||||
|
cutEntryList.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Histogram2D::PrintCutEntry() const{
|
||||||
|
if( numCut == 0 ) return;
|
||||||
|
printf("=============== There are %d cuts.\n", numCut);
|
||||||
|
for( int i = 0; i < cutList.count(); i++){
|
||||||
|
if( cutList[i].isEmpty() ) continue;
|
||||||
|
printf("%10s | %d \n", cutNameList[i].toStdString().c_str(), cutEntryList[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Histogram2D::DrawCut(){
|
||||||
|
|
||||||
|
//The histogram is the 1st plottable.
|
||||||
|
// the lastPlottableID should be numCut+ 1
|
||||||
|
if( lastPlottableID != numCut ){
|
||||||
|
removePlottable(lastPlottableID);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(tempCut.size() > 0) {
|
||||||
|
QCPCurve *polygon = new QCPCurve(xAxis, yAxis);
|
||||||
|
lastPlottableID = plottableCount() - 1;
|
||||||
|
|
||||||
|
int colorID = tempCutID% colorCycle.count();
|
||||||
|
QPen pen(colorCycle[colorID].first);
|
||||||
|
pen.setWidth(1);
|
||||||
|
polygon->setPen(pen);
|
||||||
|
|
||||||
|
QVector<QCPCurveData> dataPoints;
|
||||||
|
for (const QPointF& point : tempCut) {
|
||||||
|
dataPoints.append(QCPCurveData(dataPoints.size(), point.x(), point.y()));
|
||||||
|
}
|
||||||
|
polygon->data()->set(dataPoints, false);
|
||||||
|
}
|
||||||
|
replot();
|
||||||
|
|
||||||
|
//qDebug() << "Plottable count : " << plottableCount() << ", cutList.count :" << cutList.count() << ", cutID :" << lastPlottableID;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Histogram2D::rightMouseClickMenu(QMouseEvent * event){
|
||||||
|
usingMenu = true;
|
||||||
|
setSelectionRectMode(QCP::SelectionRectMode::srmNone);
|
||||||
|
|
||||||
|
QMenu *menu = new QMenu(this);
|
||||||
|
menu->setAttribute(Qt::WA_DeleteOnClose);
|
||||||
|
|
||||||
|
QAction * a1 = menu->addAction("UnZoom");
|
||||||
|
QAction * a2 = menu->addAction("Clear hist.");
|
||||||
|
QAction * a3 = menu->addAction("Toggle Stat.");
|
||||||
|
QAction * a4 = menu->addAction("Rebin (clear histogram)");
|
||||||
|
QAction * a5 = menu->addAction("Create a Cut");
|
||||||
|
if( numCut > 0 ) {
|
||||||
|
menu->addSeparator();
|
||||||
|
menu->addAction("Add/Edit names to Cuts");
|
||||||
|
menu->addAction("Clear all Cuts");
|
||||||
|
}
|
||||||
|
for( int i = 0; i < cutList.size(); i++){
|
||||||
|
if( cutList[i].isEmpty()) continue;
|
||||||
|
QString haha = "";
|
||||||
|
menu->addAction("Delete " + cutNameList[i] + " ["+ colorCycle[cutIDList[i]%colorCycle.count()].second+"]");
|
||||||
|
}
|
||||||
|
|
||||||
|
QAction *selectedAction = menu->exec(event->globalPosition().toPoint());
|
||||||
|
|
||||||
|
if( selectedAction == a1 ){
|
||||||
|
xAxis->setRangeLower(xMin);
|
||||||
|
xAxis->setRangeUpper(xMax);
|
||||||
|
yAxis->setRangeLower(yMin);
|
||||||
|
yAxis->setRangeUpper(yMax);
|
||||||
|
replot();
|
||||||
|
usingMenu = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( selectedAction == a2 ) {
|
||||||
|
Clear();
|
||||||
|
usingMenu = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( selectedAction == a3 ){
|
||||||
|
for( int i = 0; i < 3; i ++ ){
|
||||||
|
for( int j = 0; j < 3; j ++ ){
|
||||||
|
box[i][j]->setVisible( !box[i][j]->visible());
|
||||||
|
txt[i][j]->setVisible( !txt[i][j]->visible());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
replot();
|
||||||
|
usingMenu = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( selectedAction == a4){
|
||||||
|
rightMouseClickRebin();
|
||||||
|
usingMenu = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( selectedAction == a5 ){
|
||||||
|
tempCut.clear();
|
||||||
|
tempCutID ++;
|
||||||
|
isDrawCut= true;
|
||||||
|
usingMenu = false;
|
||||||
|
numCut ++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( selectedAction && numCut > 0 && selectedAction->text().contains("Delete ") ){
|
||||||
|
|
||||||
|
QString haha = selectedAction->text();
|
||||||
|
int index1 = haha.indexOf("-");
|
||||||
|
int index2 = haha.indexOf("[");
|
||||||
|
int cutID = haha.mid(index1+1, index2-index1-1).remove(' ').toInt();
|
||||||
|
|
||||||
|
removeItem(cutTextIDList[cutID]);
|
||||||
|
removePlottable(plottableIDList[cutID]);
|
||||||
|
replot();
|
||||||
|
|
||||||
|
numCut --;
|
||||||
|
cutList[cutID].clear();
|
||||||
|
cutIDList[cutID] = -1;
|
||||||
|
cutTextIDList[cutID] = -1;
|
||||||
|
plottableIDList[cutID] = -1;
|
||||||
|
cutNameList[cutID] = "";
|
||||||
|
cutEntryList[cutID] = -1;
|
||||||
|
|
||||||
|
for( int i = cutID + 1; i < cutTextIDList.count() ; i++){
|
||||||
|
cutTextIDList[i] --;
|
||||||
|
plottableIDList[i] --;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( numCut == 0 ){
|
||||||
|
tempCutID = -1;
|
||||||
|
lastPlottableID = -1;
|
||||||
|
cutList.clear();
|
||||||
|
cutIDList.clear();
|
||||||
|
cutTextIDList.clear();
|
||||||
|
plottableIDList.clear();
|
||||||
|
cutNameList.clear();
|
||||||
|
cutEntryList.clear();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( selectedAction && numCut > 0 && selectedAction->text().contains("Clear all Cuts") ){
|
||||||
|
ClearAllCuts();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( selectedAction && numCut > 0 && selectedAction->text().contains("Add/Edit names to Cuts") ){
|
||||||
|
|
||||||
|
QDialog dialog(this);
|
||||||
|
dialog.setWindowTitle("Add/Edit name of cuts ");
|
||||||
|
|
||||||
|
QFormLayout layout(&dialog);
|
||||||
|
|
||||||
|
for(int i = 0; i < cutTextIDList.count(); i++){
|
||||||
|
if( cutTextIDList[i] < 0 ) continue;
|
||||||
|
QLineEdit * le = new QLineEdit(&dialog);
|
||||||
|
layout.addRow(colorCycle[i%colorCycle.count()].second, le);
|
||||||
|
le->setText( cutNameList[i] );
|
||||||
|
connect(le, &QLineEdit::textChanged, this, [=](){
|
||||||
|
le->setStyleSheet("color : blue;");
|
||||||
|
});
|
||||||
|
connect(le, &QLineEdit::returnPressed, this, [=](){
|
||||||
|
le->setStyleSheet("");
|
||||||
|
cutNameList[i] = le->text();
|
||||||
|
((QCPItemText *) this->item(cutTextIDList[i]))->setText(le->text());
|
||||||
|
replot();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
dialog.exec();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Histogram2D::rightMouseClickRebin(){
|
||||||
|
QDialog dialog(this);
|
||||||
|
dialog.setWindowTitle("Rebin histogram");
|
||||||
|
|
||||||
|
QFormLayout layout(&dialog);
|
||||||
|
|
||||||
|
QLabel * info = new QLabel(&dialog);
|
||||||
|
info->setStyleSheet("color:red;");
|
||||||
|
info->setText("This will also clear histogram!!");
|
||||||
|
layout.addRow(info);
|
||||||
|
|
||||||
|
QStringList nameListX = {"Num. x-Bin", "x-Min", "x-Max"};
|
||||||
|
QLineEdit* lineEditX[3];
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
lineEditX[i] = new QLineEdit(&dialog);
|
||||||
|
layout.addRow(nameListX[i] + " : ", lineEditX[i]);
|
||||||
|
}
|
||||||
|
lineEditX[0]->setText(QString::number(xBin));
|
||||||
|
lineEditX[1]->setText(QString::number(xMin));
|
||||||
|
lineEditX[2]->setText(QString::number(xMax));
|
||||||
|
|
||||||
|
QStringList nameListY = {"Num. y-Bin", "y-Min", "y-Max"};
|
||||||
|
QLineEdit* lineEditY[3];
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
lineEditY[i] = new QLineEdit(&dialog);
|
||||||
|
layout.addRow(nameListY[i] + " : ", lineEditY[i]);
|
||||||
|
}
|
||||||
|
lineEditY[0]->setText(QString::number(yBin));
|
||||||
|
lineEditY[1]->setText(QString::number(yMin));
|
||||||
|
lineEditY[2]->setText(QString::number(yMax));
|
||||||
|
|
||||||
|
QLabel * msg = new QLabel(&dialog);
|
||||||
|
msg->setStyleSheet("color:red;");
|
||||||
|
layout.addRow(msg);
|
||||||
|
|
||||||
|
QDialogButtonBox buttonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, &dialog);
|
||||||
|
layout.addRow(&buttonBox);
|
||||||
|
|
||||||
|
double number[3][2];
|
||||||
|
|
||||||
|
QObject::connect(&buttonBox, &QDialogButtonBox::accepted, [&]() {
|
||||||
|
int OKcount = 0;
|
||||||
|
bool conversionOk = true;
|
||||||
|
for( int i = 0; i < 3; i++ ){
|
||||||
|
number[i][0] = lineEditX[i]->text().toDouble(&conversionOk);
|
||||||
|
if( conversionOk ){
|
||||||
|
OKcount++;
|
||||||
|
}else{
|
||||||
|
msg->setText(nameListX[i] + " is invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( int i = 0; i < 3; i++ ){
|
||||||
|
number[i][1] = lineEditY[i]->text().toDouble(&conversionOk);
|
||||||
|
if( conversionOk ){
|
||||||
|
OKcount++;
|
||||||
|
}else{
|
||||||
|
msg->setText(nameListY[i] + " is invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( OKcount == 6 ) {
|
||||||
|
if( number[0][0] <= 0 ) {
|
||||||
|
msg->setText( nameListX[0] + " is zero or negative" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( number[0][0] <= 0 ) {
|
||||||
|
msg->setText( nameListX[0] + " is zero or negative" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( number[2][0] > number[1][0] && number[2][1] > number[1][1] ) {
|
||||||
|
dialog.accept();
|
||||||
|
}else{
|
||||||
|
if( number[2][0] > number[1][0] ){
|
||||||
|
msg->setText(nameListX[2] + " is smaller than " + nameListX[1]);
|
||||||
|
}
|
||||||
|
if( number[2][1] > number[1][1] ){
|
||||||
|
msg->setText(nameListY[2] + " is smaller than " + nameListY[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
QObject::connect(&buttonBox, &QDialogButtonBox::rejected, [&]() { dialog.reject();});
|
||||||
|
|
||||||
|
if( dialog.exec() == QDialog::Accepted ){
|
||||||
|
isBusy = true;
|
||||||
|
Rebin((int)number[0][0], number[1][0], number[2][0], (int)number[0][1], number[1][1], number[2][1]);
|
||||||
|
rescaleAxes();
|
||||||
|
UpdatePlot();
|
||||||
|
isBusy = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -92,6 +92,7 @@ void MultiBuilder::ClearEvents(){
|
||||||
|
|
||||||
nExhaushedCh = 0;
|
nExhaushedCh = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiBuilder::PrintStat(){
|
void MultiBuilder::PrintStat(){
|
||||||
|
@ -292,7 +293,7 @@ void MultiBuilder::BuildEvents(bool isFinal, bool skipTrace, bool verbose){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiBuilder::BuildEventsBackWard(bool verbose){
|
void MultiBuilder::BuildEventsBackWard(int maxNumEvent, bool verbose){
|
||||||
|
|
||||||
//skip trace, and only build for 100 events max
|
//skip trace, and only build for 100 events max
|
||||||
|
|
||||||
|
@ -375,7 +376,7 @@ void MultiBuilder::BuildEventsBackWard(bool verbose){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}while(nExhaushedCh < nData * MaxNChannels && eventBuilt < 100);
|
}while(nExhaushedCh < nData * MaxNChannels && eventBuilt <= maxNumEvent);
|
||||||
|
|
||||||
// // remember the end of DataIndex, prevent over build
|
// // remember the end of DataIndex, prevent over build
|
||||||
// for( int k = 0; k < nData; k++){
|
// for( int k = 0; k < nData; k++){
|
||||||
|
|
|
@ -32,10 +32,13 @@ public:
|
||||||
fineTime = 0;
|
fineTime = 0;
|
||||||
trace.clear();
|
trace.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Print(){
|
||||||
|
printf("(%2d, %2d)[%3d] %6d %10llu, %5ld\n", bd, ch, sn, energy, timestamp, trace.size());
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MultiBuilder {
|
class MultiBuilder {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -56,7 +59,7 @@ public:
|
||||||
std::vector<int> GetDigiIDList() const {return idList;}
|
std::vector<int> GetDigiIDList() const {return idList;}
|
||||||
|
|
||||||
void BuildEvents(bool isFinal = false, bool skipTrace = false, bool verbose = false);
|
void BuildEvents(bool isFinal = false, bool skipTrace = false, bool verbose = false);
|
||||||
void BuildEventsBackWard(bool verbose = false); // always skip trace, for faster online building
|
void BuildEventsBackWard(int maxNumEvent = 100, bool verbose = false); // always skip trace, for faster online building
|
||||||
|
|
||||||
void ClearEvents();
|
void ClearEvents();
|
||||||
void PrintStat();
|
void PrintStat();
|
||||||
|
|
|
@ -63,7 +63,7 @@ class Reg{
|
||||||
RW GetType() const {return type;}
|
RW GetType() const {return type;}
|
||||||
bool IsCoupled() const {return group;}
|
bool IsCoupled() const {return group;}
|
||||||
unsigned int GetMaxBit() const {return maxBit;}
|
unsigned int GetMaxBit() const {return maxBit;}
|
||||||
int GetPartialStep() const {return partialStep;} /// step = partialStep * ch2ns, -1 : step = 1
|
int GetPartialStep() const {return partialStep;} /// step = partialStep * tick2ns, -1 : step = 1
|
||||||
void Print() const ;
|
void Print() const ;
|
||||||
|
|
||||||
std::vector<std::pair<std::string, unsigned int>> GetComboList() const {return comboList;}
|
std::vector<std::pair<std::string, unsigned int>> GetComboList() const {return comboList;}
|
||||||
|
|
36
Scope.cpp
36
Scope.cpp
|
@ -101,12 +101,12 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh
|
||||||
ID = 0;
|
ID = 0;
|
||||||
cbScopeDigi->setCurrentIndex(0);
|
cbScopeDigi->setCurrentIndex(0);
|
||||||
for( int i = 0; i < digi[0]->GetNChannels(); i++) cbScopeCh->addItem("Ch-" + QString::number(i));
|
for( int i = 0; i < digi[0]->GetNChannels(); i++) cbScopeCh->addItem("Ch-" + QString::number(i));
|
||||||
ch2ns = digi[ID]->GetCh2ns();
|
tick2ns = digi[ID]->GetTick2ns();
|
||||||
|
|
||||||
connect(cbScopeDigi, &RComboBox::currentIndexChanged, this, [=](int index){
|
connect(cbScopeDigi, &RComboBox::currentIndexChanged, this, [=](int index){
|
||||||
if( !enableSignalSlot ) return;
|
if( !enableSignalSlot ) return;
|
||||||
ID = index;
|
ID = index;
|
||||||
ch2ns = digi[ID]->GetCh2ns();
|
tick2ns = digi[ID]->GetTick2ns();
|
||||||
//---setup cbScopeCh
|
//---setup cbScopeCh
|
||||||
cbScopeCh->clear();
|
cbScopeCh->clear();
|
||||||
for( int i = 0; i < digi[ID]->GetNChannels(); i++) cbScopeCh->addItem("Ch-" + QString::number(i));
|
for( int i = 0; i < digi[ID]->GetNChannels(); i++) cbScopeCh->addItem("Ch-" + QString::number(i));
|
||||||
|
@ -310,7 +310,7 @@ void Scope::UpdateScope(){
|
||||||
|
|
||||||
if( digi[ID]->GetChannelOnOff(ch) == false) return;
|
if( digi[ID]->GetChannelOnOff(ch) == false) return;
|
||||||
|
|
||||||
int ch2ns = digi[ID]->GetCh2ns();
|
int tick2ns = digi[ID]->GetTick2ns();
|
||||||
int factor = digi[ID]->IsDualTrace_PHA() ? 2 : 1;
|
int factor = digi[ID]->IsDualTrace_PHA() ? 2 : 1;
|
||||||
|
|
||||||
digiMTX[ID].lock();
|
digiMTX[ID].lock();
|
||||||
|
@ -329,19 +329,19 @@ void Scope::UpdateScope(){
|
||||||
QVector<QPointF> points[4];
|
QVector<QPointF> points[4];
|
||||||
if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) {
|
if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) {
|
||||||
for( int i = 0; i < (int) (data->Waveform1[ch][index]).size() ; i++ ) {
|
for( int i = 0; i < (int) (data->Waveform1[ch][index]).size() ; i++ ) {
|
||||||
points[0].append(QPointF(ch2ns * i * factor, (data->Waveform1[ch][index])[i]));
|
points[0].append(QPointF(tick2ns * i * factor, (data->Waveform1[ch][index])[i]));
|
||||||
if( i < (int) data->Waveform2[ch][index].size() ) points[1].append(QPointF(ch2ns * i * factor, (data->Waveform2[ch][index])[i]));
|
if( i < (int) data->Waveform2[ch][index].size() ) points[1].append(QPointF(tick2ns * i * factor, (data->Waveform2[ch][index])[i]));
|
||||||
if( i < (int) data->DigiWaveform1[ch][index].size() ) points[2].append(QPointF(ch2ns * i * factor, (data->DigiWaveform1[ch][index])[i] * 1000));
|
if( i < (int) data->DigiWaveform1[ch][index].size() ) points[2].append(QPointF(tick2ns * i * factor, (data->DigiWaveform1[ch][index])[i] * 1000));
|
||||||
if( i < (int) data->DigiWaveform2[ch][index].size() ) points[3].append(QPointF(ch2ns * i * factor, (data->DigiWaveform2[ch][index])[i] * 1000 + 500));
|
if( i < (int) data->DigiWaveform2[ch][index].size() ) points[3].append(QPointF(tick2ns * i * factor, (data->DigiWaveform2[ch][index])[i] * 1000 + 500));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) {
|
if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) {
|
||||||
for( int i = 0; i < (int) (data->DigiWaveform1[ch][index]).size() ; i++ ) {
|
for( int i = 0; i < (int) (data->DigiWaveform1[ch][index]).size() ; i++ ) {
|
||||||
points[0].append(QPointF(ch2ns * i * factor, (data->Waveform1[ch][index])[i]));
|
points[0].append(QPointF(tick2ns * i * factor, (data->Waveform1[ch][index])[i]));
|
||||||
if( i < (int) data->Waveform2[ch][index].size() ) points[1].append(QPointF(ch2ns * i * factor, (data->Waveform2[ch][index])[i]));
|
if( i < (int) data->Waveform2[ch][index].size() ) points[1].append(QPointF(tick2ns * i * factor, (data->Waveform2[ch][index])[i]));
|
||||||
if( i < (int) data->DigiWaveform1[ch][index].size() ) points[2].append(QPointF(ch2ns * i, (data->DigiWaveform1[ch][index])[i] * 1000));
|
if( i < (int) data->DigiWaveform1[ch][index].size() ) points[2].append(QPointF(tick2ns * i, (data->DigiWaveform1[ch][index])[i] * 1000));
|
||||||
if( i < (int) data->DigiWaveform2[ch][index].size() ) points[3].append(QPointF(ch2ns * i, (data->DigiWaveform2[ch][index])[i] * 1000 + 500));
|
if( i < (int) data->DigiWaveform2[ch][index].size() ) points[3].append(QPointF(tick2ns * i, (data->DigiWaveform2[ch][index])[i] * 1000 + 500));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dataTrace[0]->replace(points[0]);
|
dataTrace[0]->replace(points[0]);
|
||||||
|
@ -351,7 +351,7 @@ void Scope::UpdateScope(){
|
||||||
}
|
}
|
||||||
digiMTX[ID].unlock();
|
digiMTX[ID].unlock();
|
||||||
|
|
||||||
plot->axes(Qt::Horizontal).first()->setRange(0, ch2ns * traceLength * factor);
|
plot->axes(Qt::Horizontal).first()->setRange(0, tick2ns * traceLength * factor);
|
||||||
|
|
||||||
emit UpdateScaler();
|
emit UpdateScaler();
|
||||||
|
|
||||||
|
@ -412,8 +412,8 @@ void Scope::SetUpSpinBox(RSpinBox * &sb, QString str, int row, int col, const Re
|
||||||
sb = new RSpinBox(settingGroup);
|
sb = new RSpinBox(settingGroup);
|
||||||
if( para.GetPartialStep() != 0 ){
|
if( para.GetPartialStep() != 0 ){
|
||||||
sb->setMinimum(0);
|
sb->setMinimum(0);
|
||||||
sb->setMaximum(para.GetMaxBit() * para.GetPartialStep() * ch2ns);
|
sb->setMaximum(para.GetMaxBit() * para.GetPartialStep() * tick2ns);
|
||||||
if( para.GetPartialStep() > 0 ) sb->setSingleStep(para.GetPartialStep() * ch2ns);
|
if( para.GetPartialStep() > 0 ) sb->setSingleStep(para.GetPartialStep() * tick2ns);
|
||||||
if( para.GetPartialStep() == -1 ) sb->setSingleStep(1);
|
if( para.GetPartialStep() == -1 ) sb->setSingleStep(1);
|
||||||
}
|
}
|
||||||
settingLayout->addWidget(sb, row, col + 1);
|
settingLayout->addWidget(sb, row, col + 1);
|
||||||
|
@ -438,7 +438,7 @@ void Scope::SetUpSpinBox(RSpinBox * &sb, QString str, int row, int col, const Re
|
||||||
msg = QString::fromStdString(para.GetName()) + "|DIG:"+ QString::number(digi[ID]->GetSerialNumber()) + ",CH:" + (ch == -1 ? "All" : QString::number(ch));
|
msg = QString::fromStdString(para.GetName()) + "|DIG:"+ QString::number(digi[ID]->GetSerialNumber()) + ",CH:" + (ch == -1 ? "All" : QString::number(ch));
|
||||||
msg += " = " + QString::number(sb->value());
|
msg += " = " + QString::number(sb->value());
|
||||||
|
|
||||||
uint32_t value = sb->value() / ch2ns / abs(para.GetPartialStep());
|
uint32_t value = sb->value() / tick2ns / abs(para.GetPartialStep());
|
||||||
|
|
||||||
if( para == DPP::RecordLength_G){
|
if( para == DPP::RecordLength_G){
|
||||||
int factor = digi[ID]->IsDualTrace_PHA() ? 2 : 1;
|
int factor = digi[ID]->IsDualTrace_PHA() ? 2 : 1;
|
||||||
|
@ -694,7 +694,7 @@ void Scope::UpdateSpinBox(RSpinBox * &sb, const Reg para){
|
||||||
enableSignalSlot = false;
|
enableSignalSlot = false;
|
||||||
unsigned int haha = digi[ID]->GetSettingFromMemory(para, ch);
|
unsigned int haha = digi[ID]->GetSettingFromMemory(para, ch);
|
||||||
|
|
||||||
if( para.GetPartialStep() > 0 ) sb->setValue(haha * para.GetPartialStep() * ch2ns);
|
if( para.GetPartialStep() > 0 ) sb->setValue(haha * para.GetPartialStep() * tick2ns);
|
||||||
if( para.GetPartialStep() == -1 ) sb->setValue(haha);
|
if( para.GetPartialStep() == -1 ) sb->setValue(haha);
|
||||||
//enableSignalSlot = true;
|
//enableSignalSlot = true;
|
||||||
}
|
}
|
||||||
|
@ -708,11 +708,11 @@ void Scope::UpdatePanelFromMomeory(){
|
||||||
int ch = cbScopeCh->currentIndex();
|
int ch = cbScopeCh->currentIndex();
|
||||||
|
|
||||||
unsigned int haha = digi[ID]->GetSettingFromMemory(DPP::RecordLength_G, ch);
|
unsigned int haha = digi[ID]->GetSettingFromMemory(DPP::RecordLength_G, ch);
|
||||||
sbReordLength->setValue(haha * DPP::RecordLength_G.GetPartialStep() * ch2ns);
|
sbReordLength->setValue(haha * DPP::RecordLength_G.GetPartialStep() * tick2ns);
|
||||||
|
|
||||||
// if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ){
|
// if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ){
|
||||||
// int factor = digi[ID]->IsDualTrace() ? 2 : 1; // if dual trace,
|
// int factor = digi[ID]->IsDualTrace() ? 2 : 1; // if dual trace,
|
||||||
// sbReordLength->setValue(haha * DPP::RecordLength_G.GetPartialStep() * ch2ns / factor);
|
// sbReordLength->setValue(haha * DPP::RecordLength_G.GetPartialStep() * tick2ns / factor);
|
||||||
// }else{
|
// }else{
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
2
Scope.h
2
Scope.h
|
@ -71,7 +71,7 @@ private:
|
||||||
Digitizer ** digi;
|
Digitizer ** digi;
|
||||||
unsigned short nDigi;
|
unsigned short nDigi;
|
||||||
unsigned short ID; // the id of digi, index of cbScopeDigi
|
unsigned short ID; // the id of digi, index of cbScopeDigi
|
||||||
int ch2ns;
|
int tick2ns;
|
||||||
bool traceOn[MaxNDigitizer];
|
bool traceOn[MaxNDigitizer];
|
||||||
|
|
||||||
ReadDataThread ** readDataThread;
|
ReadDataThread ** readDataThread;
|
||||||
|
|
|
@ -26,9 +26,15 @@ public:
|
||||||
|
|
||||||
SetUpdateTimeInSec(1.0);
|
SetUpdateTimeInSec(1.0);
|
||||||
|
|
||||||
RedefineEventBuilder({0}); // only build for the 0-th digitizer;
|
RedefineEventBuilder({0}); // only build for the 0-th digitizer, otherwise, it will build event accross all digitizers
|
||||||
|
tick2ns = digi[0]->GetTick2ns();
|
||||||
|
SetBackwardBuild(false, 500); // using normal building (acceding in time) or backward building, int the case of backward building, default events to be build is 100.
|
||||||
evtbder = GetEventBuilder();
|
evtbder = GetEventBuilder();
|
||||||
|
|
||||||
|
//========== use the influx from the Analyzer
|
||||||
|
influx = new InfluxDB("https://fsunuc.physics.fsu.edu/influx/");
|
||||||
|
dataBaseName = "testing";
|
||||||
|
|
||||||
SetUpCanvas();
|
SetUpCanvas();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +53,8 @@ private:
|
||||||
Histogram2D * h2;
|
Histogram2D * h2;
|
||||||
Histogram1D * h1;
|
Histogram1D * h1;
|
||||||
|
|
||||||
|
int tick2ns;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -55,12 +63,13 @@ inline void SplitPole::SetUpCanvas(){
|
||||||
setGeometry(0, 0, 1600, 800);
|
setGeometry(0, 0, 1600, 800);
|
||||||
|
|
||||||
// the "this" make the histogram a child of the SplitPole class. When SplitPole destory, all childs destory as well.
|
// the "this" make the histogram a child of the SplitPole class. When SplitPole destory, all childs destory as well.
|
||||||
h2 = new Histogram2D("Split Pole PID", "x", "y", 400, 0, 10000, 400, 0, 10000, this);
|
h2 = new Histogram2D("Split Pole PID", "x", "y", 100, 0, 10000, 100, 0, 10000, this);
|
||||||
//layout is inheriatge from Analyzer
|
//layout is inheriatge from Analyzer
|
||||||
layout->addWidget(h2, 0, 0);
|
layout->addWidget(h2, 0, 0);
|
||||||
|
|
||||||
h1 = new Histogram1D("Spectrum", "x", 400, 0, 10000, this);
|
h1 = new Histogram1D("Spectrum", "x", 400, 0, 10000, this);
|
||||||
layout->addWidget(h1, 0, 1);
|
layout->addWidget(h1, 0, 1);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,29 +81,61 @@ inline void SplitPole::UpdateHistograms(){
|
||||||
long eventBuilt = evtbder->eventBuilt;
|
long eventBuilt = evtbder->eventBuilt;
|
||||||
if( eventBuilt == 0 ) return;
|
if( eventBuilt == 0 ) return;
|
||||||
|
|
||||||
|
//============ Get the cut list, if any
|
||||||
|
QList<QPolygonF> cutList = h2->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 eventIndex = evtbder->eventIndex;
|
||||||
long eventStart = eventIndex - eventBuilt + 1;
|
long eventStart = eventIndex - eventBuilt + 1;
|
||||||
if(eventStart < 0 ) eventStart += MaxNEvent;
|
if(eventStart < 0 ) eventStart += MaxNEvent;
|
||||||
|
|
||||||
//============ Processing data and fill histograms
|
|
||||||
unsigned short e1 = 0, e2 = 0;
|
|
||||||
|
|
||||||
for( long i = eventStart ; i <= eventIndex; i ++ ){
|
for( long i = eventStart ; i <= eventIndex; i ++ ){
|
||||||
|
unsigned short e1 = 0, e2 = 0;
|
||||||
|
unsigned long long t1 = 0, t2 = 0;
|
||||||
std::vector<EventMember> event = evtbder->events[i];
|
std::vector<EventMember> event = evtbder->events[i];
|
||||||
|
//printf("-------------- %ld\n", i);
|
||||||
for( int k = 0; k < (int) event.size(); k++ ){
|
for( int k = 0; k < (int) event.size(); k++ ){
|
||||||
if( event[k].ch == 9 ) e1 = event[k].energy;
|
//event[k].Print();
|
||||||
if( event[k].ch == 10 ) e2 = event[k].energy;
|
if( event[k].ch == 9 ) {e1 = event[k].energy; t1 = event[k].timestamp;}
|
||||||
|
if( event[k].ch == 10 ) {e2 = event[k].energy; t2 = event[k].timestamp;}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( e1 == 0 ) continue;
|
||||||
|
if( e2 == 0 ) continue;
|
||||||
|
|
||||||
h2->Fill(e1, e2);
|
h2->Fill(e1, e2);
|
||||||
h1->Fill(e1);
|
h1->Fill(e1);
|
||||||
|
|
||||||
|
//check events inside any Graphical cut and extract the rate, using t1 only
|
||||||
|
for(int p = 0; p < cutList.count(); p++ ){
|
||||||
|
if( cutList[p].isEmpty() ) continue;
|
||||||
|
if( cutList[p].containsPoint(QPointF(e1, e2), Qt::OddEvenFill) ){
|
||||||
|
if( t1 < tMin[p] ) tMin[p] = t1;
|
||||||
|
if( t1 > tMax[p] ) tMax[p] = t1;
|
||||||
|
count[p] ++;
|
||||||
|
//printf(".... %d \n", count[p]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
h2->UpdatePlot();
|
h2->UpdatePlot();
|
||||||
h1->UpdatePlot();
|
h1->UpdatePlot();
|
||||||
|
|
||||||
h2->PrintCutEntry();
|
QList<QString> cutNameList = h2->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();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
test.cpp
4
test.cpp
|
@ -41,7 +41,7 @@ int main(int argc, char* argv[]){
|
||||||
// dig[0]->ProgramBoard();
|
// dig[0]->ProgramBoard();
|
||||||
// dig[0]->ProgramPSDBoard();
|
// dig[0]->ProgramPSDBoard();
|
||||||
|
|
||||||
// const float ch2ns = dig[0]->GetCh2ns();
|
// const float tick2ns = dig[0]->GetTick2ns();
|
||||||
|
|
||||||
Data * data = dig[0]->GetData();
|
Data * data = dig[0]->GetData();
|
||||||
data->ClearData();
|
data->ClearData();
|
||||||
|
@ -117,7 +117,7 @@ int main(int argc, char* argv[]){
|
||||||
|
|
||||||
unsigned short nData = data->DataIndex[0]; //channel-0
|
unsigned short nData = data->DataIndex[0]; //channel-0
|
||||||
haha = data->Waveform1[0][nData-1];
|
haha = data->Waveform1[0][nData-1];
|
||||||
for( int i = 0; i < waveFormLength; i++) g1->SetPoint(i, i*ch2ns, haha[i]);
|
for( int i = 0; i < waveFormLength; i++) g1->SetPoint(i, i*tick2ns, haha[i]);
|
||||||
|
|
||||||
canvas->cd(3); g1->Draw("AP");
|
canvas->cd(3); g1->Draw("AP");
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
void PrintChannelSettingFromDigitizer(int handle, int ch, float ch2ns){
|
void PrintChannelSettingFromDigitizer(int handle, int ch, float tick2ns){
|
||||||
|
|
||||||
printf("\e[33m================================================\n");
|
printf("\e[33m================================================\n");
|
||||||
printf("================ Setting for channel %d \n", ch);
|
printf("================ Setting for channel %d \n", ch);
|
||||||
|
@ -48,11 +48,11 @@ void PrintChannelSettingFromDigitizer(int handle, int ch, float ch2ns){
|
||||||
default: extra2WordOptStr = "Reserved"; break;
|
default: extra2WordOptStr = "Reserved"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(" ch2ns : %.0f ns\n", ch2ns);
|
printf(" tick2ns : %.0f ns\n", tick2ns);
|
||||||
|
|
||||||
printf("==========----- input \n");
|
printf("==========----- input \n");
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::RecordLength_G + (ch << 8), value); printf("%24s %5d samples = %5.0f ns \n", "Record Length", ((value[0] * 8) & MaxRecordLength), ((value[0] * 8) & MaxRecordLength) * ch2ns); ///Record length
|
CAEN_DGTZ_ReadRegister(handle, DPP::RecordLength_G + (ch << 8), value); printf("%24s %5d samples = %5.0f ns \n", "Record Length", ((value[0] * 8) & MaxRecordLength), ((value[0] * 8) & MaxRecordLength) * tick2ns); ///Record length
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PreTrigger + (ch << 8), value); printf("%24s %5d samples = %5.0f ns \n", "Pre-tigger", value[0] * 4, value[0] * 4 * ch2ns); ///Pre-trigger
|
CAEN_DGTZ_ReadRegister(handle, DPP::PreTrigger + (ch << 8), value); printf("%24s %5d samples = %5.0f ns \n", "Pre-tigger", value[0] * 4, value[0] * 4 * tick2ns); ///Pre-trigger
|
||||||
printf("%24s %5.0f samples, DPP-[20:22]\n", "baseline mean", pow(4, 1 + baseline)); ///Ns baseline
|
printf("%24s %5.0f samples, DPP-[20:22]\n", "baseline mean", pow(4, 1 + baseline)); ///Ns baseline
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::ChannelDCOffset + (ch << 8), value); printf("%24s %.2f %% \n", "DC offset", 100.0 - value[0] * 100./ 0xFFFF); ///DC offset
|
CAEN_DGTZ_ReadRegister(handle, DPP::ChannelDCOffset + (ch << 8), value); printf("%24s %.2f %% \n", "DC offset", 100.0 - value[0] * 100./ 0xFFFF); ///DC offset
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::InputDynamicRange + (ch << 8), value); printf("%24s %.1f Vpp \n", "input Dynamic", value[0] == 0 ? 2 : 0.5); ///InputDynamic
|
CAEN_DGTZ_ReadRegister(handle, DPP::InputDynamicRange + (ch << 8), value); printf("%24s %.1f Vpp \n", "input Dynamic", value[0] == 0 ? 2 : 0.5); ///InputDynamic
|
||||||
|
@ -60,27 +60,27 @@ void PrintChannelSettingFromDigitizer(int handle, int ch, float ch2ns){
|
||||||
|
|
||||||
printf("==========----- discriminator \n");
|
printf("==========----- discriminator \n");
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::TriggerThreshold + (ch << 8), value); printf("%24s %4d LSB\n", "Threshold", value[0]); ///Threshold
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::TriggerThreshold + (ch << 8), value); printf("%24s %4d LSB\n", "Threshold", value[0]); ///Threshold
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::TriggerHoldOffWidth + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "trigger hold off", value[0], value[0] * 4 * ch2ns); ///Trigger Hold off
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::TriggerHoldOffWidth + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "trigger hold off", value[0], value[0] * 4 * tick2ns); ///Trigger Hold off
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::RCCR2SmoothingFactor + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Fast Dis. smoothing", (value[0] & 0x1f) * 2, (value[0] & 0x1f) * 2 * ch2ns ); ///Fast Discriminator smoothing
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::RCCR2SmoothingFactor + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Fast Dis. smoothing", (value[0] & 0x1f) * 2, (value[0] & 0x1f) * 2 * tick2ns ); ///Fast Discriminator smoothing
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::ShapedTriggerWidth + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Fast Dis. output width", value[0], value[0] * 4 * ch2ns); ///Fast Dis. output width
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::ShapedTriggerWidth + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Fast Dis. output width", value[0], value[0] * 4 * tick2ns); ///Fast Dis. output width
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::InputRiseTime + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Input rise time ", value[0], value[0] * 4 * ch2ns); ///Input rise time
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::InputRiseTime + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Input rise time ", value[0], value[0] * 4 * tick2ns); ///Input rise time
|
||||||
|
|
||||||
printf("==========----- Trapezoid \n");
|
printf("==========----- Trapezoid \n");
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::TrapezoidRiseTime + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Trap. rise time", value[0], value[0] * 4 * ch2ns); ///Trap. rise time, 2 for 1 ch to 2ns
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::TrapezoidRiseTime + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Trap. rise time", value[0], value[0] * 4 * tick2ns); ///Trap. rise time, 2 for 1 ch to 2ns
|
||||||
int riseTime = value[0] * 4 * ch2ns;
|
int riseTime = value[0] * 4 * tick2ns;
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::TrapezoidFlatTop + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Trap. flat time", value[0], value[0] * 4 * ch2ns); ///Trap. flat time
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::TrapezoidFlatTop + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Trap. flat time", value[0], value[0] * 4 * tick2ns); ///Trap. flat time
|
||||||
int flatTopTime = value[0] * 4 * ch2ns;
|
int flatTopTime = value[0] * 4 * tick2ns;
|
||||||
double shift = log(riseTime * flatTopTime ) / log(2) - 2;
|
double shift = log(riseTime * flatTopTime ) / log(2) - 2;
|
||||||
printf("%24s %4d bit =? %.1f = Ceil( Log(rise [ns] x decay [ns])/Log(2) ), DPP-[0:5]\n", "Trap. Rescaling", trapRescaling, shift ); ///Trap. Rescaling Factor
|
printf("%24s %4d bit =? %.1f = Ceil( Log(rise [ns] x decay [ns])/Log(2) ), DPP-[0:5]\n", "Trap. Rescaling", trapRescaling, shift ); ///Trap. Rescaling Factor
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::DecayTime + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Decay time", value[0], value[0] * 4 * ch2ns); ///Trap. pole zero
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::DecayTime + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Decay time", value[0], value[0] * 4 * tick2ns); ///Trap. pole zero
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::PeakingTime + (ch << 8), value); printf("%24s %4d samples, %5.0f ns = %.2f %% of FlatTop\n", "Peaking time", value[0], value[0] * 4 * ch2ns, value[0] * 400. * ch2ns / flatTopTime ); ///Peaking time
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::PeakingTime + (ch << 8), value); printf("%24s %4d samples, %5.0f ns = %.2f %% of FlatTop\n", "Peaking time", value[0], value[0] * 4 * tick2ns, value[0] * 400. * tick2ns / flatTopTime ); ///Peaking time
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::PeakHoldOff + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Peak hole off", value[0], value[0] * 4 *ch2ns ); ///Peak hold off
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::PeakHoldOff + (ch << 8), value); printf("%24s %4d samples, %5.0f ns \n", "Peak hole off", value[0], value[0] * 4 *tick2ns ); ///Peak hold off
|
||||||
printf("%24s %4.0f samples, DPP-[12:13]\n", "Peak mean", pow(4, NsPeak)); ///Ns peak
|
printf("%24s %4.0f samples, DPP-[12:13]\n", "Peak mean", pow(4, NsPeak)); ///Ns peak
|
||||||
|
|
||||||
printf("==========----- Other \n");
|
printf("==========----- Other \n");
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::FineGain + (ch << 8), value); printf("%24s %d = 0x%x\n", "Energy fine gain", value[0], value[0]); ///Energy fine gain
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::FineGain + (ch << 8), value); printf("%24s %d = 0x%x\n", "Energy fine gain", value[0], value[0]); ///Energy fine gain
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::ChannelADCTemperature_R + (ch << 8), value); printf("%24s %d C\n", "Temperature", value[0]); ///Temperature
|
CAEN_DGTZ_ReadRegister(handle, DPP::ChannelADCTemperature_R + (ch << 8), value); printf("%24s %d C\n", "Temperature", value[0]); ///Temperature
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::RiseTimeValidationWindow + (ch << 8), value); printf("%24s %.0f ns \n", "RiseTime Vaild Win.", value[0] * ch2ns);
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::RiseTimeValidationWindow + (ch << 8), value); printf("%24s %.0f ns \n", "RiseTime Vaild Win.", value[0] * tick2ns);
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::ChannelStopAcquisition + (ch << 8), value); printf("%24s %d = %s \n", "Stop Acq bit", value[0] & 1 , (value[0] & 1 ) == 0 ? "Run" : "Stop");
|
CAEN_DGTZ_ReadRegister(handle, DPP::PHA::ChannelStopAcquisition + (ch << 8), value); printf("%24s %d = %s \n", "Stop Acq bit", value[0] & 1 , (value[0] & 1 ) == 0 ? "Run" : "Stop");
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::ChannelStatus_R + (ch << 8), value); printf("%24s 0x%x \n", "Status bit", (value[0] & 0xff) );
|
CAEN_DGTZ_ReadRegister(handle, DPP::ChannelStatus_R + (ch << 8), value); printf("%24s 0x%x \n", "Status bit", (value[0] & 0xff) );
|
||||||
CAEN_DGTZ_ReadRegister(handle, DPP::AMCFirmwareRevision_R + (ch << 8), value); printf("%24s 0x%x \n", "AMC firmware rev.", value[0] );
|
CAEN_DGTZ_ReadRegister(handle, DPP::AMCFirmwareRevision_R + (ch << 8), value); printf("%24s 0x%x \n", "AMC firmware rev.", value[0] );
|
||||||
|
@ -181,10 +181,10 @@ int main(int argc, char* argv[]){
|
||||||
ret = (int) CAEN_DGTZ_GetInfo(handle, &BoardInfo);
|
ret = (int) CAEN_DGTZ_GetInfo(handle, &BoardInfo);
|
||||||
int NChannel = BoardInfo.Channels;
|
int NChannel = BoardInfo.Channels;
|
||||||
uint32_t channelMask = 0xFFFF;
|
uint32_t channelMask = 0xFFFF;
|
||||||
float ch2ns = 4.0;
|
float tick2ns = 4.0;
|
||||||
switch(BoardInfo.Model){
|
switch(BoardInfo.Model){
|
||||||
case CAEN_DGTZ_V1730: ch2ns = 2.0; break; ///ns -> 500 MSamples/s
|
case CAEN_DGTZ_V1730: tick2ns = 2.0; break; ///ns -> 500 MSamples/s
|
||||||
case CAEN_DGTZ_V1725: ch2ns = 4.0; break; ///ns -> 250 MSamples/s
|
case CAEN_DGTZ_V1725: tick2ns = 4.0; break; ///ns -> 250 MSamples/s
|
||||||
}
|
}
|
||||||
unsigned int ADCbits = BoardInfo.ADC_NBits;
|
unsigned int ADCbits = BoardInfo.ADC_NBits;
|
||||||
|
|
||||||
|
@ -309,7 +309,7 @@ int main(int argc, char* argv[]){
|
||||||
if( ret != 0 ) { printf("==== memory allocation error.\n"); return 0;}
|
if( ret != 0 ) { printf("==== memory allocation error.\n"); return 0;}
|
||||||
|
|
||||||
PrintBoardConfiguration(handle);
|
PrintBoardConfiguration(handle);
|
||||||
PrintChannelSettingFromDigitizer(handle, 4, ch2ns);
|
PrintChannelSettingFromDigitizer(handle, 4, tick2ns);
|
||||||
|
|
||||||
printf("============ Start ACQ \n");
|
printf("============ Start ACQ \n");
|
||||||
CAEN_DGTZ_SWStartAcquisition(handle);
|
CAEN_DGTZ_SWStartAcquisition(handle);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user