Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
DynamicSlice.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_hist
3 /// \notebook -js
4 /// Show the slice of a TH2 following the mouse position.
5 ///
6 /// \macro_image
7 /// \macro_code
8 ///
9 /// \author Rene Brun
10 
11 
12 void DynamicSlice()
13 {
14  // Create a new canvas.
15  TCanvas* c1 = new TCanvas("c1","Dynamic Slice Example",10,10,700,500);
16 
17  //create a 2-d histogram, fill and draw it
18  TH2F *hpxpy = new TH2F("hpxpy","py vs px",40,-4,4,40,-4,4);
19  hpxpy->SetStats(0);
20  Double_t px,py;
21  for (Int_t i = 0; i < 50000; i++) {
22  gRandom->Rannor(px,py);
23  hpxpy->Fill(px,py);
24  }
25  hpxpy->Draw("col");
26 
27  //Add a TExec object to the canvas
28  c1->AddExec("dynamic","DynamicExec()");
29 }
30 
31 void DynamicExec()
32 {
33  // Example of function called when a mouse event occurs in a pad.
34  // When moving the mouse in the canvas, a second canvas shows the
35  // projection along X of the bin corresponding to the Y position
36  // of the mouse. The resulting histogram is fitted with a gaussian.
37  // A "dynamic" line shows the current bin position in Y.
38  // This more elaborated example can be used as a starting point
39  // to develop more powerful interactive applications exploiting Cling
40  // as a development engine.
41 
42  TObject *select = gPad->GetSelected();
43  if(!select) return;
44  if (!select->InheritsFrom(TH2::Class())) {gPad->SetUniqueID(0); return;}
45  TH2 *h = (TH2*)select;
46  gPad->GetCanvas()->FeedbackMode(kTRUE);
47 
48  //erase old position and draw a line at current position
49  int pyold = gPad->GetUniqueID();
50  int px = gPad->GetEventX();
51  int py = gPad->GetEventY();
52  float uxmin = gPad->GetUxmin();
53  float uxmax = gPad->GetUxmax();
54  int pxmin = gPad->XtoAbsPixel(uxmin);
55  int pxmax = gPad->XtoAbsPixel(uxmax);
56  if(pyold) gVirtualX->DrawLine(pxmin,pyold,pxmax,pyold);
57  gVirtualX->DrawLine(pxmin,py,pxmax,py);
58  gPad->SetUniqueID(py);
59  Float_t upy = gPad->AbsPixeltoY(py);
60  Float_t y = gPad->PadtoY(upy);
61 
62  //create or set the new canvas c2
63  TVirtualPad *padsav = gPad;
64  TCanvas *c2 = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("c2");
65  if(c2) delete c2->GetPrimitive("Projection");
66  else c2 = new TCanvas("c2","Projection Canvas",710,10,700,500);
67  c2->SetGrid();
68  c2->cd();
69 
70  //draw slice corresponding to mouse position
71  Int_t biny = h->GetYaxis()->FindBin(y);
72  TH1D *hp = h->ProjectionX("",biny,biny);
73  hp->SetFillColor(38);
74  char title[80];
75  sprintf(title,"Projection of biny=%d",biny);
76  hp->SetName("Projection");
77  hp->SetTitle(title);
78  hp->Fit("gaus","ql");
79  hp->GetFunction("gaus")->SetLineColor(kRed);
80  hp->GetFunction("gaus")->SetLineWidth(6);
81  c2->Update();
82  padsav->cd();
83 }