#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "DigitizerPHA.h" #include "DigitizerPSD.h" #include "FSUDAQ.h" enum MenuIdentifiers{ M_DIGITIZER_SCAN, M_FILE_OPEN, M_EXIT, M_TRIGGER_SUMMARY, M_CH_SETTING, M_BOARD_SETTINGS, M_PROGRAM_SETTINGS, M_FINDPEAKS, M_SHOW_CHANNELS_RATE }; ///make static members Digitizer ** MainWindow::digi = NULL; DigitizerPHA ** MainWindow::pha = NULL; DigitizerPSD ** MainWindow::psd = NULL; TGTextEdit * MainWindow::teLog = NULL; TRootEmbeddedCanvas * MainWindow::fEcanvas = NULL; MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { nDigi = 0; nPSD = 0; nPHA = 0; /// Create a main frame fMain = new TGMainFrame(p,w,h); ///fMain->SetWMPosition(500, 500); //does not work fMain->Connect("CloseWindow()", "MainWindow", this, "GoodBye()"); ///======================= menu fMenuBar = new TGMenuBar(fMain, 1, 1, kHorizontalFrame); fMain->AddFrame(fMenuBar, new TGLayoutHints(kLHintsTop | kLHintsExpandX)); fMenuFile = new TGPopupMenu(gClient->GetRoot()); fMenuFile->AddEntry("&Open File", M_FILE_OPEN); fMenuFile->AddSeparator(); fMenuFile->AddEntry("E&xit", M_EXIT); fMenuFile->Connect("Activated(Int_t)", "MainWindow", this, "HandleMenu(Int_t)"); fMenuBar->AddPopup("&File", fMenuFile, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); fMenuDigitizers = new TGPopupMenu(gClient->GetRoot()); fMenuDigitizers->AddEntry("Scan &Digitizers", M_DIGITIZER_SCAN); fMenuDigitizers->AddEntry("&Trigger Summary", M_TRIGGER_SUMMARY); fMenuDigitizers->AddSeparator(); fMenuDigitizers->AddEntry("Digitizer &Settings", M_BOARD_SETTINGS); fMenuDigitizers->AddEntry("&Channel Settings", M_CH_SETTING); 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_BOARD_SETTINGS); //fMenuDigitizers->DisableEntry( M_CH_SETTING); fMenuUtility = new TGPopupMenu(gClient->GetRoot()); fMenuUtility->AddEntry("Plot Channels Rate", M_SHOW_CHANNELS_RATE); fMenuDigitizers->AddSeparator(); fMenuUtility->AddEntry("Find &Peaks", M_FINDPEAKS); fMenuUtility->Connect("Activated(Int_t)", "MainWindow", this, "HandleMenu(Int_t)"); fMenuBar->AddPopup("&Utility", fMenuUtility, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); TGLayoutHints * uniLayoutHints = new TGLayoutHints(kLHintsNormal, 2,2,10,0); ///left, right, top, bottom ///================= Create a horizontal frame widget with buttons TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain,200,40); fMain->AddFrame(hframe, new TGLayoutHints(kLHintsCenterX,2,2,2,2)); ///================= Open digitizers TGTextButton *bOpenDigitizers = new TGTextButton(hframe,"Open Digitizers"); bOpenDigitizers->Connect("Clicked()","MainWindow",this,"DetectDigitizer()"); hframe->AddFrame(bOpenDigitizers, uniLayoutHints); ///================= Start Run TGTextButton *bStartRun = new TGTextButton(hframe,"Start Run"); hframe->AddFrame(bStartRun, uniLayoutHints); ///================= Stop Run TGTextButton *bStopRun = new TGTextButton(hframe,"Stop Run"); hframe->AddFrame(bStopRun, uniLayoutHints); ///================= signal Channel group TGGroupFrame * group1 = new TGGroupFrame(hframe, "Single Channel", kHorizontalFrame); hframe->AddFrame(group1 ); TGHorizontalFrame *hframe1 = new TGHorizontalFrame(group1,200,30); group1->AddFrame(hframe1 ); ///================= Create canvas widget fEcanvas = new TRootEmbeddedCanvas("Ecanvas",fMain,900,400); fMain->AddFrame(fEcanvas, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,10)); ///================= Log massage TGGroupFrame * groupLog = new TGGroupFrame(fMain, "Log Message", kHorizontalFrame); fMain->AddFrame(groupLog, new TGLayoutHints(kLHintsCenterX, 5,5,0,5) ); teLog = new TGTextEdit(groupLog, w, 100); groupLog->AddFrame(teLog, new TGLayoutHints(kLHintsNormal, 0,0,10,0)); /// Set a name to the main frame fMain->SetWindowName("FSU DAQ"); /// Map all subwindows of main frame fMain->MapSubwindows(); /// Initialize the layout algorithm fMain->Resize(fMain->GetDefaultSize()); fMain->SetWMPosition(200, 200); //does not work?? /// Map main frame fMain->MapWindow(); /// setup thread //saveDataThread = new TThread("hahaha", SaveData, (void *) 1); //fillHistThread = new TThread("kakaka", FillHistogram, (void *) 1); ///settingsSummary = NULL; boardSetting = NULL; channelSetting = NULL; ///scalarPanel = NULL; LogMsg("Ready to run."); //HandleMenu(M_DIGITIZER_SCAN); // //HandleMenu(M_BOARD_SETTINGS); HandleMenu(M_CH_SETTING); } MainWindow::~MainWindow() { delete fMenuBar; delete fMenuFile; delete fMenuDigitizers; delete fMenuUtility; //delete boardIDEntry; //delete chEntry; //delete tePath; delete teLog; if( digi != NULL ) delete [] digi; delete boardSetting; delete channelSetting; //delete settingsSummary; //delete scalarPanel; // //delete saveDataThread; //delete fillHistThread; // //delete gTrace; /// Clean up used widgets: frames, buttons, layout hints fMain->Cleanup(); delete fMain; } void MainWindow::HandleMenu(Int_t id){ switch(id){ ///========================= Scan digitizers case M_DIGITIZER_SCAN:{ LogMsg("============= detect digitizers \n"); DetectDigitizer(); printf("============= Connect %d digitizers...\n", nDigi); if( nDigi > 0 ) { digi = new Digitizer * [nDigi]; //pha = new DigitizerPHA * [nPHA]; //psd = new DigitizerPHA * [nPSD]; // //iPHA = 0; //iPSD = 0; for( int i = 0; i < nDigi; i++){ printf("------------ %d \n", i); if( DPPType[i] == V1730_DPP_PSD_CODE ) { digi[i] = new DigitizerPSD(boardID[i], portID[i]); printf("Open as PSD\n"); }else if( DPPType[i] == V1730_DPP_PHA_CODE ){ digi[i] = new DigitizerPHA(boardID[i], portID[i]); printf("Open as PHA\n"); }else{ digi[i] = new Digitizer(boardID[i], portID[i]); printf("Open as Ordinary Digitizer\n"); } } //fMenuDigitizers->EnableEntry( M_TRIGGER_SUMMARY); fMenuDigitizers->EnableEntry( M_BOARD_SETTINGS); fMenuDigitizers->EnableEntry( M_CH_SETTING); } }break; ///========================= File Open case M_FILE_OPEN:{ }break; ///========================= Exit case M_EXIT: GoodBye(); break; ///========================= Channel setting summary case M_TRIGGER_SUMMARY: { }break; ///========================= Channel setting case M_CH_SETTING: channelSetting = new ChannelSetting(gClient->GetRoot(), 600, 600, digi, nDigi); break; ///========================= Board setting case M_BOARD_SETTINGS:{ if( boardSetting == NULL ) { boardSetting = new BoardSetting(gClient->GetRoot(), 600, 600, digi, nDigi); }else{ if ( boardSetting->IsOpen() == false ){ boardSetting = new BoardSetting(gClient->GetRoot(), 600, 600, digi, nDigi); } } }break; ///========================= Program setting case M_PROGRAM_SETTINGS:{ LogMsg("[Program settings] Not impelmented"); }break; ///====================== Show channel rate; case M_SHOW_CHANNELS_RATE:{ }break; ///====================== Fit Gaussian case M_FINDPEAKS:{ LogMsg("[Find Peaks] Not impelmented"); }break; } } void MainWindow::DetectDigitizer(){ DPPType.clear(); portID.clear(); boardID.clear(); nDigi = 0; Digitizer * dig = new Digitizer(); for( int port = 0; port < 4 ; port ++){ for( int board = 0; board < 3 ; board ++){ dig->OpenDigitizer(board, port); if ( dig->GetConnectionStatus() ) { nDigi++; DPPType.push_back(dig->GetDPPType()); portID.push_back(port); boardID.push_back(board); serialNum.push_back(dig->GetSerialNumber()); dig->CloseDigitizer(); if( dig->GetDPPType() == V1730_DPP_PHA_CODE ) nPHA ++; if( dig->GetDPPType() == V1730_DPP_PSD_CODE ) nPSD ++; } } } LogMsg(Form("========== found %d digitizer \n", nDigi)); for( int i = 0 ; i < nDigi ; i++){ LogMsg(Form("port: %d, board: %d, DPP Type : %d \n", portID[i], boardID[i], DPPType[i])); } LogMsg(Form("Number of PHA : %d \n", nPHA)); LogMsg(Form("Number of PSD : %d \n", nPSD)); } Double_t standardPulse(Double_t *x, Double_t * par){ /// par[0] = start time /// par[1] = rise time /// par[2] = decay time /// par[3] = amplitude /// par[4] = baseline Double_t z = x[0] - par[0]; if( z <= 0 ) { return par[4]; }else{ return par[3]*(1-TMath::Exp(-1*z/par[1]))*TMath::Exp(-1*z/par[2]) + par[4]; } } void MainWindow::GoodBye(){ printf("----- bye bye ---- \n"); gApplication->Terminate(0); } void MainWindow::LogMsg(TString msg){ time_t now = time(0); tm * ltm = localtime(&now); int year = 1900 + ltm->tm_year; int month = 1 + ltm->tm_mon; int day = ltm->tm_mday; int hour = ltm->tm_hour; int minute = ltm->tm_min; int secound = ltm->tm_sec; TString outMsg = Form("[%4d-%02d-%02d %02d:%02d:%02d] ", year, month, day, hour, minute, secound) + msg; teLog->AddLine(outMsg); printf("%s", outMsg.Data()); teLog->LineDown(); teLog->ShowBottom(); } //############################################ int main(int argc, char **argv) { printf(" Welcome to FSU DQ \n"); TApplication theApp("App",&argc,argv); new MainWindow(gClient->GetRoot(),800,800); theApp.Run(); return 0; }