#include "TDynamicSlice.h"
ClassImp(TDynamicSlice)
TDynamicSlice::TDynamicSlice(TH2* hist, TPad* pad, int mode):TObject()
{
gROOT->Add(this);
TList *l = gROOT->GetList();
char line[200];
char command[400];
int n = l->GetSize();
int id = -1;
for(int i=0;i<n;i++)
{
if(l->At(i)==this) { id=i; break;}
}
if(id==-1) {delete this; return;}
sprintf(command,"((TDynamicSlice*)gROOT->GetList()->At(%d))->process();",id);
if(!hist) {delete this; return;}
if(!pad) {delete this; return;}
fHist = hist;
fType = mode;
fPad = pad;
fMainFrame = new TGMainFrame(gClient->GetRoot(),10,10,kMainFrame | kVerticalFrame);
fMainFrame->SetLayoutBroken(kTRUE);
TGGroupFrame *fGroupFrame646 = new TGGroupFrame(fMainFrame,"Dynamic projection preview");
fGroupFrame646->SetLayoutBroken(kTRUE);
TRootEmbeddedCanvas *fRootEmbeddedCanvas651 = new TRootEmbeddedCanvas(0,fGroupFrame646,304,208);
Int_t wfRootEmbeddedCanvas651 = fRootEmbeddedCanvas651->GetCanvasWindowId();
fCanvas = fRootEmbeddedCanvas651->GetCanvas();
fMainFrame->AddFrame(fRootEmbeddedCanvas651, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
fRootEmbeddedCanvas651->MoveResize(8,48,304,208);
TGCheckButton *fTextButton681 = new TGCheckButton(fGroupFrame646,"Enable preview");
fGroupFrame646->AddFrame(fTextButton681, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
fTextButton681->MoveResize(16,24,200,19);
TGCheckButton *fCheckButton730 = new TGCheckButton(fGroupFrame646,"SetLogX");
fGroupFrame646->AddFrame(fCheckButton730, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
fCheckButton730->MoveResize(136,24,106,19);
TGCheckButton *fCheckButton744 = new TGCheckButton(fGroupFrame646,"SetLogY");
fGroupFrame646->AddFrame(fCheckButton744, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
fCheckButton744->MoveResize(216,24,96,19);
fGroupFrame646->SetLayoutManager(new TGVerticalLayout(fGroupFrame646));
fGroupFrame646->Resize(320,272);
fMainFrame->AddFrame(fGroupFrame646, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
fGroupFrame646->MoveResize(0,96,320,272);
TGTextButton *fTextButton770 = new TGTextButton(fMainFrame,"Ok");
fTextButton770->SetTextJustify(36);
fTextButton770->Resize(160,32);
fMainFrame->AddFrame(fTextButton770, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
fTextButton770->MoveResize(8,8,160,32);
TGTextButton *fTextButton788 = new TGTextButton(fMainFrame,"Cancel");
fTextButton788->SetTextJustify(36);
fTextButton788->Resize(160,32);
fMainFrame->AddFrame(fTextButton788, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
fTextButton788->MoveResize(8,48,160,32);
TGGroupFrame *fGroupFrame970 = new TGGroupFrame(fMainFrame,"Axis");
fGroupFrame970->SetLayoutBroken(kTRUE);
TGRadioButton *fRadioButton1048 = new TGRadioButton(fGroupFrame970,"Projection Y");
fGroupFrame970->AddFrame(fRadioButton1048, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
fRadioButton1048->MoveResize(8,40,106,19);
TGRadioButton *fTextButton983 = new TGRadioButton(fGroupFrame970,"Projection X");
fGroupFrame970->AddFrame(fTextButton983, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
fTextButton983->MoveResize(8,16,106,19);
fGroupFrame970->SetLayoutManager(new TGVerticalLayout(fGroupFrame970));
fGroupFrame970->Resize(120,72);
fMainFrame->AddFrame(fGroupFrame970, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
fGroupFrame970->MoveResize(192,8,120,72);
fMainFrame->MapSubwindows();
fMainFrame->Resize(fMainFrame->GetDefaultSize());
fMainFrame->MapWindow();
fMainFrame->Resize(328,372);
fMainFrame->SetWindowName(Form("Dynamic slice %s",hist->GetName()));
fMainFrame->SetIconName("Dynamic Slice");
fMainFrame->Connect("CloseWindow()","TDynamicSlice",this,"closeWindow()");
fTextButton681->Connect("Clicked()","TDynamicSlice",this,"switchPreview()");
fCheckButton730->Connect("Clicked()","TDynamicSlice",this,"switchLog(=0)");
fCheckButton744->Connect("Clicked()","TDynamicSlice",this,"switchLog(=1)");
fTextButton770->Connect("Clicked()","TDynamicSlice",this,"close(=1)");
fTextButton788->Connect("Clicked()","TDynamicSlice",this,"close(=0)");
fTextButton983->Connect("Clicked()","TDynamicSlice",this,"setProjection(=0)");
fRadioButton1048->Connect("Clicked()","TDynamicSlice",this,"setProjection(=1)");
fRadio[kPROJX] = fTextButton983;
fRadio[kPROJY] = fRadioButton1048;
fCheck[kPREVIEW] = fTextButton681;
fCheck[kLOGX] = fCheckButton730;
fCheck[kLOGY] = fCheckButton744;
setProjection(fType);
fPreview = false;
switchPreview();
fWidth = 1;
fCenter = 1;
fDoIt = true;
fProjection = 0;
fPad->cd();
fBox = new TBox();
fBox->SetLineColor(2);
fBox->SetFillColor(2);
fBox->SetFillStyle(3013);
fPad->AddExec("dynamic",command);
gROOT->SaveContext();
}
TDynamicSlice::~TDynamicSlice()
{
delete fBox;
fPad->Modified();
fPad->Update();
}
void TDynamicSlice::closeWindow()
{
fPad->DeleteExec("dynamic");
fMainFrame->Cleanup();
delete fMainFrame;
delete this;
}
void TDynamicSlice::close(int mode)
{
if(fProjection && mode==0) delete fProjection;
fMainFrame->SendCloseMessage();
}
void TDynamicSlice::setProjection(int mode)
{
fType = mode;
if(mode == 0)
{
fRadio[kPROJY]->SetState(kButtonUp);
fRadio[kPROJX]->SetState(kButtonDown);
}
else
{
fRadio[kPROJY]->SetState(kButtonDown);
fRadio[kPROJX]->SetState(kButtonUp);
}
}
void TDynamicSlice::switchPreview()
{
if(fPreview)
{
fCheck[kPREVIEW]->SetState(kButtonUp);
fPreview = false;
}
else
{
fCheck[kPREVIEW]->SetState(kButtonDown);
fPreview = true;
}
}
void TDynamicSlice::switchLog(int axis)
{
if(fLog[axis])
{
fCheck[kLOGX+axis]->SetState(kButtonUp);
if(axis==0) fCanvas->SetLogx(0);
else fCanvas->SetLogy(0);
}
else
{
fCheck[kLOGX+axis]->SetState(kButtonDown);
if(axis==0) fCanvas->SetLogx(1);
else fCanvas->SetLogy(1);
}
fLog[axis]=!fLog[axis];
fCanvas->Modified();
fCanvas->Update();
}
void TDynamicSlice::process()
{
int event = fPad->GetEvent();
if(event==12) fDoIt = !fDoIt;
if(!fDoIt) return;
int px = fPad->GetEventX();
int py = fPad->GetEventY();
float uxmin = fPad->GetUxmin();
float uxmax = fPad->GetUxmax();
float uymin = fPad->GetUymin();
float uymax = fPad->GetUymax();
int pxmin = fPad->XtoAbsPixel(uxmin);
int pxmax = fPad->XtoAbsPixel(uxmax);
int pymin = fPad->YtoAbsPixel(uymin);
int pymax = fPad->YtoAbsPixel(uymax);
int tmp;
if(pxmin>pxmax) { tmp = pxmax; pxmax = pxmin; pxmin = tmp;}
if(pymin>pymax) { tmp = pymax; pymax = pymin; pymin = tmp;}
if(px<pxmin || px>pxmax) return;
if(py<pymin || py>pymax) return;
int p = 0;
if(fType==0)
{
fBox->SetX1(fPad->AbsPixeltoX(pxmin));
fBox->SetX2(fPad->AbsPixeltoX(pxmax));
p = py;
if(event==1) {fEdge = py; fWidth = 0;}
if(event==21) fWidth = (fEdge-py);
}
else
{
fBox->SetY1(fPad->AbsPixeltoY(pymin));
fBox->SetY2(fPad->AbsPixeltoY(pymax));
p = px;
if(event==1) {fEdge = px; fWidth = 0;}
if(event==21) fWidth = (fEdge-px);
}
return draw(p);
}
void TDynamicSlice::draw(int p)
{
float min,max,tmp;
float amin, amax;
int bmin, bmax;
if(fType==0)
{
fBox->SetY1(fPad->AbsPixeltoY(p));
fBox->SetY2(fPad->AbsPixeltoY(p+fWidth));
min = fBox->GetY1();
max = fBox->GetY2();
amin = fBox->GetX1();
amax = fBox->GetX2();
}
else
{
fBox->SetX1(fPad->AbsPixeltoX(p));
fBox->SetX2(fPad->AbsPixeltoX(p+fWidth));
min = fBox->GetX1();
max = fBox->GetX2();
amin = fBox->GetY1();
amax = fBox->GetY2();
}
if(max<min) { tmp = max; max = min; min = tmp;}
if(amax<amin) { tmp = amax; amax = amin; amin = tmp;}
fBox->Draw();
fPad->Modified();
fPad->Update();
if(fProjection) { delete fProjection; fProjection = 0;}
if(fType==0)
{
bmin = fHist->GetYaxis()->FindBin(min);
bmax = fHist->GetYaxis()->FindBin(max);
fProjection = fHist->ProjectionX(Form("%s_px",fHist->GetName()),bmin,bmax);
}
else
{
bmin = fHist->GetXaxis()->FindBin(min);
bmax = fHist->GetXaxis()->FindBin(max);
fProjection = fHist->ProjectionY(Form("%s_py",fHist->GetName()),bmin,bmax);
}
fProjection->SetTitle("");
if(!fPreview) return;
fCanvas->cd();
fProjection->Draw();
fProjection->GetXaxis()->SetRangeUser(amin,amax);
fCanvas->Modified();
fCanvas->Update();
fPad->cd();
return;
}