// @(#)root/geom:$Id$
// Author: Andrei Gheata   30/10/01

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

#ifndef ROOT_TGeoPatternFinder
#define ROOT_TGeoPatternFinder

#ifndef ROOT_TObject
#include "TObject.h"
#endif

#ifndef ROOT_TGeoVolume
#include "TGeoVolume.h"
#endif


class TGeoMatrix;

////////////////////////////////////////////////////////////////////////////////
//                                                                            //
// TGeoPatternFinder - base finder class for patterns. A pattern is specifying
//   a division type                                                          //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////

class TGeoPatternFinder : public TObject
{
public:
   struct ThreadData_t
   {
      TGeoMatrix      *fMatrix;         //! generic matrix
      Int_t            fCurrent;        //! current division element
      Int_t            fNextIndex;      //! index of next node

      ThreadData_t();
      ~ThreadData_t();
   private:
      ThreadData_t(const ThreadData_t&); // Not implemented
      ThreadData_t& operator=(const ThreadData_t&); // Not implemented
   };
   ThreadData_t& GetThreadData()   const;
   void          ClearThreadData() const;
   void          CreateThreadData(Int_t nthreads);

protected :
   enum EGeoPatternFlags {
      kPatternReflected = BIT(14),
      kPatternSpacedOut = BIT(15)
   };
   Double_t            fStep;           // division step length
   Double_t            fStart;          // starting point on divided axis
   Double_t            fEnd;            // ending point
   Int_t               fNdivisions;     // number of divisions
   Int_t               fDivIndex;       // index of first div. node
   TGeoVolume         *fVolume;         // volume to which applies

   mutable std::vector<ThreadData_t*> fThreadData; //! Vector of thread private transient data
   mutable Int_t                      fThreadSize; //! Size of the thread vector

protected:
   TGeoPatternFinder(const TGeoPatternFinder&);
   TGeoPatternFinder& operator=(const TGeoPatternFinder&);

public:
   // constructors
   TGeoPatternFinder();
   TGeoPatternFinder(TGeoVolume *vol, Int_t ndiv);
   // destructor
   virtual ~TGeoPatternFinder();
   // methods
   virtual TGeoMatrix* CreateMatrix() const = 0;
   virtual void        cd(Int_t /*idiv*/) {}
   virtual TGeoNode   *CdNext();
   virtual TGeoNode   *FindNode(Double_t * /*point*/, const Double_t * /*dir*/=0) {return 0;}
   virtual Int_t       GetByteCount() const {return 36;}
   Int_t               GetCurrent();//      {return fCurrent;}
   Int_t               GetDivIndex()     {return fDivIndex;}
   virtual Int_t       GetDivAxis()      {return 1;}
   virtual TGeoMatrix *GetMatrix();//       {return fMatrix;}
   Int_t               GetNdiv() const   {return fNdivisions;}
   Int_t               GetNext() const;//   {return fNextIndex;}
   TGeoNode           *GetNodeOffset(Int_t idiv) {return fVolume->GetNode(fDivIndex+idiv);}
   Double_t            GetStart() const  {return fStart;}
   Double_t            GetStep() const   {return fStep;}
   Double_t            GetEnd() const    {return fEnd;}
   TGeoVolume         *GetVolume() const {return fVolume;}
   virtual Bool_t      IsOnBoundary(const Double_t * /*point*/) const {return kFALSE;}
   Bool_t              IsReflected() const {return TObject::TestBit(kPatternReflected);}
   Bool_t              IsSpacedOut() const {return TObject::TestBit(kPatternSpacedOut);}
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE) = 0;
   void                Reflect(Bool_t flag=kTRUE) {TObject::SetBit(kPatternReflected,flag);}
   void                SetDivIndex(Int_t index) {fDivIndex = index;}
   void                SetNext(Int_t index);//     {fNextIndex = index;}
   void                SetRange(Double_t start, Double_t step, Int_t ndivisions);
   void                SetSpacedOut(Bool_t flag) {TObject::SetBit(kPatternSpacedOut,flag);}
   void                SetVolume(TGeoVolume *vol) {fVolume = vol;}
   virtual void        UpdateMatrix(Int_t , TGeoHMatrix &) const {}

   ClassDef(TGeoPatternFinder, 4)              // patterns to divide volumes
};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternX - a X axis divison pattern                                //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoTranslation;

