ROOT logo
// @(#)root/g3d:$Id: TMarker3DBox.cxx 20882 2007-11-19 11:31:26Z rdm $
// Author: Rene Brun , Olivier Couet 31/10/97


/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "Riostream.h"
#include "TROOT.h"
#include "TView.h"
#include "TMarker3DBox.h"
#include "TVirtualPad.h"
#include "TH1.h"
#include "TH3.h"
#include "TBuffer3D.h"
#include "TBuffer3DTypes.h"
#include "TVirtualViewer3D.h"
#include "TGeometry.h"
#include "TClass.h"
#include "TMath.h"

#include <assert.h>

ClassImp(TMarker3DBox)


//______________________________________________________________________________
// Marker3DBox is a special 3-D marker designed for event display.
// It has the following parameters:
//    fX;               X coordinate of the center of the box
//    fY;               Y coordinate of the center of the box
//    fZ;               Z coordinate of the center of the box
//    fDx;              half length in X
//    fDy;              half length in Y
//    fDz;              half length in Z
//    fTheta;           Angle of box z axis with respect to main Z axis
//    fPhi;             Angle of box x axis with respect to main Xaxis
//    fRefObject;       A reference to an object
// Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/Marker3DBox.gif"> </P> End_Html


//______________________________________________________________________________
TMarker3DBox::TMarker3DBox()
{
   // Marker3DBox  default constructor

   fRefObject = 0;
   fDx        = 1;
   fDy        = 1;
   fDz        = 1;
   fX         = 0;
   fY         = 0;
   fZ         = 0;
   fTheta     = 0;
   fPhi       = 0;
   SetBit(kTemporary,kFALSE);
}


//______________________________________________________________________________
TMarker3DBox::TMarker3DBox( Float_t x, Float_t y, Float_t z,
                            Float_t dx, Float_t dy, Float_t dz,
                            Float_t theta, Float_t phi)
              :TAttLine(1,1,1), TAttFill(1,0)
{
   // Marker3DBox normal constructor

   fDx        = dx;
   fDy        = dy;
   fDz        = dz;
   fX         = x;
   fY         = y;
   fZ         = z;
   fTheta     = theta;
   fPhi       = phi;
   fRefObject = 0;
   SetBit(kTemporary,kFALSE);
}

//______________________________________________________________________________
TMarker3DBox::TMarker3DBox(const TMarker3DBox& m3d) :
 TObject(m3d),
 TAttLine(m3d),
 TAttFill(m3d),
 TAtt3D(m3d),
 fX(m3d.fX),
 fY(m3d.fY),
 fZ(m3d.fZ),
 fDx(m3d.fDx),
 fDy(m3d.fDy),
 fDz(m3d.fDz),
 fTheta(m3d.fTheta),
 fPhi(m3d.fPhi),
 fRefObject(m3d.fRefObject)
{
   //copy constructor
}

//______________________________________________________________________________
TMarker3DBox& TMarker3DBox::operator=(const TMarker3DBox& m3d)
{
   //assignement operator
   if(this!=&m3d) {
      TObject::operator=(m3d);
      TAttLine::operator=(m3d);
      TAttFill::operator=(m3d);
      TAtt3D::operator=(m3d);
      fX=m3d.fX;
      fY=m3d.fY;
      fZ=m3d.fZ;
      fDx=m3d.fDx;
      fDy=m3d.fDy;
      fDz=m3d.fDz;
      fTheta=m3d.fTheta;
      fPhi=m3d.fPhi;
      fRefObject=m3d.fRefObject;
   }
   return *this;
}

//______________________________________________________________________________
TMarker3DBox::~TMarker3DBox()
{
   // Marker3DBox shape default destructor
}


//______________________________________________________________________________
Int_t TMarker3DBox::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Compute distance from point px,py to a Marker3DBox
   //
   // Compute the closest distance of approach from point px,py to each corner
   // point of the Marker3DBox.

   const Int_t numPoints = 8;
   Int_t dist = 9999;
   Double_t points[3*numPoints];

   TView *view = gPad->GetView();
   if (!view) return dist;
   const Int_t seg1[12] = {0,1,2,3,4,5,6,7,0,1,2,3};
   const Int_t seg2[12] = {1,2,3,0,5,6,7,4,4,5,6,7};

   SetPoints(points);

   Int_t i, i1, i2, dsegment;
   Double_t x1,y1,x2,y2;
   Double_t xndc[3];
   for (i = 0; i < 12; i++) {
      i1 = 3*seg1[i];
      view->WCtoNDC(&points[i1], xndc);
      x1 = xndc[0];
      y1 = xndc[1];

      i2 = 3*seg2[i];
      view->WCtoNDC(&points[i2], xndc);
      x2 = xndc[0];
      y2 = xndc[1];
      dsegment = DistancetoLine(px,py,x1,y1,x2,y2);
      if (dsegment < dist) dist = dsegment;
   }
   if (dist < 5) {
      gPad->SetCursor(kCross);
      if (fRefObject) {gPad->SetSelected(fRefObject); return 0;}
   }
   return dist;
}


