From 14731d5dea98a2bebc06fc0e718ba211e5d98dd9 Mon Sep 17 00:00:00 2001 From: splitPoleDAQ Date: Thu, 4 Aug 2022 17:27:33 -0400 Subject: [PATCH] seperated DigitizerClass to DigitizerPHA, DigitizerPSD, add prototye of FSUDAQ --- .gitignore | 3 + DigitizerClass.cpp | 444 +++++++++++++++++++++++++ DigitizerClass.h | 754 +------------------------------------------ DigitizerPHA.cpp | 173 ++++++++++ DigitizerPHA.h | 50 +++ DigitizerPSD.cpp | 14 + DigitizerPSD.h | 18 ++ FSUDAQ.cpp | 248 ++++++++++++++ FSUDAQ.h | 79 +++++ FSUDAQDict.cxx | 149 +++++++++ FSUDAQDict_rdict.pcm | Bin 0 -> 1426 bytes FSUDAQLinkDef.h | 1 + Makefile | 43 ++- RegisterAddress.h | 287 ++++++++-------- test.cpp | 34 +- 15 files changed, 1388 insertions(+), 909 deletions(-) create mode 100644 DigitizerClass.cpp create mode 100644 DigitizerPHA.cpp create mode 100644 DigitizerPHA.h create mode 100644 DigitizerPSD.cpp create mode 100644 DigitizerPSD.h create mode 100644 FSUDAQ.cpp create mode 100644 FSUDAQ.h create mode 100644 FSUDAQDict.cxx create mode 100644 FSUDAQDict_rdict.pcm create mode 100644 FSUDAQLinkDef.h diff --git a/.gitignore b/.gitignore index 9daeafb..074d01e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ +*.o + test +FSUDAQ diff --git a/DigitizerClass.cpp b/DigitizerClass.cpp new file mode 100644 index 0000000..821e1ae --- /dev/null +++ b/DigitizerClass.cpp @@ -0,0 +1,444 @@ +#include "DigitizerClass.h" + +Digitizer::Digitizer(){ + + portID = -1; + boardID = -1; + handle = -1; + NChannel = 0; + ADCbits = 1; + DPPType = 0; + ADCFullSize = 0; + ch2ns = 0; + BoardInfo = {}; + DPPControl2Adress = Register::DPP::PHA::DPPAlgorithmControl2; + + VMEBaseAddress = 0; + LinkType = CAEN_DGTZ_USB; /// default USB + IOlev = CAEN_DGTZ_IOLevel_NIM; ///default NIM + AcqMode = CAEN_DGTZ_DPP_ACQ_MODE_List; ///default list mode + + channelMask = 0xFFFF; + + ret = -1; + isConnected = false; + +} + +Digitizer::Digitizer(int boardID, int portID){ + Digitizer(); + OpenDigitizer(boardID, portID); +} + +Digitizer::~Digitizer(){ + CloseDigitizer(); +} + +void Digitizer::Reset(){ + ret = CAEN_DGTZ_Reset(handle); + if( ret != 0 ) ErrorMsg("Reset"); +} + +int Digitizer::OpenDigitizer(int boardID, int portID){ + + this->boardID = boardID; + this->portID = portID; + + /***************************************************/ + /** Open the digitizer and read board information */ + /***************************************************/ + + printf("============= Opening Digitizer at Board %d, Port %d \n", boardID, portID); + + ///-------- try USB first + LinkType = CAEN_DGTZ_USB; /// Link Type + ret = (int) CAEN_DGTZ_OpenDigitizer(LinkType, boardID, 0, VMEBaseAddress, &handle); + if (ret != 0){ ///---------- try Optical link + LinkType = CAEN_DGTZ_OpticalLink ; + ret = (int) CAEN_DGTZ_OpenDigitizer(LinkType, portID, boardID, VMEBaseAddress, &handle); + } + + if (ret != 0) { + printf("Can't open digitizer\n"); + }else{ + ///----- Getting Board Info + ret = (int) CAEN_DGTZ_GetInfo(handle, &BoardInfo); + if (ret != 0) { + printf("Can't read board info\n"); + }else{ + isConnected = true; + printf("Connected to Model %s with handle %d using %s\n", BoardInfo.ModelName, handle, LinkType == CAEN_DGTZ_USB ? "USB" : "Optical Link"); + NChannel = BoardInfo.Channels; + channelMask = pow(2, NChannel)-1; + switch(BoardInfo.Model){ + case CAEN_DGTZ_V1730: ch2ns = 2.0; break; ///ns -> 500 MSamples/s + case CAEN_DGTZ_V1725: ch2ns = 4.0; break; ///ns -> 250 MSamples/s + } + printf("Sampling rate : %.0f MHz = %.1f ns \n", 1000/ch2ns, ch2ns); + printf("Number of Channels : %d = 0x%X\n", NChannel, channelMask); + printf("SerialNumber :\e[1m\e[33m %d\e[0m\n", BoardInfo.SerialNumber); + ADCbits = BoardInfo.ADC_NBits; + ADCFullSize = (unsigned int)( pow(2, ADCbits) -1 ); + printf("ADC bit is \e[33m%d\e[0m, %d = 0x%x\n", ADCbits, ADCFullSize, ADCFullSize); + printf("ROC FPGA Release is %s\n", BoardInfo.ROC_FirmwareRel); + printf("AMC FPGA Release is %s\n", BoardInfo.AMC_FirmwareRel); + + int DPPType; + sscanf(BoardInfo.AMC_FirmwareRel, "%d", &DPPType); + if (DPPType != V1730_DPP_PHA_CODE) { + printf("This digitizer does not have DPP-PHA firmware\n"); + } + } + } + + // Check firmware revision (DPP firmwares cannot be used with this demo */ + sscanf(BoardInfo.AMC_FirmwareRel, "%d", &DPPType); + if (DPPType >= 128) { + printf("\t==== This digitizer has a DPP firmware!\n"); + printf("\e[32m"); + switch (DPPType){ + case 0x80: printf("\tDPP-PHA for x724 boards \n"); break; + case 0x82: printf("\tDPP-CI for x720 boards \n"); break; + case 0x83: printf("\tDPP-PSD for x720 boards \n"); break; + case 0x84: printf("\tDPP-PSD for x751 boards \n"); break; + case 0x85: printf("\tDPP-ZLE for x751 boards \n"); break; + case 0x86: printf("\tDPP-PSD for x743 boards \n"); break; + case 0x87: printf("\tDPP-QDC for x740 boards \n"); break; + case 0x88: printf("\tDPP-PSD for x730 boards \n"); DPPControl2Adress = Register::DPP::PSD::DPPAlgorithmControl2; break; + case 0x8B: printf("\tDPP-PHA for x730 boards \n"); DPPControl2Adress = Register::DPP::PHA::DPPAlgorithmControl2; break; + case 0x8C: printf("\tDPP-ZLE for x730 boards \n"); break; + case 0x8D: printf("\tDPP-DAW for x730 boards \n"); break; + } + printf("\e[0m"); + } + + int probes[MAX_SUPPORTED_PROBES]; + int numProbes; + ret = CAEN_DGTZ_GetDPP_SupportedVirtualProbes(handle, 1, probes, &numProbes); + printf("\t==== supported virtual probe (number of Probe : %d)\n", numProbes); + for( int i = 0 ; i < numProbes; i++){ + switch (probes[i]){ + case 0: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_Input\n"); break; + case 1: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_Delta\n"); break; + case 2: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_Delta2\n"); break; + case 3: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_Trapezoid\n"); break; + case 4: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_TrapezoidReduced\n"); break; + case 5: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_Baseline\n"); break; + case 6: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_Threshold\n"); break; + case 7: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_CFD\n"); break; + case 8: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_SmoothedInput\n"); break; + case 9: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_None\n"); break; + case 10: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_TRGWin\n"); break; + case 11: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_Armed\n"); break; + case 12: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_PkRun\n"); break; + case 13: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_Peaking\n"); break; + case 14: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_CoincWin\n"); break; + case 15: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_BLHoldoff\n"); break; + case 16: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_TRGHoldoff\n"); break; + case 17: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_TRGVal\n"); break; + case 18: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_ACQVeto\n"); break; + case 19: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_BFMVeto\n"); break; + case 20: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_ExtTRG\n"); break; + case 21: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_OverThr\n"); break; + case 22: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_TRGOut\n"); break; + case 23: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_Coincidence \n"); break; + case 24: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_PileUp \n"); break; + case 25: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_Gate \n"); break; + case 26: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_GateShort \n"); break; + case 27: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_Trigger \n"); break; + case 28: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_None \n"); break; + case 29: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_BLFreeze \n"); break; + case 30: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_Busy \n"); break; + case 31: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_PrgVeto \n"); break; + } + } + + ErrorMsg("end of OpenDigitizer"); + + if( isConnected ) { + ProgramBoard(); + } + + return ret; +} + +int Digitizer::CloseDigitizer(){ + + printf("-------- Closing Digtizer Board : %d Port : %d \n", boardID, portID); + printf(" Model %s with handle %d using %s\n", BoardInfo.ModelName, handle, LinkType == CAEN_DGTZ_USB ? "USB" : "Optical Link"); + ret = CAEN_DGTZ_SWStopAcquisition(handle); + ret |= CAEN_DGTZ_CloseDigitizer(handle); + + return ret; +} + +void Digitizer::ErrorMsg(string header){ + switch (ret){ + ///case CAEN_DGTZ_Success : /** 0 */ printf("%s | Operation completed successfully.\n", header.c_str()); break; + case CAEN_DGTZ_CommError : /** -1 */ printf("%s | Communication Error.\n", header.c_str()); break; + case CAEN_DGTZ_GenericError : /** -2 */ printf("%s | Unspecified error.\n", header.c_str()); break; + case CAEN_DGTZ_InvalidParam : /** -3 */ printf("%s | Invalid parameter.\n", header.c_str()); break; + case CAEN_DGTZ_InvalidLinkType : /** -4 */ printf("%s | Invalid Link Type.\n", header.c_str()); break; + case CAEN_DGTZ_InvalidHandle : /** -5 */ printf("%s | Invalid device handler.\n", header.c_str()); break; + case CAEN_DGTZ_MaxDevicesError : /** -6 */ printf("%s | Maximum number of devices exceeded.\n", header.c_str()); break; + case CAEN_DGTZ_BadBoardType : /** -7 */ printf("%s | Operation not allowed on this type of board.\n", header.c_str()); break; + case CAEN_DGTZ_BadInterruptLev : /** -8 */ printf("%s | The interrupt level is not allowed.\n", header.c_str()); break; + case CAEN_DGTZ_BadEventNumber : /** -9 */ printf("%s | The event number is bad.\n", header.c_str()); break; + case CAEN_DGTZ_ReadDeviceRegisterFail : /** -10 */ printf("%s | Unable to read the registry.\n", header.c_str()); break; + case CAEN_DGTZ_WriteDeviceRegisterFail : /** -11 */ printf("%s | Unable to write the registry.\n", header.c_str()); break; + case CAEN_DGTZ_InvalidChannelNumber : /** -13 */ printf("%s | The channel number is invalid.\n", header.c_str()); break; + case CAEN_DGTZ_ChannelBusy : /** -14 */ printf("%s | The channel is busy.\n", header.c_str()); break; + case CAEN_DGTZ_FPIOModeInvalid : /** -15 */ printf("%s | Invalid FPIO mode.\n", header.c_str()); break; + case CAEN_DGTZ_WrongAcqMode : /** -16 */ printf("%s | Wrong Acquistion mode.\n", header.c_str()); break; + case CAEN_DGTZ_FunctionNotAllowed : /** -17 */ printf("%s | This function is not allowed on this module.\n", header.c_str()); break; + case CAEN_DGTZ_Timeout : /** -18 */ printf("%s | Communication Timeout.\n", header.c_str()); break; + case CAEN_DGTZ_InvalidBuffer : /** -19 */ printf("%s | The buffer is invalid.\n", header.c_str()); break; + case CAEN_DGTZ_EventNotFound : /** -20 */ printf("%s | The event is not found.\n", header.c_str()); break; + case CAEN_DGTZ_InvalidEvent : /** -21 */ printf("%s | The event is invalid.\n", header.c_str()); break; + case CAEN_DGTZ_OutOfMemory : /** -22 */ printf("%s | Out of memory.\n", header.c_str()); break; + case CAEN_DGTZ_CalibrationError : /** -23 */ printf("%s | Unable to calibrate the board.\n", header.c_str()); break; + case CAEN_DGTZ_DigitizerNotFound : /** -24 */ printf("%s | Unbale to open the digitizer.\n", header.c_str()); break; + case CAEN_DGTZ_DigitizerAlreadyOpen : /** -25 */ printf("%s | The digitizer is already open.\n", header.c_str()); break; + case CAEN_DGTZ_DigitizerNotReady : /** -26 */ printf("%s | The digitizer is not ready.\n", header.c_str()); break; + case CAEN_DGTZ_InterruptNotConfigured : /** -27 */ printf("%s | The digitizer has no IRQ configured.\n", header.c_str()); break; + case CAEN_DGTZ_DigitizerMemoryCorrupted: /** -28 */ printf("%s | The digitizer flash memory is corrupted.\n", header.c_str()); break; + case CAEN_DGTZ_DPPFirmwareNotSupported : /** -29 */ printf("%s | The digitier DPP firmware is not supported in this lib version.\n", header.c_str()); break; + case CAEN_DGTZ_InvalidLicense : /** -30 */ printf("%s | Invalid firmware licence.\n", header.c_str()); break; + case CAEN_DGTZ_InvalidDigitizerStatus : /** -31 */ printf("%s | The digitizer is found in a corrupted status.\n", header.c_str()); break; + case CAEN_DGTZ_UnsupportedTrace : /** -32 */ printf("%s | The given trace is not supported.\n", header.c_str()); break; + case CAEN_DGTZ_InvalidProbe : /** -33 */ printf("%s | The given probe is not supported.\n", header.c_str()); break; + case CAEN_DGTZ_UnsupportedBaseAddress : /** -34 */ printf("%s | The base address is not supported.\n", header.c_str()); break; + case CAEN_DGTZ_NotYetImplemented : /** -99 */ printf("%s | The function is not yet implemented.\n", header.c_str()); break; + } + +} + +int Digitizer::ProgramBoard(){ + + ret = CAEN_DGTZ_Reset(handle); + if (ret) { + printf("ERROR: can't reset the digitizer.\n"); + return -1; + } + + /// Board Configuration without PHA or PSD fireware + ///bx0000 0000 0000 0000 0000 0000 0001 0000 = + /// | | +- (1) trigger overlap not allowed + /// | +- (3) test pattern disable + /// + (6) Self-trigger polarity, 1 = negative, 0 = Positive + ret = CAEN_DGTZ_WriteRegister(handle, (uint32_t) Register::BoardConfiguration , 0x000E0114); /// Channel Control Reg (indiv trg, seq readout) ?? + + /// Set the I/O level (CAEN_DGTZ_IOLevel_NIM or CAEN_DGTZ_IOLevel_TTL) + ret |= CAEN_DGTZ_SetIOLevel(handle, IOlev); + + /// Set the enabled channels + ret |= CAEN_DGTZ_SetChannelEnableMask(handle, channelMask); + + /// Set the number of samples for each waveform + SetRecordLength(100); /// default 100 * 8 = 800 ch + ///ret |= CAEN_DGTZ_SetRecordLength(handle, recordLength); + + /// Set Extras 2 to enable, this override Accusition mode, focring list mode + uint32_t value = 0x10E0114; + ret |= CAEN_DGTZ_WriteRegister(handle, Register::BoardConfiguration , value ); + + /// Set how many events to accumulate in the board memory before being available for readout + SetEventAggregation(0); /// when zero, digitizer auto set + ///ret |= CAEN_DGTZ_SetDPPEventAggregation(handle, EventAggr, 0); + + /// Set the digitizer acquisition mode (CAEN_DGTZ_SW_CONTROLLED or CAEN_DGTZ_S_IN_CONTROLLED) + ret |= CAEN_DGTZ_SetAcquisitionMode(handle, CAEN_DGTZ_SW_CONTROLLED); /// software command + ret |= CAEN_DGTZ_SetDPPAcquisitionMode(handle, AcqMode, CAEN_DGTZ_DPP_SAVE_PARAM_EnergyAndTime); + + /** Set the digitizer's behaviour when an external trigger arrives: + CAEN_DGTZ_TRGMODE_DISABLED: do nothing + CAEN_DGTZ_TRGMODE_EXTOUT_ONLY: generate the Trigger Output signal + CAEN_DGTZ_TRGMODE_ACQ_ONLY = generate acquisition trigger + CAEN_DGTZ_TRGMODE_ACQ_AND_EXTOUT = generate both Trigger Output and acquisition trigger + see CAENDigitizer user manual, chapter "Trigger configuration" for details */ + ret |= CAEN_DGTZ_SetExtTriggerInputMode(handle, CAEN_DGTZ_TRGMODE_ACQ_ONLY); + + /** Set the mode used to syncronize the acquisition between different boards. + In this example the sync is disabled */ + ret |= CAEN_DGTZ_SetRunSynchronizationMode(handle, CAEN_DGTZ_RUN_SYNC_Disabled); + + ErrorMsg("End of ProgramBoard"); + return ret; + +} + +//=========================================================== +void Digitizer::WriteRegister(uint32_t address, uint32_t value, int ch ){ + if( ch < 0 ) { + ret = CAEN_DGTZ_WriteRegister(handle, address + 0x7000, value); + }else{ + ret = CAEN_DGTZ_WriteRegister(handle, address + (ch<<8), value); + } + ErrorMsg("WriteRegister"); +} + +uint32_t Digitizer::ReadRegister(uint32_t address, unsigned int ch, string str ){ + uint32_t * Data = new uint32_t[NChannel]; + if( ch < 0 ) { + ret = CAEN_DGTZ_ReadRegister(handle, address + 0x7000, Data); + }else{ + ret = CAEN_DGTZ_ReadRegister(handle, address + (ch << 8), Data); + } + ErrorMsg("ReadRegister"); + if( str != "" ) printf("%s : 0x%x \n", str.c_str(), Data[0]); + return Data[0]; +} + +void Digitizer::SetChannelMask(uint32_t mask){ + channelMask = mask; + ret |= CAEN_DGTZ_SetChannelEnableMask(handle, channelMask); + ErrorMsg("SetChannelMask"); +} + +void Digitizer::SetRecordLength(unsigned int nSample, int ch){ + WriteRegister( Register::DPP::RecordLength, nSample / 8, ch); + ErrorMsg("SetRecordLength"); +} + +void Digitizer::SetEventAggregation(unsigned int numEvent, int ch){ + WriteRegister( Register::DPP::NumberEventsPerAggregate, numEvent, ch); + ErrorMsg("SetEventAggregation"); +} + +void Digitizer::SetInputDynamicRange(unsigned int TwoVol_0_or_halfVol_1, int ch){ + WriteRegister( Register::InputDynamicRange, TwoVol_0_or_halfVol_1, ch); + ErrorMsg("SetInputDynamicRange"); +} + +void Digitizer::SetNumSamplePreTrigger(unsigned int nSample, int ch){ + WriteRegister( Register::DPP::PreTrigger, nSample / 4, ch); + ErrorMsg("SetNumSamplePreTrigger"); +} + +void Digitizer::SetDCOffset(float offsetPrecentage, int ch){ + WriteRegister( Register::DPP::ChannelDCOffset, uint( ADCFullSize * offsetPrecentage), ch ); + ErrorMsg("SetDCOffset"); +} + +void Digitizer::SetVetoWidth(uint32_t bit, int ch){ + WriteRegister( Register::DPP::VetoWidth, bit, ch); + ErrorMsg("SetVetoWidth"); +} + +void Digitizer::SetTriggerPolarity(bool RiseingIsZero, int ch ){ + if( ch < 0 ) { + ret = 0; + for (int i = 0; i < NChannel; i++){ + ret |= CAEN_DGTZ_SetTriggerPolarity(handle, i, CAEN_DGTZ_TriggerPolarity_t(RiseingIsZero)); + } + }else{ + ret = CAEN_DGTZ_SetTriggerPolarity(handle, ch, CAEN_DGTZ_TriggerPolarity_t(RiseingIsZero)); + } + if( ret != 0 ) ErrorMsg("SetTriggerPolarity"); +} + +//============================== DPP-Alpgorthm Control +void Digitizer::SetDPPAlgorithmControl(uint32_t bit, int ch){ + ///============= DPP algorithm control is 32 bit + /// [ 0: 5] Trapazoid Rescaling. the trapazoid ADC is 48 bit. it need to bit-shift before the 0x3FFF (14 bit filter) + /// [ 8: 9] Decimation. 00 = disable, 01 = 2 samples, 10 = 4 samples, 11 = 8 sample + /// [10:11] Decimation Gain. This gain apply to the Trapazoid Rescaling and fine gain + /// [12:13] Peak Mean. sample for averaging the trapezoid height calculation. 00 = 1 sample, 01 = 4 samples, 10 = 16 sample, 11 = 64 sample + /// [16] pulse polarity. 0 = positve, 1 = negative + /// [18:19] Trigger mode. 00 = normal, 01 = coincident, 10 = reserved. 11 = anti coincident + /// [20:22] number of samples for the baseline average calculation. 000 = baseline disable (energy not subtraced with baseline) + /// 001 = 16 samples + /// 010 = 64 samples + /// 011 = 256 samples + /// 100 = 1024 samples + /// 101 = 4096 samples + /// 110 = 16384 samples + /// 111 = resertved. + /// [24] Disable self trigger. 0 = self‐trigger used to acquire and propagated to the trigger logic; + /// 1 = self‐trigger only propagated to the trigger logic. + /// [26] Enable Roll-Over flag. see manual 0 = disable, 1 = enable + /// [27] Enable pile-up flag. + + ///============= PHA - DPP algorithm control 2 is 32 bit + /// [ 0: 1] Local Shaped Trigger mode. see manual + /// [ 2] Enable Local Shaped Trigger + /// [ 4: 5] Local Trigger Validation mode, see manual + /// [ 6] Enable Local Trigger Validation + /// [ 8:10] Extra 2 word option. 000 = [0:15] baseline *4 [16:31] extended time stamp + /// 001 = reserved + /// 010 = [0:15] fine time stamp [16:31] extended time stamp + /// 011 = reserved + /// 100 = [0:15] total tigger counter [16:31] Lost trigger counter + /// 101 = [0:15] event after the zero crosiing [16:31] event before zero crossing + /// 110, 111 = reserved. + /// [14:15] source of veto. 00 = disable, 01 veto is common to all channels, 10 = veto for coupled channels, 11 = veto comes from negative saturation + /// [16:17] Select the step for the trigger counter rate flag. see manual + /// [18] baseline calculation is active also when the acquisition is not running. 0 = disbale, 1 = enable + /// [19] Tag correlated events. see manual 0 = disbale, 1 = enable + /// [29] Enable the optimization of the Baseline Restorer to avoid tails in the energy peaks. 0 = disbale, 1 = enable + + WriteRegister( Register::DPP::DPPAlgorithmControl, bit, ch); + if( ret != 0 ) ErrorMsg("SetDPPAlgorithmControl"); +} + +void Digitizer::SetBits(uint32_t address, unsigned int bitValue, unsigned int bitLength, unsigned int bitSmallestPos, int ch){ + uint32_t bit ; + uint32_t bitmask = (uint(pow(2, bitLength)-1) << bitSmallestPos); + if (ch < 0 ) ch = 0; /// take ch-0 + bit = ReadRegister(address, 0); + bit = (bit & ~bitmask) | (bitValue << bitSmallestPos); + WriteRegister(address, bit, ch); + if( ret != 0 ) ErrorMsg("SetBits"); +} + +int Digitizer::SetAcqMode(string list_mixed){ + + if( list_mixed == "list"){ + AcqMode = CAEN_DGTZ_DPP_ACQ_MODE_List; /// enables the acquisition of time stamps and energy value + }else if ( list_mixed == "mixed"){ + AcqMode = CAEN_DGTZ_DPP_ACQ_MODE_Mixed; /// enables the acquisition of both waveforms, energies, and timestamps. + }else{ + printf("############ AcqMode must be either list or mixed\n"); + return -1; + } + + int ret = 0; + if( isConnected ){ + /********************* Set the DPP acquisition mode + This setting affects the modes Mixed and List (see CAEN_DGTZ_DPP_AcqMode_t definition for details) + CAEN_DGTZ_DPP_SAVE_PARAM_EnergyOnly Only energy (DPP-PHA) or charge (DPP-PSD/DPP-CI v2) is returned + CAEN_DGTZ_DPP_SAVE_PARAM_TimeOnly Only time is returned + CAEN_DGTZ_DPP_SAVE_PARAM_EnergyAndTime Both energy/charge and time are returned + CAEN_DGTZ_DPP_SAVE_PARAM_None No histogram data is returned */ + + if( AcqMode == CAEN_DGTZ_DPP_ACQ_MODE_List){ + ret = CAEN_DGTZ_SetDPPAcquisitionMode(handle, AcqMode, CAEN_DGTZ_DPP_SAVE_PARAM_EnergyAndTime); + } + + if( AcqMode == CAEN_DGTZ_DPP_ACQ_MODE_Mixed ){ + ///ret = CAEN_DGTZ_SetDPPAcquisitionMode(handle, AcqMode, CAEN_DGTZ_DPP_SAVE_PARAM_TimeOnly); + ret = CAEN_DGTZ_SetDPPAcquisitionMode(handle, AcqMode, CAEN_DGTZ_DPP_SAVE_PARAM_EnergyAndTime); + } + + if( ret == 0 ) { + printf("Setting digitizer to \e[33m%s\e[0m mode.\n", list_mixed.c_str()); + }else{ + ErrorMsg("Set AcqMode"); + } + } + return ret; +} + + +int Digitizer::GetChTemperature(int ch){ + + if( BoardInfo.Model != CAEN_DGTZ_V1730 && + BoardInfo.Model != CAEN_DGTZ_V1725 && + BoardInfo.Model != CAEN_DGTZ_V1751 ) return -404; + + uint32_t * temp; + ret |= CAEN_DGTZ_ReadTemperature(handle, ch, temp); + if( ret != 0 ) ErrorMsg("GetChTemperature"); + return temp[0]; +} + diff --git a/DigitizerClass.h b/DigitizerClass.h index 029f9f7..800cd8d 100644 --- a/DigitizerClass.h +++ b/DigitizerClass.h @@ -18,51 +18,12 @@ #include "RegisterAddress.h" #define MaxNChannels 16 -#define MaxRecordLength 0x1fff /// 8191 +#define MaxRecordLength 0x3fff * 8 using namespace std; - +/** struct DigitizerChannelSetting { - - /// combined all DPP, PHA, and PSD - unsigned int recordLength; /// ch - unsigned int EventAggr; /// number of events in one aggregate (0=automatic), number of event acculated for read-off - unsigned int dynamicRange; /// 0 = 2 Vpp, 1 = 0.5 Vpp - unsigned int preTrigger; /// the number of samples before the trigger in the waveform saved into memory - float DCOffsetPrecentage; /// precentage of Max ADC - uint32_t VetoWidth; /// see manual, uint32_t to ensure it is 32 bit - bool triggerPolarity; /// 0 = on rising edge, 1 = on falling edge - - uint32_t DPPAlgorithmControl; - unsigned int baselineSampling; - unsigned int peakSampling; - bool pulsePolarity_DPP; /// 0 = positive, 1 = negative - bool rollOverFlag; - bool pileUpFlag; - - uint32_t DPPAlgorithmControl2; - - unsigned int triggerThreshold; /// [LSB] - unsigned int triggerHoldOff; /// [ch], Other triggers are inhibited for the overall Trigger Hold‐Off duration. - - - unsigned int shapedTriggerWidth; - - - /// PHA - unsigned int triggerSmoothingFactor; /// 0x0 = disabled; 0x1 = 2 sample; 0x2 = 4 samples; 0x4 = 8 samples; 0x8 = 16 samples; 0x10 = 32 samples; 0x20 = 64 samples; 0x3F = 128 samples - unsigned int inputRiseTime; /// [ch] - - unsigned int trapRiseTime; /// [ch] - unsigned int trapFlatTop; /// [ch] - unsigned int decayTime; /// [ch] - unsigned int peakingTime; /// [ch] flatTop delay, where the samples are used for the calculation of the peak height - unsigned int peakHoldOff; /// [ch] how close must be two trapezoids to be considered piled‐up after the start of flat top - - unsigned int fineGain; - unsigned int riseTimeValidWindow; /// [ch] used by the rise time discriminator (RTD) to reject pulses that overlap in the rise time - /// PDS unsigned int cfdSetting; @@ -76,7 +37,7 @@ struct DigitizerChannelSetting { unsigned int pureGapThreshold; unsigned int earlyBaselineFreeze; -}; +};*/ //################################################################ @@ -93,11 +54,11 @@ class Digitizer{ ///=================Settings void WriteRegister(uint32_t address, uint32_t value, int ch = -1); - uint32_t ReadRegister(uint32_t address, unsigned int ch); + uint32_t ReadRegister(uint32_t address, unsigned int ch = 0, string str = ""); ///common for PHA and PSD digitizers void SetChannelMask(uint32_t mask); - void SetRecordLength(unsigned int lenght, int ch = -1); /// when ch == -1, mean set all channels + void SetRecordLength(unsigned int nSample, int ch = -1); /// when ch == -1, mean set all channels void SetEventAggregation(unsigned int numEvent, int ch = -1); void SetInputDynamicRange(unsigned int TwoVol_0_or_halfVol_1, int ch = -1); void SetNumSamplePreTrigger(unsigned int nSample, int ch = -1 ); @@ -105,20 +66,10 @@ class Digitizer{ void SetVetoWidth(uint32_t bit, int ch = -1); /// See manual void SetTriggerPolarity(bool RiseingIsZero, int ch = -1); - void SetDPPAlgorithmControl(uint32_t bit, bool useControl2 = false, int ch = -1); - void SetDPPAlgorithmControlBit(unsigned int bitValue, unsigned int bitLength, unsigned int bitSmallestPos, bool useControl2 = false, int ch = -1); - void SetTrapezoidRescaling(unsigned int rightShiftBits, int ch = -1); /// DPPAlgoritmControl bit-0:5 - void SetPeakSampling(unsigned int bit, int ch = -1); /// DPPAlgoritmControl bit-10:11 - void SetPulsePolarity(bool PositiveIsZero, int ch = -1); /// DPPAlgoritmControl bit-16 - void SetBaselineSampling(unsigned int bit, int ch = -1); /// DPPAlgoritmControl bit-20:22 - void SetRollOverFlag(bool isRollOver, int ch = -1); /// DPPAlgoritmControl bit-26 - void SetPileUpFlag(bool isPileUpFlag, int ch = -1); /// DPPAlgoritmControl bit-27 + void SetBits(uint32_t address, unsigned int bitValue, unsigned int bitLength, unsigned int bitSmallestPos, int ch = -1); + void SetDPPAlgorithmControl(uint32_t bit, int ch = -1); - //int SetChannelParity(int ch, bool isPositive); - //int SetChannelThreshold(int ch, string folder, int threshold); - //int SetInputDynamicRange(int ch, string folder, int dyRange); - - int SetAcqMode(string mode); + int SetAcqMode(string list_mixed); ///================ Get Settings int GetSerialNumber() {return BoardInfo.SerialNumber;} @@ -126,14 +77,11 @@ class Digitizer{ float GetCh2ns() {return ch2ns;} int GetNChannel() {return NChannel;} - int GetChTemperature(int ch) ; - void PrintBoardConfiguration(); uint32_t GetChannelStatus(unsigned int ch); - ///================ ACQ control void StopACQ(); void StartACQ(); @@ -150,8 +98,8 @@ class Digitizer{ unsigned int ADCFullSize; /// pow(2, ADCbits) - 1 float ch2ns; /// channel to ns CAEN_DGTZ_BoardInfo_t BoardInfo; + uint32_t DPPControl2Adress; - ///----- adjustable parameters uint32_t VMEBaseAddress; /// For direct USB or Optical-link connection, VMEBaseAddress must be 0 CAEN_DGTZ_ConnectionType LinkType; @@ -159,697 +107,15 @@ class Digitizer{ CAEN_DGTZ_DPP_AcqMode_t AcqMode; uint32_t channelMask ; /// the channel mask from NChannel - DigitizerChannelSetting setting[MaxNChannels]; - ///------- other parameters int ret; /// return value, refer to CAEN_DGTZ_ErrorCode bool isConnected; ///========== - virtual int ProgramBoard(); + virtual int ProgramBoard(); void ErrorMsg(string header = ""); }; -//========================================== methods -Digitizer::Digitizer(){ - - portID = -1; - boardID = -1; - handle = -1; - NChannel = 0; - ADCbits = 1; - ch2ns = 0; - BoardInfo = {}; - - channelMask = 0xFFFF; - for( int ch = 0; ch < MaxNChannels ; ch ++ ) { - setting[ch] = {}; - setting[ch].recordLength = 2000; - setting[ch].EventAggr = 0; - } - ret = -1; - - isConnected = false; - - VMEBaseAddress = 0; - LinkType = CAEN_DGTZ_USB; /// default USB - IOlev = CAEN_DGTZ_IOLevel_NIM; ///default NIM - - AcqMode = CAEN_DGTZ_DPP_ACQ_MODE_List; ///default list mode - -} - -Digitizer::Digitizer(int boardID, int portID){ - Digitizer(); - OpenDigitizer(boardID, portID); -} - -Digitizer::~Digitizer(){ - CloseDigitizer(); -} - -void Digitizer::Reset(){ - ret = CAEN_DGTZ_Reset(handle); - if( ret != 0 ) ErrorMsg("Reset"); -} - -int Digitizer::OpenDigitizer(int boardID, int portID){ - - this->boardID = boardID; - this->portID = portID; - - /***************************************************/ - /** Open the digitizer and read board information */ - /***************************************************/ - - printf("============= Opening Digitizer at Board %d, Port %d \n", boardID, portID); - - ///-------- try USB first - LinkType = CAEN_DGTZ_USB; /// Link Type - ret = (int) CAEN_DGTZ_OpenDigitizer(LinkType, boardID, 0, VMEBaseAddress, &handle); - if (ret != 0){ ///---------- try Optical link - LinkType = CAEN_DGTZ_OpticalLink ; - ret = (int) CAEN_DGTZ_OpenDigitizer(LinkType, portID, boardID, VMEBaseAddress, &handle); - } - - if (ret != 0) { - printf("Can't open digitizer\n"); - }else{ - ///----- Getting Board Info - ret = (int) CAEN_DGTZ_GetInfo(handle, &BoardInfo); - if (ret != 0) { - printf("Can't read board info\n"); - }else{ - isConnected = true; - printf("Connected to Model %s with handle %d using %s\n", BoardInfo.ModelName, handle, LinkType == CAEN_DGTZ_USB ? "USB" : "Optical Link"); - NChannel = BoardInfo.Channels; - channelMask = pow(2, NChannel)-1; - switch(BoardInfo.Model){ - case CAEN_DGTZ_V1730: ch2ns = 2.0; break; ///ns -> 500 MSamples/s - case CAEN_DGTZ_V1725: ch2ns = 4.0; break; ///ns -> 250 MSamples/s - } - printf("Sampling rate : %.0f MHz = %.1f ns \n", 1000/ch2ns, ch2ns); - printf("Number of Channels : %d = 0x%X\n", NChannel, channelMask); - printf("SerialNumber :\e[1m\e[33m %d\e[0m\n", BoardInfo.SerialNumber); - ADCbits = BoardInfo.ADC_NBits; - ADCFullSize = (unsigned int)( pow(2, ADCbits) -1 ); - printf("ADC bit is \e[33m%d\e[0m, %d = 0x%x\n", ADCbits, ADCFullSize, ADCFullSize); - printf("ROC FPGA Release is %s\n", BoardInfo.ROC_FirmwareRel); - printf("AMC FPGA Release is %s\n", BoardInfo.AMC_FirmwareRel); - - int DPPType; - sscanf(BoardInfo.AMC_FirmwareRel, "%d", &DPPType); - if (DPPType != V1730_DPP_PHA_CODE) { - printf("This digitizer does not have DPP-PHA firmware\n"); - } - } - } - - // Check firmware revision (DPP firmwares cannot be used with this demo */ - sscanf(BoardInfo.AMC_FirmwareRel, "%d", &DPPType); - if (DPPType >= 128) { - printf("\t==== This digitizer has a DPP firmware!\n"); - printf("\e[32m"); - switch (DPPType){ - case 0x80: printf("\tDPP-PHA for x724 boards \n"); break; - case 0x82: printf("\tDPP-CI for x720 boards \n"); break; - case 0x83: printf("\tDPP-PSD for x720 boards \n"); break; - case 0x84: printf("\tDPP-PSD for x751 boards \n"); break; - case 0x85: printf("\tDPP-ZLE for x751 boards \n"); break; - case 0x86: printf("\tDPP-PSD for x743 boards \n"); break; - case 0x87: printf("\tDPP-QDC for x740 boards \n"); break; - case 0x88: printf("\tDPP-PSD for x730 boards \n"); break; - case 0x8B: printf("\tDPP-PHA for x730 boards \n"); break; - case 0x8C: printf("\tDPP-ZLE for x730 boards \n"); break; - case 0x8D: printf("\tDPP-DAW for x730 boards \n"); break; - } - printf("\e[0m"); - } - - int probes[MAX_SUPPORTED_PROBES]; - int numProbes; - ret = CAEN_DGTZ_GetDPP_SupportedVirtualProbes(handle, 1, probes, &numProbes); - printf("\t==== supported virtual probe (number of Probe : %d)\n", numProbes); - for( int i = 0 ; i < numProbes; i++){ - switch (probes[i]){ - case 0: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_Input\n"); break; - case 1: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_Delta\n"); break; - case 2: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_Delta2\n"); break; - case 3: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_Trapezoid\n"); break; - case 4: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_TrapezoidReduced\n"); break; - case 5: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_Baseline\n"); break; - case 6: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_Threshold\n"); break; - case 7: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_CFD\n"); break; - case 8: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_SmoothedInput\n"); break; - case 9: printf("\t\t CAEN_DGTZ_DPP_VIRTUALPROBE_None\n"); break; - case 10: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_TRGWin\n"); break; - case 11: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_Armed\n"); break; - case 12: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_PkRun\n"); break; - case 13: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_Peaking\n"); break; - case 14: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_CoincWin\n"); break; - case 15: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_BLHoldoff\n"); break; - case 16: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_TRGHoldoff\n"); break; - case 17: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_TRGVal\n"); break; - case 18: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_ACQVeto\n"); break; - case 19: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_BFMVeto\n"); break; - case 20: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_ExtTRG\n"); break; - case 21: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_OverThr\n"); break; - case 22: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_TRGOut\n"); break; - case 23: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_Coincidence \n"); break; - case 24: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_PileUp \n"); break; - case 25: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_Gate \n"); break; - case 26: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_GateShort \n"); break; - case 27: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_Trigger \n"); break; - case 28: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_None \n"); break; - case 29: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_BLFreeze \n"); break; - case 30: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_Busy \n"); break; - case 31: printf("\t\t CAEN_DGTZ_DPP_DIGITALPROBE_PrgVeto \n"); break; - } - } - - ErrorMsg("end of OpenDigitizer"); - - if( isConnected ) { - ProgramBoard(); - } - - return ret; -} - -int Digitizer::CloseDigitizer(){ - - printf("-------- Closing Digtizer Board : %d Port : %d \n", boardID, portID); - printf(" Model %s with handle %d using %s\n", BoardInfo.ModelName, handle, LinkType == CAEN_DGTZ_USB ? "USB" : "Optical Link"); - ret = CAEN_DGTZ_SWStopAcquisition(handle); - ret |= CAEN_DGTZ_CloseDigitizer(handle); - - return ret; -} - -void Digitizer::ErrorMsg(string header){ - switch (ret){ - case CAEN_DGTZ_Success : /** 0 */ printf("%s | Operation completed successfully.\n", header.c_str()); break; - case CAEN_DGTZ_CommError : /** -1 */ printf("%s | Communication Error.\n", header.c_str()); break; - case CAEN_DGTZ_GenericError : /** -2 */ printf("%s | Unspecified error.\n", header.c_str()); break; - case CAEN_DGTZ_InvalidParam : /** -3 */ printf("%s | Invalid parameter.\n", header.c_str()); break; - case CAEN_DGTZ_InvalidLinkType : /** -4 */ printf("%s | Invalid Link Type.\n", header.c_str()); break; - case CAEN_DGTZ_InvalidHandle : /** -5 */ printf("%s | Invalid device handler.\n", header.c_str()); break; - case CAEN_DGTZ_MaxDevicesError : /** -6 */ printf("%s | Maximum number of devices exceeded.\n", header.c_str()); break; - case CAEN_DGTZ_BadBoardType : /** -7 */ printf("%s | Operation not allowed on this type of board.\n", header.c_str()); break; - case CAEN_DGTZ_BadInterruptLev : /** -8 */ printf("%s | The interrupt level is not allowed.\n", header.c_str()); break; - case CAEN_DGTZ_BadEventNumber : /** -9 */ printf("%s | The event number is bad.\n", header.c_str()); break; - case CAEN_DGTZ_ReadDeviceRegisterFail : /** -10 */ printf("%s | Unable to read the registry.\n", header.c_str()); break; - case CAEN_DGTZ_WriteDeviceRegisterFail : /** -11 */ printf("%s | Unable to write the registry.\n", header.c_str()); break; - case CAEN_DGTZ_InvalidChannelNumber : /** -13 */ printf("%s | The channel number is invalid.\n", header.c_str()); break; - case CAEN_DGTZ_ChannelBusy : /** -14 */ printf("%s | The channel is busy.\n", header.c_str()); break; - case CAEN_DGTZ_FPIOModeInvalid : /** -15 */ printf("%s | Invalid FPIO mode.\n", header.c_str()); break; - case CAEN_DGTZ_WrongAcqMode : /** -16 */ printf("%s | Wrong Acquistion mode.\n", header.c_str()); break; - case CAEN_DGTZ_FunctionNotAllowed : /** -17 */ printf("%s | This function is not allowed on this module.\n", header.c_str()); break; - case CAEN_DGTZ_Timeout : /** -18 */ printf("%s | Communication Timeout.\n", header.c_str()); break; - case CAEN_DGTZ_InvalidBuffer : /** -19 */ printf("%s | The buffer is invalid.\n", header.c_str()); break; - case CAEN_DGTZ_EventNotFound : /** -20 */ printf("%s | The event is not found.\n", header.c_str()); break; - case CAEN_DGTZ_InvalidEvent : /** -21 */ printf("%s | The event is invalid.\n", header.c_str()); break; - case CAEN_DGTZ_OutOfMemory : /** -22 */ printf("%s | Out of memory.\n", header.c_str()); break; - case CAEN_DGTZ_CalibrationError : /** -23 */ printf("%s | Unable to calibrate the board.\n", header.c_str()); break; - case CAEN_DGTZ_DigitizerNotFound : /** -24 */ printf("%s | Unbale to open the digitizer.\n", header.c_str()); break; - case CAEN_DGTZ_DigitizerAlreadyOpen : /** -25 */ printf("%s | The digitizer is already open.\n", header.c_str()); break; - case CAEN_DGTZ_DigitizerNotReady : /** -26 */ printf("%s | The digitizer is not ready.\n", header.c_str()); break; - case CAEN_DGTZ_InterruptNotConfigured : /** -27 */ printf("%s | The digitizer has no IRQ configured.\n", header.c_str()); break; - case CAEN_DGTZ_DigitizerMemoryCorrupted: /** -28 */ printf("%s | The digitizer flash memory is corrupted.\n", header.c_str()); break; - case CAEN_DGTZ_DPPFirmwareNotSupported : /** -29 */ printf("%s | The digitier DPP firmware is not supported in this lib version.\n", header.c_str()); break; - case CAEN_DGTZ_InvalidLicense : /** -30 */ printf("%s | Invalid firmware licence.\n", header.c_str()); break; - case CAEN_DGTZ_InvalidDigitizerStatus : /** -31 */ printf("%s | The digitizer is found in a corrupted status.\n", header.c_str()); break; - case CAEN_DGTZ_UnsupportedTrace : /** -32 */ printf("%s | The given trace is not supported.\n", header.c_str()); break; - case CAEN_DGTZ_InvalidProbe : /** -33 */ printf("%s | The given probe is not supported.\n", header.c_str()); break; - case CAEN_DGTZ_UnsupportedBaseAddress : /** -34 */ printf("%s | The base address is not supported.\n", header.c_str()); break; - case CAEN_DGTZ_NotYetImplemented : /** -99 */ printf("%s | The function is not yet implemented.\n", header.c_str()); break; - } - -} - -void Digitizer::PrintBoardConfiguration(){ - uint32_t * value = new uint32_t[1]; - CAEN_DGTZ_ReadRegister(handle, (uint32_t) Register::BoardConfiguration, value); - printf(" 32 28 24 20 16 12 8 4 0\n"); - printf(" | | | | | | | | |\n"); - cout <<" Board Configuration : 0b" << bitset<32>(value[0]) << endl; - printf(" Bit[ 0] = Auto Data Flush \n"); - printf(" Bit[16] = WaveForm Recording \n"); - printf(" Bit[17] = Extended Time Tag \n"); - printf(" Bit[18] = Record Time Stamp \n"); - printf(" Bit[19] = Record Energy \n"); - printf("====================================== \n"); -} - -int Digitizer::ProgramBoard(){ - - ret = CAEN_DGTZ_Reset(handle); - if (ret) { - printf("ERROR: can't reset the digitizer.\n"); - return -1; - } - - /// Board Configuration without PHA or PSD fireware - ///bx0000 0000 0000 0000 0000 0000 0001 0000 = - /// | | +- (1) trigger overlap not allowed - /// | +- (3) test pattern disable - /// + (6) Self-trigger polarity, 1 = negative, 0 = Positive - ret = CAEN_DGTZ_WriteRegister(handle, (uint32_t) Register::BoardConfiguration , 0x000E0114); /// Channel Control Reg (indiv trg, seq readout) ?? - - /// Set the I/O level (CAEN_DGTZ_IOLevel_NIM or CAEN_DGTZ_IOLevel_TTL) - ret |= CAEN_DGTZ_SetIOLevel(handle, IOlev); - - /// Set the enabled channels - ret |= CAEN_DGTZ_SetChannelEnableMask(handle, channelMask); - - /// Set the number of samples for each waveform - SetRecordLength(2000); /// default 2000 ch - ///ret |= CAEN_DGTZ_SetRecordLength(handle, recordLength); - - /// Set how many events to accumulate in the board memory before being available for readout - SetEventAggregation(0); - ///ret |= CAEN_DGTZ_SetDPPEventAggregation(handle, EventAggr, 0); - - /// Set the digitizer acquisition mode (CAEN_DGTZ_SW_CONTROLLED or CAEN_DGTZ_S_IN_CONTROLLED) - ret |= CAEN_DGTZ_SetAcquisitionMode(handle, CAEN_DGTZ_SW_CONTROLLED); /// software command - ret |= CAEN_DGTZ_SetDPPAcquisitionMode(handle, AcqMode, CAEN_DGTZ_DPP_SAVE_PARAM_EnergyAndTime); - - /** Set the digitizer's behaviour when an external trigger arrives: - CAEN_DGTZ_TRGMODE_DISABLED: do nothing - CAEN_DGTZ_TRGMODE_EXTOUT_ONLY: generate the Trigger Output signal - CAEN_DGTZ_TRGMODE_ACQ_ONLY = generate acquisition trigger - CAEN_DGTZ_TRGMODE_ACQ_AND_EXTOUT = generate both Trigger Output and acquisition trigger - see CAENDigitizer user manual, chapter "Trigger configuration" for details */ - ret |= CAEN_DGTZ_SetExtTriggerInputMode(handle, CAEN_DGTZ_TRGMODE_ACQ_ONLY); - - /** Set the mode used to syncronize the acquisition between different boards. - In this example the sync is disabled */ - ret |= CAEN_DGTZ_SetRunSynchronizationMode(handle, CAEN_DGTZ_RUN_SYNC_Disabled); - - if (ret) { - ErrorMsg("End of ProgramBoard"); - return ret; - } else { - return 0; - } -} - -//=========================================================== -void Digitizer::WriteRegister(uint32_t address, uint32_t value, int ch ){ - if( ch < 0 ) { - ret = CAEN_DGTZ_WriteRegister(handle, address + 0x7000, value); - }else{ - ret = CAEN_DGTZ_WriteRegister(handle, address + (ch<<8), value); - } - if( ret != 0 ) ErrorMsg("WriteRegister"); -} - -uint32_t Digitizer::ReadRegister(uint32_t address, unsigned int ch = 0){ - uint32_t * Data = new uint32_t[NChannel]; - if( ch < 0 ) { - ret = CAEN_DGTZ_ReadRegister(handle, address + 0x7000, Data); - }else{ - ret = CAEN_DGTZ_ReadRegister(handle, address + (ch << 8), Data); - } - if( ret != 0 ) ErrorMsg("ReadRegister"); - ///printf("ch = %2d | %d \n", ch, Data[0]); - return Data[0]; -} - -void Digitizer::SetChannelMask(uint32_t mask){ - channelMask = mask; - ret |= CAEN_DGTZ_SetChannelEnableMask(handle, channelMask); - if( ret != 0 ) ErrorMsg("SetChannelMask"); -} - -void Digitizer::SetRecordLength(unsigned int lenght, int ch){ - if ( ch < 0 ){ - for( int i = 0; i < MaxNChannels; i++ ) setting[i].recordLength = min((int)lenght, MaxRecordLength ); - ret |= CAEN_DGTZ_SetRecordLength(handle, lenght); - }else{ - setting[ch].recordLength = min((int)lenght, MaxRecordLength ); - WriteRegister((uint32_t) RegisterDPP::RecordLength, setting[ch].recordLength, ch); - } - if( ret != 0 ) ErrorMsg("SetRecordLength"); -} - -void Digitizer::SetEventAggregation(unsigned int numEvent, int ch){ - if( ch < 0 ){ - for( int i = 0; i < MaxNChannels; i++ ) setting[i].EventAggr = numEvent; - ret |= CAEN_DGTZ_SetDPPEventAggregation(handle, numEvent, 0); - }else{ - setting[ch].EventAggr = numEvent; - WriteRegister((uint32_t) RegisterDPP::NumberEventsPerAggregate, numEvent, ch); - } - if( ret != 0 ) ErrorMsg("SetEventAggregation"); -} - -void Digitizer::SetInputDynamicRange(unsigned int TwoVol_0_or_halfVol_1, int ch){ - if( ch < 0 ) { - for( int i = 0; i < MaxNChannels; i++) setting[i].dynamicRange = TwoVol_0_or_halfVol_1; - }else{ - setting[ch].dynamicRange = TwoVol_0_or_halfVol_1; - } - WriteRegister((uint32_t) Register::InputDynamicRange, TwoVol_0_or_halfVol_1, ch); - if( ret != 0 ) ErrorMsg("SetInputDynamicRange"); -} - -void Digitizer::SetNumSamplePreTrigger(unsigned int nSample, int ch){ - if( ch < 0 ) { - for( int i = 0; i < MaxNChannels; i++) setting[i].preTrigger = nSample; - }else{ - setting[ch].preTrigger = nSample; - } - WriteRegister((uint32_t) RegisterDPP::PreTrigger, nSample, ch); - if( ret != 0 ) ErrorMsg("SetNumSamplePreTrigger"); -} - -void Digitizer::SetDCOffset(float offsetPrecentage, int ch){ - if( ch < 0 ) { - for( int i = 0; i < MaxNChannels; i++) setting[i].DCOffsetPrecentage = offsetPrecentage; - }else{ - setting[ch].DCOffsetPrecentage = offsetPrecentage; - } - WriteRegister((uint32_t) RegisterDPP::ChannelDCOffset, uint( ADCFullSize * offsetPrecentage), ch ); - if( ret != 0 ) ErrorMsg("SetDCOffset"); -} - -void Digitizer::SetVetoWidth(uint32_t bit, int ch){ - if( ch < 0 ) { - for( int i = 0; i < MaxNChannels; i++) setting[i].VetoWidth = bit; - }else{ - setting[ch].VetoWidth = bit; - } - WriteRegister((uint32_t) RegisterDPP::VetoWidth, bit, ch); - if( ret != 0 ) ErrorMsg("SetVetoWidth"); -} - -void Digitizer::SetTriggerPolarity(bool RiseingIsZero, int ch ){ - if( ch < 0 ) { - ret = 0; - for (int i = 0; i < NChannel; i++){ - setting[i].triggerPolarity = RiseingIsZero; - ret |= CAEN_DGTZ_SetTriggerPolarity(handle, i, CAEN_DGTZ_TriggerPolarity_t(RiseingIsZero)); - } - }else{ - setting[ch].triggerPolarity = RiseingIsZero; - ret = CAEN_DGTZ_SetTriggerPolarity(handle, ch, CAEN_DGTZ_TriggerPolarity_t(RiseingIsZero)); - } - if( ret != 0 ) ErrorMsg("SetTriggerPolarity"); -} - -//============================== DPP-Alpgorthm Control -void Digitizer::SetDPPAlgorithmControl(uint32_t bit, bool useControl2, int ch){ - ///============= DPP algorithm control is 32 bit - /// [ 0: 5] Trapazoid Rescaling. the trapazoid ADC is 48 bit. it need to bit-shift before the 0x3FFF (14 bit filter) - /// [ 8: 9] Decimation. 00 = disable, 01 = 2 samples, 10 = 4 samples, 11 = 8 sample - /// [10:11] Decimation Gain. This gain apply to the Trapazoid Rescaling and fine gain - /// [12:13] Peak Mean. sample for averaging the trapezoid height calculation. 00 = 1 sample, 01 = 4 samples, 10 = 16 sample, 11 = 64 sample - /// [16] pulse polarity. 0 = positve, 1 = negative - /// [18:19] Trigger mode. 00 = normal, 01 = coincident, 10 = reserved. 11 = anti coincident - /// [20:22] number of samples for the baseline average calculation. 000 = baseline disable (energy not subtraced with baseline) - /// 001 = 16 samples - /// 010 = 64 samples - /// 011 = 256 samples - /// 100 = 1024 samples - /// 101 = 4096 samples - /// 110 = 16384 samples - /// 111 = resertved. - /// [24] Disable self trigger. 0 = self‐trigger used to acquire and propagated to the trigger logic; - /// 1 = self‐trigger only propagated to the trigger logic. - /// [26] Enable Roll-Over flag. see manual 0 = disable, 1 = enable - /// [27] Enable pile-up flag. - - ///============= PHA - DPP algorithm control 2 is 32 bit - /// [ 0: 1] Local Shaped Trigger mode. see manual - /// [ 2] Enable Local Shaped Trigger - /// [ 4: 5] Local Trigger Validation mode, see manual - /// [ 6] Enable Local Trigger Validation - /// [ 8:10] Extra 2 word option. 000 = [0:15] baseline *4 [16:31] extended time stamp - /// 001 = reserved - /// 010 = [0:15] fine time stamp [16:31] extended time stamp - /// 011 = reserved - /// 100 = [0:15] total tigger counter [16:31] Lost trigger counter - /// 101 = [0:15] event after the zero crosiing [16:31] event before zero crossing - /// 110, 111 = reserved. - /// [14:15] source of veto. 00 = disable, 01 veto is common to all channels, 10 = veto for coupled channels, 11 = veto comes from negative saturation - /// [16:17] Select the step for the trigger counter rate flag. see manual - /// [18] baseline calculation is active also when the acquisition is not running. 0 = disbale, 1 = enable - /// [19] Tag correlated events. see manual 0 = disbale, 1 = enable - /// [29] Enable the optimization of the Baseline Restorer to avoid tails in the energy peaks. 0 = disbale, 1 = enable - - uint32_t address = (uint32_t) RegisterDPP::DPPAlgorithmControl; - if( useControl2 == true) { - if (DPPType == 0x88) address = (uint32_t) RegisterPSD::DPPAlgorithmControl2; - if (DPPType == 0x8B) address = (uint32_t) RegisterPHA::DPPAlgorithmControl2; - if (DPPType != 0x88 && DPPType != 0x8B ) { - printf(" DPP version is nto PSD or PHA, not supported. \n"); - return; - } - } - - if (ch < 0 ){ - for( int i = 0; i < MaxNChannels; i++) setting[i].DPPAlgorithmControl = bit; - WriteRegister( address, bit); - }else{ - setting[ch].DPPAlgorithmControl = bit; - WriteRegister( address, bit, ch); - } - if( ret != 0 ) ErrorMsg("SetDPPAlgorithmControl"); -} - -void Digitizer::SetDPPAlgorithmControlBit(unsigned int bitValue, unsigned int bitLength, unsigned int bitSmallestPos, bool useControl2, int ch){ - uint32_t address = (uint32_t) RegisterDPP::DPPAlgorithmControl; - if( useControl2 == true){ - if (DPPType == 0x88) address = (uint32_t) RegisterPSD::DPPAlgorithmControl2; - if (DPPType == 0x8B) address = (uint32_t) RegisterPHA::DPPAlgorithmControl2; - if (DPPType != 0x88 && DPPType != 0x8B ) { - printf(" DPP version is nto PSD or PHA, not supported. \n"); - return; - } - } - uint32_t bit ; - uint32_t bitmask = (uint(pow(2, bitLength)-1) << bitSmallestPos); - if (ch < 0 ){ - /// take ch-0 - bit = ReadRegister(address, 0); - bit = (bit & ~bitmask) | (bitValue << bitSmallestPos); - for( int i = 0; i < MaxNChannels; i++) setting[i].DPPAlgorithmControl = bit; - }else{ - bit = ReadRegister(address, ch); - bit = (bit & ~bitmask) | (bitValue << bitSmallestPos); - setting[ch].DPPAlgorithmControl = bit; - } - WriteRegister(address, bit, ch); - if( ret != 0 ) ErrorMsg("SetDPPAlgorithmControlBit"); -} - -void Digitizer::SetTrapezoidRescaling(unsigned int rightShiftBits, int ch ){ - SetDPPAlgorithmControlBit(rightShiftBits, 5, 0, false, ch); - if( ret != 0 ) ErrorMsg("SetTrapezoidRescaling"); -} - -void Digitizer::SetPeakSampling(unsigned int bit, int ch){ - if (ch < 0 ){ - for( int i = 0; i < MaxNChannels; i++) setting[i].peakSampling = bit; - }else{ - setting[ch].peakSampling = bit; - } - SetDPPAlgorithmControlBit(bit, 2, 12, false, ch); - if( ret != 0 ) ErrorMsg("SetPeakSampling"); -} - -void Digitizer::SetPulsePolarity(bool PositiveIsZero, int ch){ - if (ch < 0 ){ - for( int i = 0; i < MaxNChannels; i++) setting[i].pulsePolarity_DPP = PositiveIsZero; - }else{ - setting[ch].pulsePolarity_DPP = PositiveIsZero; - } - SetDPPAlgorithmControlBit(PositiveIsZero, 1, 16, false, ch); - if( ret != 0 ) ErrorMsg("SetPulsePolarity"); -} - -void Digitizer::SetBaselineSampling(unsigned int bit, int ch){ - if (ch < 0 ){ - for( int i = 0; i < MaxNChannels; i++) setting[i].baselineSampling = bit; - }else{ - setting[ch].baselineSampling = bit; - } - SetDPPAlgorithmControlBit(bit, 2, 20, false, ch); - if( ret != 0 ) ErrorMsg("SetBaselineSampling"); -} - -void Digitizer::SetRollOverFlag(bool isRollOver, int ch){ - if (ch < 0 ){ - for( int i = 0; i < MaxNChannels; i++) setting[i].rollOverFlag = isRollOver; - }else{ - setting[ch].rollOverFlag = isRollOver; - } - SetDPPAlgorithmControlBit(isRollOver, 1, 26, false, ch); - if( ret != 0 ) ErrorMsg("SetRollOverFlag"); -} - -void Digitizer::SetPileUpFlag(bool isPileUpFlag, int ch){ - if (ch < 0 ){ - for( int i = 0; i < MaxNChannels; i++) setting[i].pileUpFlag = isPileUpFlag; - }else{ - setting[ch].pileUpFlag = isPileUpFlag; - } - SetDPPAlgorithmControlBit(isPileUpFlag, 1, 27, false, ch); - if( ret != 0 ) ErrorMsg("SetPileUpFlag"); -} - - -int Digitizer::SetAcqMode(string mode){ - - return ret; -} - - -int Digitizer::GetChTemperature(int ch){ - - if( BoardInfo.Model != CAEN_DGTZ_V1730 && - BoardInfo.Model != CAEN_DGTZ_V1725 && - BoardInfo.Model != CAEN_DGTZ_V1751 ) return -404; - - uint32_t * temp; - ret |= CAEN_DGTZ_ReadTemperature(handle, ch, temp); - if( ret != 0 ) ErrorMsg("GetChTemperature"); - return temp[0]; -} - -//################################################################ - -class DigitizerPHA : public Digitizer { - - public: - DigitizerPHA(); - DigitizerPHA(int boardID, int portID = 0); - ~DigitizerPHA(); - - int ProgramBoard(); - - void GetChannelSetting(int ch); - -}; - -DigitizerPHA::DigitizerPHA(){ - -} - -DigitizerPHA::DigitizerPHA(int boardID, int portID){ - OpenDigitizer(boardID, portID); -} - -DigitizerPHA::~DigitizerPHA(){ - -} - -int DigitizerPHA::ProgramBoard(){ - - /// Board Configuration for PHA - ///bx0000 0000 0000 1110 0000 0001 0001 0100 = - /// | | |||| | | | | ||+- (0) automatic data flush, 0 = disable - /// | | |||| | | | | |+- (1) decimated smae of waveform, 0 = disable - /// | | |||| | | | | +- (2) trigger propagation, required in case of coincident trigger - /// | | |||| | | | +- (8) indivual trigger: must be 1 - /// | | |||| | | + (11) dual trace. use 12:13 bit and 14:15 bit for choice of trace. but the trace recorded in half ADC frequency. - /// | | |||| | + (12:13) Analog Probe 1, 00 = input, 01 = input 1st derivative, 10 = input 2nd derivative, 11 = Trapezoid - /// | | |||| + (14:15) Analog Probe 2, 00 = input, 01 = threshold, 10 = Trapezoid - Baseline, 11 = baseline - /// | | |||+ (16) Waveform recording, 0 = disable, 1 = enable - /// | | ||+ (17) Enable Extra 2, i.e. 64 bit timestamp - /// | | |+ (18) time stamp recording: must be 1 - /// | | + (19) peak recording: must be 1 - /// | + (20:23) Digital Virtual probe 1: in mixed mode, virual probe can be enabled. See manual - /// + (26:28) Digitial Virtual probe 2 - - ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t) Register::BoardConfiguration , 0x000E0114); /// Channel Control Reg (indiv trg, seq readout) ?? - - ErrorMsg("PHA-ProgramBoard"); - return ret; -} - - -void DigitizerPHA::GetChannelSetting(int ch){ - - uint32_t * value = new uint32_t[NChannel]; - printf("\e[33m================================================\n"); - printf("================ Getting setting for channel %d \n", ch); - printf("================================================\e[0m\n"); - ///DPP algorithm Control - CAEN_DGTZ_ReadRegister(handle, 0x1080 + (ch << 8), value); - printf(" 32 28 24 20 16 12 8 4 0\n"); - printf(" | | | | | | | | |\n"); - cout <<" DPP algorithm Control : 0b" << bitset<32>(value[0]) << endl; - - int trapRescaling = int(value[0]) & 31 ; - int polarity = int(value[0] >> 16); /// in bit[16] - int baseline = int(value[0] >> 20) ; /// in bit[22:20] - int NsPeak = int(value[0] >> 12); /// in bit[13:12] - ///DPP algorithm Control 2 - CAEN_DGTZ_ReadRegister(handle, 0x10A0 + (ch << 8), value); - cout <<" DPP algorithm Control 2: 0b" << bitset<32>(value[0]) << endl; - - printf("* = multiple of 8 \n"); - printf("** = multiple of 16 \n"); - - printf("==========----- input \n"); - CAEN_DGTZ_ReadRegister(handle, 0x1020 + (ch << 8), value); printf("%20s %d ch \n", "Record Length", value[0] * 8); ///Record length - CAEN_DGTZ_ReadRegister(handle, 0x1038 + (ch << 8), value); printf("%20s %d ch \n", "Pre-tigger", value[0] * 4); ///Pre-trigger - printf("%20s %s \n", "polarity", (polarity & 1) == 0 ? "Positive" : "negative"); ///Polarity - printf("%20s %.0f sample \n", "Ns baseline", pow(4, 1 + baseline & 7)); ///Ns baseline - CAEN_DGTZ_ReadRegister(handle, 0x1098 + (ch << 8), value); printf("%20s %.2f %% of %d\n", "DC offset", value[0] * 100./ ADCFullSize, ADCFullSize); ///DC offset - CAEN_DGTZ_ReadRegister(handle, 0x1028 + (ch << 8), value); printf("%20s %.1f Vpp \n", "input Dynamic", value[0] == 0 ? 2 : 0.5); ///InputDynamic - - printf("==========----- discriminator \n"); - CAEN_DGTZ_ReadRegister(handle, 0x106C + (ch << 8), value); printf("%20s %d LSB\n", "Threshold", value[0]); ///Threshold - CAEN_DGTZ_ReadRegister(handle, 0x1074 + (ch << 8), value); printf("%20s %d ch \n", "trigger hold off *", value[0] * 8); ///Trigger Hold off - CAEN_DGTZ_ReadRegister(handle, 0x1054 + (ch << 8), value); printf("%20s %d sample \n", "Fast Dis. smoothing", value[0] ); ///Fast Discriminator smoothing - CAEN_DGTZ_ReadRegister(handle, 0x1058 + (ch << 8), value); printf("%20s %.1f ns \n", "Input rise time **", value[0] * 8 * ch2ns); ///Input rise time - - printf("==========----- Trapezoid \n"); - CAEN_DGTZ_ReadRegister(handle, 0x1080 + (ch << 8), value); printf("%20s %d bit = Floor( rise x decay / 64 )\n", "Trap. Rescaling", trapRescaling ); ///Trap. Rescaling Factor - CAEN_DGTZ_ReadRegister(handle, 0x105C + (ch << 8), value); printf("%20s %.1f ns \n", "Trap. rise time **", value[0] * 8 * ch2ns ); ///Trap. rise time, 2 for 1 ch to 2ns - CAEN_DGTZ_ReadRegister(handle, 0x1060 + (ch << 8), value); - int flatTopTime = value[0] * 8 * ch2ns; printf("%20s %d ns \n", "Trap. flat time **", flatTopTime); ///Trap. flat time - CAEN_DGTZ_ReadRegister(handle, 0x1068 + (ch << 8), value); printf("%20s %.1f ns \n", "Decay time **", value[0] * 8 * ch2ns); ///Trap. pole zero - CAEN_DGTZ_ReadRegister(handle, 0x1064 + (ch << 8), value); printf("%20s %.1f ns = %.2f %% \n", "peaking time **", value[0] * 8 * ch2ns, value[0] * 800. * ch2ns / flatTopTime ); //Peaking time - printf("%20s %.0f sample\n", "Ns peak", pow(4, NsPeak & 3)); //Ns peak - CAEN_DGTZ_ReadRegister(handle, 0x1078 + (ch << 8), value); printf("%20s %.1f ns \n", "Peak hole off **", value[0] * 8 *ch2ns ); ///Peak hold off - - printf("==========----- Other \n"); - CAEN_DGTZ_ReadRegister(handle, 0x10C4 + (ch << 8), value); printf("%20s %d \n", "Energy fine gain ?", value[0]); ///Energy fine gain - - printf("========================================= end of ch-%d\n", ch); - -} - -//################################################################ - -class DigitizerPSD : public Digitizer { - public: - DigitizerPSD(); - DigitizerPSD(int boardID, int portID = 0); - ~DigitizerPSD(); - - //int ProgramBoard(); - // - //void GetChannelSetting(int ch); - -}; - - -DigitizerPSD::DigitizerPSD(){ - -} - -DigitizerPSD::DigitizerPSD(int boardID, int portID){ - OpenDigitizer(boardID, portID); -} - -DigitizerPSD::~DigitizerPSD(){ - -} #endif diff --git a/DigitizerPHA.cpp b/DigitizerPHA.cpp new file mode 100644 index 0000000..ff557e1 --- /dev/null +++ b/DigitizerPHA.cpp @@ -0,0 +1,173 @@ +#include "DigitizerPHA.h" + +DigitizerPHA::DigitizerPHA(){ + +} + +DigitizerPHA::DigitizerPHA(int boardID, int portID){ + OpenDigitizer(boardID, portID); +} + +DigitizerPHA::~DigitizerPHA(){ + +} + +int DigitizerPHA::ProgramBoard(){ + /// Set trigger propagation + /// Set analog probe 1 to input + /// Set analog probe 2 to Tranpedoiz - Baseline + /// disable waveform recording + /// enable extrac 2 word + /// record time stamp + /// record energy + /// digitial virtual probe 1 = Peaking + /// digitial virtual probe 2 = trigger + ret |= CAEN_DGTZ_WriteRegister(handle, Register::BoardConfiguration , 0x000E8114); /// Channel Control Reg (indiv trg, seq readout) ?? + ErrorMsg("PHA-ProgramBoard"); + return ret; +} + +void DigitizerPHA::SetAnalogProbe1(unsigned int bit) { SetBits(Register::BoardConfiguration, bit, 2, 12); ErrorMsg("PHA-SetAnalogProbe1"); } +void DigitizerPHA::SetAnalogProbe2(unsigned int bit) { SetBits(Register::BoardConfiguration, bit, 2, 14); ErrorMsg("PHA-SetAnalogProbe1"); } +void DigitizerPHA::SetWaveFormRecording(bool OnOff) { SetBits(Register::BoardConfiguration, OnOff, 1, 16); ErrorMsg("PHA-SetWaveFormRecording"); } +void DigitizerPHA::SetExtra2WordOutput(bool OnOff) { SetBits(Register::BoardConfiguration, OnOff, 1, 17); ErrorMsg("PHA-SetExtra2WordOutput");} +void DigitizerPHA::SetTimeStampRecording(bool OnOff) { SetBits(Register::BoardConfiguration, OnOff, 1, 18); ErrorMsg("PHA-SetTimeStampRecording"); } +void DigitizerPHA::SetEnergyRecording(bool OnOff) { SetBits(Register::BoardConfiguration, OnOff, 1, 19); ErrorMsg("PHA-SetEnergyRecording");} +void DigitizerPHA::SetVirtualProbe1(unsigned int bit){ SetBits(Register::BoardConfiguration, bit, 4, 20); ErrorMsg("PHA-SetVirtualProbe1"); } + +void DigitizerPHA::SetTrapezoidRescaling(unsigned int rightShiftBits, int ch ){ SetBits(Register::DPP::DPPAlgorithmControl, rightShiftBits, 5, 0, ch); ErrorMsg("SetTrapezoidRescaling"); } +void DigitizerPHA::SetPeakSampling(unsigned int bit, int ch) { SetBits(Register::DPP::DPPAlgorithmControl, bit, 2, 12, ch); ErrorMsg("SetPeakSampling");} +void DigitizerPHA::SetPulsePolarity(bool PositiveIsZero, int ch) { SetBits(Register::DPP::DPPAlgorithmControl, PositiveIsZero, 1, 16, ch); ErrorMsg("SetPulsePolarity");} +void DigitizerPHA::SetBaselineSampling(unsigned int bit, int ch) { SetBits(Register::DPP::DPPAlgorithmControl, bit, 3, 20, ch); ErrorMsg("SetBaselineSampling"); } +void DigitizerPHA::SetRollOverFlag(bool isRollOver, int ch) { SetBits(Register::DPP::DPPAlgorithmControl, isRollOver, 1, 26, ch); ErrorMsg("SetRollOverFlag");} +void DigitizerPHA::SetPileUpFlag(bool isPileUpFlag, int ch) { SetBits(Register::DPP::DPPAlgorithmControl, isPileUpFlag, 1, 27, ch); ErrorMsg("SetPileUpFlag");} + +void DigitizerPHA::SetExtra2WordOption(unsigned int bit, int ch) { SetBits(Register::DPP::PHA::DPPAlgorithmControl2, bit, 3, 8, ch); ErrorMsg("PHA-SetExtra2WordOption");} + +void DigitizerPHA::SetTriggerThreshold(unsigned int threshold, int ch ) { WriteRegister(Register::DPP::PHA::TriggerThreshold, threshold & 0x03FF, ch); ErrorMsg("PHA-SetTriggerThreshold");} +void DigitizerPHA::SetTriggerHoldOff(unsigned int nSample, int ch ) { WriteRegister(Register::DPP::PHA::TriggerHoldOffWidth, nSample & 0x03FF, ch); ErrorMsg("PHA-SetTriggerHoldOff"); } +void DigitizerPHA::SetTriggerSmoothingFactor(unsigned int bit, int ch ) { WriteRegister(Register::DPP::PHA::RCCR2SmoothingFactor, bit & 0x0001, ch); ErrorMsg("PHA-SetTriggerSmoothingFactor");} +void DigitizerPHA::SetInputRiseTime(unsigned int nSample, int ch ) { WriteRegister(Register::DPP::PHA::InputRiseTime, nSample & 0x00FF, ch); ErrorMsg("PHA-SetInputRiseTime");} +void DigitizerPHA::SetTrapezoidRiseTime(unsigned int nSample, int ch ) { WriteRegister(Register::DPP::PHA::TrapezoidRiseTime, nSample & 0x0FFF, ch); ErrorMsg("PHA-SetTrapezoidRiseTime");} +void DigitizerPHA::SetTrapezoidFlatTop(unsigned int nSample, int ch ) { WriteRegister(Register::DPP::PHA::TrapezoidFlatTop, nSample & 0x0FFF, ch); ErrorMsg("PHA-SetTrapezoidFlatTop");} +void DigitizerPHA::SetDecayTime(unsigned int nSample, int ch ) { WriteRegister(Register::DPP::PHA::DecayTime, nSample & 0xFFFF, ch); ErrorMsg("PHA-SetDecayTime");} +void DigitizerPHA::SetPeakingTime(unsigned int nSample, int ch ) { WriteRegister(Register::DPP::PHA::PeakingTime, nSample & 0x0FFF, ch); ErrorMsg("PHA-SetPeakingTime");} +void DigitizerPHA::SetPeakingHoldOff(unsigned int nSample, int ch ) { WriteRegister(Register::DPP::PHA::PeakHoldOff, nSample & 0x03FF, ch); ErrorMsg("PHA-SetPeakingHoldOff");} +void DigitizerPHA::SetEnergyFineGain(unsigned int gain, int ch ) { WriteRegister(Register::DPP::PHA::FineGain, gain & 0xFFFF, ch); ErrorMsg("PHA-SetEnergyFineGain");} +void DigitizerPHA::SetRiseTimeValidWindow(unsigned int nSample, int ch ){ WriteRegister(Register::DPP::PHA::RiseTimeValidationWindow,nSample & 0x03FF, ch); ErrorMsg("PHA-SetRiseTimeValidWindow");} + + +void DigitizerPHA::PrintBoardConfiguration(){ + uint32_t * value = new uint32_t[1]; + CAEN_DGTZ_ReadRegister(handle, (uint32_t) Register::BoardConfiguration, value); + printf(" 32 28 24 20 16 12 8 4 0\n"); + printf(" | | | | | | | | |\n"); + cout <<" Board Configuration : 0b" << bitset<32>(value[0]) << endl; + printf(" Bit[ 0] = Auto Data Flush \n"); + printf(" Bit[ 1] = Save decimated waveform \n"); + printf(" Bit[ 2] = Trigger propagation \n"); + printf(" Bit[ 3:10] = must be 001 0001 0 \n"); + printf(" Bit[ 11] = Dual Trace \n"); + printf(" Bit[12:13] = Analog probe 1 : 00 = input, 01 = RC-CR (1st derivative), 10 = RC-CR2 (2nd derivative), 11 = Trapezoid.\n"); + printf(" Bit[14:15] = Analog probe 2 : 00 = input, 01 = Threshold, 10 = Trapezoid - Baseline, 11 = baseline.\n"); + printf(" Bit[ 16] = WaveForm Recording \n"); + printf(" Bit[ 17] = Extras 2 word enable \n"); + printf(" Bit[ 18] = Record Time Stamp \n"); + printf(" Bit[ 19] = Record Energy \n"); + printf(" Bit[20:23] = Digital Virtual probe 1 : \n"); + printf(" 0000: Peaking, shows where the energy is calculated; \n"); + printf(" 0001: ”Armed”, digital input showing where the RC‐CR2 crosses the Threshold\n"); + printf(" 0010: ”Peak Run”, starts with the trigger and last for the whole event\n"); + printf(" 0011: ”Pile‐up”, shows where a pile‐up event occurred\n"); + printf(" 0100: ”Peaking”, shows where the energy is calculated\n"); + printf(" 0101: ”TRG Validation Win”, digital input showing the trigger validation acceptance window TVAW\n"); + printf(" 0110: ”Baseline freeze”, shows where the algorithm stops calculating the baseline and its value is frozen\n"); + printf(" 0111: ”TRG Holdoff”, shows the trigger hold‐off parameter\n"); + printf(" 1000: ”TRG Validation”, shows the trigger validation signal TRG_VAL \n"); + printf(" 1001: ”Acq Busy”, this is 1 when the board is busy (saturated input signal or full memory board) or there is a veto\n"); + printf(" 1010: ”Zero Cross. Win.”, shows the RT Discrimination Width\n"); + printf(" 1011: ”Ext TRG”, shows the external trigger, when available\n"); + printf(" 1100: ”Busy”, shows when the memory board is full.\n"); + printf(" Bit[26:28] = Digital Virtual probe 2 : \n"); + printf(" 000: Trigger\n"); + printf(" other: Reserved\n"); + printf("====================================== \n"); +} + +void DigitizerPHA::GetChannelSettingFromDigitizer(int ch){ + + uint32_t * value = new uint32_t[NChannel]; + printf("\e[33m================================================\n"); + printf("================ Setting for channel %d \n", ch); + printf("================================================\e[0m\n"); + ///DPP algorithm Control + CAEN_DGTZ_ReadRegister(handle, Register::DPP::DPPAlgorithmControl + (ch << 8), value); + printf(" 32 28 24 20 16 12 8 4 0\n"); + printf(" | | | | | | | | |\n"); + cout <<" DPP algorithm Control : 0b" << bitset<32>(value[0]) << endl; + + int trapRescaling = int(value[0]) & 0x1f ; + int polarity = int(value[0] >> 16) & 0x1; /// in bit[16] + int baseline = int(value[0] >> 20) & 0x7; /// in bit[22:20] + int NsPeak = int(value[0] >> 12) & 0x3; /// in bit[13:12] + int rollOver = int(value[0] >> 26) & 0x1; + int pileUp = int(value[0] >> 27) & 0x1; + + ///DPP algorithm Control 2 + CAEN_DGTZ_ReadRegister(handle, Register::DPP::PHA::DPPAlgorithmControl2 + (ch << 8), value); + cout <<" DPP algorithm Control 2: 0b" << bitset<32>(value[0]) << endl; + + int extras2WordOption = int(value[0] >> 8) & 0x3; + string extra2WordOptStr = ""; + switch (extras2WordOption){ + case 0 : extra2WordOptStr = "[0:15] Baseline *4 [16:31] Extended Time Stamp"; break; + case 2 : extra2WordOptStr = "[0:15] Fine Time Stamp [16:31] Extended Time Stamp"; break; + case 4 : extra2WordOptStr = "[0:15] Total Trigger Counter [16:31] Lost Trigger Counter"; break; + case 5 : extra2WordOptStr = "[0:15] Event After the Zero Crossing [16:31] Event Before the Zero Crossing"; break; + default: extra2WordOptStr = "Reserved"; break; + + } + + printf(" ch2ns : %.0f ns\n", ch2ns); + + printf("==========----- input \n"); + CAEN_DGTZ_ReadRegister(handle, Register::DPP::RecordLength + (ch << 8), value); printf("%24s %5d samples \n", "Record Length", ((value[0] * 8) & MaxRecordLength)); ///Record length + CAEN_DGTZ_ReadRegister(handle, Register::DPP::PreTrigger + (ch << 8), value); printf("%24s %5d samples \n", "Pre-tigger", value[0] * 4); ///Pre-trigger + printf("%24s %5.0f samples, DPP-[20:22]\n", "baseline mean", pow(4, 1 + baseline)); ///Ns baseline + printf("%24s %s, DPP-[16]\n", "polarity", polarity == 0 ? "Positive" : "negative"); ///Polarity + CAEN_DGTZ_ReadRegister(handle, Register::DPP::ChannelDCOffset + (ch << 8), value); printf("%24s %.2f %% of %d\n", "DC offset", value[0] * 100./ ADCFullSize, ADCFullSize); ///DC offset + CAEN_DGTZ_ReadRegister(handle, Register::DPP::InputDynamicRange + (ch << 8), value); printf("%24s %.1f Vpp \n", "input Dynamic", value[0] == 0 ? 2 : 0.5); ///InputDynamic + + printf("==========----- discriminator \n"); + CAEN_DGTZ_ReadRegister(handle, Register::DPP::PHA::TriggerThreshold + (ch << 8), value); printf("%24s %4d LSB\n", "Threshold", value[0]); ///Threshold + CAEN_DGTZ_ReadRegister(handle, Register::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, Register::DPP::PHA::RCCR2SmoothingFactor + (ch << 8), value); printf("%24s %4d samples \n", "Fast Dis. smoothing", (value[0] & 0x1f) * 2 ); ///Fast Discriminator smoothing + CAEN_DGTZ_ReadRegister(handle, Register::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, Register::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 + + printf("==========----- Trapezoid \n"); + printf("%24s %4d bit = Floor( rise x decay / 64 ), DPP-[0:5]\n", "Trap. Rescaling", trapRescaling ); ///Trap. Rescaling Factor + CAEN_DGTZ_ReadRegister(handle, Register::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, Register::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 + int flatTopTime = value[0] * 4 * ch2ns; + CAEN_DGTZ_ReadRegister(handle, Register::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, Register::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, Register::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 + printf("%24s %4.0f samples, DPP-[12:13]\n", "Peak mean", pow(4, NsPeak)); ///Ns peak + + printf("==========----- Other \n"); + CAEN_DGTZ_ReadRegister(handle, Register::DPP::PHA::FineGain + (ch << 8), value); printf("%24s %d \n", "Energy fine gain", value[0]); ///Energy fine gain + CAEN_DGTZ_ReadRegister(handle, Register::DPP::ChannelADCTemperature + (ch << 8), value); printf("%24s %d C\n", "Temperature", value[0]); ///Temperature + CAEN_DGTZ_ReadRegister(handle, Register::DPP::PHA::RiseTimeValidationWindow + (ch << 8), value); printf("%24s %.0f ns \n", "RiseTime Vaild Win.", value[0] * ch2ns); + CAEN_DGTZ_ReadRegister(handle, Register::DPP::NumberEventsPerAggregate + (ch << 8), value); printf("%24s %d \n", "Event Aggregate", value[0] & 0x3FF); + CAEN_DGTZ_ReadRegister(handle, Register::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, Register::DPP::ChannelStatus + (ch << 8), value); printf("%24s 0x%x \n", "Status bit", (value[0] & 0xff) ); + CAEN_DGTZ_ReadRegister(handle, Register::DPP::AMCFirmwareRevision + (ch << 8), value); printf("%24s 0x%x \n", "AMC firmware rev.", value[0] ); + CAEN_DGTZ_ReadRegister(handle, Register::DPP::VetoWidth + (ch << 8), value); printf("%24s 0x%x \n", "VetoWidth bit", value[0] ); + printf("%24s %d = %s\n", "RollOverFlag, DPP-[26]", rollOver, rollOver ? "enable" : "disable" ); + printf("%24s %d = %s\n", "Pile-upFlag, DPP-[27]", pileUp, pileUp ? "enable" : "disable" ); + printf("%24s %d, %s \n", "Extra2 opt, DPP2-[8:10]", extras2WordOption, extra2WordOptStr.c_str()); + + printf("========================================= end of ch-%d\n", ch); + +} diff --git a/DigitizerPHA.h b/DigitizerPHA.h new file mode 100644 index 0000000..3751d51 --- /dev/null +++ b/DigitizerPHA.h @@ -0,0 +1,50 @@ +#ifndef DIGITIZER_PHA_H +#define DIGITIZER_PHA_H + +#include "DigitizerClass.h" + +class DigitizerPHA : public Digitizer { + + public: + DigitizerPHA(); + DigitizerPHA(int boardID, int portID = 0); + ~DigitizerPHA(); + + int ProgramBoard(); + + void SetAnalogProbe1(unsigned int bit); + void SetAnalogProbe2(unsigned int bit); + void SetWaveFormRecording(bool OnOff); + void SetExtra2WordOutput(bool OnOff); + void SetTimeStampRecording(bool OnOff); + void SetEnergyRecording(bool OnOff); + void SetVirtualProbe1(unsigned int bit); + + void SetTrapezoidRescaling(unsigned int rightShiftBits, int ch = -1); /// DPPAlgoritmControl bit-0:5 + void SetPeakSampling(unsigned int bit, int ch = -1); /// DPPAlgoritmControl bit-10:11 + void SetPulsePolarity(bool PositiveIsZero, int ch = -1); /// DPPAlgoritmControl bit-16 + void SetBaselineSampling(unsigned int bit, int ch = -1); /// DPPAlgoritmControl bit-20:22 + void SetRollOverFlag(bool isRollOver, int ch = -1); /// DPPAlgoritmControl bit-26 + void SetPileUpFlag(bool isPileUpFlag, int ch = -1); /// DPPAlgoritmControl bit-27 + void SetExtra2WordOption(unsigned int bit, int ch = -1); + + void SetTriggerThreshold(unsigned int threshold, int ch = -1 ); + void SetTriggerHoldOff(unsigned int nSample, int ch = -1 ); + void SetTriggerSmoothingFactor(unsigned int bit, int ch = -1 ); + void SetInputRiseTime(unsigned int nSample, int ch = -1); + + void SetTrapezoidRiseTime(unsigned int nSample, int ch = -1 ); + void SetTrapezoidFlatTop(unsigned int nSample, int ch = -1 ); + void SetDecayTime(unsigned int nSample, int ch = -1 ); + void SetPeakingTime(unsigned int nSample, int ch = -1 ); + void SetPeakingHoldOff(unsigned int nSample, int ch = -1 ); + + void SetEnergyFineGain(unsigned int gain, int ch = -1 ); + void SetRiseTimeValidWindow(unsigned int nSample, int ch = -1 ); + + void PrintBoardConfiguration(); + void GetChannelSettingFromDigitizer(int ch); + +}; + +#endif diff --git a/DigitizerPSD.cpp b/DigitizerPSD.cpp new file mode 100644 index 0000000..0333f06 --- /dev/null +++ b/DigitizerPSD.cpp @@ -0,0 +1,14 @@ + +#include "DigitizerPSD.h" + +DigitizerPSD::DigitizerPSD(){ + +} + +DigitizerPSD::DigitizerPSD(int boardID, int portID){ + OpenDigitizer(boardID, portID); +} + +DigitizerPSD::~DigitizerPSD(){ + +} diff --git a/DigitizerPSD.h b/DigitizerPSD.h new file mode 100644 index 0000000..b22809a --- /dev/null +++ b/DigitizerPSD.h @@ -0,0 +1,18 @@ +#ifndef DIGITIZER_PSD_H +#define DIGITIZER_PSD_H + +#include "DigitizerClass.h" + +class DigitizerPSD : public Digitizer { + public: + DigitizerPSD(); + DigitizerPSD(int boardID, int portID = 0); + ~DigitizerPSD(); + + //int ProgramBoard(); + // + //void GetChannelSetting(int ch); + +}; + +#endif diff --git a/FSUDAQ.cpp b/FSUDAQ.cpp new file mode 100644 index 0000000..58d8e0b --- /dev/null +++ b/FSUDAQ.cpp @@ -0,0 +1,248 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "DigitizerPHA.h" +#include "DigitizerPSD.h" +#include "FSUDAQ.h" +enum MenuIdentifiers{ + + M_FILE_OPEN, + M_EXIT, + M_CH_SETTINGS_SUMMARY, + M_CH_SETTING, + M_MODULE_SETTINGS, + M_PROGRAM_SETTINGS, + M_FINDPEAKS, + M_SHOW_CHANNELS_RATE + +}; +//TODO timed Run, //pixie->SetDigitizerPresetRunTime(100000, 0); +///make static members +DigitizerPHA * MainWindow::digi = NULL; +TGTextEdit * MainWindow::teLog = NULL; +TRootEmbeddedCanvas * MainWindow::fEcanvas = NULL; +MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { + + digi = new DigitizerPHA(0,0); + + /// Create a main frame + fMain = new TGMainFrame(p,w,h); + ///fMain->SetWMPosition(500, 500); //does not work + fMain->Connect("CloseWindow()", "MainWindow", this, "GoodBye()"); + ///======================= menu + fMenuBar = new TGMenuBar(fMain, 1, 1, kHorizontalFrame); + fMain->AddFrame(fMenuBar, new TGLayoutHints(kLHintsTop | kLHintsExpandX)); + fMenuFile = new TGPopupMenu(gClient->GetRoot()); + fMenuFile->AddEntry("&Open Pixie16.config", M_FILE_OPEN); + fMenuFile->AddSeparator(); + fMenuFile->AddEntry("E&xit", M_EXIT); + fMenuFile->Connect("Activated(Int_t)", "MainWindow", this, "HandleMenu(Int_t)"); + fMenuBar->AddPopup("&File", fMenuFile, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); + + fMenuSettings = new TGPopupMenu(gClient->GetRoot()); + fMenuSettings->AddEntry("&Settings Summary", M_CH_SETTINGS_SUMMARY); + fMenuSettings->AddEntry("&Channel Setting", M_CH_SETTING); + fMenuSettings->AddSeparator(); + fMenuSettings->AddEntry("&Digitizer Settings", M_MODULE_SETTINGS); + fMenuSettings->AddSeparator(); + fMenuSettings->AddEntry("Program Settings", M_PROGRAM_SETTINGS); + fMenuSettings->Connect("Activated(Int_t)", "MainWindow", this, "HandleMenu(Int_t)"); + fMenuBar->AddPopup("&Settings", fMenuSettings, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); + fMenuUtility = new TGPopupMenu(gClient->GetRoot()); + fMenuUtility->AddEntry("Plot Channels Rate", M_SHOW_CHANNELS_RATE); + fMenuSettings->AddSeparator(); + fMenuUtility->AddEntry("Find &Peaks", M_FINDPEAKS); + fMenuUtility->Connect("Activated(Int_t)", "MainWindow", this, "HandleMenu(Int_t)"); + fMenuBar->AddPopup("&Utility", fMenuUtility, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); + TGLayoutHints * uniLayoutHints = new TGLayoutHints(kLHintsNormal, 2,2,10,0); ///left, right, top, bottom + /// Create a horizontal frame widget with buttons + TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain,200,40); + fMain->AddFrame(hframe, new TGLayoutHints(kLHintsCenterX,2,2,2,2)); + + ///================= signal Channel group + TGGroupFrame * group1 = new TGGroupFrame(hframe, "Single Channel", kHorizontalFrame); + hframe->AddFrame(group1 ); + + TGHorizontalFrame *hframe1 = new TGHorizontalFrame(group1,200,30); + group1->AddFrame(hframe1 ); + + ///================= Create canvas widget + fEcanvas = new TRootEmbeddedCanvas("Ecanvas",fMain,900,400); + fMain->AddFrame(fEcanvas, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,10)); + ///================= Log massage + TGGroupFrame * groupLog = new TGGroupFrame(fMain, "Log Message", kHorizontalFrame); + fMain->AddFrame(groupLog, new TGLayoutHints(kLHintsCenterX, 5,5,0,5) ); + + teLog = new TGTextEdit(groupLog, w, 100); + groupLog->AddFrame(teLog, new TGLayoutHints(kLHintsNormal, 0,0,10,0)); + /// Set a name to the main frame + fMain->SetWindowName("Pixie16 DAQ"); + /// Map all subwindows of main frame + fMain->MapSubwindows(); + /// Initialize the layout algorithm + fMain->Resize(fMain->GetDefaultSize()); + fMain->SetWMPosition(200, 200); //does not work?? + + /// Map main frame + fMain->MapWindow(); + + /// setup thread + //saveDataThread = new TThread("hahaha", SaveData, (void *) 1); + //fillHistThread = new TThread("kakaka", FillHistogram, (void *) 1); + + ///settingsSummary = NULL; + ///moduleSetting = NULL; + ///channelSetting = NULL; + ///scalarPanel = NULL; + + ///bStopRun->SetEnabled(false); + + LogMsg("Boot OK and ready to run."); + + ///HandleMenu(M_CH_SETTINGS_SUMMARY); + +} +MainWindow::~MainWindow() { + delete fMenuBar; + delete fMenuFile; + delete fMenuSettings; + delete fMenuUtility; + + //delete modIDEntry; + //delete chEntry; + //delete tePath; + delete teLog; + + //delete bStartRun; + //delete bStopRun; + //delete bFitTrace; + + delete digi; + + //delete settingsSummary; + //delete moduleSetting; + //delete channelSetting; + //delete scalarPanel; + // + //delete saveDataThread; + //delete fillHistThread; + // + //delete gTrace; + // + //delete configEditor; + + /// Clean up used widgets: frames, buttons, layout hints + fMain->Cleanup(); + delete fMain; +} +void MainWindow::HandleMenu(Int_t id){ + switch(id){ + + ///========================= File Open + case M_FILE_OPEN:{ + + + }break; + + ///========================= Exit + case M_EXIT: GoodBye(); break; + + ///========================= Channel setting summary + case M_CH_SETTINGS_SUMMARY: { + + }break; + + case M_CH_SETTING:{ + + }break; + + ///========================= Module setting + case M_MODULE_SETTINGS:{ + + }break; + ///========================= Program setting + case M_PROGRAM_SETTINGS:{ + LogMsg("[Program settings] Not impelmented"); + }break; + + ///====================== Show channel rate; + case M_SHOW_CHANNELS_RATE:{ + + }break; + + + ///====================== Fit Gaussian + case M_FINDPEAKS:{ + + LogMsg("[Find Peaks] Not impelmented"); + + }break; + + } + +} + +Double_t standardPulse(Double_t *x, Double_t * par){ + + /// par[0] = start time + /// par[1] = rise time + /// par[2] = decay time + /// par[3] = amplitude + /// par[4] = baseline + + Double_t z = x[0] - par[0]; + + if( z <= 0 ) { + return par[4]; + }else{ + return par[3]*(1-TMath::Exp(-1*z/par[1]))*TMath::Exp(-1*z/par[2]) + par[4]; + } +} + +void MainWindow::GoodBye(){ + + //pixie->CloseDigitizers(); + + printf("----- bye bye ---- \n"); + + gApplication->Terminate(0); + +} + +void MainWindow::LogMsg(TString msg){ + + time_t now = time(0); + tm * ltm = localtime(&now); + int year = 1900 + ltm->tm_year; + int month = 1 + ltm->tm_mon; + int day = ltm->tm_mday; + int hour = ltm->tm_hour; + int minute = ltm->tm_min; + int secound = ltm->tm_sec; + + teLog->AddLine(Form("[%4d-%02d-%02d %02d:%02d:%02d] ", year, month, day, hour, minute, secound) + msg); + teLog->LineDown(); + teLog->ShowBottom(); +} + +//############################################ +int main(int argc, char **argv) { + printf(" Welcome to pixie16 DQ \n"); + + TApplication theApp("App",&argc,argv); + new MainWindow(gClient->GetRoot(),800,800); + theApp.Run(); + return 0; +} diff --git a/FSUDAQ.h b/FSUDAQ.h new file mode 100644 index 0000000..d8735cd --- /dev/null +++ b/FSUDAQ.h @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "CAENDigitizer.h" +#include "DigitizerPHA.h" +#include "DigitizerPSD.h" +///#include "global_macro.h" +///#include "settingsSummary.h" +///#include "scalarPanel.h" +///#include "moduleSetting.h" +///#include "channelSetting.h" +class TGWindow; +class TGMainFrame; +class TRootEmbeddedCanvas; +class TGNumberEntry; +class MainWindow{ + RQ_OBJECT("MainWindow") +private: + TGMainFrame *fMain; + static TRootEmbeddedCanvas *fEcanvas; + + TGMenuBar *fMenuBar; + TGPopupMenu *fMenuFile, *fMenuSettings, *fMenuUtility; + // + //static TGNumberEntry * modIDEntry, *chEntry; + //TGNumberEntry * runIDEntry; + //TGTextEntry * tePath; + // + static TGTextEdit * teLog; + // + //TGTextButton *bStartRun; + //TGTextButton *bStopRun; + //TGTextButton *bFitTrace; + + static DigitizerPHA * digi; + + // + //SettingsSummary * settingsSummary; + //ModuleSetting * moduleSetting; + //ChannelSetting * channelSetting; + //ScalarPanel * scalarPanel; + // + //TThread * saveDataThread; + //TThread * fillHistThread; + //static TH1F * hEnergy[MAXMOD][MAXCH]; + //static TH1F * hChannel[MAXMOD]; + //static bool isEnergyHistFilled; + //TGraph * gTrace; + // + //TGTextEditor * configEditor; +public: + MainWindow(const TGWindow *p, UInt_t w, UInt_t h); + virtual ~MainWindow(); + + void HandleMenu(Int_t id); + + //void GetADCTrace(); + //void GetBaseLine(); + //void Scope(); + //void FitTrace(); + //void StartRun(); + //static void * SaveData(void* ptr ); /// thread + //void StopRun(); + //void OpenScalar(); + //static void * FillHistogram(void * ptr); /// thread + //void ChangeMod(); + //void ChangeChannel(); + void LogMsg(TString msg); + void GoodBye(); +}; diff --git a/FSUDAQDict.cxx b/FSUDAQDict.cxx new file mode 100644 index 0000000..70d48fd --- /dev/null +++ b/FSUDAQDict.cxx @@ -0,0 +1,149 @@ +// Do NOT change. Changes will be lost next time file is generated + +#define R__DICTIONARY_FILENAME FSUDAQDict +#define R__NO_DEPRECATION + +/*******************************************************************/ +#include +#include +#include +#include +#include +#define G__DICTIONARY +#include "RConfig.h" +#include "TClass.h" +#include "TDictAttributeMap.h" +#include "TInterpreter.h" +#include "TROOT.h" +#include "TBuffer.h" +#include "TMemberInspector.h" +#include "TInterpreter.h" +#include "TVirtualMutex.h" +#include "TError.h" + +#ifndef G__ROOT +#define G__ROOT +#endif + +#include "RtypesImp.h" +#include "TIsAProxy.h" +#include "TFileMergeInfo.h" +#include +#include "TCollectionProxyInfo.h" +/*******************************************************************/ + +#include "TDataMember.h" + +// Header files passed as explicit arguments +#include "FSUDAQ.h" + +// Header files passed via #pragma extra_include + +// The generated code does not explicitly qualify STL entities +namespace std {} using namespace std; + +namespace ROOT { + static TClass *MainWindow_Dictionary(); + static void MainWindow_TClassManip(TClass*); + static void delete_MainWindow(void *p); + static void deleteArray_MainWindow(void *p); + static void destruct_MainWindow(void *p); + + // Function generating the singleton type initializer + static TGenericClassInfo *GenerateInitInstanceLocal(const ::MainWindow*) + { + ::MainWindow *ptr = nullptr; + static ::TVirtualIsAProxy* isa_proxy = new ::TIsAProxy(typeid(::MainWindow)); + static ::ROOT::TGenericClassInfo + instance("MainWindow", "FSUDAQ.h", 25, + typeid(::MainWindow), ::ROOT::Internal::DefineBehavior(ptr, ptr), + &MainWindow_Dictionary, isa_proxy, 0, + sizeof(::MainWindow) ); + instance.SetDelete(&delete_MainWindow); + instance.SetDeleteArray(&deleteArray_MainWindow); + instance.SetDestructor(&destruct_MainWindow); + return &instance; + } + TGenericClassInfo *GenerateInitInstance(const ::MainWindow*) + { + return GenerateInitInstanceLocal((::MainWindow*)nullptr); + } + // Static variable to force the class initialization + static ::ROOT::TGenericClassInfo *_R__UNIQUE_DICT_(Init) = GenerateInitInstanceLocal((const ::MainWindow*)nullptr); R__UseDummy(_R__UNIQUE_DICT_(Init)); + + // Dictionary for non-ClassDef classes + static TClass *MainWindow_Dictionary() { + TClass* theClass =::ROOT::GenerateInitInstanceLocal((const ::MainWindow*)nullptr)->GetClass(); + MainWindow_TClassManip(theClass); + return theClass; + } + + static void MainWindow_TClassManip(TClass* ){ + } + +} // end of namespace ROOT + +namespace ROOT { + // Wrapper around operator delete + static void delete_MainWindow(void *p) { + delete ((::MainWindow*)p); + } + static void deleteArray_MainWindow(void *p) { + delete [] ((::MainWindow*)p); + } + static void destruct_MainWindow(void *p) { + typedef ::MainWindow current_t; + ((current_t*)p)->~current_t(); + } +} // end of namespace ROOT for class ::MainWindow + +namespace { + void TriggerDictionaryInitialization_FSUDAQDict_Impl() { + static const char* headers[] = { +"FSUDAQ.h", +nullptr + }; + static const char* includePaths[] = { +"/home/splitpole/cern/root/include/", +"/home/splitpole/FSUDAQ/", +nullptr + }; + static const char* fwdDeclCode = R"DICTFWDDCLS( +#line 1 "FSUDAQDict dictionary forward declarations' payload" +#pragma clang diagnostic ignored "-Wkeyword-compat" +#pragma clang diagnostic ignored "-Wignored-attributes" +#pragma clang diagnostic ignored "-Wreturn-type-c-linkage" +extern int __Cling_AutoLoading_Map; +class __attribute__((annotate("$clingAutoload$FSUDAQ.h"))) MainWindow; +)DICTFWDDCLS"; + static const char* payloadCode = R"DICTPAYLOAD( +#line 1 "FSUDAQDict dictionary payload" + + +#define _BACKWARD_BACKWARD_WARNING_H +// Inline headers +#include "FSUDAQ.h" + +#undef _BACKWARD_BACKWARD_WARNING_H +)DICTPAYLOAD"; + static const char* classesHeaders[] = { +"MainWindow", payloadCode, "@", +nullptr +}; + static bool isInitialized = false; + if (!isInitialized) { + TROOT::RegisterModule("FSUDAQDict", + headers, includePaths, payloadCode, fwdDeclCode, + TriggerDictionaryInitialization_FSUDAQDict_Impl, {}, classesHeaders, /*hasCxxModule*/false); + isInitialized = true; + } + } + static struct DictInit { + DictInit() { + TriggerDictionaryInitialization_FSUDAQDict_Impl(); + } + } __TheDictionaryInitializer; +} +void TriggerDictionaryInitialization_FSUDAQDict() { + TriggerDictionaryInitialization_FSUDAQDict_Impl(); +} diff --git a/FSUDAQDict_rdict.pcm b/FSUDAQDict_rdict.pcm new file mode 100644 index 0000000000000000000000000000000000000000..eabdd65f70a97d262da935ba999c1804f1bfa1d9 GIT binary patch literal 1426 zcmXTQ&o5zM_|n6`z>vbgz&Z(t1AuHNAZ7&O02UyT3d9h=DD+Nwl8BAq+ezo{=kIFR z_Z}uei0)wk85EMoDK>$@0&FtSHlST0Zkai$VtV>+!J#gWfi9WJCGkZmKvJ(DIhO&K zI0Gxl9I#mojBG$-KrRNG$H2hi#X!iBF<`eyg7rIt-SPpXpEJZiDa)~_D6x_&K0c(f zAT=d5tytJGPazQ`rjVbeke`&5np{%sz`!8Nzzo*Nzy#EZ3?h-tb^s}1^Z`mEnav&_ z@0wSdORB+4OF;&+1%Msx4mNlxs=<8m@c~8oCHc-diN(dKSj~^};Rt172w-EVV4NG` zn}69spw>@j@_Mf+N>U#eig7ME<;2m+?e08Vt=+}9Q_%L&mDweV8=E(0G8Q_>{JiYA zd7kgJAT1T0%6mQKW%tfhlrdM>PI<`S(8)4EnsLwd)mO7b`8I_tJ$^Z3qXWZxhNTP{ z2QS9O-DG|B*F#M{RcN_6M+5WT)#~D1Yhpt_RiyIy$;YpWJ$LMFisj-HH?B|I{?j@y zfcb5HQIFPR!N=Oi%zMfuqkGzWVvjLCW__%FOxum=uHZJ$<SIO{rB zc)(e!qe~*5=~_&DxWn(}XD>Zl#yfgh3|WjHg3CXs1O>*QaZ_5%7Wa}(F6(DQy+CW( z>c^iqUraAt`R2#6c7|0`_#50j>YOJYQQGaRzMsLPe&G|A11_6wFBYADwx%aj>(h>% zCTH0%LyzR3n}`n}xx+B8)#Pv0e6c_Sx+r&!P?Pi=X`- za=Lc+!>xv`mQ#Zhg=cYY=a5cJpKxw^aZ!Ghm1*tX2gYxCFE5+*Vdu2|oLjQK)*@af zQzn(q`+0WZulQHl%lu4U8tcm6y5j5m*YV`ako#{JtxeAHy|rtb(_Gf(ZoPlEa}Td| z(Vv^)HE)w{au~n$!XL|SZ4Bw{eRbRFbL~^FrRzR!oc8^V*WC!eC-yI9sTV0t{iC?a z@%!7p+#jypp7F1CAK9vx|NF#!&UUTICzq^R-}2|xjLUv@K|kL!fniDGUI}EZye- literal 0 HcmV?d00001 diff --git a/FSUDAQLinkDef.h b/FSUDAQLinkDef.h new file mode 100644 index 0000000..d171419 --- /dev/null +++ b/FSUDAQLinkDef.h @@ -0,0 +1 @@ +#pragma link C++ class MainWindow; diff --git a/Makefile b/Makefile index ecf816c..2fc68f5 100755 --- a/Makefile +++ b/Makefile @@ -1,35 +1,50 @@ ######################################################################## # -## --- CAEN SpA - Computing Division --- -# -## CAENDigitizer Software Project -# -## Created : October 2009 (Rel. 1.0) -# -## Auth: A. Lucchesi # ######################################################################### -ARCH = `uname -m` CC = g++ -COPTS = -fPIC -DLINUX -w +COPTS = -fPIC -DLINUX -O2 -std=c++17 -lpthread -DEPLIBS = -lCAENDigitizer +CAENLIBS = -lCAENDigitizer ROOTLIBS = `root-config --cflags --glibs` +OBJS = DigitizerClass.o DigitizerPHA.o DigitizerPSD.o FSUDAQ.o + ######################################################################### all : test -#clean : -# /bin/rm -f $(OBJS1) $(OBJS2) $(OUT2) ./CutsCreator ./BoxScore ./BoxScoreReader +clean : + /bin/rm -f $(OBJS) test FSUDAQ FSUDAQDict.cxx *.pcm -test : test.cpp DigitizerClass.h - $(CC) -o test test.cpp $(DEPLIBS) +DigitizerClass.o : DigitizerClass.cpp DigitizerClass.h RegisterAddress.h + $(CC) $(COPTS) -c DigitizerClass.cpp + +DigitizerPHA.o : DigitizerPHA.cpp DigitizerPHA.h DigitizerClass.o + $(CC) $(COPTS) -c DigitizerPHA.cpp + +DigitizerPSD.o : DigitizerPSD.cpp DigitizerPSD.h DigitizerClass.o + $(CC) $(COPTS) -c DigitizerPSD.cpp + +test : test.cpp DigitizerClass.o DigitizerPHA.o DigitizerPSD.o + $(CC) $(COPTS) -o test test.cpp DigitizerClass.o DigitizerPHA.o DigitizerPSD.o $(CAENLIBS) +FSUDAQDict.cxx : FSUDAQ.h FSUDAQLinkDef.h + @echo "----------- creating pcm and cxx for root" + @rootcling -f FSUDAQDict.cxx -c FSUDAQ.h -p FSUDAQLinkDef.h $(CAENLIBS) + +FSUDAQ.o : FSUDAQ.h FSUDAQ.cpp FSUDAQDict.cxx + @echo "----------- creating FSUDAQ.o" + $(CC) $(COPTS) -c FSUDAQ.cpp DigitizerClass.cpp DigitizerPHA.cpp DigitizerPSD.cpp $(ROOTLIBS) + +FSUDAQ : FSUDAQDict.cxx $(OBJS) + @echo "----------- creating FSUDAQ" + $(CC) $(COPTS) FSUDAQDict.cxx $(OBJS) -o FSUDAQ $(CAENLIBS) $(ROOTLIBS) + #CutsCreator: $(OBJS3) src/CutsCreator.c # g++ -std=c++17 -pthread src/CutsCreator.c -o CutsCreator $(ROOTLIBS) diff --git a/RegisterAddress.h b/RegisterAddress.h index 21d3ace..9b5d58a 100644 --- a/RegisterAddress.h +++ b/RegisterAddress.h @@ -1,155 +1,158 @@ #ifndef REGISTERADDRESS_H #define REGISTERADDRESS_H -enum class Register : uint32_t { + +namespace Register { + + static uint32_t EventReadOutBuffer = 0x0000; /// R - EventReadOutBuffer = 0x0000, /// R ///========== Channel or Group - ChannelDummy32 = 0x1024, /// R/W - InputDynamicRange = 0x1028, /// R/W - ChannelPulseWidth = 0x1070, /// R/W - ChannelTriggerThreshold = 0x1080, /// R/W - CoupleSelfTriggerLogic = 0x1084, /// R/W - ChannelStatus = 0x1088, /// R - AMCFirmwareRevision = 0x108C, /// R - ChannelDCOffset = 0x1098, /// R/W - ChannelADCTemperature = 0x10A8, /// R - ChannelSelfTriggerRateMeter = 0x10EC, /// R + static uint32_t ChannelDummy32 = 0x1024; /// R/W + static uint32_t InputDynamicRange = 0x1028; /// R/W + static uint32_t ChannelPulseWidth = 0x1070; /// R/W + static uint32_t ChannelTriggerThreshold = 0x1080; /// R/W + static uint32_t CoupleSelfTriggerLogic = 0x1084; /// R/W + static uint32_t ChannelStatus = 0x1088; /// R + static uint32_t AMCFirmwareRevision = 0x108C; /// R + static uint32_t ChannelDCOffset = 0x1098; /// R/W + static uint32_t ChannelADCTemperature = 0x10A8; /// R + static uint32_t ChannelSelfTriggerRateMeter = 0x10EC; /// R ///========== Board - BoardConfiguration = 0x8000, /// R/W - BufferOrganization = 0x800C, /// R/W - CustomSize = 0x8020, /// R/W - ADCCalibration = 0x809C, /// W - AcquisitionControl = 0x8100, /// R/W - AcquisitionStatus = 0x8104, /// R - SoftwareTrigger = 0x8108, /// W - GlobalTriggerMask = 0x810C, /// R/W - FrontPanelTRGOUTEnableMask = 0x8110, /// R/W - PostTrigger = 0x8114, /// R/W - LVDSIOData = 0x8118, /// R/W - FrontPanelIOControl = 0x811C, /// R/W - ChannelEnableMask = 0x8120, /// R/W - ROCFPGAFirmwareRevision = 0x8124, /// R - EventStored = 0x812C, /// R - VoltageLevelModeConfig = 0x8138, /// R/W - SoftwareClockSync = 0x813C, /// W - BoardInfo = 0x8140, /// R - AnalogMonitorMode = 0x8144, /// R/W - EventSize = 0x814C, /// R - FanSpeedControl = 0x8168, /// R/W - MemoryBufferAlmostFullLevel = 0x816C, /// R/W - RunStartStopDelay = 0x8170, /// R/W - BoardFailureStatus = 0x8178, /// R - FrontPanelLVDSIONewFeatures = 0x81A0, /// R/W - BufferOccupancyGain = 0x81B4, /// R/W - ChannelsShutdown = 0x81C0, /// W - ExtendedVetoDelay = 0x81C4, /// R/W - ReadoutControl = 0xEF00, /// R/W - ReadoutStatus = 0xEF04, /// R - BoardID = 0xEF08, /// R/W - MCSTBaseAddressAndControl = 0xEF0C, /// R/W - RelocationAddress = 0xEF10, /// R/W - InterruptStatusID = 0xEF14, /// R/W - InterruptEventNumber = 0xEF18, /// R/W - MaxNumberOfEventsPerBLT = 0xEF1C, /// R/W - Scratch = 0xEF20, /// R/W - SoftwareReset = 0xEF24, /// W - SoftwareClear = 0xEF28 /// W -}; + static uint32_t BoardConfiguration = 0x8000; /// R/W + static uint32_t BufferOrganization = 0x800C; /// R/W + static uint32_t CustomSize = 0x8020; /// R/W + static uint32_t ADCCalibration = 0x809C; /// W + static uint32_t AcquisitionControl = 0x8100; /// R/W + static uint32_t AcquisitionStatus = 0x8104; /// R + static uint32_t SoftwareTrigger = 0x8108; /// W + static uint32_t GlobalTriggerMask = 0x810C; /// R/W + static uint32_t FrontPanelTRGOUTEnableMask = 0x8110; /// R/W + static uint32_t PostTrigger = 0x8114; /// R/W + static uint32_t LVDSIOData = 0x8118; /// R/W + static uint32_t FrontPanelIOControl = 0x811C; /// R/W + static uint32_t ChannelEnableMask = 0x8120; /// R/W + static uint32_t ROCFPGAFirmwareRevision = 0x8124; /// R + static uint32_t EventStored = 0x812C; /// R + static uint32_t VoltageLevelModeConfig = 0x8138; /// R/W + static uint32_t SoftwareClockSync = 0x813C; /// W + static uint32_t BoardInfo = 0x8140; /// R + static uint32_t AnalogMonitorMode = 0x8144; /// R/W + static uint32_t EventSize = 0x814C; /// R + static uint32_t FanSpeedControl = 0x8168; /// R/W + static uint32_t MemoryBufferAlmostFullLevel = 0x816C; /// R/W + static uint32_t RunStartStopDelay = 0x8170; /// R/W + static uint32_t BoardFailureStatus = 0x8178; /// R + static uint32_t FrontPanelLVDSIONewFeatures = 0x81A0; /// R/W + static uint32_t BufferOccupancyGain = 0x81B4; /// R/W + static uint32_t ChannelsShutdown = 0x81C0; /// W + static uint32_t ExtendedVetoDelay = 0x81C4; /// R/W + static uint32_t ReadoutControl = 0xEF00; /// R/W + static uint32_t ReadoutStatus = 0xEF04; /// R + static uint32_t BoardID = 0xEF08; /// R/W + static uint32_t MCSTBaseAddressAndControl = 0xEF0C; /// R/W + static uint32_t RelocationAddress = 0xEF10; /// R/W + static uint32_t InterruptStatusID = 0xEF14; /// R/W + static uint32_t InterruptEventNumber = 0xEF18; /// R/W + static uint32_t MaxNumberOfEventsPerBLT = 0xEF1C; /// R/W + static uint32_t Scratch = 0xEF20; /// R/W + static uint32_t SoftwareReset = 0xEF24; /// W + static uint32_t SoftwareClear = 0xEF28; /// W -///====== Common for PHA and PSD -enum class RegisterDPP : uint32_t { + ///====== Common for PHA and PSD + namespace DPP { + + static uint32_t RecordLength = 0x1020; /// R/W + static uint32_t InputDynamicRange = 0x1028; /// R/W + static uint32_t NumberEventsPerAggregate = 0x1034; /// R/W + static uint32_t PreTrigger = 0x1038; /// R/W + static uint32_t TriggerThreshold = 0x106C; /// R/W + static uint32_t TriggerHoldOffWidth = 0x1074; /// R/W + static uint32_t DPPAlgorithmControl = 0x1080; /// R/W + static uint32_t ChannelStatus = 0x1088; /// R + static uint32_t AMCFirmwareRevision = 0x108C; /// R + static uint32_t ChannelDCOffset = 0x1098; /// R/W + static uint32_t ChannelADCTemperature = 0x10A8; /// R + static uint32_t IndividualSoftwareTrigger = 0x10C0; /// W + static uint32_t VetoWidth = 0x10D4; /// R/W + + static uint32_t BoardConfiguration = 0x8000; /// R/W + static uint32_t AggregateOrganization = 0x800C; /// R/W + static uint32_t ADCCalibration = 0x809C; /// W + static uint32_t ChannelShutdown = 0x80BC; /// W + static uint32_t AcquisitionControl = 0x8100; /// R/W + static uint32_t AcquisitionStatus = 0x8104; /// R + static uint32_t SoftwareTrigger = 0x8108; /// W + static uint32_t GlobalTriggerMask = 0x810C; /// R/W + static uint32_t FrontPanelTRGOUTEnableMask = 0x8110; /// R/W + static uint32_t LVDSIOData = 0x8118; /// R/W + static uint32_t FrontPanelIOControl = 0x811C; /// R/W + static uint32_t ChannelEnableMask = 0x8120; /// R/W + static uint32_t ROCFPGAFirmwareRevision = 0x8124; /// R + static uint32_t EventStored = 0x812C; /// R + static uint32_t VoltageLevelModeConfig = 0x8138; /// R/W + static uint32_t SoftwareClockSync = 0x813C; /// W + static uint32_t BoardInfo = 0x8140; /// R + static uint32_t AnalogMonitorMode = 0x8144; /// R/W + static uint32_t EventSize = 0x814C; /// R + static uint32_t TimeBombDowncounter = 0x8158; /// R + static uint32_t FanSpeedControl = 0x8168; /// R/W + static uint32_t RunStartStopDelay = 0x8170; /// R/W + static uint32_t BoardFailureStatus = 0x8178; /// R + static uint32_t DisableExternalTrigger = 0x817C; /// R/W + static uint32_t TriggerValidationMask = 0x8180; /// R/W, 0x8180 + 4n + static uint32_t FrontPanelLVDSIONewFeatures = 0x81A0; /// R/W + static uint32_t BufferOccupancyGain = 0x81B4; /// R/W + static uint32_t ExtendedVetoDelay = 0x81C4; /// R/W + static uint32_t ReadoutControl = 0xEF00; /// R/W + static uint32_t ReadoutStatus = 0xEF04; /// R + static uint32_t BoardID = 0xEF08; /// R/W + static uint32_t MCSTBaseAddressAndControl = 0xEF0C; /// R/W + static uint32_t RelocationAddress = 0xEF10; /// R/W + static uint32_t InterruptStatusID = 0xEF14; /// R/W + static uint32_t InterruptEventNumber = 0xEF18; /// R/W + static uint32_t MaxNumberOfEventsPerBLT = 0xEF1C; /// R/W + static uint32_t Scratch = 0xEF20; /// R/W + static uint32_t SoftwareReset = 0xEF24; /// W + static uint32_t SoftwareClear = 0xEF28; /// W - RecordLength = 0x1020, /// R/W - InputDynamicRange = 0x1028, /// R/W - NumberEventsPerAggregate = 0x1034, /// R/W - PreTrigger = 0x1038, /// R/W - TriggerThreshold = 0x106C, /// R/W - TriggerHoldOffWidth = 0x1074, /// R/W - DPPAlgorithmControl = 0x1080, /// R/W - ChannelStatus = 0x1088, /// R - AMCFirmwareRevision = 0x108C, /// R - ChannelDCOffset = 0x1098, /// R/W - ChannelADCTemperature = 0x10A8, /// R - IndividualSoftwareTrigger = 0x10C0, /// W - VetoWidth = 0x10D4, /// R/W - - BoardConfiguration = 0x8000, /// R/W - AggregateOrganization = 0x800C, /// R/W - ADCCalibration = 0x809C, /// W - ChannelShutdown = 0x80BC, /// W - AcquisitionControl = 0x8100, /// R/W - AcquisitionStatus = 0x8104, /// R - SoftwareTrigger = 0x8108, /// W - GlobalTriggerMask = 0x810C, /// R/W - FrontPanelTRGOUTEnableMask = 0x8110, /// R/W - LVDSIOData = 0x8118, /// R/W - FrontPanelIOControl = 0x811C, /// R/W - ChannelEnableMask = 0x8120, /// R/W - ROCFPGAFirmwareRevision = 0x8124, /// R - EventStored = 0x812C, /// R - VoltageLevelModeConfig = 0x8138, /// R/W - SoftwareClockSync = 0x813C, /// W - BoardInfo = 0x8140, /// R - AnalogMonitorMode = 0x8144, /// R/W - EventSize = 0x814C, /// R - TimeBombDowncounter = 0x8158, /// R - FanSpeedControl = 0x8168, /// R/W - RunStartStopDelay = 0x8170, /// R/W - BoardFailureStatus = 0x8178, /// R - DisableExternalTrigger = 0x817C, /// R/W - TriggerValidationMask = 0x8180, /// R/W, 0x8180 + 4n - FrontPanelLVDSIONewFeatures = 0x81A0, /// R/W - BufferOccupancyGain = 0x81B4, /// R/W - ExtendedVetoDelay = 0x81C4, /// R/W - ReadoutControl = 0xEF00, /// R/W - ReadoutStatus = 0xEF04, /// R - BoardID = 0xEF08, /// R/W - MCSTBaseAddressAndControl = 0xEF0C, /// R/W - RelocationAddress = 0xEF10, /// R/W - InterruptStatusID = 0xEF14, /// R/W - InterruptEventNumber = 0xEF18, /// R/W - MaxNumberOfEventsPerBLT = 0xEF1C, /// R/W - Scratch = 0xEF20, /// R/W - SoftwareReset = 0xEF24, /// W - SoftwareClear = 0xEF28 /// W -}; -enum class RegisterPHA : uint32_t { - DataFlush = 0x103C, /// W not sure - ChannelStopAcquisition = 0x1040, /// R/W not sure - RCCR2SmoothingFactor = 0x1054, /// R/W Trigger Filter smoothing, triggerSmoothingFactor - InputRiseTime = 0x1058, /// R/W OK - TrapezoidRiseTime = 0x105C, /// R/W OK - TrapezoidFlatTop = 0x1060, /// R/W OK - PeakingTime = 0x1064, /// R/W OK - DecayTime = 0x1068, /// R/W OK - TriggerThreshold = 0x106C, /// R/W OK - RiseTimeValidationWindow = 0x1070, /// R/W OK - TriggerHoldOffWidth = 0x1074, /// R/W OK - PeakHoldOff = 0x1078, /// R/W OK - ShapedTriggerWidth = 0x1084, /// R/W not sure - DPPAlgorithmControl2 = 0x10A0, /// R/W OK - FineGain = 0x10C4, /// R/W OK -}; + namespace PHA { + static uint32_t DataFlush = 0x103C; /// W not sure + static uint32_t ChannelStopAcquisition = 0x1040; /// R/W not sure + static uint32_t RCCR2SmoothingFactor = 0x1054; /// R/W Trigger Filter smoothing, triggerSmoothingFactor + static uint32_t InputRiseTime = 0x1058; /// R/W OK + static uint32_t TrapezoidRiseTime = 0x105C; /// R/W OK + static uint32_t TrapezoidFlatTop = 0x1060; /// R/W OK + static uint32_t PeakingTime = 0x1064; /// R/W OK + static uint32_t DecayTime = 0x1068; /// R/W OK + static uint32_t TriggerThreshold = 0x106C; /// R/W OK + static uint32_t RiseTimeValidationWindow = 0x1070; /// R/W OK + static uint32_t TriggerHoldOffWidth = 0x1074; /// R/W OK + static uint32_t PeakHoldOff = 0x1078; /// R/W OK + static uint32_t ShapedTriggerWidth = 0x1084; /// R/W not sure + static uint32_t DPPAlgorithmControl2 = 0x10A0; /// R/W OK + static uint32_t FineGain = 0x10C4; /// R/W OK + } -enum class RegisterPSD : uint32_t { - CFDSetting = 0x103C, /// R/W - ForcedDataFlush = 0x1040, /// W - ChargeZeroSuppressionThreshold = 0x1044, /// R/W - ShortGateWidth = 0x1054, /// R/W - LongGateWidth = 0x1058, /// R/W - GateOffset = 0x105C, /// R/W - TriggerThreshold = 0x1060, /// R/W - FixedBaseline = 0x1064, /// R/W - TriggerLatency = 0x106C, /// R/W - ShapedTriggerWidth = 0x1070, /// R/W - TriggerHoldOffWidth = 0x1074, /// R/W - ThresholdForPSDCut = 0x1078, /// R/W - PureGapThreshold = 0x107C, /// R/W - DPPAlgorithmControl2 = 0x1084, /// R/W - EarlyBaselineFreeze = 0x10D8, /// R/W -}; + namespace PSD { + static uint32_t CFDSetting = 0x103C; /// R/W + static uint32_t ForcedDataFlush = 0x1040; /// W + static uint32_t ChargeZeroSuppressionThreshold = 0x1044; /// R/W + static uint32_t ShortGateWidth = 0x1054; /// R/W + static uint32_t LongGateWidth = 0x1058; /// R/W + static uint32_t GateOffset = 0x105C; /// R/W + static uint32_t TriggerThreshold = 0x1060; /// R/W + static uint32_t FixedBaseline = 0x1064; /// R/W + static uint32_t TriggerLatency = 0x106C; /// R/W + static uint32_t ShapedTriggerWidth = 0x1070; /// R/W + static uint32_t TriggerHoldOffWidth = 0x1074; /// R/W + static uint32_t ThresholdForPSDCut = 0x1078; /// R/W + static uint32_t PureGapThreshold = 0x107C; /// R/W + static uint32_t DPPAlgorithmControl2 = 0x1084; /// R/W + static uint32_t EarlyBaselineFreeze = 0x10D8; /// R/W + } + } +} #endif diff --git a/test.cpp b/test.cpp index 96e8835..667a089 100644 --- a/test.cpp +++ b/test.cpp @@ -1,14 +1,15 @@ -#include "DigitizerClass.h" +#include "DigitizerPHA.h" +//#include "DigitizerPSD.h" int main(int argc, char* argv[]){ DigitizerPHA * dig = new DigitizerPHA[2]; - DigitizerPSD * psd = new DigitizerPSD(); + //DigitizerPSD * psd = new DigitizerPSD(); dig[0].OpenDigitizer(0,0); dig[1].OpenDigitizer(1,0); - psd->OpenDigitizer(2,0); + //psd->OpenDigitizer(2,0); printf("======================= \n"); @@ -16,21 +17,36 @@ int main(int argc, char* argv[]){ //dig[0].SetDCOffset(0.2); //dig[0].SetDCOffset(0.3, 1); - dig[0].SetTrapezoidRescaling(0x1F); - dig[0].SetPulsePolarity(1); - dig[0].SetPulsePolarity(0, 1); + //dig[0].SetRecordLength(2000); + //dig[0].SetEventAggregation(0); + //dig[0].SetInputDynamicRange(0); + //dig[0].SetNumSamplePreTrigger(500); + //dig[0].SetDCOffset(0.1); + //dig[0].SetTriggerPolarity(0); + // + //dig[0].SetTrapezoidRescaling(31); + //dig[0].SetPeakSampling(3); + //dig[0].SetPulsePolarity(1); + //dig[0].SetBaselineSampling(4); + //dig[0].SetRollOverFlag(0); + //dig[0].SetPileUpFlag(1); + + //dig[0].SetPulsePolarity(0, 1); //for( int ch = 0; ch < dig[0].GetNChannel(); ch++){ // uint32_t data = dig[0].ReadRegister((uint32_t) RegisterDPP::ChannelDCOffset, ch); // printf(" %d %% \n", data ); //} - dig[0].GetChannelSetting(0); - dig[0].GetChannelSetting(1); + dig[0].SetTriggerThreshold(2400); + dig[0].SetTriggerHoldOff(100); - printf("temp : %d \n", dig[0].GetChTemperature(1)); + dig[0].PrintBoardConfiguration(); + dig[0].GetChannelSettingFromDigitizer(0); + dig[0].GetChannelSettingFromDigitizer(1); delete [] dig; + //delete psd; return 0; }