class TGeoPatternX : public TGeoPatternFinder
{
public:
   // constructors
   TGeoPatternX();
   TGeoPatternX(TGeoVolume *vol, Int_t ndivisions);
   TGeoPatternX(TGeoVolume *vol, Int_t ndivisions, Double_t step);
   TGeoPatternX(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
   TGeoPatternX(const TGeoPatternX &pf);
   TGeoPatternX& operator=(const TGeoPatternX&);

   // destructor
   virtual ~TGeoPatternX();
   // methods
   virtual TGeoMatrix* CreateMatrix() const;
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual Double_t    FindNextBoundary(Double_t *point, Double_t *dir, Int_t &indnext);
   virtual Int_t       GetDivAxis()      {return 1;}
   virtual Bool_t      IsOnBoundary(const Double_t *point) const;
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternX, 1)              // X division pattern
};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternY - a Y axis divison pattern                                //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoPatternY : public TGeoPatternFinder
{
public:
   // constructors
   TGeoPatternY();
   TGeoPatternY(TGeoVolume *vol, Int_t ndivisions);
   TGeoPatternY(TGeoVolume *vol, Int_t ndivisions, Double_t step);
   TGeoPatternY(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
   TGeoPatternY(const TGeoPatternY &pf);
   TGeoPatternY& operator=(const TGeoPatternY&);
   // destructor
   virtual ~TGeoPatternY();
   // methods
   virtual TGeoMatrix* CreateMatrix() const;
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual Double_t    FindNextBoundary(Double_t *point, Double_t *dir, Int_t &indnext);
   virtual Int_t       GetDivAxis()      {return 2;}
   virtual Bool_t      IsOnBoundary(const Double_t *point) const;
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternY, 1)              // Y division pattern
};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternZ - a Z axis divison pattern                                //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoPatternZ : public TGeoPatternFinder
{
public:
   // constructors
   TGeoPatternZ();
   TGeoPatternZ(TGeoVolume *vol, Int_t ndivisions);
   TGeoPatternZ(TGeoVolume *vol, Int_t ndivisions, Double_t step);
   TGeoPatternZ(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
   TGeoPatternZ(const TGeoPatternZ &pf);
   TGeoPatternZ& operator=(const TGeoPatternZ&);
   // destructor
   virtual ~TGeoPatternZ();
   // methods
   virtual TGeoMatrix* CreateMatrix() const;
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual Double_t    FindNextBoundary(Double_t *point, Double_t *dir, Int_t &indnext);
   virtual Int_t       GetDivAxis()      {return 3;}
   virtual Bool_t      IsOnBoundary(const Double_t *point) const;
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternZ, 1)              // Z division pattern
};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternParaX - a X axis divison pattern for PARA shapes            //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoPatternParaX : public TGeoPatternFinder
{
public:
   // constructors
   TGeoPatternParaX();
   TGeoPatternParaX(TGeoVolume *vol, Int_t ndivisions);
   TGeoPatternParaX(TGeoVolume *vol, Int_t ndivisions, Double_t step);
   TGeoPatternParaX(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
   TGeoPatternParaX(const TGeoPatternParaX &pf);
   TGeoPatternParaX& operator=(const TGeoPatternParaX&);

   // destructor
   virtual ~TGeoPatternParaX();
   // methods
   virtual TGeoMatrix* CreateMatrix() const;
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual Int_t       GetDivAxis()      {return 1;}
   virtual Bool_t      IsOnBoundary(const Double_t *point) const;
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternParaX, 1)              // Para X division pattern
};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternParaY - a Y axis divison pattern for PARA shapes            //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoPatternParaY : public TGeoPatternFinder
{
private :
// data members
   Double_t         fTxy;      // tangent of alpha
public:
   // constructors
   TGeoPatternParaY();
   TGeoPatternParaY(TGeoVolume *vol, Int_t ndivisions);
   TGeoPatternParaY(TGeoVolume *vol, Int_t ndivisions, Double_t step);
   TGeoPatternParaY(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
   TGeoPatternParaY(const TGeoPatternParaY &pf);
   TGeoPatternParaY& operator=(const TGeoPatternParaY&);

   // destructor
   virtual ~TGeoPatternParaY();
   // methods
   virtual TGeoMatrix* CreateMatrix() const;
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual Int_t       GetDivAxis()      {return 2;}
   virtual Bool_t      IsOnBoundary(const Double_t *point) const;
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternParaY, 1)              // Para Y division pattern
};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternParaZ - a Z axis divison pattern for PARA shapes            //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoPatternParaZ : public TGeoPatternFinder
{
private :
// data members
   Double_t            fTxz;  // tangent of alpha xz
   Double_t            fTyz;  // tangent of alpha yz
public:
   // constructors
   TGeoPatternParaZ();
   TGeoPatternParaZ(TGeoVolume *vol, Int_t ndivisions);
   TGeoPatternParaZ(TGeoVolume *vol, Int_t ndivisions, Double_t step);
   TGeoPatternParaZ(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
   TGeoPatternParaZ(const TGeoPatternParaZ &pf);
   TGeoPatternParaZ& operator=(const TGeoPatternParaZ&);

   // destructor
   virtual ~TGeoPatternParaZ();
   // methods
   virtual TGeoMatrix* CreateMatrix() const;
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual Int_t       GetDivAxis()      {return 3;}
   virtual Bool_t      IsOnBoundary(const Double_t *point) const;
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternParaZ, 1)              // Para Z division pattern
};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternTrapZ - a Z axis divison pattern for TRAP or GTRA shapes    //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoPatternTrapZ : public TGeoPatternFinder
{
private :
// data members
   Double_t            fTxz;  // tangent of alpha xz
   Double_t            fTyz;  // tangent of alpha yz
public:
   // constructors
   TGeoPatternTrapZ();
   TGeoPatternTrapZ(TGeoVolume *vol, Int_t ndivisions);
   TGeoPatternTrapZ(TGeoVolume *vol, Int_t ndivisions, Double_t step);
   TGeoPatternTrapZ(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
   TGeoPatternTrapZ(const TGeoPatternTrapZ &pf);
   TGeoPatternTrapZ& operator=(const TGeoPatternTrapZ&);

   // destructor
   virtual ~TGeoPatternTrapZ();
   // methods
   virtual TGeoMatrix* CreateMatrix() const;
   Double_t            GetTxz() const {return fTxz;}
   Double_t            GetTyz() const {return fTyz;}
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual Int_t       GetDivAxis()      {return 3;}
   virtual Bool_t      IsOnBoundary(const Double_t *point) const;
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternTrapZ, 1)              // Trap od Gtra Z division pattern
};


