polished QDC related things

This commit is contained in:
carina@hades 2023-10-13 18:02:19 -04:00
parent 674f3bdd77
commit 34feff751a
10 changed files with 265 additions and 125 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -782,7 +782,7 @@ void Scope::SetUpPanel_QDC() {
SetUpSpinBox(sbGateOffset, "Gate Offset [ns] ", rowID, 2, DPP::QDC::GateOffset); SetUpSpinBox(sbGateOffset, "Gate Offset [ns] ", rowID, 2, DPP::QDC::GateOffset);
QLabel * lb = new QLabel("Threshold [LSB]", settingGroup); QLabel * lb = new QLabel("Threshold [LSB] ", settingGroup);
lb->setAlignment(Qt::AlignRight | Qt::AlignCenter); lb->setAlignment(Qt::AlignRight | Qt::AlignCenter);
settingLayout->addWidget(lb, rowID, 4); settingLayout->addWidget(lb, rowID, 4);
@ -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
View 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
View File

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