From d119ebefd462d911834ba112aa50d8f472afe654 Mon Sep 17 00:00:00 2001 From: "carina@hades" Date: Mon, 3 Oct 2022 14:17:15 -0400 Subject: [PATCH] allow ploting of energy, count, and trace when start run. next, enable save data --- ClassData.h | 3 +- FSUDAQ.cpp | 185 +++++++++++++++--- FSUDAQ.h | 10 +- Makefile | 19 +- DigitizerPHA.cpp => Obsolete/DigitizerPHA.cpp | 0 DigitizerPHA.h => Obsolete/DigitizerPHA.h | 0 DigitizerPSD.cpp => Obsolete/DigitizerPSD.cpp | 0 DigitizerPSD.h => Obsolete/DigitizerPSD.h | 0 boardSetting.h | 3 +- channelSettingPHA.cpp | 8 +- 10 files changed, 185 insertions(+), 43 deletions(-) rename DigitizerPHA.cpp => Obsolete/DigitizerPHA.cpp (100%) rename DigitizerPHA.h => Obsolete/DigitizerPHA.h (100%) rename DigitizerPSD.cpp => Obsolete/DigitizerPSD.cpp (100%) rename DigitizerPSD.h => Obsolete/DigitizerPSD.h (100%) diff --git a/ClassData.h b/ClassData.h index 4566c81..8d316e3 100644 --- a/ClassData.h +++ b/ClassData.h @@ -100,7 +100,8 @@ inline Data::~Data(){ inline void Data::AllocateMemory(){ - //delete buffer; + delete buffer; + //TODO calculate Suitable buffer size BufferSize = 1000000; /// 1M byte buffer = (char *) malloc( BufferSize); printf("Allocated %d byte for buffer \n", BufferSize); diff --git a/FSUDAQ.cpp b/FSUDAQ.cpp index 8eeb608..45f68e2 100644 --- a/FSUDAQ.cpp +++ b/FSUDAQ.cpp @@ -44,16 +44,31 @@ enum ModeIdentifiers{ }; +long get_time(){ + long time_ms; + struct timeval t1; + struct timezone tz; + gettimeofday(&t1, &tz); + time_ms = (t1.tv_sec) * 1000 + t1.tv_usec / 1000; + return time_ms; +} + ///make static members Digitizer ** MainWindow::digi = NULL; TGTextEdit * MainWindow::teLog = NULL; TRootEmbeddedCanvas * MainWindow::fEcanvas = NULL; TGNumberEntry * MainWindow::boardIDEntry = NULL; TGNumberEntry * MainWindow::chIDEntry = NULL; +TGComboBox* MainWindow::cbMode = NULL; TH1F * MainWindow::hEnergy[MaxNBoards][MaxNChannels] = {NULL}; TH1F * MainWindow::hChannel[MaxNBoards] = {NULL}; +TGraph * MainWindow::gAnaTrace1 = NULL ; +TGraph * MainWindow::gAnaTrace2 = NULL ; +TGraph * MainWindow::gDigiTrace1 = NULL ; +TGraph * MainWindow::gDigiTrace2 = NULL ; + MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { nDigi = 0; @@ -142,7 +157,7 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { } {///================= single Channel group - TGGroupFrame * group1 = new TGGroupFrame(hframe, "Single Channel", kHorizontalFrame); hframe->AddFrame(group1 ); + TGGroupFrame * group1 = new TGGroupFrame(hframe, "Single Channel", kHorizontalFrame); hframe->AddFrame(group1, new TGLayoutHints(kLHintsExpandY)); TGHorizontalFrame *hfg1 = new TGHorizontalFrame(group1,200,30); group1->AddFrame(hfg1 ,new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0)); TGLayoutHints * haha = new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 10, 0); ///left, right, top, bottom @@ -206,10 +221,10 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { //HandleMenu(M_CH_SETTING_PHA); //HandleMenu(M_CH_SETTING_PSD); - gAnaTrace1 = NULL; - gAnaTrace2 = NULL; - gDigiTrace1 = NULL; - gDigiTrace2 = NULL; + gAnaTrace1 = new TGraph(); + gAnaTrace2 = new TGraph(); + gDigiTrace1 = new TGraph(); + gDigiTrace2 = new TGraph(); gStyle->SetOptStat("neiou"); @@ -293,13 +308,13 @@ void MainWindow::HandleMenu(Int_t id){ case M_CH_SETTING_PHA: channelSettingPHA = new ChannelSettingPHA(gClient->GetRoot(), 600, 600, digi, nDigi, 0); channelSettingPHA->Connect("LogMsg(char*)", "MainWindow", this, "LogMsg(char*)"); - + channelSettingPHA->Connect("SendPlotTraceCmd()", "MainWindow", this, "PlotSingleTrace()"); break; case M_CH_SETTING_PSD: channelSettingPSD = new ChannelSettingPSD(gClient->GetRoot(), 600, 600, digi, nDigi, 0); channelSettingPSD->Connect("LogMsg(char*)", "MainWindow", this, "LogMsg(char*)"); - + //channelSettingPSD->Connect("SendPlotTraceCmd()", "MainWindow", this, "PlotSingleTrace()"); break; ///========================= Board setting @@ -382,7 +397,7 @@ void MainWindow::OpenDigitizers(){ bStartRun->SetEnabled(true); - boardIDEntry->SetState(true); + if( nDigi <= 1) boardIDEntry->SetState(true); chIDEntry->SetState(true); boardIDEntry->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, nDigi-1); @@ -390,9 +405,10 @@ void MainWindow::OpenDigitizers(){ chIDEntry->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, digi[0]->GetNChannel() -1 ); bPlotSingleTrace->SetEnabled(true); + bFitTrace->SetEnabled(true); for( int i = 0; i < nDigi; i++){ - hChannel[i] = new TH1F(Form("hBd%02d", i),Form("hBd%02d; ch; count", i), digi[i]->GetNChannel(), 0, digi[i]->GetNChannel()-1); + hChannel[i] = new TH1F(Form("hBd%02d", i),Form("hBd%02d; ch; count", i), digi[i]->GetNChannel(), 0, digi[i]->GetNChannel()); for( int j = 0; j < MaxNChannels; j++) hEnergy[i][j] = new TH1F(Form("hE%02dch%02d", i, j),Form("hE bd-%02d ch-%02d; Energy[ch]; count", i, j), 400, 0, 20000); } @@ -425,12 +441,22 @@ void MainWindow::StartRun(){ bStartRun->SetEnabled(false); bStopRun->SetEnabled(true); - + dataPrefix->SetEnabled(false); + runIDEntry->SetState(false); + bPlotSingleTrace->SetEnabled(false); + bFitTrace->SetEnabled(false); digi[0]->StartACQ(); - if( digi[0]->IsRunning() ) fillHistThread->Run(); - + if( digi[0]->IsRunning() ) { + int mode = cbMode->GetSelected(); + + if( mode == Mode_DataRun){ + + }else{ + fillHistThread->Run(); + } + } } void MainWindow::StopRun(){ @@ -441,6 +467,10 @@ void MainWindow::StopRun(){ bStartRun->SetEnabled(true); bStopRun->SetEnabled(false); + dataPrefix->SetEnabled(true); + runIDEntry->SetState(true); + bPlotSingleTrace->SetEnabled(true); + bFitTrace->SetEnabled(true); if( cbMode->GetSelected() == Mode_DataRun ){ int runID = runIDEntry->GetNumber(); @@ -461,6 +491,7 @@ void MainWindow::OpenChannelSetting(Int_t boardID){ if( digi[boardID]->GetDPPType() == V1730_DPP_PSD_CODE ){ channelSettingPSD = new ChannelSettingPSD(gClient->GetRoot(), 600, 600, digi, nDigi, boardID); channelSettingPSD->Connect("LogMsg(char*)", "MainWindow", this, "LogMsg(char*)"); + //channelSettingPSD->Connect("SendPlotTraceCmd()", "MainWindow", this, "PlotSingleTrace()"); } } @@ -509,8 +540,7 @@ void MainWindow::PlotSingleTrace(){ data->DecodeBuffer(0); data->PrintStat(); - delete gAnaTrace1; gAnaTrace1 = new TGraph(); - delete gDigiTrace1; gDigiTrace1 = new TGraph(); gDigiTrace1->SetLineColor(4); + gDigiTrace1->SetLineColor(4); int traceLength = (data->Waveform1[chID][0]).size(); @@ -520,9 +550,21 @@ void MainWindow::PlotSingleTrace(){ LogMsg((char *)"no trace"); bFitTrace->SetEnabled(false); }else{ + for( int i = 0; i < traceLength ; i++) { gAnaTrace1->SetPoint(i, i*ch2ns, (data->Waveform1[chID][0])[i]); - gDigiTrace1->SetPoint(i, i*ch2ns, 2000*(data->DigiWaveform1[chID][0])[i] + 2000); + } + if( traceLength <= gAnaTrace1->GetN() ){ + for( int i = gAnaTrace1->GetN() -1 ; i >= traceLength ; i--){ + gAnaTrace1->RemovePoint(i); + gDigiTrace1->RemovePoint(i); + } + } + + double xmin, xmax, ymin, ymax; + gAnaTrace1->ComputeRange(xmin, ymin, xmax, ymax); + for( int i = 0; i < traceLength ; i++) { + gDigiTrace1->SetPoint(i, i*ch2ns, (ymax-ymin)*(data->DigiWaveform1[chID][0])[i] + ymin); } } data->ClearData(); @@ -545,8 +587,48 @@ void MainWindow::PlotSingleTrace(){ } + +Double_t traceFunc(Double_t *x, Double_t *par){ + ///par[0] = baseline + ///par[1] = start time + ///par[2] = rise time + ///par[3] = Amp + ///par[4] = decay time + Double_t result = par[0]; + if(x[0] > par[1]){ + Double_t y = x[0]-par[1]; + result += par[3] *(1 - TMath::Exp( - y / par[2])) * TMath::Exp(-y / par[4]); + } + return result; +} + void MainWindow::FitTrace(){ printf("=== %s not impletement.\n", __func__); + + if( gAnaTrace1->GetN() == 0 ) return; + + double xmin, xmax, ymin, ymax; + gAnaTrace1->ComputeRange(xmin, ymin, xmax, ymax); + + TF1 * f1 = new TF1("f1", traceFunc, xmin, xmax, 5); + f1->SetLineWidth(3); + f1->SetLineColor(1); + f1->SetNpx(1000); + f1->SetParameter(0, ymin); + f1->SetParameter(1, 1000); //TODO get from digi[Board]->PreTrigger * 4 * ch2ns + f1->SetParameter(2, 20); + f1->SetParameter(3, ymax-ymin); + f1->SetParameter(4, 50000); + + gAnaTrace1->Fit("f1", "R"); + fEcanvas->GetCanvas()->Update(); + gSystem->ProcessEvents(); + + const Double_t* paraE = f1->GetParErrors(); + const Double_t* paraA = f1->GetParameters(); + + LogMsg((char*)"---------- Fit result"); + } void * MainWindow::FillHistogram(void * ptr){ @@ -558,34 +640,89 @@ void * MainWindow::FillHistogram(void * ptr){ //int ch = chIDEntry->GetNumber(); int boardID = 0; int ch = 0; + int ch2ns = 4; + int traceLength = 0; + uint32_t PreviousTime = get_time(); + uint32_t CurrentTime = 0; + uint32_t ElapsedTime = 0; Data * data = digi[boardID]->GetData(); data->AllocateMemory(); - + while(digi[boardID]->IsRunning()){ - usleep(100*1000); /// wait half sec + usleep(100*1000); /// wait 100 msec digi[boardID]->ReadData(); + ch2ns = (int) digi[boardID]->GetCh2ns(); + ch = chIDEntry->GetNumber(); + + if( data->nByte > 0 ){ - data->DecodeBuffer(0); - data->PrintStat(); + //data->PrintStat(); + if( cbMode->GetSelected() == Mode_DataRun ){ + // Rate graph? + + + }else{ + + data->DecodeBuffer(0); + + fEcanvas->GetCanvas()->cd(); + + ///Fill trace + if( cbMode->GetSelected() == Mode_Oscilloscope){ + + unsigned short nData = data->NumEvents[ch]; + traceLength = (data->Waveform1[ch][nData-1]).size(); + if( traceLength > 0 ){ + for( int i = 0; i < traceLength; i++) { + gAnaTrace1->SetPoint(i, i*ch2ns, (data->Waveform1[ch][nData-1])[i]); + } + + if( traceLength <= gAnaTrace1->GetN() ){ + for( int i = gAnaTrace1->GetN() -1 ; i >= traceLength ; i--){ + gAnaTrace1->RemovePoint(i); + } + } + gAnaTrace1->Draw("APL"); + } + } + + } + } + + CurrentTime = get_time(); + ElapsedTime = CurrentTime - PreviousTime; /// milliseconds + + if( ElapsedTime > 500 ){ + + ///Fill Channel Count + for( int i = 0 ; i < digi[boardID]->GetNChannel(); i++){ + hChannel[boardID]->Fill(i, data->NumEvents[i]); + } + + ///Fill Energy histogram //for( int ch = 0; ch < digi[boardID]->GetNChannel(); ch++){ for( int i = 0; i < data->NumEvents[ch]; i++){ hEnergy[boardID][ch]->Fill( data->Energy[ch][i]); } //} - + + if( cbMode->GetSelected() == Mode_EnergyHist ) hEnergy[boardID][ch]->Draw("hist"); + if( cbMode->GetSelected() == Mode_CountHist ) hChannel[boardID]->Draw("hist"); + data->ClearData(); + PreviousTime = CurrentTime; - fEcanvas->GetCanvas()->cd(); - hEnergy[boardID][ch]->Draw(); - fEcanvas->GetCanvas()->Update(); - gSystem->ProcessEvents(); } + + fEcanvas->GetCanvas()->Update(); + gSystem->ProcessEvents(); + } return ptr; diff --git a/FSUDAQ.h b/FSUDAQ.h index 243c3e1..c47209a 100644 --- a/FSUDAQ.h +++ b/FSUDAQ.h @@ -45,7 +45,7 @@ private: TGTextButton *bOpenDigitizers; TGTextButton *bStartRun; TGTextButton *bStopRun; - TGComboBox* cbMode; + static TGComboBox* cbMode; TGTextEntry * dataPrefix; TGNumberEntry * runIDEntry; @@ -71,10 +71,10 @@ private: static TH1F * hEnergy [MaxNBoards][MaxNChannels]; static TH1F * hChannel[MaxNBoards]; - TGraph * gAnaTrace1; /// analogy trace 1 - TGraph * gAnaTrace2; /// analogy trace 2 - TGraph * gDigiTrace1; /// digital trace 1 - TGraph * gDigiTrace2; /// digital trace 1 + static TGraph * gAnaTrace1; /// analogy trace 1 + static TGraph * gAnaTrace2; /// analogy trace 2 + static TGraph * gDigiTrace1; /// digital trace 1 + static TGraph * gDigiTrace2; /// digital trace 1 public: MainWindow(const TGWindow *p, UInt_t w, UInt_t h); diff --git a/Makefile b/Makefile index fba2ce7..8c107b2 100755 --- a/Makefile +++ b/Makefile @@ -11,7 +11,8 @@ CAENLIBS = -lCAENDigitizer ROOTLIBS = `root-config --cflags --glibs` -OBJS = channelSettingPSD.o channelSettingPHA.o boardSetting.o ClassDigitizer.o DigitizerPHA.o DigitizerPSD.o FSUDAQ.o +#OBJS = channelSettingPSD.o channelSettingPHA.o boardSetting.o ClassDigitizer.o DigitizerPHA.o DigitizerPSD.o FSUDAQ.o +OBJS = channelSettingPSD.o channelSettingPHA.o boardSetting.o ClassDigitizer.o FSUDAQ.o ######################################################################### @@ -23,15 +24,15 @@ clean : ClassDigitizer.o : ClassDigitizer.cpp ClassDigitizer.h RegisterAddress.h macro.h ClassData.h $(CC) $(COPTS) -c ClassDigitizer.cpp -DigitizerPHA.o : DigitizerPHA.cpp DigitizerPHA.h ClassDigitizer.o - $(CC) $(COPTS) -c DigitizerPHA.cpp +#DigitizerPHA.o : DigitizerPHA.cpp DigitizerPHA.h ClassDigitizer.o +# $(CC) $(COPTS) -c DigitizerPHA.cpp +# +#DigitizerPSD.o : DigitizerPSD.cpp DigitizerPSD.h ClassDigitizer.o +# $(CC) $(COPTS) -c DigitizerPSD.cpp -DigitizerPSD.o : DigitizerPSD.cpp DigitizerPSD.h ClassDigitizer.o - $(CC) $(COPTS) -c DigitizerPSD.cpp - -test : test.cpp ClassDigitizer.o DigitizerPHA.o DigitizerPSD.o +test : test.cpp ClassDigitizer.o @echo "--------- making test" - $(CC) $(COPTS) -o test test.cpp ClassDigitizer.o DigitizerPHA.o DigitizerPSD.o $(CAENLIBS) $(ROOTLIBS) + $(CC) $(COPTS) -o test test.cpp ClassDigitizer.o $(CAENLIBS) $(ROOTLIBS) test_indep : test_indep.cpp RegisterAddress.h macro.h @echo "--------- making test_indep" @@ -48,7 +49,7 @@ FSUDAQDict.cxx : FSUDAQ.h FSUDAQLinkDef.h FSUDAQ.o : FSUDAQ.h FSUDAQ.cpp FSUDAQDict.cxx @echo "----------- creating FSUDAQ.o" - $(CC) $(COPTS) -c FSUDAQ.cpp ClassDigitizer.cpp DigitizerPHA.cpp DigitizerPSD.cpp $(ROOTLIBS) + $(CC) $(COPTS) -c FSUDAQ.cpp ClassDigitizer.cpp $(ROOTLIBS) boardSetting.o : boardSetting.h boardSetting.cpp @echo "----------- creating boardSetting.o" diff --git a/DigitizerPHA.cpp b/Obsolete/DigitizerPHA.cpp similarity index 100% rename from DigitizerPHA.cpp rename to Obsolete/DigitizerPHA.cpp diff --git a/DigitizerPHA.h b/Obsolete/DigitizerPHA.h similarity index 100% rename from DigitizerPHA.h rename to Obsolete/DigitizerPHA.h diff --git a/DigitizerPSD.cpp b/Obsolete/DigitizerPSD.cpp similarity index 100% rename from DigitizerPSD.cpp rename to Obsolete/DigitizerPSD.cpp diff --git a/DigitizerPSD.h b/Obsolete/DigitizerPSD.h similarity index 100% rename from DigitizerPSD.h rename to Obsolete/DigitizerPSD.h diff --git a/boardSetting.h b/boardSetting.h index 47055f8..cbf0dd7 100644 --- a/boardSetting.h +++ b/boardSetting.h @@ -8,8 +8,7 @@ #include #include #include -#include "DigitizerPHA.h" -#include "DigitizerPSD.h" +#include "ClassDigitizer.h" #include "macro.h" #define NUM_BOARD_INFO 9 diff --git a/channelSettingPHA.cpp b/channelSettingPHA.cpp index 34674be..6c790e2 100644 --- a/channelSettingPHA.cpp +++ b/channelSettingPHA.cpp @@ -707,6 +707,10 @@ void ChannelSettingPHA::SetTriggerSmoothing(){ void ChannelSettingPHA::ReadTrace(){ printf("=== %s\n", __func__); ///Send plot trace to MainWindows - Emit("SendPlotTraceCmd()"); - + SendPlotTraceCmd(); +} + +void ChannelSettingPHA::SendPlotTraceCmd(){ + printf("=== %s\n", __func__); + Emit("SendPlotTraceCmd()"); }