added triggerSummary, next consider save a copy of setting in memory
This commit is contained in:
parent
97413b41dd
commit
30a48743cb
32
ClassData.h
32
ClassData.h
|
@ -27,6 +27,7 @@ class Data{
|
|||
uint32_t BufferSize;
|
||||
|
||||
unsigned short NumEvents[MaxNChannels];
|
||||
double TriggerRate[MaxNChannels]; /// Hz
|
||||
unsigned long TotNumEvents[MaxNChannels];
|
||||
unsigned long long Timestamp[MaxNChannels][MaxNData];
|
||||
unsigned short Energy[MaxNChannels][MaxNData];
|
||||
|
@ -45,11 +46,11 @@ class Data{
|
|||
~Data();
|
||||
|
||||
void AllocateMemory();
|
||||
void FreeMemory();
|
||||
|
||||
void SetSaveWaveformToMemory(bool OnOff) { this->SaveWaveformToMemory = OnOff; }
|
||||
|
||||
void ClearData();
|
||||
void ClearTriggerRate();
|
||||
|
||||
void SaveBuffer(const char * fileName);
|
||||
|
||||
|
@ -87,18 +88,14 @@ inline Data::Data(){
|
|||
buffer = NULL;
|
||||
for ( int i = 0; i < MaxNChannels; i++) TotNumEvents[i] = 0;
|
||||
ClearData();
|
||||
ClearTriggerRate();
|
||||
SaveWaveformToMemory = true;
|
||||
nw = 0;
|
||||
saveFileIndex = 0;
|
||||
}
|
||||
|
||||
inline Data::~Data(){
|
||||
FreeMemory();
|
||||
///if( buffer != NULL ) delete buffer;
|
||||
///for( int i = 0 ; i < MaxNChannels; i++){
|
||||
/// delete Events [i];
|
||||
/// delete Waveform [i];
|
||||
///}
|
||||
delete buffer;
|
||||
}
|
||||
|
||||
inline void Data::AllocateMemory(){
|
||||
|
@ -113,11 +110,7 @@ inline void Data::AllocateMemory(){
|
|||
|
||||
}
|
||||
|
||||
|
||||
inline void Data::FreeMemory(){
|
||||
printf("======= Free memory\n");
|
||||
//delete buffer;
|
||||
}
|
||||
inline void Data::ClearTriggerRate(){ for( int i = 0 ; i < MaxNChannels; i++) TriggerRate[i] = 0.0; }
|
||||
|
||||
inline void Data::ClearData(){
|
||||
|
||||
|
@ -127,6 +120,7 @@ inline void Data::ClearData(){
|
|||
|
||||
for( int i = 0 ; i < MaxNChannels; i++){
|
||||
NumEvents[i] = 0;
|
||||
///TriggerRate[i] = 0.0;
|
||||
for( int j = 0; j < MaxNData; j++){
|
||||
Timestamp[i][j] = 0;
|
||||
Energy[i][j] = 0;
|
||||
|
@ -181,10 +175,7 @@ inline void Data::PrintStat(){
|
|||
printf("%2s | %6s | %9s | %6s\n", "ch", "# Evt.", "Rate [Hz]", "Tot. Evt.");
|
||||
printf("---+--------+-----------+----------\n");
|
||||
for(int ch = 0; ch < MaxNChannels; ch++){
|
||||
unsigned long long dTime = Timestamp[ch][NumEvents[ch]-1] - Timestamp[ch][0];
|
||||
double sec = dTime * ch2ns / 1e9;
|
||||
|
||||
printf("%2d | %6d | %9.2f | %6lu\n", ch, NumEvents[ch], NumEvents[ch]/sec, TotNumEvents[ch]);
|
||||
printf("%2d | %6d | %9.2f | %6lu\n", ch, NumEvents[ch], TriggerRate[ch], TotNumEvents[ch]);
|
||||
}
|
||||
printf("---+--------+-----------+----------\n");
|
||||
|
||||
|
@ -253,6 +244,15 @@ inline void Data::DecodeBuffer(int verbose){
|
|||
}
|
||||
nw++;
|
||||
}while(true);
|
||||
|
||||
|
||||
///Calculate trigger rate
|
||||
for(int ch = 0; ch < MaxNChannels; ch++){
|
||||
unsigned long long dTime = Timestamp[ch][NumEvents[ch]-1] - Timestamp[ch][0];
|
||||
double sec = dTime * ch2ns / 1e9;
|
||||
TriggerRate[ch] = NumEvents[ch]/sec;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, int verbose){
|
||||
|
|
34
FSUDAQ.cpp
34
FSUDAQ.cpp
|
@ -82,8 +82,8 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) {
|
|||
fMain->Connect("CloseWindow()", "MainWindow", this, "GoodBye()");
|
||||
|
||||
{///======================= menu
|
||||
fMenuBar = new TGMenuBar(fMain, 1, 1, kHorizontalFrame);
|
||||
fMain->AddFrame(fMenuBar, new TGLayoutHints(kLHintsTop | kLHintsExpandX));
|
||||
fMenuBar = new TGMenuBar(fMain, 1, 1, kHorizontalFrame); fMain->AddFrame(fMenuBar, new TGLayoutHints(kLHintsTop | kLHintsExpandX));
|
||||
|
||||
fMenuFile = new TGPopupMenu(gClient->GetRoot());
|
||||
fMenuFile->AddEntry("&Open File", M_FILE_OPEN);
|
||||
fMenuFile->AddSeparator();
|
||||
|
@ -100,15 +100,12 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) {
|
|||
fMenuDigitizers->AddEntry("&Channel Settings (PHA)", M_CH_SETTING_PHA);
|
||||
fMenuDigitizers->AddEntry("&Channel Settings (PSD)", M_CH_SETTING_PSD);
|
||||
fMenuDigitizers->AddEntry("&Register Setting", M_REGISTER_SETTING);
|
||||
fMenuDigitizers->AddSeparator();
|
||||
fMenuDigitizers->AddEntry("&Program Settings", M_PROGRAM_SETTINGS);
|
||||
//fMenuDigitizers->AddSeparator();
|
||||
//fMenuDigitizers->AddEntry("&Program Settings", M_PROGRAM_SETTINGS);
|
||||
fMenuDigitizers->Connect("Activated(Int_t)", "MainWindow", this, "HandleMenu(Int_t)");
|
||||
fMenuBar->AddPopup("&Digitizers", fMenuDigitizers, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0));
|
||||
|
||||
fMenuDigitizers->DisableEntry( M_TRIGGER_SUMMARY);
|
||||
fMenuDigitizers->DisableEntry( M_LOAD_SETTINGS);
|
||||
//fMenuDigitizers->DisableEntry( M_BOARD_SETTINGS);
|
||||
//fMenuDigitizers->DisableEntry( M_CH_SETTING);
|
||||
fMenuDigitizers->DisableEntry( M_REGISTER_SETTING);
|
||||
|
||||
fMenuUtility = new TGPopupMenu(gClient->GetRoot());
|
||||
fMenuUtility->AddEntry("Plot Channels Rate", M_SHOW_CHANNELS_RATE);
|
||||
|
@ -116,6 +113,7 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) {
|
|||
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));
|
||||
|
||||
}
|
||||
|
||||
TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain); fMain->AddFrame(hframe, new TGLayoutHints(kLHintsCenterX,2,2,2,2));
|
||||
|
@ -224,7 +222,8 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) {
|
|||
//HandleMenu(M_BOARD_SETTINGS);
|
||||
//HandleMenu(M_CH_SETTING_PHA);
|
||||
//HandleMenu(M_CH_SETTING_PSD);
|
||||
HandleMenu(M_REGISTER_SETTING);
|
||||
//HandleMenu(M_REGISTER_SETTING);
|
||||
HandleMenu(M_TRIGGER_SUMMARY);
|
||||
|
||||
gAnaTrace1 = new TGraph();
|
||||
gAnaTrace2 = new TGraph();
|
||||
|
@ -262,7 +261,7 @@ MainWindow::~MainWindow() {
|
|||
delete channelSettingPSD;
|
||||
|
||||
delete registerSetting;
|
||||
//delete scalarPanel;
|
||||
delete triggerSummary;
|
||||
|
||||
//delete saveDataThread;
|
||||
delete fillHistThread;
|
||||
|
@ -289,7 +288,6 @@ void MainWindow::HandleMenu(Int_t id){
|
|||
|
||||
OpenDigitizers();
|
||||
|
||||
//fMenuDigitizers->EnableEntry( M_TRIGGER_SUMMARY);
|
||||
//fMenuDigitizers->EnableEntry( M_BOARD_SETTINGS);
|
||||
//fMenuDigitizers->EnableEntry( M_CH_SETTING);
|
||||
|
||||
|
@ -304,9 +302,9 @@ void MainWindow::HandleMenu(Int_t id){
|
|||
///========================= Exit
|
||||
case M_EXIT: GoodBye(); break;
|
||||
|
||||
///========================= Channel setting summary
|
||||
///========================= Trigger summary
|
||||
case M_TRIGGER_SUMMARY: {
|
||||
|
||||
triggerSummary = new TriggerSummary(gClient->GetRoot(), 600, 600, digi, nDigi);
|
||||
}break;
|
||||
|
||||
///========================= Channel setting
|
||||
|
@ -472,6 +470,11 @@ void MainWindow::StopRun(){
|
|||
|
||||
digi[0]->StopACQ();
|
||||
|
||||
//Save last bit of buffer;
|
||||
|
||||
///===== clear data;
|
||||
digi[0]->GetData()->ClearTriggerRate();
|
||||
|
||||
bStartRun->SetEnabled(true);
|
||||
bStopRun->SetEnabled(false);
|
||||
dataPrefix->SetEnabled(true);
|
||||
|
@ -487,8 +490,7 @@ void MainWindow::StopRun(){
|
|||
}
|
||||
|
||||
void MainWindow::OpenChannelSetting(Int_t boardID){
|
||||
|
||||
printf("#### %s \n", __func__);
|
||||
if( digi == NULL ) return;
|
||||
|
||||
if( digi[boardID]->GetDPPType() == V1730_DPP_PHA_CODE ){
|
||||
channelSettingPHA = new ChannelSettingPHA(gClient->GetRoot(), 600, 600, digi, nDigi, boardID);
|
||||
|
@ -714,7 +716,7 @@ void * MainWindow::FillHistogram(void * ptr){
|
|||
|
||||
///Fill Channel Count
|
||||
for( int i = 0 ; i < digi[boardID]->GetNChannel(); i++){
|
||||
hChannel[boardID]->Fill(i, data->NumEvents[i]);
|
||||
for( int j = 0; j < data->NumEvents[i]; j++) hChannel[boardID]->Fill(i);
|
||||
}
|
||||
|
||||
///Fill Energy histogram
|
||||
|
|
8
FSUDAQ.h
8
FSUDAQ.h
|
@ -12,7 +12,6 @@
|
|||
#include <TGTextEditor.h>
|
||||
#include <TGTextEntry.h>
|
||||
|
||||
|
||||
#include "CAENDigitizer.h"
|
||||
|
||||
#include "macro.h"
|
||||
|
@ -22,9 +21,8 @@
|
|||
#include "channelSettingPHA.h"
|
||||
#include "channelSettingPSD.h"
|
||||
#include "registerSetting.h"
|
||||
#include "triggerSummary.h"
|
||||
|
||||
///#include "settingsSummary.h"
|
||||
///#include "scalarPanel.h"
|
||||
class TGWindow;
|
||||
class TGMainFrame;
|
||||
class TRootEmbeddedCanvas;
|
||||
|
@ -63,9 +61,8 @@ private:
|
|||
ChannelSettingPHA * channelSettingPHA;
|
||||
ChannelSettingPSD * channelSettingPSD;
|
||||
RegisterSetting * registerSetting;
|
||||
TriggerSummary * triggerSummary;
|
||||
|
||||
//ScalarPanel * scalarPanel;
|
||||
//
|
||||
//TThread * saveDataThread;
|
||||
TThread * fillHistThread;
|
||||
|
||||
|
@ -101,4 +98,5 @@ public:
|
|||
void OpenChannelSetting(Int_t);
|
||||
void LogMsg(char * );
|
||||
void GoodBye();
|
||||
|
||||
};
|
||||
|
|
7
Makefile
7
Makefile
|
@ -12,7 +12,7 @@ CAENLIBS = -lCAENDigitizer
|
|||
ROOTLIBS = `root-config --cflags --glibs`
|
||||
|
||||
#OBJS = channelSettingPSD.o channelSettingPHA.o boardSetting.o ClassDigitizer.o DigitizerPHA.o DigitizerPSD.o FSUDAQ.o
|
||||
OBJS = registerSetting.o channelSettingPSD.o channelSettingPHA.o boardSetting.o ClassDigitizer.o FSUDAQ.o
|
||||
OBJS = triggerSummary.o registerSetting.o channelSettingPSD.o channelSettingPHA.o boardSetting.o ClassDigitizer.o FSUDAQ.o
|
||||
|
||||
#########################################################################
|
||||
|
||||
|
@ -44,7 +44,6 @@ FSUDAQ : FSUDAQDict.cxx $(OBJS)
|
|||
|
||||
FSUDAQDict.cxx : FSUDAQ.h FSUDAQLinkDef.h
|
||||
@echo "----------- creating pcm and cxx for root"
|
||||
# @rootcling -f FSUDAQDict.cxx -c FSUDAQ.h -p FSUDAQLinkDef.h $(CAENLIBS)
|
||||
@rootcling -f FSUDAQDict.cxx -c FSUDAQ.h -p FSUDAQLinkDef.h
|
||||
|
||||
FSUDAQ.o : FSUDAQ.h FSUDAQ.cpp FSUDAQDict.cxx
|
||||
|
@ -67,6 +66,10 @@ registerSetting.o : registerSetting.h registerSetting.cpp
|
|||
@echo "----------- creating registerSetting.o"
|
||||
$(CC) $(COPTS) -c registerSetting.cpp $(ROOTLIBS)
|
||||
|
||||
triggerSummary.o : triggerSummary.h triggerSummary.cpp
|
||||
@echo "----------- creating triggerSummary.o"
|
||||
$(CC) $(COPTS) -c triggerSummary.cpp $(ROOTLIBS)
|
||||
|
||||
|
||||
#CutsCreator: $(OBJS3) src/CutsCreator.c
|
||||
# g++ -std=c++17 -pthread src/CutsCreator.c -o CutsCreator $(ROOTLIBS)
|
||||
|
|
|
@ -669,8 +669,11 @@ BoardSetting::BoardSetting(const TGWindow *p, UInt_t w, UInt_t h, Digitizer ** d
|
|||
|
||||
|
||||
///===== LVSD
|
||||
TGHorizontalFrame * hframeLVSD = new TGHorizontalFrame(vframe); vframe->AddFrame(hframeLVSD, new TGLayoutHints(kLHintsCenterY , 5,5,3,4));
|
||||
TGLabel * lbLVSD = new TGLabel(hframeLVSD, "LVSD Control is not impletmented."); hframeLVSD->AddFrame(lbLVSD, new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 5, 5, 3, 2));
|
||||
TGHorizontalFrame * hframeNote1 = new TGHorizontalFrame(vframe); vframe->AddFrame(hframeNote1, new TGLayoutHints(kLHintsCenterY , 5,5,0,0));
|
||||
TGLabel * lbNote1 = new TGLabel(hframeNote1, "LVSD Control is not impletmented."); hframeNote1->AddFrame(lbNote1, new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 5, 5, 0, 0));
|
||||
|
||||
TGHorizontalFrame * hframeNote2 = new TGHorizontalFrame(vframe); vframe->AddFrame(hframeNote2, new TGLayoutHints(kLHintsCenterY , 5,5,0,0));
|
||||
TGLabel * lbNote2 = new TGLabel(hframeNote2, "Trigger Validation Mask only for 0x8180."); hframeNote2->AddFrame(lbNote2, new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 5, 5, 0, 0));
|
||||
|
||||
///==================== Read digitizer Setting
|
||||
ChangeBoard();
|
||||
|
@ -855,7 +858,7 @@ void BoardSetting::ChangeBoard(){
|
|||
bGLBSoftwareTrigger->SetState( (( tempBits >> 31) & 0x1 ) == 0 ? kButtonUp : kButtonDown, false);
|
||||
|
||||
/// Trigger Validation Mask
|
||||
tempBits = digi[boardID]->ReadRegister(Register::DPP::TriggerValidationMask);
|
||||
tempBits = digi[boardID]->ReadRegister(Register::DPP::TriggerValidationMask_G);
|
||||
for( int i = 0; i < 8; i++){
|
||||
cbTRGValMskCh[i]->SetState( ((tempBits >> i ) & 0x1) == 0 ? kButtonUp : kButtonDown , false);
|
||||
}
|
||||
|
@ -1222,7 +1225,7 @@ void BoardSetting::SetTriggerValidMask(){ /// same for PHA and PSD
|
|||
|
||||
printf("bit : 0x%x \n", bit);
|
||||
|
||||
digi[boardID]->WriteRegister(Register::DPP::TriggerValidationMask, bit );
|
||||
digi[boardID]->WriteRegister(Register::DPP::TriggerValidationMask_G, bit );
|
||||
}
|
||||
|
||||
void BoardSetting::SetTRGOUTMask(){ /// same for PHA and PSD
|
||||
|
|
|
@ -60,7 +60,6 @@ RegisterSetting::RegisterSetting(const TGWindow *p, UInt_t w, UInt_t h, Digitize
|
|||
}
|
||||
|
||||
{///==================== Controls
|
||||
|
||||
TGHorizontalFrame *hframeAll = new TGHorizontalFrame(vframe, w, 50 ); vframe->AddFrame(hframeAll, layoutHints);
|
||||
|
||||
bSetALLChannel = new TGCheckButton(hframeAll, "Set ALL Channels", 1); hframeAll->AddFrame(bSetALLChannel, haha);
|
||||
|
@ -85,7 +84,7 @@ RegisterSetting::RegisterSetting(const TGWindow *p, UInt_t w, UInt_t h, Digitize
|
|||
|
||||
TGLabel * lbCh[MaxNChannels];
|
||||
|
||||
for( int i = 0; i < digi[boardID]->GetNChannel(); i++){
|
||||
for( int i = 0; i < ( digi == NULL ? MaxNChannels : digi[boardID]->GetNChannel() ); i++){
|
||||
|
||||
lbCh[i] = new TGLabel(vframe0, Form("%02d", i)); vframe0->AddFrame(lbCh[i], new TGLayoutHints(kLHintsRight, 5,5,3,2));
|
||||
|
||||
|
@ -139,15 +138,18 @@ RegisterSetting::~RegisterSetting(){
|
|||
}
|
||||
|
||||
void RegisterSetting::ChangeBoard(){
|
||||
if( digi == NULL ) return;
|
||||
|
||||
int DPPType = V1730_DPP_PHA_CODE;
|
||||
|
||||
if( digi != NULL ){
|
||||
int boardID = boardIDEntry->GetNumber();
|
||||
|
||||
DPPType = digi[boardID]->GetDPPType();
|
||||
}
|
||||
cbName->RemoveAll();
|
||||
|
||||
cbName->AddEntry("Address NOT Exist", 0);
|
||||
|
||||
if( digi[boardID]->GetDPPType() == V1730_DPP_PHA_CODE){ /// PHA
|
||||
if( DPPType == V1730_DPP_PHA_CODE){ /// PHA
|
||||
cbName->AddEntry("DPP::PHA::DataFlush_W" , Register::DPP::PHA::DataFlush_W );
|
||||
cbName->AddEntry("DPP::PHA::ChannelStopAcquisition" , Register::DPP::PHA::ChannelStopAcquisition );
|
||||
cbName->AddEntry("DPP::PHA::RCCR2SmoothingFactor" , Register::DPP::PHA::RCCR2SmoothingFactor );
|
||||
|
@ -165,7 +167,7 @@ void RegisterSetting::ChangeBoard(){
|
|||
cbName->AddEntry("DPP::PHA::FineGain" , Register::DPP::PHA::FineGain );
|
||||
}
|
||||
|
||||
if( digi[boardID]->GetDPPType() == V1730_DPP_PSD_CODE){ /// PSD
|
||||
if( DPPType == V1730_DPP_PSD_CODE){ /// PSD
|
||||
cbName->AddEntry("DPP::PSD::CFDSetting" , Register::DPP::PSD::CFDSetting );
|
||||
cbName->AddEntry("DPP::PSD::ForcedDataFlush_W" , Register::DPP::PSD::ForcedDataFlush_W );
|
||||
cbName->AddEntry("DPP::PSD::ChargeZeroSuppressionThreshold", Register::DPP::PSD::ChargeZeroSuppressionThreshold );
|
||||
|
@ -184,7 +186,7 @@ void RegisterSetting::ChangeBoard(){
|
|||
}
|
||||
|
||||
|
||||
if( digi[boardID]->GetDPPType() == V1730_DPP_PSD_CODE || digi[boardID]->GetDPPType() == V1730_DPP_PHA_CODE){
|
||||
if( DPPType == V1730_DPP_PSD_CODE || DPPType == V1730_DPP_PHA_CODE){
|
||||
cbName->AddEntry("DPP::RecordLength_G" , Register::DPP::RecordLength_G );
|
||||
cbName->AddEntry("DPP::InputDynamicRange" , Register::DPP::InputDynamicRange );
|
||||
cbName->AddEntry("DPP::NumberEventsPerAggregate_G" , Register::DPP::NumberEventsPerAggregate_G );
|
||||
|
@ -289,13 +291,13 @@ std::string RegisterSetting::GetRegisterName(uint32_t address){
|
|||
}
|
||||
|
||||
void RegisterSetting::UpdateRegister(){
|
||||
if( digi == NULL ) return;
|
||||
|
||||
int boardID = boardIDEntry->GetNumber();
|
||||
uint32_t address = cbName->GetSelected();
|
||||
|
||||
txtAddress->SetText(Form("0x%04X", address), false);
|
||||
|
||||
if( digi == NULL ) return;
|
||||
int boardID = boardIDEntry->GetNumber();
|
||||
|
||||
///check is the register readable
|
||||
std::string haha = cbName->GetSelectedEntry()->GetTitle();
|
||||
int type = haha.back();
|
||||
|
@ -382,9 +384,6 @@ void RegisterSetting::SetTxtValueUnit(uint32_t address, int ch){
|
|||
if( digi == NULL ) return;
|
||||
int boardID = boardIDEntry->GetNumber();
|
||||
|
||||
std::string unit = "";
|
||||
float valueUnit = 0;
|
||||
|
||||
int ch2ns = (int) digi[boardID]->GetCh2ns();
|
||||
|
||||
txtValueUnit[ch]->SetText("");
|
||||
|
@ -430,27 +429,34 @@ void RegisterSetting::SetTxtValueUnit(uint32_t address, int ch){
|
|||
}
|
||||
lbValueUnit->SetText("Value [ns]");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if( digi[boardID]->GetDPPType() == V1730_DPP_PSD_CODE){ /// PSD
|
||||
if( address == Register::DPP::PSD::CFDSetting ){
|
||||
|
||||
if( address == Register::DPP::PSD::ChargeZeroSuppressionThreshold ||
|
||||
address == Register::DPP::PSD::TriggerThreshold ||
|
||||
address == Register::DPP::PSD::FixedBaseline
|
||||
){
|
||||
txtValueUnit[ch]->SetText(Form("%d", value[ch]));
|
||||
lbValueUnit->SetText("Value [LSB]");
|
||||
}
|
||||
if( address == Register::DPP::PSD::ChargeZeroSuppressionThreshold ){
|
||||
if( address == Register::DPP::PSD::ShortGateWidth ||
|
||||
address == Register::DPP::PSD::LongGateWidth ||
|
||||
address == Register::DPP::PSD::GateOffset
|
||||
){
|
||||
txtValueUnit[ch]->SetText(Form("%d", ch2ns * value[ch]));
|
||||
lbValueUnit->SetText("Value [ns]");
|
||||
}
|
||||
if( address == Register::DPP::PSD::ShortGateWidth ){
|
||||
if( address == Register::DPP::PSD::TriggerLatency ||
|
||||
address == Register::DPP::PSD::ShapedTriggerWidth ||
|
||||
address == Register::DPP::PSD::TriggerHoldOffWidth ||
|
||||
address == Register::DPP::PSD::EarlyBaselineFreeze
|
||||
){
|
||||
txtValueUnit[ch]->SetText(Form("%d", 4* ch2ns * value[ch]));
|
||||
lbValueUnit->SetText("Value [ns]");
|
||||
}
|
||||
if( address == Register::DPP::PSD::PurGapThreshold ){
|
||||
//TODO
|
||||
}
|
||||
if( address == Register::DPP::PSD::LongGateWidth ){}
|
||||
if( address == Register::DPP::PSD::GateOffset ){}
|
||||
if( address == Register::DPP::PSD::TriggerThreshold ){}
|
||||
if( address == Register::DPP::PSD::FixedBaseline ){}
|
||||
if( address == Register::DPP::PSD::TriggerLatency ){}
|
||||
if( address == Register::DPP::PSD::ShapedTriggerWidth ){}
|
||||
if( address == Register::DPP::PSD::TriggerHoldOffWidth ){}
|
||||
if( address == Register::DPP::PSD::ThresholdForPSDCut ){}
|
||||
if( address == Register::DPP::PSD::PurGapThreshold ){}
|
||||
if( address == Register::DPP::PSD::EarlyBaselineFreeze ){}
|
||||
}
|
||||
|
||||
|
||||
|
@ -479,9 +485,6 @@ void RegisterSetting::SetTxtValueUnit(uint32_t address, int ch){
|
|||
lbValueUnit->SetText("Value [%]");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
unsigned int RegisterSetting::ConvertHexToDec(const char * text){
|
||||
|
@ -507,7 +510,6 @@ void RegisterSetting::TypeRegisterAddress(){
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void RegisterSetting::ChangeValue(){
|
||||
|
||||
printf("=============%s\n", __func__);
|
||||
|
@ -578,3 +580,6 @@ void RegisterSetting::SendChangeSignal(){
|
|||
Emit("SendChangeSignal()");
|
||||
}
|
||||
|
||||
void RegisterSetting::LogMsg(TString msg){
|
||||
Emit("LogMsg(char*)", msg.Data());
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ class RegisterSetting{
|
|||
void SetAllChannels();
|
||||
|
||||
void SendChangeSignal(); // *SIGNAL*
|
||||
|
||||
void LogMsg(TString msg); // *SIGNAL*
|
||||
|
||||
};
|
||||
|
||||
|
|
157
triggerSummary.cpp
Normal file
157
triggerSummary.cpp
Normal file
|
@ -0,0 +1,157 @@
|
|||
#include <TApplication.h>
|
||||
#include <TGClient.h>
|
||||
#include <TCanvas.h>
|
||||
#include <TF1.h>
|
||||
#include <TRandom.h>
|
||||
#include <TRootEmbeddedCanvas.h>
|
||||
#include <TGTableContainer.h>
|
||||
#include <TGFileDialog.h>
|
||||
|
||||
#include "triggerSummary.h"
|
||||
|
||||
Digitizer ** TriggerSummary::digi = NULL;
|
||||
int TriggerSummary::nDigi = 0;
|
||||
bool TriggerSummary::updateFlag = true;
|
||||
TGTextEntry * TriggerSummary::txtTrigger[MaxNBoards][MaxNChannels] = {NULL};
|
||||
TGTextEntry * TriggerSummary::txtThreshold[MaxNBoards][MaxNChannels] = {NULL};
|
||||
TGNumberEntry * TriggerSummary::numUpdateTime = NULL;
|
||||
|
||||
TriggerSummary::TriggerSummary(const TGWindow *p, UInt_t w, UInt_t h, Digitizer ** digi, int nBoard){
|
||||
|
||||
this->nDigi = nBoard;
|
||||
this->digi = digi;
|
||||
|
||||
fMain = new TGMainFrame(p,w,h);
|
||||
fMain->SetWindowName("Scalar Panel");
|
||||
fMain->Connect("CloseWindow()", "TriggerSummary", this, "CloseWindow()");
|
||||
|
||||
TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain); fMain->AddFrame(hframe);
|
||||
|
||||
TGLayoutHints * kaka = new TGLayoutHints(kLHintsLeft, 0,0,0,0); /// left, right, top, bottom
|
||||
|
||||
TGGroupFrame * gBD[nDigi];
|
||||
TGLabel * lbCh[nDigi][MaxNChannels];
|
||||
|
||||
for( int bd = 0; bd < nDigi; bd++){
|
||||
|
||||
gBD[bd] = new TGGroupFrame(hframe, Form("Board-%02d", bd), kHorizontalFrame); hframe->AddFrame(gBD[bd], new TGLayoutHints( kLHintsExpandY, 5, 0, 5, 5));
|
||||
|
||||
TGVerticalFrame * vframe0 = new TGVerticalFrame(gBD[bd]); gBD[bd]->AddFrame(vframe0, new TGLayoutHints(kLHintsCenterX, 0, 0, 0, 0));
|
||||
TGVerticalFrame * vframe1 = new TGVerticalFrame(gBD[bd]); gBD[bd]->AddFrame(vframe1, new TGLayoutHints(kLHintsCenterX, 0, 0, 0, 0));
|
||||
TGVerticalFrame * vframe2 = new TGVerticalFrame(gBD[bd]); gBD[bd]->AddFrame(vframe2, new TGLayoutHints(kLHintsCenterX, 0, 0, 0, 0));
|
||||
|
||||
TGLabel * lbCh0 = new TGLabel(vframe0, "ch"); vframe0->AddFrame(lbCh0, new TGLayoutHints(kLHintsCenterY, 0,5,3,2));
|
||||
TGLabel * lbTrigger = new TGLabel(vframe1, "Trig.[Hz]"); vframe1->AddFrame(lbTrigger, new TGLayoutHints(kLHintsCenterY, 5,5,3,2));
|
||||
TGLabel * lbThreshold = new TGLabel(vframe2, "Thres."); vframe2->AddFrame(lbThreshold, new TGLayoutHints(kLHintsCenterY, 5,5,3,2));
|
||||
|
||||
for( int ch = 0; ch < (digi == NULL ? MaxNChannels: digi[bd]->GetNChannel()); ch++){
|
||||
lbCh[bd][ch] = new TGLabel(vframe0, Form("%02d", ch)); vframe0->AddFrame(lbCh[bd][ch], new TGLayoutHints(kLHintsCenterY, 0,5,3,2));
|
||||
|
||||
txtTrigger[bd][ch] = new TGTextEntry(vframe1, ""); vframe1->AddFrame(txtTrigger[bd][ch], kaka);
|
||||
txtTrigger[bd][ch]->Resize(50,20);
|
||||
txtTrigger[bd][ch]->SetEnabled(false);
|
||||
txtTrigger[bd][ch]->SetAlignment(kTextRight);
|
||||
|
||||
txtThreshold[bd][ch] = new TGTextEntry(vframe2, ""); vframe2->AddFrame(txtThreshold[bd][ch], kaka);
|
||||
txtThreshold[bd][ch]->Resize(50,20);
|
||||
txtThreshold[bd][ch]->SetAlignment(kTextRight);
|
||||
txtThreshold[bd][ch]->Connect("ReturnPressed()", "TriggerSummary", this, "SetThreshold()");
|
||||
|
||||
value[bd][ch] = 0;
|
||||
|
||||
if( digi != NULL ){
|
||||
if( digi[bd]->GetDPPType() == V1730_DPP_PSD_CODE ) value[bd][ch] = digi[bd]->ReadRegister(Register::DPP::PSD::TriggerThreshold, ch);
|
||||
if( digi[bd]->GetDPPType() == V1730_DPP_PHA_CODE ) value[bd][ch] = digi[bd]->ReadRegister(Register::DPP::PHA::TriggerThreshold, ch);
|
||||
}
|
||||
txtThreshold[bd][ch]->SetText(Form("%d", value[bd][ch]), false);
|
||||
}
|
||||
}
|
||||
|
||||
TGHorizontalFrame * hframeSetting = new TGHorizontalFrame(fMain); fMain->AddFrame(hframeSetting, new TGLayoutHints(kLHintsExpandX));
|
||||
|
||||
TGLabel * lbUpDateTime = new TGLabel(hframeSetting, "Update Period [msec]:");
|
||||
hframeSetting->AddFrame(lbUpDateTime, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,3,3));
|
||||
|
||||
numUpdateTime = new TGNumberEntry(hframeSetting, 500, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative);
|
||||
hframeSetting->AddFrame(numUpdateTime, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,3,3));
|
||||
numUpdateTime->Resize(50, 20);
|
||||
|
||||
fMain->MapSubwindows();
|
||||
fMain->Resize(fMain->GetDefaultSize());
|
||||
fMain->MapWindow();
|
||||
|
||||
updateFlag = true;
|
||||
|
||||
if( digi != NULL ){
|
||||
printf("-------- %s thread\n", __func__);
|
||||
thread = new TThread("hahaha", UpdateTriggerRate, (void *) 0);
|
||||
thread->Run();
|
||||
}
|
||||
}
|
||||
|
||||
TriggerSummary::~TriggerSummary(){
|
||||
|
||||
printf("Close %s \n", __func__);
|
||||
|
||||
for(int i = 0; i < nDigi; i++){
|
||||
for(int j = 0; j < MaxNChannels; j++){
|
||||
delete txtTrigger[i][j];
|
||||
delete txtThreshold[i][j];
|
||||
}
|
||||
}
|
||||
|
||||
delete numUpdateTime;
|
||||
|
||||
updateFlag = false;
|
||||
usleep(1000 * 1000);
|
||||
|
||||
///delete thread; /// Don;t delete the thread, otherwise, thread will not run after close and reopen.
|
||||
|
||||
fMain->Cleanup();
|
||||
delete fMain;
|
||||
}
|
||||
|
||||
void * TriggerSummary::UpdateTriggerRate(void * ptr){
|
||||
|
||||
while( updateFlag){
|
||||
|
||||
for( int bd = 0; bd < nDigi; bd++){
|
||||
for( int ch = 0; ch < digi[bd]->GetNChannel(); ch++){
|
||||
txtTrigger[bd][ch]->SetText(Form("%.2f", digi[bd]->GetData()->TriggerRate[ch]));
|
||||
}
|
||||
}
|
||||
|
||||
usleep(numUpdateTime->GetNumber() * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
void TriggerSummary::SetThreshold(){
|
||||
if( digi == NULL ) return;
|
||||
|
||||
for( int bd = 0; bd < nDigi; bd++){
|
||||
for( int ch = 0; ch < digi[bd]->GetNChannel(); ch++){
|
||||
|
||||
unsigned short haha = atoi( txtThreshold[bd][ch]->GetText());
|
||||
|
||||
if( value[bd][ch] != haha ){
|
||||
if( digi[bd]->GetDPPType() == V1730_DPP_PSD_CODE ) {
|
||||
|
||||
|
||||
digi[bd]->WriteRegister(Register::DPP::PSD::TriggerThreshold, haha, ch);
|
||||
|
||||
value[bd][ch] = digi[bd]->ReadRegister(Register::DPP::PSD::TriggerThreshold, ch);
|
||||
|
||||
}
|
||||
if( digi[bd]->GetDPPType() == V1730_DPP_PHA_CODE ) {
|
||||
digi[bd]->WriteRegister(Register::DPP::PHA::TriggerThreshold, haha, ch);
|
||||
|
||||
value[bd][ch] = digi[bd]->ReadRegister(Register::DPP::PHA::TriggerThreshold, ch);
|
||||
|
||||
}
|
||||
|
||||
txtThreshold[bd][ch]->SetText(Form("%d", value[bd][ch]), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
47
triggerSummary.h
Normal file
47
triggerSummary.h
Normal file
|
@ -0,0 +1,47 @@
|
|||
#ifndef TRIGGER_SUMMARY_H
|
||||
#define TRIGGER_SUMMARY_H
|
||||
|
||||
#include <TQObject.h>
|
||||
#include <RQ_OBJECT.h>
|
||||
#include <TGNumberEntry.h>
|
||||
#include <TGButton.h>
|
||||
#include <TGComboBox.h>
|
||||
#include <TThread.h>
|
||||
#include <TGLabel.h>
|
||||
#include "ClassDigitizer.h"
|
||||
#include "macro.h"
|
||||
|
||||
class TGWindow;
|
||||
class TGMainFrame;
|
||||
|
||||
class TriggerSummary{
|
||||
RQ_OBJECT("TriggerSummary")
|
||||
private:
|
||||
TGMainFrame * fMain;
|
||||
|
||||
static int nDigi;
|
||||
static Digitizer ** digi;
|
||||
|
||||
static TGTextEntry * txtTrigger[MaxNBoards][MaxNChannels];
|
||||
static TGTextEntry * txtThreshold[MaxNBoards][MaxNChannels];
|
||||
|
||||
TThread * thread;
|
||||
static bool updateFlag;
|
||||
static TGNumberEntry * numUpdateTime;
|
||||
|
||||
unsigned short value[MaxNBoards][MaxNChannels];
|
||||
|
||||
public:
|
||||
TriggerSummary(const TGWindow *p, UInt_t w, UInt_t h, Digitizer ** digi, int nBoard);
|
||||
virtual ~TriggerSummary();
|
||||
|
||||
void CloseWindow() { delete this;}
|
||||
|
||||
static void * UpdateTriggerRate(void *ptr);
|
||||
|
||||
void SetThreshold();
|
||||
void SetThreshold(int boardID, int ch, unsigned short val) { value[boardID][ch] = val; }
|
||||
};
|
||||
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user