ROOT logo
// @(#)root/table:$Id: TVolumePosition.cxx 27157 2009-01-15 14:05:12Z brun $
// 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.             *
 *************************************************************************/


#include "Riostream.h"

#include "TCernLib.h"
#include "TVolumePosition.h"
#include "TVolume.h"

#include "TROOT.h"
#include "TClass.h"
#include "TVirtualPad.h"
#include "TGeometry.h"
#include "TRotMatrix.h"
#include "TBrowser.h"
#include "X3DBuffer.h"

#include "TTablePadView3D.h"

//R__EXTERN  Size3D gSize3D;

ClassImp(TVolumePosition)

//______________________________________________________________________________
//*-*-*-*-*-*-*-*-* S T N O D E P O S I T I O N   description *-*-*-*-*-*-*-*-*-
//*-*               ===========================
//*-*
//*-*    A TVolumePosition object is used to build the geometry hierarchy (see TGeometry).
//*-*    A node may contain other nodes.
//*-*
//*-*    A geometry node has attributes:
//*-*      - name and title
//*-*      - pointer to the referenced shape (see TShape).
//*-*      - x,y,z offset with respect to the mother node.
//*-*      - pointer to the rotation matrix (see TRotMatrix).
//*-*
//*-*    A node can be drawn.
//*-*
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*


//______________________________________________________________________________
TVolumePosition::TVolumePosition(TVolume *node,Double_t x, Double_t y, Double_t z, const char *matrixname)
: fMatrix(0),fNode(node),fId(0)
{
//*-*-*-*-*-*-*-*-*-*-*Node normal constructor*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
//*-*                  ======================
//*-*
//*-*    name    is the name of the node
//*-*    title   is title
//*-*    x,y,z   are the offsets of the volume with respect to his mother
//*-*    matrixname  is the name of the rotation matrix
//*-*
//*-*    This new node is added into the list of sons of the current node
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
   SetMatrixOwner(kFALSE);
   fX[0] = x; fX[1] =y; fX[2] = z;
   if (!node) return;
   static Int_t counter = 0;
   counter++;
   if(!(counter%1000))cout<<"TVolumePosition count="<<counter<<" name="<<node->GetName()<<endl;

   if (!gGeometry) new TGeometry;
   if (matrixname && strlen(matrixname)) fMatrix = gGeometry->GetRotMatrix(matrixname);
   if (!fMatrix) fMatrix = TVolume::GetIdentity();
}


//______________________________________________________________________________
TVolumePosition::TVolumePosition(TVolume *node,Double_t x, Double_t y, Double_t z, TRotMatrix *matrix)
               : fMatrix(matrix),fNode(node),fId(0)
{
//*-*-*-*-*-*-*-*-*-*-*Node normal constructor*-*-*-*-*-*-*-*-*-*-*
//*-*                  ================================
//*-*
//*-*    name    is the name of the node
//*-*    title   is title
//*-*    x,y,z   are the offsets of the volume with respect to his mother
//*-*    matrix  is the pointer to the rotation matrix
//*-*
//*-*    This new node is added into the list of sons of the current node
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
   SetMatrixOwner(kFALSE);
   if (!gGeometry) new TGeometry;
   fX[0] = x; fX[1] = y; fX[2] = z;
   if (!fMatrix) fMatrix = TVolume::GetIdentity();
}
//______________________________________________________________________________
TVolumePosition::TVolumePosition(const TVolumePosition* oldPosition, const TVolumePosition* curPosition){
   // Pick the "old" position by pieces
   SetMatrixOwner(kFALSE);
   TVolume *curNode = 0;
   UInt_t curPositionId    = 0;
   TRotMatrix *curMatrix = 0;
   if (curPosition) {
      curNode       = curPosition->GetNode();
      curPositionId = curPosition->GetId();
      curMatrix     = (TRotMatrix *) curPosition->GetMatrix();
   }
   TRotMatrix *oldMatrix = 0;
   Double_t oldTranslation[] = { 0, 0, 0 };
   if (oldPosition) {
      oldMatrix         = (TRotMatrix *) oldPosition->GetMatrix();
      oldTranslation[0] = oldPosition->GetX();
      oldTranslation[1] = oldPosition->GetY();
      oldTranslation[2] = oldPosition->GetZ();
   }

   // Pick the "current" position by pieces

   // Create a new position
   Double_t newMatrix[9];

   if(oldMatrix)  {
      TGeometry::UpdateTempMatrix(oldTranslation,oldMatrix->GetMatrix(),
                                 curPosition->GetX(),curPosition->GetY(),curPosition->GetZ(),
                                 curMatrix->GetMatrix(),
                                 fX,newMatrix);
      Int_t num = gGeometry->GetListOfMatrices()->GetSize();
      Char_t anum[100];
      sprintf(anum,"%d",num+1);
      fMatrix = new TRotMatrix(anum,"NodeView",newMatrix);
      SetMatrixOwner(kTRUE);
   } else {
      fX[0] = oldTranslation[0] + curPosition->GetX();
      fX[1] = oldTranslation[1] + curPosition->GetY();
      fX[2] = oldTranslation[2] + curPosition->GetZ();
      fMatrix = curMatrix;
   }
   fId = curPositionId;
   fNode = curNode;
}
//______________________________________________________________________________
//______________________________________________________________________________
TVolumePosition::TVolumePosition(const TVolumePosition&pos): TObject()
      , fMatrix(((TVolumePosition &)pos).GetMatrix()),fNode(pos.GetNode()),fId(pos.GetId())
{
   //to be documented
   for (int i=0;i<3;i++) fX[i] = pos.GetX(i);
   // Transferring the ownership.
   // The last created object owns the matrix if any.
   // The source object gives up its ownership in favour of the destination object

   SetMatrixOwner(pos.IsMatrixOwner());
   // !!! We have to break the "const'ness" at this point to take the ownerships
   ((TVolumePosition &)pos).SetMatrixOwner(kFALSE);
}

