#include #include #include #include #include #include #include // #include "act_trackfit.h" #include "main.h" #include "gui.h" #include "display.h" // #include "GeneralDetector.h" // #include "data.h" #include "util.h" #include "Detector.h" #include "TrackFinder.h" #include "EventFinder.h" #include "Event.h" // TMP - until Ben's code is gone void act_trackfit(const char *inf, const char *outf); enum CommandIdentifiers { // MainFrame M_FILE_PROCESS, M_FILE_VIEW, M_FILE_EXIT, M_DISPLAY_CLEAR, M_DISPLAY_UPDATE, M_DISPLAY_DRAW, M_DISPLAY_DRAWMAPPING, M_DISPLAY_WRITE_TO_FILE, // ProcessFileDialog B_PROCESS_FILE_OK, B_PROCESS_FILE_CANCEL, B_PROCESS_FILE_IN_BROWSE, B_PROCESS_FILE_OUT_BROWSE, TE_PROCESS_FILE_IN, TE_PROCESS_FILE_OUT, // EventViewerDialog B_EVT_NUM, B_SEQ_NUM, B_LEFT, B_RIGHT, B_LEFT_EVENT, B_RIGHT_EVENT, B_REFIT_TRACKS }; char *rootFileTypes[] = { "ROOT files", "*.root", "CSM files", "*.csm", "All files", "*", 0, 0 }; char *csmFileTypes[] = { "CSM files", "*.csm", "ROOT files", "*.root", "All files", "*", 0, 0 }; char *epsFileTypes[] = { "EPS files", "*.eps", "All files", "*", 0, 0 }; MainFrame::MainFrame(const TGWindow *p, UInt_t w, UInt_t h) : TGMainFrame(p, w, h) { // Create menubar and popup menus. The hint objects are used to place // and group the different menu widgets with respect to eachother. fMenuBarLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 0, 0, 1, 1); fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0); fMenuFile = new TGPopupMenu(fClient->GetRoot()); fMenuFile->AddEntry("Process", M_FILE_PROCESS); fMenuFile->AddEntry("View", M_FILE_VIEW); fMenuFile->AddSeparator(); fMenuFile->AddEntry("E&xit", M_FILE_EXIT); fMenuDisplay = new TGPopupMenu(fClient->GetRoot()); fMenuDisplay->AddEntry("Clear Screen", M_DISPLAY_CLEAR); fMenuDisplay->AddEntry("Update Screen", M_DISPLAY_UPDATE); fMenuDisplay->AddEntry("Draw Detector", M_DISPLAY_DRAW); fMenuDisplay->AddEntry("Draw Tube Mapping", M_DISPLAY_DRAWMAPPING); fMenuDisplay->AddEntry("Write Display to File", M_DISPLAY_WRITE_TO_FILE); // Menu button messages are handled by the main frame (i.e. "this") // ProcessMessage() method. fMenuFile->Associate(this); fMenuDisplay->Associate(this); fMenuBar = new TGMenuBar(this, 1, 1, kHorizontalFrame); fMenuBar->AddPopup("&File", fMenuFile, fMenuBarItemLayout); fMenuBar->AddPopup("&Display", fMenuDisplay, fMenuBarItemLayout); AddFrame(fMenuBar, fMenuBarLayout); fCanvasWindow = new TRootEmbeddedCanvas("fCanvasWindow", this, w, h); fContainer = new TGCompositeFrame(fCanvasWindow->GetViewPort(), 10, 10, kHorizontalFrame, GetWhitePixel()); fContainer = new TGCompositeFrame(fCanvasWindow->GetViewPort(), 10, 10, kHorizontalFrame); fContainer->SetLayoutManager(new TGTileLayout(fContainer, 8)); fCanvasWindow->SetContainer(fContainer); theDetector->SetUpDisplay(fCanvasWindow->GetCanvas()); theDetector->Draw(); AddFrame(fCanvasWindow, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 2, 2)); SetWindowName("MiniDana Application"); MapSubwindows(); // we need to use GetDefault...() to initialize the layout algorithm... Resize(GetDefaultSize()); //Resize(400, 200); MapWindow(); } MainFrame::~MainFrame() { delete fContainer; delete fCanvasWindow; delete fMenuBarLayout; delete fMenuBarItemLayout; delete fMenuFile; delete fMenuDisplay; delete fMenuBar; } void MainFrame::CloseWindow() { // Got close message for this MainFrame. Calls parent CloseWindow() // (which destroys the window) and terminate the application. // The close message is generated by the window manager when its close // window menu item is selected. TGMainFrame::CloseWindow(); gApplication->Terminate(0); } Bool_t MainFrame::ProcessMessage(Long_t msg, Long_t parm1, Long_t) { // Handle messages send to the MainFrame object. E.g. all menu button // messages. switch (GET_MSG(msg)) { case kC_COMMAND: switch (GET_SUBMSG(msg)) { case kCM_BUTTON: break; case kCM_MENUSELECT: break; case kCM_MENU: switch (parm1) { case M_FILE_PROCESS: new ProcessFileDialog(fClient->GetRoot(), this, 400, 200); break; case M_FILE_VIEW: { TGFileInfo infi; EventViewerDialog *evd; // choose an input file infi.fFileTypes = (char **) rootFileTypes; new TGFileDialog(fClient->GetRoot(), this, kFDOpen,&infi); evd = new EventViewerDialog(fClient->GetRoot(), this, 400, 200, fCanvasWindow->GetCanvas(), infi.fFilename); } break; case M_FILE_EXIT: CloseWindow(); // this also terminates theApp break; case M_DISPLAY_CLEAR: clearScreen(); updateScreen(); break; case M_DISPLAY_UPDATE: updateScreen(); break; case M_DISPLAY_DRAW: clearScreen(); theDetector->Draw(); updateScreen(); break; case M_DISPLAY_DRAWMAPPING: clearScreen(); theDetector->DrawMapping(); updateScreen(); break; case M_DISPLAY_WRITE_TO_FILE: { TGFileInfo fi; fi.fFileTypes = (char **)epsFileTypes; new TGFileDialog(fClient->GetRoot(), this, kFDSave,&fi); printScreen(fi.fFilename); } break; default: break; } default: break; } default: break; } return kTRUE; } ProcessFileDialog::ProcessFileDialog(const TGWindow *p, const TGWindow *main, UInt_t w, UInt_t h, UInt_t options) : TGTransientFrame(p, main, w, h, options) { // initialize data members inFilename = 0; outFilename = 0; // layouts topLeftLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2); centerLayout = new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 2, 2, 2, 2); bottomRightLayout = new TGLayoutHints(kLHintsBottom | kLHintsRight, 2, 2, 2, 2); // end layouts mainFrame = new TGVerticalFrame(this, 60, 20); { configTab = new TGTab(mainFrame,300,300); { TGCompositeFrame *tab; tab = configTab->AddTab("Files"); { inBrowseButton = new TGTextButton(tab, "Browse", B_PROCESS_FILE_IN_BROWSE); inBrowseButton->Associate(this); outBrowseButton = new TGTextButton(tab, "Browse", B_PROCESS_FILE_OUT_BROWSE); outBrowseButton->Associate(this); inFileText = new TGTextEntry(tab, "", TE_PROCESS_FILE_IN); inFileText->Resize(250, inFileText->GetDefaultHeight()); inFileText->Associate(this); outFileText = new TGTextEntry(tab, "", TE_PROCESS_FILE_OUT); outFileText->Resize(250, outFileText->GetDefaultHeight()); outFileText->Associate(this); splitTreeCheck = new TGCheckButton(tab, ""); if (splitTree==true) splitTreeCheck->SetState(kButtonDown); else splitTreeCheck->SetState(kButtonUp); tab->SetLayoutManager(new TGMatrixLayout(tab, 0, 3, 10)); tab->AddFrame(new TGLabel (tab, "Input File"), topLeftLayout); tab->AddFrame(inFileText, topLeftLayout); tab->AddFrame(inBrowseButton, topLeftLayout); tab->AddFrame(new TGLabel (tab, "Output File")); tab->AddFrame(outFileText, topLeftLayout); tab->AddFrame(outBrowseButton, topLeftLayout); tab->AddFrame(new TGLabel (tab, "Split Tree"), topLeftLayout); tab->AddFrame(splitTreeCheck, topLeftLayout); } tab = configTab->AddTab("Trackfitting"); trackFinder->MakePanel(tab); tab = configTab->AddTab("Geometry"); theDetector->MakePanel(tab); } buttonFrame = new TGHorizontalFrame(this, 60, 20, kFixedWidth); { okButton = new TGTextButton(buttonFrame, "&Ok", B_PROCESS_FILE_OK); okButton->Associate(this); cancelButton = new TGTextButton(buttonFrame, "&Cancel", B_PROCESS_FILE_CANCEL); cancelButton->Associate(this); buttonFrame->AddFrame(okButton, topLeftLayout); buttonFrame->AddFrame(cancelButton, topLeftLayout); buttonFrame->Resize(150, okButton->GetDefaultHeight()); } mainFrame->AddFrame(configTab, topLeftLayout); mainFrame->AddFrame(buttonFrame, bottomRightLayout); } AddFrame(mainFrame, topLeftLayout); SetWindowName("Process File"); Resize(GetDefaultSize()); MapSubwindows(); MapWindow(); if (DEBUG_X11) { cout << "gui.cc:ProcessFileDialog:Creating " << mainFrame->GetId() << " mainFrame\n"; cout << "gui.cc:ProcessFileDialog:Creating " << buttonFrame->GetId() << " buttonFrame\n"; cout << "gui.cc:ProcessFileDialog:Creating " << configTab->GetId() << " configTab\n"; cout << "gui.cc:ProcessFileDialog:Creating " << okButton->GetId() << " okButton\n"; cout << "gui.cc:ProcessFileDialog:Creating " << cancelButton->GetId() << " cancelButton\n"; } } ProcessFileDialog::~ProcessFileDialog() { if (DEBUG_X11) { cout << "gui.cc:ProcessFileDialog:Destroying " << mainFrame->GetId() << " mainFrame\n"; cout << "gui.cc:ProcessFileDialog:Destroying " << buttonFrame->GetId() << " buttonFrame\n"; cout << "gui.cc:ProcessFileDialog:Destroying " << configTab->GetId() << " configTab\n"; cout << "gui.cc:ProcessFileDialog:Destroying " << okButton->GetId() << " okButton\n"; cout << "gui.cc:ProcessFileDialog:Destroying " << cancelButton->GetId() << " cancelButton\n"; } delete topLeftLayout; delete centerLayout; delete bottomRightLayout; delete inBrowseButton; delete outBrowseButton; delete inFileText; delete outFileText; delete splitTreeCheck; delete okButton; delete cancelButton; delete configTab; delete mainFrame; delete buttonFrame; if (inFilename) delete inFilename; if (outFilename) delete outFilename; } void ProcessFileDialog::CloseWindow() { // Called when window is closed via the window manager. delete this; } Bool_t ProcessFileDialog::ProcessMessage(Long_t msg, Long_t parm1, Long_t) { switch (GET_MSG(msg)) { case kC_COMMAND: switch (GET_SUBMSG(msg)) { case kCM_BUTTON: switch(parm1) { case B_PROCESS_FILE_OK: // make trackfitter read it's parameters trackFinder->ReadPanel(); theDetector->ReadPanel(); if (splitTreeCheck->GetState()==kButtonDown) splitTree=true; if (splitTreeCheck->GetState()==kButtonUp) splitTree=false; InputFilename(inFileText->GetText()); OutputFilename(outFileText->GetText()); act_trackfit(inFilename->Data(), outFilename->Data()); trackFinder->DestroyPanel(); theDetector->DestroyPanel(); CloseWindow(); break; case B_PROCESS_FILE_CANCEL: CloseWindow(); break; case B_PROCESS_FILE_IN_BROWSE: { TGFileInfo fi; fi.fFileTypes = csmFileTypes; new TGFileDialog(fClient->GetRoot(), this, kFDOpen,&fi); inFileText->SetText(fi.fFilename); } break; case B_PROCESS_FILE_OUT_BROWSE: { TGFileInfo fi; fi.fFileTypes = rootFileTypes; new TGFileDialog(fClient->GetRoot(), this, kFDSave,&fi); outFileText->SetText(fi.fFilename); } break; default: break; } default: break; } break; case kC_TEXTENTRY: switch (GET_SUBMSG(msg)) { case kTE_TEXTCHANGED: switch (parm1) { case TE_PROCESS_FILE_IN: { char buf[100]; char *ext; sprintf(buf, "%s", inFileText->GetText()); ext=endswith(buf, ".csm"); if (ext) sprintf(ext, "%s", ".root"); outFileText->SetText(buf); } break; case TE_PROCESS_FILE_OUT: break; } break; default: break; } break; default: break; } return kTRUE; } void ProcessFileDialog::InputFilename(TString *infName) {inFilename = infName;} void ProcessFileDialog::OutputFilename(TString *outfName) { outFilename = outfName; } void ProcessFileDialog::InputFilename(const char *infName) { if (inFilename) delete inFilename; inFilename = new TString(infName); } void ProcessFileDialog::OutputFilename(const char *outfName) { if (outFilename) delete outFilename; outFilename = new TString (outfName); } TString * ProcessFileDialog::InputFilename(void) {return inFilename;} TString * ProcessFileDialog::OutputFilename(void) {return outFilename;} EventViewerDialog::EventViewerDialog(const TGWindow *p, const TGWindow *main, UInt_t w, UInt_t h, TCanvas *canv, const char *inFilename, UInt_t options = kMainFrame | kVerticalFrame) : TGTransientFrame(p, main, w, h, options) { canvas = canv; run = new EventFinder(inFilename); topLeftLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2); bottomRightLayout = new TGLayoutHints(kLHintsBottom | kLHintsRight, 2, 2, 2, 2); stretchLayout = new TGLayoutHints(kLHintsExpandX | kLHintsCenterX, 2,2,2,2); tabber = new TGTab(this,300,300); { TGCompositeFrame *tab; { tab = tabber->AddTab("View Event"); evtNumText = new TGTextEntry(tab, ""); evtNumText->Resize(100, evtNumText->GetDefaultHeight()); evtNumButton = new TGTextButton(tab, "View", B_EVT_NUM); evtNumButton->Associate(this); seqNumText = new TGTextEntry(tab, ""); seqNumText->Resize(100, seqNumText->GetDefaultHeight()); seqNumButton = new TGTextButton(tab, "View", B_SEQ_NUM); seqNumButton->Associate(this); leftButton = new TGTextButton(tab, "<<<", B_LEFT); leftButton->Associate(this); rightButton = new TGTextButton(tab, ">>>", B_RIGHT); rightButton->Associate(this); leftEventButton = new TGTextButton(tab, "<<<", B_LEFT_EVENT); leftEventButton->Associate(this); rightEventButton = new TGTextButton(tab, ">>>", B_RIGHT_EVENT); rightEventButton->Associate(this); refitTracksButton = new TGTextButton(tab, "Go", B_REFIT_TRACKS); refitTracksButton->Associate(this); tab->SetLayoutManager(new TGMatrixLayout(tab, 0, 3, 10)); tab->AddFrame(new TGLabel(tab, "View EVID : "), topLeftLayout); tab->AddFrame(evtNumText, topLeftLayout); tab->AddFrame(evtNumButton, topLeftLayout); tab->AddFrame(new TGLabel(tab, "View Nth Event in File : ")); tab->AddFrame(seqNumText, topLeftLayout); tab->AddFrame(seqNumButton, topLeftLayout); tab->AddFrame(leftButton, stretchLayout); tab->AddFrame(new TGLabel(tab, "Next Event")); tab->AddFrame(rightButton, stretchLayout); tab->AddFrame(leftEventButton, stretchLayout); tab->AddFrame(new TGLabel(tab, "Next Event w/Tracks")); tab->AddFrame(rightEventButton, stretchLayout); tab->AddFrame(new TGLabel(tab, "")); tab->AddFrame(new TGLabel(tab, "Refit Tracks")); tab->AddFrame(refitTracksButton); } tab = tabber->AddTab("Trackfitting"); trackFinder->MakePanel(tab); } AddFrame(tabber); SetWindowName("Event Viewer"); Resize(GetDefaultSize()); MapSubwindows(); MapWindow(); } EventViewerDialog::~EventViewerDialog(void) { delete run; delete topLeftLayout; delete bottomRightLayout; delete stretchLayout; delete refitTracksButton; delete leftButton; delete rightButton; delete leftEventButton; delete rightEventButton; delete evtNumText; delete seqNumText; delete evtNumButton; delete seqNumButton; delete tabber; } void EventViewerDialog::CloseWindow() { // Called when window is closed via the window manager. trackFinder->DestroyPanel(); delete this; } Bool_t EventViewerDialog::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2) { Event *e; switch (GET_MSG(msg)) { case kC_COMMAND: switch (GET_SUBMSG(msg)) { case kCM_BUTTON: switch(parm1) { case B_LEFT: e=run->Previous(); if (e) e->Draw(); else cerr << "gui.cc:No previous event!\n"; break; case B_RIGHT: e=run->Next(); if (e) e->Draw(); else cerr << "gui.cc:No next event!\n"; break; case B_LEFT_EVENT: do { e=run->Previous(); if (!e) break; } while (e->NTracks()==0); if (e) e->Draw(); else cerr << "gui.cc:No previous event w/ tracks!\n"; break; case B_RIGHT_EVENT: do { e=run->Next(); if (!e) break; } while (e->NTracks()==0); if (e) e->Draw(); else cerr << "gui.cc:No next event w/ tracks!\n"; break; case B_EVT_NUM: { Int_t num = atoi(evtNumText->GetText()); run->Evid(num)->Draw(); } break; case B_SEQ_NUM: { Int_t num = atoi(seqNumText->GetText()); run->Sequential(num)->Draw(); } break; case B_REFIT_TRACKS: { trackFinder->ReadPanel(); trackFinder->FindTracks(run->Current()); } default: break; } default: break; } break; default: break; } return kTRUE; } // for (i=0; i<9; ++i) // if (fC[i]->GetState() == kButtonDown) // buttons |= mb_button_id[i]; // for (i=0; i<4; ++i) // if (fR[i]->GetState() == kButtonDown) // { icontype = mb_icon[i]; break; } // new TGMsgBox(fClient->GetRoot(), this, // fTbtitle->GetString(), fTbmsg->GetString(), // icontype, buttons, &retval); // Int_t mb_button_id[9] = { kMBYes, kMBNo, kMBOk, kMBApply, // kMBRetry, kMBIgnore, kMBCancel, // kMBClose, kMBDismiss }; // EMsgBoxIcon mb_icon[4] = { kMBIconStop, kMBIconQuestion, // kMBIconExclamation, kMBIconAsterisk };