]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONDisplay.cxx
- Removing AliMpSegFactory -> using AliMpSegmentation instead
[u/mrichter/AliRoot.git] / MUON / AliMUONDisplay.cxx
CommitLineData
a9e2aefa 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
88cb7938 16/* $Id$ */
a9e2aefa 17
5398f946 18/// \class AliMUONDisplay
19/// Create an event display object.
20/// A canvas named "edisplay" is created with a vertical size in pixels \n
21///
22/// A QUICK Overview of the Event Display functions \n
23/// =============================================== \n
24///
25/// The event display can ve invoked by executing the macro "display.C" \n
26/// A canvas like in the picture below will appear.
27///
28/// On the left side of the canvas, the following buttons appear:
29/// - *Next* to move to the next event
30/// - *Previous* to move to the previous event
31/// - *Pick* Select this option to be able to point on a track with the
32/// mouse. Once on the track, use the right button to select
33/// an action. For example, select SetMarkerAttributes to
34/// change the marker type/color/size for the track.
35/// - *Zoom* Select this option (default) if you want to zoom.
36/// To zoom, simply select the selected area with the left button.
37/// - *UnZoom* To revert to the previous picture size.
38///
39/// - slider R On the left side, the vertical slider can be used to
40/// set the default picture size.
41///
42/// When you are in Zoom mode, you can click on the black part of the canvas
43/// to select special options with the right mouse button.
44///
45/// When you are in pick mode, you can "Inspect" the object pointed by the mouse.
46/// When you are on a track, select the menu item "InspectParticle"
47/// to display the current particle attributes.
48///
49/// You can activate the Root browser by selecting the Inspect menu
50/// in the canvas tool bar menu. Then select "Start Browser"
51/// This will open a new canvas with the browser. At this point, you may want
52/// to display some histograms (from the Trees). Go to the "File" menu
53/// of the browser and click on "New canvas".
54/// In the browser, click on item "ROOT files" in the left pane.
55/// Click on galice.root.
56/// Click on TH
57/// Click on TPC for example
58/// Click on any variable (eg TPC.fX) to histogram the variable.
59///
60/// If you are lost, you can click on HELP in any Root canvas or browser.
61
62//Begin_Html
63/*
64<img src="gif/AliMUONDisplay.gif">
65*/
66//End_Html
a9e2aefa 67
30178c30 68#include "AliMUONDisplay.h"
a9e2aefa 69#include "AliMUON.h"
a9e2aefa 70#include "AliMUONPoints.h"
d226f81b 71#include "AliMUONGlobalTrigger.h"
a9e2aefa 72#include "AliMUONHit.h"
a9e2aefa 73#include "AliMUONDigit.h"
74#include "AliMUONRawCluster.h"
572d5bb2 75#include "AliMUONTrack.h"
76#include "AliMUONTrackParam.h"
b7ef3c96 77#include "AliMUONGeometryTransformer.h"
7502d0e5 78#include "AliMUONSegmentation.h"
79#include "AliMUONGeometrySegmentation.h"
80#include "AliMUONConstants.h"
1169bc87 81#include "AliMUONTriggerSegmentationV2.h"
7502d0e5 82
83#include "AliMpDEIterator.h"
84#include "AliMpSegFactory.h"
123469eb 85#include "AliMpSlatSegmentation.h"
86#include "AliMpSlat.h"
63216d66 87#include "AliMpSectorSegmentation.h"
e0d2f4db 88#include "AliMpSector.h"
e0d2f4db 89#include "AliMpTriggerSegmentation.h"
90#include "AliMpTrigger.h"
1169bc87 91#include "AliMpStationType.h"
92#include "AliMpDEManager.h"
123469eb 93
5d12ce38 94#include "AliMC.h"
8c343c7c 95#include "AliLog.h"
7502d0e5 96#include "AliRun.h"
97#include "AliHeader.h"
98
99#include <TButton.h>
100#include <TColor.h>
101#include <TCanvas.h>
102#include <TView.h>
103#include <TText.h>
104#include <TPaveLabel.h>
105#include <TPaveText.h>
106#include <TDiamond.h>
107#include <TNode.h>
108#include <TArc.h>
109#include <TSlider.h>
110#include <TVirtualX.h>
111#include <TMath.h>
112#include <TGeometry.h>
113#include <TMarker3DBox.h>
114#include <TParticle.h>
115#include <TPolyLine3D.h>
116#include <TBox.h>
a9e2aefa 117
5398f946 118/// \cond CLASSIMP
a9e2aefa 119ClassImp(AliMUONDisplay)
5398f946 120/// \endcond
a9e2aefa 121
122//_____________________________________________________________________________
123AliMUONDisplay::AliMUONDisplay()
5398f946 124 : AliDisplay(),
125 fEvent(0),
126 fChamber(0),
127 fCathode(0),
128 fDrawClusters(kTRUE),
129 fDrawCoG(kTRUE),
130 fDrawTracks(kFALSE),
131 fClustersCuts(0),
132 fColPad(0),
133 fPoints(0),
134 fPhits(0),
135 fRpoints(0),
136 fNextCathode(0),
137 fLoader(0),
138 fMUONData(0)
a9e2aefa 139{
5398f946 140/// Default constructor
a9e2aefa 141}
142
143//_____________________________________________________________________________
307d9d04 144AliMUONDisplay::AliMUONDisplay(Int_t size, AliLoader * loader)
5398f946 145 : AliDisplay(),
146 fEvent(0),
147 fChamber(1),
148 fCathode(1),
149 fDrawClusters(kTRUE),
150 fDrawCoG(kTRUE),
151 fDrawTracks(kFALSE),
152 fClustersCuts(0),
153 fColPad(0),
154 fPoints(0),
155 fPhits(0),
156 fRpoints(0),
157 fNextCathode(kFALSE),
158 fLoader(loader),
159 fMUONData(0)
160
a9e2aefa 161{
5398f946 162/// Standard constructor to create an event display object.
a9e2aefa 163
164 fPad = 0;
165
166 gAlice->SetDisplay(this);
167
168 // Initialize display default parameters
169 SetRange(200,2000);
5398f946 170
a9e2aefa 171 // Set front view by default
172 fTheta = 0;
173 fPhi = -90;
174 fPsi = 0;
a9e2aefa 175 fZoomMode = 1;
176 fZooms = 0;
5398f946 177
a9e2aefa 178 // Create colors
179 CreateColors();
180 // Create display canvas
181 Int_t ysize = size;
182 if (ysize < 100) ysize = 750;
183 Int_t xsize = Int_t(size*830./ysize);
572d5bb2 184 fCanvas = new TCanvas("Canvas", "MUON Display",14,47,xsize,ysize);
a9e2aefa 185 fCanvas->ToggleEventStatus();
186
187 // Create main display pad
188 fPad = new TPad("viewpad", "MUON display",0.15,0,0.9,1);
189 fPad->Draw();
190 fPad->Modified();
191 fPad->SetFillColor(30);
192 fPad->SetBorderSize(2);
193
194 fCanvas->cd();
195
196 // Create colors pad
197 fColPad = new TPad("colpad", "Colors pad",0.9,0,1,1);
198 fColPad->Draw();
199 fColPad->SetFillColor(17);
200 fColPad->SetBorderSize(2);
201 fColPad->cd();
202 DisplayColorScale();
203
204 fCanvas->cd();
205 // Create user interface control pad
206 DisplayButtons();
207 fCanvas->cd();
208
209 // Create Range and mode pad
210 Float_t dxtr = 0.15;
211 Float_t dytr = 0.45;
212 fTrigPad = new TPad("trigger", "range and mode pad",0,0,dxtr,dytr);
a9e2aefa 213 fTrigPad->Draw();
214 fTrigPad->cd();
215 fTrigPad->SetFillColor(22);
216 fTrigPad->SetBorderSize(2);
217 fRangeSlider = new TSlider("range","range",0.7,0.42,0.9,0.98);
218 fRangeSlider->SetObject(this);
219 char pickmode[] = "gAlice->Display()->SetPickMode()";
220 Float_t db = 0.09;
221 fPickButton = new TButton("Pick",pickmode,0.05,0.32,0.65,0.32+db);
222 fPickButton->SetFillColor(38);
223 fPickButton->Draw();
224 char zoommode[] = "gAlice->Display()->SetZoomMode()";
225 fZoomButton = new TButton("Zoom",zoommode,0.05,0.21,0.65,0.21+db);
226 fZoomButton->SetFillColor(38);
227 fZoomButton->Draw();
228 fArcButton = new TArc(.8,fZoomButton->GetYlowNDC()+0.5*db,0.33*db);
229 fArcButton->SetFillColor(kGreen);
230 fArcButton->Draw();
231 char butUnzoom[] = "gAlice->Display()->UnZoom()";
232 TButton *button = new TButton("UnZoom",butUnzoom,0.05,0.05,0.95,0.15);
233 button->SetFillColor(38);
234 button->Draw();
235 AppendPad(); // append display object as last object to force selection
236
237 fCanvas->cd();
1c4b7942 238 fTrigPad->SetEditable(kFALSE);
239 fButtons->SetEditable(kFALSE);
a9e2aefa 240 fCanvas->Update();
5398f946 241
d226f81b 242 // initialize container
243 if(fLoader)
244 fMUONData = new AliMUONData(fLoader,"MUON","MUON");
245 else
246 fMUONData =0x0;
a9e2aefa 247}
248
a9e2aefa 249//_____________________________________________________________________________
250AliMUONDisplay::~AliMUONDisplay()
251{
5398f946 252/// Destructor
253
a9e2aefa 254 // Delete space point structure
255 if (fPoints) fPoints->Delete();
256 delete fPoints;
257 fPoints = 0;
258 //
259 if (fPhits) fPhits->Delete();
260 delete fPhits;
261 fPhits = 0;
262 //
d226f81b 263 if (fRpoints) fRpoints->Delete();
a9e2aefa 264 delete fRpoints;
d226f81b 265 fRpoints = 0;
a9e2aefa 266}
267
268//_____________________________________________________________________________
269void AliMUONDisplay::Clear(Option_t *)
270{
5398f946 271/// Delete graphics temporary objects
a9e2aefa 272}
273
274//_____________________________________________________________________________
275void AliMUONDisplay::DisplayButtons()
276{
5398f946 277/// Create the user interface buttons
a9e2aefa 278
279
280 fButtons = new TPad("buttons", "newpad",0,0.45,0.15,1);
a9e2aefa 281 fButtons->Draw();
282 fButtons->SetFillColor(38);
283 fButtons->SetBorderSize(2);
284 fButtons->cd();
285
286// Int_t butcolor = 33;
287 Float_t dbutton = 0.08;
288 Float_t y = 0.96;
289 Float_t dy = 0.014;
290 Float_t x0 = 0.05;
291 Float_t x1 = 0.95;
292
293 TButton *button;
294 char but1[] = "gAlice->Display()->ShowNextEvent(1)";
295 button = new TButton("Event +", but1, x0, y - dbutton, x1, y);
296 button->SetFillColor(38);
297 button->Draw();
298
299 y -= dbutton + dy;
300 char but2[] = "gAlice->Display()->ShowNextEvent(-1)";
301 button = new TButton("Event -", but2, x0, y - dbutton, x1, y);
302 button->SetFillColor(38);
303 button->Draw();
304
305 y -= dbutton + dy;
306 char but3[] = "((AliMUONDisplay*)(gAlice->Display()))->NextChamber(1)";
307 button = new TButton("Chamber +", but3, x0, y - dbutton, x1, y);
308 button->SetFillColor(38);
309 button->Draw();
310
311 y -= dbutton + dy;
312 char but4[] = "((AliMUONDisplay*)(gAlice->Display()))->NextChamber(-1)";
313 button = new TButton("Chamber -", but4, x0, y - dbutton, x1, y);
314 button->SetFillColor(38);
315 button->Draw();
316
317 y -= dbutton + dy;
318 char but5[] = "((AliMUONDisplay*)(gAlice->Display()))->SetChamberAndCathode(1,1)";
319 button = new TButton("Chamber 1", but5, x0, y - dbutton, x1, y);
320 button->SetFillColor(38);
321 button->Draw();
322
323 y -= dbutton + dy;
324 char but6[] = "((AliMUONDisplay*)(gAlice->Display()))->NextCathode()";
325 button = new TButton("Cathode <>", but6, x0, y - dbutton, x1, y);
326 button->SetFillColor(38);
327 button->Draw();
328
329 y -= dbutton + dy;
330 char but7[] = "((AliMUONDisplay*)(gAlice->Display()))->Trigger()";
331 button = new TButton("Trigger", but7, x0, y - dbutton, x1, y);
332 button->SetFillColor(38);
333 button->Draw();
334
572d5bb2 335 y -= dbutton + dy;
336 char but8[] = "((AliMUONDisplay*)(gAlice->Display()))->DrawReco()";
337 button = new TButton("Tracking", but8, x0, y - dbutton, x1, y);
338 button->SetFillColor(38);
339 button->Draw();
340
a9e2aefa 341 // display logo
342 TDiamond *diamond = new TDiamond(0.05,0.015,0.95,0.22);
343 diamond->SetFillColor(50);
344 diamond->SetTextAlign(22);
345 diamond->SetTextColor(5);
346 diamond->SetTextSize(0.11);
347 diamond->Draw();
348 diamond->AddText(".. ");
349 diamond->AddText("ROOT");
350 diamond->AddText("MUON");
351 diamond->AddText("... ");
352 diamond->AddText(" ");
353}
354
355//_____________________________________________________________________________
30178c30 356void AliMUONDisplay::CreateColors() const
a9e2aefa 357{
5398f946 358/// Create the colors palette used to display clusters
a9e2aefa 359
360 Int_t k,i;
361 Int_t color;
362 Float_t r,g,b;
363
364 for (k=1;k<=5;k++) {
365 switch(k) {
366 case 1:
367 for (i=1;i<=5;i++) {
368 r=1.;
369 g=i*0.2;
370 b=0.;
371 color=i;
372 color=260+23-color;
373 new TColor(color,r,g,b);
374 }
375 break;
376 case 2:
377 for (i=1;i<=4;i++) {
378 r=1.1-i*0.2;
379 g=1.;
380 b=0.;
381 color=i+5;
382 color=260+23-color;
383 new TColor(color,r,g,b);
384 }
385 break;
386 case 3:
387 for (i=1;i<=4;i++) {
388 r=0.;
389 g=1.;
390 b=i*0.2+0.2;
391 color=i+9;
392 color=260+23-color;
393 new TColor(color,r,g,b);
394 }
395 break;
396 case 4:
397 for (i=1;i<=4;i++) {
398 r=0.;
399 g=1.1-i*0.2;
400 b=1.;
401 color=i+13;
402 color=260+23-color;
403 new TColor(color,r,g,b);
404 }
405 break;
406 case 5:
407 for (i=1;i<=5;i++) {
408 r=i*0.2;
409 g=0.;
410 b=1.;
411 color=i+17;
412 color=260+23-color;
413 new TColor(color,r,g,b);
414 }
415 break;
416 }
417 }
418}
419
420//_____________________________________________________________________________
421void AliMUONDisplay::DisplayColorScale()
422{
5398f946 423/// Display pulse height color scale
424
a9e2aefa 425 Int_t i;
426 Int_t color;
427 Float_t xlow, ylow, xup, yup, hs;
428 Float_t x1, y1, x2, y2;
429 x1 = y1 = 0;
430 x2 = y2 = 1.0;
431
432 TText *text = new TText(0,0,"");
433 text->SetTextFont(61);
434 text->SetTextSize(0.2);
435 text->SetTextAlign(22);
436
7e4a628d 437
438 Int_t adcmax=4096; // default 12 bits ADC
439
a9e2aefa 440
441
442 TBox *box;
443 char label[8];
444//*-* draw colortable boxes
445 hs = (y2-y1)/Float_t(22);
446 xlow=x1+.05;
447 xup=x2-0.5;
448 for (i=0;i<22;i++) {
449 ylow = y1 + hs*(Float_t(i));
450 yup = y1 + hs*(Float_t(i+1));
451 color = 261+i;
452 Double_t logscale=Double_t(i+1)*(TMath::Log(adcmax)/22);
453 Int_t scale=(Int_t)TMath::Exp(logscale);
454 sprintf(label,"%d",scale);
455 box = new TBox(xlow, ylow, xup, yup);
456 box->Draw();
457 box->SetFillColor(color);
458 text->DrawText(xlow+0.7, 0.5*(ylow+yup),label);
459 }
460}
461
462//______________________________________________________________________________
463Int_t AliMUONDisplay::DistancetoPrimitive(Int_t px, Int_t)
464{
5398f946 465/// Compute distance from point px,py to objects in event
a9e2aefa 466
467 gPad->SetCursor(kCross);
468
469 if (gPad == fTrigPad) return 9999;
470
471 const Int_t kBig = 9999;
472 Int_t dist = kBig;
473 Float_t xmin = gPad->GetX1();
474 Float_t xmax = gPad->GetX2();
475 Float_t dx = 0.02*(xmax - xmin);
476 Float_t x = gPad->AbsPixeltoX(px);
477 if (x < xmin+dx || x > xmax-dx) return dist;
478
479 if (fZoomMode) return 0;
480 else return 7;
481}
482
483//_____________________________________________________________________________
484void AliMUONDisplay::Draw(Option_t *)
485{
5398f946 486/// Display current event
a9e2aefa 487
572d5bb2 488 if (!fDrawTracks)
489 DrawChamber();
490 else
491 DrawReco();
492
493}
494//_____________________________________________________________________________
495void AliMUONDisplay::DrawChamber()
496{
5398f946 497/// Display current event
a9e2aefa 498
572d5bb2 499 fDrawTracks = kFALSE;
500 fPad->cd();
501 DrawView(fTheta, fPhi, fPsi);
502 // Display the event number and title
503 fPad->cd();
504 DrawTitle();
505
506}
507//_____________________________________________________________________________
508void AliMUONDisplay::DrawReco(Option_t *)
509{
5398f946 510/// Display current event
572d5bb2 511
512 fDrawTracks = kTRUE;
513 // print kinematics of generated particles
514 PrintKinematics();
515 // Draw global view of muon system
516 fPad->cd();
517 DrawGlobalView(135, -50, -140);
518
a9e2aefa 519 // Display the event number and title
520 fPad->cd();
521 DrawTitle();
522}
523
572d5bb2 524//_____________________________________________________________________________
525void AliMUONDisplay::PrintKinematics()
526{
5398f946 527/// Print kinematic tree
528
572d5bb2 529 AliRunLoader * runLoader;
530 TParticle *particle = new TParticle();
531 Int_t nPart;
532 Float_t vertex[3], momentum[3];
533
534 if (fLoader)
535 runLoader = fLoader->GetRunLoader();
536 else
537 runLoader = 0x0;
538
539 printf("****** Event # %d ******\n",runLoader->GetEventNumber());
540 runLoader->TreeK()->GetBranch("Particles")->SetAddress(&particle);
541 nPart = (Int_t)runLoader->TreeK()->GetEntries();
542 for(Int_t iPart = 0; iPart < nPart; iPart++) {
543 runLoader->TreeK()->GetEvent(iPart);
544 vertex[0] = particle->Vx();
545 vertex[1] = particle->Vy();
546 vertex[2] = particle->Vz();
547 momentum[0] = particle->Px();
548 momentum[1] = particle->Py();
549 momentum[2] = particle->Pz();
550
551 printf("===================================================\n");
552 printf(" Generated particle # %d \n",iPart);
553 printf(" name: %s \n",particle->GetName());
554 printf(" vertex x,y,z (cm): %f %f %f \n",vertex[0],vertex[1],vertex[2]);
555 printf(" momentum Px,Py,Pz (GeV/c): %f %f %f \n",momentum[0],momentum[1],momentum[2]);
556 }
557 delete particle;
558}
559
5398f946 560//_____________________________________________________________________________
a9e2aefa 561void AliMUONDisplay::DrawSegmentation()
562{
5398f946 563/// \todo to be re-written for new seg
564/// Draw graphical representation of segmenatation
565/// Attention: still experimental code
002920d1 566// Int_t icat=1;
a9e2aefa 567
002920d1 568// AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
569// AliMUONChamber* iChamber;
76dadf7e 570
002920d1 571// AliSegmentation* seg;
572// iChamber = &(pMUON->Chamber(fChamber));
573// seg=iChamber->SegmentationModel(icat);
76dadf7e 574
002920d1 575// Float_t zpos=iChamber->Z();
576// Float_t r=iChamber->ROuter();
a9e2aefa 577
002920d1 578// TMarker3DBox *marker;
579// if (icat == 1) {
580// for (Int_t j=0; j<seg->Npy(); j++) {
581// Float_t y0;
582// y0=j*seg->Dpy()-seg->Dpy()/2.;
583// for (seg->FirstPad(0.,y0,0,300,0.);
584// seg->MorePads();
585// seg->NextPad())
586// {
587// if (seg->ISector()==0) continue;
588// Float_t x,y,z;
589// seg->GetPadC(seg->Ix(), seg->Iy(), x, y, z);
590// Float_t dpx=seg->Dpx(seg->ISector())/2;
591// Float_t dpy=seg->Dpy(seg->ISector())/2;
592// marker=new TMarker3DBox(x,y,zpos,dpx,dpy,0,0,0);
593// marker->SetLineColor(seg->ISector()+1);
594// marker->SetFillStyle(1001);
595// marker->SetFillColor(0);
596// marker->Draw();
597// }
598// }
599// } else {
600// for (Int_t j=0; j<250; j++) {
601// Float_t x0=j*seg->Dpx();
602// Float_t y0=TMath::Sqrt(r*r-x0*x0);
a9e2aefa 603
002920d1 604// for (seg->FirstPad(x0,0,0,0,y0);
605// seg->MorePads();
606// seg->NextPad())
607// {
608// if (seg->ISector()==0) continue;
a9e2aefa 609
002920d1 610// Float_t x,y,z;
611// seg->GetPadC(seg->Ix(), seg->Iy(), x, y, z);
612// Float_t dpx=seg->Dpx(seg->ISector())/2;
613// Float_t dpy=seg->Dpy(seg->ISector())/2;
614// marker=new TMarker3DBox(x,y,zpos,dpx,dpy,0,0,0);
615// marker->SetLineColor(seg->ISector()+1);
616// marker->SetFillStyle(1001);
617// marker->SetFillColor(0);
618// marker->Draw();
619// }
620// }
621// }
622 }
a9e2aefa 623
624//_____________________________________________________________________________
625void AliMUONDisplay::DrawClusters()
626{
5398f946 627/// Draw clusters for MUON chambers
a9e2aefa 628
629 Int_t ndigits, digit;
630 TObjArray *points;
631 AliMUONPoints *pm;
632
633
634 fClustersCuts = 0;
635 points = Points();
636 if (!points) return;
637 ndigits = points->GetEntriesFast();
638 for (digit=0;digit<ndigits;digit++){
639 pm = (AliMUONPoints*)points->UncheckedAt(digit);
640 if (!pm) continue;
641 Float_t *pxyz;
642 pxyz=pm->GetP();
643 for (Int_t im=0;im<3;im++) {
644 TMarker3DBox *marker=pm->GetMarker(im);
645 if (marker)
646 marker->Draw();
647 }
648 pm->Draw();
123469eb 649 fClustersCuts += pm->GetN();
a9e2aefa 650 }
651}
652
653//_____________________________________________________________________________
654void AliMUONDisplay::DrawHits()
655{
5398f946 656/// Draw hits for MUON chambers
a9e2aefa 657
658 LoadHits(fChamber);
659
660 Int_t ntracks, track;
661 TObjArray *points;
662 AliMUONPoints *pm;
663
664 fHitsCuts = 0;
665 points = Phits();
666 if (!points) return;
667 ntracks = points->GetEntriesFast();
668 for (track=0;track<ntracks;track++) {
669 pm = (AliMUONPoints*)points->UncheckedAt(track);
670 if (!pm) continue;
671 pm->Draw();
672 fHitsCuts += pm->GetN();
673 }
674}
675
676
677//_____________________________________________________________________________
678void AliMUONDisplay::DrawCoG()
679{
5398f946 680/// Draw hits for MUON chambers
681
a9e2aefa 682 if (!fDrawCoG) return;
683 if (fChamber > 10) return;
684 LoadCoG(fChamber,fCathode);
685
686 Int_t ncog, icog;
687 TObjArray *points;
688 AliMUONPoints *pm;
689
690 points = Rpoints();
691 if (!points) return;
692 ncog = points->GetEntriesFast();
693 for (icog=0;icog<ncog;icog++) {
694 pm = (AliMUONPoints*)points->UncheckedAt(icog);
695 if (!pm) continue;
696 pm->Draw();
697 }
698}
a9e2aefa 699//_____________________________________________________________________________
572d5bb2 700void AliMUONDisplay::DrawTracks()
701{
5398f946 702/// Draw tracks
703
572d5bb2 704 if (!fDrawTracks) return;
705 LoadTracks();
706
707 Int_t nTrack, iTrack;
708 TObjArray *points;
709 TPolyLine3D *pm;
710
711 points = Rpoints();
712 if (!points) return;
713 nTrack = points->GetEntriesFast();
714 for ( iTrack = 0; iTrack < nTrack; iTrack++) {
715 pm = (TPolyLine3D*)points->UncheckedAt(iTrack);
716 if (!pm) continue;
717 pm->Draw();
718 }
719}
720//_____________________________________________________________________________
a9e2aefa 721
722void AliMUONDisplay::DrawTitle(Option_t *option)
723{
5398f946 724/// Draw the event title
a9e2aefa 725
726 Float_t xmin = gPad->GetX1();
727 Float_t xmax = gPad->GetX2();
728 Float_t ymin = gPad->GetY1();
729 Float_t ymax = gPad->GetY2();
730 Float_t dx = xmax-xmin;
731 Float_t dy = ymax-ymin;
732
30178c30 733 AliRunLoader * runLoader;
307d9d04 734 if (fLoader)
30178c30 735 runLoader = fLoader->GetRunLoader();
307d9d04 736 else
30178c30 737 runLoader = 0x0;
7985603c 738
739
a9e2aefa 740 if (strlen(option) == 0) {
741 TPaveText *title = new TPaveText(xmin +0.01*dx, ymax-0.09*dy, xmin +0.5*dx, ymax-0.01*dy);
742// title->SetTextSize(0.023932);
743 title->SetTextSize(0.02);
744 title->SetBit(kCanDelete);
745 title->SetFillColor(42);
746 title->Draw();
747 char ptitle[100];
748 sprintf(ptitle, "Alice event:%d Run:%d Chamber:%d Cathode:%d",
30178c30 749 runLoader->GetEventNumber(),
a9e2aefa 750 gAlice->GetHeader()->GetRun(),
751 fChamber,
752 fCathode);
753 title->AddText(ptitle);
5d12ce38 754 Int_t nparticles = gAlice->GetMCApp()->Particles()->GetEntriesFast();
a9e2aefa 755 sprintf(ptitle,"Nparticles = %d Nhits = %d Npads fired = %d",
756 nparticles, fHitsCuts,fClustersCuts);
757 title->AddText(ptitle);
758 } else {
759 TPaveLabel *label = new TPaveLabel(xmin +0.01*dx, ymax-0.07*dy, xmin +0.2*dx, ymax-0.01*dy,option);
760 label->SetBit(kCanDelete);
761 label->SetFillColor(42);
762 label->Draw();
763 }
764}
765
766//_____________________________________________________________________________
767void AliMUONDisplay::DrawView(Float_t theta, Float_t phi, Float_t psi)
768{
5398f946 769/// Draw a view of MUON clusters
770
98944e1e 771 AliInfo(" Draw View");
772
773 gPad->SetCursor(kWatch);
774 // gPad->SetFillColor(39);
775 gPad->SetFillColor(1);
776 gPad->Clear();
777 // gPad->SetFillColor(39);
778 gPad->SetFillColor(1);
779
780 Int_t iret=0;
781 TView *view = new TView(1);
782
783 Float_t range = fRrange*fRangeSlider->GetMaximum();
784 view->SetRange(-range,-range,-range,range, range, range);
785 // zoom back to full scale only if DrawView not called from NextCathode
786 if (!fNextCathode) {
787 fZoomX0[0] = -1;
788 fZoomY0[0] = -1;
789 fZoomX1[0] = 1;
790 fZoomY1[0] = 1;
791 fZooms = 0;
792 }
793
794 Float_t xg1, xg2, yg1, yg2, zg1, zg2;
795
796 // Recovering the chamber
797 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
798
799 const AliMUONGeometryTransformer* kGeomTransformer
800 = pMUON->GetGeometryTransformer();
801
802 AliMUONSegmentation* segmentation = pMUON->GetSegmentation();
803 AliMpSegFactory segFactory;
804 // Mapping segmentation factory will be used only to create mapping
7502d0e5 805 // segmentations if not present in the DE segmentations
98944e1e 806
807 // Display MUON Chamber Geometry
808 char nodeName[7];
809 sprintf(nodeName,"MUON%d",100+fChamber);
810 printf(">>>> chamber is %d\n",fChamber);
811
812 if(fChamber < 5) {
813 AliMpDEIterator it;
814 for ( it.First(fChamber-1); ! it.IsDone(); it.Next() ) {
815
816 Int_t detElemId = it.CurrentDE();
817 AliMpSectorSegmentation * seg =
818 (AliMpSectorSegmentation *) segmentation->GetMpSegmentation(detElemId, 0);
819 const AliMpSector * sector = seg->GetSector();
820
821 // get sector measurements
822 TVector2 position = sector->Position();
823 TVector2 dimension = sector->Dimensions(); // half length
824
825 Float_t xlocal1 = position.Px(); // FIXME: not really needed as it's 0 ?
826 Float_t ylocal1 = position.Py(); // FIXME: not really needed as it's 0 ?
827 Float_t xlocal2 = dimension.Px() * 2.;
828 Float_t ylocal2 = dimension.Px() * 2.;
829
830 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
831 kGeomTransformer->Local2Global(detElemId, xlocal2, ylocal2, 0, xg2, yg2, zg2);
832
833 // drawing
834 TPolyLine3D* poly = new TPolyLine3D();
835 Int_t nPoint = 0;
836
837 poly->SetPoint(nPoint++, xg1, yg1, 0.);
838 for (Float_t d = 0; d < TMath::Pi()/2.; d+= 0.01) {
839 Float_t x = xg1 + xg2 * TMath::Cos(d);
840 Float_t y = yg1 + yg2 * TMath::Sin(d);
841 poly->SetPoint(nPoint++, x, y, 0.);
123469eb 842 }
98944e1e 843 poly->SetPoint(nPoint++, xg1, yg1, 0.);
844
845 poly->SetLineColor(2);
846 poly->Draw("s");
e0d2f4db 847 }
848
98944e1e 849 }
850
851 if (fChamber>4)
852 {
853 AliMpDEIterator it;
854 for ( it.First(fChamber-1); ! it.IsDone(); it.Next() )
855 {
856 Int_t detElemId = it.CurrentDE();
857 AliMpStationType stationType = AliMpDEManager::GetStationType(detElemId);
858
859 if ( segmentation->HasDE(detElemId) )
860 {
861 const AliMpVSegmentation* seg = segmentation->GetMpSegmentation(detElemId, 0);
862 if (!seg) {
863 // Create mapping segmentation if old trigger segmentation
864 // (not using mapping)
865 seg = segFactory.CreateMpSegmentation(detElemId, 0);
866 }
867 if (seg)
868 {
869 Float_t deltax = seg->Dimensions().X();
870 Float_t deltay = seg->Dimensions().Y();
871 Float_t xlocal1 = -deltax;
872 Float_t ylocal1 = -deltay;
873 Float_t xlocal2 = +deltax;
874 Float_t ylocal2 = +deltay;
875 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
876 kGeomTransformer->Local2Global(detElemId, xlocal2, ylocal2, 0, xg2, yg2, zg2);
877
878 // drawing slat active volumes
879 Float_t xCenter = (xg1 + xg2)/2.;
880 Float_t yCenter = (yg1 + yg2)/2.;
881
882 TMarker3DBox* box = new TMarker3DBox(xCenter,yCenter,0,xlocal1,ylocal2,0,0,0);
883
884 box->SetFillStyle(0);
885 box->SetLineColor( stationType == kStationTrigger ? 4 : 2);
886 box->Draw("s");
887
888 if ( stationType == kStation345 )
889 {
890 // drawing inner circle + disc
891 TPolyLine3D* poly = new TPolyLine3D();
892 TPolyLine3D* poly1 = new TPolyLine3D();
893
894 Int_t nPoint = 0;
895 Int_t nPoint1 = 0;
896 for (Float_t d = 0; d < 6.24; d+= 0.005)
897 {
898 Double_t x = AliMUONConstants::Dmin((fChamber-1)/2) * TMath::Cos(d)/2.;
899 Double_t y = AliMUONConstants::Dmin((fChamber-1)/2) * TMath::Sin(d)/2.;
900 if (nPoint % 2 == 0) poly->SetPoint(nPoint++, 0., 0., 0.);
901 poly->SetPoint(nPoint++, x, y, 0.);
902 poly1->SetPoint(nPoint1++, x, y, 0.);
903 }
904 poly->SetLineColor(1);
905 poly->Draw("s");
906 poly1->SetLineColor(2);
907 poly1->Draw("s");
908 }
909 }
e0d2f4db 910 }
911 }
98944e1e 912 }
913
914// // Delete mapping segmentations created with factory
915// segFactory.DeleteSegmentations();
916
917 //add clusters to the pad
918 DrawClusters();
919 DrawHits();
920 DrawCoG();
921 // DrawSegmentation();
922 // add itself to the list (must be last)
923 AppendPad();
924 view->SetView(phi, theta, psi, iret);
a9e2aefa 925}
926
572d5bb2 927//_____________________________________________________________________________
928void AliMUONDisplay::DrawGlobalView(Float_t theta, Float_t phi, Float_t psi)
929{
5398f946 930/// Draw a view of muons chambers with tracks
572d5bb2 931
932 gPad->SetCursor(kWatch);
933 // gPad->SetFillColor(39);
934 gPad->SetFillColor(1);
935 gPad->Clear();
936 // gPad->SetFillColor(39);
937 gPad->SetFillColor(1);
938
939
940 Int_t iret=0;
941 TView *view = new TView(1);
942
943 Float_t range = fRrange*fRangeSlider->GetMaximum()*3.;
944 view->SetRange(-range,-range,-range,range,range,range);
945
946// Display all MUON Chambers segmentation
947 char nodeName[7];
948 TNode *node1;
949 sprintf(nodeName,"alice");
950
951 node1=gAlice->GetGeometry()->GetNode(nodeName);
952 if (node1) node1->Draw("same");
953
954
955// Draw clusters for all chambers
956 Int_t chamberSave = fChamber;
957 for (fChamber = 1; fChamber <= 10; fChamber++){
958 DrawCoG();
959 }
960 fChamber = chamberSave;
961// Draw reconstructed tracks
962 DrawTracks();
963
964 AppendPad();
965
966 Float_t zoom = 2.;
967 Float_t shift = 0.9;
968 Float_t x0 = (-1+shift)/zoom;
969 Float_t y0 = (-1+shift)/zoom;
970 Float_t x1 = (1+shift)/zoom;
971 Float_t y1 = (1+shift)/zoom;
972 gPad->Range(x0,y0,x1,y1);
973 view->SetView(phi, theta, psi, iret);
974
975}
a9e2aefa 976
977//______________________________________________________________________________
978void AliMUONDisplay::ExecuteEvent(Int_t event, Int_t px, Int_t py)
979{
5398f946 980/// Execute action corresponding to the mouse event
a9e2aefa 981
982 static Float_t x0, y0, x1, y1;
983
984 static Int_t pxold, pyold;
985 static Int_t px0, py0;
986 static Int_t linedrawn;
987 Float_t temp;
988
989 if (px == 0 && py == 0) { //when called by sliders
990 if (event == kButton1Up) {
991 Draw();
992 }
993 return;
994 }
995 if (!fZoomMode && gPad->GetView()) {
996 gPad->GetView()->ExecuteRotateView(event, px, py);
997 return;
998 }
999
1000 // something to zoom ?
1001 gPad->SetCursor(kCross);
1002
1003 switch (event) {
1004
1005 case kButton1Down:
1006 gVirtualX->SetLineColor(-1);
1007 gPad->TAttLine::Modify(); //Change line attributes only if necessary
1008 x0 = gPad->AbsPixeltoX(px);
1009 y0 = gPad->AbsPixeltoY(py);
1010 px0 = px; py0 = py;
1011 pxold = px; pyold = py;
1012 linedrawn = 0;
1013 return;
1014
1015 case kButton1Motion:
1016 if (linedrawn) gVirtualX->DrawBox(px0, py0, pxold, pyold, TVirtualX::kHollow);
1017 pxold = px;
1018 pyold = py;
1019 linedrawn = 1;
1020 gVirtualX->DrawBox(px0, py0, pxold, pyold, TVirtualX::kHollow);
1021 return;
1022
1023 case kButton1Up:
1024 gPad->GetCanvas()->FeedbackMode(kFALSE);
1025 if (px == px0) return;
1026 if (py == py0) return;
1027 x1 = gPad->AbsPixeltoX(px);
1028 y1 = gPad->AbsPixeltoY(py);
1029
1030 if (x1 < x0) {temp = x0; x0 = x1; x1 = temp;}
1031 if (y1 < y0) {temp = y0; y0 = y1; y1 = temp;}
1032 gPad->Range(x0,y0,x1,y1);
97ccf8cb 1033 if (fZooms < AliMUONConstants::MaxZoom()-1) {
a9e2aefa 1034 fZooms++;
1035 fZoomX0[fZooms] = x0;
1036 fZoomY0[fZooms] = y0;
1037 fZoomX1[fZooms] = x1;
1038 fZoomY1[fZooms] = y1;
1039 }
1040 gPad->Modified(kTRUE);
1041 return;
1042 }
1043}
1044
1045//___________________________________________
1046void AliMUONDisplay::LoadDigits(Int_t chamber, Int_t cathode)
1047{
5398f946 1048/// Read digits info and store x,y,z info in arrays fPoints.
1049/// Loop on all detectors
a9e2aefa 1050
1051 if (chamber > 14) return;
08a636a8 1052 fChamber = chamber;
1053 fCathode = cathode;
a9e2aefa 1054
1055 ResetPoints();
1056
08a636a8 1057 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
1169bc87 1058
d226f81b 1059 GetMUONData()->SetTreeAddress("D");
a9e2aefa 1060
d226f81b 1061 TClonesArray *muonDigits = GetMUONData()->Digits(chamber-1);
a9e2aefa 1062 if (muonDigits == 0) return;
1063
d226f81b 1064 gAlice->ResetDigits();
00f56532 1065 Int_t nent = 0;
1066
1169bc87 1067 if (GetLoader()->TreeD()) {
1068 nent = (Int_t) GetLoader()->TreeD()->GetEntries();
1069 // gAlice->TreeD()->GetEvent(nent-2+cathode-1);
1070 GetMUONData()->GetDigits();
00f56532 1071 }
1072
1169bc87 1073 Int_t ndigits = muonDigits->GetEntriesFast();
a9e2aefa 1074 if (ndigits == 0) return;
1075 if (fPoints == 0) fPoints = new TObjArray(ndigits);
1076
b7ef3c96 1077 Float_t zpos = AliMUONConstants::DefaultChamberZ(chamber-1);
08a636a8 1078
a9e2aefa 1079 AliMUONDigit *mdig;
08a636a8 1080 AliMUONPoints *points = 0;
1081 TMarker3DBox *marker = 0;
1169bc87 1082
08a636a8 1083 Int_t npoints = 1;
7e4a628d 1084 Float_t adcmax = 1024; // default
1085 if (chamber<11) adcmax = 4096;
a9e2aefa 1086
1169bc87 1087// check if trigger is using new or old segmentation
1088 Bool_t old = true;
1089 AliMUONSegmentation* segmentation = pMUON->GetSegmentation();
1090 if ( segmentation->GetMpSegmentation(1100, cathode-1) ) old = false;
a9e2aefa 1091
1169bc87 1092 if ( old && chamber > 10) {
1093 if (chamber > 10) printf(">>> old segmentation for trigger \n");
1094 else printf(">>> old segmentation for tracking \n");
76dadf7e 1095
1169bc87 1096 for (Int_t digit = 0; digit < ndigits; digit++) {
1097 mdig = (AliMUONDigit*)muonDigits->UncheckedAt(digit);
1098 if (mdig->Cathode() != cathode-1) continue;
1099
1100 //
1101 // First get all needed parameters
1102 //
1103 Int_t charge = mdig->Signal();
1104 Int_t index = Int_t(TMath::Log(charge)/(TMath::Log(adcmax)/22));
1105 Int_t color = 261+index;
1106 Int_t colorTrigger = 2;
1107 if (color > 282) color = 282;
1108
1109 if (chamber > 10) { // trigger chamber
1110
1111 Int_t sumCharge = 0;
1112 for (Int_t icharge = 0; icharge < 10; icharge++) {
1113 sumCharge = sumCharge+mdig->TrackCharge(icharge);
1114 }
1115 Int_t testCharge = sumCharge-(Int_t(sumCharge/10))*10;
1116 if(sumCharge <= 10 || testCharge > 0) {
1117 colorTrigger = color;
1118 } else {
1119 colorTrigger = 5;
1120 }
1121 }
1122
1123 // get the center of the pad - add on x and y half of pad size
1124 Float_t xpad, ypad, zpad;
1125 Int_t isec;
1126 Float_t dpx, dpy;
1127
1128 Int_t detElemId = mdig->DetElemId();
c2a43efa 1129 AliMUONGeometrySegmentation* segmentation2
1130 = pMUON->GetSegmentation()->GetModuleSegmentationByDEId(detElemId, cathode-1);
1169bc87 1131 segmentation2->GetPadC(detElemId, mdig->PadX(), mdig->PadY(), xpad, ypad, zpad);
1132 isec = segmentation2->Sector(detElemId, mdig->PadX(), mdig->PadY());
1133 dpx = segmentation2->Dpx(detElemId, isec)/2;
1134 dpy = segmentation2->Dpy(detElemId, isec)/2;
1135
1136 // Then set the objects
1137 points = new AliMUONPoints(npoints);
1138 fPoints->AddAt(points,digit);
1139 if (chamber > 10) {
1140 points->SetMarkerColor(colorTrigger);
1141 } else {
1142 points->SetMarkerColor(color);
1143 }
1144 points->SetMarkerStyle(21);
1145 points->SetMarkerSize(0.5);
1146 points->SetParticle(-1);
1147 points->SetHitIndex(-1);
1148 points->SetTrackIndex(-1);
1149 points->SetDigitIndex(digit);
1150 points->SetPoint(0,xpad,ypad,zpos);
1151
1152 Int_t lineColor = (zpad-zpos > 0) ? 2:3;
1153 marker=new TMarker3DBox(xpad,ypad,zpos,dpx,dpy,0,0,0);
1154
1155
1156 marker->SetLineColor(lineColor);
1157 marker->SetFillStyle(1001);
1158 marker->SetFillColor(color);
1159 marker->SetRefObject((TObject*)points);
1160 points->Set3DMarker(0, marker);
1161 } // end loop on digits
a9e2aefa 1162
1169bc87 1163 } else {
1164 if (chamber > 10) printf(">>> new segmentation for trigger \n");
1165 else printf(">>> new segmentation for tracking \n");
4554f81d 1166
1169bc87 1167 const AliMUONGeometryTransformer* kGeomTransformer
1168 = pMUON->GetGeometryTransformer();
1169
1170 //loop over all digits and store their position
1171 for (Int_t digit = 0; digit < ndigits; digit++) {
1172 mdig = (AliMUONDigit*)muonDigits->UncheckedAt(digit);
1173 if (mdig->Cathode() != cathode-1) continue;
08a636a8 1174
1169bc87 1175 // get all needed parameters
1176 Int_t ix=mdig->PadX();
1177 Int_t iy=mdig->PadY();
1178 Int_t detElemId=mdig->DetElemId();
1179 Int_t charge = mdig->Signal();
1180 Int_t index = Int_t(TMath::Log(charge)/(TMath::Log(adcmax)/22));
1181 Int_t color = 261+index;
1182 Int_t colorTrigger = 2;
1183 if (color > 282) color = 282;
1184
1185 const AliMpVSegmentation* seg =
1186 pMUON->GetSegmentation()->GetMpSegmentation(detElemId,cathode-1);
1187
98944e1e 1188 AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
1169bc87 1189
1190 if (chamber > 10) { // trigger chamber
1191 Int_t sumCharge = 0;
98944e1e 1192 Int_t n = mdig->Ntracks();
1193 for (Int_t icharge = 0; icharge < n; icharge++) {
1169bc87 1194 sumCharge = sumCharge+mdig->TrackCharge(icharge);
1195 }
98944e1e 1196 assert(sumCharge==mdig->Signal());
1197 Int_t testCharge = sumCharge-(Int_t(sumCharge/n))*n;
1198 if(sumCharge <= n || testCharge > 0) {
1169bc87 1199 colorTrigger = color;
1200 } else {
1201 colorTrigger = 5;
1202 }
1203 }
1204
1205 // get the pad position and dimensions
1206 Float_t xlocal1 = pad.Position().X();
1207 Float_t ylocal1 = pad.Position().Y();
1208 Float_t xlocal2 = pad.Dimensions().X();
1209 Float_t ylocal2 = pad.Dimensions().Y();
1210
1211 Float_t xg1, xg2, yg1, yg2, zg1;
1212
1213 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1214 // (no transformation for pad dimensions)
1215 xg2 = xlocal2;
1216 yg2 = ylocal2;
1217
1218 // Then set the objects
1219 points = new AliMUONPoints(npoints);
1220 fPoints->AddAt(points,digit);
1221 if (chamber > 10) {
1222 points->SetMarkerColor(colorTrigger);
1223 } else {
1224 points->SetMarkerColor(color);
1225 }
1226 points->SetMarkerStyle(21);
1227 points->SetMarkerSize(0.5);
1228 points->SetParticle(-1);
1229 points->SetHitIndex(-1);
1230 points->SetTrackIndex(-1);
1231 points->SetDigitIndex(digit);
1232 points->SetPoint(0,xg1,yg1,zpos);
1233
1234 Int_t lineColor = (zg1-zpos > 0) ? 2:3;
1235 marker=new TMarker3DBox(xg1,yg1,zpos,xg2,yg2,0,0,0);
1236
1237 marker->SetLineColor(lineColor);
1238 marker->SetFillStyle(1001);
1239 marker->SetFillColor(color);
1240 marker->SetRefObject((TObject*)points);
1241 points->Set3DMarker(0, marker);
1242
1243 } // end loop on digits
1244 } // end of new segmentation
a9e2aefa 1245}
1246//___________________________________________
e0875ac1 1247void AliMUONDisplay::LoadCoG(Int_t chamber, Int_t /*cathode*/)
a9e2aefa 1248{
5398f946 1249/// Read raw clusters info and store x,y,z info in arrays fRpoints.
1250/// Loop on all detectors
a9e2aefa 1251
1252 if (chamber > 10) return;
1253
1254 ResetRpoints();
1255
d226f81b 1256 GetMUONData()->SetTreeAddress("RC");
1257 TClonesArray *muonRawClusters = GetMUONData()->RawClusters(chamber-1);
a9e2aefa 1258
7985603c 1259 if (muonRawClusters == 0) return;
a9e2aefa 1260
00f56532 1261 Int_t nent = 0;
d226f81b 1262 if (GetMUONData()->TreeR()) {
1263 nent=(Int_t) GetMUONData()->TreeR()->GetEntries();
1264 GetMUONData()->TreeR()->GetEvent(0);
00f56532 1265 }
1266
a9e2aefa 1267 Int_t nrawcl = muonRawClusters->GetEntriesFast();
1268 if (nrawcl == 0) return;
d226f81b 1269 if (fRpoints == 0) fRpoints = new TObjArray(nrawcl);
a9e2aefa 1270
b7ef3c96 1271 Float_t zpos = AliMUONConstants::DefaultChamberZ(chamber-1);
a9e2aefa 1272 AliMUONRawCluster *mRaw;
1273 AliMUONPoints *points = 0;
1274 //
1275 //loop over all raw clusters and store their position
1276 points = new AliMUONPoints(nrawcl);
1277 for (Int_t iraw=0;iraw<nrawcl;iraw++) {
1278 mRaw = (AliMUONRawCluster*)muonRawClusters->UncheckedAt(iraw);
a9e2aefa 1279 points->SetMarkerColor(51);
1280 points->SetMarkerStyle(2);
1281 points->SetMarkerSize(1.);
1282 points->SetParticle(-1);
1283 points->SetHitIndex(-1);
1284 points->SetTrackIndex(-1);
1285 points->SetDigitIndex(-1);
ba12c242 1286 points->SetPoint(iraw,mRaw->GetX(0),mRaw->GetY(0),zpos);
d226f81b 1287 fRpoints->AddAt(points,iraw);
ba12c242 1288 // printf("%f and %f and %f\n",mRaw->GetX(0),mRaw->GetY(0),mRaw->GetZ(0));
a9e2aefa 1289 }
1290}
572d5bb2 1291
1292//___________________________________________
1293void AliMUONDisplay::LoadTracks()
1294{
5398f946 1295/// Load tracks
1296
572d5bb2 1297 AliMUONTrack* recTrack = 0;
1298 AliMUONTrackParam* trackParam = 0;
1299 TClonesArray * trackParamAtHit = 0;
1300
1301 ResetRpoints();
1302
1303 GetMUONData()->SetTreeAddress("RT");
1304 TClonesArray* recTracksArray = GetMUONData()->RecTracks();
1305 if (recTracksArray == NULL) return;
1306 GetMUONData()->GetRecTracks();
1307
1308 Int_t nRecTracks = 0;
1309 if (recTracksArray)
1310 nRecTracks = (Int_t) recTracksArray->GetEntriesFast();
1311
1312
1313 if (fRpoints == 0) fRpoints = new TObjArray(nRecTracks);
1314
1315 for (Int_t iRecTracks = 0; iRecTracks < nRecTracks; iRecTracks++) {
1316 // reading info from tracks
1317 recTrack = (AliMUONTrack*) recTracksArray->At(iRecTracks);
1318
1319 Int_t nTrackHits = recTrack->GetNTrackHits();
1320
1321 if (nTrackHits == 0) continue;
1322
1323 Int_t iPoint = 0;
1324 TPolyLine3D *points = new TPolyLine3D(nTrackHits+1);
1325 points->SetLineColor(6);
1326 points->SetLineWidth(1);
1327 fRpoints->AddAt(points,iRecTracks);
1328
1329 Float_t xRec=0;
1330 Float_t yRec=0;
1331 Float_t zRec=0;
1332
1333 trackParam = recTrack->GetTrackParamAtVertex();
1334 xRec = trackParam->GetNonBendingCoor();
1335 yRec = trackParam->GetBendingCoor();
1336 zRec = trackParam->GetZ();
1337 points->SetPoint(iPoint,xRec,yRec,zRec);
1338 iPoint++;
1339
1340 for (Int_t iHit = 0; iHit < nTrackHits; iHit++){
1341 trackParamAtHit = recTrack->GetTrackParamAtHit();
1342 trackParam = (AliMUONTrackParam*) trackParamAtHit->At(iHit);
1343 xRec = trackParam->GetNonBendingCoor();
1344 yRec = trackParam->GetBendingCoor();
1345 zRec = trackParam->GetZ();
1346 points->SetPoint(iPoint,xRec,yRec,zRec);
1347 iPoint++;
1348 } // end loop rec. hits
1349 PrintTrack(iRecTracks,recTrack);
1350 } // end loop tracks
1351
1352
1353}
1354
5398f946 1355//___________________________________________
572d5bb2 1356void AliMUONDisplay::PrintTrack(Int_t iRecTracks, AliMUONTrack *recTrack)
1357{
5398f946 1358/// Print reconstructed track
1359
572d5bb2 1360 AliMUONTrackParam *trackParam;
1361 Float_t vertex[3], momentum[3];
1362 Float_t pYZ, bendingSlope, nonBendingSlope, chi2dof;
1363 Int_t charge;
1364
1365 trackParam = recTrack->GetTrackParamAtVertex();
1366 vertex[0] = trackParam->GetNonBendingCoor();
1367 vertex[1] = trackParam->GetBendingCoor();
1368 vertex[2] = trackParam->GetZ();
1369 pYZ = 1./TMath::Abs(trackParam->GetInverseBendingMomentum());
1370 bendingSlope = trackParam->GetBendingSlope();
1371 nonBendingSlope = trackParam->GetNonBendingSlope();
1372 momentum[2] = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);
1373 momentum[0] = momentum[2] * nonBendingSlope;
1374 momentum[1] = momentum[2] * bendingSlope;
1375 charge = Int_t(TMath::Sign(1.,trackParam->GetInverseBendingMomentum()));
1376 chi2dof = recTrack->GetFitFMin()/(2.0 * recTrack->GetNTrackHits() - 5.);
1377
1378 printf("===================================================\n");
1379 printf(" Reconstructed track # %d \n",iRecTracks);
1380 printf(" charge: %d \n",charge);
1381 printf(" vertex x,y,z (cm): %f %f %f \n",vertex[0],vertex[1],vertex[2]);
1382 printf(" momentum Px,Py,Pz (GeV/c): %f %f %f \n",momentum[0],momentum[1],momentum[2]);
1383 printf(" track chi2/dof: %f \n",chi2dof);
1384
1385}
1386
a9e2aefa 1387//___________________________________________
a9e2aefa 1388void AliMUONDisplay::LoadHits(Int_t chamber)
1389{
5398f946 1390/// Read hits info and store x,y,z info in arrays fPhits.
1391/// Loop on all detectors
a9e2aefa 1392
1393 if (chamber > 14) return;
1394 Int_t track;
1395
1396 fChamber=chamber;
1397
1398 ResetPhits();
1399
b7ef3c96 1400 Float_t zpos=AliMUONConstants::DefaultChamberZ(chamber-1);
c856e086 1401
1402 if (GetMUONData()->TreeH()) {
1403 GetMUONData()->SetTreeAddress("H");
1404 Int_t ntracks = (Int_t)GetMUONData()->TreeH()->GetEntries(); //skowron
1405 Int_t nthits = 0;
1406 for (track = 0; track < ntracks; track++) {
d226f81b 1407 GetMUONData()->ResetHits();
1408 GetMUONData()->GetTrack(track);//skowron
1409 TClonesArray *muonHits = GetMUONData()->Hits();
a9e2aefa 1410 if (muonHits == 0) return;
1411 nthits += muonHits->GetEntriesFast();
c856e086 1412 }
1413 if (fPhits == 0) fPhits = new TObjArray(nthits);
1414 Int_t nhold=0;
1415 for (track=0; track<ntracks;track++) {
d226f81b 1416 GetMUONData()->ResetHits();
1417 GetMUONData()->GetTrack(track);//skowron
1418 TClonesArray *muonHits = GetMUONData()->Hits();
a9e2aefa 1419 if (muonHits == 0) return;
1420 Int_t nhits = muonHits->GetEntriesFast();
1421 if (nhits == 0) continue;
1422 AliMUONHit *mHit;
1423 AliMUONPoints *points = 0;
1424 Int_t npoints=1;
1425 for (Int_t hit=0;hit<nhits;hit++) {
c856e086 1426 mHit = (AliMUONHit*)muonHits->UncheckedAt(hit);
1427 Int_t nch = mHit->Chamber(); // chamber number
1428 if (nch != chamber) continue;
1429 //
1430 // Retrieve info and set the objects
1431 //
1432 points = new AliMUONPoints(npoints);
1433 fPhits->AddAt(points,nhold+hit);
1434 points->SetMarkerColor(kRed);
1435 points->SetMarkerStyle(5);
1436 points->SetMarkerSize(1.);
1437 points->SetParticle(mHit->Track());
1438 points->SetHitIndex(hit);
1439 points->SetTrackIndex(track);
1440 points->SetDigitIndex(-1);
1441 points->SetPoint(0,mHit->X(),mHit->Y(),zpos);
1442 // printf("%f and %f and %f\n",mHit->X(),mHit->Y(),mHit->Z());
a9e2aefa 1443 }
1444 nhold+=nhits;
c856e086 1445 }
a9e2aefa 1446 }
1447}
1448
1449//_____________________________________________________________________________
1450void AliMUONDisplay::Paint(Option_t *)
1451{
5398f946 1452/// Paint miscellaneous items
a9e2aefa 1453}
1454
1455//_____________________________________________________________________________
1456void AliMUONDisplay::SetPickMode()
1457{
5398f946 1458/// Set parameters for pick mode.
1459
a9e2aefa 1460 fZoomMode = 0;
1461
1462 fArcButton->SetY1(fPickButton->GetYlowNDC()+0.5*fPickButton->GetHNDC());
1463 fTrigPad->Modified();
1464}
1465
1466//_____________________________________________________________________________
1467void AliMUONDisplay::SetZoomMode()
1468{
5398f946 1469/// Set parameters for zoom mode
1470
a9e2aefa 1471 fZoomMode = 1;
1472
1473 fArcButton->SetY1(fZoomButton->GetYlowNDC()+0.5*fZoomButton->GetHNDC());
1474 fTrigPad->Modified();
1475}
1476
1477//_____________________________________________________________________________
1478void AliMUONDisplay::NextChamber(Int_t delta)
1479{
5398f946 1480/// To go from chamber to next chamber if delta = 1
1481/// or previous chamber otherwise
a9e2aefa 1482 if (delta == 1) {
f665c1ea 1483 if (fChamber < AliMUONConstants::NCh()) fChamber++;
a9e2aefa 1484 } else {
1485 if (fChamber > 1) fChamber--;
1486 }
1487 if (!fPad) return;
1488 fPad->Clear();
1489 LoadDigits(fChamber, fCathode);
572d5bb2 1490 DrawChamber();
a9e2aefa 1491}
1492
1493//_____________________________________________________________________________
1494void AliMUONDisplay::NextCathode()
1495{
5398f946 1496/// To switch to other cathode plane
1497
a9e2aefa 1498 if (!fPad) return;
1499 fPad->Clear();
1500 if (fCathode == 1) {
1501 LoadDigits(fChamber, 2);
1502 } else {
1503 LoadDigits(fChamber, 1);
1504 }
1505 fNextCathode = kTRUE; // to keep the same zoom
572d5bb2 1506 DrawChamber();
a9e2aefa 1507 fNextCathode = kFALSE;
1508 TPad *pad = (TPad*)gPad->GetPadSave();
1509 pad->Range(fZoomX0[fZooms], fZoomY0[fZooms],
1510 fZoomX1[fZooms], fZoomY1[fZooms]);
1511 pad->Modified();
1512 fPad->cd();
1513 DrawTitle();
1514}
1515
1516//_____________________________________________________________________________
1517void AliMUONDisplay::Trigger()
1518{
5398f946 1519/// Print global trigger output
52c9bc11 1520
d226f81b 1521 AliMUONGlobalTrigger* globalTrig;
1522
1523 GetMUONData()->SetTreeAddress("GLT");
95e68a13 1524 GetMUONData()->GetTriggerD();
d226f81b 1525
1526 globalTrig = (AliMUONGlobalTrigger*)GetMUONData()->GlobalTrigger()->UncheckedAt(0);
1527 if (globalTrig == 0) return;
1528
eba3379e 1529 globalTrig->Print("full");
d226f81b 1530
1531 // // returns Trigger Decision for current event
1532// AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(GetLoader(),1);
1533
1534// // AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(1);
1535// AliMUONData* muonData = decision->GetMUONData();
1536// muonData->SetTreeAddress("D");
1537// decision->Trigger();
a9e2aefa 1538}
a9e2aefa 1539//_____________________________________________________________________________
1540void AliMUONDisplay::SetChamberAndCathode(Int_t chamber, Int_t cathode)
1541{
5398f946 1542/// Set chamber and cathode number
1543
a9e2aefa 1544 fChamber = chamber;
1545 fCathode = cathode;
1546
1547 if (!fPad) return;
1548 fPad->Clear();
1549 LoadDigits(chamber,cathode);
572d5bb2 1550 DrawChamber();
a9e2aefa 1551}
1552
5398f946 1553//_____________________________________________________________________________
a9e2aefa 1554void AliMUONDisplay::SetEvent(Int_t newevent)
1555{
5398f946 1556/// Chose event
1557
a9e2aefa 1558 gAlice->GetEvent(newevent);
1559 fEvent=newevent;
1560 if (!gAlice->TreeD()) return;
1561 if (!fPad) return;
1562 fPad->Clear();
1563 LoadDigits(fChamber,fCathode);
1564 Draw();
1565}
1566
1567//_____________________________________________________________________________
1568void AliMUONDisplay::SetRange(Float_t rrange, Float_t zrange)
1569{
5398f946 1570/// Set view range along R and Z
1571
a9e2aefa 1572 fRrange = rrange;
1573 fZrange = zrange;
1574
1575 if (!fPad) return;
1576 fPad->Clear();
1577 Draw();
1578}
1579
1580//_____________________________________________________________________________
1581void AliMUONDisplay::SetView(Float_t theta, Float_t phi, Float_t psi)
1582{
5398f946 1583/// Change viewing angles for current event
a9e2aefa 1584
1585 fPad->cd();
1586 fPhi = phi;
1587 fTheta = theta;
1588 fPsi = psi;
1589 Int_t iret = 0;
1590
1591 TView *view = gPad->GetView();
1592 if (view) view->SetView(fPhi, fTheta, fPsi, iret);
1593 else Draw();
1594 gPad->Modified();
1595}
1596
1597//_____________________________________________________________________________
1598void AliMUONDisplay::ShowNextEvent(Int_t delta)
1599{
5398f946 1600/// Display (current event_number + delta)
1601/// - delta = 1 shown next event
1602/// - delta = -1 show previous event
1603
30178c30 1604 AliRunLoader * runLoader;
307d9d04 1605 if (fLoader)
30178c30 1606 runLoader = fLoader->GetRunLoader();
307d9d04 1607 else
30178c30 1608 runLoader = 0x0;
1391e633 1609
a9e2aefa 1610 if (delta) {
30178c30 1611 //runLoader->CleanDetectors();
1612 //runLoader->CleanKinematics();
1613 Int_t currentEvent = runLoader->GetEventNumber();
1391e633 1614 Int_t newEvent = currentEvent + delta;
30178c30 1615 runLoader->GetEvent(newEvent);
1391e633 1616 fEvent=newEvent;
a9e2aefa 1617 }
a9e2aefa 1618 LoadDigits(fChamber, fCathode);
1619 fPad->cd();
1620 Draw();
1621}
1622
1623//______________________________________________________________________________
1624void AliMUONDisplay::UnZoom()
1625{
5398f946 1626/// Unzoom
1627
a9e2aefa 1628 if (fZooms <= 0) return;
1629 fZooms--;
1630 TPad *pad = (TPad*)gPad->GetPadSave();
1631 pad->Range(fZoomX0[fZooms],fZoomY0[fZooms], fZoomX1[fZooms],fZoomY1[fZooms]);
1632 pad->Modified();
1633}
1634
1635//_____________________________________________________________________________
1636void AliMUONDisplay::ResetPoints()
1637{
5398f946 1638/// Reset array of points
1639
a9e2aefa 1640 if (fPoints) {
1641 fPoints->Delete();
1642 delete fPoints;
1643 fPoints = 0;
1644 }
1645}
1646//_____________________________________________________________________________
1647void AliMUONDisplay::ResetPhits()
1648{
5398f946 1649/// Reset array of points
1650
a9e2aefa 1651 if (fPhits) {
1652 fPhits->Delete();
1653 delete fPhits;
1654 fPhits = 0;
1655 }
1656}
1657//_____________________________________________________________________________
1658void AliMUONDisplay::ResetRpoints()
1659{
5398f946 1660/// Reset array of points
1661
d226f81b 1662 if (fRpoints) {
1663 fRpoints->Clear();
1664 // delete fRpoints;
1665 fRpoints = 0;
a9e2aefa 1666 }
1667}