// dcgui.C #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class MyMainFrame : public TGMainFrame { private: TRootEmbeddedCanvas **rEcanvas, **mEcanvas, **rNumEcanvas, **mNumEcanvas; TRootEmbeddedCanvas *sqlEcanvas; TGMainFrame *fMain; TGGroupFrame *rateGframe, *madcGframe; TCanvas **rCanvas, **mCanvas, **rNumCanvas, **mNumCanvas; TCanvas *sqlcanvas; TGTextView *logwidget; TFile *datafile; TTimer *timer, *squelchtimer; Int_t init, counter, refreshcounter, elaptime, cslice; TH2F **ratemon, **adcmon, **ratenorm, **adcnorm; TH1D **rateNum, **adcNum, **sixfourhist; Double_t rnominal, mnominal; Int_t Nusb, maxtubes; Int_t Nslices; Int_t *Ntube; TH2F **agghist3D; TH2F **histarray3D; TH2F **temphist3D; TH1D *aggproj; TGNumberEntry *enterusb, *entertube, *enterchan; Int_t inusb, intube, inchan; Int_t checktime; Int_t sqlstat; Bool_t *goodchans; Int_t *ratestat, *adcstat; Double_t moncheck; Bool_t alarmtime, alarmlock, rtrigger, mtrigger; Pixel_t red, grey; TThread *redrawthread, *alarmthread, *slicethread, *updatethread; TMutex *threadmutex, *drawmutex; Int_t protodex; public: MyMainFrame(const TGWindow *p,UInt_t w,UInt_t h); virtual ~MyMainFrame(); void DoDraw(); void EnableTimer(); void DisableTimer(); void RefreshMonitor(); static void *UpdateMethod(void *arg); ClassDef(MyMainFrame, 0) }; MyMainFrame::MyMainFrame(const TGWindow *p,UInt_t w,UInt_t h) : timer(0), squelchtimer(0) { Nslices = 12; Nusb = 5; Ntube = new Int_t[Nusb]; for(Int_t usb = 0; usb < Nusb; usb++)//Change this when MySQL is operational Ntube[usb] = 10; maxtubes = TMath::MaxElement(Nusb,Ntube); // Create a main frame fMain = new TGMainFrame(p,w,h); //Frames for canvases TGHorizontalFrame *canframe = new TGHorizontalFrame(fMain,1000,1000); rateGframe = new TGGroupFrame(canframe,"Hit Rates",kVerticalFrame); madcGframe = new TGGroupFrame(canframe,"Mean ADC Counts",kVerticalFrame); TGTab *ratetab = new TGTab(rateGframe); rateGframe->AddFrame(ratetab, new TGLayoutHints(kLHintsExpandX| kLHintsExpandY,1,1,1,1)); TGTab *madctab = new TGTab(madcGframe); madcGframe->AddFrame(madctab, new TGLayoutHints(kLHintsExpandX| kLHintsExpandY,1,1,1,1)); TGCompositeFrame *rateframe = ratetab->AddTab("Status "); rateframe->ChangeOptions(kChildFrame|kVerticalFrame); TGCompositeFrame *rateNumframe = ratetab->AddTab("Numerical "); rateNumframe->ChangeOptions(kChildFrame|kVerticalFrame); TGCompositeFrame *madcframe = madctab->AddTab("Status "); madcframe->ChangeOptions(kChildFrame|kVerticalFrame); TGCompositeFrame *madcNumframe = madctab->AddTab("Numerical "); madcNumframe->ChangeOptions(kChildFrame|kVerticalFrame); //Canvases for STATUS tab rEcanvas = new TRootEmbeddedCanvas *[Nusb]; mEcanvas = new TRootEmbeddedCanvas *[Nusb]; rCanvas = new TCanvas *[Nusb]; mCanvas = new TCanvas *[Nusb]; //ADD: Make these change vertical size depending on Ntube[usb] for(Int_t usb = 0; usb < Nusb; usb++) { rEcanvas[usb] = new TRootEmbeddedCanvas(Form("rEcanvas%d",usb),rateframe,575,125,kSunkenFrame); rateframe->AddFrame(rEcanvas[usb], new TGLayoutHints(kLHintsExpandX| kLHintsExpandY,1,1,1,1)); mEcanvas[usb] = new TRootEmbeddedCanvas(Form("mEcanvas%d",usb),madcframe,575,125,kSunkenFrame); madcframe->AddFrame(mEcanvas[usb], new TGLayoutHints(kLHintsExpandX| kLHintsExpandY,1,1,1,1)); rCanvas[usb] = rEcanvas[usb]->GetCanvas(); rCanvas[usb]->SetRightMargin(0.02); rCanvas[usb]->SetLeftMargin(0.06); mCanvas[usb] = mEcanvas[usb]->GetCanvas(); mCanvas[usb]->SetRightMargin(0.02); mCanvas[usb]->SetLeftMargin(0.06); } //Canvases for NUMERICAL tab rNumEcanvas = new TRootEmbeddedCanvas *[Nusb]; mNumEcanvas = new TRootEmbeddedCanvas *[Nusb]; rNumCanvas = new TCanvas *[Nusb]; mNumCanvas = new TCanvas *[Nusb]; for(Int_t usb = 0; usb < Nusb; usb++) { rNumEcanvas[usb] = new TRootEmbeddedCanvas(Form("rNumEcanvas%d",usb),rateNumframe,575,125,kSunkenFrame); rateNumframe->AddFrame(rNumEcanvas[usb], new TGLayoutHints(kLHintsExpandX| kLHintsExpandY,1,1,1,1)); mNumEcanvas[usb] = new TRootEmbeddedCanvas(Form("mNumEcanvas%d",usb),madcNumframe,575,125,kSunkenFrame); madcNumframe->AddFrame(mNumEcanvas[usb], new TGLayoutHints(kLHintsExpandX| kLHintsExpandY,1,1,1,1)); rNumCanvas[usb] = rNumEcanvas[usb]->GetCanvas(); rNumCanvas[usb]->SetRightMargin(0.02); rNumCanvas[usb]->SetLeftMargin(0.06); mNumCanvas[usb] = mNumEcanvas[usb]->GetCanvas(); mNumCanvas[usb]->SetRightMargin(0.02); mNumCanvas[usb]->SetLeftMargin(0.06); } // Create a horizontal frame widget for buttons TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain,200,40); //MAYBE: Re-organize buttons? TGTextButton *start = new TGTextButton(hframe,"&Start Monitor"); start->Connect("Clicked()","MyMainFrame",this,"EnableTimer()"); TGTextButton *exit = new TGTextButton(hframe,"&Exit","gApplication->Terminate(0)"); TGTextButton *stop = new TGTextButton(hframe,"&Stop Monitor"); stop->Connect("Clicked()","MyMainFrame",this,"DisableTimer()"); hframe->AddFrame(start, new TGLayoutHints(kLHintsCenterY,5,5,3,4)); hframe->AddFrame(stop, new TGLayoutHints(kLHintsCenterY,5,5,3,4)); hframe->AddFrame(exit, new TGLayoutHints(kLHintsCenterY,5,5,3,4)); canframe->AddFrame(rateGframe, new TGLayoutHints(kLHintsCenterX,2,2,2,2)); canframe->AddFrame(madcGframe, new TGLayoutHints(kLHintsCenterX,2,2,2,2)); fMain->AddFrame(canframe, new TGLayoutHints(kLHintsCenterX,2,2,2,2)); fMain->AddFrame(hframe, new TGLayoutHints(kLHintsCenterX,2,2,2,2)); fMain->SetWindowName("Online Monitor"); fMain->MapSubwindows(); fMain->Resize(fMain->GetDefaultSize()); fMain->MapWindow(); //Initialize counters============== counter = 0; cslice = 0; elaptime = 0; //Initialize aggregated histogram 3D =================== agghist3D = new TH2F *[maxtubes*Nusb]; for(Int_t usb = 0; usb < Nusb; usb++) for(Int_t tube = 0; tube < Ntube[usb]; tube++) agghist3D[usb*maxtubes+tube] = new TH2F(Form("agghist_%d_%d",usb,tube),Form("agghist_%d_%d",usb,tube),64,.5,64.5,100,0,2000); //Temporary histograms used in reading of ntuples temphist3D = new TH2F *[maxtubes]; for(Int_t tube = 0; tube < maxtubes; tube++) temphist3D[tube] = new TH2F(Form("temphist3D_%d",tube),Form("temphist_%d",tube),64,.5,64.5,100,0,2000); aggproj = new TH1D("aggproj","aggproj",100,0,2000); //Initialize histogram slices histarray3D = new TH2F *[Nusb*maxtubes*Nslices]; for(Int_t usb = 0; usb < Nusb; usb++) for(Int_t tube = 0; tube < Ntube[usb]; tube++) for(Int_t slice = 0; slice < Nslices; slice++) histarray3D[slice+tube*Nslices+usb*maxtubes*Nslices] = new TH2F(Form("hist_%d_%d_%d",usb,tube,slice),Form("hist_%d_%d_%d",usb,tube,slice),64,.5,64.5,100,0,2000); //create 2D rate-monitoring histograms, ADC-monitoring histos ratemon = new TH2F *[Nusb]; adcmon = new TH2F *[Nusb]; for(Int_t i = 0; i < Nusb; i++) { ratemon[i] = new TH2F(Form("ratemon%d",i), Form("Rate Monitor, USB %d",i+1),64,.5,64.5,Ntube[i],.5,Ntube[i]+.5); adcmon[i] = new TH2F(Form("adcmon%d",i), Form("Mean ADC Monitor, USB %d",i+1),64,.5,64.5,Ntube[i],.5,Ntube[i]+.5); } //Create Numerical display Histograms rateNum = new TH1D *[Nusb]; adcNum = new TH1D *[Nusb]; sixfourhist = new TH1D *[Nusb]; for(Int_t usb = 0; usb < Nusb; usb++) { rateNum[usb] = new TH1D(Form("rateNum%d",usb), Form("Numerical Rates, USB %d",usb+1),Ntube[usb],.5,Ntube[usb]+.5); adcNum[usb] = new TH1D(Form("adcNum%d",usb), Form("Numerical Mean ADC, USB %d",usb+1),Ntube[usb],.5,Ntube[usb]+.5); sixfourhist[usb] = new TH1D(Form("sixfourhist%d",usb),Form("Six-four %d",usb+1),Ntube[usb],.5,Ntube[usb]+.5); for(Int_t tube = 1; tube <= Ntube[usb]; tube++) sixfourhist[usb]->SetBinContent(tube,64); } //Initialize thread updatethread = new TThread("updatethread", UpdateMethod, (void*) this); } //DODRAW =================================================================== void MyMainFrame::DoDraw() { updatethread->Run();//thread which updates ratemon and adcmon } void MyMainFrame::EnableTimer() { if(!timer) { timer = new TTimer(this, 10000, kTRUE); //synchronous or asynch? timer->Connect("Timeout()", "MyMainFrame", this, "DoDraw()"); timer->Reset(); timer->TurnOn(); } else timer->TurnOn(); } void MyMainFrame::DisableTimer() { if(timer) timer->TurnOff(); } void MyMainFrame::RefreshMonitor() { cout << "Drawing: " << time(NULL) << endl; for(Int_t usb = 0; usb < Nusb; usb++) { rCanvas[usb]->cd(); ratemon[usb]->Draw("col"); rCanvas[usb]->Update(); mCanvas[usb]->cd(); adcmon[usb]->Draw("col"); mCanvas[usb]->Update(); rNumCanvas[usb]->cd(); rateNum[usb]->Draw(); rNumCanvas[usb]->Update(); mNumCanvas[usb]->cd(); adcNum[usb]->Draw(); mNumCanvas[usb]->Update(); } } void *MyMainFrame::UpdateMethod(void *arg) { MyMainFrame *fMain = (MyMainFrame *)arg; //thread assertion with update and alarm fMain->RefreshMonitor(); } MyMainFrame::~MyMainFrame() { // Clean up used widgets: frames, buttons, layouthints fMain->Cleanup(); delete fMain; } void memleak() { // Popup the GUI... new MyMainFrame(gClient->GetRoot(),600,400); }