#include "CXHist2DPlayer.h" #include #include #include #include #include "TGButton.h" #include "TGTextEntry.h" #include "TFile.h" #include "TGLabel.h" #include "TROOT.h" #include "TFrame.h" #include "TGListBox.h" #include "TError.h" #include "TObjArray.h" #include "TGComboBox.h" #include "CXMainWindow.h" #include "CXTH1Proj.h" #include "CXGateBox.h" #include "CXSavedList.h" using namespace std; CXHist2DPlayer::CXHist2DPlayer(const TGCompositeFrame *MotherFrame, UInt_t w, UInt_t h, CXMainWindow *window) : TGVerticalFrame(MotherFrame, w, h, kFixedWidth) { fMainWindow = window; /// GxG TGGroupFrame *fGroupFrame = new TGGroupFrame(MotherFrame, "Gamma Gamma utility", kVerticalFrame); fGroupFrame->SetTextColor(CXred); fGroupFrame->SetTitlePos(TGGroupFrame::kLeft); // right aligned AddFrame(fGroupFrame, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 0, 0, 0, 0)); TGGroupFrame *fSubGroupFrame = new TGGroupFrame(fGroupFrame, "Projections", kVerticalFrame); fSubGroupFrame->SetTextColor(CXblue); fSubGroupFrame->SetTitlePos(TGGroupFrame::kLeft); // right aligned fGroupFrame->AddFrame(fSubGroupFrame, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, -10, -10, 0, 0)); TGCompositeFrame *fHorizontalFrame = new TGCompositeFrame(fSubGroupFrame, 60, 20, kHorizontalFrame); fHorizontalFrame->AddFrame(new TGLabel(fHorizontalFrame, "Projection axis: "), new TGLayoutHints(kLHintsCenterY | kLHintsLeft,5,10,0,0)); fProjectionAxis = new TGComboBox(fHorizontalFrame); fHorizontalFrame->AddFrame(fProjectionAxis,new TGLayoutHints(kLHintsCenterY | kLHintsLeft | kLHintsExpandX | kLHintsExpandY ,1,3,0,0)); fProjectionAxis->AddEntry("X",0); fProjectionAxis->AddEntry("Y",1); fProjectionAxis->Select(0); fProjectionAxis->Connect("Selected(Int_t)", "CXHist2DPlayer", this, "UpdateProjection()"); fSubGroupFrame->AddFrame(fHorizontalFrame,new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,-10,-10,5,5)); fHorizontalFrame = new TGCompositeFrame(fSubGroupFrame, 60, 20, kHorizontalFrame); TGTextButton *GateButton = new TGTextButton(fHorizontalFrame, "Gate"); GateButton->SetTextColor(CXred); GateButton->Connect("Clicked()", "CXHist2DPlayer", this, "AddGate()"); fHorizontalFrame->AddFrame(GateButton,new TGLayoutHints(kLHintsCenterY | kLHintsExpandX,2,2,0,0)); TGTextButton *BackgroundButton = new TGTextButton(fHorizontalFrame, "Backgd"); BackgroundButton->SetTextColor(CXblue); BackgroundButton->Connect("Clicked()", "CXHist2DPlayer", this, "AddBackgd()"); fHorizontalFrame->AddFrame(BackgroundButton,new TGLayoutHints(kLHintsCenterY | kLHintsExpandX,2,2,0,0)); TGTextButton *ClearButton = new TGTextButton(fHorizontalFrame, "Clear"); ClearButton->SetTextColor(CXgreen); ClearButton->Connect("Clicked()", "CXHist2DPlayer", this, "ClearGates()"); fHorizontalFrame->AddFrame(ClearButton,new TGLayoutHints(kLHintsCenterY | kLHintsExpandX,2,2,0,0)); TGTextButton *LastGateButton = new TGTextButton(fHorizontalFrame, "Last"); LastGateButton->Connect("Clicked()", "CXHist2DPlayer", this, "ApplyLastGate()"); fHorizontalFrame->AddFrame(LastGateButton,new TGLayoutHints(kLHintsCenterY | kLHintsExpandX,2,2,0,0)); fSubGroupFrame->AddFrame(fHorizontalFrame,new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,-10,-10,5,0)); fHorizontalFrame = new TGCompositeFrame(fSubGroupFrame, 60, 20, kHorizontalFrame); TGTextButton *ProjectButton = new TGTextButton(fHorizontalFrame, "Project"); ProjectButton->Connect("Clicked()", "CXHist2DPlayer", this, "Project()"); fHorizontalFrame->AddFrame(ProjectButton,new TGLayoutHints(kLHintsCenterY | kLHintsExpandX,5,10,0,0)); fFixRange = new TGCheckButton(fHorizontalFrame, "Fix Range", 0); fFixRange->SetState(kButtonUp); fHorizontalFrame->AddFrame(fFixRange,new TGLayoutHints(kLHintsLeft | kLHintsCenterY ,5,10,0,0)); fSubGroupFrame->AddFrame(fHorizontalFrame,new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,-10,-10,5,0)); fSubGroupFrame = new TGGroupFrame(MotherFrame, "Stored spectra", kVerticalFrame); fSubGroupFrame->SetTextColor(CXblue); fSubGroupFrame->SetTitlePos(TGGroupFrame::kLeft); // right aligned AddFrame(fSubGroupFrame, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY | kLHintsExpandX, 3, 3, 0, 0)); fHorizontalFrame = new TGCompositeFrame(fSubGroupFrame, 60, 20, kHorizontalFrame); fHorizontalFrame->AddFrame(new TGLabel(fHorizontalFrame, "Draw Options:"),new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 0, 5, 0, 0)); fDrawOpt = new TGTextEntry(fHorizontalFrame, "hist"); fDrawOpt->SetToolTipText("hist, same, norm, add, add(fact)"); fHorizontalFrame->AddFrame(fDrawOpt,new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsCenterY ,0,0,0,0)); fSubGroupFrame->AddFrame(fHorizontalFrame,new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,-10,-10,5,5)); fStoredSpectraBox = new TGListBox(fSubGroupFrame); fSubGroupFrame->AddFrame(fStoredSpectraBox, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,-10,-10,0,0)); fStoredSpectraBox->Connect("DoubleClicked(Int_t)", "CXHist2DPlayer", this, "UpdateDrawOpt()"); fStoredSpectraBox->Connect("DoubleClicked(Int_t)", "CXSavedList", fMainWindow->GetSaveList(), "DoubleClicked(Int_t)"); fHorizontalFrame = new TGCompositeFrame(fSubGroupFrame, 60, 20, kHorizontalFrame); TGTextButton *Button = new TGTextButton(fHorizontalFrame, "Remove"); Button->Connect("Clicked()", "CXSavedList", fMainWindow->GetSaveList(), "RemoveSelectedEntry()"); fHorizontalFrame->AddFrame(Button,new TGLayoutHints(kLHintsCenterY | kLHintsExpandX,5,10,0,0)); Button = new TGTextButton(fHorizontalFrame, "Clear"); Button->Connect("Clicked()", "CXSavedList", fMainWindow->GetSaveList(), "ClearStoredList()"); fHorizontalFrame->AddFrame(Button,new TGLayoutHints(kLHintsCenterY | kLHintsExpandX,5,10,0,0)); Button = new TGTextButton(fHorizontalFrame, "Save"); Button->Connect("Clicked()", "CXSavedList", fMainWindow->GetSaveList(), "SaveStoredList()"); fHorizontalFrame->AddFrame(Button,new TGLayoutHints(kLHintsCenterY | kLHintsExpandX,5,10,0,0)); fSubGroupFrame->AddFrame(fHorizontalFrame,new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,-10,-10,5,0)); fListOfStoredSpectra = fMainWindow->GetSaveList()->GetListOfStoredSpectra(); fMainWindow->GetSaveList()->AddListBox(fStoredSpectraBox); } CXHist2DPlayer::~CXHist2DPlayer(){ } CXTH1Proj *CXHist2DPlayer::GetProj(){ if(((TString)fMainWindow->GetCanvas()->GetName()).BeginsWith("GxG")){ fMainWindow->SetSelectedPad(fMainWindow->GetCanvas()->GetPad(1)); fMainWindow->GetCanvas()->SetSelectedPad((TPad*)fMainWindow->GetCanvas()->GetPad(1)); fMainWindow->GetCanvas()->SetClickSelectedPad((TPad*)fMainWindow->GetCanvas()->GetPad(1)); gPad = fMainWindow->GetCanvas()->GetSelectedPad(); } TH1 *hist = fMainWindow->GetHisto(); if(hist && hist->InheritsFrom("CXTH1Proj")){ return dynamic_cast(hist); } else{ cout<<"No Projection for GxG found in the current pad"<Project(fFixRange->GetState()); TList *gates = fCurrentProj->GetGatesList(); fMainWindow->GetSavedGatesList()->Clear(); for(int i=0 ; iGetEntries() ; i++){ fMainWindow->GetSavedGatesList()->Add(gates->At(i)->Clone()); } } } void CXHist2DPlayer::ApplyLastGate(){ fCurrentProj = GetProj(); ClearGates(); if(fCurrentProj){ TList *gates = fCurrentProj->GetGatesList(); gates->Clear(); for(int i=0 ; iGetSavedGatesList()->GetEntries() ; i++){ CXGateBox *box = (CXGateBox*)fMainWindow->GetSavedGatesList()->At(i)->Clone(); box->SetPad(fCurrentProj->fCurrentPad); gates->Add(box); box->Draw(); } fCurrentProj->UpdateGates(); } } void CXHist2DPlayer::AddBackgd(){ fCurrentProj = GetProj(); if(fCurrentProj) fCurrentProj->AddBackgd(); } void CXHist2DPlayer::AddGate(){ fCurrentProj = GetProj(); if(fCurrentProj) fCurrentProj->AddGate(); } void CXHist2DPlayer::ClearGates(){ fCurrentProj = GetProj(); if(fCurrentProj) fCurrentProj->ClearGates(); } void CXHist2DPlayer::SetMainWindow(CXMainWindow *w) { fMainWindow = w; } void CXHist2DPlayer::UpdateProjection() { if(fAxisProj == fProjectionAxis->GetSelected()) return; if(fProjectionAxis->GetSelected()==0) fAxisProj = 0; else fAxisProj = 1; GetProj()->UpdateProjection(fAxisProj); Project(); } void CXHist2DPlayer::InitGG(TH2 *hist_in) { TH2 *hist; TH1D *TotalProj = nullptr; if(hist_in == nullptr) hist = dynamic_cast(fMainWindow->GetHisto()); else hist = hist_in; if(hist == nullptr) { cout<<"No 2D histogram found in the current pad, ignored"<ProjectionX(Form("%s_2DTotProjX",hist->GetName())); TotalProj->SetName(Form("%s_TotProjX",hist->GetName())); TotalProj->SetTitle(Form("%s TotProjX",hist->GetTitle())); } else if(fAxisProj==1){ TotalProj = hist->ProjectionY(Form("%s_2DTotProjY",hist->GetName())); TotalProj->SetName(Form("%s_TotProjY",hist->GetName())); TotalProj->SetTitle(Form("%s TotProjY",hist->GetTitle())); } else { ERR_MESS << "Unkown projection axis... " << ENDL; return; } CXTH1Proj *NewProj = new CXTH1Proj(*TotalProj); NewProj->SetMainWindow(fMainWindow); NewProj->SetPlayer(this); NewProj->SetTH2(hist); fMainWindow->NewTab(1,2,"GxG"); TVirtualPad *pad = fMainWindow->GetCanvas()->cd(1); NewProj->Draw("hist"); NewProj->SetCurrentPad(dynamic_cast(pad)); pad->Update(); pad->SetBit(TPad::kCannotMove); pad->GetFrame()->SetBit(TObject::kCannotPick); pad = fMainWindow->GetCanvas()->GetPad(2); NewProj->SetProjPad(dynamic_cast(pad)); gROOT->SetSelectedPad(fMainWindow->GetCanvas()->GetPad(1)); } void CXHist2DPlayer::UpdateDrawOpt() { fMainWindow->GetSaveList()->SetListDrawOption(fDrawOpt->GetText()); } ClassImp(CXHist2DPlayer)