1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 Revision 1.8 1999/09/29 09:24:23 fca
19 Introduction of the Copyright and cvs Log
24 //////////////////////////////////////////////////////////////////////////
28 // Utility class to display ALICE outline, tracks, hits,.. //
30 //////////////////////////////////////////////////////////////////////////
39 #include <TPolyMarker3D.h>
40 #include <TPaveLabel.h>
41 #include <TPaveText.h>
48 #include <TSliderBox.h>
50 #include <TVirtualX.h>
53 #include <X3DBuffer.h>
56 #include "AliDetector.h"
58 #include "AliMUONConst.h"
59 #include "AliMUONdisplay.h"
60 #include "AliMUONpoints.h"
61 #include "TParticle.h"
65 ClassImp(AliMUONdisplay)
68 //_____________________________________________________________________________
69 AliMUONdisplay::AliMUONdisplay()
79 //_____________________________________________________________________________
80 AliMUONdisplay::AliMUONdisplay(Int_t size)
82 // Create an event display object.
83 // A canvas named "edisplay" is created with a vertical size in pixels
85 // A QUICK Overview of the Event Display functions
86 // ===============================================
88 // The event display can ve invoked by executing the macro "display.C"
89 // A canvas like in the picture below will appear.
91 // On the left side of the canvas, the following buttons appear:
92 // *Next* to move to the next event
93 // *Previous* to move to the previous event
95 // *Pick* Select this option to be able to point on a track with the
96 // mouse. Once on the track, use the right button to select
97 // an action. For example, select SetMarkerAttributes to
98 // change the marker type/color/size for the track.
99 // *Zoom* Select this option (default) if you want to zoom.
100 // To zoom, simply select the selected area with the left button.
101 // *UnZoom* To revert to the previous picture size.
103 // slider R On the left side, the vertical slider can be used to
104 // set the default picture size.
106 // When you are in Zoom mode, you can click on the black part of the canvas
107 // to select special options with the right mouse button.
110 // When you are in pick mode, you can "Inspect" the object pointed by the mouse.
111 // When you are on a track, select the menu item "InspectParticle"
112 // to display the current particle attributes.
114 // You can activate the Root browser by selecting the Inspect menu
115 // in the canvas tool bar menu. Then select "Start Browser"
116 // This will open a new canvas with the browser. At this point, you may want
117 // to display some histograms (from the Trees). Go to the "File" menu
118 // of the browser and click on "New canvas".
119 // In the browser, click on item "ROOT files" in the left pane.
120 // Click on galice.root.
122 // Click on TPC for example
123 // Click on any variable (eg TPC.fX) to histogram the variable.
125 // If you are lost, you can click on HELP in any Root canvas or browser.
128 <img src="gif/aliMUONdisplay.gif">
135 gAlice->SetDisplay(this);
137 // Initialize display default parameters
139 // Set front view by default
146 fDrawClusters = kTRUE;
149 fDrawCathCor = kTRUE;
160 // Create display canvas
162 if (ysize < 100) ysize = 750;
163 Int_t xsize = Int_t(size*830./ysize);
164 fCanvas = new TCanvas("Canvas", "MUON Clusters Display",14,47,xsize,ysize);
165 fCanvas->SetEditable(kFALSE);
166 fCanvas->ToggleEventStatus();
168 // Create main display pad
169 fPad = new TPad("viewpad", "MUON display",0.15,0,0.9,1);
172 fPad->SetFillColor(1);
173 fPad->SetBorderSize(2);
178 fColPad = new TPad("colpad", "Colors pad",0.9,0,1,1);
181 fColPad->SetFillColor(19);
182 fColPad->SetBorderSize(2);
188 // Create user interface control pad
192 // Create Range and mode pad
195 fTrigPad = new TPad("trigger", "range and mode pad",0,0,dxtr,dytr);
198 fTrigPad->SetFillColor(22);
199 fTrigPad->SetBorderSize(2);
200 fRangeSlider = new TSlider("range","range",0.7,0.42,0.9,0.98);
201 fRangeSlider->SetObject(this);
202 char pickmode[] = "gAlice->Display()->SetPickMode()";
204 fPickButton = new TButton("Pick",pickmode,0.05,0.32,0.65,0.32+db);
205 fPickButton->SetFillColor(38);
207 char zoommode[] = "gAlice->Display()->SetZoomMode()";
208 fZoomButton = new TButton("Zoom",zoommode,0.05,0.21,0.65,0.21+db);
209 fZoomButton->SetFillColor(38);
211 fArcButton = new TArc(.8,fZoomButton->GetYlowNDC()+0.5*db,0.33*db);
212 fArcButton->SetFillColor(kGreen);
214 char butUnzoom[] = "gAlice->Display()->UnZoom()";
215 TButton *button = new TButton("UnZoom",butUnzoom,0.05,0.05,0.95,0.15);
216 button->SetFillColor(38);
218 AppendPad(); // append display object as last object to force selection
225 //_____________________________________________________________________________
226 AliMUONdisplay::~AliMUONdisplay()
228 // Delete space point structure
229 if (fPoints) fPoints->Delete();
233 if (fPhits) fPhits->Delete();
237 if (fRpoints) fRpoints->Delete();
241 if (fR2points) fR2points->Delete();
245 if (fCpoints) fCpoints->Delete();
250 //_____________________________________________________________________________
251 void AliMUONdisplay::Clear(Option_t *)
253 // Delete graphics temporary objects
256 //_____________________________________________________________________________
257 void AliMUONdisplay::DisplayButtons()
259 // Create the user interface buttons
262 fButtons = new TPad("buttons", "newpad",0,0.45,0.15,1);
264 fButtons->SetFillColor(38);
265 fButtons->SetBorderSize(2);
268 // Int_t butcolor = 33;
269 Float_t dbutton = 0.08;
276 char but1[] = "gAlice->Display()->ShowNextEvent(1)";
277 button = new TButton("Next",but1,x0,y-dbutton,x1,y);
278 button->SetFillColor(38);
282 char but2[] = "gAlice->Display()->ShowNextEvent(-1)";
283 button = new TButton("Previous",but2,x0,y-dbutton,x1,y);
284 button->SetFillColor(38);
288 char but3[] = "gAlice->Display()->SetChamberAndCathode(1,1)";
289 button = new TButton("Cham&Cath",but3,x0,y-dbutton,x1,y);
290 button->SetFillColor(butcolor);
294 TDiamond *diamond = new TDiamond(0.05,0.015,0.95,0.22);
295 diamond->SetFillColor(50);
296 diamond->SetTextAlign(22);
297 diamond->SetTextColor(5);
298 diamond->SetTextSize(0.11);
300 diamond->AddText(".. ");
301 diamond->AddText("ROOT");
302 diamond->AddText("MUON");
303 diamond->AddText("... ");
304 diamond->AddText(" ");
307 //_____________________________________________________________________________
308 void AliMUONdisplay::CreateColors()
310 // Create the colors palette used to display clusters
325 new TColor(color,r,g,b);
335 new TColor(color,r,g,b);
345 new TColor(color,r,g,b);
355 new TColor(color,r,g,b);
365 new TColor(color,r,g,b);
374 //_____________________________________________________________________________
375 void AliMUONdisplay::DisplayColorScale()
380 Float_t xlow, ylow, xup, yup, hs;
381 Float_t x1, y1, x2, y2;
385 gPad->SetFillColor(0);
387 gPad->Range(x1,y1,x2,y2);
389 TText *text = new TText(0,0,"");
390 text->SetTextFont(61);
391 text->SetTextSize(0.2);
392 text->SetTextAlign(22);
394 AliMUON *MUON = (AliMUON*)gAlice->GetModule("MUON");
395 AliMUONchamber *iChamber = &(MUON->Chamber(fChamber-1));
396 AliMUONresponse * response=iChamber->GetResponseModel();
397 Int_t adcmax= (Int_t) response->MaxAdc();
402 //*-* draw colortable boxes
403 hs = (y2-y1)/Float_t(22);
407 ylow = y1 + hs*(Float_t(i));
408 yup = y1 + hs*(Float_t(i+1));
410 Double_t logscale=Double_t(i+1)*(TMath::Log(adcmax)/22);
411 Int_t scale=(Int_t)TMath::Exp(logscale);
412 sprintf(label,"%d",scale);
413 box = new TBox(xlow, ylow, xup, yup);
414 box->SetFillColor(color);
416 text->DrawText(xup+4, 0.5*(ylow+yup),label);
420 //______________________________________________________________________________
421 Int_t AliMUONdisplay::DistancetoPrimitive(Int_t px, Int_t)
423 // Compute distance from point px,py to objects in event
425 gPad->SetCursor(kCross);
427 if (gPad == fTrigPad) return 9999;
429 const Int_t big = 9999;
431 Float_t xmin = gPad->GetX1();
432 Float_t xmax = gPad->GetX2();
433 Float_t dx = 0.02*(xmax - xmin);
434 Float_t x = gPad->AbsPixeltoX(px);
435 if (x < xmin+dx || x > xmax-dx) return dist;
437 if (fZoomMode) return 0;
441 //_____________________________________________________________________________
442 void AliMUONdisplay::Draw(Option_t *)
444 // Display current event
448 DrawView(fTheta, fPhi, fPsi);
449 // Display the event number and title
455 //_____________________________________________________________________________
456 void AliMUONdisplay::DrawClusters()
458 // Draw clusterss for MUON chambers
460 Int_t ndigits, digit;
468 ndigits = points->GetEntriesFast();
469 for (digit=0;digit<ndigits;digit++){
470 pm = (AliMUONpoints*)points->UncheckedAt(digit);
474 for (Int_t im=0;im<3;im++) {
475 TMarker3DBox *marker=pm->GetMarker(im);
480 fClustersCuts +=pm->GetN();
485 //_____________________________________________________________________________
486 void AliMUONdisplay::DrawHits()
488 // Draw hits for MUON chambers
492 Int_t ntracks, track;
499 ntracks = points->GetEntriesFast();
500 for (track=0;track<ntracks;track++) {
501 pm = (AliMUONpoints*)points->UncheckedAt(track);
504 fHitsCuts += pm->GetN();
509 //_____________________________________________________________________________
510 void AliMUONdisplay::DrawCoG()
512 // Draw hits for MUON chambers
513 if (!fDrawCoG) return;
514 LoadCoG(fChamber,fCathode);
522 ncog = points->GetEntriesFast();
523 for (icog=0;icog<ncog;icog++) {
524 pm = (AliMUONpoints*)points->UncheckedAt(icog);
529 void AliMUONdisplay::DrawCoG2()
531 // Draw hits for MUON chambers
533 if (!fDrawCoG) return;
537 LoadCoG2(fChamber,2);
538 } else if (fCathode==2) {
539 LoadCoG2(fChamber,1);
548 ncog = points->GetEntriesFast();
549 for (icog=0;icog<ncog;icog++) {
550 pm = (AliMUONpoints*)points->UncheckedAt(icog);
556 //_____________________________________________________________________________
557 void AliMUONdisplay::DrawCathCor()
559 // Draw hits for MUON chambers
561 if (!fDrawCathCor) return;
563 LoadCathCor(fChamber);
571 ncog = points->GetEntriesFast();
572 for (icog=0;icog<ncog;icog++) {
573 pm = (AliMUONpoints*)points->UncheckedAt(icog);
578 //_____________________________________________________________________________
579 //_____________________________________________________________________________
580 void AliMUONdisplay::DrawTitle(Option_t *option)
582 // Draw the event title
584 Float_t xmin = gPad->GetX1();
585 Float_t xmax = gPad->GetX2();
586 Float_t ymin = gPad->GetY1();
587 Float_t ymax = gPad->GetY2();
588 Float_t dx = xmax-xmin;
589 Float_t dy = ymax-ymin;
591 if (strlen(option) == 0) {
592 TPaveText *title = new TPaveText(xmin +0.01*dx, ymax-0.09*dy, xmin +0.5*dx, ymax-0.01*dy);
593 title->SetBit(kCanDelete);
594 title->SetFillColor(42);
597 sprintf(ptitle,"Alice event: %d, Run:%d",gAlice->GetHeader()->GetEvent(), gAlice->GetHeader()->GetRun());
598 title->AddText(ptitle);
599 Int_t nparticles = gAlice->Particles()->GetEntriesFast();
600 sprintf(ptitle,"Nparticles = %d Nhits = %d Npads fired = %d",nparticles, fHitsCuts,fClustersCuts);
601 title->AddText(ptitle);
603 TPaveLabel *label = new TPaveLabel(xmin +0.01*dx, ymax-0.07*dy, xmin +0.2*dx, ymax-0.01*dy,option);
604 label->SetBit(kCanDelete);
605 label->SetFillColor(42);
610 //_____________________________________________________________________________
611 void AliMUONdisplay::DrawView(Float_t theta, Float_t phi, Float_t psi)
613 // Draw a view of MUON clusters
615 gPad->SetCursor(kWatch);
616 gPad->SetFillColor(1);
620 TView *view = new TView(1);
622 Float_t range = fRrange*fRangeSlider->GetMaximum();
623 view->SetRange(-range,-range,-range,range, range, range);
630 // Display MUON Chamber Geometry
631 // gAlice->GetGeometry()->Draw("same");
633 sprintf(NodeName,"MUON%d",100+fChamber);
634 printf("Node name %s", NodeName);
636 TNode *node1=gAlice->GetGeometry()->GetNode(NodeName);
637 if (node1) node1->Draw("same");
638 // ok if I rotate the chamber in a proper way
640 //add clusters to the pad
646 // add itself to the list (must be last)
648 view->SetView(phi, theta, psi, iret);
652 //______________________________________________________________________________
653 void AliMUONdisplay::ExecuteEvent(Int_t event, Int_t px, Int_t py)
655 // Execute action corresponding to the mouse event
657 static Float_t x0, y0, x1, y1;
659 static Int_t pxold, pyold;
660 static Int_t px0, py0;
661 static Int_t linedrawn;
664 if (px == 0 && py == 0) { //when called by sliders
665 if (event == kButton1Up) {
670 if (!fZoomMode && gPad->GetView()) {
671 gPad->GetView()->ExecuteRotateView(event, px, py);
675 // something to zoom ?
676 gPad->SetCursor(kCross);
681 gVirtualX->SetLineColor(-1);
682 gPad->TAttLine::Modify(); //Change line attributes only if necessary
683 x0 = gPad->AbsPixeltoX(px);
684 y0 = gPad->AbsPixeltoY(py);
686 pxold = px; pyold = py;
691 if (linedrawn) gVirtualX->DrawBox(px0, py0, pxold, pyold, TVirtualX::kHollow);
695 gVirtualX->DrawBox(px0, py0, pxold, pyold, TVirtualX::kHollow);
699 gPad->GetCanvas()->FeedbackMode(kFALSE);
700 if (px == px0) return;
701 if (py == py0) return;
702 x1 = gPad->AbsPixeltoX(px);
703 y1 = gPad->AbsPixeltoY(py);
705 if (x1 < x0) {temp = x0; x0 = x1; x1 = temp;}
706 if (y1 < y0) {temp = y0; y0 = y1; y1 = temp;}
707 gPad->Range(x0,y0,x1,y1);
708 if (fZooms < kMAXZOOM-1) {
710 fZoomX0[fZooms] = x0;
711 fZoomY0[fZooms] = y0;
712 fZoomX1[fZooms] = x1;
713 fZoomY1[fZooms] = y1;
715 gPad->Modified(kTRUE);
721 //___________________________________________
722 void AliMUONdisplay::LoadDigits(Int_t chamber, Int_t cathode)
724 // Read digits info and store x,y,z info in arrays fPoints
725 // Loop on all detectors
727 if (chamber > 10) return;
734 AliMUON *MUON = (AliMUON*)gAlice->GetModule("MUON");
735 AliMUONchamber* iChamber;
736 AliMUONsegmentation* segmentation;
738 TClonesArray *MUONdigits = MUON->DigitsAddress(chamber-1);
739 if (MUONdigits == 0) return;
741 gAlice->ResetDigits();
743 Int_t nent=(Int_t)gAlice->TreeD()->GetEntries();
744 gAlice->TreeD()->GetEvent(nent-2+cathode-1);
745 //gAlice->TreeD()->GetEvent(cathode);
746 Int_t ndigits = MUONdigits->GetEntriesFast();
747 if (ndigits == 0) return;
748 if (fPoints == 0) fPoints = new TObjArray(ndigits);
750 iChamber = &(MUON->Chamber(chamber-1));
751 segmentation=iChamber->GetSegmentationModel(cathode);
752 //Float_t dpxbig = segmentation->Dpx()/2.;
753 // Float_t dpy = segmentation->Dpy()/2.;
754 Float_t zpos=iChamber->ZPosition();
756 AliMUONpoints *points = 0;
757 TMarker3DBox *marker=0;
760 //loop over all digits and store their position
761 // points = new AliMUONpoints(ndigits);
763 for (Int_t digit=0;digit<ndigits;digit++) {
764 mdig = (AliMUONdigit*)MUONdigits->UncheckedAt(digit);
766 // First get all needed parameters
768 Int_t charge=mdig->fSignal;
769 Int_t index=Int_t(TMath::Log(charge)/(TMath::Log(adc_satm)/22));
770 Int_t color=261+index;
771 if (color>282) color=282;
772 // get the center of the pad - add on x and y half of pad size
774 segmentation->GetPadCxy(mdig->fPadX, mdig->fPadY,xpad, ypad);
775 // printf("xpad,ypad,zpos,dpx,dpy %f %f %f %f %f\n",xpad,ypad,zpos,dpx,dpy);
776 Int_t isec=segmentation->Sector(mdig->fPadX, mdig->fPadY);
777 // printf(" isec %d \n",isec);
778 Float_t dpx=segmentation->Dpx(isec)/2;
779 Float_t dpy=segmentation->Dpy(isec)/2;
780 // printf(" dpx %f \n",dpx);
782 segmentation->GetNParallelAndOffset(mdig->fPadX,mdig->fPadY,
785 // Then set the objects
787 points = new AliMUONpoints(npoints);
788 fPoints->AddAt(points,digit);
790 points->SetMarkerColor(color);
791 points->SetMarkerStyle(21);
792 points->SetMarkerSize(0.5);
793 points->SetParticle(-1);
794 points->SetHitIndex(-1);
795 points->SetTrackIndex(-1);
796 points->SetDigitIndex(digit);
797 points->SetPoint(0,xpad,ypad,zpos);
798 for (Int_t imark=0;imark<nPara; imark++)
800 segmentation->GetPadCxy(mdig->fPadX + imark*offset, mdig->fPadY,xpad, ypad);
801 marker=new TMarker3DBox(xpad,ypad,zpos,dpx,dpy,0,0,0);
802 marker->SetLineColor(2);
803 marker->SetFillStyle(1001);
804 marker->SetFillColor(color);
805 marker->SetRefObject((TObject*)points);
806 points->Set3DMarker(imark, marker);
811 //___________________________________________
812 void AliMUONdisplay::LoadCoG(Int_t chamber, Int_t cathode)
814 // Read raw clusters info and store x,y,z info in arrays fRpoints
815 // Loop on all detectors
817 if (chamber > 10) return;
821 AliMUON *MUON = (AliMUON*)gAlice->GetModule("MUON");
822 AliMUONchamber* iChamber;
824 TClonesArray *MUONrawclust = MUON->RawClustAddress(chamber-1);
825 if (MUONrawclust == 0) return;
827 MUON->ResetRawClusters();
830 Int_t nent=(Int_t)gAlice->TreeR()->GetEntries();
831 gAlice->TreeR()->GetEvent(nent-2+cathode-1);
832 //gAlice->TreeR()->GetEvent(cathode);
833 Int_t nrawcl = MUONrawclust->GetEntriesFast();
834 if (nrawcl == 0) return;
835 if (fRpoints == 0) fRpoints = new TObjArray(nrawcl);
837 iChamber = &(MUON->Chamber(chamber-1));
838 Float_t zpos=iChamber->ZPosition();
839 AliMUONRawCluster *mRaw;
840 AliMUONpoints *points = 0;
842 //loop over all raw clusters and store their position
843 points = new AliMUONpoints(nrawcl);
844 for (Int_t iraw=0;iraw<nrawcl;iraw++) {
845 mRaw = (AliMUONRawCluster*)MUONrawclust->UncheckedAt(iraw);
846 fRpoints->AddAt(points,iraw);
847 points->SetMarkerColor(51);
848 points->SetMarkerStyle(2);
849 points->SetMarkerSize(1.);
850 points->SetParticle(-1);
851 points->SetHitIndex(-1);
852 points->SetTrackIndex(-1);
853 points->SetDigitIndex(-1);
854 points->SetPoint(iraw,mRaw->fX,mRaw->fY,zpos);
857 //___________________________________________
858 void AliMUONdisplay::LoadCoG2(Int_t chamber, Int_t cathode)
860 // Read raw clusters info and store x,y,z info in arrays fRpoints
861 // Loop on all detectors
863 if (chamber > 10) return;
867 AliMUON *MUON = (AliMUON*)gAlice->GetModule("MUON");
868 AliMUONchamber* iChamber;
870 TClonesArray *MUONrawclust = MUON->RawClustAddress(chamber-1);
871 if (MUONrawclust == 0) return;
873 MUON->ResetRawClusters();
875 Int_t nent=(Int_t)gAlice->TreeR()->GetEntries();
876 gAlice->TreeR()->GetEvent(nent-2+cathode-1);
877 //gAlice->TreeR()->GetEvent(cathode);
878 Int_t nrawcl = MUONrawclust->GetEntriesFast();
879 if (nrawcl == 0) return;
880 if (fR2points == 0) fR2points = new TObjArray(nrawcl);
882 iChamber = &(MUON->Chamber(chamber-1));
883 Float_t zpos=iChamber->ZPosition();
884 AliMUONRawCluster *mRaw;
885 AliMUONpoints *points = 0;
887 //loop over all raw clusters and store their position
888 points = new AliMUONpoints(nrawcl);
889 for (Int_t iraw=0;iraw<nrawcl;iraw++) {
890 mRaw = (AliMUONRawCluster*)MUONrawclust->UncheckedAt(iraw);
891 fR2points->AddAt(points,iraw);
892 points->SetMarkerColor(51);
893 points->SetMarkerStyle(4);
894 points->SetMarkerSize(1.3);
895 points->SetParticle(-1);
896 points->SetHitIndex(-1);
897 points->SetTrackIndex(-1);
898 points->SetDigitIndex(-1);
899 points->SetPoint(iraw,mRaw->fX,mRaw->fY,zpos);
902 //___________________________________________
903 void AliMUONdisplay::LoadCathCor(Int_t chamber)
905 // Read correlation info and store x,y,z info in arrays fCpoints
906 // Loop on all detectors
908 if (chamber > 10) return;
912 AliMUON *MUON = (AliMUON*)gAlice->GetModule("MUON");
913 AliMUONchamber* iChamber;
914 iChamber = &(MUON->Chamber(chamber-1));
915 Float_t zpos=iChamber->ZPosition(); // check with Andreas
919 MUON->GetTreeC(fEvent);
920 TTree *TC=MUON->TreeC();
922 // Int_t nent=(Int_t)TC->GetEntries();
924 TClonesArray *MUONcorrel = MUON->CathCorrelAddress(chamber-1);
925 if (MUONcorrel == 0) return;
927 MUON->ResetCorrelation();
930 Int_t ncor = MUONcorrel->GetEntries();
932 if (!fCpoints) fCpoints = new TObjArray(ncor);
934 AliMUONcorrelation *mCor;
935 AliMUONpoints *points = 0;
937 //loop over all raw clusters and store their position
938 points = new AliMUONpoints(ncor);
939 for (Int_t icor=0;icor<ncor;icor++) {
940 mCor = (AliMUONcorrelation*)MUONcorrel->UncheckedAt(icor);
941 fCpoints->AddAt(points,icor);
942 points->SetMarkerColor(4);
943 points->SetMarkerStyle(4);
944 points->SetMarkerSize(0.8);
945 points->SetParticle(-1);
946 points->SetHitIndex(-1);
947 points->SetTrackIndex(-1);
948 points->SetDigitIndex(-1);
949 points->SetPoint(icor,mCor->fX[0],mCor->fY[0],zpos);
953 //___________________________________________
954 void AliMUONdisplay::LoadHits(Int_t chamber)
956 // Read hits info and store x,y,z info in arrays fPhits
957 // Loop on all detectors
959 if (chamber > 10) return;
966 AliMUON *MUON = (AliMUON*)gAlice->GetModule("MUON");
967 AliMUONchamber* iChamber;
969 iChamber = &(MUON->Chamber(chamber-1));
970 Float_t zpos=iChamber->ZPosition();
972 Int_t ntracks = (Int_t)gAlice->TreeH()->GetEntries();
973 //Int_t ntrks = gAlice->GetNtrack();
977 for (track=0; track<ntracks;track++) {
979 gAlice->TreeH()->GetEvent(track);
980 TClonesArray *MUONhits = MUON->Hits();
981 if (MUONhits == 0) return;
982 nthits += MUONhits->GetEntriesFast();
984 if (fPhits == 0) fPhits = new TObjArray(nthits);
985 //printf("nthits %d \n",nthits);
989 //if (fPhits == 0) fPhits = new TObjArray(ntracks);
991 TVector *xp = new TVector(20);
992 TVector *yp = new TVector(20);
993 // TVector *zp = new TVector(20);
994 TVector *ptrk = new TVector(20);
995 TVector *phit = new TVector(20);
1000 for (track=0; track<ntracks;track++) {
1001 gAlice->ResetHits();
1002 gAlice->TreeH()->GetEvent(track);
1003 TClonesArray *MUONhits = MUON->Hits();
1004 if (MUONhits == 0) return;
1005 Int_t nhits = MUONhits->GetEntriesFast();
1006 if (nhits == 0) continue;
1008 AliMUONpoints *points = 0;
1010 for (Int_t hit=0;hit<nhits;hit++) {
1011 mHit = (AliMUONhit*)MUONhits->UncheckedAt(hit);
1012 Int_t nch = mHit->fChamber; // chamber number
1013 if (nch != chamber) continue;
1015 // Retrieve info and set the objects
1017 points = new AliMUONpoints(npoints);
1018 fPhits->AddAt(points,nhold+hit);
1019 points->SetMarkerColor(kRed);
1020 points->SetMarkerStyle(5);
1021 points->SetMarkerSize(1.);
1022 points->SetParticle(mHit->fTrack);
1023 points->SetHitIndex(hit);
1024 points->SetTrackIndex(track);
1025 points->SetDigitIndex(-1);
1026 points->SetPoint(0,mHit->fX,mHit->fY,zpos);
1034 for (Int_t hit=0;hit<nhits;hit++) {
1035 mHit = (AliMUONhit*)MUONhits->UncheckedAt(hit);
1036 Int_t nch = mHit->fChamber; // chamber number
1037 if (nch != chamber) continue;
1039 (*xp)(npoints)=mHit->fX;
1040 (*yp)(npoints)=mHit->fY;
1041 // (*zp)(npoints)=mHit->fZ;
1042 (*ptrk)(npoints)=Float_t(mHit->GetTrack());
1043 //(*ptrk)(npoints)=Float_t(mHit->fTrack);
1044 (*phit)(npoints)=Float_t(hit);
1045 printf("hit,(*phit)(npoints), track, trk, fTrack ipart %d %f %d %d %d %f\n",hit,(*phit)(npoints),track,mHit->GetTrack(),mHit->fTrack,mHit->fParticle);
1048 if (npoints == 0) continue;
1049 // printf("npoints %d \n",npoints);
1050 points = new AliMUONpoints(npoints);
1051 for (Int_t p=0;p<npoints;p++) {
1052 points->SetMarkerColor(kRed);
1053 points->SetMarkerStyle(5);
1054 points->SetMarkerSize(1.);
1055 points->SetParticle(Int_t((*ptrk)(p)));
1056 Int_t index=points->GetIndex();
1057 points->SetHitIndex(Int_t((*phit)(p)));
1058 points->SetTrackIndex(track);
1059 printf("p, index, Int_t((*ptrk)(p)), hit, track %d %d %d %d %d \n",p, index,Int_t((*ptrk)(p)),Int_t((*phit)(p)),track);
1060 points->SetDigitIndex(-1);
1061 points->SetPoint(p,(*xp)(p),(*yp)(p),zpos);
1062 // points->SetPoint(p,(*xp)(p),(*yp)(p),(*zp)(p));
1069 fPhits->AddAt(points,track);
1070 // Int_t np=points->GetN();
1071 // printf("np %d \n",np);
1081 //_____________________________________________________________________________
1082 void AliMUONdisplay::Paint(Option_t *)
1084 // Paint miscellaneous items
1088 //_____________________________________________________________________________
1089 void AliMUONdisplay::SetPickMode()
1093 fArcButton->SetY1(fPickButton->GetYlowNDC()+0.5*fPickButton->GetHNDC());
1094 fTrigPad->Modified();
1097 //_____________________________________________________________________________
1098 void AliMUONdisplay::SetZoomMode()
1102 fArcButton->SetY1(fZoomButton->GetYlowNDC()+0.5*fZoomButton->GetHNDC());
1103 fTrigPad->Modified();
1106 //_____________________________________________________________________________
1107 void AliMUONdisplay::SetChamberAndCathode(Int_t chamber, Int_t cathode)
1109 // Set chamber and cathode number
1115 LoadDigits(chamber,cathode);
1119 //_____________________________________________________________________________
1120 void AliMUONdisplay::SetRange(Float_t rrange, Float_t zrange)
1122 // Set view range along R and Z
1131 //_____________________________________________________________________________
1132 void AliMUONdisplay::SetView(Float_t theta, Float_t phi, Float_t psi)
1134 // change viewing angles for current event
1142 TView *view = gPad->GetView();
1143 if (view) view->SetView(fPhi, fTheta, fPsi, iret);
1149 //_____________________________________________________________________________
1150 void AliMUONdisplay::ShowNextEvent(Int_t delta)
1152 // Display (current event_number+delta)
1153 // delta = 1 shown next event
1154 // delta = -1 show previous event
1157 Int_t current_event = gAlice->GetHeader()->GetEvent();
1158 Int_t new_event = current_event + delta;
1159 gAlice->GetEvent(new_event);
1161 if (!gAlice->TreeD()) return;
1163 LoadDigits(fChamber,fCathode);
1168 //______________________________________________________________________________
1169 void AliMUONdisplay::UnZoom()
1171 if (fZooms <= 0) return;
1173 TPad *pad = (TPad*)gPad->GetPadSave();
1174 pad->Range(fZoomX0[fZooms],fZoomY0[fZooms], fZoomX1[fZooms],fZoomY1[fZooms]);
1178 //_____________________________________________________________________________
1179 void AliMUONdisplay::ResetPoints()
1182 // Reset array of points
1190 //_____________________________________________________________________________
1191 void AliMUONdisplay::ResetPhits()
1194 // Reset array of points
1202 //_____________________________________________________________________________
1203 void AliMUONdisplay::ResetRpoints()
1206 // Reset array of points
1214 //_____________________________________________________________________________
1215 void AliMUONdisplay::ResetR2points()
1218 // Reset array of points
1221 fR2points->Delete();
1226 //_____________________________________________________________________________
1227 void AliMUONdisplay::ResetCpoints()
1230 // Reset array of points