Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
quadset.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_eve
3 /// Demonstates usage of 2D digit class TEveQuadSet.
4 ///
5 /// \image html eve_quadset.png
6 /// \macro_code
7 ///
8 /// \author Matevz Tadel
9 
10 void quadset_callback(TEveDigitSet* ds, Int_t idx, TObject* obj);
11 TString quadset_tooltip_callback(TEveDigitSet* ds, Int_t idx);
12 void quadset_set_callback(TEveDigitSet* ds);
13 
14 //------------------------------------------------------------------------------
15 
16 TEveQuadSet* quadset(Float_t x=0, Float_t y=0, Float_t z=0,
17  Int_t num=100, Bool_t registerSet=kTRUE)
18 {
19  TEveManager::Create();
20 
21  TRandom r(0);
22 
23  TEveRGBAPalette *pal = new TEveRGBAPalette(0, 130);
24  TEveFrameBox *box = new TEveFrameBox();
25  box->SetAAQuadXY(-10, -10, 0, 20, 20);
26  box->SetFrameColor(kGray);
27 
28  TEveQuadSet* q = new TEveQuadSet("RectangleXY");
29  q->SetOwnIds(kTRUE);
30  q->SetPalette(pal);
31  q->SetFrame(box);
32  q->Reset(TEveQuadSet::kQT_RectangleXY, kFALSE, 32);
33  for (Int_t i=0; i<num; ++i)
34  {
35  q->AddQuad(r.Uniform(-10, 9), r.Uniform(-10, 9), 0,
36  r.Uniform(0.2, 1), r.Uniform(0.2, 1));
37  q->QuadValue(r.Uniform(0, 130));
38  q->QuadId(new TNamed(Form("QuadIdx %d", i),
39  "TNamed assigned to a quad as an indentifier."));
40  }
41  q->RefitPlex();
42 
43  TEveTrans& t = q->RefMainTrans();
44  t.RotateLF(1, 3, 0.5*TMath::Pi());
45  t.SetPos(x, y, z);
46 
47  TGLViewer* v = gEve->GetDefaultGLViewer();
48  v->SetCurrentCamera(TGLViewer::kCameraOrthoZOY);
49  TGLCameraOverlay* co = v->GetCameraOverlay();
50  co->SetShowOrthographic(kTRUE);
51  co->SetOrthographicMode(TGLCameraOverlay::kGridFront);
52 
53  // Uncomment these two lines to get internal highlight / selection.
54  // q->SetPickable(1);
55  // q->SetAlwaysSecSelect(1);
56 
57  TEveRGBAPaletteOverlay *po = new TEveRGBAPaletteOverlay(pal, 0.55, 0.1, 0.4, 0.05);
58  v = gEve->GetDefaultGLViewer();
59  v->AddOverlayElement(po);
60 
61  // To set user-interface (GUI + overlay) to display real values
62  // mapped with a linear function: r = 0.1 * i + 0;
63  // pal->SetUIDoubleRep(kTRUE, 0.1, 0);
64 
65  if (registerSet)
66  {
67  gEve->AddElement(q);
68  gEve->Redraw3D(kTRUE);
69  }
70 
71  Info("quadset", "use alt-left-mouse to select individual digits.");
72 
73  return q;
74 }
75 
76 TEveQuadSet* quadset_emc(Float_t x=0, Float_t y=0, Float_t z=0, Int_t num=100)
77 {
78  TEveManager::Create();
79 
80  TRandom r(0);
81 
82  TEveQuadSet* q = new TEveQuadSet("EMC Supermodule");
83  q->SetOwnIds(kTRUE);
84  q->Reset(TEveQuadSet::kQT_RectangleXZFixedDimY, kFALSE, 32);
85  q->SetDefWidth(8);
86  q->SetDefHeight(8);
87 
88  for (Int_t i=0; i<num; ++i)
89  {
90  q->AddQuad(r.Uniform(-100, 100), r.Uniform(-100, 100));
91  q->QuadValue(r.Uniform(0, 130));
92  q->QuadId(new TNamed(Form("Cell %d", i), "Dong!"));
93  }
94  q->RefitPlex();
95 
96  TEveTrans& t = q->RefMainTrans();
97  t.SetPos(x, y, z);
98 
99  gEve->AddElement(q);
100  gEve->Redraw3D();
101 
102  return q;
103 }
104 
105 TEveQuadSet* quadset_circ()
106 {
107  TEveManager::Create();
108 
109  TRandom rnd(0);
110 
111  Float_t R = 10, dW = 1, dH = .5;
112 
113  TEveFrameBox *box = new TEveFrameBox();
114  {
115  Float_t frame[3*36];
116  Float_t *p = frame;
117  for (Int_t i = 0; i < 36; ++i, p += 3) {
118  p[0] = 11 * TMath::Cos(TMath::TwoPi()*i/36);
119  p[1] = 11 * TMath::Sin(TMath::TwoPi()*i/36);
120  p[2] = 0;
121  }
122  box->SetQuadByPoints(frame, 36);
123  }
124  box->SetFrameColor(kGray);
125 
126  TEveQuadSet* q = new TEveQuadSet("Pepe");
127  q->SetFrame(box);
128  q->Reset(TEveQuadSet::kQT_HexagonXY, kFALSE, 32);
129 
130  for (Float_t r = R; r > 2; r *= 0.8)
131  {
132  Int_t maxI = 2.0*TMath::Pi()*r / 2;
133  for (Int_t i = 0; i < maxI; ++i)
134  {
135  Float_t x = r * TMath::Cos(TMath::TwoPi()*i/maxI);
136  Float_t y = r * TMath::Sin(TMath::TwoPi()*i/maxI);
137  q->AddHexagon(x, y, rnd.Uniform(-1, 1), rnd.Uniform(0.2, 1));
138  q->QuadValue(rnd.Uniform(0, 130));
139  }
140  }
141  q->RefitPlex();
142 
143  TEveTrans& t = q->RefMainTrans();
144  t.RotateLF(1, 3, 0.5*TMath::Pi());
145 
146  gEve->AddElement(q);
147  gEve->Redraw3D();
148 
149  return q;
150 }
151 
152 TEveQuadSet* quadset_hex(Float_t x=0, Float_t y=0, Float_t z=0,
153  Int_t num=100, Bool_t registerSet=kTRUE)
154 {
155  TEveManager::Create();
156 
157  TRandom r(0);
158 
159  {
160  TEveQuadSet* q = new TEveQuadSet("HexagonXY");
161  q->Reset(TEveQuadSet::kQT_HexagonXY, kFALSE, 32);
162  for (Int_t i=0; i<num; ++i)
163  {
164  q->AddHexagon(r.Uniform(-10, 10),
165  r.Uniform(-10, 10),
166  r.Uniform(-10, 10),
167  r.Uniform(0.2, 1));
168  q->QuadValue(r.Uniform(0, 120));
169  }
170  q->RefitPlex();
171 
172  TEveTrans& t = q->RefMainTrans();
173  t.SetPos(x, y, z);
174 
175  if (registerSet)
176  {
177  gEve->AddElement(q);
178  gEve->Redraw3D();
179  }
180  }
181 
182  {
183  TEveQuadSet* q = new TEveQuadSet("HexagonYX");
184  q->Reset(TEveQuadSet::kQT_HexagonYX, kFALSE, 32);
185  for (Int_t i=0; i<num; ++i)
186  {
187  q->AddHexagon(r.Uniform(-10, 10),
188  r.Uniform(-10, 10),
189  r.Uniform(-10, 10),
190  r.Uniform(0.2, 1));
191  q->QuadValue(r.Uniform(0, 120));
192  }
193  q->RefitPlex();
194 
195  TEveTrans& t = q->RefMainTrans();
196  t.SetPos(x, y, z);
197 
198  if (registerSet)
199  {
200  gEve->AddElement(q);
201  gEve->Redraw3D();
202  }
203 
204  return q;
205  }
206 }
207 
208 TEveQuadSet* quadset_hexid(Float_t x=0, Float_t y=0, Float_t z=0,
209  Int_t num=100, Bool_t registerSet=kTRUE)
210 {
211  TEveManager::Create();
212 
213  TRandom r(0);
214 
215  TEveQuadSet* q = new TEveQuadSet("HexagonXY");
216 
217  {
218 
219  q->SetOwnIds(kTRUE);
220  q->Reset(TEveQuadSet::kQT_HexagonXY, kFALSE, 32);
221  for (Int_t i=0; i<num; ++i)
222  {
223  q->AddHexagon(r.Uniform(-10, 10),
224  r.Uniform(-10, 10),
225  r.Uniform(-10, 10),
226  r.Uniform(0.2, 1));
227  q->QuadValue(r.Uniform(0, 120));
228  q->QuadId(new TNamed(Form("Quad with idx=%d", i),
229  "This title is not confusing."));
230  }
231  q->RefitPlex();
232 
233  TEveTrans& t = q->RefMainTrans();
234  t.SetPos(x, y, z);
235 
236  if (registerSet)
237  {
238  gEve->AddElement(q);
239  gEve->Redraw3D();
240  }
241  }
242 
243  quadset_set_callback(q);
244 
245  // With the following you get per digit highlight with tooltip.
246  //q->SetPickable(1);
247  //q->SetAlwaysSecSelect(1);
248  // Otherwise you need to Alt - left click to get info printout.
249 
250  return q;
251 }
252 
253 void quadset_hierarchy(Int_t n=4)
254 {
255  TEveManager::Create();
256 
257 
258  TEveRGBAPalette* pal = new TEveRGBAPalette(20, 100);
259  pal->SetLimits(0, 120);
260 
261  TEveFrameBox* box = new TEveFrameBox();
262  box->SetAABox(-10, -10, -10, 20, 20, 20);
263  box->SetFrameColor(33);
264 
265  TEveElementList* l = new TEveElementList("Parent/Dir");
266  l->SetTitle("Tooltip");
267  // l->SetMainColor(3);
268  gEve->AddElement(l);
269 
270  for (Int_t i=0; i<n; ++i)
271  {
272  TEveQuadSet* qs = quadset_hexid(0, 0, 50*i, 50, kFALSE);
273  qs->SetPalette(pal);
274  qs->SetFrame(box);
275  l->AddElement(qs);
276  }
277 
278  gEve->Redraw3D();
279 }
280 
281 //------------------------------------------------------------------------------
282 
283 void quadset_callback(TEveDigitSet* ds, Int_t idx, TObject* obj)
284 {
285  printf("dump_digit_set_hit - 0x%lx, id=%d, obj=0x%lx\n",
286  (ULong_t) ds, idx, (ULong_t) obj);
287 }
288 
289 TString quadset_tooltip_callback(TEveDigitSet* ds, Int_t idx)
290 {
291  // This gets called for tooltip if the following is set:
292  // q->SetPickable(1);
293  // q->SetAlwaysSecSelect(1);
294 
295  return TString::Format("callback tooltip for '%s' - 0x%lx, id=%d\n",
296  ds->GetElementName(), (ULong_t) ds, idx);
297 }
298 
299 void quadset_set_callback(TEveDigitSet* ds)
300 {
301  ds->SetCallbackFoo(quadset_callback);
302  ds->SetTooltipCBFoo(quadset_tooltip_callback);
303 }