]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliDisplay.cxx
Making AliDCSValue sortable (Vladimir)
[u/mrichter/AliRoot.git] / STEER / AliDisplay.cxx
index d95ddb09ed0b192c2c15790b4eccf7dc46c1750f..8fdb111dc311402cae84499f16ebed023e47b145 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/*
-$Log$
-Revision 1.19  2002/10/14 14:57:32  hristov
-Merging the VirtualMC branch to the main development branch (HEAD)
-
-Revision 1.17.6.1  2002/06/10 14:43:06  hristov
-Merged with v3-08-02
-
-Revision 1.18  2002/05/24 13:29:58  hristov
-AliTrackReference added, AliDisplay modified
-
-Revision 1.17  2001/10/21 18:38:44  hristov
-Several pointers were set to zero in the default constructors to avoid memory management problems
-
-Revision 1.16  2001/07/25 15:23:50  hristov
-Changes needed to run with Root 3.01 (R.Brun)
-
-Revision 1.15  2001/05/16 14:57:22  alibrary
-New files for folders and Stack
-
-Revision 1.14  2001/01/26 19:58:48  hristov
-Major upgrade of AliRoot code
-
-Revision 1.13  2000/12/21 15:30:18  fca
-Correcting coding convention violations
-
-Revision 1.12  2000/12/12 13:18:59  hristov
-Protection against FPE
-
-Revision 1.11  2000/11/30 07:12:48  alibrary
-Introducing new Rndm and QA classes
-
-Revision 1.10  2000/10/02 21:28:14  fca
-Removal of useless dependecies via forward declarations
-
-Revision 1.9  2000/07/13 16:19:09  fca
-Mainly coding conventions + some small bug fixes
-
-Revision 1.8  2000/07/11 18:24:59  fca
-Coding convention corrections + few minor bug fixes
-
-Revision 1.7  1999/11/10 07:37:06  fca
-Pads do not inherit editability from canvas any more
-
-Revision 1.6  1999/11/09 07:38:52  fca
-Changes for compatibility with version 2.23 of ROOT
-
-Revision 1.5  1999/09/29 09:24:29  fca
-Introduction of the Copyright and cvs Log
-
-*/
-
+/* $Id$ */
 
 //////////////////////////////////////////////////////////////////////////
 //                                                                      //
@@ -74,6 +23,7 @@ Introduction of the Copyright and cvs Log
 //                                                                      //
 //////////////////////////////////////////////////////////////////////////
 
+#include <RVersion.h>
 #include <TArc.h>
 #include <TButton.h>
 #include <TCanvas.h>
@@ -84,10 +34,15 @@ Introduction of the Copyright and cvs Log
 #include <TPaveText.h>
 #include <TSlider.h>
 #include <TSliderBox.h>
-#include <TTree.h>
+//#include <TTree.h>
+#if ROOT_VERSION_CODE>= 331523
+#include <TView3D.h>
+#else
 #include <TView.h>
+#endif
 #include <TVirtualX.h>
 
+#include "AliLog.h"
 #include "AliDetector.h"
 #include "AliDisplay.h"
 #include "AliHeader.h"
@@ -96,9 +51,12 @@ Introduction of the Copyright and cvs Log
 #include "AliStack.h"
 #include "TGeometry.h"
 #include "TParticle.h"
+#include "AliMC.h"
+
+const Float_t AliDisplay::fgkPtCutMax  = 2;
+const Float_t AliDisplay::fgkEtaCutMax = 1.5;
+const Int_t   AliDisplay::fgkMaxZooms = 20;
 
-static const Float_t kptcutmax  = 2;
-static const Float_t ketacutmax = 1.5;
 
 ClassImp(AliDisplay)
 
@@ -138,7 +96,7 @@ AliDisplay::AliDisplay():
   //
 }
 
-//_______________________________________________________________________
+//_____________________________________________________________________________
 AliDisplay::AliDisplay(Int_t size):
   fZoomMode(1),
   fDrawAllViews(kFALSE),
