fix RecordLength bug for QDC. Can't 100% trust CAEN manual

This commit is contained in:
Ryan Tang 2024-03-19 16:13:44 -04:00
parent 00a16ffc2e
commit bebff94e62
8 changed files with 43 additions and 22 deletions

View File

@ -47,6 +47,7 @@ void Digitizer::Initalization(){
isConnected = false;
AcqRun = false;
isDummy = true;
}
void Digitizer::Reset(){
@ -64,7 +65,7 @@ void Digitizer::Reset(){
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(" Sampling rate : %.0f MHz = %.1f ns \n", 1000/tick2ns, tick2ns);
printf(" Sampling rate : %.1f MHz = %.1f ns \n", 1000./tick2ns, tick2ns);
printf("No. of Input Channels : %d \n", NumInputCh);
printf(" No. of Reg Channels : %d, mask : 0x%X\n", NumRegChannel, regChannelMask);
printf(" SerialNumber :\e[1m\e[33m %d\e[0m\n", BoardInfo.SerialNumber);
@ -436,7 +437,8 @@ int Digitizer::ProgramBoard_QDC(){
int ret = 0;
//WriteRegister(DPP::QDC::NumberEventsPerAggregate, 0x10, -1);
WriteRegister(DPP::QDC::RecordLength_W, 16, -1); // 128 sample = 2048 ns
WriteRegister(DPP::QDC::RecordLength, 16, -1); // 128 sample = 2048 ns
WriteRegister(DPP::QDC::PreTrigger, 60, -1); // at 60 sample = 960 ns
WriteRegister(DPP::QDC::GateWidth, 100/16, -1);
@ -494,7 +496,9 @@ void Digitizer::StartACQ(){
// ret |= CAEN_DGTZ_SetDPPEventAggregation(handle, 0, 0); // Auto set
unsigned int bufferSize = CalByteForBufferCAEN();
if( bufferSize > 160 * 1024 * 1024 ) printf("============= buffer size bigger than 160 MB (%u)\n", bufferSize );
// unsigned int bufferSize = 200 * 1024 * 1024;
// if( DPPType == DPPTypeCode::DPP_QDC_CODE ) bufferSize = 500 * 1024 * 1024;
// if( bufferSize > 160 * 1024 * 1024 ) printf("============= buffer size bigger than 160 MB (%u)\n", bufferSize );
data->AllocateMemory(bufferSize);
@ -650,7 +654,7 @@ int Digitizer::ReadData(){
}
}
ReadACQStatus();
// ReadACQStatus();
return ret;
}
@ -678,7 +682,7 @@ void Digitizer::ReadAndPrintACQStatue(){
//===========================================================
void Digitizer::WriteRegister (Reg registerAddress, uint32_t value, int ch, bool isSave2MemAndFile){
if( softwareDisable ) return;
printf("%30s[0x%04X](digi-%d,ch-%02d) [0x%04X]: 0x%08X \n", registerAddress.GetNameChar(), registerAddress.GetAddress(),GetSerialNumber(), ch, registerAddress.ActualAddress(ch), value);
printf("WRITE|%30s[0x%04X](digi-%d,ch-%02d) [0x%04X]: 0x%08X \n", registerAddress.GetNameChar(), registerAddress.GetAddress(),GetSerialNumber(), ch, registerAddress.ActualAddress(ch), value);
if( !isConnected ) {
//SetSettingToMemory(registerAddress, value, ch); //TODO should the binary setting be edited offline?
@ -720,6 +724,7 @@ uint32_t Digitizer::ReadRegister(Reg registerAddress, unsigned short ch, bool is
if( softwareDisable ) return 0;
if( !isConnected ) return 0;
if( registerAddress.GetRWType() == RW::WriteONLY ) return 0;
// if( registerAddress == DPP::QDC::RecordLength_W ) return 0;
ret = CAEN_DGTZ_ReadRegister(handle, registerAddress.ActualAddress(ch), &returnData);
@ -732,8 +737,8 @@ uint32_t Digitizer::ReadRegister(Reg registerAddress, unsigned short ch, bool is
std::stringstream ss;
ss << std::hex << registerAddress.ActualAddress(ch);
ErrorMsg("ReadRegister:0x" + ss.str() + "(" + registerAddress.GetName() + ")");
if( str != "" ) printf("%s : 0x%04X(0x%04X) is 0x%08X \n", str.c_str(),
ErrorMsg("Register:0x" + ss.str() + "(" + registerAddress.GetName() + ")");
if( !str.empty() ) printf("READ|%s : 0x%04X(0x%04X) is 0x%08X \n", str.c_str(),
registerAddress.ActualAddress(ch), registerAddress.GetAddress(), returnData);
return returnData;
}
@ -744,15 +749,15 @@ uint32_t Digitizer::PrintRegister(uint32_t address, std::string msg){
printf("------------ %s = 0x%X \n", msg.c_str(), address);
printf("----------------------------------------------------\e[0m\n");
uint32_t * value = new uint32_t[1];
CAEN_DGTZ_ReadRegister(handle, address, value);
uint32_t value;
CAEN_DGTZ_ReadRegister(handle, address, &value);
printf(" %*s 32 28 24 20 16 12 8 4 0\n", (int) msg.length(), "");
printf(" %*s | | | | | | | | |\n", (int) msg.length(), "");
printf(" %*s", (int) msg.length(), "");
std::cout << " : 0b" << std::bitset<32>(value[0]) << std::endl;
printf(" %*s : 0x%X\n", (int) msg.length(), msg.c_str(), value[0]);
std::cout << " : 0b" << std::bitset<32>(value) << std::endl;
printf(" %*s : 0x%08X = %u\n", (int) msg.length(), msg.c_str(), value, value);
return value[0];
return value;
}
//========================================== setting file IO
@ -842,6 +847,7 @@ void Digitizer::ReadAllSettingsFromBoard(bool force){
if( RegisterBoardList_QDC[p].GetRWType() == RW::WriteONLY) continue;
ReadRegister(RegisterBoardList_QDC[p]);
}
regChannelMask = GetSettingFromMemory(DPP::QDC::GroupEnableMask);
for( int ch = 0; ch < GetNumRegChannels(); ch ++){

View File

@ -106,7 +106,10 @@ class Digitizer{
Data * GetData() const {return data;}
uint32_t GetACQStatusFromMemory() const {return acqStatus;}
void ReadAndPrintACQStatue();
void ReadACQStatus() { acqStatus = ReadRegister(DPP::AcquisitionStatus_R); }
void ReadACQStatus() {
// printf("%s\n", __func__);
acqStatus = ReadRegister(DPP::AcquisitionStatus_R);
}
unsigned int CalByteForBuffer(bool verbose = false);
unsigned int CalByteForBufferCAEN();

View File

@ -70,6 +70,14 @@ public:
break;
}
clock_gettime(CLOCK_REALTIME, &t1);
if( t1.tv_sec - ta.tv_sec > 2 ){
digiMTX[ID].lock();
digi->ReadACQStatus();
digiMTX[ID].unlock();
ta = t1;
}
if( isSaveData && !stop ) {
clock_gettime(CLOCK_REALTIME, &tb);
if( tb.tv_sec - ta.tv_sec > 2 ) {

View File

@ -3117,6 +3117,7 @@ void DigiSettingsPanel::UpdateReadOutStatus(uint32_t status){
void DigiSettingsPanel::UpdateBoardAndChannelsStatus(){
printf("%s\n", __func__);
//*========================================
uint32_t AcqStatus = digi[ID]->ReadRegister(DPP::AcquisitionStatus_R);
UpdateACQStatus(AcqStatus);

View File

@ -1148,6 +1148,7 @@ void MainWindow::StopACQ(){
if( chkSaveData->isChecked() ) digi[i]->GetData()->CloseSaveFile();
LogMsg("Digi-" + QString::number(digi[i]->GetSerialNumber()) + " ACQ is stopped." );
QCoreApplication::processEvents();
digi[i]->ReadACQStatus();
}
if( scalarThread->isRunning()){

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
const Reg NumberEventsPerAggregate ("Number of Events per Aggregate", 0x1020, RW::ReadWrite, false, 0x3FF, -1); /// R/W
const Reg RecordLength ("Record Length_R" , 0x1024, RW::ReadWrite, false, 0x1FFF, 8); /// R/W
const Reg RecordLength ("Record Length" , 0x1024, RW::ReadWrite, false, 0x1FFF, 8); /// R
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 FixedBaseline ("FixedBaseline" , 0x1038, RW::ReadWrite, false, 0xFFF, -1); /// R/W
@ -811,9 +811,11 @@ namespace DPP {
const Reg TriggerThreshold_sub6 ("Trigger Threshold sub6" , 0x10E8, RW::ReadWrite, false, 0xFFF, -1); /// R/W
const Reg TriggerThreshold_sub7 ("Trigger Threshold sub7" , 0x10EC, RW::ReadWrite, false, 0xFFF, -1); /// R/W
const Reg RecordLength_W ("Record Length_W" , 0x8024, RW::WriteONLY, false, 0x1FFF, 8); /// /W
const Reg GroupEnableMask ("Group Enable Mask" , 0x8120, RW::ReadWrite, false, 0xFF, -1); /// R/W
namespace Bit_DPPAlgorithmControl {
const std::pair<unsigned short, unsigned short> ChargeSensitivity = {3, 0} ; /// length, smallest pos
const std::pair<unsigned short, unsigned short> InternalTestPulse = {1, 4};
@ -1025,7 +1027,7 @@ const std::vector<Reg> RegisterBoardList_QDC = {
DPP::BoardConfiguration ,
DPP::AggregateOrganization,
DPP::QDC::NumberEventsPerAggregate,
DPP::QDC::RecordLength_W,
// DPP::QDC::RecordLength_W,
DPP::AcquisitionControl,
DPP::AcquisitionStatus_R,
DPP::SoftwareTrigger_W,

View File

@ -371,9 +371,9 @@ void Scope::StartScope(){
digi[iDigi]->WriteRegister(DPP::SoftwareClear_W, 1);
digi[iDigi]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, 1, -1);
AggPerRead[iDigi] = digi[iDigi]->GetSettingFromMemory(DPP::MaxAggregatePerBlockTransfer);
SendLogMsg("Set Events/Agg to 1 for scope, it was " + QString::number(AggPerRead[iDigi]) + ".");
digi[iDigi]->WriteRegister(DPP::MaxAggregatePerBlockTransfer, 1);
//AggPerRead[iDigi] = digi[iDigi]->GetSettingFromMemory(DPP::MaxAggregatePerBlockTransfer);
//SendLogMsg("Set Agg/Read to 1 for scope, it was " + QString::number(AggPerRead[iDigi]) + ".");
//digi[iDigi]->WriteRegister(DPP::MaxAggregatePerBlockTransfer, 1);
readDataThread[iDigi]->SetScopeMode(true);
readDataThread[iDigi]->SetSaveData(false);
@ -431,7 +431,7 @@ void Scope::StopScope(){
digiMTX[iDigi].unlock();
digi[iDigi]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, traceOn[iDigi], -1);
digi[iDigi]->WriteRegister(DPP::MaxAggregatePerBlockTransfer, AggPerRead[iDigi]);
//digi[iDigi]->WriteRegister(DPP::MaxAggregatePerBlockTransfer, AggPerRead[iDigi]);
}
@ -883,7 +883,7 @@ void Scope::SetUpPanel_QDC() {
int rowID = 0;
SetUpSpinBox(sbReordLength, "Record Length [ns] ", rowID, 0, DPP::QDC::RecordLength_W);
SetUpSpinBox(sbReordLength, "Record Length [ns] ", rowID, 0, DPP::QDC::RecordLength);
SetUpSpinBox(sbPreTrigger, "Pre Trigger [ns] ", rowID, 2, DPP::QDC::PreTrigger);
SetUpSpinBox(sbDCOffset, "DC offset [%] ", rowID, 4, DPP::QDC::DCOffset);
sbDCOffset->setDecimals(2);

View File

@ -2,7 +2,7 @@
#define MACRO_H
#define MaxNPorts 4 //for optical link
#define MaxNBoards 8 //for both optical link and usb
#define MaxNBoards 4 //for both optical link and usb
#define MaxNDigitizer MaxNPorts * MaxNBoards