//______________________________________________________________________________
void TMarker3DBox::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
   // Execute action corresponding to one event
   //
   // This member function must be implemented to realize the action
   // corresponding to the mouse click on the object in the window

   if (gPad->GetView()) gPad->GetView()->ExecuteRotateView(event, px, py);
}


//______________________________________________________________________________
void TMarker3DBox::Paint(Option_t * /* option */ )
{
   // Paint marker 3D box.

   static TBuffer3D buffer(TBuffer3DTypes::kGeneric);

   buffer.ClearSectionsValid();

   // Section kCore

   // If we are just a temporary object then no 'real object' to
   // pass to viewer
   if (TestBit(kTemporary)) {
      buffer.fID = 0;
   } else {
      buffer.fID           = this;
   }
   buffer.fColor        = GetLineColor();
   buffer.fTransparency = 0;
   buffer.fLocalFrame   = kFALSE;
   buffer.SetSectionsValid(TBuffer3D::kCore);

   // We fill kCore and kRawSizes on first pass and try with viewer
   Int_t reqSections = gPad->GetViewer3D()->AddObject(buffer);
   if (reqSections == TBuffer3D::kNone) {
      return;
   }

   if (reqSections & TBuffer3D::kRawSizes) {
      Int_t nbPnts = 8;
      Int_t nbSegs = 12;
      Int_t nbPols = 6;
      if (!buffer.SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols)) {
         return;
      }
      buffer.SetSectionsValid(TBuffer3D::kRawSizes);
   }

   if ((reqSections & TBuffer3D::kRaw) && buffer.SectionsValid(TBuffer3D::kRawSizes)) {
      // Points
      SetPoints(buffer.fPnts);

      // Transform points
      if (gGeometry && !buffer.fLocalFrame) {
         Double_t dlocal[3];
         Double_t dmaster[3];
         for (UInt_t j=0; j<buffer.NbPnts(); j++) {
            dlocal[0] = buffer.fPnts[3*j];
            dlocal[1] = buffer.fPnts[3*j+1];
            dlocal[2] = buffer.fPnts[3*j+2];
            gGeometry->Local2Master(&dlocal[0],&dmaster[0]);
            buffer.fPnts[3*j]   = dmaster[0];
            buffer.fPnts[3*j+1] = dmaster[1];
            buffer.fPnts[3*j+2] = dmaster[2];
         }
      }

      // Basic colors: 0, 1, ... 8
      Int_t c = (((GetLineColor()) %8) -1) * 4;
      if (c < 0) c = 0;

      // Segments
      buffer.fSegs[ 0] = c   ; buffer.fSegs[ 1] = 0 ; buffer.fSegs[ 2] = 1;
      buffer.fSegs[ 3] = c+1 ; buffer.fSegs[ 4] = 1 ; buffer.fSegs[ 5] = 2;
      buffer.fSegs[ 6] = c+1 ; buffer.fSegs[ 7] = 2 ; buffer.fSegs[ 8] = 3;
      buffer.fSegs[ 9] = c   ; buffer.fSegs[10] = 3 ; buffer.fSegs[11] = 0;
      buffer.fSegs[12] = c+2 ; buffer.fSegs[13] = 4 ; buffer.fSegs[14] = 5;
      buffer.fSegs[15] = c+2 ; buffer.fSegs[16] = 5 ; buffer.fSegs[17] = 6;
      buffer.fSegs[18] = c+3 ; buffer.fSegs[19] = 6 ; buffer.fSegs[20] = 7;
      buffer.fSegs[21] = c+3 ; buffer.fSegs[22] = 7 ; buffer.fSegs[23] = 4;
      buffer.fSegs[24] = c   ; buffer.fSegs[25] = 0 ; buffer.fSegs[26] = 4;
      buffer.fSegs[27] = c+2 ; buffer.fSegs[28] = 1 ; buffer.fSegs[29] = 5;
      buffer.fSegs[30] = c+1 ; buffer.fSegs[31] = 2 ; buffer.fSegs[32] = 6;
      buffer.fSegs[33] = c+3 ; buffer.fSegs[34] = 3 ; buffer.fSegs[35] = 7;

      // Polygons
      buffer.fPols[ 0] = c   ; buffer.fPols[ 1] = 4 ; buffer.fPols[ 2] = 0;
      buffer.fPols[ 3] = 9   ; buffer.fPols[ 4] = 4 ; buffer.fPols[ 5] = 8;
      buffer.fPols[ 6] = c+1 ; buffer.fPols[ 7] = 4 ; buffer.fPols[ 8] = 1;
      buffer.fPols[ 9] = 10  ; buffer.fPols[10] = 5 ; buffer.fPols[11] = 9;
      buffer.fPols[12] = c   ; buffer.fPols[13] = 4 ; buffer.fPols[14] = 2;
      buffer.fPols[15] = 11  ; buffer.fPols[16] = 6 ; buffer.fPols[17] = 10;
      buffer.fPols[18] = c+1 ; buffer.fPols[19] = 4 ; buffer.fPols[20] = 3;
      buffer.fPols[21] = 8   ; buffer.fPols[22] = 7 ; buffer.fPols[23] = 11;
      buffer.fPols[24] = c+2 ; buffer.fPols[25] = 4 ; buffer.fPols[26] = 0;
      buffer.fPols[27] = 3   ; buffer.fPols[28] = 2 ; buffer.fPols[29] = 1;
      buffer.fPols[30] = c+3 ; buffer.fPols[31] = 4 ; buffer.fPols[32] = 4;
      buffer.fPols[33] = 5   ; buffer.fPols[34] = 6 ; buffer.fPols[35] = 7;

      buffer.SetSectionsValid(TBuffer3D::kRaw);

      TAttLine::Modify();
      TAttFill::Modify();
   }

   gPad->GetViewer3D()->AddObject(buffer);
}