//______________________________________________________________________________
TVolumePosition::~TVolumePosition()
{
   //to be documented
   DeleteOwnMatrix();
}
//______________________________________________________________________________
void TVolumePosition::Browse(TBrowser *b)
{
   //to be documented
   if (GetNode()) {
      TShape *shape = GetNode()->GetShape();
      b->Add(GetNode(),shape?shape->GetName():GetNode()->GetName());
   } else {
      Draw();
      gPad->Update();
   }
}

//______________________________________________________________________________
Int_t TVolumePosition::DistancetoPrimitive(Int_t, Int_t)
{
//*-*-*-*-*-*-*-*-*-*-*Compute distance from point px,py to a Node*-*-*-*-*-*
//*-*                  ===========================================
//*-*  Compute the closest distance of approach from point px,py to this node.
//*-*  The distance is computed in pixels units.
//*-*
//*-*
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
   return 99999;
}

//______________________________________________________________________________
void TVolumePosition::Draw(Option_t *option)
{
//*-*-*-*-*-*-*-*-*-*-*-*Draw Referenced node with current parameters*-*-*-*
//*-*                   =============================================
   TVolume *node = GetNode();
   if (node) node->Draw(option);
}


//______________________________________________________________________________
void TVolumePosition::ExecuteEvent(Int_t, Int_t, Int_t)
{
//*-*-*-*-*-*-*-*-*-*-*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);

//   if (!gPad->GetListOfPrimitives()->FindObject(this)) gPad->SetCursor(kCross);
   gPad->SetCursor(kHand);
}

//______________________________________________________________________________
const Char_t *TVolumePosition::GetName() const
{
   //return VolumePosition name
   return GetNode()?GetNode()->GetName():IsA()->GetName();
}

//______________________________________________________________________________
char *TVolumePosition::GetObjectInfo(Int_t, Int_t) const
{
   //to be documented
   if (!gPad) return 0;
   if (!GetNode()) return 0;
   static char info[64];
   sprintf(info,"%s/%s, shape=%s/%s",GetNode()->GetName(),GetNode()->GetTitle(),GetNode()->GetShape()->GetName(),GetNode()->GetShape()->ClassName());
   return info;
}

//______________________________________________________________________________
Double_t *TVolumePosition::Errmx2Master(const Double_t *localError, Double_t *masterError) const
{
   //to be documented
   Double_t error[6];
   TCL::vzero(&error[1],4);
   error[0] = localError[0]; error[2] = localError[1]; error[5] = localError[2];
   return Cormx2Master(error, masterError);
}

//______________________________________________________________________________
Float_t *TVolumePosition::Errmx2Master(const Float_t *localError, Float_t *masterError) const
{
   //to be documented
   Float_t error[6];
   TCL::vzero(&error[1],4);
   error[0] = localError[0]; error[2] = localError[1]; error[5] = localError[2];
   return Cormx2Master(error, masterError);
}

//______________________________________________________________________________
Double_t *TVolumePosition::Cormx2Master(const Double_t *localCorr, Double_t *masterCorr)const
{
   //to be documented
   Double_t *res = 0;
   const TRotMatrix *rm = GetMatrix();
   double *m = 0;
   if (rm && ( m = ((TRotMatrix *)rm)->GetMatrix()) )
      res = TCL::trasat(m,(Double_t *)localCorr,masterCorr,3,3);
   else
      res = TCL::ucopy(localCorr,masterCorr,6);
   return res;
}

//______________________________________________________________________________
Float_t *TVolumePosition::Cormx2Master(const Float_t *localCorr, Float_t *masterCorr) const
{
   //to be documented
   Float_t *res = 0;
   const TRotMatrix *rm = GetMatrix();
   Double_t *m = 0;
   if (rm && (m = ((TRotMatrix *)rm)->GetMatrix()) ) {
      double corLocal[6], corGlobal[6];
      TCL::ucopy(localCorr,corLocal,6);
      TCL::trasat(m,corLocal,corGlobal,3,3);
      res =  TCL::ucopy(corGlobal,masterCorr,6);
   } else
      res =  TCL::ucopy(localCorr,masterCorr,6);
   return res;
}
//______________________________________________________________________________
Double_t *TVolumePosition::Errmx2Local(const Double_t *masterError, Double_t *localError) const
{
   //to be documented
   Double_t error[6];
   TCL::vzero(&error[1],4);
   error[0] = masterError[0]; error[2] = masterError[1]; error[5] = masterError[2];
   return Cormx2Local(error, localError);
}
//______________________________________________________________________________
Float_t *TVolumePosition::Errmx2Local(const Float_t *masterError, Float_t *localError) const
{
   //to be documented
   Float_t error[6];
   TCL::vzero(&error[1],4);
   error[0] = masterError[0]; error[2] = masterError[1]; error[5] = masterError[2];
   return Cormx2Local(error, localError);
}
//______________________________________________________________________________
Double_t *TVolumePosition::Cormx2Local(const Double_t *localCorr, Double_t *masterCorr) const
{
   //to be documented
   Double_t *res = 0;
   TRotMatrix *rm = (TRotMatrix *) GetMatrix();
   double *m = 0;
   if (rm && ( m = rm->GetMatrix()) )
      res = TCL::tratsa(m,(Double_t *)localCorr,masterCorr,3,3);
   else
      res = TCL::ucopy(localCorr,masterCorr,6);
   return res;
}

//______________________________________________________________________________
Float_t *TVolumePosition::Cormx2Local(const Float_t *localCorr, Float_t *masterCorr) const
{
   //to be documented
   Float_t *res = 0;
   TRotMatrix *rm = (TRotMatrix *) GetMatrix();
   Double_t *m = 0;
   if (rm && (m = rm->GetMatrix()) ) {
      double corLocal[6], corGlobal[6];
      TCL::ucopy(localCorr,corLocal,6);
      TCL::tratsa(m,corLocal,corGlobal,3,3);
      res =  TCL::ucopy(corGlobal,masterCorr,6);
   }
   else
      res =  TCL::ucopy(localCorr,masterCorr,6);
   return res;
}