@@ -168,102 +126,100 @@ AliDisplay::AliDisplay(Int_t size):
   fTracksToDisplay(0),
   fNTracksToDisplay(0)
 {
-  // Create an event display object.
-  // A canvas named "edisplay" is created with a vertical size in pixels
-  //
-  //    A QUICK Overview of the Event Display functions
-  //    ===============================================
-  //
-  //  The event display can ve invoked by executing the macro "display.C"
-  // A canvas like in the picture below will appear.
-  //
-  //  On the left side of the canvas, the following buttons appear:
-  //   *Next*       to move to the next event
-  //   *Previous*   to move to the previous event
-  //   *Top View*   to display a top view of the current event
-  //   *Side View*  to display a side view of the current event
-  //   *Front View* to display a front view of the current event
-  //   *All Views*  to display front/side/top/30-30 views of the current event
-  //   *OpenGL*     to use OpenGl to view the current event.
-  //                Note that OpenGL cannot be used across the network.
-  //                Before using OpenGL, load the GL libraries
-  //                by executing the macro GL.C (in $ROOTSYS/macros/GL.C.
-  //                Once in GL, click the HELP button of the GL canvas.
-  //   *X3D*        to use X3D to view the current event (Unix only).
-  //                Once in X3D, type M to see the list of all possible options.
-  //                for example type J to zoom, K to unzoom
-  //                use the mouse to rotate.
-  //   *Pick*       Select this option to be able to point on a track with the
-  //                mouse. Once on the track, use the right button to select
-  //                an action. For example, select SetMarkerAttributes to
-  //                change the marker type/color/size for the track.
-  //   *Zoom*       Select this option (default) if you want to zoom.
-  //                To zoom, simply select the selected area with the left button.
-  //   *UnZoom*     To revert to the previous picture size.
-  //
-  //   slider R     On the left side, the vertical slider can be used to
-  //                set the default picture size.
-  //   slider pcut  At the top of the canvas, a slider can be used to change
-  //                the momentum cut (or range) to display tracks.
-  //   slider eta   On the right side of the canvas, a vertical slider can be used
-  //                to specify a rapidity range for the tracks.
-  //
-  //  When you are in Zoom mode, you can click on the black part of the canvas
-  //  to select special options with the right mouse button.
-  //  This will display a pop-up menu with items like:
-  //     *Disable detector* 
-  //     *Enable detector*, etc.
-  //  For example select "Disable detector". You get a dialog box.
-  //  Diable detector TRD for example.
-  //
-  //  When you are in pick mode, you can "Inspect" the object pointed by the mouse.
-  //  When you are on a track, select the menu item "InspectParticle"
-  //  to display the current particle attributes.
-  //
-  //  You can activate the Root browser by selecting the Inspect menu
-  //  in the canvas tool bar menu. Then select "Start Browser"
-  //  This will open a new canvas with the browser. At this point, you may want
-  //  to display some histograms (from the Trees). Go to the "File" menu
-  //  of the browser and click on "New canvas".
-  //  In the browser, click on item "ROOT files" in the left pane.
-  //  Click on galice.root.
-  //  Click on TH
-  //  Click on TPC for example
-  //  Click on any variable (eg TPC.fX) to histogram the variable.
-  //
-  //   If you are lost, you can click on HELP in any Root canvas or browser.
-  //Begin_Html
-  /*
-    <img src="picts/alidisplay.gif">
-  */
-  //End_Html
-  
+// Create an event display object.
+// A canvas named "edisplay" is created with a vertical size in pixels
+//
+//    A QUICK Overview of the Event Display functions
+//    ===============================================
+//
+//  The event display can ve invoked by executing the macro "display.C"
+// A canvas like in the picture below will appear.
+//
+//  On the left side of the canvas, the following buttons appear:
+//   *Next*       to move to the next event
+//   *Previous*   to move to the previous event
+//   *Top View*   to display a top view of the current event
+//   *Side View*  to display a side view of the current event
+//   *Front View* to display a front view of the current event
+//   *All Views*  to display front/side/top/30-30 views of the current event
+//   *OpenGL*     to use OpenGl to view the current event.
+//                Note that OpenGL cannot be used across the network.
+//                Before using OpenGL, load the GL libraries
+//                by executing the macro GL.C (in $ROOTSYS/macros/GL.C.
+//                Once in GL, click the HELP button of the GL canvas.
+//   *X3D*        to use X3D to view the current event (Unix only).
+//                Once in X3D, type M to see the list of all possible options.
+//                for example type J to zoom, K to unzoom
+//                use the mouse to rotate.
+//   *Pick*       Select this option to be able to point on a track with the
+//                mouse. Once on the track, use the right button to select
+//                an action. For example, select SetMarkerAttributes to
+//                change the marker type/color/size for the track.
+//   *Zoom*       Select this option (default) if you want to zoom.
+//                To zoom, simply select the selected area with the left button.
+//   *UnZoom*     To revert to the previous picture size.
+//
+//   slider R     On the left side, the vertical slider can be used to
+//                set the default picture size.
+//   slider pcut  At the top of the canvas, a slider can be used to change
+//                the momentum cut (or range) to display tracks.
+//   slider eta   On the right side of the canvas, a vertical slider can be used
+//                to specify a rapidity range for the tracks.
+//
+//    When you are in Zoom mode, you can click on the black part of the canvas
+//  to select special options with the right mouse button.
+//  This will display a pop-up menu with items like:
+//     *Disable detector* 
+//     *Enable detector*, etc.
+//  For example select "Disable detector". You get a dialog box.
+//  Diable detector TRD for example.
+//
+//  When you are in pick mode, you can "Inspect" the object pointed by the mouse.
+//  When you are on a track, select the menu item "InspectParticle"
+//  to display the current particle attributes.
+//
+//  You can activate the Root browser by selecting the Inspect menu
+//  in the canvas tool bar menu. Then select "Start Browser"
+//  This will open a new canvas with the browser. At this point, you may want
+//  to display some histograms (from the Trees). Go to the "File" menu
+//  of the browser and click on "New canvas".
+//  In the browser, click on item "ROOT files" in the left pane.
+//  Click on galice.root.
+//  Click on TH
+//  Click on TPC for example
+//  Click on any variable (eg TPC.fX) to histogram the variable.
+//
+//   If you are lost, you can click on HELP in any Root canvas or browser.
+//Begin_Html
+/*
+<img src="picts/alidisplay.gif">
+*/
+//End_Html
+   
   gAlice->SetDisplay(this);
    
   // Initialize display default parameters
   SetRange();
   SetPTcut();
   
-  // Set front view by default
-  
   // Create display canvas
   Int_t ysize = size;
   if (ysize < 100) ysize = 750;
   Int_t xsize = Int_t(size*830./ysize);
   fCanvas = new TCanvas("Canvas", "ALICE Event Display",14,47,xsize,ysize);
   fCanvas->ToggleEventStatus();
-  
+
   // Create main display pad
   fPad = new TPad("viewpad", "Alice display",0.15,0,0.97,0.96);
   fPad->Draw();
   fPad->Modified();
   fPad->SetFillColor(1);
   fPad->SetBorderSize(2);
-  
+
   // Create user interface control pad
   DisplayButtons();
   fCanvas->cd();
-  
+
   // Create Range and mode pad
   Float_t dxtr     = 0.15;
   Float_t dytr     = 0.45;
@@ -272,12 +228,10 @@ AliDisplay::AliDisplay(Int_t size):
   fTrigPad->cd();
   fTrigPad->SetFillColor(22);
   fTrigPad->SetBorderSize(2);
-
   fRangeSlider = new TSlider("range","range",0.7,0.42,0.9,0.98);
   fRangeSlider->SetObject(this);
   char pickmode[] = "gAlice->Display()->SetPickMode()";
   Float_t db = 0.09;
-
   fPickButton = new TButton("Pick",pickmode,0.05,0.32,0.65,0.32+db);
   fPickButton->SetFillColor(38);
   fPickButton->Draw();
@@ -293,7 +247,6 @@ AliDisplay::AliDisplay(Int_t size):
   button->SetFillColor(38);
   button->Draw();
   AppendPad(); // append display object as last object to force selection
-  
   // Create momentum cut slider pad
   fCanvas->cd();
   fCutPad = new TPad("cutSlider", "pcut slider pad",dxtr,.96,1,1);
@@ -301,49 +254,45 @@ AliDisplay::AliDisplay(Int_t size):
   fCutPad->cd();
   fCutPad->SetFillColor(22);
   fCutPad->SetBorderSize(2);
-
   fCutSlider = new TSlider("pcut","Momentum cut",0,0,1,1);
-  fCutSlider->SetRange(fPTcut/kptcutmax,1);
+  fCutSlider->SetRange(fPTcut/fgkPtCutMax,1);
   fCutSlider->SetObject(this);
   fCutSlider->SetFillColor(45);
   TSliderBox *sbox = dynamic_cast<TSliderBox*>(fCutSlider->GetListOfPrimitives()->First());
   sbox->SetFillColor(46);
   fCutSlider->cd();
-  TGaxis *cutaxis = new TGaxis(0.02,0.8,0.98,0.8,0,kptcutmax,510,"");
+  TGaxis *cutaxis = new TGaxis(0.02,0.8,0.98,0.8,0,fgkPtCutMax,510,"");
   cutaxis->SetLabelSize(0.5);
   cutaxis->SetTitleSize(0.6);
   cutaxis->SetTitleOffset(0.5);
   cutaxis->SetTitle("pcut .  ");
   fCutSlider->GetListOfPrimitives()->AddFirst(cutaxis);
-  
   // Create rapidity cut slider pad
   fCanvas->cd();
-
   fEtaPad = new TPad("EtaSlider", "Eta slider pad",0.97,0,1,0.96);
   fEtaPad->Draw();
   fEtaPad->cd();
   fEtaPad->SetFillColor(22);
   fEtaPad->SetBorderSize(2);
-
   fEtaSlider = new TSlider("etacut","Rapidity cut",0,0,1,1);
   fEtaSlider->SetObject(this);
   fEtaSlider->SetFillColor(45);
   TSliderBox *sbox2 = dynamic_cast<TSliderBox*>(fEtaSlider->GetListOfPrimitives()->First());
   sbox2->SetFillColor(46);
   fEtaSlider->cd();
-  TGaxis *etaaxis = new TGaxis(0.9,0.02,0.9,0.98,-ketacutmax,ketacutmax,510,"");
+  TGaxis *etaaxis = new TGaxis(0.9,0.02,0.9,0.98,-fgkEtaCutMax,fgkEtaCutMax,510,"");
   etaaxis->SetLabelSize(0.5);
   etaaxis->SetTitleSize(0.6);
   etaaxis->SetTitleOffset(0.2);
   cutaxis->SetTitle("Etacut .  ");
   fEtaSlider->GetListOfPrimitives()->AddFirst(etaaxis);
   fCanvas->cd();
-  
+
   fTrigPad->SetEditable(kFALSE);
   fButtons->SetEditable(kFALSE);
   fTracksToDisplay =0;
   fNTracksToDisplay =0;   
-  
+
   fCanvas->cd();
   fCanvas->Update();
 }