////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternCylR - a cylindrical R divison pattern                      //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoPatternCylR : public TGeoPatternFinder
{
public:
   // constructors
   TGeoPatternCylR();
   TGeoPatternCylR(TGeoVolume *vol, Int_t ndivisions);
   TGeoPatternCylR(TGeoVolume *vol, Int_t ndivisions, Double_t step);
   TGeoPatternCylR(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
   TGeoPatternCylR(const TGeoPatternCylR &pf);
   TGeoPatternCylR& operator=(const TGeoPatternCylR&);
   // destructor
   virtual ~TGeoPatternCylR();
   // methods
   virtual TGeoMatrix* CreateMatrix() const;
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual Int_t       GetDivAxis()      {return 1;}
   virtual Bool_t      IsOnBoundary(const Double_t *point) const;
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternCylR, 1)              // Cylindrical R division pattern
};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternCylPhi - a cylindrical phi divison pattern                  //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoPatternCylPhi : public TGeoPatternFinder
{
private :
// data members
   Double_t           *fSinCos;          //![2*fNdivisions] table of sines/cosines

protected:
   TGeoPatternCylPhi(const TGeoPatternCylPhi& pfc)
     : TGeoPatternFinder(pfc), fSinCos(pfc.fSinCos) {CreateThreadData(1);}
   TGeoPatternCylPhi& operator=(const TGeoPatternCylPhi& pfc)
     {if(this!=&pfc) {TGeoPatternFinder::operator=(pfc); fSinCos=pfc.fSinCos; CreateThreadData(1);}
     return *this;}

public:
   // constructors
   TGeoPatternCylPhi();
   TGeoPatternCylPhi(TGeoVolume *vol, Int_t ndivisions);
   TGeoPatternCylPhi(TGeoVolume *vol, Int_t ndivisions, Double_t step);
   TGeoPatternCylPhi(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
   // destructor
   virtual ~TGeoPatternCylPhi();
   // methods
   virtual TGeoMatrix* CreateMatrix() const;
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual Int_t       GetDivAxis()      {return 2;}
   virtual Bool_t      IsOnBoundary(const Double_t *point) const;
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternCylPhi, 1)              // Cylindrical phi division pattern
};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternSphR - a spherical R divison pattern                        //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoPatternSphR : public TGeoPatternFinder
{
public:
   // constructors
   TGeoPatternSphR();
   TGeoPatternSphR(TGeoVolume *vol, Int_t ndivisions);
   TGeoPatternSphR(TGeoVolume *vol, Int_t ndivisions, Double_t step);
   TGeoPatternSphR(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
   TGeoPatternSphR(const TGeoPatternSphR &pf);
   TGeoPatternSphR& operator=(const TGeoPatternSphR&);
   // destructor
   virtual ~TGeoPatternSphR();
   // methods
   virtual TGeoMatrix* CreateMatrix() const;
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual Int_t       GetDivAxis()      {return 1;}
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternSphR, 1)              // spherical R division pattern
};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternSphTheta - a spherical theta divison pattern                //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoPatternSphTheta : public TGeoPatternFinder
{
public:
   // constructors
   TGeoPatternSphTheta();
   TGeoPatternSphTheta(TGeoVolume *vol, Int_t ndivisions);
   TGeoPatternSphTheta(TGeoVolume *vol, Int_t ndivisions, Double_t step);
   TGeoPatternSphTheta(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
   TGeoPatternSphTheta(const TGeoPatternSphTheta &pf);
   TGeoPatternSphTheta& operator=(const TGeoPatternSphTheta&);
   // destructor
   virtual ~TGeoPatternSphTheta();
   // methods
   virtual TGeoMatrix* CreateMatrix() const;
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual Int_t       GetDivAxis()      {return 3;}
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternSphTheta, 1)              // spherical theta division pattern
};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternSphPhi - a spherical phi divison pattern                    //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoPatternSphPhi : public TGeoPatternFinder
{
private:
   Double_t           *fSinCos;         //! Sincos table

protected:
   TGeoPatternSphPhi(const TGeoPatternSphPhi& pfc); // Not implemented
   TGeoPatternSphPhi& operator=(const TGeoPatternSphPhi& pfc); // Not implemented
   Double_t           *CreateSinCos();
public:
   // constructors
   TGeoPatternSphPhi();
   TGeoPatternSphPhi(TGeoVolume *vol, Int_t ndivisions);
   TGeoPatternSphPhi(TGeoVolume *vol, Int_t ndivisions, Double_t step);
   TGeoPatternSphPhi(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
   // destructor
   virtual ~TGeoPatternSphPhi();
   // methods
   virtual TGeoMatrix* CreateMatrix() const;
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual Int_t       GetDivAxis()      {return 2;}
   virtual Bool_t      IsOnBoundary(const Double_t *point) const;
   virtual
   TGeoPatternFinder  *MakeCopy(Bool_t reflect=kFALSE);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternSphPhi, 1)              // Spherical phi division pattern
};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoPatternHoneycomb - a divison pattern specialized for honeycombs    //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoPatternHoneycomb : public TGeoPatternFinder
{
private :
// data members
   Int_t               fNrows;                  // number of rows
   Int_t               fAxisOnRows;             // axis along each row
   Int_t              *fNdivisions;             // [fNrows] number of divisions for each row
   Double_t           *fStart;                  // [fNrows] starting points for each row

protected:
   TGeoPatternHoneycomb(const TGeoPatternHoneycomb&);
   TGeoPatternHoneycomb& operator=(const TGeoPatternHoneycomb&);

public:
   // constructors
   TGeoPatternHoneycomb();
   TGeoPatternHoneycomb(TGeoVolume *vol, Int_t nrows);
   // destructor
   virtual ~TGeoPatternHoneycomb();
   // methods
   TGeoPatternFinder  *MakeCopy(Bool_t) {return 0;}
   virtual TGeoMatrix* CreateMatrix() const;
   virtual void        cd(Int_t idiv);
   virtual TGeoNode   *FindNode(Double_t *point, const Double_t *dir=0);
   virtual void        UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix) const;

   ClassDef(TGeoPatternHoneycomb, 1)             // pattern for honeycomb divisions
};

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