// @(#)root/table:$Id$
// Author: Valery Fine(fine@bnl.gov)   25/12/98

/*************************************************************************
 * 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.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TVolumePosition                                                      //
//                                                                      //
// Description of parameters to position a 3-D geometry object          //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TVolumePosition
#define ROOT_TVolumePosition

#include "TVolume.h"

class TBrowser;
class TRotMatrix;

class TVolumePosition  : public TObject {
protected:
   Double_t        fX[3];        //X offset with respect to parent object
   TRotMatrix     *fMatrix;      //Pointer to rotation matrix
   TVolume        *fNode;        //Refs pointer to the node defined
   UInt_t          fId;          // Unique ID of this position

protected:
   void DeleteOwnMatrix();

public:
   enum EPositionBits {
       kIsOwn      = BIT(23)   // if the TVolumePoistion doesn't own the TRotMatrix object
   };
   TVolumePosition(TVolume *node=0,Double_t x=0, Double_t y=0, Double_t z=0, TRotMatrix *matrix=0);
   TVolumePosition(TVolume *node,Double_t x, Double_t y, Double_t z, const char *matrixname);
   TVolumePosition(const TVolumePosition* oldPosition, const TVolumePosition* curPosition);
   TVolumePosition(const TVolumePosition&pos);
   virtual ~TVolumePosition();
   virtual void        Browse(TBrowser *b);
   virtual Float_t    *Errmx2Local (const Float_t *masterError, Float_t *localError  ) const;
   virtual Double_t   *Errmx2Local (const Double_t *masterError, Double_t *localError) const;
   virtual Float_t    *Errmx2Master(const Float_t *localError, Float_t *masterError  ) const;
   virtual Double_t   *Errmx2Master(const Double_t *localError, Double_t *masterError) const;
   virtual Double_t   *Cormx2Local (const Double_t *masterCorr, Double_t *localCorr  ) const;
   virtual Float_t    *Cormx2Local (const Float_t *masterCorr, Float_t *localCorr    ) const;
   virtual Double_t   *Cormx2Master(const Double_t *localCorr, Double_t *masterCorr  ) const;
   virtual Float_t    *Cormx2Master(const Float_t *localCorr, Float_t *masterCorr    ) const;
   virtual Double_t   *Master2Local(const Double_t *master, Double_t *local,Int_t nPoints=1) const;
   virtual Float_t    *Master2Local(const Float_t *master, Float_t *local,Int_t nPoints=1) const;

   virtual Int_t       DistancetoPrimitive(Int_t px, Int_t py);
   virtual TDataSet *DefineSet();
   virtual void        Draw(Option_t *depth="3"); // *MENU*
   virtual void        ExecuteEvent(Int_t event, Int_t px, Int_t py);
   virtual TVolume     *GetNode() const {return fNode;}
   virtual char      *GetObjectInfo(Int_t px, Int_t py) const;
   const   Option_t    *GetOption() const { return GetNode()?GetNode()->GetOption():0;}
   virtual const Char_t *GetName() const;
   const TRotMatrix    *GetMatrix() const;
   TRotMatrix          *GetMatrix();

   Int_t               GetVisibility() const {return GetNode()?GetNode()->GetVisibility():0;}
   virtual Double_t    GetX(Int_t indx=0) const {return fX[indx];}
   virtual const Double_t *GetXYZ() const {return fX;}
   virtual Double_t    GetY() const {return fX[1];}
   virtual Double_t    GetZ() const {return fX[2];}
   virtual UInt_t      GetId() const {return fId;}
   Bool_t              IsMatrixOwner() const;
   Bool_t              SetMatrixOwner(Bool_t ownerShips=kTRUE);
   Bool_t              IsFolder() const {return GetNode()?kTRUE:kFALSE;}
   virtual Bool_t      Is3D() const {return kTRUE;}
   virtual Double_t   *Local2Master(const Double_t *local, Double_t *master,Int_t nPoints=1) const;
   virtual Float_t    *Local2Master(const Float_t *local, Float_t *master,Int_t nPoints=1) const;
   virtual TVolumePosition &Mult(const TVolumePosition &position);
   virtual void        Paint(Option_t *option="");
   virtual void        Print(Option_t *option="") const;
   virtual void        UpdatePosition(Option_t *option="");
   virtual TVolumePosition *Reset(TVolume *node=0,Double_t x=0, Double_t y=0, Double_t z=0, TRotMatrix *matrix=0);
   virtual void        SavePrimitive(std::ostream &out, Option_t *option = "");
   virtual void        SetLineAttributes(); // *MENU*
   virtual void        SetMatrix(TRotMatrix *matrix=0);
   virtual void        SetNode(TVolume *node){ fNode = node;}
   virtual void        SetPosition( Double_t x=0, Double_t y=0, Double_t z=0) {fX[0]=x; fX[1]=y; fX[2]=z;}
   virtual void        SetVisibility(Int_t vis=1); // *MENU*
   virtual void        SetX(Double_t x){ fX[0]  =  x;}
   virtual void        SetY(Double_t y){ fX[1]  =  y;}
   virtual void        SetZ(Double_t z){ fX[2]  =  z;}
   virtual void        SetXYZ(Double_t *xyz = 0);
   virtual void        SetId(UInt_t id){fId  = id;}
   TVolumePosition    &operator=(const TVolumePosition &rhs);
   ClassDef(TVolumePosition,2)  //Description of parameters to position a 3-D geometry object
};

//______________________________________________________________________________
inline TDataSet *TVolumePosition::DefineSet(){ return GetNode(); }
//______________________________________________________________________________
inline void TVolumePosition::DeleteOwnMatrix()
{
   if (IsMatrixOwner()) {
      TRotMatrix *erasing = fMatrix;
      fMatrix = 0;
      delete erasing;
   }
}
//______________________________________________________________________________
inline TRotMatrix *TVolumePosition::GetMatrix()
{   return fMatrix;                           }
//______________________________________________________________________________
inline const TRotMatrix *TVolumePosition::GetMatrix() const
{   return fMatrix;                                }
//______________________________________________________________________________
inline Bool_t TVolumePosition::SetMatrixOwner(Bool_t ownerShips)
{
   Bool_t currentOwner = IsMatrixOwner();
   SetBit(kIsOwn,ownerShips);
   return currentOwner;
}
//______________________________________________________________________________
inline Bool_t TVolumePosition::IsMatrixOwner() const
{
  // Check whether this object owns the TRotMatrix (to be deleted for example)
  // Note: This method is to be caleed from dtor.
  //       It is dangerous to make it virtual
   return TestBit(kIsOwn);
}
//______________________________________________________________________________
inline  TVolumePosition    &TVolumePosition::operator=(const TVolumePosition &rhs) {
   if (this != &rhs) {
      for (int i = 0; i < 3; i++) fX[i] = rhs.fX[i];
      fMatrix = rhs.fMatrix;
      fNode   = rhs.fNode;
      fId     = rhs.fId;
   }
   return *this;
}
//______________________________________________________________________________
std::ostream& operator<<(std::ostream& s,const TVolumePosition &target);
#endif
 TVolumePosition.h:1
 TVolumePosition.h:2
 TVolumePosition.h:3
 TVolumePosition.h:4
 TVolumePosition.h:5
 TVolumePosition.h:6
 TVolumePosition.h:7
 TVolumePosition.h:8
 TVolumePosition.h:9
 TVolumePosition.h:10
 TVolumePosition.h:11
 TVolumePosition.h:12
 TVolumePosition.h:13
 TVolumePosition.h:14
 TVolumePosition.h:15
 TVolumePosition.h:16
 TVolumePosition.h:17
 TVolumePosition.h:18
 TVolumePosition.h:19
 TVolumePosition.h:20
 TVolumePosition.h:21
 TVolumePosition.h:22
 TVolumePosition.h:23
 TVolumePosition.h:24
 TVolumePosition.h:25
 TVolumePosition.h:26
 TVolumePosition.h:27
 TVolumePosition.h:28
 TVolumePosition.h:29
 TVolumePosition.h:30
 TVolumePosition.h:31
 TVolumePosition.h:32
 TVolumePosition.h:33
 TVolumePosition.h:34
 TVolumePosition.h:35
 TVolumePosition.h:36
 TVolumePosition.h:37
 TVolumePosition.h:38
 TVolumePosition.h:39
 TVolumePosition.h:40
 TVolumePosition.h:41
 TVolumePosition.h:42
 TVolumePosition.h:43
 TVolumePosition.h:44
 TVolumePosition.h:45
 TVolumePosition.h:46
 TVolumePosition.h:47
 TVolumePosition.h:48
 TVolumePosition.h:49
 TVolumePosition.h:50
 TVolumePosition.h:51
 TVolumePosition.h:52
 TVolumePosition.h:53
 TVolumePosition.h:54
 TVolumePosition.h:55
 TVolumePosition.h:56
 TVolumePosition.h:57
 TVolumePosition.h:58
 TVolumePosition.h:59
 TVolumePosition.h:60
 TVolumePosition.h:61
 TVolumePosition.h:62
 TVolumePosition.h:63
 TVolumePosition.h:64
 TVolumePosition.h:65
 TVolumePosition.h:66
 TVolumePosition.h:67
 TVolumePosition.h:68
 TVolumePosition.h:69
 TVolumePosition.h:70
 TVolumePosition.h:71
 TVolumePosition.h:72
 TVolumePosition.h:73
 TVolumePosition.h:74
 TVolumePosition.h:75
 TVolumePosition.h:76
 TVolumePosition.h:77
 TVolumePosition.h:78
 TVolumePosition.h:79
 TVolumePosition.h:80
 TVolumePosition.h:81
 TVolumePosition.h:82
 TVolumePosition.h:83
 TVolumePosition.h:84
 TVolumePosition.h:85
 TVolumePosition.h:86
 TVolumePosition.h:87
 TVolumePosition.h:88
 TVolumePosition.h:89
 TVolumePosition.h:90
 TVolumePosition.h:91
 TVolumePosition.h:92
 TVolumePosition.h:93
 TVolumePosition.h:94
 TVolumePosition.h:95
 TVolumePosition.h:96
 TVolumePosition.h:97
 TVolumePosition.h:98
 TVolumePosition.h:99
 TVolumePosition.h:100
 TVolumePosition.h:101
 TVolumePosition.h:102
 TVolumePosition.h:103
 TVolumePosition.h:104
 TVolumePosition.h:105
 TVolumePosition.h:106
 TVolumePosition.h:107
 TVolumePosition.h:108
 TVolumePosition.h:109
 TVolumePosition.h:110
 TVolumePosition.h:111
 TVolumePosition.h:112
 TVolumePosition.h:113
 TVolumePosition.h:114
 TVolumePosition.h:115
 TVolumePosition.h:116
 TVolumePosition.h:117
 TVolumePosition.h:118
 TVolumePosition.h:119
 TVolumePosition.h:120
 TVolumePosition.h:121
 TVolumePosition.h:122
 TVolumePosition.h:123
 TVolumePosition.h:124
 TVolumePosition.h:125
 TVolumePosition.h:126
 TVolumePosition.h:127
 TVolumePosition.h:128
 TVolumePosition.h:129
 TVolumePosition.h:130
 TVolumePosition.h:131
 TVolumePosition.h:132
 TVolumePosition.h:133
 TVolumePosition.h:134
 TVolumePosition.h:135
 TVolumePosition.h:136
 TVolumePosition.h:137
 TVolumePosition.h:138
 TVolumePosition.h:139
 TVolumePosition.h:140
 TVolumePosition.h:141
 TVolumePosition.h:142
 TVolumePosition.h:143
 TVolumePosition.h:144
 TVolumePosition.h:145
 TVolumePosition.h:146