//______________________________________________________________________________
Double_t *TVolumePosition::Local2Master(const Double_t *local, Double_t *master, Int_t nPoints) const
{
//*-*-*-*-*Convert one point from local system to master reference system*-*-*
//*-*      ==============================================================
//
//  Note that before invoking this function, the global rotation matrix
//  and translation vector for this node must have been computed.
//  This is automatically done by the Paint functions.
//  Otherwise TVolumePosition::UpdateMatrix should be called before.
   Double_t *matrix = 0;
   Double_t *trans = 0;
   if (!fMatrix ||  fMatrix == TVolume::GetIdentity() || !(matrix = ((TRotMatrix *)fMatrix)->GetMatrix()) )  {
      trans = master;
      for (int i =0; i < nPoints; i++,local += 3, master += 3) TCL::vadd(local,fX,master,3);
   } else {
      trans = master;
      for (int i =0; i < nPoints; i++, local += 3, master += 3) {
         TCL::mxmpy2(matrix,local,master,3,3,1);
         TCL::vadd(master,fX,master,3);
      }
   }
   return trans;
}

//______________________________________________________________________________
Float_t *TVolumePosition::Local2Master(const Float_t *local, Float_t *master, Int_t nPoints) const
{
   //*-*-*-*Convert nPoints points from local system to master reference system*-*-*
   //*-*      ==============================================================
   //
   //  Note that before invoking this function, the global rotation matrix
   //  and translation vector for this node must have been computed.
   //  This is automatically done by the Paint functions.
   //  Otherwise TVolumePosition::UpdateMatrix should be called before.
   //
   Double_t *matrix = 0;
   Float_t *trans = 0;
   if (!fMatrix ||  fMatrix == TVolume::GetIdentity() || !(matrix = ((TRotMatrix *)fMatrix)->GetMatrix()) )
   {
      trans = master;
      for (int i =0; i < nPoints; i++,local += 3, master += 3) TCL::vadd(local,fX,master,3);
   } else {
      trans = master;
      for (int i =0; i < nPoints; i++, local += 3, master += 3) {
         Double_t dlocal[3];   Double_t dmaster[3];
         TCL::ucopy(local,dlocal,3);
         TCL::mxmpy2(matrix,dlocal,dmaster,3,3,1);
         TCL::vadd(dmaster,fX,dmaster,3);
         TCL::ucopy(dmaster,master,3);
      }
   }
   return trans;
}
//______________________________________________________________________________
Double_t *TVolumePosition::Master2Local(const Double_t *master, Double_t *local, Int_t nPoints) const
{
   //*-*-*-*-*Convert one point from master system to local reference system*-*-*
   //*-*      ==============================================================
   //
   //  Note that before invoking this function, the global rotation matrix
   //  and translation vector for this node must have been computed.
   //  This is automatically done by the Paint functions.
   //  Otherwise TVolumePosition::UpdateMatrix should be called before.
   Double_t *matrix = 0;
   Double_t *trans = 0;
   if (!fMatrix ||  fMatrix == TVolume::GetIdentity() || !(matrix = ((TRotMatrix *)fMatrix)->GetMatrix()) ){
      trans = local;
      for (int i =0; i < nPoints; i++,master += 3, local += 3) TCL::vsub(master,fX,local,3);
   } else {
      trans = local;
      for (int i =0; i < nPoints; i++, master += 3, local += 3) {
         Double_t dlocal[3];
         TCL::vsub(master,fX,dlocal,3);
         TCL::mxmpy(matrix,dlocal,local,3,3,1);
      }
   }
   return trans;
}

//______________________________________________________________________________
Float_t *TVolumePosition::Master2Local(const Float_t *master, Float_t *local, Int_t nPoints) const
{
   //*-*-*-*Convert nPoints points from master system to local reference system*-*-*
   //*-*      ==============================================================
   //
   //  Note that before invoking this function, the global rotation matrix
   //  and translation vector for this node must have been computed.
   //  This is automatically done by the Paint functions.
   //  Otherwise TVolumePosition::UpdateMatrix should be called before.
   //
   Double_t *matrix = 0;
   Float_t *trans = 0;
   if (!fMatrix ||  fMatrix == TVolume::GetIdentity() || !(matrix = ((TRotMatrix *)fMatrix)->GetMatrix()) ){
      trans = local;
      for (int i =0; i < nPoints; i++,master += 3, local += 3) TCL::vsub(master,fX,local,3);
   } else {
      trans = local;
      for (int i =0; i < nPoints; i++, master += 3, local += 3) {
         Double_t dmaster[3];   Double_t dlocal[3];
         TCL::ucopy(master,dmaster,3);
         TCL::vsub(dmaster,fX,dmaster,3);
         TCL::mxmpy(matrix,dmaster,dlocal,3,3,1);
         TCL::ucopy(dlocal,local,3);
      }
   }
   return trans;
}
//______________________________________________________________________________
void TVolumePosition::Paint(Option_t *)
{
//*-*-*-*-*-*-*-*-*-*-*-*Paint Referenced node with current parameters*-*-*-*
//*-*                   ==============================================
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
   Error("Paint","Position can not be painted");
}

//_______________________________________________________________________
void TVolumePosition::Print(Option_t *) const
{
   //to be documented
   cout << *this << endl;
}

//______________________________________________________________________________
TVolumePosition *TVolumePosition::Reset(TVolume *node,Double_t x, Double_t y, Double_t z, TRotMatrix *matrix)
{
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-* Reset this position *-*-*-*-*-*-*-*-*-*-*
//*-*                           ===================
//*-*    x,y,z   are the offsets of the volume with respect to his mother
//*-*    matrix  is the pointer to the rotation matrix
//*-*
//*-*    This method is to re-use the memory this object without delete/create steps
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

// This method has to be protected since it doesn't set properly kIsOwn bit.

   fNode = node;
   SetPosition(x,y,z);
   SetMatrix(matrix);
   if (!fMatrix) fMatrix = TVolume::GetIdentity();
   return this;
}