@@ -401,12 +350,12 @@ void AliDisplay::Clear(Option_t *)
 }
 
 //_____________________________________________________________________________
-void AliDisplay::Copy(AliDisplay &) const
+void AliDisplay::Copy(TObject &) const
 {
   //
   // Copy *this onto disp -- not implemented
   //
-  Fatal("Copy","Not implemented~\n");
+  AliFatal("Not implemented");
 }
 
 //----------------------------------------------------------------------------
@@ -429,19 +378,20 @@ void AliDisplay::ShowTrack(Int_t idx)
 //       fPad->Modified();
         //         TClonesArray *particles=gAlice->Particles();
         //         TParticle *p = (TParticle*)particles->UncheckedAt(idx);
-        TParticle *p = gAlice->Particle(idx);
-         printf("\nTrack index %d\n",idx);
-         printf("Particle ID %d\n",p->GetPdgCode());
-         printf("Parent %d\n",p->GetFirstMother());
-         printf("First child %d\n",p->GetFirstDaughter());
-         printf("Px,Py,Pz %f %f %f\n",p->Px(),p->Py(),p->Pz());
+        TParticle *p = gAlice->GetMCApp()->Particle(idx);
+         AliInfo(Form("Track index %d",idx));
+         AliInfo(Form("Particle ID %d",p->GetPdgCode()));
+         AliInfo(Form("Parent %d",p->GetFirstMother()));
+         AliInfo(Form("First child %d",p->GetFirstDaughter()));
+         AliInfo(Form("Px,Py,Pz %f %f %f",p->Px(),p->Py(),p->Pz()));
          return;
       }
    }
 }
 
 //----------------------------------------------------------------------------