//______________________________________________________________________________
void TMarker3DBox::PaintH3(TH1 *h, Option_t *option)
{
   // Paint 3-d histogram h with marker3dboxes

   Int_t bin,ix,iy,iz;
   Double_t xmin,xmax,ymin,ymax,zmin,zmax,wmin,wmax,w;
   TAxis *xaxis = h->GetXaxis();
   TAxis *yaxis = h->GetYaxis();
   TAxis *zaxis = h->GetZaxis();

   //compute min and max of all cells
   wmin = wmax = 0;
   for (iz=zaxis->GetFirst();iz<=zaxis->GetLast();iz++) {
      for (iy=yaxis->GetFirst();iy<=yaxis->GetLast();iy++) {
         for (ix=xaxis->GetFirst();ix<=xaxis->GetLast();ix++) {
            bin = h->GetBin(ix,iy,iz);
            w = h->GetBinContent(bin);
            if (w > wmax) wmax = w;
            if (w < wmin) wmin = w;
         }
      }
   }

   //Create or modify 3-d view object
   TView *view = gPad->GetView();
   if (!view) {
      gPad->Range(-1,-1,1,1);
      view = TView::CreateView(1,0,0);
   }
   view->SetRange(xaxis->GetBinLowEdge(xaxis->GetFirst()),
                  yaxis->GetBinLowEdge(yaxis->GetFirst()),
                  zaxis->GetBinLowEdge(zaxis->GetFirst()),
                  xaxis->GetBinUpEdge(xaxis->GetLast()),
                  yaxis->GetBinUpEdge(yaxis->GetLast()),
                  zaxis->GetBinUpEdge(zaxis->GetLast()));

   view->PadRange(gPad->GetFrameFillColor());

   //Draw TMarker3DBox with size proportional to cell content
   TMarker3DBox m3;
   m3.SetBit(kTemporary,kTRUE);
   m3.SetRefObject(h);
   m3.SetDirection(0,0);
   m3.SetLineColor(h->GetMarkerColor());
   Double_t scale;
   for (ix=xaxis->GetFirst();ix<=xaxis->GetLast();ix++) {
      xmin = h->GetXaxis()->GetBinLowEdge(ix);
      xmax = xmin + h->GetXaxis()->GetBinWidth(ix);
      for (iy=yaxis->GetFirst();iy<=yaxis->GetLast();iy++) {
         ymin = h->GetYaxis()->GetBinLowEdge(iy);
         ymax = ymin + h->GetYaxis()->GetBinWidth(iy);
         for (iz=zaxis->GetFirst();iz<=zaxis->GetLast();iz++) {
            zmin = h->GetZaxis()->GetBinLowEdge(iz);
            zmax = zmin + h->GetZaxis()->GetBinWidth(iz);
            bin = h->GetBin(ix,iy,iz);
            w = h->GetBinContent(bin);
            if (w == 0) continue;
            scale = (w-wmin)/(wmax-wmin);
            m3.SetPosition(0.5*(xmin+xmax),0.5*(ymin+ymax),0.5*(zmin+zmax));
            m3.SetSize(scale*(xmax-xmin),scale*(ymax-ymin),scale*(zmax-zmin));
            m3.Paint(option);
         }
      }
   }
}


