//------------------------------------------------------------------------------ // DAQ application task -- // (C) Devis Contarato 2009, Berkeley Lab -- //------------------------------------------------------------------------------ //______________________________________________________________________________ // {Trace} // [File name] "task_DAQ_GUI.cpp" // [Author] "Devis Contarato" // [Version] "0.5" // [Modified by] "Devis Contarato" // [Last revision] "18 May 2009" // [Language] "C++" // [Compiler] "Visual C++ 8.x 9.x" // [Member of] "Cool SEAL" // [Project] "SEAL" // [Description] "DAQ application task" // [Key documentation] // "Visual C++ Reference Help" // {Trace} //______________________________________________________________________________ // Standard components // Application components #include "global.h" #include "cool.h" #include "task_DAQ_GUI.h" #include "task_DAQ_Main.h" // Define some standard color #define kc_Desk cool::Gui->kc_blue_Dark #define kc_desk_Label cool::Gui->kc_White #define kc_Btn cool::Gui->kc_Blue #define kc_btn_Label cool::Gui->kc_White //______________________________________________________________________________ task_DAQ_GUI::task_DAQ_GUI() { // Standard constructor dbg_Print("task_DAQ_GUI::task_DAQ_GUI:()", DBG_LVL_ZERO); // Startup Init(0); } //______________________________________________________________________________ task_DAQ_GUI::task_DAQ_GUI(void* parent) { // Standard constructor dbg_Print("task_DAQ_GUI::task_DAQ_GUI:(task-Object*)", DBG_LVL_ZERO); // Startup Init(parent); } //______________________________________________________________________________ task_DAQ_GUI::~task_DAQ_GUI() { // Standard destructor dbg_Print("task_DAQ_GUI::~task_DAQ_GUI: destructor called", DBG_LVL_ZERO); cool::Gui->delete_All(); } //****************************************************************************** //* * //* GUI initialization * //* * //****************************************************************************** //______________________________________________________________________________ void task_DAQ_GUI::Init(void* parent) { // Set up all the interface objects dbg_Print("task_DAQ_GUI::Init()", DBG_LVL_FLOW); //////////////////////// // GENERAL APPEARANCE // //////////////////////// // Main window size cool::Gui->size_Set(1680, 1050); cool::Gui->update_Auto(false); // Main window color cool::Gui->color_Set(0x888888, 0x000060); // Palette and canvas style for ROOT plots gStyle->SetPalette(1); gStyle->SetCanvasBorderMode(0); /////////////////////// // ACQUISITION PANEL // /////////////////////// lbl_Desk.push_back( new gui_Label("Acquisition", 16, 16) ); lbl_Desk.back()->Transparent(true); lbl_Desk.back()->fontName("Arial"); lbl_Desk.back()->fontSize(14); lbl_Desk.back()->foreColor(0xFFFFFF); lbl_Desk.back()->fontBold(true); pnl_Desk.push_back( new gui_Panel(16, 48, 532, 216, cool::Gui->kc_Cyan, true) ); pnl_Desk.back()->LowerWindow(); // btn_Acq[0]: GO button btn_Acq.push_back( new gui_CoolButton(pnl_Desk.back(), "Go", 16, 16, gui_Const::btn_Width, gui_Const::btn_Height, kc_btn_Label, gui_CoolButton::kc_Green) ); btn_Acq.back()->btn_Mode(gui_CoolButton::km_Latch); btn_Acq.back()->btn_Status(false); btn_Acq.back()->task_Connect((task_DAQ_Main*)parent, &task_DAQ_Main::btn_run_Evn); // btn_Acq[1]: QUIT button btn_Acq.push_back( new gui_CoolButton(pnl_Desk.back(), "Quit", 16, 64, gui_Const::btn_Width, gui_Const::btn_Height, kc_btn_Label, gui_CoolButton::kc_Purple) ); btn_Acq.back()->btn_Mode(gui_CoolButton::km_Button); btn_Acq.back()->btn_Status(false); btn_Acq.back()->task_Connect((task_DAQ_Main*)parent, &task_DAQ_Main::btn_quit_Evn); // cmb_Acq[0]: data acquisition mode (raw, pedestal, pedestal subtraction) cmb_Acq.push_back( new gui_Combo(pnl_Desk.back(), 2, 180, 76, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); cmb_Acq.back()->label_Set("Acquisition mode", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); cmb_Acq.back()->cbox_Entry("Raw data", 0); cmb_Acq.back()->cbox_Entry("Pedestal run", 1); cmb_Acq.back()->cbox_Entry("Subtract pedestals", 2); cmb_Acq.back()->cbox_Val(0); // Raw data mode by default // num_Acq[0]: current event number num_Acq.push_back( new gui_Numeric(pnl_Desk.back(), 0, 16, 132, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); num_Acq.back()->label_Set("Event number", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); // num_Acq[1]: number of events num_Acq.push_back( new gui_Numeric(pnl_Desk.back(), 1, 180, 132, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); num_Acq.back()->label_Set("Number of events", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); // num_Acq[2]: set ROOT file compression level; default = 1, maximum = 9 num_Acq.push_back( new gui_Numeric(pnl_Desk.back(), 1, 312, 76, gui_Const::wdgt_Width, gui_Const::wdgt_Height, 1, 9) ); num_Acq.back()->label_Set("Compression level", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); // num_Acq[3]: run number; string "_run#.root" will be attached at the end of file path num_Acq.push_back( new gui_Numeric(pnl_Desk.back(), 0, 444, 76, gui_Const::wdgt_Width, gui_Const::wdgt_Height, 0, 10000) ); num_Acq.back()->label_Set("Run number", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); // chk_Acq[0]: write data option chk_Acq.push_back( new gui_Check(pnl_Desk.back(), "Write data", 312, 176, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); chk_Acq.back()->foreColor(0xFFFFFF); // chk_Acq[1]: auto number option; if checked, run number increase automatically +1 whenever GO is pressed chk_Acq.push_back( new gui_Check(pnl_Desk.back(), "Auto Run #", 444, 176, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); chk_Acq.back()->foreColor(0xFFFFFF);; // chk_Acq[2]: CDS option (CDS = frame(n+1) - frame(n) ) chk_Acq.push_back( new gui_Check(pnl_Desk.back(), "CDS", 180, 176, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); chk_Acq.back()->foreColor(0xFFFFFF);; // chk_Acq[3]: common mode subtraction option; calculate and subtracts common mode level if checked, all 0 otherwise) chk_Acq.push_back( new gui_Check(pnl_Desk.back(), "CM subtract", 180, 208, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); chk_Acq.back()->foreColor(0xFFFFFF); // txt_Acq[0]: file path txt_Acq.push_back( new gui_Text(pnl_Desk.back(), "test.root", 312, 132, 228, gui_Const::wdgt_Height) ); txt_Acq.back()->label_Set("File path", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); //////////////////////////// // DETECTOR AND DAQ PANEL // //////////////////////////// lbl_Desk.push_back( new gui_Label("Detector & DAQ settings", 580, 16) ); lbl_Desk.back()->Transparent(true); lbl_Desk.back()->fontName("Arial"); lbl_Desk.back()->fontSize(14); lbl_Desk.back()->foreColor(0xFFFFFF); lbl_Desk.back()->fontBold(true); pnl_Desk.push_back( new gui_Panel(580, 48, 500, 216, cool::Gui->kc_Green, true) ); pnl_Desk.back()->LowerWindow(); // btn_DAQ[0]: set FPGA btn_DAQ.push_back( new gui_CoolButton(pnl_Desk.back(), "Set FPGA", 16, 16, gui_Const::btn_Width, gui_Const::btn_Height, kc_btn_Label, gui_CoolButton::kc_Cyan) ); btn_DAQ.back()->btn_Mode(gui_CoolButton::km_Button); btn_DAQ.back()->btn_Status(false); btn_DAQ.back()->task_Connect((task_DAQ_Main*)parent, &task_DAQ_Main::btn_FPGA_Evn); // btn_DAQ[1]: clear communication btn_DAQ.push_back( new gui_CoolButton(pnl_Desk.back(), "Clear COMM", 164, 16, gui_Const::btn_Width, gui_Const::btn_Height, kc_btn_Label, gui_CoolButton::kc_Red) ); btn_DAQ.back()->btn_Mode(gui_CoolButton::km_Button); btn_DAQ.back()->btn_Status(false); btn_DAQ.back()->task_Connect((task_DAQ_Main*)parent, &task_DAQ_Main::btn_Comm_Evn); // cmb_DAQ[0]: trigger mode (software, hardware) cmb_DAQ.push_back( new gui_Combo(pnl_Desk.back(), 3, 16, 76, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); cmb_DAQ.back()->label_Set("Trigger mode", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); cmb_DAQ.back()->cbox_Entry("Software", 0); cmb_DAQ.back()->cbox_Entry("Hardware", 1); cmb_DAQ.back()->cbox_Val(0); // select software trigger by default // cmb_DAQ[1]: hardware trigger source cmb_DAQ.push_back( new gui_Combo(pnl_Desk.back(), 4, 16, 132, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); cmb_DAQ.back()->label_Set("Trigger source", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); cmb_DAQ.back()->cbox_Entry("Internal", 0); cmb_DAQ.back()->cbox_Entry("External", 1); cmb_DAQ.back()->cbox_Val(0); // internal trigger by default (when hardware trigger selected // cmb_DAQ[2]: chip driver selection cmb_DAQ.push_back( new gui_Combo(pnl_Desk.back(), 1, 148, 76, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); cmb_DAQ.back()->label_Set("Select chip", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); cmb_DAQ.back()->cbox_Entry("0", 0); cmb_DAQ.back()->cbox_Entry("Dummy", 1); cmb_DAQ.back()->cbox_Entry("LDRD2", 2); cmb_DAQ.back()->cbox_Entry("SOI2 Analog", 3); cmb_DAQ.back()->cbox_Entry("SOI2 Digital", 4); cmb_DAQ.back()->cbox_Entry("SOI2 Analog + Digi", 5); cmb_DAQ.back()->cbox_Entry("TEAM1K 1 Out", 6); cmb_DAQ.back()->cbox_Entry("TEAM1K 4 Outs", 7); cmb_DAQ.back()->cbox_Entry("TEAM1K - FULL", 8); cmb_DAQ.back()->cbox_Val(8); // TEAM1K full readout by default // cmb_DAQ[3]: data source: 0=ADC data, 1=fake digital data (ramp), 2=chip digital data cmb_DAQ.push_back( new gui_Combo(pnl_Desk.back(), 5, 280, 76, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); cmb_DAQ.back()->label_Set("Data source", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); cmb_DAQ.back()->cbox_Entry("ADC data", 0); cmb_DAQ.back()->cbox_Entry("Test data", 1); cmb_DAQ.back()->cbox_Entry("Digital data", 2); cmb_DAQ.back()->cbox_Entry("ADC & Digi (SOI2)", 3); cmb_DAQ.back()->cbox_Entry("TEAM 1k", 4); cmb_DAQ.back()->cbox_Val(4); // ADC data by default // cmb_DAQ[4]: clock frequency cmb_DAQ.push_back( new gui_Combo(pnl_Desk.back(), 6, 280, 132, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); cmb_DAQ.back()->label_Set("Clock frequency", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); cmb_DAQ.back()->cbox_Entry("50 MHz", 0); cmb_DAQ.back()->cbox_Entry("25 MHz", 1); cmb_DAQ.back()->cbox_Entry("12.5 MHz", 2); cmb_DAQ.back()->cbox_Entry("6.25 MHz", 3); cmb_DAQ.back()->cbox_Entry("3.12 MHz", 4); cmb_DAQ.back()->cbox_Entry("1.56 MHz", 5); cmb_DAQ.back()->cbox_Entry("781 kHz", 6); cmb_DAQ.back()->cbox_Entry("390 kHz", 7); cmb_DAQ.back()->cbox_Entry("195 kHz", 8); cmb_DAQ.back()->cbox_Val(4); // 25 MHz by default // num_DAQ[0]: internal hardware trigger frequency num_DAQ.push_back( new gui_Numeric(pnl_Desk.back(), 10, 16, 188, gui_Const::wdgt_Width, gui_Const::wdgt_Height, 1, 65536) ); num_DAQ.back()->label_Set("Trigger freq. (Hz)", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); // num_DAQ[1]: driver delay (check coarse/fine) num_DAQ.push_back( new gui_Numeric(pnl_Desk.back(), 0, 148, 132, gui_Const::wdgt_Width, gui_Const::wdgt_Height, 0, 148) ); num_DAQ.back()->label_Set("Delay", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); // num_DAQ[2]: number of frames num_DAQ.push_back( new gui_Numeric(pnl_Desk.back(), 1, 148, 188, gui_Const::wdgt_Width, gui_Const::wdgt_Height, 1, 4) ); num_DAQ.back()->label_Set("Nb. of frames", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); // num_DAQ[3]: number of averages num_DAQ.push_back( new gui_Numeric(pnl_Desk.back(), 0, 280, 188, gui_Const::wdgt_Width, gui_Const::wdgt_Height, 0, 7) ); num_DAQ.back()->label_Set("Nb. of averages", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); // ADC channels chk_Adc.resize(5); for(int i = 0; i < chk_Adc.size(); i++){ TString chk_Adc_name; chk_Adc_name.Form("Channel %u", i+1); chk_Adc[i] = new gui_Check(pnl_Desk.back(), chk_Adc_name.Data(), 400, 72 + i*24, gui_Const::btn_Width, gui_Const::btn_Height); chk_Adc[i]->foreColor(0xFFFFFF); } //////////////////////////// // ONLINE CONTROL PANEL // //////////////////////////// lbl_Desk.push_back( new gui_Label("Online control", 1112, 16) ); lbl_Desk.back()->Transparent(true); lbl_Desk.back()->fontName("Arial"); lbl_Desk.back()->fontSize(14); lbl_Desk.back()->foreColor(0xFFFFFF); lbl_Desk.back()->fontBold(true); pnl_Desk.push_back( new gui_Panel(1112, 48, 250, 216, cool::Gui->kc_Yellow, true) ); pnl_Desk.back()->LowerWindow(); // Check buttons for activate/deactivate event display plots // chk_Online[0] chk_Online.push_back( new gui_Check(pnl_Desk.back(), "Plot 1D", 16, 20, gui_Const::btn_Width, gui_Const::btn_Height) ); chk_Online.back()->foreColor(0xFFFFFF); // chk_Online[1] chk_Online.push_back( new gui_Check(pnl_Desk.back(), "Plot column", 16, 76, gui_Const::btn_Width, gui_Const::btn_Height) ); chk_Online.back()->foreColor(0xFFFFFF); // chk_Online[2] chk_Online.push_back( new gui_Check(pnl_Desk.back(), "Plot row", 16, 132, gui_Const::btn_Width, gui_Const::btn_Height) ); chk_Online.back()->foreColor(0xFFFFFF); // chk_Online[3] chk_Online.push_back( new gui_Check(pnl_Desk.back(), "Plot histogram", 16, 188, gui_Const::btn_Width, gui_Const::btn_Height) ); chk_Online.back()->foreColor(0xFFFFFF); // Online display control numerics // num_Online[0]: column cut num_Online.push_back( new gui_Numeric(pnl_Desk.back(), 0, 148, 76, gui_Const::wdgt_Width, gui_Const::wdgt_Height, 0, 1023) ); num_Online.back()->label_Set("Column cut", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); // num_Online[1]: row cut num_Online.push_back( new gui_Numeric(pnl_Desk.back(), 0, 148, 132, gui_Const::wdgt_Width, gui_Const::wdgt_Height, 0, 1023) ); num_Online.back()->label_Set("Row cut", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); // num_Online[2]: pixel S/N threshold for online histogram num_Online.push_back( new gui_Numeric(pnl_Desk.back(), 5, 148, 188, gui_Const::wdgt_Width, gui_Const::wdgt_Height, 0, 20) ); num_Online.back()->label_Set("Pixel S/N threshold", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); /////////////////////////////// // TEAM CHIP CONTROL PANEL // /////////////////////////////// lbl_Desk.push_back( new gui_Label("TEAM1K chip control", 1394, 16) ); lbl_Desk.back()->Transparent(true); lbl_Desk.back()->fontName("Arial"); lbl_Desk.back()->fontSize(14); lbl_Desk.back()->foreColor(0xFFFFFF); lbl_Desk.back()->fontBold(true); pnl_Desk.push_back( new gui_Panel(1394, 48, 264, 216, cool::Gui->kc_Red, true) ); pnl_Desk.back()->LowerWindow(); // btn_TEAM[0]: set DAQ for full TEAM1K readout btn_TEAM.push_back( new gui_CoolButton(pnl_Desk.back(), "Set TEAM", 16 ,16, gui_Const::btn_Width, gui_Const::btn_Height, kc_btn_Label, gui_CoolButton::kc_Orange) ); btn_TEAM.back()->btn_Mode(gui_CoolButton::km_Button); btn_TEAM.back()->task_Connect((task_DAQ_Main*)parent, &task_DAQ_Main::btn_TEAM_Evn); // cmb_TEAM[0]: TEAM1K chip version: 0 = AMS, 1 = ELT cmb_TEAM.push_back( new gui_Combo(pnl_Desk.back(), 7, 16, 76, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); cmb_TEAM.back()->label_Set("TEAM1K version", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); cmb_TEAM.back()->cbox_Entry("AMS version", 0); cmb_TEAM.back()->cbox_Entry("ELT version", 1); cmb_TEAM.back()->cbox_Val(1); // ELT version by default // cmb_TEAM[1]: adaptere board selection cmb_TEAM.push_back( new gui_Combo(pnl_Desk.back(), 2, 16, 132, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); cmb_TEAM.back()->label_Set("Adapter board", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); cmb_TEAM.back()->cbox_Entry("LBNL", 0); cmb_TEAM.back()->cbox_Entry("PD", 1); cmb_TEAM.back()->cbox_Val(0); // LBNL adapter by default // num_TEAM[0]: pre-burner delay num_TEAM.push_back( new gui_Numeric(pnl_Desk.back(), 1, 16, 188, gui_Const::wdgt_Width, gui_Const::wdgt_Height, 0, 7) ); num_TEAM.back()->label_Set("TEAM1K pre-burner", gui_Const::align_Left | gui_Const::align_Top, 0xFFFFFF, 0x000060); // chk_TEAM[0]: LVDS clocks chk_TEAM.push_back( new gui_Check(pnl_Desk.back(), "LVDS clocks", 148, 76, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); chk_TEAM.back()->foreColor(0xFFFFFF); // chk_TEAM[1]: enable diagnostics clocks chk_TEAM.push_back( new gui_Check(pnl_Desk.back(), "Enable diagnostics", 148, 132, 124, gui_Const::wdgt_Height) ); chk_TEAM.back()->foreColor(0xFFFFFF); // chk_TEAM[2]: slew-rate enhancer kill chk_TEAM.push_back( new gui_Check(pnl_Desk.back(), "SRE kill", 148, 188, gui_Const::wdgt_Width, gui_Const::wdgt_Height) ); chk_TEAM.back()->foreColor(0xFFFFFF); ///////////////////////////// // REGISTERS CONTROL PANEL // ///////////////////////////// lbl_Desk.push_back(new gui_Label("Register IO", 1568, 296)); lbl_Desk.back()->Transparent(true); lbl_Desk.back()->fontName("Arial"); lbl_Desk.back()->fontSize(14); lbl_Desk.back()->foreColor(0xFFFFFF); lbl_Desk.back()->fontBold(true); pnl_Desk.push_back(new gui_Panel(1568, 328, 90, 530, cool::Gui->kc_Orange)); pnl_Desk.back()->LowerWindow(); // Register numerics for (UInt_t i = 0; i < 16; i++) { num_Reg.push_back(new gui_Numeric(pnl_Desk.back(), 0, 35, 125 + i * 26, 60, 24)); num_Reg.back()->fontName("Calibri"); num_Reg.back()->num_Hex(true); num_Reg.back()->label_Set("0x", gui_Const::align_Middle + gui_Const::align_Left, 0xFFFFFF); } // Register buttons btn_Reg.push_back(new gui_CoolButton(pnl_Desk.back(), "Write", 20, 25, 80, 36, 0xFFFFFF, cool::Gui->kc_Orange)); btn_Reg.back()->task_Connect((task_DAQ_Main*)parent, &task_DAQ_Main::btn_reg_Evn); btn_Reg.push_back(new gui_CoolButton(pnl_Desk.back(), "Read", 20, 70, 80, 36, 0xFFFFFF, cool::Gui->kc_Green)); btn_Reg.back()->task_Connect((task_DAQ_Main*)parent, &task_DAQ_Main::btn_reg_Evn); ////////////////// // DATA DISPLAY // ////////////////// // Canvas for ROOT plots plotCanvas = new gui_Canvas(1192, 296, 320, 250); pedCanvas = new gui_Canvas(792, 600, 265, 165); noiCanvas = new gui_Canvas(1192, 600, 265, 165); // ROOT histogram for online processing distPlot = new TH1D("", "", 16384, -16384, 16384); // Plots for statistics pedestalPlot = new TH1D("Pedestal","Pedestals", 16384, 0, 16384); noisePlot = new TH1D("Noise","Noise", 200, 0, 20); // gui_Maps // Palette UInt_t col[6] = {0xFF0000, 0xFFFF00, 0x00FF00, 0x00FFFF, 0x0000FF, 0xFF00FF}; map_Event = new gui_Map(80, 296, 512, 512); map_Event->range_Color(col, 6); map_Pedestal = new gui_Map(792, 780, 230, 230); map_Pedestal->range_Color(col, 6); map_Noise = new gui_Map(1192, 780, 230, 230); map_Noise->range_Color(col, 6); // gui_Plot plt_Event = new gui_Plot(792, 296, 350, 250, 0xFFFFFF); plt_Event->palette_Color(col, 1); // Refresh the Gui cool::Gui->Update(true); }