]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliDisplay.cxx
Bugfix; Need Init(slice,patch)
[u/mrichter/AliRoot.git] / STEER / AliDisplay.cxx
CommitLineData
4c039060 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/*
17$Log$
2685bf00 18Revision 1.16 2001/07/25 15:23:50 hristov
19Changes needed to run with Root 3.01 (R.Brun)
20
86a9484d 21Revision 1.15 2001/05/16 14:57:22 alibrary
22New files for folders and Stack
23
9e1a0ddb 24Revision 1.14 2001/01/26 19:58:48 hristov
25Major upgrade of AliRoot code
26
2ab0c725 27Revision 1.13 2000/12/21 15:30:18 fca
28Correcting coding convention violations
29
b23a502f 30Revision 1.12 2000/12/12 13:18:59 hristov
31Protection against FPE
32
33d37c81 33Revision 1.11 2000/11/30 07:12:48 alibrary
34Introducing new Rndm and QA classes
35
65fb704d 36Revision 1.10 2000/10/02 21:28:14 fca
37Removal of useless dependecies via forward declarations
38
94de3818 39Revision 1.9 2000/07/13 16:19:09 fca
40Mainly coding conventions + some small bug fixes
41
ef42d733 42Revision 1.8 2000/07/11 18:24:59 fca
43Coding convention corrections + few minor bug fixes
44
aee8290b 45Revision 1.7 1999/11/10 07:37:06 fca
46Pads do not inherit editability from canvas any more
47
38b32e9f 48Revision 1.6 1999/11/09 07:38:52 fca
49Changes for compatibility with version 2.23 of ROOT
50
084c1b4a 51Revision 1.5 1999/09/29 09:24:29 fca
52Introduction of the Copyright and cvs Log
53
4c039060 54*/
55
fe4da5cc 56
57//////////////////////////////////////////////////////////////////////////
58// //
59// AliDisplay //
60// //
61// Utility class to display ALICE outline, tracks, hits,.. //
62// //
63//////////////////////////////////////////////////////////////////////////
64
fe4da5cc 65#include <TTree.h>
66#include <TButton.h>
67#include <TCanvas.h>
68#include <TView.h>
fe4da5cc 69#include <TPaveLabel.h>
70#include <TPaveText.h>
fe4da5cc 71#include <TDiamond.h>
fe4da5cc 72#include <TArc.h>
fe4da5cc 73#include <TSlider.h>
74#include <TSliderBox.h>
75#include <TGaxis.h>
084c1b4a 76#include <TVirtualX.h>
fe4da5cc 77#include <TMath.h>
fe4da5cc 78
79#include "AliRun.h"
80#include "AliDetector.h"
81#include "AliDisplay.h"
82#include "AliPoints.h"
1578254f 83#include "TParticle.h"
94de3818 84#include "TGeometry.h"
9e1a0ddb 85#include "AliHeader.h"
fe4da5cc 86
aee8290b 87static const Float_t kptcutmax = 2;
88static const Float_t ketacutmax = 1.5;
fe4da5cc 89
90ClassImp(AliDisplay)
91
92
93//_____________________________________________________________________________
94AliDisplay::AliDisplay()
95{
aee8290b 96 //
97 // Default constructor
98 //
99 fCanvas = 0;
2685bf00 100 fTrigPad = 0;
101 fCutPad = 0;
102 fEtaPad = 0;
103 fButtons = 0;
104 fPad = 0;
105 fCutSlider = 0;
106 fEtaSlider = 0;
107 fRangeSlider = 0;
108 fPickButton = 0;
109 fZoomButton = 0;
110 fArcButton = 0;
111 fFruits = 0;
fe4da5cc 112}
113
114//_____________________________________________________________________________
115AliDisplay::AliDisplay(Int_t size)
116{
117// Create an event display object.
118// A canvas named "edisplay" is created with a vertical size in pixels
119//
120// A QUICK Overview of the Event Display functions
121// ===============================================
122//
123// The event display can ve invoked by executing the macro "display.C"
124// A canvas like in the picture below will appear.
125//
126// On the left side of the canvas, the following buttons appear:
127// *Next* to move to the next event
128// *Previous* to move to the previous event
129// *Top View* to display a top view of the current event
130// *Side View* to display a side view of the current event
131// *Front View* to display a front view of the current event
132// *All Views* to display front/side/top/30-30 views of the current event
133// *OpenGL* to use OpenGl to view the current event.
134// Note that OpenGL cannot be used across the network.
135// Before using OpenGL, load the GL libraries
136// by executing the macro GL.C (in $ROOTSYS/macros/GL.C.
137// Once in GL, click the HELP button of the GL canvas.
138// *X3D* to use X3D to view the current event (Unix only).
139// Once in X3D, type M to see the list of all possible options.
140// for example type J to zoom, K to unzoom
141// use the mouse to rotate.
142// *Pick* Select this option to be able to point on a track with the
143// mouse. Once on the track, use the right button to select
144// an action. For example, select SetMarkerAttributes to
145// change the marker type/color/size for the track.
146// *Zoom* Select this option (default) if you want to zoom.
147// To zoom, simply select the selected area with the left button.
148// *UnZoom* To revert to the previous picture size.
149//
150// slider R On the left side, the vertical slider can be used to
151// set the default picture size.
152// slider pcut At the top of the canvas, a slider can be used to change
153// the momentum cut (or range) to display tracks.
154// slider eta On the right side of the canvas, a vertical slider can be used
155// to specify a rapidity range for the tracks.
156//
157// When you are in Zoom mode, you can click on the black part of the canvas
158// to select special options with the right mouse button.
159// This will display a pop-up menu with items like:
160// *Disable detector*
161// *Enable detector*, etc.
162// For example select "Disable detector". You get a dialog box.
163// Diable detector TRD for example.
164//
165// When you are in pick mode, you can "Inspect" the object pointed by the mouse.
166// When you are on a track, select the menu item "InspectParticle"
167// to display the current particle attributes.
168//
169// You can activate the Root browser by selecting the Inspect menu
170// in the canvas tool bar menu. Then select "Start Browser"
171// This will open a new canvas with the browser. At this point, you may want
172// to display some histograms (from the Trees). Go to the "File" menu
173// of the browser and click on "New canvas".
174// In the browser, click on item "ROOT files" in the left pane.
175// Click on galice.root.
176// Click on TH
177// Click on TPC for example
178// Click on any variable (eg TPC.fX) to histogram the variable.
179//
180// If you are lost, you can click on HELP in any Root canvas or browser.
181//Begin_Html
182/*
1439f98e 183<img src="picts/alidisplay.gif">
fe4da5cc 184*/
185//End_Html
186
187 fPad = 0;
188 gAlice->SetDisplay(this);
189
190 // Initialize display default parameters
191 SetRange();
192 SetPTcut();
193
194 // Set front view by default
195 fTheta = 0;
196 fPhi = -90;
197 fPsi = 0;
198 fDrawAllViews = kFALSE;
199 fDrawHits = kTRUE;
200 fDrawParticles = kTRUE;
201 fZoomMode = 1;
202 fZooms = 0;
203 fHitsCuts = 0;
204
205 // Create display canvas
206 Int_t ysize = size;
207 if (ysize < 100) ysize = 750;
208 Int_t xsize = Int_t(size*830./ysize);
209 fCanvas = new TCanvas("Canvas", "ALICE Event Display",14,47,xsize,ysize);
fe4da5cc 210 fCanvas->ToggleEventStatus();
211
212 // Create main display pad
213 fPad = new TPad("viewpad", "Alice display",0.15,0,0.97,0.96);
214 fPad->Draw();
215 fPad->Modified();
216 fPad->SetFillColor(1);
217 fPad->SetBorderSize(2);
218
219 // Create user interface control pad
220 DisplayButtons();
221 fCanvas->cd();
222
223 // Create Range and mode pad
224 Float_t dxtr = 0.15;
225 Float_t dytr = 0.45;
226 fTrigPad = new TPad("trigger", "range and mode pad",0,0,dxtr,dytr);
227 fTrigPad->Draw();
228 fTrigPad->cd();
229 fTrigPad->SetFillColor(22);
230 fTrigPad->SetBorderSize(2);
231 fRangeSlider = new TSlider("range","range",0.7,0.42,0.9,0.98);
232 fRangeSlider->SetObject(this);
233 char pickmode[] = "gAlice->Display()->SetPickMode()";
234 Float_t db = 0.09;
235 fPickButton = new TButton("Pick",pickmode,0.05,0.32,0.65,0.32+db);
236 fPickButton->SetFillColor(38);
237 fPickButton->Draw();
238 char zoommode[] = "gAlice->Display()->SetZoomMode()";
239 fZoomButton = new TButton("Zoom",zoommode,0.05,0.21,0.65,0.21+db);
240 fZoomButton->SetFillColor(38);
241 fZoomButton->Draw();
242 fArcButton = new TArc(.8,fZoomButton->GetYlowNDC()+0.5*db,0.33*db);
243 fArcButton->SetFillColor(kGreen);
244 fArcButton->Draw();
245 char butUnzoom[] = "gAlice->Display()->UnZoom()";
246 TButton *button = new TButton("UnZoom",butUnzoom,0.05,0.05,0.95,0.15);
247 button->SetFillColor(38);
248 button->Draw();
249 AppendPad(); // append display object as last object to force selection
250
251 // Create momentum cut slider pad
252 fCanvas->cd();
253 fCutPad = new TPad("cutSlider", "pcut slider pad",dxtr,.96,1,1);
254 fCutPad->Draw();
255 fCutPad->cd();
256 fCutPad->SetFillColor(22);
257 fCutPad->SetBorderSize(2);
258 fCutSlider = new TSlider("pcut","Momentum cut",0,0,1,1);
aee8290b 259 fCutSlider->SetRange(fPTcut/kptcutmax,1);
fe4da5cc 260 fCutSlider->SetObject(this);
261 fCutSlider->SetFillColor(45);
262 TSliderBox *sbox = (TSliderBox*)fCutSlider->GetListOfPrimitives()->First();
263 sbox->SetFillColor(46);
264 fCutSlider->cd();
aee8290b 265 TGaxis *cutaxis = new TGaxis(0.02,0.8,0.98,0.8,0,kptcutmax,510,"");
fe4da5cc 266 cutaxis->SetLabelSize(0.5);
267 cutaxis->SetTitleSize(0.6);
268 cutaxis->SetTitleOffset(0.5);
269 cutaxis->SetTitle("pcut . ");
270 fCutSlider->GetListOfPrimitives()->AddFirst(cutaxis);
271
272 // Create rapidity cut slider pad
273 fCanvas->cd();
274 fEtaPad = new TPad("EtaSlider", "Eta slider pad",0.97,0,1,0.96);
275 fEtaPad->Draw();
276 fEtaPad->cd();
277 fEtaPad->SetFillColor(22);
278 fEtaPad->SetBorderSize(2);
279 fEtaSlider = new TSlider("etacut","Rapidity cut",0,0,1,1);
280 fEtaSlider->SetObject(this);
281 fEtaSlider->SetFillColor(45);
282 TSliderBox *sbox2 = (TSliderBox*)fEtaSlider->GetListOfPrimitives()->First();
283 sbox2->SetFillColor(46);
284 fEtaSlider->cd();
aee8290b 285 TGaxis *etaaxis = new TGaxis(0.9,0.02,0.9,0.98,-ketacutmax,ketacutmax,510,"");
fe4da5cc 286 etaaxis->SetLabelSize(0.5);
287 etaaxis->SetTitleSize(0.6);
288 etaaxis->SetTitleOffset(0.2);
289 cutaxis->SetTitle("Etacut . ");
290 fEtaSlider->GetListOfPrimitives()->AddFirst(etaaxis);
291 fCanvas->cd();
86a9484d 292
293 fTrigPad->SetEditable(kFALSE);
294 fButtons->SetEditable(kFALSE);
fe4da5cc 295
296
297 fCanvas->cd();
298 fCanvas->Update();
299}
300
301
aee8290b 302//_____________________________________________________________________________
303AliDisplay::AliDisplay(const AliDisplay &disp)
304{
305 //
306 // Copy constructor
307 //
308 disp.Copy(*this);
309}
310
fe4da5cc 311//_____________________________________________________________________________
312AliDisplay::~AliDisplay()
313{
aee8290b 314 //
315 // Destructor
316 //
fe4da5cc 317}
318
319//_____________________________________________________________________________
320void AliDisplay::Clear(Option_t *)
321{
322// Delete graphics temporary objects
323}
324
aee8290b 325//_____________________________________________________________________________
326void AliDisplay::Copy(AliDisplay &disp) const
327{
328 //
329 // Copy *this onto disp -- not implemented
330 //
331 Fatal("Copy","Not implemented~\n");
332}
333
fe4da5cc 334//----------------------------------------------------------------------------
b23a502f 335void AliDisplay::ShowTrack(Int_t idx)
336{
337 //
338 // Display track idx
339 //
aee8290b 340 AliDetector *mTPC=(AliDetector*)gAlice->GetModule("TPC");
341 TObjArray *points=mTPC->Points();
fe4da5cc 342 int ntracks=points->GetEntriesFast();
343 for (int track=0;track<ntracks;track++) {
344 AliPoints *pm = (AliPoints*)points->UncheckedAt(track);
345 if (!pm) continue;
346 if (idx == pm->GetIndex()) {
347 pm->SetMarkerColor(2);
348 pm->SetMarkerStyle(22);
349 pm->Draw("same");
350// fPad->Update();
351// fPad->Modified();
2ab0c725 352 // TClonesArray *particles=gAlice->Particles();
353 // TParticle *p = (TParticle*)particles->UncheckedAt(idx);
354 TParticle *p = gAlice->Particle(idx);
fe4da5cc 355 printf("\nTrack index %d\n",idx);
1578254f 356 printf("Particle ID %d\n",p->GetPdgCode());
357 printf("Parent %d\n",p->GetFirstMother());
358 printf("First child %d\n",p->GetFirstDaughter());
359 printf("Px,Py,Pz %f %f %f\n",p->Px(),p->Py(),p->Pz());
fe4da5cc 360 return;
361 }
362 }
363}
364
365//----------------------------------------------------------------------------
366void AliDisplay::HideTrack(Int_t idx) {
ef42d733 367 //
368 // Hide track on display
369 //
aee8290b 370 AliDetector *mTPC=(AliDetector*)gAlice->GetModule("TPC");
371 TObjArray *points=mTPC->Points();
fe4da5cc 372 int ntracks=points->GetEntriesFast();
373 for (int track=0;track<ntracks;track++) {
374 AliPoints *pm = (AliPoints*)points->UncheckedAt(track);
375 if (!pm) continue;
376 if (idx == pm->GetIndex()) {
377 pm->SetMarkerColor(5);
378 pm->SetMarkerStyle(1);
379 pm->Draw("same");
380// fPad->Update();
381// fPad->Modified();
382 return;
383 }
384 }
385}
386
387//_____________________________________________________________________________
388void AliDisplay::DisableDetector(const char *name)
389{
390// Disable detector name from graphics views
391
8494b010 392 AliModule *module = (AliModule*)gAlice->Modules()->FindObject(name);
393 if (!module) return;
394 module->Disable();
fe4da5cc 395 Draw();
396}
397
398//_____________________________________________________________________________
399void AliDisplay::DisplayButtons()
400{
401// Create the user interface buttons
402
403 fButtons = new TPad("buttons", "newpad",0,0.45,0.15,1);
404 fButtons->Draw();
405 fButtons->SetFillColor(38);
406 fButtons->SetBorderSize(2);
407 fButtons->cd();
408
409 Int_t butcolor = 33;
410 Float_t dbutton = 0.08;
411 Float_t y = 0.96;
412 Float_t dy = 0.014;
413 Float_t x0 = 0.05;
414 Float_t x1 = 0.95;
415
416 TButton *button;
417 char but1[] = "gAlice->Display()->ShowNextEvent(1)";
418 button = new TButton("Next",but1,x0,y-dbutton,x1,y);
419 button->SetFillColor(38);
420 button->Draw();
421
422 y -= dbutton +dy;
423 char but2[] = "gAlice->Display()->ShowNextEvent(-1)";
424 button = new TButton("Previous",but2,x0,y-dbutton,x1,y);
425 button->SetFillColor(38);
426 button->Draw();
427
428 y -= dbutton +dy;
429 char but3[] = "gAlice->Display()->SetView(90,-90,90)";
430 button = new TButton("Top View",but3,x0,y-dbutton,x1,y);
431 button->SetFillColor(butcolor);
432 button->Draw();
433
434 y -= dbutton +dy;
435 char but4[] = "gAlice->Display()->SetView(90,0,-90)";
436 button = new TButton("Side View",but4,x0,y-dbutton,x1,y);
437 button->SetFillColor(butcolor);
438 button->Draw();
439
440 y -= dbutton +dy;
441 char but5[] = "gAlice->Display()->SetView(0,-90,0)";
442 button = new TButton("Front View",but5,x0,y-dbutton,x1,y);
443 button->SetFillColor(butcolor);
444 button->Draw();
445
446 y -= dbutton +dy;
447 char but6[] = "gAlice->Display()->DrawAllViews()";
448 button = new TButton("All Views",but6,x0,y-dbutton,x1,y);
449 button->SetFillColor(butcolor);
450 button->Draw();
451
452 y -= dbutton +dy;
453 char but7[] = "gAlice->Display()->DrawViewGL()";
454 button = new TButton("OpenGL",but7,x0,y-dbutton,x1,y);
455 button->SetFillColor(38);
456 button->Draw();
457
458 y -= dbutton +dy;
459 char but8[] = "gAlice->Display()->DrawViewX3D()";
460 button = new TButton("X3D",but8,x0,y-dbutton,x1,y);
461 button->SetFillColor(38);
462 button->Draw();
463
464 // display logo
465 TDiamond *diamond = new TDiamond(0.05,0.015,0.95,0.22);
466 diamond->SetFillColor(50);
467 diamond->SetTextAlign(22);
468 diamond->SetTextColor(5);
469 diamond->SetTextSize(0.11);
470 diamond->Draw();
471 diamond->AddText(".. ");
472 diamond->AddText("ROOT");
473 diamond->AddText("ALICE");
474 diamond->AddText("... ");
475 diamond->AddText(" ");
476}
477
478//______________________________________________________________________________
479Int_t AliDisplay::DistancetoPrimitive(Int_t px, Int_t)
480{
481// Compute distance from point px,py to objects in event
482
483 gPad->SetCursor(kCross);
484
485 if (gPad == fTrigPad) return 9999;
486 if (gPad == fCutPad) return 9999;
487 if (gPad == fEtaPad) return 9999;
488
aee8290b 489 const Int_t kbig = 9999;
490 Int_t dist = kbig;
fe4da5cc 491 Float_t xmin = gPad->GetX1();
492 Float_t xmax = gPad->GetX2();
493 Float_t dx = 0.02*(xmax - xmin);
494 Float_t x = gPad->AbsPixeltoX(px);
495 if (x < xmin+dx || x > xmax-dx) return dist;
496
497 if (fZoomMode) return 0;
498 else return 7;
499}
500
501//_____________________________________________________________________________
502void AliDisplay::Draw(Option_t *)
503{
504// Display current event
505
506 if (fDrawAllViews) {
507 DrawAllViews();
508 return;
509 }
510
511 fPad->cd();
512
513 DrawView(fTheta, fPhi, fPsi);
514
515 // Display the event number and title
516 fPad->cd();
517 DrawTitle();
518}
519
520//_____________________________________________________________________________
521void AliDisplay::DrawAllViews()
522{
523// Draw front,top,side and 30 deg views
524
525 fDrawAllViews = kTRUE;
526 fPad->cd();
527 fPad->SetFillColor(15);
528 fPad->Clear();
529 fPad->Divide(2,2);
530
531 // draw 30 deg view
532 fPad->cd(1);
533 DrawView(30, 30, 0);
534 DrawTitle();
535
536 // draw front view
537 fPad->cd(2);
538 DrawView(0, -90,0);
539 DrawTitle("Front");
540
541 // draw top view
542 fPad->cd(3);
543 DrawView(90, -90, 90);
544 DrawTitle("Top");
545
546 // draw side view
547 fPad->cd(4);
548 DrawView(90, 0, -90);
549 DrawTitle("Side");
550
551 fPad->cd(2);
552}
553
554//_____________________________________________________________________________
555void AliDisplay::DrawHits()
556{
557// Draw hits for all ALICE detectors
558
559 Float_t cutmin, cutmax, etamin, etamax, pmom, smin, smax, eta, theta, r;
560 Float_t *pxyz;
561 Int_t ntracks,track;
1578254f 562 TParticle *particle;
fe4da5cc 563 TObjArray *points;
564 AliPoints *pm;
565
566 //Get cut slider
567 smax = fCutSlider->GetMaximum();
568 smin = fCutSlider->GetMinimum();
aee8290b 569 cutmin = kptcutmax*smin;
570 if (smax < 0.98) cutmax = kptcutmax*smax;
fe4da5cc 571 else cutmax = 100000;
572
573 //Get eta slider
574 smax = fEtaSlider->GetMaximum();
575 smin = fEtaSlider->GetMinimum();
aee8290b 576 etamin = ketacutmax*(2*smin-1);
577 etamax = ketacutmax*(2*smax-1);
fe4da5cc 578 if (smin < 0.02) etamin = -1000;
579 if (smax > 0.98) etamax = 1000;
580
8494b010 581 TIter next(gAlice->Modules());
582 AliModule *module;
fe4da5cc 583 fHitsCuts = 0;
8494b010 584 while((module = (AliModule*)next())) {
585 if (!module->IsActive()) continue;
586 points = module->Points();
fe4da5cc 587 if (!points) continue;
588 ntracks = points->GetEntriesFast();
589 for (track=0;track<ntracks;track++) {
590 pm = (AliPoints*)points->UncheckedAt(track);
591 if (!pm) continue;
592 particle = pm->GetParticle();
593 if (!particle) continue;
1578254f 594 pmom = particle->P();
fe4da5cc 595 if (pmom < cutmin) continue;
596 if (pmom > cutmax) continue;
597 // as a first approximation, take eta of first point
598 pxyz = pm->GetP();
599 r = TMath::Sqrt(pxyz[0]*pxyz[0] + pxyz[1]*pxyz[1]);
600 theta = TMath::ATan2(r,TMath::Abs(pxyz[2]));
33d37c81 601 if(theta) eta = -TMath::Log(TMath::Abs(TMath::Tan(0.5*theta))); else eta = 1e10;
fe4da5cc 602 if (pxyz[2] < 0) eta = -eta;
603 if (eta < etamin || eta > etamax) continue;
604 pm->Draw();
605 fHitsCuts += pm->GetN();
606 }
607 }
608}
609
610//_____________________________________________________________________________
611void AliDisplay::DrawTitle(Option_t *option)
612{
613// Draw the event title
614
615 Float_t xmin = gPad->GetX1();
616 Float_t xmax = gPad->GetX2();
617 Float_t ymin = gPad->GetY1();
618 Float_t ymax = gPad->GetY2();
619 Float_t dx = xmax-xmin;
620 Float_t dy = ymax-ymin;
621
622 if (strlen(option) == 0) {
623 TPaveText *title = new TPaveText(xmin +0.01*dx, ymax-0.09*dy, xmin +0.5*dx, ymax-0.01*dy);
624 title->SetBit(kCanDelete);
625 title->SetFillColor(42);
626 title->Draw();
627 char ptitle[100];
628 sprintf(ptitle,"Alice event: %d, Run:%d",gAlice->GetHeader()->GetEvent(), gAlice->GetHeader()->GetRun());
629 title->AddText(ptitle);
630 Int_t nparticles = gAlice->Particles()->GetEntriesFast();
631 sprintf(ptitle,"Nparticles = %d Nhits = %d",nparticles, fHitsCuts);
632 title->AddText(ptitle);
633 } else {
634 TPaveLabel *label = new TPaveLabel(xmin +0.01*dx, ymax-0.07*dy, xmin +0.2*dx, ymax-0.01*dy,option);
635 label->SetBit(kCanDelete);
636 label->SetFillColor(42);
637 label->Draw();
638 }
639}
640
641//_____________________________________________________________________________
642void AliDisplay::DrawView(Float_t theta, Float_t phi, Float_t psi)
643{
644// Draw a view of ALICE
645
646 gPad->SetCursor(kWatch);
647 gPad->SetFillColor(1);
648 gPad->Clear();
649
650 Int_t iret;
651 TView *view = new TView(1);
652 Float_t range = fRrange*fRangeSlider->GetMaximum();
653 view->SetRange(-range,-range,-range,range, range, range);
654 fZoomX0[0] = -1;
655 fZoomY0[0] = -1;
656 fZoomX1[0] = 1;
657 fZoomY1[0] = 1;
658 fZooms = 0;
659
660 // Display Alice Geometry
661 gAlice->GetGeometry()->Draw("same");
662
663 //Loop on all detectors to add their products to the pad
664 DrawHits();
665
666 // add itself to the list (must be last)
667 AppendPad();
668
669 view->SetView(phi, theta, psi, iret);
670}
671
672//_____________________________________________________________________________
673void AliDisplay::DrawViewGL()
674{
675// Draw current view using OPENGL
676
677 TPad *pad = (TPad*)gPad->GetPadSave();
678 pad->cd();
679 TView *view = pad->GetView();
680 if (!view) return;
681 pad->x3d("OPENGL");
682}
683
684//_____________________________________________________________________________
685void AliDisplay::DrawViewX3D()
686{
687// Draw current view using X3D
688
689 TPad *pad = (TPad*)gPad->GetPadSave();
690 pad->cd();
691 TView *view = pad->GetView();
692 if (!view) return;
693 pad->x3d();
694}
695
696//_____________________________________________________________________________
697void AliDisplay::EnableDetector(const char *name)
698{
699// Enable detector name in graphics views
700
8494b010 701 AliModule *module = (AliModule*)gAlice->Modules()->FindObject(name);
702 if (!module) return;
703 module->Enable();
fe4da5cc 704 Draw();
705}
706
707//______________________________________________________________________________
708void AliDisplay::ExecuteEvent(Int_t event, Int_t px, Int_t py)
709{
710// Execute action corresponding to the mouse event
711
712 static Float_t x0, y0, x1, y1;
713
714 static Int_t pxold, pyold;
715 static Int_t px0, py0;
716 static Int_t linedrawn;
717 Float_t temp;
718
719 if (px == 0 && py == 0) { //when called by sliders
720 if (event == kButton1Up) {
721 Draw();
722 }
723 return;
724 }
725 if (!fZoomMode && gPad->GetView()) {
726 gPad->GetView()->ExecuteRotateView(event, px, py);
727 return;
728 }
729
730 // something to zoom ?
731// fPad->SetCursor(kCross);
732 gPad->SetCursor(kCross);
733
734 switch (event) {
735
736 case kButton1Down:
084c1b4a 737 gVirtualX->SetLineColor(-1);
fe4da5cc 738 gPad->TAttLine::Modify(); //Change line attributes only if necessary
739 x0 = gPad->AbsPixeltoX(px);
740 y0 = gPad->AbsPixeltoY(py);
741 px0 = px; py0 = py;
742 pxold = px; pyold = py;
743 linedrawn = 0;
744 return;
745
746 case kButton1Motion:
084c1b4a 747 if (linedrawn) gVirtualX->DrawBox(px0, py0, pxold, pyold, TVirtualX::kHollow);
fe4da5cc 748 pxold = px;
749 pyold = py;
750 linedrawn = 1;
084c1b4a 751 gVirtualX->DrawBox(px0, py0, pxold, pyold, TVirtualX::kHollow);
fe4da5cc 752 return;
753
754 case kButton1Up:
755 gPad->GetCanvas()->FeedbackMode(kFALSE);
756 if (px == px0) return;
757 if (py == py0) return;
758 x1 = gPad->AbsPixeltoX(px);
759 y1 = gPad->AbsPixeltoY(py);
760
761 if (x1 < x0) {temp = x0; x0 = x1; x1 = temp;}
762 if (y1 < y0) {temp = y0; y0 = y1; y1 = temp;}
763 gPad->Range(x0,y0,x1,y1);
764 if (fZooms < kMAXZOOMS-1) {
765 fZooms++;
766 fZoomX0[fZooms] = x0;
767 fZoomY0[fZooms] = y0;
768 fZoomX1[fZooms] = x1;
769 fZoomY1[fZooms] = y1;
770 }
771 gPad->Modified(kTRUE);
772 return;
773 }
774
775}
776
777//___________________________________________
778void AliDisplay::LoadPoints()
779{
780// Read hits info and store x,y,z info in arrays fPoints
781// Loop on all detectors
782
783 gAlice->ResetPoints();
8494b010 784 TIter next(gAlice->Modules());
785 AliModule *module;
fe4da5cc 786 Int_t ntracks = gAlice->GetNtrack();
787 for (Int_t track=0; track<ntracks;track++) {
788 gAlice->ResetHits();
789 gAlice->TreeH()->GetEvent(track);
8494b010 790 while((module = (AliModule*)next())) {
791 module->LoadPoints(track);
fe4da5cc 792 }
793 next.Reset();
794 }
795}
796
797//_____________________________________________________________________________
798void AliDisplay::Paint(Option_t *)
799{
800// Paint miscellaneous items
801
802}
803
804//_____________________________________________________________________________
805void AliDisplay::SetPickMode()
806{
ef42d733 807 //
808 // Set Pick Mode -- disable zoom
809 //
fe4da5cc 810 fZoomMode = 0;
811
812 fArcButton->SetY1(fPickButton->GetYlowNDC()+0.5*fPickButton->GetHNDC());
813 fTrigPad->Modified();
814}
815
816//_____________________________________________________________________________
817void AliDisplay::SetZoomMode()
818{
ef42d733 819 //
820 // Set Zoom Mode -- disable pick
821 //
fe4da5cc 822 fZoomMode = 1;
823
824 fArcButton->SetY1(fZoomButton->GetYlowNDC()+0.5*fZoomButton->GetHNDC());
825 fTrigPad->Modified();
826}
827
828//_____________________________________________________________________________
829void AliDisplay::SetPTcut(Float_t ptcut)
830{
ef42d733 831 //
832 // Set Pt Cut
833 //
fe4da5cc 834 fPTcut = ptcut;
835
836 if (!fPad) return;
837 fPad->Clear();
838 Draw();
839}
840
841//_____________________________________________________________________________
842void AliDisplay::SetRange(Float_t rrange, Float_t zrange)
843{
844// Set view range along R and Z
845 fRrange = rrange;
846 fZrange = zrange;
847
848 if (!fPad) return;
849 fPad->Clear();
850 Draw();
851}
852
853//_____________________________________________________________________________
854void AliDisplay::SetView(Float_t theta, Float_t phi, Float_t psi)
855{
856// change viewing angles for current event
857
858 fPad->cd();
859 fDrawAllViews = kFALSE;
860 fPhi = phi;
861 fTheta = theta;
862 fPsi = psi;
863 Int_t iret = 0;
864
865 TView *view = gPad->GetView();
866 if (view) view->SetView(fPhi, fTheta, fPsi, iret);
867 else Draw();
868
869 gPad->Modified();
870}
871
872//_____________________________________________________________________________
873void AliDisplay::ShowNextEvent(Int_t delta)
874{
875// Display (current event_number+delta)
876// delta = 1 shown next event
877// delta = -1 show previous event
878
879 if (delta) {
880 gAlice->Clear();
aee8290b 881 Int_t currentEvent = gAlice->GetHeader()->GetEvent();
882 Int_t newEvent = currentEvent + delta;
883 gAlice->GetEvent(newEvent);
fe4da5cc 884 if (!gAlice->TreeH()) return;
885 }
886 LoadPoints();
887 fPad->cd();
888 Draw();
889}
890
891//______________________________________________________________________________
892void AliDisplay::UnZoom()
893{
aee8290b 894 //
895 // Resets ZOOM
896 //
897 if (fZooms <= 0) return;
898 fZooms--;
899 TPad *pad = (TPad*)gPad->GetPadSave();
900 pad->Range(fZoomX0[fZooms],fZoomY0[fZooms], fZoomX1[fZooms],fZoomY1[fZooms]);
901 pad->Modified();
902}
903
904//_____________________________________________________________________________
905AliDisplay & AliDisplay::operator=(const AliDisplay &disp)
906{
907 //
908 // Assignment operator
909 //
910 disp.Copy(*this);
911 return (*this);
fe4da5cc 912}