//______________________________________________________________________________
void TMarker3DBox::SavePrimitive(ostream &out, Option_t * /*= ""*/)
{
   // Save primitive as a C++ statement(s) on output stream out

   out<<"   "<<endl;
   if (gROOT->ClassSaved(TMarker3DBox::Class())) {
      out<<"   ";
   } else {
      out<<"   TMarker3DBox *";
   }
   out<<"marker3DBox = new TMarker3DBox("<<fX<<","
                                         <<fY<<","
                                         <<fZ<<","
                                         <<fDx<<","
                                         <<fDy<<","
                                         <<fDz<<","
                                         <<fTheta<<","
                                         <<fPhi<<");"<<endl;

   SaveLineAttributes(out,"marker3DBox",1,1,1);
   SaveFillAttributes(out,"marker3DBox",1,0);

   out<<"   marker3DBox->Draw();"<<endl;
}


//______________________________________________________________________________
void TMarker3DBox::SetDirection(Float_t theta, Float_t phi)
{
   // Set direction.

   fTheta = theta;
   fPhi   = phi;
}


//______________________________________________________________________________
void TMarker3DBox::SetSize(Float_t dx, Float_t dy, Float_t dz)
{
   // Set size.

   fDx = dx;
   fDy = dy;
   fDz = dz;
}


//______________________________________________________________________________
void TMarker3DBox::SetPosition(Float_t x, Float_t y, Float_t z)
{
   // Set position.

   fX  = x;
   fY  = y;
   fZ  = z;
}


//______________________________________________________________________________
void TMarker3DBox::SetPoints(Double_t *points) const
{
   // Set points.

   if (points) {
      points[ 0] = -fDx ; points[ 1] = -fDy ; points[ 2] = -fDz;
      points[ 3] = -fDx ; points[ 4] =  fDy ; points[ 5] = -fDz;
      points[ 6] =  fDx ; points[ 7] =  fDy ; points[ 8] = -fDz;
      points[ 9] =  fDx ; points[10] = -fDy ; points[11] = -fDz;
      points[12] = -fDx ; points[13] = -fDy ; points[14] =  fDz;
      points[15] = -fDx ; points[16] =  fDy ; points[17] =  fDz;
      points[18] =  fDx ; points[19] =  fDy ; points[20] =  fDz;
      points[21] =  fDx ; points[22] = -fDy ; points[23] =  fDz;

      Double_t x, y, z;
      const Double_t kPI = TMath::Pi();
      Double_t theta  = fTheta*kPI/180;
      Double_t phi    = fPhi*kPI/180;
      Double_t sinth = TMath::Sin(theta);
      Double_t costh = TMath::Cos(theta);
      Double_t sinfi = TMath::Sin(phi);
      Double_t cosfi = TMath::Cos(phi);

      // Matrix to convert from fruit frame to master frame
      Double_t m[9];
      m[0] =  costh * cosfi;       m[1] = -sinfi;          m[2] = sinth*cosfi;
      m[3] =  costh * sinfi;       m[4] =  cosfi;          m[5] = sinth*sinfi;
      m[6] = -sinth;               m[7] =  0;              m[8] = costh;
      for (Int_t i = 0; i < 8; i++) {
         x = points[3*i];
         y = points[3*i+1];
         z = points[3*i+2];

         points[3*i]   = fX + m[0] * x + m[1] * y + m[2] * z;
         points[3*i+1] = fY + m[3] * x + m[4] * y + m[5] * z;
         points[3*i+2] = fZ + m[6] * x + m[7] * y + m[8] * z;
      }
   }
}