-void AliDisplay::HideTrack(Int_t idx) {
+void AliDisplay::HideTrack(Int_t idx) const
+{
   //
   // Hide track on display
   //
@@ -644,15 +594,15 @@ void AliDisplay::DrawHits()
    //Get cut slider
    smax   = fCutSlider->GetMaximum();
    smin   = fCutSlider->GetMinimum();
-   cutmin = kptcutmax*smin;
-   if (smax < 0.98) cutmax = kptcutmax*smax;
+   cutmin = fgkPtCutMax*smin;
+   if (smax < 0.98) cutmax = fgkPtCutMax*smax;
    else             cutmax = 100000;
    
    //Get eta slider
    smax   = fEtaSlider->GetMaximum();
    smin   = fEtaSlider->GetMinimum();
-   etamin = ketacutmax*(2*smin-1);
-   etamax = ketacutmax*(2*smax-1);
+   etamin = fgkEtaCutMax*(2*smin-1);
+   etamax = fgkEtaCutMax*(2*smax-1);
    if (smin < 0.02) etamin = -1000;
    if (smax > 0.98) etamax =  1000;
       
@@ -705,7 +655,7 @@ void AliDisplay::DrawTitle(Option_t *option)
       char ptitle[100];
       sprintf(ptitle,"Alice event: %d, Run:%d",gAlice->GetHeader()->GetEvent(), gAlice->GetHeader()->GetRun());
       title->AddText(ptitle);
-      Int_t nparticles = gAlice->Particles()->GetEntriesFast();
+      Int_t nparticles = gAlice->GetMCApp()->Particles()->GetEntriesFast();
       sprintf(ptitle,"Nparticles = %d  Nhits = %d",nparticles, fHitsCuts);
       title->AddText(ptitle);
    } else {
@@ -726,7 +676,13 @@ void AliDisplay::DrawView(Float_t theta, Float_t phi, Float_t psi)
    gPad->Clear();
 
    Int_t iret;
+#if ROOT_VERSION_CODE>= 331523
+   Double_t rmin[]={-1,-1,-1};
+   Double_t rmax[]={ 1, 1, 1};
+   TView *view = new TView3D(1,rmin,rmax);
+#else
    TView *view = new TView(1);
+#endif
    Float_t range = fRrange*fRangeSlider->GetMaximum();
    view->SetRange(-range,-range,-range,range, range, range);
    fZoomX0[0] = -1;
@@ -839,7 +795,7 @@ void AliDisplay::ExecuteEvent(Int_t event, Int_t px, Int_t py)
       if (x1 < x0) {temp = x0; x0 = x1; x1 = temp;}
       if (y1 < y0) {temp = y0; y0 = y1; y1 = temp;}
       gPad->Range(x0,y0,x1,y1);
-      if (fZooms < kMAXZOOMS-1) {
+      if (fZooms < fgkMaxZooms-1) {
          fZooms++;
          fZoomX0[fZooms] = x0;
          fZoomY0[fZooms] = y0;
@@ -868,29 +824,51 @@ void AliDisplay::LoadPoints()
    gAlice->ResetPoints();
    TIter next(gAlice->Modules());
    AliModule *module;
-   Int_t ntracks = gAlice->GetNtrack();
-   
+   Int_t ntracks = gAlice->GetMCApp()->GetNtrack();
+
+   while((module = (AliModule*)next())) 
+    {
+     AliDetector* detector = dynamic_cast<AliDetector*>(module);
+     if(detector) detector->SetTreeAddress();
+    }
+   next.Reset();
+
    // load only wanted tracks
-   if (fNTracksToDisplay>0){
-     Int_t nprim =  gAlice->Stack()->GetNprimary();
-     for (Int_t track=0; track<fNTracksToDisplay;track++) {
+   if (fNTracksToDisplay>0)
+    {
+      Int_t nprim =  gAlice->Stack()->GetNprimary();
+      for (Int_t track=0; track<fNTracksToDisplay;track++) 
+       {
+        gAlice->ResetHits();
+        Int_t nev = nprim-1-gAlice->GetMCApp()->GetPrimary(fTracksToDisplay[track]);
+        while((module = (AliModule*)next())) 
+         {
+          AliDetector* detector = dynamic_cast<AliDetector*>(module);
+          if(detector)
+           {
+            detector->TreeH()->GetEvent(nev);
+            module->LoadPoints(nprim-1-gAlice->GetMCApp()->GetPrimary(fTracksToDisplay[track]));
+           }
+         }
+        next.Reset();
+     }
+   }
+   else
+    {
+      
+      for (Int_t track=0; track<ntracks;track++) {
       gAlice->ResetHits();
-      gAlice->TreeH()->GetEvent(nprim-1-gAlice->GetPrimary(fTracksToDisplay[track]));
-      while((module = dynamic_cast<AliModule*>(next()))) {
-       module->LoadPoints(nprim-1-gAlice->GetPrimary(fTracksToDisplay[track]));
+      while((module = (AliModule*)next())) {
+         AliDetector* detector = dynamic_cast<AliDetector*>(module);
+         if(detector)
+           {
+             if (detector->TreeH()->GetEvent(track))
+              detector->LoadPoints(track);
+           }
       }
       next.Reset();
      }
    }
-   else
-     for (Int_t track=0; track<ntracks;track++) {
-       gAlice->ResetHits();
-       gAlice->TreeH()->GetEvent(track);
-       while((module = dynamic_cast<AliModule*>(next()))) {
-         module->LoadPoints(track);
-       }
-       next.Reset();
-     }
 }
 
 //_____________________________________________________________________________
@@ -976,11 +954,13 @@ void AliDisplay::ShowNextEvent(Int_t delta)
 //    delta = -1 show previous event
 
   if (delta) {
-     gAlice->Clear();
-     Int_t currentEvent = gAlice->GetHeader()->GetEvent();
+//     gAlice->Clear();
+     //Int_t currentEvent = gAlice->GetHeader()->GetEvent();//event number is not filled correctly
+     Int_t currentEvent = gAlice->GetRunLoader()->GetEventNumber();
      Int_t newEvent     = currentEvent + delta;
      gAlice->GetEvent(newEvent);
-     if (!gAlice->TreeH()) return; 
+     AliInfo(Form("delta = %d  currentEvent = %d  newEvent = %d",
+                  delta, currentEvent, newEvent));
    }
   LoadPoints();
   fPad->cd();