#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 "CXRad2DPlayer.h" #include "CXGammaSearch.h" #include "CXRadReader.h" #include "CXRadCubePlayer.h" #include "CXSavedList.h" #include "CXRadCubeTH1Proj.h" #include "CXTH1Proj.h" #include "CXArrow.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,0,gClient->GetPicture("ed_open.png")); // fMenuView->CheckEntry(M_FileListUtility); IsFileListUtilityEnabled = true; fMenuView->AddEntry("Saved list", M_SavedList,0,gClient->GetPicture("bld_listbox.xpm")); // fMenuView->CheckEntry(M_SavedList); IsSavedListEnabled = true; fMenuView->AddSeparator(); fMenuView->AddEntry("Show editor", M_Editor,0,gClient->GetPicture("bld_edit.png")); // fMenuView->CheckEntry(M_Editor); IsEditorEnabled = true; //---------------- Menu Tools -------------------- fMenuTools = new TGPopupMenu(gClient->GetRoot()); fMenuTools->AddLabel("1D Tools...",gClient->GetPicture("h1_t.xpm")); fMenuTools->AddSeparator(); fMenuTools->AddEntry("LS Player", M_LSPlayerUtility,0,gClient->GetPicture("levelscheme_t.png")); // fMenuTools->CheckEntry(M_LSPlayerUtility); IsLSPlayerToolEnabled = true; fMenuTools->AddEntry("Hist1D Player", M_Hist1DPlayer,0,gClient->GetPicture("FitTool.xpm")); // fMenuTools->CheckEntry(M_Hist1DPlayer); IsHist1DPlayerEnabled= true; fMenuTools->AddEntry("background utility", M_BkdUtility,0,gClient->GetPicture("h1_t.xpm")); // fMenuTools->CheckEntry(M_BkdUtility); IsBkdUtilityEnabled = true; fMenuTools->AddSeparator(); fMenuTools->AddLabel("2D Tools...",gClient->GetPicture("h2_t.xpm")); fMenuTools->AddSeparator(); fMenuTools->AddEntry("Hist2D Player", M_Hist2DPlayer,0,gClient->GetPicture("h2_t.xpm")); // fMenuTools->CheckEntry(M_Hist2DPlayer); IsHist2DPlayerEnabled= true; fMenuTools->AddEntry("Rad2D Player", M_Rad2DPlayer,0,gClient->GetPicture("rw3.gif")); // fMenuTools->CheckEntry(M_Rad2DPlayer); IsRad2DPlayerEnabled= true; fMenuTools->AddSeparator(); fMenuTools->AddLabel("3D Tools...",gClient->GetPicture("h3_t.xpm")); fMenuTools->AddSeparator(); fMenuTools->AddEntry("RadCube Player", M_RadCubePlayer,0,gClient->GetPicture("rw3.gif")); // fMenuTools->CheckEntry(M_RadCubePlayer); IsRadCubePlayerEnabled= true; fMenuTools->AddSeparator(); fMenuTools->AddLabel("Others..."); fMenuTools->AddSeparator(); fMenuTools->AddEntry("Gamma search", M_GammaSearch,0,gClient->GetPicture("ed_find.png")); fMenuTools->Connect("Activated(Int_t)", "CXMainWindow", this, "HandleMenu(Int_t)"); //---------------- Menu Options -------------------- fMenuOptions = new TGPopupMenu(gClient->GetRoot()); fMenuOptions->AddEntry("Show Stats", M_ShowStats,0,gClient->GetPicture("stats.png")); fMenuOptions->AddEntry("Show Title", M_ShowTitle,0,gClient->GetPicture("eve_text.gif")); gStyle->SetOptTitle(0); gStyle->SetOptStat(0); fMenuOptions->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)); fMenuBar->AddPopup("Options", fMenuOptions, 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.27, 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 = "Saved List"; fSavedListTab = fMainTab->AddTab(Name); fSavedList = new CXSavedList(fSavedListTab,10,10); fSavedList->SetMainWindow(this); fSavedList->SetName(Name); fSavedListTab->AddFrame(fSavedList, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 0, 4, 0, 0)); ToggleTab(IsSavedListEnabled,M_SavedList,fSavedListTab,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,this); fHist2DPlayer->SetName(Name); fHist2DPlayerTab->AddFrame(fHist2DPlayer, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 0, 4, 0, 0)); ToggleTab(IsHist2DPlayerEnabled,M_Hist2DPlayer,fHist2DPlayerTab,Name); // ------- Rad2D Player ----------- Name = "Rad2D Player"; fRad2DPlayerTab = fMainTab->AddTab(Name); fRad2DPlayer = new CXRad2DPlayer(fRad2DPlayerTab,10,10,this); fRad2DPlayer->SetName(Name); fRad2DPlayerTab->AddFrame(fRad2DPlayer, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 0, 4, 0, 0)); ToggleTab(IsRad2DPlayerEnabled,M_Rad2DPlayer,fRad2DPlayerTab,Name); // ------- RadCube Player ----------- Name = "RadCube Player"; fRadCubePlayerTab = fMainTab->AddTab(Name); fRadCubePlayer = new CXRadCubePlayer(fRadCubePlayerTab,10,10,this); fRadCubePlayer->SetMainWindow(this); fRadCubePlayer->SetName(Name); fRadCubePlayerTab->AddFrame(fRadCubePlayer, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 0, 4, 0, 0)); ToggleTab(IsRadCubePlayerEnabled,M_RadCubePlayer,fRadCubePlayerTab,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"); SetIconPixmap("Cubix.png"); SetIconName("Cubix"); MapSubwindows(); Layout(); Resize(GetDefaultSize()); MapWindow(); gSystem->ProcessEvents(); ToggleTab(IsFileListUtilityEnabled,M_FileListUtility,fFileListTab,fFileList->GetName()); fListOfSavedGates = new TList; fListOfSavedGates->SetOwner(); fListOfSavedGates->SetName("ListOfGates"); } 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()); fHist1DPlayer->NewFit(); } if((EKeySym)EventY==kKey_f && fCTRL) { fHist1DPlayer->DoFit(); } if((EKeySym)EventY==kKey_s && !fCTRL) { if(IsHist1DPlayerEnabled==false) ToggleTab(IsHist1DPlayerEnabled,M_Hist1DPlayer,fHist1DPlayerTab,fHist1DPlayer->GetName()); fMainTab->SetTab(fHist1DPlayer->GetName()); fHist1DPlayer->PeakSearchClear(); fHist1DPlayer->PeakSearch(); } if((EKeySym)EventY==kKey_c && !fCTRL) { fHist1DPlayer->ClearFits(); fHist1DPlayer->PeakSearchClear(); } 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); } if((EKeySym)EventY==kKey_r && !fCTRL && selected && (selected->InheritsFrom(CXArrowBox::Class()))) { ((CXArrowBox*)selected)->Clean(); } } /// 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==fRad2DPlayer->GetName()) ToggleTab(IsRad2DPlayerEnabled,M_Rad2DPlayer,fRad2DPlayerTab,Name); else if(Name==fRadCubePlayer->GetName()) ToggleTab(IsRadCubePlayerEnabled,M_RadCubePlayer,fRadCubePlayerTab,Name); else if(Name=="Editor") ToggleTab(IsEditorEnabled,M_Editor,fEditorTab,Name); else if(Name==fBkdSubtract->GetName()) ToggleTab(IsBkdUtilityEnabled,M_BkdUtility,fBkdToolTab,Name); else if(Name==fSavedList->GetName()) ToggleTab(IsSavedListEnabled,M_SavedList,fSavedListTab,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); } TString name = fCanvasTab->GetTabTab(tabnr)->GetText()->Data(); if(name.BeginsWith("RadCube")) { if(IsRadCubePlayerEnabled) fMainTab->SetTab(fRadCubePlayer->GetName()); else ToggleTab(IsRadCubePlayerEnabled,M_RadCubePlayer,fRadCubePlayerTab,fRadCubePlayer->GetName()); } else if(name.BeginsWith("RadGG")) { if(IsRad2DPlayerEnabled) fMainTab->SetTab(fRad2DPlayer->GetName()); else ToggleTab(IsRad2DPlayerEnabled,M_Rad2DPlayer,fRad2DPlayerTab,fRad2DPlayer->GetName()); } else if(name.BeginsWith("GxG")) { if(IsHist2DPlayerEnabled) fMainTab->SetTab(fHist2DPlayer->GetName()); else ToggleTab(IsHist2DPlayerEnabled,M_Hist2DPlayer,fHist2DPlayerTab,fHist2DPlayer->GetName()); } } 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*)"); fCanvas->SetRightMargin(0.01); fCanvas->SetBottomMargin(0.09); fCanvas->SetLeftMargin(0.083); fCanvas->SetTopMargin(0.04); 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->SetNPads(px*py); 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_SavedList: ToggleTab(IsSavedListEnabled,M_SavedList,fSavedListTab,fSavedList->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_Rad2DPlayer: ToggleTab(IsRad2DPlayerEnabled,M_Rad2DPlayer,fRad2DPlayerTab,fRad2DPlayer->GetName()); break; case M_RadCubePlayer: ToggleTab(IsRadCubePlayerEnabled,M_RadCubePlayer,fRadCubePlayerTab,fRadCubePlayer->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_ShowStats: IsStatsShown = 1-IsStatsShown; if(IsStatsShown) { fMenuOptions->CheckEntry(M_ShowStats); gStyle->SetOptStat(1000011); } else { fMenuOptions->UnCheckEntry(M_ShowStats); gStyle->SetOptStat(0); } RefreshPads(); break; case M_ShowTitle: IsTitleShown = 1-IsTitleShown; if(IsTitleShown) { fMenuOptions->CheckEntry(M_ShowTitle); gStyle->SetOptTitle(1); } else { fMenuOptions->UnCheckEntry(M_ShowTitle); gStyle->SetOptTitle(0); } RefreshPads(); 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) { // if(fMenuView->GetEntry(id)) // fMenuView->CheckEntry(id); // if(fMenuTools->GetEntry(id)) // fMenuTools->CheckEntry(id); fMainTab->AddTab(name,tab); fMainTab->SetTab(name); fMainTab->GetTabTab(name)->ShowClose(); if(tab != fEditorTab) tab->MapSubwindows(); if(fMainTab->GetNumberOfTabs()>3){ TString Name = fMainTab->GetTabTab(0)->GetText()->GetString(); 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==fRad2DPlayer->GetName()) ToggleTab(IsRad2DPlayerEnabled,M_Rad2DPlayer,fRad2DPlayerTab,Name); else if(Name==fRadCubePlayer->GetName()) ToggleTab(IsRadCubePlayerEnabled,M_RadCubePlayer,fRadCubePlayerTab,Name); else if(Name=="Editor") ToggleTab(IsEditorEnabled,M_Editor,fEditorTab,Name); else if(Name==fBkdSubtract->GetName()) ToggleTab(IsBkdUtilityEnabled,M_BkdUtility,fBkdToolTab,Name); else if(Name==fSavedList->GetName()) ToggleTab(IsSavedListEnabled,M_SavedList,fSavedListTab,Name); } fMainTab->SetTab(name); Layout(); } else { // if(fMenuView->GetEntry(id)) // fMenuView->UnCheckEntry(id); // if(fMenuTools->GetEntry(id)) // fMenuTools->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::RefreshPads() { TList *pList = fCanvas->GetListOfPrimitives(); TObjOptLink *lnk = 0; if (pList) lnk = (TObjOptLink*)pList->FirstLink(); TObject *obj; while (lnk) { obj = lnk->GetObject(); if (obj->InheritsFrom(TPad::Class())) { ((TPad*)obj)->Modified(); } lnk = (TObjOptLink*)lnk->Next(); } fCanvas->Modified(); fCanvas->Update(); } 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, bool GetFirst) { TH1 *hist = nullptr; if(pad == nullptr && fSelectedPad == nullptr) { fCanvas->cd(); fSelectedPad = fCanvas->cd(); } if(pad == nullptr) pad = fSelectedPad; TObjOptLink *lnk = nullptr; TObject *obj = nullptr; TList *pList = pad->GetListOfPrimitives(); if (pList) lnk = (TObjOptLink*)pList->FirstLink(); while (lnk) { obj = lnk->GetObject(); if (obj->InheritsFrom(TH1::Class())) { hist = dynamic_cast(obj); if(GetFirst) return hist; } lnk = (TObjOptLink*)lnk->Next(); } return hist; } void CXMainWindow::UpdateContextMenus() { /// TH1F /// 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); /// TH1D/// 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 Radware GxG","PopUpInitRadGG",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); /// TH2D /// cl = gROOT->GetClass("TH2D"); 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 Radware GxG","PopUpInitRadGG",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); /// TGraph /// cl = gROOT->GetClass("TGraph"); cl->MakeCustomMenuList(); ml = cl->GetMenuList(); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl,"Scale","GraphScale",this,"Float_t,TObject*", 1); ml->AddAt(n,3); /// TGraphErrors /// cl = gROOT->GetClass("TGraphErrors"); cl->MakeCustomMenuList(); ml = cl->GetMenuList(); n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction,cl,"Scale","GraphScale",this,"Float_t,TObject*", 1); ml->AddAt(n,3); // 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); RefreshPads(); } 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::PopUpInitRadGG(TObject *c) { TH2 *hist = static_cast(c); if(IsRad2DPlayerEnabled==false) ToggleTab(IsRad2DPlayerEnabled,M_Rad2DPlayer,fRad2DPlayerTab,fRad2DPlayer->GetName()); fMainTab->SetTab(fRad2DPlayer->GetName()); fRad2DPlayer->Init(hist); } void CXMainWindow::InitRadCubePlayer(CXRadReader *radreader) { if(IsRadCubePlayerEnabled==false) ToggleTab(IsRadCubePlayerEnabled,M_RadCubePlayer,fRadCubePlayerTab,fRadCubePlayer->GetName()); fMainTab->SetTab(fRadCubePlayer->GetName()); fRadCubePlayer->Init(radreader); } 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); RefreshPads(); } void CXMainWindow::HistScale(Float_t scaleFact, TObject *c) { TH1 *hist = static_cast(c); hist->Scale(scaleFact); RefreshPads(); } void CXMainWindow::GraphScale(Float_t scaleFact, TObject *c) { TGraph *graph = static_cast(c); for(int i=0 ; iGetN() ; i++){ graph->SetPoint(i,graph->GetX()[i],graph->GetY()[i]*scaleFact); } RefreshPads(); } void CXMainWindow::PopUpShowBackground(TObject *c) { TH1 *hist = static_cast(c); if(GetHisto()->GetName() != hist->GetName()) { fCanvas->cd(); hist->Draw("hist"); RefreshPads(); } if(IsBkdUtilityEnabled==false) ToggleTab(IsBkdUtilityEnabled,M_BkdUtility,fBkdToolTab,fBkdSubtract->GetName()); fMainTab->SetTab(fBkdSubtract->GetName()); fBkdSubtract->DoActivate(); RefreshPads(); } void CXMainWindow::AddToStoredSpectra(TObject *c) { TString Current = fMainTab->GetCurrentTab()->GetText()->GetString(); if(!(Current == fHist2DPlayer->GetName() || Current == fRadCubePlayer->GetName() || Current == fSavedList->GetName())) { if(IsSavedListEnabled==false) ToggleTab(IsSavedListEnabled,M_SavedList,fSavedListTab,fSavedList->GetName()); else fMainTab->SetTab(fSavedList->GetName()); } TObject *o = c; TObject *clone = nullptr; if(o->InheritsFrom("CXRadCubeTH1Proj")) clone = ((CXRadCubeTH1Proj*)o)->GetTotalProj(); else clone = o->Clone(); if(o->InheritsFrom(TH1::Class_Name())) ((TH1*)clone)->SetDirectory(nullptr); fSavedList->AddToStoredList(clone); } void CXMainWindow::PopUpFindPeaks(TObject *c) { TH1 *hist = static_cast(c); if(GetHisto()->GetName() != hist->GetName()) { fCanvas->cd(); hist->Draw("hist"); RefreshPads(); } 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"); RefreshPads(); } 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; } void CXMainWindow::DoDraw(TObject *obj, TString DrawOpt) { if(obj==nullptr) return; gPad = GetSelectedPad(); if(gPad==nullptr) gPad = GetCanvas()->cd(); if(gPad==nullptr) return; DrawOpt.ReplaceAll(" ",""); if(obj->InheritsFrom(TCanvas::Class())){ TCanvas *canvas_in = (TCanvas*)obj; CXCanvas *canvas_out = GetCanvas(); canvas_out->cd(); canvas_out->Clear(); Int_t idraw = 0; for(int i=0 ; iGetListOfPrimitives()->GetEntries() ; i++){ TObject *o = canvas_in->GetListOfPrimitives()->At(i); if(o->InheritsFrom(TPad::Class())) { o->DrawClone(); } else { if(idraw==0) { idraw++; if(o->InheritsFrom(TH2::Class())) o->Draw("col"); else if(o->InheritsFrom(TH1::Class())) o->Draw("hist"); else if(o->InheritsFrom(TGraph::Class())) o->Draw("APL"); else o->Draw(); } else{ if(o->InheritsFrom(TH2::Class())) o->Draw("col same"); else if(o->InheritsFrom(TH1::Class())) o->Draw("hist same"); else if(o->InheritsFrom(TGraph::Class())) o->Draw("PL"); else o->Draw("same"); } } } } else if(obj->InheritsFrom(TH1::Class())) { TH1 *hist = (TH1*)obj; hist->SetDirectory(nullptr); hist->SetStats(true); if(DrawOpt.Contains("norm")) { hist->Scale(1./((Float_t)hist->Integral(1,hist->GetNbinsX()))); DrawOpt.ReplaceAll("norm",""); } if(DrawOpt.Contains("add")){ TH1 * HistToadd = GetHisto(); if(HistToadd == nullptr) WARN_MESS << "No histogram to be added found in the current pad, ignored" << ENDL; else { Float_t Fact=1; if(DrawOpt.Contains("(") && DrawOpt.Contains(")")){ TObjArray *arr = DrawOpt.Copy().Tokenize("("); TString opt = arr->At(1)->GetName(); delete arr; arr = opt.Tokenize(")"); opt = arr->First()->GetName(); delete arr; if(opt.IsFloat()) Fact = opt.Atof(); else cout<<"could not decrypt the addition factor, 1 is used"<Add(hist,Fact); } } else if(DrawOpt.Contains("div")){ TH1 * HistToDiv = GetHisto(); if(HistToDiv == nullptr) WARN_MESS << "No histogram to be divided found in the current pad, ignored" << ENDL; else { Float_t Fact=1; if(DrawOpt.Contains("(") && DrawOpt.Contains(")")){ TObjArray *arr = DrawOpt.Copy().Tokenize("("); TString opt = arr->At(1)->GetName(); delete arr; arr = opt.Tokenize(")"); opt = arr->First()->GetName(); delete arr; if(opt.IsFloat()) Fact = opt.Atof(); else cout<<"could not decrypt the addition factor, 1 is used"<Divide(HistToDiv,hist,1,Fact); } } else if(DrawOpt.Contains("mult")){ TH1 * HistToMult = GetHisto(); if(HistToMult == nullptr) WARN_MESS << "No histogram to be multiplied found in the current pad, ignored" << ENDL; else { Float_t Fact=1; if(DrawOpt.Contains("(") && DrawOpt.Contains(")")){ TObjArray *arr = DrawOpt.Copy().Tokenize("("); TString opt = arr->At(1)->GetName(); delete arr; arr = opt.Tokenize(")"); opt = arr->First()->GetName(); delete arr; if(opt.IsFloat()) Fact = opt.Atof(); else cout<<"could not decrypt the addition factor, 1 is used"<Multiply(HistToMult,hist,1,Fact); } } else hist->Draw(DrawOpt); } else obj->Draw(DrawOpt); RefreshPads(); gPad->GetFrame()->SetBit(TObject::kCannotPick); } ClassImp(CXMainWindow)