Make coherent ROOTLIBS definition
[u/mrichter/AliRoot.git] / ALIFAST / AliFDisplay.cxx
CommitLineData
65a39007 1
2//////////////////////////////////////////////////////////////////////////
3// //
4// AliFDisplay //
5// //
6// Utility class to display ALICE outline, tracks, clusters, jets,.. //
7// //
8//////////////////////////////////////////////////////////////////////////
9
10#include <TROOT.h>
11#include <TButton.h>
12#include <TCanvas.h>
13#include <TView.h>
14#include <TArc.h>
15#include <TText.h>
16#include <TPaveLabel.h>
17#include <TPaveText.h>
18#include <TList.h>
19#include <TDiamond.h>
20#include <TNode.h>
21#include <TTUBE.h>
22#include <TMath.h>
23#include <X3DBuffer.h>
24
25#include "AliFDisplay.h"
26#include "AliFFruit.h"
27#include "AliFParticle.h"
28#include "AliFast.h"
29#include "AliFMCMaker.h"
30
31
32ClassImp(AliFDisplay)
33
34
35//_____________________________________________________________________________
36AliFDisplay::AliFDisplay() : AliFVirtualDisplay()
37{
2685bf00 38 fCanvas = 0;
39 fTrigPad = 0;
40 fButtons = 0;
41 fPad = 0;
42 fTubin = 0;
43 fTubout = 0;
44 fNodin = 0;
65a39007 45 fFruits = 0;
2685bf00 46 fParticle = 0;
65a39007 47}
48
49//_____________________________________________________________________________
50AliFDisplay::AliFDisplay(const char *title) : AliFVirtualDisplay()
51{
52
53 gAliFast->SetDisplay(this);
54
55 // Initialize display default parameters
56 SetPTcut();
57 SetPTcutEGMUNU();
58 SetGeometry();
59
60 // Set front view by default
61 fTheta = 0;
62 fPhi = -90;
63 fDrawAllViews = kFALSE;
64 fDrawParticles = kTRUE;
65
66 // Create display canvas
67 fCanvas = new TCanvas("Canvas", (char*)title,14,47,740,650);
68 fCanvas->SetEditable(kIsNotEditable);
69
70 // Create main display pad
71 fPad = new TPad("viewpad", "AliFast display",0.15,0,1,1);
72 fPad->Draw();
73 fPad->Modified();
74 fPad->SetFillColor(1);
75 fPad->SetBorderSize(2);
76
77 // Create user interface control pad
78 DisplayButtons();
79 fCanvas->cd();
80
81 // Create trigger view pad
82 Float_t dxtr = 0.15;
83 Float_t dytr = 0.45;
84 Float_t xt = 0.3*dxtr;
85 Float_t yt = 0.8*dytr;
86 Float_t dyt = 0.07*dytr;
87 Float_t xarc = 0.7*dxtr;
88 Float_t rarc = 0.3*dyt;
89 fTrigPad = new TPad("TrigPad", "trigger pad",0,0,dxtr,dytr);
90 fTrigPad->Range(0,0,dxtr,dytr);
91 fTrigPad->Draw();
92 fTrigPad->cd();
93 fTrigPad->SetFillColor(22);
94 fTrigPad->SetBorderSize(2);
95
96 TText *t = new TText();
97 t->SetTextFont(61);
98 t->SetTextSize(0.2);
99 t->SetTextAlign(22);
100 t->DrawText(0.5*dxtr, 0.93*dytr,"Trigger");
101 t->SetTextSize(0.14);
102 t->SetTextAlign(22);
103 t->DrawText(xt,yt, "EM1");
104 t->DrawText(xt,yt-dyt, "PH1");
105 t->DrawText(xt,yt-2*dyt,"EM2");
106 t->DrawText(xt,yt-3*dyt,"MU1");
107 t->DrawText(xt,yt-4*dyt,"MU2");
108 t->DrawText(xt,yt-5*dyt,"EMU");
109 t->DrawText(xt,yt-6*dyt,"JT1");
110 t->DrawText(xt,yt-7*dyt,"JT2");
111 t->DrawText(xt,yt-8*dyt,"JT3");
112 t->DrawText(xt,yt-9*dyt,"ALL");
113 AppendPad(); // append display object as last object to force selection
114
115 fTubin = new TTUBE("tubin","inner tube"," ", fRin, fRin+5, fZin);
116 fNodin = new TNode("nodin","ALIAS outline","tubin",0,0,0," ");
117 fNodin->SetLineColor(7);
118
119
120 // Create list to support list of fruits
121 fFruits = new TList();
122
123 // Create particle manager
124 fParticle = new AliFParticle("particle_manager");
125
126 fCanvas->cd();
127 fCanvas->Update();
128
129}
130
131
132//_____________________________________________________________________________
133AliFDisplay::~AliFDisplay()
134{
135 delete fParticle;
136 if (fFruits) fFruits->Delete();
137 delete fFruits;
138}
139
140//_____________________________________________________________________________
141void AliFDisplay::Clear(Option_t *)
142{
143// Delete graphics temporary objects
144
145 fFruits->Delete();
146
147}
148
149//_____________________________________________________________________________
150void AliFDisplay::DisplayButtons()
151{
152// Create the user interface buttons
153
154 fButtons = new TPad("buttons", "newpad",0,0.45,0.15,1);
155 fButtons->Draw();
156 fButtons->SetFillColor(38);
157 fButtons->SetBorderSize(2);
158 fButtons->cd();
159
160 Int_t butcolor = 33;
161 Float_t dbutton = 0.08;
162 Float_t y = 0.96;
163 Float_t dy = 0.014;
164 Float_t x0 = 0.05;
165 Float_t x1 = 0.95;
166
167 TButton *button;
168 char *but1 = "gAliFast->Display()->ShowNextEvent(1)";
169 button = new TButton("Next",but1,x0,y-dbutton,x1,y);
170 button->SetFillColor(38);
171 button->Draw();
172
173 y -= dbutton +dy;
174 char *but2 = "gAliFast->Display()->ShowNextEvent(-1)";
175 button = new TButton("Previous",but2,x0,y-dbutton,x1,y);
176 button->SetFillColor(38);
177 button->Draw();
178
179 y -= dbutton +dy;
180 char *but3 = "gAliFast->Display()->SetView(90,-90)";
181 button = new TButton("Top View",but3,x0,y-dbutton,x1,y);
182 button->SetFillColor(butcolor);
183 button->Draw();
184
185 y -= dbutton +dy;
186 char *but4 = "gAliFast->Display()->SetView(90,0)";
187 button = new TButton("Side View",but4,x0,y-dbutton,x1,y);
188 button->SetFillColor(butcolor);
189 button->Draw();
190
191 y -= dbutton +dy;
192 char *but5 = "gAliFast->Display()->SetView(0,-90)";
193 button = new TButton("Front View",but5,x0,y-dbutton,x1,y);
194 button->SetFillColor(butcolor);
195 button->Draw();
196
197 y -= dbutton +dy;
198 char *but6 = "gAliFast->Display()->DrawAllViews()";
199 button = new TButton("All Views",but6,x0,y-dbutton,x1,y);
200 button->SetFillColor(butcolor);
201 button->Draw();
202
203 y -= dbutton +dy;
204 char *but7 = "gAliFast->Display()->DrawViewGL()";
205 button = new TButton("OpenGL",but7,x0,y-dbutton,x1,y);
206 button->SetFillColor(38);
207 button->Draw();
208
209 y -= dbutton +dy;
210 char *but8 = "gAliFast->Display()->DrawViewX3D()";
211 button = new TButton("X3D",but8,x0,y-dbutton,x1,y);
212 button->SetFillColor(38);
213 button->Draw();
214
215 // display logo
216 TDiamond *diamond = new TDiamond(0.05,0.015,0.95,0.22);
217 diamond->SetFillColor(50);
218 diamond->SetTextAlign(22);
219 diamond->SetTextColor(5);
220 diamond->SetTextSize(0.11);
221 diamond->Draw();
222 diamond->AddText(".. ");
223 diamond->AddText("ROOT");
224 diamond->AddText("AliFAST");
225 diamond->AddText("... ");
226 diamond->AddText(" ");
227}
228
229//_____________________________________________________________________________
230
231Int_t AliFDisplay::DistancetoPrimitive(Int_t px, Int_t py)
232{
233// Compute distance from point px,py to objects in event
234
235 if (gPad == fTrigPad) {gPad->SetCursor(kCross); return 0;}
236
237 const Int_t big = 9999;
238 Int_t dist = big;
239 Float_t xmin = gPad->GetX1();
240 Float_t xmax = gPad->GetX2();
241 Float_t dx = 0.05*(xmax - xmin);
242 Float_t x = gPad->AbsPixeltoX(px);
243 if (x < xmin+dx || x > xmax-dx) return dist;
244
245 // scan list of particles
246 dist = fParticle->DistancetoPrimitive(px, py);
247 if (dist <= 0) return 0;
248
249 // scan list of fruits
250 TIter nextf(fFruits);
251 AliFFruit *fruit;
252 while((fruit=(AliFFruit*)nextf())) {
253 dist = fruit->DistancetoPrimitive(px, py);
254 if (dist < 5) {
255 gPad->SetSelected(fruit->Fruit());
256 gPad->SetCursor(kCross);
257 return 0;
258 }
259 }
260
261 // scan list of detectors (currently only one tube)
262 dist = fNodin->DistancetoPrimitive(px, py);
263 if (gPad->GetCanvas()->GetSelected() == gPad->GetView()) {
264 gPad->SetSelected(this);
265 }
266 return 0;
267}
268
269//_____________________________________________________________________________
270void AliFDisplay::Draw(Option_t *)
271{
272// Insert current event in graphics pad list
273
274 if (fDrawAllViews) {
275 DrawAllViews();
276 return;
277 }
278
279 fPad->cd();
280
281 DrawView(fTheta, fPhi);
282
283 // Display the event number and title
284 fPad->cd();
285 DrawTitle();
286}
287
288//_____________________________________________________________________________
289void AliFDisplay::DrawAllViews()
290{
291// Draw front,top,side and 30 deg views
292
293 fDrawAllViews = kTRUE;
294 fPad->cd();
295 fPad->SetFillColor(15);
296 fPad->Clear();
297 fPad->Divide(2,2);
298
299 // draw 30 deg view
300 fPad->cd(1);
301 DrawView(30, 30);
302 DrawTitle();
303
304 // draw front view
305 fPad->cd(2);
306 DrawView(0, -90);
307 DrawTitle("Front");
308
309 // draw top view
310 fPad->cd(3);
311 DrawView(90, -90);
312 DrawTitle("Top");
313
314 // draw side view
315 fPad->cd(4);
316 DrawView(90, 0);
317 DrawTitle("Side");
318
319 fPad->cd(2);
320}
321
322//_____________________________________________________________________________
323void AliFDisplay::DrawTitle(Option_t *option)
324{
325// Draw the event title
326
327 Float_t xmin = gPad->GetX1();
328 Float_t xmax = gPad->GetX2();
329 Float_t ymin = gPad->GetY1();
330 Float_t ymax = gPad->GetY2();
331 Float_t dx = xmax-xmin;
332 Float_t dy = ymax-ymin;
333 if (strlen(option) == 0) {
334 TPaveText *title = new TPaveText(xmin +0.01*dx, ymax-0.09*dy, xmin +0.5*dx, ymax-0.01*dy);
335 title->SetBit(kCanDelete);
336 title->SetFillColor(42);
337 title->Draw();
338 char ptitle[100];
339 sprintf(ptitle,"Pythia event: %d, Run:%d",gAliFast->Event(), gAliFast->Run());
340 title->AddText(ptitle);
341 sprintf(ptitle,"Pythia Mode: %s",gAliFast->MCMaker()->GetTitle());
342 title->AddText(ptitle);
343 } else {
344 TPaveLabel *label = new TPaveLabel(xmin +0.01*dx, ymax-0.07*dy, xmin +0.2*dx, ymax-0.01*dy,option);
345 label->SetBit(kCanDelete);
346 label->SetFillColor(42);
347 label->Draw();
348 }
349}
350
351//_____________________________________________________________________________
352void AliFDisplay::DrawView(Float_t theta, Float_t phi)
353{
354// Draw a view of ALIAS
355
356 gPad->SetFillColor(1);
357 // Display ALIAS outline
358 gPad->Clear();
359
360 Int_t iret;
361 TView *view = new TView(1);
362 view->SetRange(-fRin, -fRin, -fZin, fRin, fRin, fZin);
363
364 fNodin->Draw("same");
365
366 // add itself to the list
367 AppendPad();
368
369 //Loop on all makers to add their products to the pad
370 TIter next(gAliFast->Makers());
371 AliFMaker *maker;
372 while ((maker = (AliFMaker*)next())) {
373 maker->Draw();
374 }
375 view->SetView(phi, theta, 0, iret);
376}
377
378//_____________________________________________________________________________
379void AliFDisplay::DrawViewGL()
380{
381// Draw current view using OPENGL
382
383 TPad *pad = (TPad*)gPad->GetPadSave();
384 pad->cd();
385 TView *view = pad->GetView();
386 if (!view) return;
387 pad->x3d("OPENGL");
388}
389
390//_____________________________________________________________________________
391void AliFDisplay::DrawViewX3D()
392{
393// Draw current view using X3D
394
395 TPad *pad = (TPad*)gPad->GetPadSave();
396 pad->cd();
397 TView *view = pad->GetView();
398 if (!view) return;
399 pad->x3d();
400}
401
402//______________________________________________________________________________
403void AliFDisplay::ExecuteEvent(Int_t event, Int_t px, Int_t py)
404{
405//*-*-*-*-*-*-*-*-*-*-*Execute action corresponding to one event*-*-*-*
406//*-* =========================================
407
408 if (gPad->GetView()) {
409 gPad->GetView()->ExecuteRotateView(event, px, py);
410 }
411}
412
413//_____________________________________________________________________________
414void AliFDisplay::GetEvent(Int_t event)
415{
416// Read event in memory
417
418 gAliFast->GetTreeEvent(event);
419
420 Draw();
421}
422
423//_____________________________________________________________________________
424void AliFDisplay::Paint(Option_t *)
425{
426// Paint miscellaneous items
427
428}
429
430//_____________________________________________________________________________
431void AliFDisplay::PaintFruit(TObject *obj, Float_t eta, Float_t phi, Float_t
432pt, Int_t type, Option_t *option)
433{
434// Display fruit from obj
435
436 AliFFruit *fruit = new AliFFruit(obj, eta, phi, pt, type);
437 fFruits->Add(fruit);
438 fruit->Paint(option);
439}
440
441//_____________________________________________________________________________
442void AliFDisplay::PaintParticles(Option_t *option)
443{
444 if (fDrawParticles) fParticle->Paint(option);
445}
446
447//_____________________________________________________________________________
448void AliFDisplay::SetGeometry(Float_t rin)
449{
450// Set ALIAS in/out outline parameters
451
452 fRin = rin;
453 fRout = 1.2*rin;
454 fZin = 600;
455 fZout = 680;
456}
457
458//_____________________________________________________________________________
459void AliFDisplay::SetPTcut(Float_t ptcut)
460{
461 fPTcut = ptcut;
462
463 if (fDrawAllViews) {
464 fPad->cd(1); gPad->Modified();
465 fPad->cd(2); gPad->Modified();
466 fPad->cd(3); gPad->Modified();
467 fPad->cd(4); gPad->Modified();
468 fPad->cd();
469 }
470}
471
472//_____________________________________________________________________________
473void AliFDisplay::SetPTcutEGMUNU(Float_t ptcut)
474{
475 fPTcutEGMUNU = ptcut;
476
477 if (fDrawAllViews) {
478 fPad->cd(1); gPad->Modified();
479 fPad->cd(2); gPad->Modified();
480 fPad->cd(3); gPad->Modified();
481 fPad->cd(4); gPad->Modified();
482 fPad->cd();
483 }
484}
485
486//_____________________________________________________________________________
487void AliFDisplay::SetView(Float_t theta, Float_t phi)
488{
489// change viewing angles for current event
490
491 fPad->cd();
492 fDrawAllViews = kFALSE;
493 fPhi = phi;
494 fTheta = theta;
495 Int_t iret;
496
497 TView *view = gPad->GetView();
498 if (view) view->SetView(fPhi, fTheta, 0, iret);
499 else Draw();
500
501 gPad->Modified();
502}
503
504//_____________________________________________________________________________
505void AliFDisplay::ShowNextEvent(Int_t delta)
506{
507// Display (current event_number+delta)
508// delta = 1 shown next event
509// delta = -1 show previous event
510
511 if (delta) {
512 gAliFast->Clear();
513 Int_t current_event = gAliFast->Event();
514 Int_t new_event = current_event + delta;
515 gAliFast->GetTreeEvent(new_event);
516 }
517 fPad->cd();
518 Draw();
519}
520
521//______________________________________________________________________________
522void AliFDisplay::SizeFruit() const
523{
524 const Int_t npoints = 2;
525 gSize3D.numPoints += npoints;
526 gSize3D.numSegs += (npoints-1);
527 gSize3D.numPolys += 0;
528}
529
530//______________________________________________________________________________
531void AliFDisplay::SizeParticles() const
532{
533 if (fDrawParticles) fParticle->SizeParticles();
534}
535
536
537
538
539
540
541
542
543
544