polished QDC related things
This commit is contained in:
parent
674f3bdd77
commit
34feff751a
|
@ -77,7 +77,7 @@ class Data{
|
||||||
void DecodeBuffer(bool fastDecode, int verbose = 0); /// fastDecode will not save waveform
|
void DecodeBuffer(bool fastDecode, int verbose = 0); /// fastDecode will not save waveform
|
||||||
void DecodeBuffer(char * &buffer, unsigned int size, bool fastDecode, int verbose = 0); // for outside data
|
void DecodeBuffer(char * &buffer, unsigned int size, bool fastDecode, int verbose = 0); // for outside data
|
||||||
|
|
||||||
void PrintStat() const;
|
void PrintStat(bool skipEmpty = true) const;
|
||||||
|
|
||||||
void PrintAllData(bool tableMode = true, unsigned int maxRowDisplay = 0) const;
|
void PrintAllData(bool tableMode = true, unsigned int maxRowDisplay = 0) const;
|
||||||
|
|
||||||
|
@ -288,7 +288,7 @@ inline void Data::CloseSaveFile(){
|
||||||
|
|
||||||
//^#######################################################
|
//^#######################################################
|
||||||
//^####################################################### Print
|
//^####################################################### Print
|
||||||
inline void Data::PrintStat() const{
|
inline void Data::PrintStat(bool skipEmpty) const{
|
||||||
|
|
||||||
printf("============================= Print Stat. Digi-%d\n", boardSN);
|
printf("============================= Print Stat. Digi-%d\n", boardSN);
|
||||||
if( !IsNotRollOverFakeAgg ) {
|
if( !IsNotRollOverFakeAgg ) {
|
||||||
|
@ -298,6 +298,7 @@ inline void Data::PrintStat() const{
|
||||||
printf("%2s | %6s | %9s | %9s | %6s | %6s(%4s)\n", "ch", "# Evt.", "Rate [Hz]", "Accept", "Tot. Evt.", "index", "loop");
|
printf("%2s | %6s | %9s | %9s | %6s | %6s(%4s)\n", "ch", "# Evt.", "Rate [Hz]", "Accept", "Tot. Evt.", "index", "loop");
|
||||||
printf("---+--------+-----------+-----------+----------\n");
|
printf("---+--------+-----------+-----------+----------\n");
|
||||||
for(int ch = 0; ch < numInputCh; ch++){
|
for(int ch = 0; ch < numInputCh; ch++){
|
||||||
|
if( skipEmpty && TriggerRate[ch] == 0 ) continue;
|
||||||
printf("%2d | %6d | %9.2f | %9.2f | %6lu | %6d(%2d)\n", ch, NumEventsDecoded[ch], TriggerRate[ch], NonPileUpRate[ch], TotNumNonPileUpEvents[ch], DataIndex[ch], LoopIndex[ch]);
|
printf("%2d | %6d | %9.2f | %9.2f | %6lu | %6d(%2d)\n", ch, NumEventsDecoded[ch], TriggerRate[ch], NonPileUpRate[ch], TotNumNonPileUpEvents[ch], DataIndex[ch], LoopIndex[ch]);
|
||||||
}
|
}
|
||||||
printf("---+--------+-----------+-----------+----------\n");
|
printf("---+--------+-----------+-----------+----------\n");
|
||||||
|
@ -1017,6 +1018,7 @@ inline int Data::DecodeQDCGroupedChannelBlock(unsigned int ChannelMask, bool fas
|
||||||
|
|
||||||
if( verbose >= 3 ){
|
if( verbose >= 3 ){
|
||||||
printf("%4d| %5d, %d, %d, %d, %d \n", 2*wi, (word & 0xFFF) , (( word >> 12 ) & 0x1 ), (( word >> 13 ) & 0x1 ), (( word >> 14 ) & 0x1 ), (( word >> 15 ) & 0x1 ));
|
printf("%4d| %5d, %d, %d, %d, %d \n", 2*wi, (word & 0xFFF) , (( word >> 12 ) & 0x1 ), (( word >> 13 ) & 0x1 ), (( word >> 14 ) & 0x1 ), (( word >> 15 ) & 0x1 ));
|
||||||
|
printf("%-22s", "");
|
||||||
printf("%4d| %5d, %d, %d, %d, %d \n", 2*wi+1, (( word >> 16) & 0xFFF), (( word >> 28 ) & 0x1 ), (( word >> 29 ) & 0x1 ), (( word >> 30 ) & 0x1 ), (( word >> 31 ) & 0x1 ));
|
printf("%4d| %5d, %d, %d, %d, %d \n", 2*wi+1, (( word >> 16) & 0xFFF), (( word >> 28 ) & 0x1 ), (( word >> 29 ) & 0x1 ), (( word >> 30 ) & 0x1 ), (( word >> 31 ) & 0x1 ));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,6 +148,7 @@ int Digitizer::OpenDigitizer(int boardID, int portID, bool program, bool verbose
|
||||||
}
|
}
|
||||||
/// change address 0xEF08 (5 bits), this will reflected in the 2nd word of the Board Agg. header.
|
/// change address 0xEF08 (5 bits), this will reflected in the 2nd word of the Board Agg. header.
|
||||||
ret = CAEN_DGTZ_WriteRegister(handle, DPP::BoardID, (DPPType & 0xF));
|
ret = CAEN_DGTZ_WriteRegister(handle, DPP::BoardID, (DPPType & 0xF));
|
||||||
|
|
||||||
if ( verbose ){
|
if ( verbose ){
|
||||||
PrintBoard();
|
PrintBoard();
|
||||||
if (DPPType < 0x80 ) {
|
if (DPPType < 0x80 ) {
|
||||||
|
@ -316,13 +317,17 @@ int Digitizer::ProgramBoard_PHA(){
|
||||||
ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t)(DPP::PreTrigger) + 0x7000 , 32 );
|
ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t)(DPP::PreTrigger) + 0x7000 , 32 );
|
||||||
ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t)(DPP::InputDynamicRange) + 0x7000 , 0x0 );
|
ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t)(DPP::InputDynamicRange) + 0x7000 , 0x0 );
|
||||||
|
|
||||||
ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(DPP::NumberEventsPerAggregate_G) + 0x7000, 511);
|
ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(DPP::NumberEventsPerAggregate_G) + 0x7000, 10);
|
||||||
ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(DPP::AggregateOrganization), 2);
|
ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(DPP::AggregateOrganization), 2);
|
||||||
ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(DPP::MaxAggregatePerBlockTransfer), 4);
|
ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(DPP::MaxAggregatePerBlockTransfer), 100);
|
||||||
ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(DPP::DPPAlgorithmControl) + 0x7000, 0xC30200f);
|
ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(DPP::DPPAlgorithmControl) + 0x7000, 0xC30200f);
|
||||||
|
|
||||||
if( ret != 0 ) { printf("!!!!!!!! set channels error.\n");}
|
if( ret != 0 ) { printf("!!!!!!!! set channels error.\n");}
|
||||||
|
|
||||||
|
/// change address 0xEF08 (5 bits), this will reflected in the 2nd word of the Board Agg. header.
|
||||||
|
ret = CAEN_DGTZ_WriteRegister(handle, DPP::BoardID, (DPPType & 0xF));
|
||||||
|
//WriteRegister(DPP::BoardID, (DPPType & 0xF));
|
||||||
|
|
||||||
isSettingFilledinMemeory = false; /// unlock the ReadAllSettingsFromBoard();
|
isSettingFilledinMemeory = false; /// unlock the ReadAllSettingsFromBoard();
|
||||||
|
|
||||||
usleep(1000*300);
|
usleep(1000*300);
|
||||||
|
@ -373,6 +378,10 @@ int Digitizer::ProgramBoard_PSD(){
|
||||||
|
|
||||||
if( ret != 0 ) { printf("!!!!!!!! set channels error.\n");}
|
if( ret != 0 ) { printf("!!!!!!!! set channels error.\n");}
|
||||||
|
|
||||||
|
/// change address 0xEF08 (5 bits), this will reflected in the 2nd word of the Board Agg. header.
|
||||||
|
ret = CAEN_DGTZ_WriteRegister(handle, DPP::BoardID, (DPPType & 0xF));
|
||||||
|
//WriteRegister(DPP::BoardID, (DPPType & 0xF));
|
||||||
|
|
||||||
isSettingFilledinMemeory = false; /// unlock the ReadAllSettingsFromBoard();
|
isSettingFilledinMemeory = false; /// unlock the ReadAllSettingsFromBoard();
|
||||||
|
|
||||||
usleep(1000*300);
|
usleep(1000*300);
|
||||||
|
@ -388,9 +397,9 @@ int Digitizer::ProgramBoard_QDC(){
|
||||||
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
WriteRegister(DPP::QDC::NumberEventsPerAggregate, 0x100, -1);
|
WriteRegister(DPP::QDC::NumberEventsPerAggregate, 0x10, -1);
|
||||||
WriteRegister(DPP::QDC::RecordLength, 4000/16, -1);
|
WriteRegister(DPP::QDC::RecordLength, 31, -1); // 248 sample = 3968 ns
|
||||||
WriteRegister(DPP::QDC::PreTrigger, 1000/16, -1);
|
WriteRegister(DPP::QDC::PreTrigger, 60, -1); // at 60 sample = 960 ns
|
||||||
|
|
||||||
WriteRegister(DPP::QDC::GateWidth, 100/16, -1);
|
WriteRegister(DPP::QDC::GateWidth, 100/16, -1);
|
||||||
WriteRegister(DPP::QDC::GateOffset, 0, -1);
|
WriteRegister(DPP::QDC::GateOffset, 0, -1);
|
||||||
|
@ -417,12 +426,16 @@ int Digitizer::ProgramBoard_QDC(){
|
||||||
|
|
||||||
WriteRegister(DPP::BoardConfiguration, 0xC0110);
|
WriteRegister(DPP::BoardConfiguration, 0xC0110);
|
||||||
WriteRegister(DPP::AggregateOrganization, 0x0);
|
WriteRegister(DPP::AggregateOrganization, 0x0);
|
||||||
|
WriteRegister(DPP::MaxAggregatePerBlockTransfer, 100);
|
||||||
WriteRegister(DPP::AcquisitionControl, 0x0);
|
WriteRegister(DPP::AcquisitionControl, 0x0);
|
||||||
WriteRegister(DPP::GlobalTriggerMask, 0x0);
|
WriteRegister(DPP::GlobalTriggerMask, 0x0);
|
||||||
WriteRegister(DPP::FrontPanelTRGOUTEnableMask, 0x0);
|
WriteRegister(DPP::FrontPanelTRGOUTEnableMask, 0x0);
|
||||||
WriteRegister(DPP::FrontPanelIOControl, 0x0);
|
WriteRegister(DPP::FrontPanelIOControl, 0x0);
|
||||||
WriteRegister(DPP::QDC::GroupEnableMask, 0xFF);
|
WriteRegister(DPP::QDC::GroupEnableMask, 0xFF);
|
||||||
WriteRegister(DPP::MaxAggregatePerBlockTransfer, 0x4);
|
|
||||||
|
/// change address 0xEF08 (5 bits), this will reflected in the 2nd word of the Board Agg. header.
|
||||||
|
ret = CAEN_DGTZ_WriteRegister(handle, DPP::BoardID, (DPPType & 0xF));
|
||||||
|
//WriteRegister(DPP::BoardID, (DPPType & 0xF));
|
||||||
|
|
||||||
isSettingFilledinMemeory = false; /// unlock the ReadAllSettingsFromBoard();
|
isSettingFilledinMemeory = false; /// unlock the ReadAllSettingsFromBoard();
|
||||||
|
|
||||||
|
@ -758,6 +771,9 @@ void Digitizer::ReadAllSettingsFromBoard(bool force){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
printf("BoardID : 0x%X = DataFormat \n", GetSettingFromMemory(DPP::BoardID));
|
||||||
|
|
||||||
isSettingFilledinMemeory = true;
|
isSettingFilledinMemeory = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,6 +95,7 @@ int main(int argc, char **argv){
|
||||||
printf("%s [inFile] [DPPType] \n", argv[0]);
|
printf("%s [inFile] [DPPType] \n", argv[0]);
|
||||||
printf(" +-- PHA = %d\n", DPPType::DPP_PHA_CODE);
|
printf(" +-- PHA = %d\n", DPPType::DPP_PHA_CODE);
|
||||||
printf(" +-- PSD = %d\n", DPPType::DPP_PSD_CODE);
|
printf(" +-- PSD = %d\n", DPPType::DPP_PSD_CODE);
|
||||||
|
printf(" +-- QDC = %d\n", DPPType::DPP_QDC_CODE);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -960,6 +960,7 @@ void DigiSettingsPanel::SetUpInquiryCopyTab(){
|
||||||
|
|
||||||
if( digi[index]->GetDPPType() == V1730_DPP_PHA_CODE ) chRegList = RegisterChannelList_PHA;
|
if( digi[index]->GetDPPType() == V1730_DPP_PHA_CODE ) chRegList = RegisterChannelList_PHA;
|
||||||
if( digi[index]->GetDPPType() == V1730_DPP_PSD_CODE ) chRegList = RegisterChannelList_PSD;
|
if( digi[index]->GetDPPType() == V1730_DPP_PSD_CODE ) chRegList = RegisterChannelList_PSD;
|
||||||
|
if( digi[index]->GetDPPType() == V1740_DPP_QDC_CODE ) chRegList = RegisterChannelList_QDC;
|
||||||
|
|
||||||
cbChReg->clear();
|
cbChReg->clear();
|
||||||
for( int i = 0; i < (int) chRegList.size(); i++ ){
|
for( int i = 0; i < (int) chRegList.size(); i++ ){
|
||||||
|
@ -973,6 +974,33 @@ void DigiSettingsPanel::SetUpInquiryCopyTab(){
|
||||||
connect(cbBdReg, &RComboBox::currentIndexChanged, this, [=](int index){
|
connect(cbBdReg, &RComboBox::currentIndexChanged, this, [=](int index){
|
||||||
if( !enableSignalSlot ) return;
|
if( !enableSignalSlot ) return;
|
||||||
|
|
||||||
|
int digiID = cbDigi->currentIndex();
|
||||||
|
|
||||||
|
if( digi[digiID]->GetDPPType() == V1740_DPP_QDC_CODE ){
|
||||||
|
|
||||||
|
if( RegisterBoardList_QDC[index].GetRWType() == RW::WriteONLY ) {
|
||||||
|
leBdRegRW->setText("Write ONLY" );
|
||||||
|
leBdRegValue->setText("");
|
||||||
|
leBdRegSet->setEnabled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t value = digi[ digiID ] ->ReadRegister(RegisterBoardList_QDC[index]);
|
||||||
|
leBdRegValue->setText( "0x" + QString::number(value, 16).toUpper());
|
||||||
|
|
||||||
|
if( RegisterBoardList_QDC[index].GetRWType() == RW::ReadONLY ) {
|
||||||
|
leBdRegRW->setText("Read ONLY" );
|
||||||
|
leBdRegSet->setEnabled(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( RegisterBoardList_QDC[index].GetRWType() == RW::ReadWrite ) {
|
||||||
|
leBdRegRW->setText("Read/Write" );
|
||||||
|
leBdRegSet->setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
|
||||||
if( RegisterBoardList_PHAPSD[index].GetRWType() == RW::WriteONLY ) {
|
if( RegisterBoardList_PHAPSD[index].GetRWType() == RW::WriteONLY ) {
|
||||||
leBdRegRW->setText("Write ONLY" );
|
leBdRegRW->setText("Write ONLY" );
|
||||||
leBdRegValue->setText("");
|
leBdRegValue->setText("");
|
||||||
|
@ -980,7 +1008,7 @@ void DigiSettingsPanel::SetUpInquiryCopyTab(){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t value = digi[ cbDigi->currentIndex() ] ->ReadRegister(RegisterBoardList_PHAPSD[index]);
|
uint32_t value = digi[ digiID ] ->ReadRegister(RegisterBoardList_PHAPSD[index]);
|
||||||
leBdRegValue->setText( "0x" + QString::number(value, 16).toUpper());
|
leBdRegValue->setText( "0x" + QString::number(value, 16).toUpper());
|
||||||
|
|
||||||
if( RegisterBoardList_PHAPSD[index].GetRWType() == RW::ReadONLY ) {
|
if( RegisterBoardList_PHAPSD[index].GetRWType() == RW::ReadONLY ) {
|
||||||
|
@ -993,6 +1021,7 @@ void DigiSettingsPanel::SetUpInquiryCopyTab(){
|
||||||
leBdRegRW->setText("Read/Write" );
|
leBdRegRW->setText("Read/Write" );
|
||||||
leBdRegSet->setEnabled(true);
|
leBdRegSet->setEnabled(true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
cbBdReg->currentIndexChanged(0);
|
cbBdReg->currentIndexChanged(0);
|
||||||
|
@ -1043,7 +1072,12 @@ void DigiSettingsPanel::SetUpInquiryCopyTab(){
|
||||||
uint32_t value = std::stoul(text.toStdString(), nullptr, 16);
|
uint32_t value = std::stoul(text.toStdString(), nullptr, 16);
|
||||||
int index = cbDigi->currentIndex();
|
int index = cbDigi->currentIndex();
|
||||||
int regID = cbBdReg->currentIndex();
|
int regID = cbBdReg->currentIndex();
|
||||||
|
|
||||||
|
if( digi[index]->GetDPPType() == V1740_DPP_QDC_CODE ){
|
||||||
|
digi[index]->WriteRegister(RegisterBoardList_QDC[regID], value);
|
||||||
|
}else{
|
||||||
digi[index]->WriteRegister(RegisterBoardList_PHAPSD[regID], value);
|
digi[index]->WriteRegister(RegisterBoardList_PHAPSD[regID], value);
|
||||||
|
}
|
||||||
leBdRegSet->setStyleSheet("");
|
leBdRegSet->setStyleSheet("");
|
||||||
|
|
||||||
cbBdReg->currentIndexChanged(regID);
|
cbBdReg->currentIndexChanged(regID);
|
||||||
|
@ -1281,7 +1315,7 @@ void DigiSettingsPanel::SetUpChannelMask(unsigned int digiID){
|
||||||
}
|
}
|
||||||
|
|
||||||
void DigiSettingsPanel::SetUpACQReadOutTab(){
|
void DigiSettingsPanel::SetUpACQReadOutTab(){
|
||||||
SetUpSpinBox(sbAggNum[ID], "Agg. Num. / read ", bdACQLayout[ID], 0, 0, DPP::MaxAggregatePerBlockTransfer, -1, true);
|
SetUpSpinBox(sbAggNum[ID], "Max Agg. Num. / read ", bdACQLayout[ID], 0, 0, DPP::MaxAggregatePerBlockTransfer, -1, true);
|
||||||
SetUpComboBox(cbAggOrg[ID], "Aggregate Organization ", bdACQLayout[ID], 1, 0, DPP::AggregateOrganization, 0);
|
SetUpComboBox(cbAggOrg[ID], "Aggregate Organization ", bdACQLayout[ID], 1, 0, DPP::AggregateOrganization, 0);
|
||||||
|
|
||||||
SetUpComboBoxBit(cbStartStopMode[ID], "Start/Stop Mode ", bdACQLayout[ID], 2, 0, DPP::Bit_AcquistionControl::ListStartStopMode,
|
SetUpComboBoxBit(cbStartStopMode[ID], "Start/Stop Mode ", bdACQLayout[ID], 2, 0, DPP::Bit_AcquistionControl::ListStartStopMode,
|
||||||
|
@ -3002,9 +3036,13 @@ void DigiSettingsPanel::SetUpChannel_QDC(){
|
||||||
if( i == 0 ){
|
if( i == 0 ){
|
||||||
if( ch == 0 ){
|
if( ch == 0 ){
|
||||||
QLabel * lb3 = new QLabel("Test Pulse Rate", this); lb3->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb3, 0, 3);
|
QLabel * lb3 = new QLabel("Test Pulse Rate", this); lb3->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb3, 0, 3);
|
||||||
|
QLabel * lb4 = new QLabel("Event pre Agg.", this); lb4->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb4, 0, 5);
|
||||||
}
|
}
|
||||||
SetUpCheckBox(chkTestPule[ID][ch], "Int. Test Pulse", tabLayout, ch + 1, 1, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::InternalTestPulse, ch);
|
SetUpCheckBox(chkTestPule[ID][ch], "Int. Test Pulse", tabLayout, ch + 1, 1, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::InternalTestPulse, ch);
|
||||||
SetUpComboBoxBit(cbTestPulseRate[ID][ch], "", tabLayout, ch + 1, 2, DPP::QDC::Bit_DPPAlgorithmControl::ListTestPulseRate, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::TestPulseRate, 1, ch);
|
SetUpComboBoxBit(cbTestPulseRate[ID][ch], "", tabLayout, ch + 1, 2, DPP::QDC::Bit_DPPAlgorithmControl::ListTestPulseRate, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::TestPulseRate, 1, ch);
|
||||||
|
|
||||||
|
SetUpSpinBox(sbNumEventAgg[ID][ch], "", tabLayout, ch + 1, 4, DPP::QDC::NumberEventsPerAggregate, ch);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -326,7 +326,7 @@ MainWindow::~MainWindow(){
|
||||||
scalarThread->quit();
|
scalarThread->quit();
|
||||||
scalarThread->exit();
|
scalarThread->exit();
|
||||||
CleanUpScalar();
|
CleanUpScalar();
|
||||||
delete scalar;
|
//don't need to delete scalar, it is managed by this
|
||||||
}
|
}
|
||||||
|
|
||||||
if( digi ) CloseDigitizers();
|
if( digi ) CloseDigitizers();
|
||||||
|
|
|
@ -8,11 +8,12 @@ INCLUDEPATH += .
|
||||||
|
|
||||||
QT += core widgets charts printsupport
|
QT += core widgets charts printsupport
|
||||||
|
|
||||||
QMAKE_CXXFLAGS += -g
|
|
||||||
LIBS += -lCAENDigitizer -lcurl
|
LIBS += -lCAENDigitizer -lcurl
|
||||||
|
|
||||||
QMAKE_CXXFLAGS_RELEASE = -O0
|
#==== for enable GDB debug
|
||||||
QMAKE_CFLAGS_RELEASE = -O0
|
#QMAKE_CXXFLAGS += -g
|
||||||
|
#QMAKE_CXXFLAGS_RELEASE = -O0
|
||||||
|
#QMAKE_CFLAGS_RELEASE = -O0
|
||||||
|
|
||||||
# You can make your code fail to compile if you use deprecated APIs.
|
# You can make your code fail to compile if you use deprecated APIs.
|
||||||
# In order to do so, uncomment the following line.
|
# In order to do so, uncomment the following line.
|
||||||
|
|
|
@ -787,7 +787,7 @@ namespace DPP {
|
||||||
|
|
||||||
namespace QDC { // Register already grouped in channel. and there no control for indiviual channel except the Fine DC offset and threshold, so it is like no group
|
namespace QDC { // Register already grouped in channel. and there no control for indiviual channel except the Fine DC offset and threshold, so it is like no group
|
||||||
const Reg NumberEventsPerAggregate ("Number of Events per Aggregate", 0x1020, RW::ReadWrite, false, 0x3FF, -1); /// R/W
|
const Reg NumberEventsPerAggregate ("Number of Events per Aggregate", 0x1020, RW::ReadWrite, false, 0x3FF, -1); /// R/W
|
||||||
const Reg RecordLength ("Record Length" , 0x1024, RW::ReadWrite, false, 0x1FFF, 1); /// R/W
|
const Reg RecordLength ("Record Length" , 0x1024, RW::ReadWrite, false, 0x1FFF, 8); /// R/W
|
||||||
const Reg GateWidth ("GateWidth" , 0x1030, RW::ReadWrite, false, 0xFFF, 1); /// R/W
|
const Reg GateWidth ("GateWidth" , 0x1030, RW::ReadWrite, false, 0xFFF, 1); /// R/W
|
||||||
const Reg GateOffset ("GateOfset" , 0x1034, RW::ReadWrite, false, 0xFF, 1); /// R/W
|
const Reg GateOffset ("GateOfset" , 0x1034, RW::ReadWrite, false, 0xFF, 1); /// R/W
|
||||||
const Reg FixedBaseline ("FixedBaseline" , 0x1038, RW::ReadWrite, false, 0xFFF, -1); /// R/W
|
const Reg FixedBaseline ("FixedBaseline" , 0x1038, RW::ReadWrite, false, 0xFFF, -1); /// R/W
|
||||||
|
|
14
Scope.cpp
14
Scope.cpp
|
@ -1103,10 +1103,22 @@ void Scope::UpdatePanel_QDC(){
|
||||||
UpdateSpinBox(sbReordLength, DPP::QDC::RecordLength);
|
UpdateSpinBox(sbReordLength, DPP::QDC::RecordLength);
|
||||||
UpdateSpinBox(sbPreTrigger, DPP::QDC::PreTrigger);
|
UpdateSpinBox(sbPreTrigger, DPP::QDC::PreTrigger);
|
||||||
|
|
||||||
|
|
||||||
UpdateSpinBox(sbShortGate, DPP::QDC::GateWidth);
|
UpdateSpinBox(sbShortGate, DPP::QDC::GateWidth);
|
||||||
UpdateSpinBox(sbGateOffset, DPP::QDC::GateOffset);
|
UpdateSpinBox(sbGateOffset, DPP::QDC::GateOffset);
|
||||||
|
|
||||||
|
int subCh = ch%8;
|
||||||
|
uint32_t threshold = 0 ;
|
||||||
|
switch( subCh ){
|
||||||
|
case 0 : threshold = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub0, grp); break;
|
||||||
|
case 1 : threshold = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub1, grp); break;
|
||||||
|
case 2 : threshold = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub2, grp); break;
|
||||||
|
case 3 : threshold = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub3, grp); break;
|
||||||
|
case 4 : threshold = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub4, grp); break;
|
||||||
|
case 5 : threshold = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub5, grp); break;
|
||||||
|
case 6 : threshold = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub6, grp); break;
|
||||||
|
case 7 : threshold = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub7, grp); break;
|
||||||
|
}
|
||||||
|
sbThreshold->setValue(threshold);
|
||||||
|
|
||||||
|
|
||||||
uint32_t BdCfg = digi[ID]->GetSettingFromMemory(DPP::BoardConfiguration, 0);
|
uint32_t BdCfg = digi[ID]->GetSettingFromMemory(DPP::BoardConfiguration, 0);
|
||||||
|
|
135
fsuReader.h
Normal file
135
fsuReader.h
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
#include "ClassData.h"
|
||||||
|
|
||||||
|
class FSUReader{
|
||||||
|
|
||||||
|
public:
|
||||||
|
FSUReader(std::string fileName, unsigned short numCh);
|
||||||
|
~FSUReader();
|
||||||
|
|
||||||
|
void ScanNumBlock();
|
||||||
|
int ReadNextBlock(bool fast = false, int verbose = 0);
|
||||||
|
int ReadBlock(unsigned int ID, int verbose = 0);
|
||||||
|
|
||||||
|
unsigned long GetTotNumBlock() const{ return totNumBlock;}
|
||||||
|
|
||||||
|
Data * GetData() const{return data;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
FILE * inFile;
|
||||||
|
Data * data;
|
||||||
|
|
||||||
|
unsigned long inFileSize;
|
||||||
|
unsigned int filePos;
|
||||||
|
unsigned long totNumBlock;
|
||||||
|
unsigned int blockID;
|
||||||
|
|
||||||
|
std::vector<unsigned int> blockPos;
|
||||||
|
|
||||||
|
unsigned int word[1]; /// 4 byte
|
||||||
|
size_t dummy;
|
||||||
|
char * buffer;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
inline FSUReader::FSUReader(std::string fileName, unsigned short numCh){
|
||||||
|
|
||||||
|
inFile = fopen(fileName.c_str(), "r");
|
||||||
|
|
||||||
|
if( inFile == NULL ){
|
||||||
|
printf("Cannot open file : %s \n", fileName.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(inFile, 0L, SEEK_END);
|
||||||
|
inFileSize = ftell(inFile);
|
||||||
|
printf("%s | file size : %ld Byte = %.2f MB\n", fileName.c_str() , inFileSize, inFileSize/1024./1024.);
|
||||||
|
fseek(inFile, 0L, SEEK_SET);
|
||||||
|
filePos = 0;
|
||||||
|
|
||||||
|
data = new Data(numCh);
|
||||||
|
|
||||||
|
totNumBlock = 0;
|
||||||
|
blockID = 0;
|
||||||
|
blockPos.clear();
|
||||||
|
|
||||||
|
//ScanNumBlock();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline FSUReader::~FSUReader(){
|
||||||
|
delete data;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int FSUReader::ReadNextBlock(bool fast, int verbose){
|
||||||
|
if( inFile == NULL ) return -1;
|
||||||
|
if( feof(inFile) ) return -1;
|
||||||
|
if( filePos >= inFileSize) return -1;
|
||||||
|
|
||||||
|
dummy = fread(word, 4, 1, inFile);
|
||||||
|
if( dummy != 1) {
|
||||||
|
printf("fread error, should read 4 bytes, but read %ld x 4 byte, file pos: %ld byte\n", dummy, ftell(inFile));
|
||||||
|
return -10;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(inFile, -4, SEEK_CUR);
|
||||||
|
short header = ((word[0] >> 28 ) & 0xF);
|
||||||
|
if( header != 0xA ) {
|
||||||
|
printf("incorrect header.\n trminate.");
|
||||||
|
return -20;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int aggSize = (word[0] & 0x0FFFFFFF) * 4; ///byte
|
||||||
|
buffer = new char[aggSize];
|
||||||
|
dummy = fread(buffer, aggSize, 1, inFile);
|
||||||
|
filePos = ftell(inFile);
|
||||||
|
if( dummy != 1) {
|
||||||
|
printf("fread error, should read %d bytes, but read %ld x %d byte, file pos: %ld byte \n", aggSize, dummy, aggSize, ftell(inFile));
|
||||||
|
return -30;
|
||||||
|
}
|
||||||
|
|
||||||
|
data->DecodeBuffer(buffer, aggSize, fast, verbose); // data will own the buffer
|
||||||
|
data->ClearBuffer(); // this will clear the buffer.
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int FSUReader::ReadBlock(unsigned int ID, int verbose){
|
||||||
|
if( totNumBlock == 0 )return -1;
|
||||||
|
if( ID >= totNumBlock )return -1;
|
||||||
|
|
||||||
|
data->ClearData();
|
||||||
|
|
||||||
|
fseek( inFile, 0L, SEEK_SET);
|
||||||
|
|
||||||
|
if( verbose ) printf("Block index: %u, File Pos: %u byte\n", ID, blockPos[ID]);
|
||||||
|
|
||||||
|
fseek(inFile, blockPos[ID], SEEK_CUR);
|
||||||
|
filePos = blockPos[ID];
|
||||||
|
blockID = ID;
|
||||||
|
return ReadNextBlock(verbose);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void FSUReader::ScanNumBlock(){
|
||||||
|
if( feof(inFile) ) return;
|
||||||
|
|
||||||
|
blockID = 0;
|
||||||
|
blockPos.push_back(0);
|
||||||
|
|
||||||
|
while( ReadNextBlock(true) == 0 ){
|
||||||
|
blockPos.push_back(filePos);
|
||||||
|
blockID ++;
|
||||||
|
printf("%u, %.2f%% %u/%lu\n\033[A\r", blockID, filePos*100./inFileSize, filePos, inFileSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
totNumBlock = blockID;
|
||||||
|
printf("\nScan complete: number of data Block : %lu\n", totNumBlock);
|
||||||
|
|
||||||
|
rewind(inFile);
|
||||||
|
blockID = 0;
|
||||||
|
filePos = 0;
|
||||||
|
|
||||||
|
}
|
117
test.cpp
117
test.cpp
|
@ -26,127 +26,62 @@ int getch(void);
|
||||||
//^======================================
|
//^======================================
|
||||||
int main(int argc, char* argv[]){
|
int main(int argc, char* argv[]){
|
||||||
|
|
||||||
Digitizer * digi = new Digitizer(0, 2, false, true);
|
/********************** DPP-QDC */
|
||||||
|
|
||||||
Reg reg("test", 0x1020, RW::ReadWrite, false, 0xFFF, -1);
|
|
||||||
|
|
||||||
digi->WriteRegister(reg, 0x13, -1);
|
|
||||||
|
|
||||||
digi->ReadAllSettingsFromBoard();
|
|
||||||
|
|
||||||
digi->GetSettingFromMemory(DPP::QDC::NumberEventsPerAggregate);
|
|
||||||
|
|
||||||
|
|
||||||
// digi->Reset();
|
|
||||||
// digi->ProgramBoard_PHA();
|
|
||||||
|
|
||||||
|
|
||||||
for( int ch = 0; ch < 16; ch++){
|
|
||||||
printf("%2d | 0x%X \n", ch, digi->GetSettingFromMemory(reg, ch));
|
|
||||||
}
|
|
||||||
|
|
||||||
//digi->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, 1, -1);
|
|
||||||
|
|
||||||
// Data * data = digi->GetData();
|
|
||||||
|
|
||||||
//digi->StartACQ();
|
|
||||||
|
|
||||||
// for( int i = 0; i < 4; i ++ ){
|
|
||||||
// usleep(1000*1000);
|
|
||||||
// digi->ReadData();
|
|
||||||
// data->DecodeBuffer(false, 100);
|
|
||||||
// data->PrintStat();
|
|
||||||
|
|
||||||
// //data->SaveData();
|
|
||||||
|
|
||||||
// // int index = data->NumEventsDecoded[0];
|
|
||||||
// // printf("-------------- %ld \n", data->Waveform1[0][index].size());
|
|
||||||
|
|
||||||
// //data->PrintAllData();
|
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
// digi->StopACQ();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
digi->CloseDigitizer();
|
|
||||||
delete digi;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************** DPP-PHA
|
|
||||||
Digitizer * digi = new Digitizer(0, 2, false, true);
|
Digitizer * digi = new Digitizer(0, 2, false, true);
|
||||||
digi->Reset();
|
digi->Reset();
|
||||||
|
|
||||||
|
digi->ProgramBoard_QDC();
|
||||||
|
|
||||||
digi->WriteRegister(DPP::SoftwareClear_W, 1);
|
digi->WriteRegister(DPP::SoftwareClear_W, 1);
|
||||||
|
|
||||||
digi->WriteRegister(DPP::QDC::RecordLength, 6000/16, -1);
|
digi->WriteRegister(DPP::QDC::RecordLength, 31, -1); // T = N * 8 * 16
|
||||||
digi->WriteRegister(DPP::QDC::PreTrigger, 1000/16, -1);
|
digi->WriteRegister(DPP::QDC::PreTrigger, 60, -1);
|
||||||
digi->WriteRegister(DPP::QDC::GateWidth, 200/16, -1);
|
|
||||||
digi->WriteRegister(DPP::QDC::GateOffset, 0, -1);
|
|
||||||
digi->WriteRegister(DPP::QDC::FixedBaseline, 0, -1);
|
|
||||||
//digi->WriteRegister(DPP::QDC::DPPAlgorithmControl, 0x300112); // with test pulse
|
|
||||||
digi->WriteRegister(DPP::QDC::DPPAlgorithmControl, 0x300102); // No test pulse
|
|
||||||
digi->WriteRegister(DPP::QDC::TriggerHoldOffWidth, 100/16, -1);
|
|
||||||
digi->WriteRegister(DPP::QDC::TRGOUTWidth, 100/16, -1);
|
|
||||||
//digi->WriteRegister(DPP::QDC::OverThresholdWidth, 100/16, -1);
|
|
||||||
//digi->WriteRegister(DPP::QDC::DCOffset, 100/16, -1);
|
|
||||||
digi->WriteRegister(DPP::QDC::SubChannelMask, 0xFF, -1);
|
|
||||||
|
|
||||||
digi->WriteRegister(DPP::QDC::TriggerThreshold_sub0, 10, -1);
|
digi->WriteRegister(DPP::QDC::TriggerThreshold_sub2, 17, -1);
|
||||||
digi->WriteRegister(DPP::QDC::TriggerThreshold_sub1, 10, -1);
|
digi->SetBits(DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::ChargeSensitivity, 0, -1);
|
||||||
digi->WriteRegister(DPP::QDC::TriggerThreshold_sub2, 10, -1);
|
digi->SetBits(DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::InputSmoothingFactor, 4, -1);
|
||||||
digi->WriteRegister(DPP::QDC::TriggerThreshold_sub3, 10, -1);
|
digi->SetBits(DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::BaselineAvg, 2, -1);
|
||||||
digi->WriteRegister(DPP::QDC::TriggerThreshold_sub4, 10, -1);
|
|
||||||
digi->WriteRegister(DPP::QDC::TriggerThreshold_sub5, 10, -1);
|
|
||||||
digi->WriteRegister(DPP::QDC::TriggerThreshold_sub6, 10, -1);
|
|
||||||
digi->WriteRegister(DPP::QDC::TriggerThreshold_sub7, 10, -1);
|
|
||||||
|
|
||||||
|
digi->WriteRegister(DPP::QDC::GateWidth, 608/16, -1);
|
||||||
|
|
||||||
digi->WriteRegister(DPP::BoardConfiguration, 0xC0110);
|
digi->WriteRegister(DPP::QDC::GroupEnableMask, 0x01);
|
||||||
digi->WriteRegister(DPP::AggregateOrganization, 0x1);
|
|
||||||
digi->WriteRegister(DPP::QDC::NumberEventsPerAggregate, 0x4);
|
|
||||||
digi->WriteRegister(DPP::AcquisitionControl, 0x0);
|
|
||||||
digi->WriteRegister(DPP::GlobalTriggerMask, 0x0);
|
|
||||||
digi->WriteRegister(DPP::FrontPanelTRGOUTEnableMask, 0x0);
|
|
||||||
digi->WriteRegister(DPP::FrontPanelIOControl, 0x0);
|
|
||||||
digi->WriteRegister(DPP::QDC::GroupEnableMask, 0xFF);
|
|
||||||
digi->WriteRegister(DPP::MaxAggregatePerBlockTransfer, 0x3FF);
|
|
||||||
|
|
||||||
|
digi->WriteRegister(DPP::QDC::NumberEventsPerAggregate, 10, -1);
|
||||||
|
digi->WriteRegister(DPP::AggregateOrganization, 0, -1);
|
||||||
|
digi->WriteRegister(DPP::MaxAggregatePerBlockTransfer, 100, -1);
|
||||||
|
|
||||||
//digi->WriteRegister(DPP::QDC::DPPAlgorithmControl, 0x300112, 0); // with pulse for grp 0
|
digi->SetBits(DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::Polarity, 0, -1);
|
||||||
|
|
||||||
digi->WriteRegister(DPP::BoardID, 0x7);
|
digi->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::EnableExtra2, 1, -1);
|
||||||
|
digi->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, 1, -1);
|
||||||
// digi->PrintSettingFromMemory();
|
|
||||||
|
|
||||||
Data * data = digi->GetData();
|
Data * data = digi->GetData();
|
||||||
|
|
||||||
data->ClearData();
|
remove("haha_17121_QDC_000.fsu");
|
||||||
|
data->OpenSaveFile("haha");
|
||||||
data->PrintStat();
|
|
||||||
|
|
||||||
|
|
||||||
digi->StartACQ();
|
digi->StartACQ();
|
||||||
|
|
||||||
for( int i = 0; i < 10; i ++ ){
|
for( int i = 0; i < 10; i ++ ){
|
||||||
usleep(1000*1000);
|
usleep(1000*1000);
|
||||||
digi->ReadData();
|
digi->ReadData();
|
||||||
data->DecodeBuffer(false, 0);
|
data->DecodeBuffer(true, 0);
|
||||||
|
//data->DecodeBuffer(false, 2);
|
||||||
|
data->SaveData();
|
||||||
data->PrintStat();
|
data->PrintStat();
|
||||||
|
|
||||||
//data->SaveData();
|
|
||||||
|
|
||||||
// int index = data->NumEventsDecoded[0];
|
// int index = data->NumEventsDecoded[0];
|
||||||
// printf("-------------- %ld \n", data->Waveform1[0][index].size());
|
// printf("-------------- %ld \n", data->Waveform1[0][index].size());
|
||||||
|
|
||||||
//data->PrintAllData();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
digi->StopACQ();
|
digi->StopACQ();
|
||||||
|
|
||||||
|
|
||||||
|
data->CloseSaveFile();
|
||||||
|
|
||||||
|
data->PrintAllData();
|
||||||
|
|
||||||
digi->CloseDigitizer();
|
digi->CloseDigitizer();
|
||||||
delete digi;
|
delete digi;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user