various bugs fix, add StartStopDialog for run comment, added channel on/off in TriggerSummary.

This commit is contained in:
carina@hades 2022-11-01 18:38:01 -04:00
parent 8742f7f284
commit 6cfb1f32eb
21 changed files with 396 additions and 190 deletions

View File

@ -31,9 +31,6 @@ class Data{
unsigned long TotNumEvents[MaxNChannels]; unsigned long TotNumEvents[MaxNChannels];
unsigned short NumEventsDecoded[MaxNChannels]; unsigned short NumEventsDecoded[MaxNChannels];
unsigned long long firstTimestamp[MaxNChannels];
unsigned long long lastTimestamp[MaxNChannels];
/// stored Raw event /// stored Raw event
bool IsNotRollOverFakeAgg; bool IsNotRollOverFakeAgg;
unsigned short NumEvents[MaxNChannels]; unsigned short NumEvents[MaxNChannels];
@ -113,7 +110,7 @@ inline Data::Data(){
inline Data::~Data(){ inline Data::~Data(){
printf("----- %s \n", __func__); printf("----- %s \n", __func__);
delete buffer; if( buffer != NULL ) delete buffer;
} }
inline void Data::AllocateMemory(uint32_t size){ inline void Data::AllocateMemory(uint32_t size){
@ -140,8 +137,6 @@ inline void Data::ClearData(){
IsNotRollOverFakeAgg = false; IsNotRollOverFakeAgg = false;
for( int i = 0 ; i < MaxNChannels; i++){ for( int i = 0 ; i < MaxNChannels; i++){
NumEvents[i] = 0; NumEvents[i] = 0;
firstTimestamp[0] = -1;
lastTimestamp[0] = 0;
for( int j = 0; j < MaxNData; j++){ for( int j = 0; j < MaxNData; j++){
Timestamp[i][j] = 0; Timestamp[i][j] = 0;
fineTime[i][j] = 0; fineTime[i][j] = 0;
@ -307,19 +302,15 @@ inline void Data::DecodeBuffer(bool fastDecode, int verbose){
nw++; nw++;
///printf("nw : %d ,x 4 = %d, nByte : %d \n", nw, 4*nw, nByte); ///printf("nw : %d ,x 4 = %d, nByte : %d \n", nw, 4*nw, nByte);
}while(4*nw < nByte); }while(4*nw < nByte);
///}while(true);
///Calculate trigger rate and first and last Timestamp ///Calculate trigger rate and first and last Timestamp
for(int ch = 0; ch < MaxNChannels; ch++){ for(int ch = 0; ch < MaxNChannels; ch++){
if( NumEventsDecoded[ch] > 0 ) IsNotRollOverFakeAgg = true; if( NumEventsDecoded[ch] > 0 ) IsNotRollOverFakeAgg = true;
unsigned long long dTime = Timestamp[ch][NumEvents[ch]-1] - Timestamp[ch][NumEvents[ch] - NumEventsDecoded[ch]]; unsigned long long dTime = Timestamp[ch][NumEvents[ch]-1] - Timestamp[ch][NumEvents[ch] - NumEventsDecoded[ch]];
double sec = dTime * ch2ns / 1e9; double sec = dTime * ch2ns / 1e9;
if( sec != 0 ){ if( sec != 0 && NumEventsDecoded[ch] > 1 ){
TriggerRate[ch] = NumEventsDecoded[ch]/sec; TriggerRate[ch] = NumEventsDecoded[ch]/sec;
} }
firstTimestamp[ch] = Timestamp[ch][0];
lastTimestamp[ch] = Timestamp[ch][NumEvents[ch]-1];
} }
} }

View File

@ -1,7 +1,6 @@
#include "ClassDigitizer.h" #include "ClassDigitizer.h"
Digitizer::Digitizer(){ Digitizer::Digitizer(){
printf("----- %s \n", __func__);
Initalization(); Initalization();
} }
@ -11,10 +10,8 @@ Digitizer::Digitizer(int boardID, int portID, bool program, bool verbose){
} }
Digitizer::~Digitizer(){ Digitizer::~Digitizer(){
printf("----- %s \n", __func__);
delete data;
delete settingFile;
CloseDigitizer(); CloseDigitizer();
delete data;
} }
void Digitizer::Initalization(){ void Digitizer::Initalization(){
@ -205,9 +202,15 @@ void Digitizer::SetChannelMask(uint32_t mask){
channelMask = mask; channelMask = mask;
ret |= CAEN_DGTZ_SetChannelEnableMask(handle, channelMask); ret |= CAEN_DGTZ_SetChannelEnableMask(handle, channelMask);
SaveSettingToFile(Register::DPP::ChannelEnableMask, mask); SaveSettingToFile(Register::DPP::ChannelEnableMask, mask);
SetSettingToMemory(Register::DPP::ChannelEnableMask, mask);
ErrorMsg(__func__); ErrorMsg(__func__);
} }
void Digitizer::SetChannelOnOff(unsigned short ch, bool onOff){
if( !isConnected ) return;
channelMask = ((channelMask & ~( 1 << ch) ) | ( onOff << ch)) ;
SetChannelMask(channelMask);
}
int Digitizer::ProgramBoard(){ int Digitizer::ProgramBoard(){
@ -269,8 +272,8 @@ int Digitizer::ProgramPHABoard(){
ret = CAEN_DGTZ_Reset(handle); ret = CAEN_DGTZ_Reset(handle);
printf("======== program board PHA\n"); printf("======== program board PHA\n");
ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::RecordLength_G + 0x7000, 250); ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::RecordLength_G + 0x7000, 62);
ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::BoardConfiguration, 0x0F8115); /// has Extra2 ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::BoardConfiguration, 0x0F8915); /// has Extra2
///ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::BoardConfiguration, 0x0D8115); /// diable Extra2 ///ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::BoardConfiguration, 0x0D8115); /// diable Extra2
//TODO change to write register //TODO change to write register
@ -290,7 +293,7 @@ int Digitizer::ProgramPHABoard(){
uint32_t address; uint32_t address;
address = Register::DPP::PHA::DecayTime; ret |= CAEN_DGTZ_WriteRegister(handle, address + 0x7000 , 5000 ); address = Register::DPP::PHA::DecayTime; ret |= CAEN_DGTZ_WriteRegister(handle, address + 0x7000 , 5000 );
address = Register::DPP::PHA::TrapezoidFlatTop; ret |= CAEN_DGTZ_WriteRegister(handle, address + 0x7000 , 0x62 ); address = Register::DPP::PHA::TrapezoidFlatTop; ret |= CAEN_DGTZ_WriteRegister(handle, address + 0x7000 , 0x1A );
address = Register::DPP::PHA::TrapezoidRiseTime; ret |= CAEN_DGTZ_WriteRegister(handle, address + 0x7000 , 6 ); address = Register::DPP::PHA::TrapezoidRiseTime; ret |= CAEN_DGTZ_WriteRegister(handle, address + 0x7000 , 6 );
address = Register::DPP::PHA::PeakingTime; ret |= CAEN_DGTZ_WriteRegister(handle, address + 0x7000 , 6 ); address = Register::DPP::PHA::PeakingTime; ret |= CAEN_DGTZ_WriteRegister(handle, address + 0x7000 , 6 );
address = Register::DPP::PHA::RCCR2SmoothingFactor; ret |= CAEN_DGTZ_WriteRegister(handle, address + 0x7000 , 4 ); address = Register::DPP::PHA::RCCR2SmoothingFactor; ret |= CAEN_DGTZ_WriteRegister(handle, address + 0x7000 , 4 );
@ -302,13 +305,13 @@ int Digitizer::ProgramPHABoard(){
ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t)(Register::DPP::ChannelDCOffset) + 0x7000 , 0xEEEE ); ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t)(Register::DPP::ChannelDCOffset) + 0x7000 , 0xEEEE );
ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t)(Register::DPP::PreTrigger) + 0x7000 , 124 ); ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t)(Register::DPP::PreTrigger) + 0x7000 , 32 );
ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t)(Register::DPP::InputDynamicRange) + 0x7000 , 0x0 ); ret |= CAEN_DGTZ_WriteRegister(handle, (uint32_t)(Register::DPP::InputDynamicRange) + 0x7000 , 0x0 );
ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::NumberEventsPerAggregate_G) + 0x7000, 511); ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::NumberEventsPerAggregate_G) + 0x7000, 511);
ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::AggregateOrganization), 0); ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::AggregateOrganization), 0);
ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::MaxAggregatePerBlockTransfer), 4); ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::MaxAggregatePerBlockTransfer), 4);
ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::DPPAlgorithmControl) + 0x7000, 0xe30200f); ret |= CAEN_DGTZ_WriteRegister(handle, (int32_t)(Register::DPP::DPPAlgorithmControl) + 0x7000, 0xC30200f);
if( ret != 0 ) { printf("==== set channels error.\n"); return 0;} if( ret != 0 ) { printf("==== set channels error.\n"); return 0;}
@ -537,6 +540,9 @@ void Digitizer::ReadAllSettingsFromBoard(){
if( RegisterDPPList[p].GetType() == RW::WriteONLY) continue; if( RegisterDPPList[p].GetType() == RW::WriteONLY) continue;
ReadRegister(RegisterDPPList[p]); ReadRegister(RegisterDPPList[p]);
} }
channelMask = GetSettingFromMemory(Register::DPP::ChannelEnableMask);
/// Channels Setting /// Channels Setting
for( int ch = 0; ch < NChannel; ch ++){ for( int ch = 0; ch < NChannel; ch ++){
if( DPPType == V1730_DPP_PHA_CODE ){ if( DPPType == V1730_DPP_PHA_CODE ){

View File

@ -66,6 +66,7 @@ class Digitizer{
int OpenDigitizer(int boardID, int portID = 0, bool program = false, bool verbose = false); int OpenDigitizer(int boardID, int portID = 0, bool program = false, bool verbose = false);
void SetDPPType (int type) { this->DPPType = type;} /// for manual override, or, digitizer does not open void SetDPPType (int type) { this->DPPType = type;} /// for manual override, or, digitizer does not open
void SetChannelMask (uint32_t mask); void SetChannelMask (uint32_t mask);
void SetChannelOnOff (unsigned short ch, bool onOff);
int CloseDigitizer(); int CloseDigitizer();
void Initalization(); void Initalization();
void Reset(); void Reset();

View File

@ -1,3 +1,4 @@
#include "macro.h"
#include "ClassData.h" #include "ClassData.h"
#include "TROOT.h" #include "TROOT.h"
@ -21,22 +22,6 @@ unsigned short e[MAX_MULTI] = {0}; /// 15 bit
unsigned long long e_t[MAX_MULTI] = {0}; /// timestamp 47 bit unsigned long long e_t[MAX_MULTI] = {0}; /// timestamp 47 bit
unsigned short e_f[MAX_MULTI] = {0}; /// fine time 10 bit unsigned short e_f[MAX_MULTI] = {0}; /// fine time 10 bit
class Trace{
public:
Trace() {trace.clear(); }
~Trace();
void Clear() { trace.clear(); };
Trace operator = (std::vector<unsigned short> v){
Trace tt;
for( int i = 0 ; i < (int) v.size() ; i++){
trace.push_back(v[i]);
}
return tt;
}
std::vector<unsigned short> trace;
};
/// using TClonesArray to hold the trace in TGraph /// using TClonesArray to hold the trace in TGraph
TClonesArray * arrayTrace = NULL; TClonesArray * arrayTrace = NULL;
unsigned short traceLength[MAX_MULTI] = {0}; unsigned short traceLength[MAX_MULTI] = {0};
@ -45,7 +30,6 @@ TGraph * trace = NULL;
template<typename T> void swap(T * a, T *b ); template<typename T> void swap(T * a, T *b );
int partition(int arr[], int kaka[], TString file[], int start, int end); int partition(int arr[], int kaka[], TString file[], int start, int end);
void quickSort(int arr[], int kaka[], TString file[], int start, int end); void quickSort(int arr[], int kaka[], TString file[], int start, int end);
unsigned long get_time();
void EventBuilder(Data * data, const unsigned int timeWin, bool traceOn = false, bool isLastData = false, unsigned int verbose = 0); void EventBuilder(Data * data, const unsigned int timeWin, bool traceOn = false, bool isLastData = false, unsigned int verbose = 0);
int main(int argc, char **argv) { int main(int argc, char **argv) {
@ -389,16 +373,6 @@ void EventBuilder(Data * data, const unsigned int timeWin, bool traceOn, bool is
} }
unsigned long get_time(){
unsigned long time_us;
struct timeval t1;
struct timezone tz;
gettimeofday(&t1, &tz);
time_us = (t1.tv_sec) * 1000000 + t1.tv_usec;
return time_us;
}
template<typename T> void swap(T * a, T *b ){ template<typename T> void swap(T * a, T *b ){
T temp = * b; T temp = * b;
*b = *a; *b = *a;

View File

@ -14,20 +14,12 @@
#include <TAxis.h> #include <TAxis.h>
#include <TGFileDialog.h> #include <TGFileDialog.h>
#include <TF1.h> #include <TF1.h>
#include <TGMsgBox.h>
#include <unistd.h> #include <unistd.h>
#include <ctime> #include <ctime>
#include "FSUDAQ.h" #include "FSUDAQ.h"
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;
}
Double_t traceFunc(Double_t *x, Double_t *par){ Double_t traceFunc(Double_t *x, Double_t *par){
///par[0] = baseline ///par[0] = baseline
///par[1] = start time ///par[1] = start time
@ -54,13 +46,13 @@ TGraph * gDigiTrace2 = NULL ;
Pixel_t red, blue, green; Pixel_t red, blue, green;
unsigned short nDigi; unsigned short nDigi = 0;
Digitizer ** digi = NULL; Digitizer ** digi = NULL;
unsigned short lastRunID; unsigned short lastRunID;
///============ static members ///============ static members
TGTextEdit * MainWindow::teLog = NULL; TGTextView * MainWindow::teLog = NULL;
TRootEmbeddedCanvas * MainWindow::fEcanvas = NULL; TRootEmbeddedCanvas * MainWindow::fEcanvas = NULL;
TGNumberEntry * MainWindow::boardIDEntry = NULL; TGNumberEntry * MainWindow::boardIDEntry = NULL;
TGNumberEntry * MainWindow::chIDEntry = NULL; TGNumberEntry * MainWindow::chIDEntry = NULL;
@ -96,10 +88,6 @@ enum ModeIdentifiers{
MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) {
printf("----- %s \n", __func__);
nDigi = 0;
gClient->GetColorByName("red", red); gClient->GetColorByName("red", red);
gClient->GetColorByName("blue", blue); gClient->GetColorByName("blue", blue);
gClient->GetColorByName("green", green); gClient->GetColorByName("green", green);
@ -234,7 +222,8 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) {
TGGroupFrame * groupLog = new TGGroupFrame(fMain, "Log Message", kHorizontalFrame); TGGroupFrame * groupLog = new TGGroupFrame(fMain, "Log Message", kHorizontalFrame);
fMain->AddFrame(groupLog, new TGLayoutHints(kLHintsExpandX, 10,10,10,10) ); fMain->AddFrame(groupLog, new TGLayoutHints(kLHintsExpandX, 10,10,10,10) );
teLog = new TGTextEdit(groupLog, w, 100); groupLog->AddFrame(teLog, new TGLayoutHints(kLHintsExpandX, 2,2,10,0) ); teLog = new TGTextView(groupLog, w, 100); groupLog->AddFrame(teLog, new TGLayoutHints(kLHintsExpandX, 2,2,10,0) );
teLog->SetReadOnly(true);
} }
/// Set a name to the main frame /// Set a name to the main frame
@ -297,17 +286,18 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) {
void MainWindow::GoodBye(){ void MainWindow::GoodBye(){
for( int i = 0; i < nDigi; i++) digi[i]->CloseDigitizer(); printf("/// Closing Digitizer and Releasing digitizer memory\n");
for( int i = 0; i < nDigi; i++) delete digi[i]; for( int i = 0; i < nDigi; i++) delete digi[i];
printf("/// Releasing histograms memory\n");
for( int i = 0; i < MaxNBoards; i++){ for( int i = 0; i < MaxNBoards; i++){
delete hChannel[i]; if( hChannel[i] != NULL ) delete hChannel[i];
for( int j = 0; j < MaxNChannels; j++){ for( int j = 0; j < MaxNChannels; j++){
delete hEnergy[i][j]; if( hEnergy[i][j] != NULL ) delete hEnergy[i][j];
} }
} }
printf("/// Releasing graphs memory\n");
delete gDummy; delete gDummy;
delete gAnaTrace1 ; delete gAnaTrace1 ;
delete gAnaTrace2 ; delete gAnaTrace2 ;
@ -353,6 +343,8 @@ MainWindow::~MainWindow() {
delete registerSetting; delete registerSetting;
delete triggerSummary; delete triggerSummary;
delete programSetting; delete programSetting;
delete startStopDialog;
delete runThread; delete runThread;
fMain->Cleanup(); fMain->Cleanup();
@ -369,7 +361,6 @@ void MainWindow::HandleMenu(Int_t id){
///========================= File Open ///========================= File Open
case M_FILE_OPEN:{ case M_FILE_OPEN:{
LogMsg((char *) "Not implemented."); LogMsg((char *) "Not implemented.");
}break; }break;
///========================= Exit ///========================= Exit
@ -378,8 +369,10 @@ void MainWindow::HandleMenu(Int_t id){
///========================= Trigger summary ///========================= Trigger summary
case M_TRIGGER_SUMMARY: { case M_TRIGGER_SUMMARY: {
triggerSummary = new TriggerSummary(gClient->GetRoot(), 600, 600); triggerSummary = new TriggerSummary(gClient->GetRoot(), 600, 600);
TriggerSummary::isManualOpened = true;
}break; }break;
///========================= Load setting file offline
case M_LOAD_SETTINGS:{ case M_LOAD_SETTINGS:{
LoadSettingFromFile(); LoadSettingFromFile();
}break; }break;
@ -415,19 +408,13 @@ void MainWindow::HandleMenu(Int_t id){
case M_PROGRAM_SETTINGS:{ case M_PROGRAM_SETTINGS:{
programSetting = new ProgramSetting(gClient->GetRoot()); programSetting = new ProgramSetting(gClient->GetRoot());
programSetting->Connect("SetSetting()", "MainWindow", this, "UpdateExpName()"); programSetting->Connect("SetSetting()", "MainWindow", this, "UpdateExpName()");
///LogMsg((char*) Form("database : %s, name : %s ", ProgramSetting::databaseIP.c_str(), ProgramSetting::databaseName.c_str() ));
}break; }break;
///====================== Fit Gaussian ///====================== Fit Gaussian
case M_FINDPEAKS:{ case M_FINDPEAKS:{
LogMsg((char*)"[Find Gaussian Peaks] Not impelmented"); LogMsg((char*)"[Find Gaussian Peaks] Not impelmented");
}break; }break;
} }
} }
void MainWindow::OpenDigitizers(){ void MainWindow::OpenDigitizers(){
@ -444,9 +431,10 @@ void MainWindow::OpenDigitizers(){
nDigi = 0; nDigi = 0;
Digitizer * dig = new Digitizer(); Digitizer * dig = new Digitizer();
LogMsg((char*)"Finding Digitizer for 4 ports and 3 boards for each port..."); TString haha = Form("Finding Digitizer for %d ports and %d boards for each port...", ProgramSetting::maxPort, ProgramSetting::maxBoardPrePort );
for( int port = 0; port < 4 ; port ++){ LogMsg((char*) haha.Data());
for( int board = 0; board < 3 ; board ++){ for( int port = 0; port < ProgramSetting::maxPort ; port ++){
for( int board = 0; board < ProgramSetting::maxBoardPrePort ; board ++){
dig->OpenDigitizer(board, port); dig->OpenDigitizer(board, port);
if ( dig->GetConnectionStatus() ) { if ( dig->GetConnectionStatus() ) {
nDigi++; nDigi++;
@ -557,12 +545,9 @@ void MainWindow::UpdateExpName(){
} }
void MainWindow::MakeElogEntry(bool start){ void MainWindow::MakeElogEntry(bool start){
if( ProgramSetting::EnableElog == false ) return; if( ProgramSetting::EnableElog == false ) return;
TString cmd = Form("%s/DAQ/elogEntry.sh %d", ProgramSetting::programPath.c_str(), start); TString cmd = Form("%s/DAQ/elogEntry.sh %d", ProgramSetting::programPath.c_str(), start);
int temp = system(cmd.Data()); int temp = system(cmd.Data());
} }
void MainWindow::StartRun(){ void MainWindow::StartRun(){
@ -584,22 +569,36 @@ void MainWindow::StartRun(){
bFitTrace->SetEnabled(false); bFitTrace->SetEnabled(false);
if( cbDataRun->GetState() == kButtonDown ) { if( cbDataRun->GetState() == kButtonDown ) {
startStopDialog = new StartStopDialog(gClient->GetRoot(), fMain, 400, 200, true);
}
if( StartStopDialog::isOK){
cbMode->SetEnabled(false); cbMode->SetEnabled(false);
MakeElogEntry(true); MakeElogEntry(true);
if( !TriggerSummary::isOpened ) {
triggerSummary = new TriggerSummary(gClient->GetRoot(), 600, 600);
TriggerSummary::isManualOpened = false;
}
bool threadFlag = false;
for( int i = 0 ; i < nDigi; i++) {
digi[i]->StartACQ();
if( digi[i]->IsRunning() ) threadFlag = true;
}
if( threadFlag ) runThread->Run();
}else{
bStartRun->SetEnabled(true);
bStopRun->SetEnabled(false);
dataPrefix->SetEnabled(true);
runIDEntry->SetState(true);
bPlotSingleTrace->SetEnabled(true);
bFitTrace->SetEnabled(true);
cbMode->SetEnabled(true);
} }
HandleMenu(M_TRIGGER_SUMMARY);
bool threadFlag = false;
for( int i = 0 ; i < nDigi; i++) {
digi[i]->StartACQ();
if( digi[i]->IsRunning() ) threadFlag = true;
}
if( threadFlag ) runThread->Run();
if( boardSetting != NULL ) boardSetting->ReadStatus();
} }
void MainWindow::StopRun(){ void MainWindow::StopRun(){
@ -621,15 +620,26 @@ void MainWindow::StopRun(){
bFitTrace->SetEnabled(true); bFitTrace->SetEnabled(true);
cbMode->SetEnabled(true); cbMode->SetEnabled(true);
if( triggerSummary != NULL ) triggerSummary->CloseWindow(); if( !TriggerSummary::isManualOpened ) triggerSummary->CloseWindow();
///if( cbMode->GetSelected() == Mode_DataRun ){ ///if( cbMode->GetSelected() == Mode_DataRun ){
if( cbDataRun->GetState() == kButtonDown ) { if( cbDataRun->GetState() == kButtonDown ) {
int runID = runIDEntry->GetNumber(); startStopDialog = new StartStopDialog(gClient->GetRoot(), fMain, 400, 200, false);
lastRunID = runID + 1;
runIDEntry->SetNumber(runID +1); if( StartStopDialog::isOK){
MakeElogEntry(false); int runID = runIDEntry->GetNumber();
ProgramSetting::SaveProgramSetting(); lastRunID = runID + 1;
runIDEntry->SetNumber(runID +1);
MakeElogEntry(false);
ProgramSetting::SaveProgramSetting();
}else{
bStartRun->SetEnabled(false);
bStopRun->SetEnabled(true);
dataPrefix->SetEnabled(false);
runIDEntry->SetState(false);
bPlotSingleTrace->SetEnabled(false);
bFitTrace->SetEnabled(false);
}
} }
} }
@ -671,8 +681,9 @@ void MainWindow::LogMsg(char * msg){
TString outMsg = Form("[%4d-%02d-%02d %02d:%02d:%02d] %s", year, month, day, hour, minute, secound, msg); TString outMsg = Form("[%4d-%02d-%02d %02d:%02d:%02d] %s", year, month, day, hour, minute, secound, msg);
teLog->AddLine(outMsg); teLog->AddLineFast(outMsg);
printf("%s\n", outMsg.Data()); printf("%s\n", outMsg.Data());
teLog->Update();
teLog->ShowBottom(); teLog->ShowBottom();
} }
@ -724,6 +735,8 @@ void MainWindow::PlotSingleTrace(){
digi[boardID]->StartACQ(); digi[boardID]->StartACQ();
int count = 0; int count = 0;
int traceLength;
while(count < 10){ while(count < 10){
usleep(100*1000); /// wait half sec usleep(100*1000); /// wait half sec
digi[boardID]->ReadData(); digi[boardID]->ReadData();
@ -732,7 +745,7 @@ void MainWindow::PlotSingleTrace(){
data->DecodeBuffer(false, 2); data->DecodeBuffer(false, 2);
data->PrintStat(); data->PrintStat();
int traceLength = (data->Waveform1[chID][0]).size(); traceLength = (data->Waveform1[chID][0]).size();
if( traceLength == 0 ) { if( traceLength == 0 ) {
LogMsg((char *)"no trace"); LogMsg((char *)"no trace");
@ -741,7 +754,6 @@ void MainWindow::PlotSingleTrace(){
for( int i = 0; i < traceLength ; i++) { for( int i = 0; i < traceLength ; i++) {
gAnaTrace1->SetPoint(i, i*ch2ns*(1+isDualTrace), (data->Waveform1[chID][0])[i]); gAnaTrace1->SetPoint(i, i*ch2ns*(1+isDualTrace), (data->Waveform1[chID][0])[i]);
} }
double xmin, xmax, ymin, ymax; double xmin, xmax, ymin, ymax;
@ -766,11 +778,8 @@ void MainWindow::PlotSingleTrace(){
break; break;
bFitTrace->SetEnabled(true); bFitTrace->SetEnabled(true);
} }
count++; count++;
}; };
digi[0]->StopACQ(); digi[0]->StopACQ();
if( count == 10 ) LogMsg((char*)"Plot Trace TimeOut, please check setting"); if( count == 10 ) LogMsg((char*)"Plot Trace TimeOut, please check setting");
@ -845,6 +854,8 @@ void * MainWindow::Run(void * ptr){
uint32_t PreviousTime = get_time(); uint32_t PreviousTime = get_time();
uint32_t CurrentTime = 0; uint32_t CurrentTime = 0;
uint32_t ElapsedTime = 0; uint32_t ElapsedTime = 0;
uint32_t t1 = get_time();
uint32_t t2 = 0;
TString dataFileName = ProgramSetting::DataSavingPath + "/data/" + dataPrefix->GetText(); TString dataFileName = ProgramSetting::DataSavingPath + "/data/" + dataPrefix->GetText();
dataFileName += Form("_run%03d", (int) runIDEntry->GetNumber()); dataFileName += Form("_run%03d", (int) runIDEntry->GetNumber());
@ -853,7 +864,8 @@ void * MainWindow::Run(void * ptr){
if( cbDataRun->GetState() == kButtonDown) { if( cbDataRun->GetState() == kButtonDown) {
TString msg = Form("Save data to : %s_***.bin\n", dataFileName.Data()); TString msg = Form("Save data to : %s_***.bin\n", dataFileName.Data());
teLog->AddLine(msg.Data()); teLog->AddLineFast(msg.Data());
teLog->Update();
teLog->ShowBottom(); teLog->ShowBottom();
} }
@ -865,34 +877,47 @@ void * MainWindow::Run(void * ptr){
DrawDummyGraph(); DrawDummyGraph();
unsigned int printFileSizeCount = 0;
unsigned int nLine;
while(digi[boardID]->IsRunning()){ while(digi[boardID]->IsRunning()){
usleep(100*1000); /// wait 100 msec usleep(100*1000); /// wait 100 msec
digi[boardID]->ReadData(); digi[boardID]->ReadData();
if( boardSetting != NULL ) boardSetting->ReadStatus();
ch2ns = (int) digi[boardID]->GetCh2ns(); ch2ns = (int) digi[boardID]->GetCh2ns();
ch = chIDEntry->GetNumber(); ch = chIDEntry->GetNumber();
if( data->nByte > 0 ){ if( data->nByte > 0 ){
//data->PrintStat();
if( cbDataRun->GetState() == kButtonDown ) { if( cbDataRun->GetState() == kButtonDown ) {
// Rate graph?
data->SaveBuffer(dataFileName.Data()); data->SaveBuffer(dataFileName.Data());
data->DecodeBuffer(true, 0); data->DecodeBuffer(true, 0);
CurrentTime = get_time(); CurrentTime = get_time();
if( CurrentTime - PreviousTime > 1000 ){ if( CurrentTime - PreviousTime > 1e6 ){
if( printFileSizeCount > 0 ){
nLine = teLog->ReturnLineCount();
teLog->GetText()->DelLine(nLine-1);
}
std::string msg = Form("File Size : %.2f MB", data->GetPresentFileSize() / 1024./1024. ); std::string msg = Form("File Size : %.2f MB", data->GetPresentFileSize() / 1024./1024. );
teLog->AddLine(msg.c_str()); teLog->AddLineFast(msg.c_str());
teLog->Update();
teLog->ShowBottom(); teLog->ShowBottom();
PreviousTime = CurrentTime; PreviousTime = CurrentTime;
printFileSizeCount ++;
} }
}else{ }else{
data->DecodeBuffer(false, 0); data->DecodeBuffer(false, 0);
} }
//t2 = get_time();
//printf("========= dt : %u usec\n", t2 - t1);
////data->PrintStat();
//t1 = t2 ;
} }
if( cbDataRun->GetState() == kButtonUp ) { if( cbDataRun->GetState() == kButtonUp ) {
@ -915,7 +940,6 @@ void * MainWindow::Run(void * ptr){
} }
/// since the gDummy fixed the draw range, it does not really matter to remove extra points /// since the gDummy fixed the draw range, it does not really matter to remove extra points
gAnaTrace1->Draw("same L"); gAnaTrace1->Draw("same L");
gAnaTrace2->Draw("same L"); gAnaTrace2->Draw("same L");
} }
@ -924,8 +948,9 @@ void * MainWindow::Run(void * ptr){
CurrentTime = get_time(); CurrentTime = get_time();
ElapsedTime = CurrentTime - PreviousTime; /// milliseconds ElapsedTime = CurrentTime - PreviousTime; /// milliseconds
if( ElapsedTime > 1000 * 1000 && BoardSetting::isOpened ) boardSetting->ReadStatus();
if( ElapsedTime > 200 ){ if( ElapsedTime > 200 * 1000 ){
///Fill Channel Count ///Fill Channel Count
for( int i = 0 ; i < digi[boardID]->GetNChannel(); i++){ for( int i = 0 ; i < digi[boardID]->GetNChannel(); i++){
@ -963,7 +988,5 @@ int main(int argc, char **argv) {
new MainWindow(gClient->GetRoot(),800,800); new MainWindow(gClient->GetRoot(),800,800);
theApp.Run(); theApp.Run();
printf("------ see you next time :) ------ \n");
return 0; return 0;
} }

View File

@ -23,6 +23,7 @@
#include "channelSettingPSD.h" #include "channelSettingPSD.h"
#include "registerSetting.h" #include "registerSetting.h"
#include "triggerSummary.h" #include "triggerSummary.h"
#include "startStopDialog.h"
class TGWindow; class TGWindow;
class TGMainFrame; class TGMainFrame;
@ -40,7 +41,7 @@ private:
static TGNumberEntry * boardIDEntry, *chIDEntry; static TGNumberEntry * boardIDEntry, *chIDEntry;
static TGTextEdit * teLog; static TGTextView * teLog;
TGTextButton *bOpenDigitizers; TGTextButton *bOpenDigitizers;
TGTextButton *bStartRun; TGTextButton *bStartRun;
@ -63,6 +64,7 @@ private:
RegisterSetting * registerSetting; RegisterSetting * registerSetting;
TriggerSummary * triggerSummary; TriggerSummary * triggerSummary;
ProgramSetting * programSetting; ProgramSetting * programSetting;
StartStopDialog * startStopDialog;
TThread * runThread; TThread * runThread;

View File

@ -11,7 +11,7 @@ CAENLIBS = -lCAENDigitizer
ROOTLIBS = `root-config --cflags --glibs` ROOTLIBS = `root-config --cflags --glibs`
OBJS = programSetting.o triggerSummary.o registerSetting.o channelSettingPSD.o channelSettingPHA.o boardSetting.o ClassDigitizer.o FSUDAQ.o OBJS = startStopDialog.o programSetting.o triggerSummary.o registerSetting.o channelSettingPSD.o channelSettingPHA.o boardSetting.o ClassDigitizer.o FSUDAQ.o
######################################################################### #########################################################################
@ -72,6 +72,9 @@ programSetting.o : programSetting.h programSetting.cpp
@echo "----------- creating programSetting.o" @echo "----------- creating programSetting.o"
$(CC) $(COPTS) -c programSetting.cpp $(ROOTLIBS) $(CC) $(COPTS) -c programSetting.cpp $(ROOTLIBS)
startStopDialog.o: startStopDialog.h startStopDialog.cpp
@echo "----------- creating startStopDialog.o"
$(CC) $(COPTS) -c startStopDialog.cpp $(ROOTLIBS)
#CutsCreator: $(OBJS3) src/CutsCreator.c #CutsCreator: $(OBJS3) src/CutsCreator.c
# g++ -std=c++17 -pthread src/CutsCreator.c -o CutsCreator $(ROOTLIBS) # g++ -std=c++17 -pthread src/CutsCreator.c -o CutsCreator $(ROOTLIBS)

View File

@ -21,13 +21,14 @@ TString boardSettingName[NUM_BOARD_INFO] = { "Model",
"AMC version" "AMC version"
}; };
bool BoardSetting::isOpened = false;
///======== declared at FSUDAQ.cpp ///======== declared at FSUDAQ.cpp
extern Pixel_t red, blue, green; extern Pixel_t red, blue, green;
extern unsigned short nDigi; extern unsigned short nDigi;
extern Digitizer ** digi; extern Digitizer ** digi;
BoardSetting::BoardSetting(const TGWindow *p, UInt_t w, UInt_t h){ BoardSetting::BoardSetting(const TGWindow *p, UInt_t w, UInt_t h){
printf("----- %s \n", __func__);
fMain = new TGMainFrame(p,w,h); fMain = new TGMainFrame(p,w,h);
fMain->SetWindowName("Board Settings & Status"); fMain->SetWindowName("Board Settings & Status");
@ -266,7 +267,6 @@ BoardSetting::BoardSetting(const TGWindow *p, UInt_t w, UInt_t h){
bDualTrace->SetState(kButtonUp); bDualTrace->SetState(kButtonUp);
bDualTrace->Connect("Clicked()", "BoardSetting", this, "SetBoardConfiguration()"); bDualTrace->Connect("Clicked()", "BoardSetting", this, "SetBoardConfiguration()");
TGHorizontalFrame * hBdCfg_Probe = new TGHorizontalFrame(vBdCfg2); vBdCfg2->AddFrame(hBdCfg_Probe); TGHorizontalFrame * hBdCfg_Probe = new TGHorizontalFrame(vBdCfg2); vBdCfg2->AddFrame(hBdCfg_Probe);
TGVerticalFrame * vBdCfg_Probe_Label = new TGVerticalFrame(hBdCfg_Probe); hBdCfg_Probe->AddFrame(vBdCfg_Probe_Label); TGVerticalFrame * vBdCfg_Probe_Label = new TGVerticalFrame(hBdCfg_Probe); hBdCfg_Probe->AddFrame(vBdCfg_Probe_Label);
@ -787,6 +787,14 @@ BoardSetting::~BoardSetting(){
delete GlbMajorLevel; delete GlbMajorLevel;
delete boardIDEntry; delete boardIDEntry;
for( int i = 0; i < NUM_BOARD_INFO; i++ ) delete entry[i];
delete txtSettingFile;
delete enPLLStatus;
delete enTempStatus;
delete enADCPwrStatus;
delete txtBufferSize;
fMain->Cleanup(); fMain->Cleanup();
delete fMain; delete fMain;

View File

@ -122,14 +122,12 @@ class BoardSetting{
TGTextEntry * txtBusError; TGTextEntry * txtBusError;
TGTextEntry * txtVMEFIFO; TGTextEntry * txtVMEFIFO;
bool isOpened;
public: public:
BoardSetting(const TGWindow *p, UInt_t w, UInt_t h); BoardSetting(const TGWindow *p, UInt_t w, UInt_t h);
virtual ~BoardSetting(); virtual ~BoardSetting();
bool IsOpen() {return isOpened;} static bool isOpened;
void CloseWindow() { delete this;} void CloseWindow() { delete this;}
void ChangeBoard(); void ChangeBoard();

View File

@ -18,8 +18,6 @@ extern Digitizer ** digi;
ChannelSettingPHA::ChannelSettingPHA(const TGWindow *p, UInt_t w, UInt_t h, int boardID){ ChannelSettingPHA::ChannelSettingPHA(const TGWindow *p, UInt_t w, UInt_t h, int boardID){
printf("----- %s \n", __func__);
fMain = new TGMainFrame(p,w,h); fMain = new TGMainFrame(p,w,h);
fMain->SetWindowName("Channel Settings PHA"); fMain->SetWindowName("Channel Settings PHA");
fMain->Connect("CloseWindow()", "ChannelSettingPHA", this, "CloseWindow()"); fMain->Connect("CloseWindow()", "ChannelSettingPHA", this, "CloseWindow()");

View File

@ -16,8 +16,6 @@ extern Digitizer ** digi;
ChannelSettingPSD::ChannelSettingPSD(const TGWindow *p, UInt_t w, UInt_t h, int boardID){ ChannelSettingPSD::ChannelSettingPSD(const TGWindow *p, UInt_t w, UInt_t h, int boardID){
printf("----- %s \n", __func__);
fMain = new TGMainFrame(p,w,h); fMain = new TGMainFrame(p,w,h);
fMain->SetWindowName("Channel Settings PSD"); fMain->SetWindowName("Channel Settings PSD");
fMain->Connect("CloseWindow()", "ChannelSettingPSD", this, "CloseWindow()"); fMain->Connect("CloseWindow()", "ChannelSettingPSD", this, "CloseWindow()");

View File

@ -1,6 +1,7 @@
#ifndef MACRO_H #ifndef MACRO_H
#define MACRO_H #define MACRO_H
#define MaxNPorts 4
#define MaxNBoards 22 #define MaxNBoards 22
#define MaxNChannels 16 #define MaxNChannels 16
#define MaxRecordLength 0x3fff * 8 #define MaxRecordLength 0x3fff * 8
@ -8,4 +9,15 @@
#define SETTINGSIZE 2048 #define SETTINGSIZE 2048
#include <sys/time.h> /** struct timeval, select() */
inline unsigned int get_time(){
unsigned int time_us;
struct timeval t1;
struct timezone tz;
gettimeofday(&t1, &tz);
time_us = (t1.tv_sec) * 1000 * 1000 + t1.tv_usec;
return time_us;
}
#endif #endif

View File

@ -26,6 +26,9 @@ std::string ProgramSetting::ElogIP = "128.186.111.127";
bool ProgramSetting::EnableElog = true; bool ProgramSetting::EnableElog = true;
bool ProgramSetting::EnableDatabase = true; bool ProgramSetting::EnableDatabase = true;
unsigned short ProgramSetting::maxPort = 4;
unsigned short ProgramSetting::maxBoardPrePort = 3;
/// fixed program things /// fixed program things
const std::string ProgramSetting::settingFileName = "FSUDAQ.sh"; const std::string ProgramSetting::settingFileName = "FSUDAQ.sh";
const std::string ProgramSetting::programPath = "~/FSUDAQ/"; const std::string ProgramSetting::programPath = "~/FSUDAQ/";
@ -37,8 +40,6 @@ extern Digitizer ** digi;
ProgramSetting::ProgramSetting(const TGWindow *p){ ProgramSetting::ProgramSetting(const TGWindow *p){
printf("----- %s \n", __func__);
fMain = new TGMainFrame(p, 600, 400); fMain = new TGMainFrame(p, 600, 400);
fMain->SetWindowName("Program Setting"); fMain->SetWindowName("Program Setting");
fMain->Connect("CloseWindow()", "ProgramSetting", this, "CloseWindow()"); fMain->Connect("CloseWindow()", "ProgramSetting", this, "CloseWindow()");
@ -49,7 +50,7 @@ ProgramSetting::ProgramSetting(const TGWindow *p){
TGVerticalFrame * vframe = new TGVerticalFrame(fMain); fMain->AddFrame(vframe); TGVerticalFrame * vframe = new TGVerticalFrame(fMain); fMain->AddFrame(vframe);
{///============== Data Saving Path {///============== Data Saving Path
TGGroupFrame * gfData = new TGGroupFrame(vframe, "Data Storage", kHorizontalFrame); vframe->AddFrame(gfData, new TGLayoutHints(kLHintsNormal, 5, 5, 5, 5)); TGGroupFrame * gfData = new TGGroupFrame(vframe, "Data Storage", kVerticalFrame); vframe->AddFrame(gfData, new TGLayoutHints(kLHintsNormal, 5, 5, 5, 5));
TGHorizontalFrame * hfData = new TGHorizontalFrame(gfData); gfData->AddFrame(hfData, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0)); TGHorizontalFrame * hfData = new TGHorizontalFrame(gfData); gfData->AddFrame(hfData, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
@ -77,7 +78,7 @@ ProgramSetting::ProgramSetting(const TGWindow *p){
} }
{///============== Database & Elog {///============== Database & Elog
TGGroupFrame * gfDatabase = new TGGroupFrame(vframe, "Database & Elog Setting", kHorizontalFrame); vframe->AddFrame(gfDatabase, new TGLayoutHints(kLHintsExpandX, 5, 5, 5, 5)); TGGroupFrame * gfDatabase = new TGGroupFrame(vframe, "Database & Elog Setting", kVerticalFrame); vframe->AddFrame(gfDatabase, new TGLayoutHints(kLHintsExpandX, 5, 5, 5, 5));
TGHorizontalFrame * hfDB1 = new TGHorizontalFrame(gfDatabase); gfDatabase->AddFrame(hfDB1, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0)); TGHorizontalFrame * hfDB1 = new TGHorizontalFrame(gfDatabase); gfDatabase->AddFrame(hfDB1, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
@ -121,9 +122,24 @@ ProgramSetting::ProgramSetting(const TGWindow *p){
} }
{///============== Read Time event building {///============== Other setting Read Time event building
TGGroupFrame * gfOther = new TGGroupFrame(vframe, "Other Settings", kVerticalFrame); vframe->AddFrame(gfOther, new TGLayoutHints(kLHintsExpandX, 5, 5, 5, 5));
TGHorizontalFrame * hfOther1 = new TGHorizontalFrame(gfOther); gfOther->AddFrame(hfOther1, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
TGLabel * lbPort = new TGLabel(hfOther1, "Number of Port :"); hfOther1->AddFrame(lbPort, kaka);
numPort = new TGNumberEntry(hfOther1, ProgramSetting::maxPort, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); hfOther1->AddFrame(numPort, kaka);
numPort->SetWidth(50);
numPort->SetLimits(TGNumberFormat::kNELLimitMinMax, 1, MaxNPorts);
numPort->Connect("Modified()", "ProgramSetting", this, "SetSearchRange()");
TGHorizontalFrame * hfOther2 = new TGHorizontalFrame(gfOther); gfOther->AddFrame(hfOther2, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
TGLabel * lbBoard = new TGLabel(hfOther2, "Number of Board / Port :"); hfOther2->AddFrame(lbBoard, kaka);
numBoard = new TGNumberEntry(hfOther2, ProgramSetting::maxBoardPrePort, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); hfOther2->AddFrame(numBoard, kaka);
numBoard->SetWidth(50);
numBoard->SetLimits(TGNumberFormat::kNELLimitMinMax, 1, 9);
numBoard->Connect("Modified()", "ProgramSetting", this, "SetSearchRange()");
} }
fMain->MapSubwindows(); fMain->MapSubwindows();
@ -144,6 +160,9 @@ ProgramSetting::~ProgramSetting(){
delete cbDatabase; delete cbDatabase;
delete cbElog; delete cbElog;
delete numPort;
delete numBoard;
fMain->Cleanup(); fMain->Cleanup();
delete fMain; delete fMain;
} }
@ -273,3 +292,8 @@ void ProgramSetting::SetDataBaseElogOnOff(){
EnableElog = ( cbElog->GetState() == kButtonDown ? true : false ); EnableElog = ( cbElog->GetState() == kButtonDown ? true : false );
} }
void ProgramSetting::SetSearchRange(){
maxPort = numPort->GetNumber();
maxBoardPrePort = numPort->GetNumber();
}

View File

@ -29,6 +29,9 @@ class ProgramSetting{
TGCheckButton * cbDatabase; TGCheckButton * cbDatabase;
TGCheckButton * cbElog; TGCheckButton * cbElog;
TGNumberEntry * numPort;
TGNumberEntry * numBoard;
public: public:
ProgramSetting(const TGWindow *p); ProgramSetting(const TGWindow *p);
virtual ~ProgramSetting(); virtual ~ProgramSetting();
@ -44,6 +47,9 @@ class ProgramSetting{
static bool EnableElog; static bool EnableElog;
static bool EnableDatabase; static bool EnableDatabase;
static unsigned short maxPort;
static unsigned short maxBoardPrePort;
const static std::string settingFileName; // fixed as FSUDAQ.sh const static std::string settingFileName; // fixed as FSUDAQ.sh
const static std::string programPath; const static std::string programPath;
@ -57,6 +63,8 @@ class ProgramSetting{
void SetDataBaseElogOnOff(); void SetDataBaseElogOnOff();
void SetSearchRange();
}; };
#endif #endif

View File

@ -14,8 +14,6 @@ extern Digitizer ** digi;
RegisterSetting::RegisterSetting(const TGWindow *p, UInt_t w, UInt_t h, uint32_t address){ RegisterSetting::RegisterSetting(const TGWindow *p, UInt_t w, UInt_t h, uint32_t address){
printf("----- %s \n", __func__);
for( int i = 0; i < MaxNChannels; i++) value[i] = 0; for( int i = 0; i < MaxNChannels; i++) value[i] = 0;
fMain = new TGMainFrame(p,w,h); fMain = new TGMainFrame(p,w,h);

67
DAQ/startStopDialog.cpp Normal file
View File

@ -0,0 +1,67 @@
#include "startStopDialog.h"
TString StartStopDialog::startComment = "";
TString StartStopDialog::stopComment = "";
bool StartStopDialog::isOK = false;
StartStopDialog::StartStopDialog(const TGWindow *p, const TGWindow *main, UInt_t w, UInt_t h, bool isStart){
this->isStart = isStart;
startComment = "";
stopComment = "";
fMain = new TGTransientFrame(p, main, w, h, kVerticalFrame);
fMain->DontCallClose(); /// to avoid double deletions.
//fMain->SetCleanup(kDeepCleanup); /// use hierarchical cleaning
fMain->Connect("CloseWindow()", "StartStopDialog", this, "CloseWindow()");
TGHorizontalFrame * fFrame1 = new TGHorizontalFrame(fMain); fMain->AddFrame(fFrame1, new TGLayoutHints(kLHintsCenterX | kLHintsExpandX ));
txtComment = new TGTextEntry(fFrame1, ""); fFrame1->AddFrame(txtComment);
txtComment->Resize(300, 20);
txtComment->Connect("ReturnPressed()", "StartStopDialog", this, "DoOK()");
TGHorizontalFrame * fFrame2 = new TGHorizontalFrame(fMain); fMain->AddFrame(fFrame2,new TGLayoutHints(kLHintsCenterX | kLHintsExpandX));
TGTextButton * bOK = new TGTextButton(fFrame2, "OK"); fFrame2->AddFrame(bOK, new TGLayoutHints(kLHintsCenterX));
bOK->Connect("Clicked()", "StartStopDialog", this, "DoOK()");
TGTextButton * bCancel = new TGTextButton(fFrame2, "Cancel"); fFrame2->AddFrame(bCancel, new TGLayoutHints(kLHintsCenterX));
bCancel->Connect("Clicked()", "StartStopDialog", this, "DoClose()");
fMain->MapSubwindows();
fMain->Resize();
fMain->CenterOnParent(); /// position relative to the parent's window
if( isStart) {
fMain->SetWindowName("Start Comment");
}else{
fMain->SetWindowName("Stop Comment");
}
fMain->MapWindow();
gClient->WaitFor(fMain); /// make everything wait for it
}
StartStopDialog::~StartStopDialog(){
printf("-------- %s \n", __func__);
isOK = false;
delete txtComment;
fMain->DeleteWindow(); /// deletes fMain
}
void StartStopDialog::DoClose(){
isOK = false;
///Wait for 500 msec
TTimer::SingleShot(500, "StartStopDialog", this, "CloseWindow()");
}
void StartStopDialog::DoOK(){
if( isStart ) startComment = txtComment->GetText();
if( !isStart ) stopComment = txtComment->GetText();
isOK = true;
TTimer::SingleShot(500, "StartStopDialog", this, "CloseWindow()");
}

40
DAQ/startStopDialog.h Normal file
View File

@ -0,0 +1,40 @@
#ifndef START_STOP_DIALOG_H
#define START_STOP_DIALOG_H
#include <TQObject.h>
#include <RQ_OBJECT.h>
#include <TGButton.h>
#include <TGLabel.h>
#include <TTimer.h>
#include <TGTextEntry.h>
#include "macro.h"
class TGWindow;
class TGMainFrame;
class StartStopDialog{
RQ_OBJECT("StartStopDialog")
private:
TGTextEntry * txtComment;
bool isStart;
public:
StartStopDialog(const TGWindow *p, const TGWindow *main, UInt_t w, UInt_t h, bool isStart);
virtual ~StartStopDialog();
TGTransientFrame * fMain;
void DoClose();
void DoOK();
void CloseWindow() { delete this;}
static TString startComment;
static TString stopComment;
static bool isOK;
};
#endif

View File

@ -1,3 +1,4 @@
#include "macro.h"
#include "ClassData.h" #include "ClassData.h"
#include "ClassDigitizer.h" #include "ClassDigitizer.h"
@ -69,35 +70,27 @@ int getch(void){
return temp; return temp;
} }
unsigned long get_time(){
unsigned long time_us;
struct timeval t1;
struct timezone tz;
gettimeofday(&t1, &tz);
time_us = (t1.tv_sec) * 1000000 + t1.tv_usec;
return time_us;
}
int main(int argc, char* argv[]){ int main(int argc, char* argv[]){
/**////##################### Demo for loading and change setting without open a digitizer /**////##################### Demo for loading and change setting without open a digitizer
Digitizer * dig = new Digitizer(); Digitizer * dig = new Digitizer();
dig->OpenDigitizer(0, 1, false, true); dig->OpenDigitizer(0, 1, false, true);
dig->LoadSettingBinary("setting_323.bin"); dig->LoadSettingBinary("expDir/settings/setting_323.bin");
//dig->ProgramPHABoard(); //dig->ProgramPHABoard();
//dig->OpenSettingBinary("setting_323.bin"); //dig->OpenSettingBinary("setting_323.bin");
//dig->ReadAllSettingsFromBoard(); //dig->ReadAllSettingsFromBoard();
//dig->PrintSettingFromMemory(); //dig->PrintSettingFromMemory();
dig->StopACQ();
dig->WriteRegister(Register::DPP::SoftwareClear_W, 1); dig->WriteRegister(Register::DPP::SoftwareClear_W, 1);
///dig->SaveSettingAsText("haha.txt"); ///dig->SaveSettingAsText("haha.txt");
std::remove("Test_323_139_000.fsu"); ///std::remove("Test_323_139_000.fsu");
/**
{///============ Checking the buffer size calculation {///============ Checking the buffer size calculation
unsigned short B = 10; /// BLT unsigned short B = 10; /// BLT
unsigned short Eg = 511; /// Event / dual channel unsigned short Eg = 511; /// Event / dual channel
@ -151,12 +144,12 @@ int main(int argc, char* argv[]){
dig->StartACQ(); dig->StartACQ();
for( int i = 0; i < 2; i++){ for( int i = 0; i < 60; i++){
usleep(1000000); usleep(500*1000);
dig->ReadData(); dig->ReadData();
printf("------------------- %d\n", i); printf("------------------- %d\n", i);
unsigned long time1 = get_time(); unsigned long time1 = get_time();
dig->GetData()->DecodeBuffer(false,4); dig->GetData()->DecodeBuffer(false,0);
unsigned long time2 = get_time(); unsigned long time2 = get_time();
printf("********************* decode time : %lu usec\n", time2-time1); printf("********************* decode time : %lu usec\n", time2-time1);
dig->GetData()->PrintStat(); dig->GetData()->PrintStat();

View File

@ -18,25 +18,28 @@ extern Digitizer ** digi;
//extern bool ProgramSetting::EnableDatabase; //extern bool ProgramSetting::EnableDatabase;
bool TriggerSummary::isOpened = false;
bool TriggerSummary::isManualOpened = false;
bool TriggerSummary::updateFlag = true; bool TriggerSummary::updateFlag = true;
TGTextEntry * TriggerSummary::txtTrigger[MaxNBoards][MaxNChannels] = {NULL}; TGTextEntry * TriggerSummary::txtTrigger[MaxNBoards][MaxNChannels] = {NULL};
TGTextEntry * TriggerSummary::txtThresholdValue[MaxNBoards][MaxNChannels] = {NULL}; TGTextEntry * TriggerSummary::txtThresholdValue[MaxNBoards][MaxNChannels] = {NULL};
TGTextEntry * TriggerSummary::txtThreshold[MaxNBoards][MaxNChannels] = {NULL}; TGTextEntry * TriggerSummary::txtThreshold[MaxNBoards][MaxNChannels] = {NULL};
TGCheckButton * TriggerSummary::cbChannelEnable[MaxNBoards][MaxNChannels] = {NULL};
TGNumberEntry * TriggerSummary::numUpdateTime = NULL; TGNumberEntry * TriggerSummary::numUpdateTime = NULL;
unsigned short TriggerSummary::value[MaxNBoards][MaxNChannels] = {0}; unsigned short TriggerSummary::value[MaxNBoards][MaxNChannels] = {0};
bool TriggerSummary::onOff[MaxNBoards][MaxNChannels] = {1};
TriggerSummary::TriggerSummary(const TGWindow *p, UInt_t w, UInt_t h){ TriggerSummary::TriggerSummary(const TGWindow *p, UInt_t w, UInt_t h){
printf("----- %s \n", __func__);
fMain = new TGMainFrame(p,w,h); fMain = new TGMainFrame(p,w,h);
fMain->SetWindowName("Scalar Panel"); fMain->SetWindowName("Scalar Panel");
fMain->Connect("CloseWindow()", "TriggerSummary", this, "CloseWindow()"); fMain->Connect("CloseWindow()", "TriggerSummary", this, "CloseWindow()");
//fMain->SetMWMHints(0,0, 0);
TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain); fMain->AddFrame(hframe); TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain); fMain->AddFrame(hframe);
TGLayoutHints * kaka = new TGLayoutHints(kLHintsLeft, 0,0,0,0); /// left, right, top, bottom TGLayoutHints * kaka = new TGLayoutHints(kLHintsLeft, 0,0,0,0); /// left, right, top, bottom
TGLayoutHints * lala = new TGLayoutHints(kLHintsLeft, 0,0,3,2); /// left, right, top, bottom
TGGroupFrame * gBD[nDigi]; TGGroupFrame * gBD[nDigi];
TGLabel * lbCh[nDigi][MaxNChannels]; TGLabel * lbCh[nDigi][MaxNChannels];
@ -49,11 +52,16 @@ TriggerSummary::TriggerSummary(const TGWindow *p, UInt_t w, UInt_t h){
TGVerticalFrame * vframe1 = new TGVerticalFrame(gBD[bd]); gBD[bd]->AddFrame(vframe1, 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)); TGVerticalFrame * vframe2 = new TGVerticalFrame(gBD[bd]); gBD[bd]->AddFrame(vframe2, new TGLayoutHints(kLHintsCenterX, 0, 0, 0, 0));
TGVerticalFrame * vframe3 = new TGVerticalFrame(gBD[bd]); gBD[bd]->AddFrame(vframe3, new TGLayoutHints(kLHintsCenterX, 0, 0, 0, 0)); TGVerticalFrame * vframe3 = new TGVerticalFrame(gBD[bd]); gBD[bd]->AddFrame(vframe3, new TGLayoutHints(kLHintsCenterX, 0, 0, 0, 0));
TGVerticalFrame * vframe4 = new TGVerticalFrame(gBD[bd]); gBD[bd]->AddFrame(vframe4, new TGLayoutHints(kLHintsCenterX, 0, 0, 0, 0));
TGLabel * lbCh0 = new TGLabel(vframe0, "ch"); vframe0->AddFrame(lbCh0, new TGLayoutHints(kLHintsCenterY, 0,5,3,2)); 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 * 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)); TGLabel * lbThreshold = new TGLabel(vframe2, "Thres."); vframe2->AddFrame(lbThreshold, new TGLayoutHints(kLHintsCenterY, 5,5,3,2));
TGLabel * lbdummy = new TGLabel(vframe3, ""); vframe3->AddFrame(lbdummy, new TGLayoutHints(kLHintsCenterY, 5,5,3,2)); TGLabel * lbdummy = new TGLabel(vframe3, ""); vframe3->AddFrame(lbdummy, new TGLayoutHints(kLHintsCenterY, 5,5,3,2));
TGLabel * lbdummy2 = new TGLabel(vframe4, ""); vframe4->AddFrame(lbdummy2, new TGLayoutHints(kLHintsCenterY, 5,5,3,2));
uint32_t chMask = 0xFFFF;
if( digi != NULL ) chMask = digi[bd]->ReadRegister(Register::DPP::ChannelEnableMask);
for( int ch = 0; ch < (digi == NULL ? MaxNChannels: digi[bd]->GetNChannel()); ch++){ 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,4,2)); lbCh[bd][ch] = new TGLabel(vframe0, Form("%02d", ch)); vframe0->AddFrame(lbCh[bd][ch], new TGLayoutHints(kLHintsCenterY, 0,5,4,2));
@ -75,12 +83,22 @@ TriggerSummary::TriggerSummary(const TGWindow *p, UInt_t w, UInt_t h){
} }
txtThresholdValue[bd][ch]->SetText(Form("%d", value[bd][ch]), false); txtThresholdValue[bd][ch]->SetText(Form("%d", value[bd][ch]), false);
txtThreshold[bd][ch] = new TGTextEntry(vframe3, ""); vframe3->AddFrame(txtThreshold[bd][ch], kaka);
txtThreshold[bd][ch] = new TGTextEntry(vframe3, "", 100*bd + ch); vframe3->AddFrame(txtThreshold[bd][ch], kaka);
txtThreshold[bd][ch]->Resize(50,20); txtThreshold[bd][ch]->Resize(50,20);
txtThreshold[bd][ch]->SetAlignment(kTextRight); txtThreshold[bd][ch]->SetAlignment(kTextRight);
txtThreshold[bd][ch]->Connect("ReturnPressed()", "TriggerSummary", this, "SetThreshold()"); txtThreshold[bd][ch]->Connect("ReturnPressed()", "TriggerSummary", this, "SetThreshold()");
txtThreshold[bd][ch]->SetText(Form("%d", value[bd][ch]), false); txtThreshold[bd][ch]->SetText(Form("%d", value[bd][ch]), false);
cbChannelEnable[bd][ch] = new TGCheckButton(vframe4, ""); vframe4->AddFrame(cbChannelEnable[bd][ch], lala);
cbChannelEnable[bd][ch]->Resize(50,20);
cbChannelEnable[bd][ch]->SetState(kButtonDown);
cbChannelEnable[bd][ch]->Connect("Clicked()", "TriggerSummary", this, "SetChannelEnable()");
if( ( chMask & ( 1 << ch ) ) == 0 ) {
txtThreshold[bd][ch]->SetEnabled(false);
cbChannelEnable[bd][ch]->SetState(kButtonUp);
onOff[bd][ch] = false;
}
} }
} }
@ -89,7 +107,7 @@ TriggerSummary::TriggerSummary(const TGWindow *p, UInt_t w, UInt_t h){
TGLabel * lbUpDateTime = new TGLabel(hframeSetting, "Update Period [msec]:"); TGLabel * lbUpDateTime = new TGLabel(hframeSetting, "Update Period [msec]:");
hframeSetting->AddFrame(lbUpDateTime, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,3,3)); hframeSetting->AddFrame(lbUpDateTime, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,3,3));
numUpdateTime = new TGNumberEntry(hframeSetting, 3000, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); numUpdateTime = new TGNumberEntry(hframeSetting, 1000, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative);
hframeSetting->AddFrame(numUpdateTime, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,3,3)); hframeSetting->AddFrame(numUpdateTime, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,3,3));
numUpdateTime->Resize(50, 20); numUpdateTime->Resize(50, 20);
@ -98,6 +116,7 @@ TriggerSummary::TriggerSummary(const TGWindow *p, UInt_t w, UInt_t h){
fMain->MapWindow(); fMain->MapWindow();
updateFlag = true; updateFlag = true;
isOpened = true;
if( digi != NULL ){ if( digi != NULL ){
printf("-------- %s thread\n", __func__); printf("-------- %s thread\n", __func__);
@ -115,10 +134,13 @@ TriggerSummary::~TriggerSummary(){
delete txtTrigger[i][j]; delete txtTrigger[i][j];
delete txtThresholdValue[i][j]; delete txtThresholdValue[i][j];
delete txtThreshold[i][j]; delete txtThreshold[i][j];
delete cbChannelEnable[i][j];
} }
} }
delete numUpdateTime; delete numUpdateTime;
isOpened = false;
isManualOpened = false;
updateFlag = false; updateFlag = false;
thread->Join(); thread->Join();
@ -135,27 +157,30 @@ void * TriggerSummary::UpdateTriggerRate(void * ptr){
std::ofstream myfile; std::ofstream myfile;
unsigned int t1 = get_time();
unsigned int t2 = 0;
while( updateFlag){ while( updateFlag){
if( ProgramSetting::EnableDatabase ) myfile.open( "tempDB.txt");
for( int bd = 0; bd < nDigi; bd++){ for( int bd = 0; bd < nDigi; bd++){
for( int ch = 0; ch < digi[bd]->GetNChannel(); ch++){ for( int ch = 0; ch < digi[bd]->GetNChannel(); ch++){
txtTrigger[bd][ch]->SetText(Form("%.2f", digi[bd]->GetData()->TriggerRate[ch])); txtTrigger[bd][ch]->SetText(Form("%.2f", digi[bd]->GetData()->TriggerRate[ch]));
value[bd][ch] = digi[bd]->GetSettingFromMemory(Register::DPP::PHA::TriggerThreshold, ch); value[bd][ch] = digi[bd]->GetSettingFromMemory(Register::DPP::PHA::TriggerThreshold, ch);
txtThresholdValue[bd][ch]->SetText(Form("%d", value[bd][ch]), false); txtThresholdValue[bd][ch]->SetText(Form("%d", value[bd][ch]), false);
if( ProgramSetting::EnableDatabase ) {
myfile << "Rate,Bd=" << bd << ",Ch=" << ch << " value=" << digi[bd]->GetData()->TriggerRate[ch] << "\n";
}
} }
} }
t2 = get_time();
if( ProgramSetting::EnableDatabase ){ if( ProgramSetting::EnableDatabase && (t2 - t1) > 5*1e6){
myfile.open( "tempDB.txt");
for( int bd = 0; bd < nDigi; bd++){
for( int ch = 0; ch < digi[bd]->GetNChannel(); ch++){
myfile << "Rate,Bd=" << bd << ",Ch=" << ch << " value=" << digi[bd]->GetData()->TriggerRate[ch] << "\n";
}
}
myfile.close(); myfile.close();
int temp = system(cmd.c_str()); int temp = system(cmd.c_str());
t1 = t2;
} }
usleep(numUpdateTime->GetNumber() * 1000); usleep(numUpdateTime->GetNumber() * 1000);
@ -170,27 +195,58 @@ void TriggerSummary::SetThreshold(){
for( int bd = 0; bd < nDigi; bd++){ for( int bd = 0; bd < nDigi; bd++){
for( int ch = 0; ch < digi[bd]->GetNChannel(); ch++){ for( int ch = 0; ch < digi[bd]->GetNChannel(); ch++){
unsigned short haha = atoi( txtThreshold[bd][ch]->GetText()); unsigned int haha = atoi( txtThreshold[bd][ch]->GetText());
if( value[bd][ch] != haha ){ if( value[bd][ch] != haha ){
if( digi[bd]->IsRunning() ) {
digi[bd]->StopACQ();
usleep(100*1000);
}
if( digi[bd]->GetDPPType() == V1730_DPP_PSD_CODE ) { if( digi[bd]->GetDPPType() == V1730_DPP_PSD_CODE ) {
digi[bd]->WriteRegister(Register::DPP::PSD::TriggerThreshold, haha, ch); digi[bd]->WriteRegister(Register::DPP::PSD::TriggerThreshold, haha, ch);
value[bd][ch] = digi[bd]->GetSettingFromMemory(Register::DPP::PSD::TriggerThreshold, ch); value[bd][ch] = digi[bd]->GetSettingFromMemory(Register::DPP::PSD::TriggerThreshold, ch);
} }
if( digi[bd]->GetDPPType() == V1730_DPP_PHA_CODE ) { if( digi[bd]->GetDPPType() == V1730_DPP_PHA_CODE ) {
digi[bd]->WriteRegister(Register::DPP::PHA::TriggerThreshold, haha, ch); digi[bd]->WriteRegister(Register::DPP::PHA::TriggerThreshold, haha, ch);
value[bd][ch] = digi[bd]->GetSettingFromMemory(Register::DPP::PHA::TriggerThreshold, ch); value[bd][ch] = digi[bd]->GetSettingFromMemory(Register::DPP::PHA::TriggerThreshold, ch);
} }
txtThresholdValue[bd][ch]->SetText(Form("%d", value[bd][ch]), false); txtThresholdValue[bd][ch]->SetText(Form("%d", value[bd][ch]), false);
if( digi[bd]->IsRunning() ) {
usleep(100*1000);
digi[bd]->StartACQ();
}
}
}
}
}
void TriggerSummary::SetChannelEnable(){
if( digi == NULL ) return;
for( int bd = 0; bd < nDigi; bd++){
for( int ch = 0; ch < digi[bd]->GetNChannel(); ch++){
bool state = ( cbChannelEnable[bd][ch]->GetState() == kButtonDown ? true : false);
if( onOff[bd][ch] != state ){
if( digi[bd]->IsRunning() ) {
digi[bd]->StopACQ();
usleep(100*1000);
}
digi[bd]->SetChannelOnOff(ch, state);
onOff[bd][ch] = state;
txtThreshold[bd][ch]->SetEnabled(state);
if( digi[bd]->IsRunning() ) {
usleep(100*1000);
digi[bd]->StartACQ();
}
} }
} }
} }
} }

View File

@ -22,23 +22,29 @@ class TriggerSummary{
static TGTextEntry * txtTrigger[MaxNBoards][MaxNChannels]; static TGTextEntry * txtTrigger[MaxNBoards][MaxNChannels];
static TGTextEntry * txtThresholdValue[MaxNBoards][MaxNChannels]; static TGTextEntry * txtThresholdValue[MaxNBoards][MaxNChannels];
static TGTextEntry * txtThreshold[MaxNBoards][MaxNChannels]; static TGTextEntry * txtThreshold[MaxNBoards][MaxNChannels];
static TGCheckButton * cbChannelEnable[MaxNBoards][MaxNChannels];
TThread * thread; TThread * thread;
static bool updateFlag; static bool updateFlag;
static TGNumberEntry * numUpdateTime; static TGNumberEntry * numUpdateTime;
static unsigned short value[MaxNBoards][MaxNChannels]; static unsigned short value[MaxNBoards][MaxNChannels];
static bool onOff[MaxNBoards][MaxNChannels];
public: public:
TriggerSummary(const TGWindow *p, UInt_t w, UInt_t h); TriggerSummary(const TGWindow *p, UInt_t w, UInt_t h);
virtual ~TriggerSummary(); virtual ~TriggerSummary();
static bool isOpened;
static bool isManualOpened;
void CloseWindow() { delete this;} void CloseWindow() { delete this;}
static void * UpdateTriggerRate(void *ptr); static void * UpdateTriggerRate(void *ptr);
void SetThreshold(); void SetThreshold();
void SetThreshold(int boardID, int ch, unsigned short val) { value[boardID][ch] = val; } //void SetThreshold(int boardID, int ch, unsigned short val) { value[boardID][ch] = val; }
void SetChannelEnable();
}; };

View File

@ -3,4 +3,4 @@ DataPath=/home/catrina/FSUDAQ/expDir
DatabaseIP=https://fsunuc.physics.fsu.edu/influx/ DatabaseIP=https://fsunuc.physics.fsu.edu/influx/
DatabaseName=testing DatabaseName=testing
ElogIP=elog.physics.fsu.edu ElogIP=elog.physics.fsu.edu
lastRunID=8 lastRunID=13