// Simple macro showing capabilities of triple slider //Authors: Bertrand Bellenot, Ilka Antcheva #include #include "TGButton.h" #include "TRootEmbeddedCanvas.h" #include "TGLayout.h" #include "TH2D.h" #include "TTree.h" #include "TMath.h" #include "TCanvas.h" #include "TGTextEntry.h" #include "TGSlider.h" enum ETestCommandIdentifiers { HId1, HSId1 }; class TSliderDemo : public TGMainFrame { private: TRootEmbeddedCanvas *fCanvas1, *fCanvas2, *fCanvas3; TGLayoutHints *fLcan1, *fLcan2, *fLcan3; // Layout of Canvas TH2D *fhxy, *fhxa, *fhyb; TTree *ft; TGHorizontalFrame *fHframe0, *fHframe1; TGLayoutHints *fBly, *fBfly1; TGHSlider *fHslider1; TGTextEntry *fTeh1; TGTextBuffer *fTbh1; Double_t X,Y,A,B,XX,YY,ZZ,AA,BB; Double_t fSliderMin, fSliderMax, fSliderPich; public: TSliderDemo(); virtual ~TSliderDemo(); void CloseWindow(); void DoText(const char *text); void DoSlider(); void DrawHists(); ClassDef(TSliderDemo, 0) }; //______________________________________________________________________________ TSliderDemo::TSliderDemo() : TGMainFrame(gClient->GetRoot(), 100, 100) { char buf[32]; SetCleanup(kDeepCleanup); // Create an embedded canvas and add to the main frame, centered in x and y // and with 30 pixel margins all around fHframe0 = new TGHorizontalFrame(this, 0, 0, 0); fCanvas1 = new TRootEmbeddedCanvas("Canvas1", fHframe0, 200, 200); fCanvas2 = new TRootEmbeddedCanvas("Canvas2", fHframe0, 200, 200); fCanvas3 = new TRootEmbeddedCanvas("Canvas3", fHframe0, 200, 200); fCanvas1->GetCanvas()->SetLogz(); fCanvas2->GetCanvas()->SetLogz(); fCanvas3->GetCanvas()->SetLogz(); // 10 : outer margin of the graph area. Nobu fLcan1 = new TGLayoutHints(kLHintsTop | kLHintsLeft, 10, 10, 10, 10); fLcan2 = new TGLayoutHints(kLHintsTop | kLHintsCenterX, 10, 10, 10, 10); fLcan3 = new TGLayoutHints(kLHintsTop | kLHintsRight, 10, 10, 10, 10); fHframe0->Resize(200, 50); fHframe1 = new TGHorizontalFrame(this, 0, 0, 0); fHslider1 = new TGHSlider(fHframe1, 190, kSlider1 | kScaleDownRight, HSId1, kHorizontalFrame, GetDefaultFrameBackground()); fHslider1->Connect("PositionChanged(Int_t)", "TSliderDemo", this, "DoSlider()"); fHslider1->SetRange(0,1000); fHslider1->SetPosition(500); fHframe1->Resize(200, 25); fSliderMin = -3000.; fSliderMax = 3000.; fSliderPich = (fSliderMax - fSliderMin)/1000; fTeh1 = new TGTextEntry(fHframe1, fTbh1 = new TGTextBuffer(5), HId1); fTeh1->SetToolTipText("Pointer Position Value"); sprintf(buf, "%.3f", fSliderPich*fHslider1->GetPosition()+fSliderMin); fTbh1->AddText(0, buf); fTeh1->Connect("TextChanged(char*)", "TSliderDemo", this, "DoText(char*)"); //--- layout for buttons: top align, equally expand horizontally fBly = new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5); //--- layout for the frame: place at bottom, right aligned fBfly1 = new TGLayoutHints(kLHintsTop | kLHintsRight, 5, 5, 5, 5); fHframe0->AddFrame(fCanvas1, fLcan1); // AddFrame( object, layout). Nobu fHframe0->AddFrame(fCanvas2, fLcan2); // AddFrame( object, layout). Nobu fHframe0->AddFrame(fCanvas3, fLcan3); // AddFrame( object, layout). Nobu fHframe1->AddFrame(fHslider1, fBly); fHframe1->AddFrame(fTeh1, fBfly1); AddFrame(fHframe0, fBly); AddFrame(fHframe1, fBly); // Set main frame name, map sub windows (buttons), initialize layout // algorithm via Resize() and map main frame SetWindowName("Slider Demo"); MapSubwindows(); Resize(GetDefaultSize()); MapWindow(); ft = new TTree("optics","vector test tree"); ft->ReadFile("29ne_optics_output.txt","X/D:Y/D:A/D:B/D"); ft->SetBranchAddress("X", &X); ft->SetBranchAddress("Y", &Y); ft->SetBranchAddress("A", &A); ft->SetBranchAddress("B", &B); fhxy = new TH2D("hxy", "X vs Y", 100, -50., 50., 100, -50., 50.); fhxa = new TH2D("hxa", "X vs A", 100, -50., 50., 100, -50., 50.); fhyb = new TH2D("hyb", "Y vs B", 100, -50., 50., 100, -50., 50.); DrawHists(); } //______________________________________________________________________________ TSliderDemo::~TSliderDemo() { // Clean up Cleanup(); } //______________________________________________________________________________ void TSliderDemo::CloseWindow() { // Called when window is closed via the window manager. delete this; } //______________________________________________________________________________ void TSliderDemo::DoText(const char * /*text*/) { // Handle text entry widgets. TGTextEntry *te = (TGTextEntry *) gTQSender; Int_t id = te->WidgetId(); switch (id) { case HId1: fHslider1->SetPosition((int)((atof(fTbh1->GetString())-fSliderMin)/fSliderPich)); break; default: break; } DrawHists(); } //______________________________________________________________________________ void TSliderDemo::DoSlider() { // Handle slider widgets. char buf[32]; sprintf(buf, "%.3f", fSliderPich*fHslider1->GetPosition()+fSliderMin); fTbh1->Clear(); fTbh1->AddText(0, buf); fTeh1->SetCursorPosition(fTeh1->GetCursorPosition()); fTeh1->Deselect(); gClient->NeedRedraw(fTeh1); DrawHists(); } //______________________________________________________________________________ void TSliderDemo::DrawHists() { ZZ = fSliderPich*fHslider1->GetPosition()+fSliderMin; fhxy->Reset(); fhxa->Reset(); fhyb->Reset(); for (unsigned int i=0; i < ft->GetEntries();i++) { ft->GetEntry(i); XX = X + tan(A/1000.)*ZZ; YY = Y + tan(B/1000.)*ZZ; AA = A; BB = B; fhxy->Fill(XX,YY); fhxa->Fill(XX,AA); fhyb->Fill(YY,BB); } fCanvas1->GetCanvas()->cd(); fhxy->Draw("colz"); fCanvas2->GetCanvas()->cd(); fhxa->Draw("colz"); fCanvas3->GetCanvas()->cd(); fhyb->Draw("colz"); fCanvas1->GetCanvas()->Modified(); fCanvas1->GetCanvas()->Update(); fCanvas2->GetCanvas()->Modified(); fCanvas2->GetCanvas()->Update(); fCanvas3->GetCanvas()->Modified(); fCanvas3->GetCanvas()->Update(); } void SliderDemo() { new TSliderDemo(); }