//______________________________________________________________________________
void TMarker3DBox::Streamer(TBuffer &R__b)
{
   // Stream an object of class TMarker3DBox.

   if (R__b.IsReading()) {
      UInt_t R__s, R__c;
      Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
      if (R__v > 1) {
         R__b.ReadClassBuffer(TMarker3DBox::Class(), this, R__v, R__s, R__c);
         return;
      }
      //====process old versions before automatic schema evolution
      TObject::Streamer(R__b);
      TAttLine::Streamer(R__b);
      TAttFill::Streamer(R__b);
      if (R__b.GetVersionOwner() > 22300) {
         TAtt3D::Streamer(R__b);
      } else {
         TAtt3D::Streamer(R__b);
      }
      R__b >> fX;
      R__b >> fY;
      R__b >> fZ;
      R__b >> fDx;
      R__b >> fDy;
      R__b >> fDz;
      R__b >> fTheta;
      R__b >> fPhi;
      R__b >> fRefObject;
      R__b.CheckByteCount(R__s, R__c, TMarker3DBox::IsA());
      //====end of old versions

   } else {
      R__b.WriteClassBuffer(TMarker3DBox::Class(),this);
   }
}
 TMarker3DBox.cxx:1
 TMarker3DBox.cxx:2
 TMarker3DBox.cxx:3
 TMarker3DBox.cxx:4
 TMarker3DBox.cxx:5
 TMarker3DBox.cxx:6
 TMarker3DBox.cxx:7
 TMarker3DBox.cxx:8
 TMarker3DBox.cxx:9
 TMarker3DBox.cxx:10
 TMarker3DBox.cxx:11
 TMarker3DBox.cxx:12
 TMarker3DBox.cxx:13
 TMarker3DBox.cxx:14
 TMarker3DBox.cxx:15
 TMarker3DBox.cxx:16
 TMarker3DBox.cxx:17
 TMarker3DBox.cxx:18
 TMarker3DBox.cxx:19
 TMarker3DBox.cxx:20
 TMarker3DBox.cxx:21
 TMarker3DBox.cxx:22
 TMarker3DBox.cxx:23
 TMarker3DBox.cxx:24
 TMarker3DBox.cxx:25
 TMarker3DBox.cxx:26
 TMarker3DBox.cxx:27
 TMarker3DBox.cxx:28
 TMarker3DBox.cxx:29
 TMarker3DBox.cxx:30
 TMarker3DBox.cxx:31
 TMarker3DBox.cxx:32
 TMarker3DBox.cxx:33
 TMarker3DBox.cxx:34
 TMarker3DBox.cxx:35
 TMarker3DBox.cxx:36
 TMarker3DBox.cxx:37
 TMarker3DBox.cxx:38
 TMarker3DBox.cxx:39
 TMarker3DBox.cxx:40
 TMarker3DBox.cxx:41
 TMarker3DBox.cxx:42
 TMarker3DBox.cxx:43
 TMarker3DBox.cxx:44
 TMarker3DBox.cxx:45
 TMarker3DBox.cxx:46
 TMarker3DBox.cxx:47
 TMarker3DBox.cxx:48
 TMarker3DBox.cxx:49
 TMarker3DBox.cxx:50
 TMarker3DBox.cxx:51
 TMarker3DBox.cxx:52
 TMarker3DBox.cxx:53
 TMarker3DBox.cxx:54
 TMarker3DBox.cxx:55
 TMarker3DBox.cxx:56
 TMarker3DBox.cxx:57
 TMarker3DBox.cxx:58
 TMarker3DBox.cxx:59
 TMarker3DBox.cxx:60
 TMarker3DBox.cxx:61
 TMarker3DBox.cxx:62
 TMarker3DBox.cxx:63
 TMarker3DBox.cxx:64
 TMarker3DBox.cxx:65
 TMarker3DBox.cxx:66
 TMarker3DBox.cxx:67
 TMarker3DBox.cxx:68
 TMarker3DBox.cxx:69
 TMarker3DBox.cxx:70
 TMarker3DBox.cxx:71
 TMarker3DBox.cxx:72
 TMarker3DBox.cxx:73
 TMarker3DBox.cxx:74
 TMarker3DBox.cxx:75
 TMarker3DBox.cxx:76
 TMarker3DBox.cxx:77
 TMarker3DBox.cxx:78
 TMarker3DBox.cxx:79
 TMarker3DBox.cxx:80
 TMarker3DBox.cxx:81
 TMarker3DBox.cxx:82
 TMarker3DBox.cxx:83
 TMarker3DBox.cxx:84
 TMarker3DBox.cxx:85
 TMarker3DBox.cxx:86
 TMarker3DBox.cxx:87
 TMarker3DBox.cxx:88
 TMarker3DBox.cxx:89
 TMarker3DBox.cxx:90
 TMarker3DBox.cxx:91
 TMarker3DBox.cxx:92
 TMarker3DBox.cxx:93
 TMarker3DBox.cxx:94
 TMarker3DBox.cxx:95
 TMarker3DBox.cxx:96
 TMarker3DBox.cxx:97
 TMarker3DBox.cxx:98
 TMarker3DBox.cxx:99
 TMarker3DBox.cxx:100
 TMarker3DBox.cxx:101
 TMarker3DBox.cxx:102
 TMarker3DBox.cxx:103
 TMarker3DBox.cxx:104
 TMarker3DBox.cxx:105
 TMarker3DBox.cxx:106
 TMarker3DBox.cxx:107
 TMarker3DBox.cxx:108
 TMarker3DBox.cxx:109
 TMarker3DBox.cxx:110
 TMarker3DBox.cxx:111
 TMarker3DBox.cxx:112
 TMarker3DBox.cxx:113
 TMarker3DBox.cxx:114
 TMarker3DBox.cxx:115
 TMarker3DBox.cxx:116
 TMarker3DBox.cxx:117
 TMarker3DBox.cxx:118
 TMarker3DBox.cxx:119
 TMarker3DBox.cxx:120
 TMarker3DBox.cxx:121
 TMarker3DBox.cxx:122
 TMarker3DBox.cxx:123
 TMarker3DBox.cxx:124
 TMarker3DBox.cxx:125
 TMarker3DBox.cxx:126
 TMarker3DBox.cxx:127
 TMarker3DBox.cxx:128
 TMarker3DBox.cxx:129
 TMarker3DBox.cxx:130
 TMarker3DBox.cxx:131
 TMarker3DBox.cxx:132
 TMarker3DBox.cxx:133
 TMarker3DBox.cxx:134
 TMarker3DBox.cxx:135
 TMarker3DBox.cxx:136
 TMarker3DBox.cxx:137
 TMarker3DBox.cxx:138
 TMarker3DBox.cxx:139
 TMarker3DBox.cxx:140
 TMarker3DBox.cxx:141
 TMarker3DBox.cxx:142
 TMarker3DBox.cxx:143
 TMarker3DBox.cxx:144
 TMarker3DBox.cxx:145
 TMarker3DBox.cxx:146
 TMarker3DBox.cxx:147
 TMarker3DBox.cxx:148
 TMarker3DBox.cxx:149
 TMarker3DBox.cxx:150
 TMarker3DBox.cxx:151
 TMarker3DBox.cxx:152
 TMarker3DBox.cxx:153
 TMarker3DBox.cxx:154
 TMarker3DBox.cxx:155
 TMarker3DBox.cxx:156
 TMarker3DBox.cxx:157
 TMarker3DBox.cxx:158
 TMarker3DBox.cxx:159
 TMarker3DBox.cxx:160
 TMarker3DBox.cxx:161
 TMarker3DBox.cxx:162
 TMarker3DBox.cxx:163
 TMarker3DBox.cxx:164
 TMarker3DBox.cxx:165
 TMarker3DBox.cxx:166
 TMarker3DBox.cxx:167
 TMarker3DBox.cxx:168
 TMarker3DBox.cxx:169
 TMarker3DBox.cxx:170
 TMarker3DBox.cxx:171
 TMarker3DBox.cxx:172
 TMarker3DBox.cxx:173
 TMarker3DBox.cxx:174
 TMarker3DBox.cxx:175
 TMarker3DBox.cxx:176
 TMarker3DBox.cxx:177
 TMarker3DBox.cxx:178
 TMarker3DBox.cxx:179
 TMarker3DBox.cxx:180
 TMarker3DBox.cxx:181
 TMarker3DBox.cxx:182
 TMarker3DBox.cxx:183
 TMarker3DBox.cxx:184
 TMarker3DBox.cxx:185
 TMarker3DBox.cxx:186
 TMarker3DBox.cxx:187
 TMarker3DBox.cxx:188
 TMarker3DBox.cxx:189
 TMarker3DBox.cxx:190
 TMarker3DBox.cxx:191
 TMarker3DBox.cxx:192
 TMarker3DBox.cxx:193
 TMarker3DBox.cxx:194
 TMarker3DBox.cxx:195
 TMarker3DBox.cxx:196
 TMarker3DBox.cxx:197
 TMarker3DBox.cxx:198
 TMarker3DBox.cxx:199
 TMarker3DBox.cxx:200
 TMarker3DBox.cxx:201
 TMarker3DBox.cxx:202
 TMarker3DBox.cxx:203
 TMarker3DBox.cxx:204
 TMarker3DBox.cxx:205
 TMarker3DBox.cxx:206
 TMarker3DBox.cxx:207
 TMarker3DBox.cxx:208
 TMarker3DBox.cxx:209
 TMarker3DBox.cxx:210
 TMarker3DBox.cxx:211
 TMarker3DBox.cxx:212
 TMarker3DBox.cxx:213
 TMarker3DBox.cxx:214
 TMarker3DBox.cxx:215
 TMarker3DBox.cxx:216
 TMarker3DBox.cxx:217
 TMarker3DBox.cxx:218
 TMarker3DBox.cxx:219
 TMarker3DBox.cxx:220
 TMarker3DBox.cxx:221
 TMarker3DBox.cxx:222
 TMarker3DBox.cxx:223
 TMarker3DBox.cxx:224
 TMarker3DBox.cxx:225
 TMarker3DBox.cxx:226
 TMarker3DBox.cxx:227
 TMarker3DBox.cxx:228
 TMarker3DBox.cxx:229
 TMarker3DBox.cxx:230
 TMarker3DBox.cxx:231
 TMarker3DBox.cxx:232
 TMarker3DBox.cxx:233
 TMarker3DBox.cxx:234
 TMarker3DBox.cxx:235
 TMarker3DBox.cxx:236
 TMarker3DBox.cxx:237
 TMarker3DBox.cxx:238
 TMarker3DBox.cxx:239
 TMarker3DBox.cxx:240
 TMarker3DBox.cxx:241
 TMarker3DBox.cxx:242
 TMarker3DBox.cxx:243
 TMarker3DBox.cxx:244
 TMarker3DBox.cxx:245
 TMarker3DBox.cxx:246
 TMarker3DBox.cxx:247
 TMarker3DBox.cxx:248
 TMarker3DBox.cxx:249
 TMarker3DBox.cxx:250
 TMarker3DBox.cxx:251
 TMarker3DBox.cxx:252
 TMarker3DBox.cxx:253
 TMarker3DBox.cxx:254
 TMarker3DBox.cxx:255
 TMarker3DBox.cxx:256
 TMarker3DBox.cxx:257
 TMarker3DBox.cxx:258
 TMarker3DBox.cxx:259
 TMarker3DBox.cxx:260
 TMarker3DBox.cxx:261
 TMarker3DBox.cxx:262
 TMarker3DBox.cxx:263
 TMarker3DBox.cxx:264
 TMarker3DBox.cxx:265
 TMarker3DBox.cxx:266
 TMarker3DBox.cxx:267
 TMarker3DBox.cxx:268
 TMarker3DBox.cxx:269
 TMarker3DBox.cxx:270
 TMarker3DBox.cxx:271
 TMarker3DBox.cxx:272
 TMarker3DBox.cxx:273
 TMarker3DBox.cxx:274
 TMarker3DBox.cxx:275
 TMarker3DBox.cxx:276
 TMarker3DBox.cxx:277
 TMarker3DBox.cxx:278
 TMarker3DBox.cxx:279
 TMarker3DBox.cxx:280
 TMarker3DBox.cxx:281
 TMarker3DBox.cxx:282
 TMarker3DBox.cxx:283
 TMarker3DBox.cxx:284
 TMarker3DBox.cxx:285
 TMarker3DBox.cxx:286
 TMarker3DBox.cxx:287
 TMarker3DBox.cxx:288
 TMarker3DBox.cxx:289
 TMarker3DBox.cxx:290
 TMarker3DBox.cxx:291
 TMarker3DBox.cxx:292
 TMarker3DBox.cxx:293
 TMarker3DBox.cxx:294
 TMarker3DBox.cxx:295
 TMarker3DBox.cxx:296
 TMarker3DBox.cxx:297
 TMarker3DBox.cxx:298
 TMarker3DBox.cxx:299
 TMarker3DBox.cxx:300
 TMarker3DBox.cxx:301
 TMarker3DBox.cxx:302
 TMarker3DBox.cxx:303
 TMarker3DBox.cxx:304
 TMarker3DBox.cxx:305
 TMarker3DBox.cxx:306
 TMarker3DBox.cxx:307
 TMarker3DBox.cxx:308
 TMarker3DBox.cxx:309
 TMarker3DBox.cxx:310
 TMarker3DBox.cxx:311
 TMarker3DBox.cxx:312
 TMarker3DBox.cxx:313
 TMarker3DBox.cxx:314
 TMarker3DBox.cxx:315
 TMarker3DBox.cxx:316
 TMarker3DBox.cxx:317
 TMarker3DBox.cxx:318
 TMarker3DBox.cxx:319
 TMarker3DBox.cxx:320
 TMarker3DBox.cxx:321
 TMarker3DBox.cxx:322
 TMarker3DBox.cxx:323
 TMarker3DBox.cxx:324
 TMarker3DBox.cxx:325
 TMarker3DBox.cxx:326
 TMarker3DBox.cxx:327
 TMarker3DBox.cxx:328
 TMarker3DBox.cxx:329
 TMarker3DBox.cxx:330
 TMarker3DBox.cxx:331
 TMarker3DBox.cxx:332
 TMarker3DBox.cxx:333
 TMarker3DBox.cxx:334
 TMarker3DBox.cxx:335
 TMarker3DBox.cxx:336
 TMarker3DBox.cxx:337
 TMarker3DBox.cxx:338
 TMarker3DBox.cxx:339
 TMarker3DBox.cxx:340
 TMarker3DBox.cxx:341
 TMarker3DBox.cxx:342
 TMarker3DBox.cxx:343
 TMarker3DBox.cxx:344
 TMarker3DBox.cxx:345
 TMarker3DBox.cxx:346
 TMarker3DBox.cxx:347
 TMarker3DBox.cxx:348
 TMarker3DBox.cxx:349
 TMarker3DBox.cxx:350
 TMarker3DBox.cxx:351
 TMarker3DBox.cxx:352
 TMarker3DBox.cxx:353
 TMarker3DBox.cxx:354
 TMarker3DBox.cxx:355
 TMarker3DBox.cxx:356
 TMarker3DBox.cxx:357
 TMarker3DBox.cxx:358
 TMarker3DBox.cxx:359
 TMarker3DBox.cxx:360
 TMarker3DBox.cxx:361
 TMarker3DBox.cxx:362
 TMarker3DBox.cxx:363
 TMarker3DBox.cxx:364
 TMarker3DBox.cxx:365
 TMarker3DBox.cxx:366
 TMarker3DBox.cxx:367
 TMarker3DBox.cxx:368
 TMarker3DBox.cxx:369
 TMarker3DBox.cxx:370
 TMarker3DBox.cxx:371
 TMarker3DBox.cxx:372
 TMarker3DBox.cxx:373
 TMarker3DBox.cxx:374
 TMarker3DBox.cxx:375
 TMarker3DBox.cxx:376
 TMarker3DBox.cxx:377
 TMarker3DBox.cxx:378
 TMarker3DBox.cxx:379
 TMarker3DBox.cxx:380
 TMarker3DBox.cxx:381
 TMarker3DBox.cxx:382
 TMarker3DBox.cxx:383
 TMarker3DBox.cxx:384
 TMarker3DBox.cxx:385
 TMarker3DBox.cxx:386
 TMarker3DBox.cxx:387
 TMarker3DBox.cxx:388
 TMarker3DBox.cxx:389
 TMarker3DBox.cxx:390
 TMarker3DBox.cxx:391
 TMarker3DBox.cxx:392
 TMarker3DBox.cxx:393
 TMarker3DBox.cxx:394
 TMarker3DBox.cxx:395
 TMarker3DBox.cxx:396
 TMarker3DBox.cxx:397
 TMarker3DBox.cxx:398
 TMarker3DBox.cxx:399
 TMarker3DBox.cxx:400
 TMarker3DBox.cxx:401
 TMarker3DBox.cxx:402
 TMarker3DBox.cxx:403
 TMarker3DBox.cxx:404
 TMarker3DBox.cxx:405
 TMarker3DBox.cxx:406
 TMarker3DBox.cxx:407
 TMarker3DBox.cxx:408
 TMarker3DBox.cxx:409
 TMarker3DBox.cxx:410
 TMarker3DBox.cxx:411
 TMarker3DBox.cxx:412
 TMarker3DBox.cxx:413
 TMarker3DBox.cxx:414
 TMarker3DBox.cxx:415
 TMarker3DBox.cxx:416
 TMarker3DBox.cxx:417
 TMarker3DBox.cxx:418
 TMarker3DBox.cxx:419
 TMarker3DBox.cxx:420
 TMarker3DBox.cxx:421
 TMarker3DBox.cxx:422
 TMarker3DBox.cxx:423
 TMarker3DBox.cxx:424
 TMarker3DBox.cxx:425
 TMarker3DBox.cxx:426
 TMarker3DBox.cxx:427
 TMarker3DBox.cxx:428
 TMarker3DBox.cxx:429
 TMarker3DBox.cxx:430
 TMarker3DBox.cxx:431
 TMarker3DBox.cxx:432
 TMarker3DBox.cxx:433
 TMarker3DBox.cxx:434
 TMarker3DBox.cxx:435
 TMarker3DBox.cxx:436
 TMarker3DBox.cxx:437
 TMarker3DBox.cxx:438
 TMarker3DBox.cxx:439
 TMarker3DBox.cxx:440
 TMarker3DBox.cxx:441
 TMarker3DBox.cxx:442
 TMarker3DBox.cxx:443
 TMarker3DBox.cxx:444
 TMarker3DBox.cxx:445
 TMarker3DBox.cxx:446
 TMarker3DBox.cxx:447
 TMarker3DBox.cxx:448
 TMarker3DBox.cxx:449
 TMarker3DBox.cxx:450
 TMarker3DBox.cxx:451
 TMarker3DBox.cxx:452
 TMarker3DBox.cxx:453
 TMarker3DBox.cxx:454
 TMarker3DBox.cxx:455
 TMarker3DBox.cxx:456
 TMarker3DBox.cxx:457
 TMarker3DBox.cxx:458
 TMarker3DBox.cxx:459
 TMarker3DBox.cxx:460
 TMarker3DBox.cxx:461
 TMarker3DBox.cxx:462
 TMarker3DBox.cxx:463
 TMarker3DBox.cxx:464
 TMarker3DBox.cxx:465
 TMarker3DBox.cxx:466
 TMarker3DBox.cxx:467
 TMarker3DBox.cxx:468
 TMarker3DBox.cxx:469
 TMarker3DBox.cxx:470
 TMarker3DBox.cxx:471
 TMarker3DBox.cxx:472
 TMarker3DBox.cxx:473
 TMarker3DBox.cxx:474
 TMarker3DBox.cxx:475
 TMarker3DBox.cxx:476
 TMarker3DBox.cxx:477
 TMarker3DBox.cxx:478
 TMarker3DBox.cxx:479
 TMarker3DBox.cxx:480
 TMarker3DBox.cxx:481
 TMarker3DBox.cxx:482
 TMarker3DBox.cxx:483
 TMarker3DBox.cxx:484
 TMarker3DBox.cxx:485
 TMarker3DBox.cxx:486
 TMarker3DBox.cxx:487
 TMarker3DBox.cxx:488
 TMarker3DBox.cxx:489
 TMarker3DBox.cxx:490
 TMarker3DBox.cxx:491
 TMarker3DBox.cxx:492
 TMarker3DBox.cxx:493