//_______________________________________________________________________
void TVolumePosition::SavePrimitive(ostream &, Option_t * /*= ""*/)
{
   //to be documented
#if 0
   out << "TVolumePosition *CreatePosition() { " << endl;
   out << "  TVolumePosition *myPosition = 0;    " << endl;
   Double_t x = GetX();
   Double_t y = GetY();
   Double_t z = GetZ();
   TRotMatrix *matrix =
   myPosition =  new TVolumePosition(TVolume *node,Double_t x, Double_t y, Double_t z, const char *matrixname)
   : fNode(node),fX(x),fY(y),fZ(z),fMatrix(0)
{
/
   out << "  return myPosition; "                << endl;
   out << "} "                                   << endl;
#endif

}
//______________________________________________________________________________
void   TVolumePosition::SetLineAttributes()
{
   //to be documented
   TVolume *thisNode = GetNode();
   if (thisNode) thisNode->SetLineAttributes();
}
//_______________________________________________________________________
void TVolumePosition::SetMatrix(TRotMatrix *matrix)
{
   //to be documented
   if (matrix != fMatrix) {
      DeleteOwnMatrix();
      fMatrix = matrix;
   }
}
//_______________________________________________________________________
void TVolumePosition::UpdatePosition(Option_t *)
{
   //to be documented
   TTablePadView3D *view3D=(TTablePadView3D *)gPad->GetView3D();
//*-*- Update translation vector and rotation matrix for new level
   if (gGeometry->GeomLevel() && fMatrix) {
      gGeometry->UpdateTempMatrix(fX[0],fX[1],fX[2]
                                ,((TRotMatrix *)fMatrix)->GetMatrix()
                                ,fMatrix->IsReflection());
      if (view3D)
         view3D->UpdatePosition(fX[0],fX[1],fX[2],((TRotMatrix *)fMatrix));
   }
}

//______________________________________________________________________________
void TVolumePosition::SetVisibility(Int_t vis)
{
   //to be documented
   TVolume *node = GetNode();
   if (node) node->SetVisibility(TVolume::ENodeSEEN(vis));
}
//______________________________________________________________________________
TVolumePosition &TVolumePosition::Mult(const TVolumePosition &curPosition) {

   // This method mupltiply the position of this object to the position of the
   // curPosition object.
   // It doesn't change Id of either object involved.


   // Pick the "old" position by pieces
   TVolume *curNode = 0;
 //  UInt_t curPositionId    = 0;
   curNode       = curPosition.GetNode();
 //     curPositionId = curPosition.GetId();
   const TRotMatrix *oldMatrix = 0;
   Double_t oldTranslation[] = { 0, 0, 0 };
   oldMatrix         = GetMatrix();
   oldTranslation[0] = GetX();
   oldTranslation[1] = GetY();
   oldTranslation[2] = GetZ();

   // Pick the "current" position by pieces
   const TRotMatrix *curMatrix        = curPosition.GetMatrix();

   // Create a new position
   Double_t newTranslation[3];
   Double_t newMatrix[9];
   if(oldMatrix){
      TGeometry::UpdateTempMatrix(oldTranslation,((TRotMatrix *)oldMatrix)->GetMatrix()
                       ,curPosition.GetX(),curPosition.GetY(),curPosition.GetZ(),
                       ((TRotMatrix *)curMatrix)->GetMatrix()
                       ,newTranslation,newMatrix);
      Int_t num = gGeometry->GetListOfMatrices()->GetSize();
      Char_t anum[100];
      sprintf(anum,"%d",num+1);
      SetMatrixOwner();
      Reset(curNode
                           ,newTranslation[0],newTranslation[1],newTranslation[2]
                           ,new TRotMatrix(anum,"NodeView",newMatrix));
      SetMatrixOwner(kTRUE);
   } else {
      newTranslation[0] = oldTranslation[0] + curPosition.GetX();
      newTranslation[1] = oldTranslation[1] + curPosition.GetY();
      newTranslation[2] = oldTranslation[2] + curPosition.GetZ();
      Reset(curNode,newTranslation[0],newTranslation[1],newTranslation[2]);
   }
//    SetId(curPositionId);
   return *this;
}

//______________________________________________________________________________
void TVolumePosition::SetXYZ(Double_t *xyz)
{
   //to be documented
   if (xyz)  memcpy(fX,xyz,sizeof(fX));
   else      memset(fX,0,sizeof(fX));
}

//______________________________________________________________________________
void TVolumePosition::Streamer(TBuffer &R__b)
{
   // Stream an object of class TVolumePosition.
   TRotMatrix     *save = fMatrix;
   if (R__b.IsReading()) {
      fMatrix = 0;
      R__b.ReadClassBuffer(TVolumePosition::Class(), this);
      if (!fMatrix) fMatrix = save;
   } else {
      if (save == TVolume::GetIdentity() ) fMatrix = 0;
      R__b.WriteClassBuffer(TVolumePosition::Class(), this);
      fMatrix = save;
   }
}
//______________________________________________________________________________
ostream& operator<<(ostream& s,const TVolumePosition &target)
{
   //to be documented
   s << " Node: ";
   if (target.GetNode()) s <<  target.GetNode()->GetName() << endl;
   else                  s << "NILL" << endl;
   s << Form(" Position: x=%10.5f : y=%10.5f : z=%10.5f\n", target.GetX(), target.GetY(), target.GetZ());
   TRotMatrix *rot = (TRotMatrix *) target.GetMatrix();
   if (rot){
      s << rot->IsA()->GetName() << "\t" << rot->GetName() << "\t" << rot->GetTitle() << endl;
      Double_t *matrix = rot->GetMatrix();
      Int_t i = 0;
      for (i=0;i<3;i++) {
         for (Int_t j=0;j<3;j++) s << Form("%10.5f:", *matrix++);
         s << endl;
      }
   }
   return s;
}
 TVolumePosition.cxx:1
 TVolumePosition.cxx:2
 TVolumePosition.cxx:3
 TVolumePosition.cxx:4
 TVolumePosition.cxx:5
 TVolumePosition.cxx:6
 TVolumePosition.cxx:7
 TVolumePosition.cxx:8
 TVolumePosition.cxx:9
 TVolumePosition.cxx:10
 TVolumePosition.cxx:11
 TVolumePosition.cxx:12
 TVolumePosition.cxx:13
 TVolumePosition.cxx:14
 TVolumePosition.cxx:15
 TVolumePosition.cxx:16
 TVolumePosition.cxx:17
 TVolumePosition.cxx:18
 TVolumePosition.cxx:19
 TVolumePosition.cxx:20
 TVolumePosition.cxx:21
 TVolumePosition.cxx:22
 TVolumePosition.cxx:23
 TVolumePosition.cxx:24
 TVolumePosition.cxx:25
 TVolumePosition.cxx:26
 TVolumePosition.cxx:27
 TVolumePosition.cxx:28
 TVolumePosition.cxx:29
 TVolumePosition.cxx:30
 TVolumePosition.cxx:31
 TVolumePosition.cxx:32
 TVolumePosition.cxx:33
 TVolumePosition.cxx:34
 TVolumePosition.cxx:35
 TVolumePosition.cxx:36
 TVolumePosition.cxx:37
 TVolumePosition.cxx:38
 TVolumePosition.cxx:39
 TVolumePosition.cxx:40
 TVolumePosition.cxx:41
 TVolumePosition.cxx:42
 TVolumePosition.cxx:43
 TVolumePosition.cxx:44
 TVolumePosition.cxx:45
 TVolumePosition.cxx:46
 TVolumePosition.cxx:47
 TVolumePosition.cxx:48
 TVolumePosition.cxx:49
 TVolumePosition.cxx:50
 TVolumePosition.cxx:51
 TVolumePosition.cxx:52
 TVolumePosition.cxx:53
 TVolumePosition.cxx:54
 TVolumePosition.cxx:55
 TVolumePosition.cxx:56
 TVolumePosition.cxx:57
 TVolumePosition.cxx:58
 TVolumePosition.cxx:59
 TVolumePosition.cxx:60
 TVolumePosition.cxx:61
 TVolumePosition.cxx:62
 TVolumePosition.cxx:63
 TVolumePosition.cxx:64
 TVolumePosition.cxx:65
 TVolumePosition.cxx:66
 TVolumePosition.cxx:67
 TVolumePosition.cxx:68
 TVolumePosition.cxx:69
 TVolumePosition.cxx:70
 TVolumePosition.cxx:71
 TVolumePosition.cxx:72
 TVolumePosition.cxx:73
 TVolumePosition.cxx:74
 TVolumePosition.cxx:75
 TVolumePosition.cxx:76
 TVolumePosition.cxx:77
 TVolumePosition.cxx:78
 TVolumePosition.cxx:79
 TVolumePosition.cxx:80
 TVolumePosition.cxx:81
 TVolumePosition.cxx:82
 TVolumePosition.cxx:83
 TVolumePosition.cxx:84
 TVolumePosition.cxx:85
 TVolumePosition.cxx:86
 TVolumePosition.cxx:87
 TVolumePosition.cxx:88
 TVolumePosition.cxx:89
 TVolumePosition.cxx:90
 TVolumePosition.cxx:91
 TVolumePosition.cxx:92
 TVolumePosition.cxx:93
 TVolumePosition.cxx:94
 TVolumePosition.cxx:95
 TVolumePosition.cxx:96
 TVolumePosition.cxx:97
 TVolumePosition.cxx:98
 TVolumePosition.cxx:99
 TVolumePosition.cxx:100
 TVolumePosition.cxx:101
 TVolumePosition.cxx:102
 TVolumePosition.cxx:103
 TVolumePosition.cxx:104
 TVolumePosition.cxx:105
 TVolumePosition.cxx:106
 TVolumePosition.cxx:107
 TVolumePosition.cxx:108
 TVolumePosition.cxx:109
 TVolumePosition.cxx:110
 TVolumePosition.cxx:111
 TVolumePosition.cxx:112
 TVolumePosition.cxx:113
 TVolumePosition.cxx:114
 TVolumePosition.cxx:115
 TVolumePosition.cxx:116
 TVolumePosition.cxx:117
 TVolumePosition.cxx:118
 TVolumePosition.cxx:119
 TVolumePosition.cxx:120
 TVolumePosition.cxx:121
 TVolumePosition.cxx:122
 TVolumePosition.cxx:123
 TVolumePosition.cxx:124
 TVolumePosition.cxx:125
 TVolumePosition.cxx:126
 TVolumePosition.cxx:127
 TVolumePosition.cxx:128
 TVolumePosition.cxx:129
 TVolumePosition.cxx:130
 TVolumePosition.cxx:131
 TVolumePosition.cxx:132
 TVolumePosition.cxx:133
 TVolumePosition.cxx:134
 TVolumePosition.cxx:135
 TVolumePosition.cxx:136
 TVolumePosition.cxx:137
 TVolumePosition.cxx:138
 TVolumePosition.cxx:139
 TVolumePosition.cxx:140
 TVolumePosition.cxx:141
 TVolumePosition.cxx:142
 TVolumePosition.cxx:143
 TVolumePosition.cxx:144
 TVolumePosition.cxx:145
 TVolumePosition.cxx:146
 TVolumePosition.cxx:147
 TVolumePosition.cxx:148
 TVolumePosition.cxx:149
 TVolumePosition.cxx:150
 TVolumePosition.cxx:151
 TVolumePosition.cxx:152
 TVolumePosition.cxx:153
 TVolumePosition.cxx:154
 TVolumePosition.cxx:155
 TVolumePosition.cxx:156
 TVolumePosition.cxx:157
 TVolumePosition.cxx:158
 TVolumePosition.cxx:159
 TVolumePosition.cxx:160
 TVolumePosition.cxx:161
 TVolumePosition.cxx:162
 TVolumePosition.cxx:163
 TVolumePosition.cxx:164
 TVolumePosition.cxx:165
 TVolumePosition.cxx:166
 TVolumePosition.cxx:167
 TVolumePosition.cxx:168
 TVolumePosition.cxx:169
 TVolumePosition.cxx:170
 TVolumePosition.cxx:171
 TVolumePosition.cxx:172
 TVolumePosition.cxx:173
 TVolumePosition.cxx:174
 TVolumePosition.cxx:175
 TVolumePosition.cxx:176
 TVolumePosition.cxx:177
 TVolumePosition.cxx:178
 TVolumePosition.cxx:179
 TVolumePosition.cxx:180
 TVolumePosition.cxx:181
 TVolumePosition.cxx:182
 TVolumePosition.cxx:183
 TVolumePosition.cxx:184
 TVolumePosition.cxx:185
 TVolumePosition.cxx:186
 TVolumePosition.cxx:187
 TVolumePosition.cxx:188
 TVolumePosition.cxx:189
 TVolumePosition.cxx:190
 TVolumePosition.cxx:191
 TVolumePosition.cxx:192
 TVolumePosition.cxx:193
 TVolumePosition.cxx:194
 TVolumePosition.cxx:195
 TVolumePosition.cxx:196
 TVolumePosition.cxx:197
 TVolumePosition.cxx:198
 TVolumePosition.cxx:199
 TVolumePosition.cxx:200
 TVolumePosition.cxx:201
 TVolumePosition.cxx:202
 TVolumePosition.cxx:203
 TVolumePosition.cxx:204
 TVolumePosition.cxx:205
 TVolumePosition.cxx:206
 TVolumePosition.cxx:207
 TVolumePosition.cxx:208
 TVolumePosition.cxx:209
 TVolumePosition.cxx:210
 TVolumePosition.cxx:211
 TVolumePosition.cxx:212
 TVolumePosition.cxx:213
 TVolumePosition.cxx:214
 TVolumePosition.cxx:215
 TVolumePosition.cxx:216
 TVolumePosition.cxx:217
 TVolumePosition.cxx:218
 TVolumePosition.cxx:219
 TVolumePosition.cxx:220
 TVolumePosition.cxx:221
 TVolumePosition.cxx:222
 TVolumePosition.cxx:223
 TVolumePosition.cxx:224
 TVolumePosition.cxx:225
 TVolumePosition.cxx:226
 TVolumePosition.cxx:227
 TVolumePosition.cxx:228
 TVolumePosition.cxx:229
 TVolumePosition.cxx:230
 TVolumePosition.cxx:231
 TVolumePosition.cxx:232
 TVolumePosition.cxx:233
 TVolumePosition.cxx:234
 TVolumePosition.cxx:235
 TVolumePosition.cxx:236
 TVolumePosition.cxx:237
 TVolumePosition.cxx:238
 TVolumePosition.cxx:239
 TVolumePosition.cxx:240
 TVolumePosition.cxx:241
 TVolumePosition.cxx:242
 TVolumePosition.cxx:243
 TVolumePosition.cxx:244
 TVolumePosition.cxx:245
 TVolumePosition.cxx:246
 TVolumePosition.cxx:247
 TVolumePosition.cxx:248
 TVolumePosition.cxx:249
 TVolumePosition.cxx:250
 TVolumePosition.cxx:251
 TVolumePosition.cxx:252
 TVolumePosition.cxx:253
 TVolumePosition.cxx:254
 TVolumePosition.cxx:255
 TVolumePosition.cxx:256
 TVolumePosition.cxx:257
 TVolumePosition.cxx:258
 TVolumePosition.cxx:259
 TVolumePosition.cxx:260
 TVolumePosition.cxx:261
 TVolumePosition.cxx:262
 TVolumePosition.cxx:263
 TVolumePosition.cxx:264
 TVolumePosition.cxx:265
 TVolumePosition.cxx:266
 TVolumePosition.cxx:267
 TVolumePosition.cxx:268
 TVolumePosition.cxx:269
 TVolumePosition.cxx:270
 TVolumePosition.cxx:271
 TVolumePosition.cxx:272
 TVolumePosition.cxx:273
 TVolumePosition.cxx:274
 TVolumePosition.cxx:275
 TVolumePosition.cxx:276
 TVolumePosition.cxx:277
 TVolumePosition.cxx:278
 TVolumePosition.cxx:279
 TVolumePosition.cxx:280
 TVolumePosition.cxx:281
 TVolumePosition.cxx:282
 TVolumePosition.cxx:283
 TVolumePosition.cxx:284
 TVolumePosition.cxx:285
 TVolumePosition.cxx:286
 TVolumePosition.cxx:287
 TVolumePosition.cxx:288
 TVolumePosition.cxx:289
 TVolumePosition.cxx:290
 TVolumePosition.cxx:291
 TVolumePosition.cxx:292
 TVolumePosition.cxx:293
 TVolumePosition.cxx:294
 TVolumePosition.cxx:295
 TVolumePosition.cxx:296
 TVolumePosition.cxx:297
 TVolumePosition.cxx:298
 TVolumePosition.cxx:299
 TVolumePosition.cxx:300
 TVolumePosition.cxx:301
 TVolumePosition.cxx:302
 TVolumePosition.cxx:303
 TVolumePosition.cxx:304
 TVolumePosition.cxx:305
 TVolumePosition.cxx:306
 TVolumePosition.cxx:307
 TVolumePosition.cxx:308
 TVolumePosition.cxx:309
 TVolumePosition.cxx:310
 TVolumePosition.cxx:311
 TVolumePosition.cxx:312
 TVolumePosition.cxx:313
 TVolumePosition.cxx:314
 TVolumePosition.cxx:315
 TVolumePosition.cxx:316
 TVolumePosition.cxx:317
 TVolumePosition.cxx:318
 TVolumePosition.cxx:319
 TVolumePosition.cxx:320
 TVolumePosition.cxx:321
 TVolumePosition.cxx:322
 TVolumePosition.cxx:323
 TVolumePosition.cxx:324
 TVolumePosition.cxx:325
 TVolumePosition.cxx:326
 TVolumePosition.cxx:327
 TVolumePosition.cxx:328
 TVolumePosition.cxx:329
 TVolumePosition.cxx:330
 TVolumePosition.cxx:331
 TVolumePosition.cxx:332
 TVolumePosition.cxx:333
 TVolumePosition.cxx:334
 TVolumePosition.cxx:335
 TVolumePosition.cxx:336
 TVolumePosition.cxx:337
 TVolumePosition.cxx:338
 TVolumePosition.cxx:339
 TVolumePosition.cxx:340
 TVolumePosition.cxx:341
 TVolumePosition.cxx:342
 TVolumePosition.cxx:343
 TVolumePosition.cxx:344
 TVolumePosition.cxx:345
 TVolumePosition.cxx:346
 TVolumePosition.cxx:347
 TVolumePosition.cxx:348
 TVolumePosition.cxx:349
 TVolumePosition.cxx:350
 TVolumePosition.cxx:351
 TVolumePosition.cxx:352
 TVolumePosition.cxx:353
 TVolumePosition.cxx:354
 TVolumePosition.cxx:355
 TVolumePosition.cxx:356
 TVolumePosition.cxx:357
 TVolumePosition.cxx:358
 TVolumePosition.cxx:359
 TVolumePosition.cxx:360
 TVolumePosition.cxx:361
 TVolumePosition.cxx:362
 TVolumePosition.cxx:363
 TVolumePosition.cxx:364
 TVolumePosition.cxx:365
 TVolumePosition.cxx:366
 TVolumePosition.cxx:367
 TVolumePosition.cxx:368
 TVolumePosition.cxx:369
 TVolumePosition.cxx:370
 TVolumePosition.cxx:371
 TVolumePosition.cxx:372
 TVolumePosition.cxx:373
 TVolumePosition.cxx:374
 TVolumePosition.cxx:375
 TVolumePosition.cxx:376
 TVolumePosition.cxx:377
 TVolumePosition.cxx:378
 TVolumePosition.cxx:379
 TVolumePosition.cxx:380
 TVolumePosition.cxx:381
 TVolumePosition.cxx:382
 TVolumePosition.cxx:383
 TVolumePosition.cxx:384
 TVolumePosition.cxx:385
 TVolumePosition.cxx:386
 TVolumePosition.cxx:387
 TVolumePosition.cxx:388
 TVolumePosition.cxx:389
 TVolumePosition.cxx:390
 TVolumePosition.cxx:391
 TVolumePosition.cxx:392
 TVolumePosition.cxx:393
 TVolumePosition.cxx:394
 TVolumePosition.cxx:395
 TVolumePosition.cxx:396
 TVolumePosition.cxx:397
 TVolumePosition.cxx:398
 TVolumePosition.cxx:399
 TVolumePosition.cxx:400
 TVolumePosition.cxx:401
 TVolumePosition.cxx:402
 TVolumePosition.cxx:403
 TVolumePosition.cxx:404
 TVolumePosition.cxx:405
 TVolumePosition.cxx:406
 TVolumePosition.cxx:407
 TVolumePosition.cxx:408
 TVolumePosition.cxx:409
 TVolumePosition.cxx:410
 TVolumePosition.cxx:411
 TVolumePosition.cxx:412
 TVolumePosition.cxx:413
 TVolumePosition.cxx:414
 TVolumePosition.cxx:415
 TVolumePosition.cxx:416
 TVolumePosition.cxx:417
 TVolumePosition.cxx:418
 TVolumePosition.cxx:419
 TVolumePosition.cxx:420
 TVolumePosition.cxx:421
 TVolumePosition.cxx:422
 TVolumePosition.cxx:423
 TVolumePosition.cxx:424
 TVolumePosition.cxx:425
 TVolumePosition.cxx:426
 TVolumePosition.cxx:427
 TVolumePosition.cxx:428
 TVolumePosition.cxx:429
 TVolumePosition.cxx:430
 TVolumePosition.cxx:431
 TVolumePosition.cxx:432
 TVolumePosition.cxx:433
 TVolumePosition.cxx:434
 TVolumePosition.cxx:435
 TVolumePosition.cxx:436
 TVolumePosition.cxx:437
 TVolumePosition.cxx:438
 TVolumePosition.cxx:439
 TVolumePosition.cxx:440
 TVolumePosition.cxx:441
 TVolumePosition.cxx:442
 TVolumePosition.cxx:443
 TVolumePosition.cxx:444
 TVolumePosition.cxx:445
 TVolumePosition.cxx:446
 TVolumePosition.cxx:447
 TVolumePosition.cxx:448
 TVolumePosition.cxx:449
 TVolumePosition.cxx:450
 TVolumePosition.cxx:451
 TVolumePosition.cxx:452
 TVolumePosition.cxx:453
 TVolumePosition.cxx:454
 TVolumePosition.cxx:455
 TVolumePosition.cxx:456
 TVolumePosition.cxx:457
 TVolumePosition.cxx:458
 TVolumePosition.cxx:459
 TVolumePosition.cxx:460
 TVolumePosition.cxx:461
 TVolumePosition.cxx:462
 TVolumePosition.cxx:463
 TVolumePosition.cxx:464
 TVolumePosition.cxx:465
 TVolumePosition.cxx:466
 TVolumePosition.cxx:467
 TVolumePosition.cxx:468
 TVolumePosition.cxx:469
 TVolumePosition.cxx:470
 TVolumePosition.cxx:471
 TVolumePosition.cxx:472
 TVolumePosition.cxx:473
 TVolumePosition.cxx:474
 TVolumePosition.cxx:475
 TVolumePosition.cxx:476
 TVolumePosition.cxx:477
 TVolumePosition.cxx:478
 TVolumePosition.cxx:479
 TVolumePosition.cxx:480
 TVolumePosition.cxx:481
 TVolumePosition.cxx:482
 TVolumePosition.cxx:483
 TVolumePosition.cxx:484
 TVolumePosition.cxx:485
 TVolumePosition.cxx:486
 TVolumePosition.cxx:487
 TVolumePosition.cxx:488
 TVolumePosition.cxx:489
 TVolumePosition.cxx:490
 TVolumePosition.cxx:491
 TVolumePosition.cxx:492
 TVolumePosition.cxx:493
 TVolumePosition.cxx:494
 TVolumePosition.cxx:495
 TVolumePosition.cxx:496
 TVolumePosition.cxx:497
 TVolumePosition.cxx:498
 TVolumePosition.cxx:499
 TVolumePosition.cxx:500
 TVolumePosition.cxx:501
 TVolumePosition.cxx:502
 TVolumePosition.cxx:503
 TVolumePosition.cxx:504
 TVolumePosition.cxx:505
 TVolumePosition.cxx:506
 TVolumePosition.cxx:507
 TVolumePosition.cxx:508
 TVolumePosition.cxx:509
 TVolumePosition.cxx:510
 TVolumePosition.cxx:511
 TVolumePosition.cxx:512
 TVolumePosition.cxx:513
 TVolumePosition.cxx:514
 TVolumePosition.cxx:515
 TVolumePosition.cxx:516
 TVolumePosition.cxx:517
 TVolumePosition.cxx:518
 TVolumePosition.cxx:519
 TVolumePosition.cxx:520
 TVolumePosition.cxx:521
 TVolumePosition.cxx:522
 TVolumePosition.cxx:523
 TVolumePosition.cxx:524
 TVolumePosition.cxx:525
 TVolumePosition.cxx:526
 TVolumePosition.cxx:527
 TVolumePosition.cxx:528
 TVolumePosition.cxx:529
 TVolumePosition.cxx:530
 TVolumePosition.cxx:531
 TVolumePosition.cxx:532
 TVolumePosition.cxx:533
 TVolumePosition.cxx:534
 TVolumePosition.cxx:535
 TVolumePosition.cxx:536
 TVolumePosition.cxx:537
 TVolumePosition.cxx:538
 TVolumePosition.cxx:539
 TVolumePosition.cxx:540
 TVolumePosition.cxx:541
 TVolumePosition.cxx:542
 TVolumePosition.cxx:543
 TVolumePosition.cxx:544
 TVolumePosition.cxx:545
 TVolumePosition.cxx:546
 TVolumePosition.cxx:547
 TVolumePosition.cxx:548
 TVolumePosition.cxx:549
 TVolumePosition.cxx:550
 TVolumePosition.cxx:551
 TVolumePosition.cxx:552
 TVolumePosition.cxx:553
 TVolumePosition.cxx:554
 TVolumePosition.cxx:555
 TVolumePosition.cxx:556
 TVolumePosition.cxx:557
 TVolumePosition.cxx:558
 TVolumePosition.cxx:559
 TVolumePosition.cxx:560
 TVolumePosition.cxx:561
 TVolumePosition.cxx:562
 TVolumePosition.cxx:563
 TVolumePosition.cxx:564
 TVolumePosition.cxx:565
 TVolumePosition.cxx:566
 TVolumePosition.cxx:567
 TVolumePosition.cxx:568
 TVolumePosition.cxx:569
 TVolumePosition.cxx:570
 TVolumePosition.cxx:571
 TVolumePosition.cxx:572
 TVolumePosition.cxx:573
 TVolumePosition.cxx:574
 TVolumePosition.cxx:575
 TVolumePosition.cxx:576
 TVolumePosition.cxx:577
 TVolumePosition.cxx:578
 TVolumePosition.cxx:579
 TVolumePosition.cxx:580
 TVolumePosition.cxx:581
 TVolumePosition.cxx:582
 TVolumePosition.cxx:583
 TVolumePosition.cxx:584
 TVolumePosition.cxx:585
 TVolumePosition.cxx:586
 TVolumePosition.cxx:587
 TVolumePosition.cxx:588
 TVolumePosition.cxx:589
 TVolumePosition.cxx:590
 TVolumePosition.cxx:591
 TVolumePosition.cxx:592
 TVolumePosition.cxx:593
 TVolumePosition.cxx:594
 TVolumePosition.cxx:595
 TVolumePosition.cxx:596
 TVolumePosition.cxx:597
 TVolumePosition.cxx:598
 TVolumePosition.cxx:599
 TVolumePosition.cxx:600
 TVolumePosition.cxx:601
 TVolumePosition.cxx:602
 TVolumePosition.cxx:603
 TVolumePosition.cxx:604
 TVolumePosition.cxx:605
 TVolumePosition.cxx:606
 TVolumePosition.cxx:607
 TVolumePosition.cxx:608
 TVolumePosition.cxx:609
 TVolumePosition.cxx:610
 TVolumePosition.cxx:611
 TVolumePosition.cxx:612
 TVolumePosition.cxx:613
 TVolumePosition.cxx:614
 TVolumePosition.cxx:615
 TVolumePosition.cxx:616
 TVolumePosition.cxx:617
 TVolumePosition.cxx:618
 TVolumePosition.cxx:619
 TVolumePosition.cxx:620
 TVolumePosition.cxx:621
 TVolumePosition.cxx:622
 TVolumePosition.cxx:623
 TVolumePosition.cxx:624
 TVolumePosition.cxx:625
 TVolumePosition.cxx:626
 TVolumePosition.cxx:627