#include "CXMainWindow.h" #include "TStyle.h" #include "TG3DLine.h" #include "TApplication.h" #include "TGraphErrors.h" #include "TGMenu.h" #include "TGSplitter.h" #include "TRootEmbeddedCanvas.h" #include "TGTab.h" #include "TGStatusBar.h" #include "TVirtualPadEditor.h" #include "TFrame.h" #include "TGFileBrowser.h" #include "KeySymbols.h" #include "TGListView.h" #include "TClassMenuItem.h" #include "TROOT.h" #include "TGFSContainer.h" #include "TBrowser.h" #include "TClass.h" #include "CXGateBox.h" #include "CXBgdUtility.h" #include "CXGuiToolbar.h" #include "CXFileList.h" #include "CXGuiLSPlayer.h" #include "CXHist1DPlayer.h" #include "CXHist2DPlayer.h" #include "CXGammaSearch.h" using namespace std; ULong_t CXred; ULong_t CXblue; ULong_t CXblack; ULong_t CXgreen; CXMainWindow::CXMainWindow(const TGWindow *p, UInt_t w, UInt_t h) : TGMainFrame(p, w, h) { Init(); } void CXMainWindow::Init() { gClient->GetColorByName("red", CXred); gClient->GetColorByName("blue", CXblue); gClient->GetColorByName("black",CXblack); gClient->GetColorByName("green",CXgreen); TGHorizontalFrame *fHf = new TGHorizontalFrame(this,GetWidth(),GetHeight()); //------- Menu ----------- //----------------Menu File-------------------- fMenuFile = new TGPopupMenu(gClient->GetRoot()); fMenuFile->AddEntry("New Canvas", M_New_Canvas, 0 , gClient->GetPicture("newcanvas.xpm")); fMenuFile->AddEntry("New Browser", M_New_Browser, 0, gClient->GetPicture("browser.xpm")); fMenuFile->AddEntry("Save Canvas as", M_Save_As, 0, gClient->GetPicture("bld_save.png")); fMenuFile->AddEntry("Save hist to ascii", M_Save_To_Ascii, 0, gClient->GetPicture("query_new.xpm")); fMenuFile->AddSeparator(); fMenuFile->AddEntry("Exit", M_Exit, 0, gClient->GetPicture("bld_exit.png")); fMenuFile->Connect("Activated(Int_t)", "CXMainWindow", this, "HandleMenu(Int_t)"); //----------------Menu View-------------------- fMenuView = new TGPopupMenu(gClient->GetRoot()); fMenuView->Connect("Activated(Int_t)", "CXMainWindow", this, "HandleMenu(Int_t)"); fMenuView->AddEntry("Browse Files", M_FileListUtility); fMenuView->CheckEntry(M_FileListUtility); IsFileListUtilityEnabled = true; fMenuView->AddEntry("Hist1D Player", M_Hist1DPlayer); fMenuView->CheckEntry(M_Hist1DPlayer); IsHist1DPlayerEnabled= true; fMenuView->AddEntry("Hist2D Player", M_Hist2DPlayer); fMenuView->CheckEntry(M_Hist2DPlayer); IsHist2DPlayerEnabled= true; fMenuView->AddEntry("LS Player", M_LSPlayerUtility); fMenuView->CheckEntry(M_LSPlayerUtility); IsLSPlayerToolEnabled = true; fMenuView->AddEntry("background utility", M_BkdUtility); fMenuView->CheckEntry(M_BkdUtility); IsBkdUtilityEnabled = true; fMenuView->AddSeparator(); fMenuView->AddEntry("Show editor", M_Editor); fMenuView->CheckEntry(M_Editor); IsEditorEnabled = true; //----------------Menu Tools-------------------- fMenuTools = new TGPopupMenu(gClient->GetRoot()); fMenuTools->AddEntry("Gamma search", M_GammaSearch); fMenuTools->AddSeparator(); fMenuTools->Connect("Activated(Int_t)", "CXMainWindow", this, "HandleMenu(Int_t)"); fMenuBar = new TGMenuBar(this, 1, 1, kHorizontalFrame); this->AddFrame(fMenuBar, new TGLayoutHints(kLHintsExpandX)); fMenuBar->AddPopup("File", fMenuFile, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); fMenuBar->AddPopup("View", fMenuView, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); fMenuBar->AddPopup("Tools", fMenuTools, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); TGHorizontal3DLine *fline = new TGHorizontal3DLine(this); AddFrame(fline,new TGLayoutHints(kLHintsExpandX)); // //////////////////******************** partie gauche ********************//////////////////////////////// fTGCanvas = new TGCanvas(fHf, 10, 10, kFixedWidth); fHf->AddFrame(fTGCanvas, new TGLayoutHints(kLHintsLeft | kLHintsExpandY)); TGVerticalFrame *VFrame = new TGVerticalFrame(fTGCanvas->GetViewPort()); fTGCanvas->SetContainer(VFrame); fTGCanvas->Resize(GetWidth()*0.25, GetHeight()); fMainTab = new TGTab(VFrame); VFrame->AddFrame(fMainTab, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 0, 4, 0, 0)); fMainTab->Connect("CloseTab(Int_t)", "CXMainWindow", this, "CloseToolsTab(Int_t)"); TString Name; // ------- Background subtract Tool ----------- Name = "Bkgd Player"; fBkdToolTab = fMainTab->AddTab(Name); fBkdSubtract = new CXBgdUtility(fBkdToolTab,10,10); fBkdSubtract->SetMainWindow(this); fBkdSubtract->SetName(Name); fBkdToolTab->AddFrame(fBkdSubtract, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 0, 4, 0, 0)); ToggleTab(IsBkdUtilityEnabled,M_BkdUtility,fBkdToolTab,Name); // ------- Hist1D Player ----------- Name = "1D Player"; fHist1DPlayerTab = fMainTab->AddTab(Name); fHist1DPlayer = new CXHist1DPlayer(fHist1DPlayerTab,10,10); fHist1DPlayer->SetMainWindow(this); fHist1DPlayer->SetName(Name); fHist1DPlayerTab->AddFrame(fHist1DPlayer, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 0, 4, 0, 0)); ToggleTab(IsHist1DPlayerEnabled,M_Hist1DPlayer,fHist1DPlayerTab,Name); // ------- Hist2D Player ----------- Name = "2D Player"; fHist2DPlayerTab = fMainTab->AddTab(Name); fHist2DPlayer = new CXHist2DPlayer(fHist2DPlayerTab,10,10); fHist2DPlayer->SetMainWindow(this); fHist2DPlayer->SetName(Name); fHist2DPlayerTab->AddFrame(fHist2DPlayer, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 0, 4, 0, 0)); ToggleTab(IsHist2DPlayerEnabled,M_Hist2DPlayer,fHist2DPlayerTab,Name); // ------- LS Player Tool ----------- Name = "LS Player"; fLSPlayerToolTab = fMainTab->AddTab(Name); fLSPlayerTool = new CXGuiLSPlayer(fLSPlayerToolTab,10,10); fLSPlayerTool->SetMainWindow(this); fLSPlayerTool->SetName(Name); fLSPlayerToolTab->AddFrame(fLSPlayerTool, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 0, 4, 0, 0)); ToggleTab(IsLSPlayerToolEnabled,M_LSPlayerUtility,fLSPlayerToolTab,Name); // // ------- Brows File Tool ----------- Name = "Files"; fFileListTab = fMainTab->AddTab(Name); fFileList = new CXFileList(fFileListTab,GetWidth(), GetHeight()); fFileList->SetMainWindow(this); fFileList->SetName(Name); fFileListTab->AddFrame(fFileList, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 0, 4, 0, 0)); fMainTab->GetTabTab(fFileList->GetName())->ShowClose(); ToggleTab(IsFileListUtilityEnabled,M_FileListUtility,fFileListTab,fFileList->GetName()); // //////////////////******************** partie droite ********************//////////////////////////////// fSplitter = new TGVFileSplitter(fHf,2,2); fSplitter->SetFrame(fTGCanvas, kTRUE); fHf->AddFrame(fSplitter, new TGLayoutHints(kLHintsLeft | kLHintsExpandY)); fSplitter->Connect("LayoutHeader(TGFrame *)", "CXMainWindow", this, "DoRefresh()"); fVFRight = new TGVerticalFrame(fHf, 10, 10); fHf->AddFrame(fVFRight, new TGLayoutHints(kLHintsRight | kLHintsExpandX | kLHintsExpandY)); fListOfCanvases = new TList(); fCanvasTab = new TGTab(fVFRight); fCanvasTab->Connect("CloseTab(Int_t)", "CXMainWindow", this, "CloseCanvasTab(Int_t)"); fCanvasTab->Connect("Selected(Int_t)", "CXMainWindow", this, "DoTab(Int_t)"); fVFRight->AddFrame(fCanvasTab, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 5, 5, 5, 5)); NewTab(); DoTab(); //------- Editor ----------- fEditorTab = fMainTab->AddTab("Editor"); fEditorTab->SetEditable(); fEditor = TVirtualPadEditor::LoadEditor(); fEditor->SetGlobal(kFALSE); fEditorTab->SetEditable(kFALSE); ToggleTab(IsEditorEnabled,M_Editor,fEditorTab,"Editor"); // status bar Int_t parts[] = {20 , 20 , 20 , 20 ,20}; fStatusBar = new TGStatusBar(fVFRight,50,10,kHorizontalFrame); fStatusBar->SetParts(parts,5); fStatusBar->Draw3DCorner(kFALSE); fVFRight->AddFrame(fStatusBar, new TGLayoutHints(kLHintsBottom | kLHintsLeft | kLHintsExpandX, 0, 0, 2, 0)); AddFrame(fHf, new TGLayoutHints(kLHintsRight | kLHintsExpandX | kLHintsExpandY)); UpdateContextMenus(); // What to clean up in destructor SetCleanup(kDeepCleanup); // Set a name to the main frame SetWindowName("Cubix Spectra Player"); MapSubwindows(); Layout(); Resize(GetDefaultSize()); MapWindow(); gSystem->ProcessEvents(); ToggleTab(IsFileListUtilityEnabled,M_FileListUtility,fFileListTab,fFileList->GetName()); } CXMainWindow::~CXMainWindow() { } void CXMainWindow::HandleMovement(Int_t EventType, Int_t EventX, Int_t EventY, TObject *selected) { fSelectedPad = fCanvas->GetClickSelectedPad(); if(gPad && selected != nullptr) { const char *text0, *text1, *text2, *text4; char text3[50]; text0 = selected->ClassName(); SetStatusText(text0,0); text1 = selected->GetTitle(); SetStatusText(text1,1); text2 = selected->GetName(); SetStatusText(text2,2); if(fCanvas->GetCrosshair() == 1 && (selected->InheritsFrom("TFrame") || selected->InheritsFrom("TH1") || selected->InheritsFrom("CXCanvas") || selected->InheritsFrom("TPad"))) { if (EventType == kButton2){ fRefX = gPad->AbsPixeltoX(EventX); fRefY = gPad->AbsPixeltoY(EventY); } if (EventType == kButton1){ fRefX = 0; fRefY = 0; } } if (EventType == kKeyPress) sprintf(text3, "%c", (char) EventY); else sprintf(text3, "%.2f,%.2f", gPad->AbsPixeltoX(EventX)- fRefX, gPad->AbsPixeltoY(EventY) - fRefY ); SetStatusText(text3,3); text4 = selected->GetObjectInfo(EventX,EventY); SetStatusText(text4,4); } // if (EventType == kButton1Down) // { // if(fMainTab->GetCurrentTab() == fMainTab->GetTabTab("Editor")) fMainTab->CloseTab(fMainTab->GetCurrent()); // } /// Recuperation de la derniere position de la souris if(EventType == kMouseMotion) { fCanvas->AbsPixeltoXY(EventX,EventY,fLastXPosition,fLastYPosition); } if(EventType == kKeyPress) { if((EKeySym)EventY==kKey_f && !fCTRL) { if(IsHist1DPlayerEnabled==false) ToggleTab(IsHist1DPlayerEnabled,M_Hist1DPlayer,fHist1DPlayerTab,fHist1DPlayer->GetName()); fMainTab->SetTab(fHist1DPlayer->GetName()); if(fHist1DPlayer->IsCurrentFit()) fHist1DPlayer->DoFit(); else{ fHist1DPlayer->NewFit(); } } if((EKeySym)EventY==kKey_s && !fCTRL) { if(IsHist1DPlayerEnabled==false) ToggleTab(IsHist1DPlayerEnabled,M_Hist1DPlayer,fHist1DPlayerTab,fHist1DPlayer->GetName()); fMainTab->SetTab(fHist1DPlayer->GetName()); fHist1DPlayer->PeakClear(); fHist1DPlayer->PeakSearch(); } if((EKeySym)EventY==kKey_c && !fCTRL) { fHist1DPlayer->ClearFit(); fHist1DPlayer->PeakClear(); } if((EKeySym)EventY==kKey_n && !fCTRL) { NewTab(); } if((EKeySym)EventY==kKey_S && !fCTRL && selected && (selected->InheritsFrom("TH1") || selected->InheritsFrom("TGraph") || selected->InheritsFrom("TF1") )) { AddToStoredSpectra(selected); } } /// Don't work with the touch pad // if(EventType == kMouseMotion && fLastEventType == kButton1Up && EventX==fLastEventX && EventY==fLastEventY ) //equivalent to escape // { // if(fHist1DPlayer->IsCurrentFit()) // fHist1DPlayer->EndFit(); // } fLastEventType = EventType; fLastEventX = EventX; fLastEventY = EventY; fLastSelected = selected; } void CXMainWindow::SetStatusText(const char *txt, Int_t pi) { // Set text in status bar. if(fStatusBar!=0x0) fStatusBar->SetText(txt,pi); } void CXMainWindow::CloseToolsTab(Int_t tabnr) { TGTabElement *tab = fMainTab->GetTabTab(tabnr); TString Name = tab->GetText()->Data(); if(Name==fFileList->GetName()) ToggleTab(IsFileListUtilityEnabled,M_FileListUtility,fFileListTab,Name); else if(Name==fLSPlayerTool->GetName()) ToggleTab(IsLSPlayerToolEnabled,M_LSPlayerUtility,fLSPlayerToolTab,Name); else if(Name==fHist1DPlayer->GetName()) ToggleTab(IsHist1DPlayerEnabled,M_Hist1DPlayer,fHist1DPlayerTab,Name); else if(Name==fHist2DPlayer->GetName()) ToggleTab(IsHist2DPlayerEnabled,M_Hist2DPlayer,fHist2DPlayerTab,Name); else if(Name=="Editor") ToggleTab(IsEditorEnabled,M_Editor,fEditorTab,Name); else if(Name==fBkdSubtract->GetName()) ToggleTab(IsBkdUtilityEnabled,M_BkdUtility,fBkdToolTab,Name); } void CXMainWindow::CloseTab(TGTab *tab, Int_t tabnr) { for(int i=0 ; iGetListOfPrimitives()->GetEntries() ; i++) { TObject *o = fCanvas->GetListOfPrimitives()->At(i); if(o->InheritsFrom("TH1")) delete o; } TGFrameElement *el = 0; if (tab->GetTabContainer(tabnr)) el = (TGFrameElement *)tab->GetTabContainer(tabnr)->GetList()->First(); if (el && el->fFrame) { el->fFrame->Disconnect("ProcessedConfigure(Event_t*)"); el->fFrame->SetFrameElement(0); if (el->fFrame->InheritsFrom("TGMainFrame")) { Bool_t sleep = (el->fFrame->InheritsFrom("TRootCanvas")) ? kTRUE : kFALSE; ((TGMainFrame *)el->fFrame)->CloseWindow(); if (sleep) gSystem->Sleep(150); gSystem->ProcessEvents(); } else delete el->fFrame; el->fFrame = 0; if (el->fLayout && (el->fLayout != fgDefaultHints) && (el->fLayout->References() > 0)) { el->fLayout->RemoveReference(); if (!el->fLayout->References()) { delete el->fLayout; } } tab->GetTabContainer(tabnr)->GetList()->Remove(el); delete el; tab->RemoveTab(tabnr); } if(tab == fCanvasTab) fListOfCanvases->RemoveAt(tabnr); } void CXMainWindow::DoTab(Int_t tabnr) { fCanvas = (CXCanvas*)fListOfCanvases->At(tabnr); fSelectedPad = fCanvas->cd(); if(fCanvas->GetUniqueID() == 666) fSelectedPad = fCanvas->cd(1); fCanvas->SetSelectedPad((TPad*)fSelectedPad); fCanvas->Update(); //------- Editor ----------- if(fEditorTab != nullptr) { delete fEditor; fEditorTab->SetEditable(); fEditor = TVirtualPadEditor::LoadEditor(); fEditor->SetGlobal(kFALSE); fEditorTab->SetEditable(kFALSE); } } void CXMainWindow::NewTab(Int_t px, Int_t py, TString name) { TString TabName = Form("Canvas %d",fCanvasTab->GetNumberOfTabs()); if(name != "") TabName = name; while(fCanvasTab->GetTabTab(TabName)) { TObjArray *arr = TabName.Tokenize("_"); TString last = arr->Last()->GetName(); delete arr; if(last.IsDigit()) { Int_t n = last.Atoi(); TabName.ReplaceAll(Form("_%d",n),Form("_%d",n+1)); } else { TabName.Append("_2"); } } TGCompositeFrame *atab = fCanvasTab->AddTab(TabName); fCanvasTab->GetTabTab(TabName)->ShowClose(); fToolBar = new CXGuiToolbar(atab, 60, 20, kHorizontalFrame); atab->AddFrame(fToolBar, new TGLayoutHints(kLHintsTop | kLHintsExpandX)); fRootCanvas = new TRootEmbeddedCanvas("ec1", atab); atab->AddFrame(fRootCanvas, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 5, 5, 5, 5)); Int_t canvasid = fRootCanvas->GetCanvasWindowId(); fCanvas = new CXCanvas(TabName.Copy().ReplaceAll(" ","_"), 10, 10, canvasid); fCanvas->SetMainWindow(this); fListOfCanvases->Add(fCanvas); fCanvas->ToggleToolBar(); fRootCanvas->AdoptCanvas(fCanvas); fRootCanvas->GetContainer()->Connect("ProcessedEvent(Event_t*)", "CXMainWindow", this, "ProcessedKeyEvent(Event_t*)"); gStyle->SetOptStat(0); gStyle->SetOptTitle(0); fCanvas->SetRightMargin(0.0229983); fCanvas->SetBottomMargin(0.0866051); fCanvas->SetLeftMargin(0.0826235); fCanvas->SetTopMargin(0.0127021); fCanvas->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)", "CXMainWindow", this, "HandleMovement(Int_t,Int_t,Int_t, TObject*)"); if(px*py>1) { fCanvas->SetUniqueID(666); fCanvas->cd(); fCanvas->Divide(px,py,0.001,0.001); fCanvas->Update(); for(int i=0 ;iGetPad(i+1); pad->cd(); pad->SetLeftMargin(0.05); pad->SetRightMargin(fCanvas->GetRightMargin()); pad->SetBottomMargin(fCanvas->GetBottomMargin()); pad->SetTopMargin(fCanvas->GetTopMargin()); pad->DrawFrame(0,0,1,1); pad->Update(); pad->SetBit(TPad::kCannotMove); pad->GetFrame()->SetBit(TObject::kCannotPick); } fCanvas->SetClickSelectedPad((TPad*) fCanvas->GetPad(1)); fSelectedPad = (TPad*) fCanvas->GetPad(1); } else { fCanvas->DrawFrame(0,0,1,1); fCanvas->SetClickSelectedPad((TPad*)fCanvas); fSelectedPad = (TPad*) fCanvas; } fCanvas->Update(); fCanvas->GetFrame()->SetBit(TObject::kCannotPick); fCanvasTab->SetTab(fCanvasTab->GetNumberOfTabs()-1); fToolBar->SetCanvas(fCanvas); fCanvasTab->MapSubwindows(); fCanvasTab->Layout(); } void CXMainWindow::HandleMenu(Int_t id) { // Handle menu items. switch (id) { case M_New_Canvas: NewTab(); break; case M_New_Browser: new TBrowser; break; case M_Save_As: fCanvas->SaveCanvasAs(); break; case M_Save_To_Ascii: SaveToAscii(); break; case M_Exit: CloseWindow(); break; case M_Editor: ToggleTab(IsEditorEnabled,M_Editor,fEditorTab,"Editor"); break; case M_BkdUtility: ToggleTab(IsBkdUtilityEnabled,M_BkdUtility,fBkdToolTab,fBkdSubtract->GetName()); break; case M_Hist1DPlayer: ToggleTab(IsHist1DPlayerEnabled,M_Hist1DPlayer,fHist1DPlayerTab,fHist1DPlayer->GetName()); break; case M_Hist2DPlayer: ToggleTab(IsHist2DPlayerEnabled,M_Hist2DPlayer,fHist2DPlayerTab,fHist2DPlayer->GetName()); break; case M_LSPlayerUtility: ToggleTab(IsLSPlayerToolEnabled,M_LSPlayerUtility,fLSPlayerToolTab,fLSPlayerTool->GetName()); break; case M_FileListUtility: ToggleTab(IsFileListUtilityEnabled,M_FileListUtility,fFileListTab,fFileList->GetName()); break; case M_GammaSearch: if(fGammaSearchWindow == nullptr) fGammaSearchWindow = new CXGammaSearch(gClient->GetRoot(),gClient->GetRoot(),1200,450, this); else fGammaSearchWindow->MapRaised(); break; if(gPad != 0x0) { gPad->Modified(); gPad->Update(); } break; } } void CXMainWindow::ToggleTab(Bool_t &Enable, ETestCommandIdentifiers id, TGCompositeFrame *tab, const char * name) { if(!Enable) { fMenuView->CheckEntry(id); fMainTab->AddTab(name,tab); fMainTab->SetTab(name); fMainTab->GetTabTab(name)->ShowClose(); if(tab != fEditorTab) tab->MapSubwindows(); Layout(); } else { fMenuView->UnCheckEntry(id); fMainTab->SetTab(name); fMainTab->RemoveTab(fMainTab->GetCurrent()); } Enable = !Enable; } void CXMainWindow::SaveCanvasAs() { const char* SaveAsTypes[] = { "PDF", "*.pdf", "PostScript", "*.ps", "Encapsulated PostScript", "*.eps", "SVG", "*.svg", "TeX", "*.tex", "GIF", "*.gif", "ROOT macros", "*.C", "ROOT files", "*.root", "XML", "*.xml", "PNG", "*.png", "XPM", "*.xpm", "JPEG", "*.jpg", "TIFF", "*.tiff", "XCF", "*.xcf", "All files", "*", 0, 0 }; TString workdir = gSystem->WorkingDirectory(); static TString dir("."); static Int_t typeidx = 0; static Bool_t overwr = kFALSE; TGFileInfo fi; fi.fFileTypes = SaveAsTypes; fi.fIniDir = StrDup(dir); fi.fFileTypeIdx = typeidx; fi.fOverwrite = overwr; new TGFileDialog(gClient->GetDefaultRoot(), gClient->GetDefaultRoot(), kFDSave, &fi); gSystem->ChangeDirectory(workdir.Data()); if (!fi.fFilename) return; TString fn = fi.fFilename; dir = fi.fIniDir; typeidx = fi.fFileTypeIdx; overwr = fi.fOverwrite; if(!fn.EndsWith(fi.fFileTypes[1])) fn.Append(fi.fFileTypes[1]); fCanvas->SaveAs(fn); } void CXMainWindow::DoRefresh() { fMainTab->Resize(10,10); Layout(); } void CXMainWindow::RefreshPad() { fCanvas->Update(); fCanvas->Modified(); } void CXMainWindow::CloseWindow() { if(fGammaSearchWindow) { fGammaSearchWindow->CloseWindow(); } UnmapWindow(); DeleteWindow();// launch a delete but after a short time like a thread. cout << " Bye Bye Cubix!" <SetReturnFromRun(false); gApplication->Terminate(false); } TH1 *CXMainWindow::GetHisto(TVirtualPad *pad) { TH1 *hist; if(pad == nullptr && fSelectedPad == nullptr) return nullptr; if(pad == nullptr) pad = fSelectedPad; for(int i=0 ; iGetListOfPrimitives()->GetEntries() ; i++) { TObject *o = pad->GetListOfPrimitives()->At(i); if(o->InheritsFrom("TH1")) { hist = dynamic_cast(o); return hist; } } return nullptr; } void CXMainWindow::UpdateContextMenus() { /// TH1 /// TClass *cl = gROOT->GetClass("TH1F"); cl->MakeCustomMenuList(); TList * ml = cl->GetMenuList(); TClassMenuItem *n; n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Add to Stored spectra","AddToStoredSpectra",this,"TObject *",0); ml->AddFirst(n); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Fit Peaks","PopUpFitPeaks",this,"TObject *",0); ml->AddFirst(n); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Find Peaks","PopUpFindPeaks",this,"TObject *",0); ml->AddFirst(n); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Show Background","PopUpShowBackground",this,"TObject *",0); ml->AddFirst(n); for(int i=0 ; i<6 ; i++) ml->RemoveAt(ml->GetEntries()-1); for(int i=0 ; i<4 ; i++) ml->RemoveAt(ml->GetEntries()-3); for(int i=0 ; i<2 ; i++) ml->RemoveAt(ml->GetEntries()-9); ml->RemoveAt(ml->GetEntries()-13); for(int i=0 ; i<4 ; i++) ml->RemoveAt(ml->GetEntries()-14); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl,"Normalize","HistNorm",this,"TObject*", 0); ml->AddAt(n,5); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl,"Scale","HistScale",this,"Float_t,TObject*", 1); ml->AddAt(n,5); /// TH1 /// cl = gROOT->GetClass("TH1D"); cl->MakeCustomMenuList(); ml = cl->GetMenuList(); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Add to Stored spectra","AddToStoredSpectra",this,"TObject *",0); ml->AddFirst(n); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Fit Peaks","PopUpFitPeaks",this,"TObject *",0); ml->AddFirst(n); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Find Peaks","PopUpFindPeaks",this,"TObject *",0); ml->AddFirst(n); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Show Background","PopUpShowBackground",this,"TObject *",0); ml->AddFirst(n); for(int i=0 ; i<6 ; i++) ml->RemoveAt(ml->GetEntries()-1); for(int i=0 ; i<4 ; i++) ml->RemoveAt(ml->GetEntries()-3); for(int i=0 ; i<2 ; i++) ml->RemoveAt(ml->GetEntries()-9); ml->RemoveAt(ml->GetEntries()-13); for(int i=0 ; i<4 ; i++) ml->RemoveAt(ml->GetEntries()-14); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl,"Normalize","HistNorm",this,"TObject*", 0); ml->AddAt(n,5); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl,"Scale","HistScale",this,"Float_t,TObject*", 1); ml->AddAt(n,5); /// TH1Proj /// cl = gROOT->GetClass("CXTH1Proj"); cl->MakeCustomMenuList(); ml = cl->GetMenuList(); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Fit Peaks","PopUpFitPeaks",this,"TObject *",0); ml->AddFirst(n); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Find Peaks","PopUpFindPeaks",this,"TObject *",0); ml->AddFirst(n); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Show Background","PopUpShowBackground",this,"TObject *",0); ml->AddFirst(n); for(int i=0 ; i<6 ; i++) ml->RemoveAt(ml->GetEntries()-1); for(int i=0 ; i<4 ; i++) ml->RemoveAt(ml->GetEntries()-3); for(int i=0 ; i<2 ; i++) ml->RemoveAt(ml->GetEntries()-9); ml->RemoveAt(ml->GetEntries()-13); for(int i=0 ; i<4 ; i++) ml->RemoveAt(ml->GetEntries()-14); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl,"Normalize","HistNorm",this,"TObject*", 0); ml->AddAt(n,5); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl,"Scale","HistScale",this,"Float_t,TObject*", 1); ml->AddAt(n,5); /// TH2F /// cl = gROOT->GetClass("TH2F"); cl->MakeCustomMenuList(); ml = cl->GetMenuList(); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Add to Stored spectra","AddToStoredSpectra",this,"TObject *",0); ml->AddFirst(n); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Eval Background","PopUpEval2DBackground",this,"TObject *",0); ml->AddFirst(n); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl, "Init GxG","PopUpInitGG",this,"TObject *",0); ml->AddFirst(n); for(int i=0 ; i<6 ; i++) ml->RemoveAt(ml->GetEntries()-1); for(int i=0 ; i<4 ; i++) ml->RemoveAt(ml->GetEntries()-3); ml->RemoveAt(ml->GetEntries()-9); for(int i=0 ; i<7 ; i++) ml->RemoveAt(ml->GetEntries()-12); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl,"Rebin","Rebin2D",this,"Int_t, Int_t, TObject*", 2); ml->AddAt(n,12); // n = new TClassMenuItem(TClassMenuItem::kPopupSeparator,cl);ml->AddAt(n,ml->GetEntries()-4); /// CXArrow /// cl = gROOT->GetClass("CXArrow"); cl->MakeCustomMenuList(); ml = cl->GetMenuList(); for(int i=0 ; i<18 ; i++) ml->RemoveAt(ml->GetEntries()-1); // n = new TClassMenuItem(TClassMenuItem::kPopupSeparator,cl);ml->AddAt(n,ml->GetEntries()-4); } void CXMainWindow::Rebin2D(Int_t RebinX, Int_t RebinY, TObject *c) { TH2 *hist = static_cast(c); TString DrawOpt = hist->GetDrawOption(); if(DrawOpt=="") DrawOpt = "col"; hist = hist->Rebin2D(RebinX,RebinY,hist->GetName()); hist->Draw(DrawOpt); RefreshPad(); } void CXMainWindow::PopUpEval2DBackground(TObject *c) { TH2 *hist = static_cast(c); if(IsBkdUtilityEnabled==false) ToggleTab(IsBkdUtilityEnabled,M_BkdUtility,fBkdToolTab,fBkdSubtract->GetName()); fMainTab->SetTab(fBkdSubtract->GetName()); fBkdSubtract->Do2DEvaluation(hist); } void CXMainWindow::PopUpInitGG(TObject *c) { TH2 *hist = static_cast(c); if(IsHist2DPlayerEnabled==false) ToggleTab(IsHist2DPlayerEnabled,M_Hist2DPlayer,fHist2DPlayerTab,fHist2DPlayer->GetName()); fMainTab->SetTab(fHist2DPlayer->GetName()); fHist2DPlayer->InitGG(hist); } void CXMainWindow::HistNorm(TObject *c) { TH1 *hist = static_cast(c); Float_t x1,x2; x1=gPad->GetUxmin(); x2=gPad->GetUxmax(); hist->GetXaxis()->UnZoom(); hist->Scale(1./hist->Integral()); hist->GetXaxis()->SetRangeUser(x1,x2); RefreshPad(); } void CXMainWindow::HistScale(Float_t scaleFact, TObject *c) { TH1 *hist = static_cast(c); hist->Scale(scaleFact); RefreshPad(); } void CXMainWindow::PopUpShowBackground(TObject *c) { TH1 *hist = static_cast(c); if(GetHisto()->GetName() != hist->GetName()) { fCanvas->cd(); hist->Draw("hist"); RefreshPad(); } if(IsBkdUtilityEnabled==false) ToggleTab(IsBkdUtilityEnabled,M_BkdUtility,fBkdToolTab,fBkdSubtract->GetName()); fMainTab->SetTab(fBkdSubtract->GetName()); fBkdSubtract->DoActivate(); RefreshPad(); } void CXMainWindow::AddToStoredSpectra(TObject *c) { TObject *o = c; if(fHist2DPlayer){ if(IsHist2DPlayerEnabled==false) ToggleTab(IsHist2DPlayerEnabled,M_Hist2DPlayer,fHist2DPlayerTab,fHist2DPlayer->GetName()); TObject *clone = o->Clone(); if(o->InheritsFrom(TH1::Class_Name())) ((TH1*)clone)->SetDirectory(nullptr); fHist2DPlayer->AddToStoredList(clone); } } void CXMainWindow::PopUpFindPeaks(TObject *c) { TH1 *hist = static_cast(c); if(GetHisto()->GetName() != hist->GetName()) { fCanvas->cd(); hist->Draw("hist"); RefreshPad(); } if(IsHist1DPlayerEnabled==false) ToggleTab(IsHist1DPlayerEnabled,M_Hist1DPlayer,fHist1DPlayerTab,fHist1DPlayer->GetName()); fMainTab->SetTab(fHist1DPlayer->GetName()); fHist1DPlayer->PeakSearch(); } void CXMainWindow::PopUpFitPeaks(TObject *c) { TH1 *hist = static_cast(c); if(GetHisto()->GetName() != hist->GetName()) { fCanvas->cd(); hist->Draw("hist"); RefreshPad(); } if(IsHist1DPlayerEnabled==false) ToggleTab(IsHist1DPlayerEnabled,M_Hist1DPlayer,fHist1DPlayerTab,fHist1DPlayer->GetName()); fMainTab->SetTab(fHist1DPlayer->GetName()); fHist1DPlayer->NewFit(); } void CXMainWindow::ProcessedKeyEvent(Event_t *event) { char input[10]; UInt_t keysym; gVirtualX->LookupString(event, input, sizeof(input), keysym); // std::cout << "event : " << event->fCode << " " << event->fState <<" ; "<< event->fType << "; " << keysym << std::endl; if(event->fType == kGKeyPress && keysym == kKey_Control) fCTRL = true; if(event->fType == kKeyRelease && keysym == kKey_Control) fCTRL = false; } ClassImp(CXMainWindow)