ROOT logo
// @(#)root/table:$Id: TVolumeViewIter.cxx 20882 2007-11-19 11:31:26Z rdm $
// Author: Valery Fine(fine@bnl.gov)   25/01/99

/*************************************************************************
 * 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 "TVolumeViewIter.h"
#include "TObjArray.h"
#include "TVolumeView.h"
#include "TDataSetIter.h"
#include "TGeometry.h"

/////////////////////////////////////////////////////////////////////////////////
//
//   TVolumeViewIter is a special class-iterator to
//   iterate over GEANT geometry dataset TVolumeView.
//   Class should provide a "standard" well-known
//   "TDataSetIter" interface to navigate and access
//   the geometry information supplied by Tgeant_Maker
//   as the TVolume object. Apart of the the base
//   TDataSetIter this special class may supply
//   not only pointer to the selected dataset but some
//   "position" information (like translate vectors and
//   rotation matrice).
//
/////////////////////////////////////////////////////////////////////////////////

ClassImp(TVolumeViewIter)
//______________________________________________________________________________
TVolumeViewIter::TVolumeViewIter(TVolumeView *view, Int_t depth, Bool_t dir):
           TDataSetIter(view,depth,dir),fPositions(0)
{
   //to be documented
}

//______________________________________________________________________________
TVolumeViewIter::~TVolumeViewIter()
{
   //to be documented
   if (fPositions) { fPositions->Delete(); delete fPositions; }
}
//______________________________________________________________________________
const TVolumePosition *TVolumeViewIter::GetPosition(Int_t level) const
{
   //to be documented
   const TVolumePosition *pos = 0;
   if (fPositions) {
      Int_t thisLevel = level;
      if (!thisLevel) thisLevel = fDepth;
      pos=(TVolumePosition *)fPositions->At(thisLevel);
   }
   return pos;
}

//______________________________________________________________________________
TVolumePosition *TVolumeViewIter::operator[](Int_t level)
{
   //to be documented
   const TVolumePosition *pos = GetPosition(level);
   if (pos) return new TVolumePosition(*pos);
   else {
      Error("operator[]"," GetPosition: %d %d %x", level,fDepth, fPositions);
      return 0;
   }
}

//______________________________________________________________________________
void TVolumeViewIter::Notify(TDataSet *set)
{
   //to be documented
   if (!set) return;
   TVolumeView     *view         = (TVolumeView *) set;
   TVolumePosition *position     = 0;
   position = view->GetPosition();
   UpdateTempMatrix(position);
}

//______________________________________________________________________________
TVolumePosition *TVolumeViewIter::UpdateTempMatrix(TVolumePosition *curPosition)
{
   // Pick the "old" position by pieces
   TVolumePosition *newPosition = 0;
   TVolume *curNode = 0;
   UInt_t curPositionId    = 0;
   if (curPosition) {
      curNode       = curPosition->GetNode();
      curPositionId = curPosition->GetId();
   }
   if (fDepth-1) {
      TVolumePosition *oldPosition = 0;
      const TRotMatrix *oldMatrix = 0;
      oldPosition = fPositions ? (TVolumePosition *)fPositions->At(fDepth-1):0;
      Double_t oldTranslation[] = { 0, 0, 0 };
      if (oldPosition) {
         oldMatrix         = oldPosition->GetMatrix();
         oldTranslation[0] = oldPosition->GetX();
         oldTranslation[1] = oldPosition->GetY();
         oldTranslation[2] = oldPosition->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);
         newPosition = SetPositionAt(curNode
                                ,newTranslation[0],newTranslation[1],newTranslation[2]
                                ,new TRotMatrix(anum,"NodeView",newMatrix));
         newPosition->SetMatrixOwner();
      } else {
         newTranslation[0] = oldTranslation[0] + curPosition->GetX();
         newTranslation[1] = oldTranslation[1] + curPosition->GetY();
         newTranslation[2] = oldTranslation[2] + curPosition->GetZ();
         newPosition = SetPositionAt(curNode,newTranslation[0],newTranslation[1],newTranslation[2]);
      }
   } else if (curPosition)  {
      newPosition =  SetPositionAt(*curPosition);
//         printf(" new level %d %s\n",fDepth, curNode->GetName());
   } else
      Error("UpdateTempMatrix","No position has been defined");
   if (newPosition) newPosition->SetId(curPositionId);
   return newPosition;
}

//______________________________________________________________________________
void TVolumeViewIter::ResetPosition(Int_t level, TVolumePosition *newPosition)
{
   //to be documented
   Int_t thisLevel = level;
   if (!thisLevel) thisLevel = fDepth;
   TVolumePosition *thisPosition  =  (TVolumePosition *) GetPosition(level);
   if (newPosition)
      *thisPosition =  *newPosition;
}

//______________________________________________________________________________
void TVolumeViewIter::Reset(TDataSet *l,Int_t depth)
{
   //to be documented
   TDataSetIter::Reset(l,depth);
}

//______________________________________________________________________________
TVolumePosition *TVolumeViewIter::SetPositionAt(TVolume *node,Double_t x, Double_t y, Double_t z, TRotMatrix *matrix)
{
   //to be documented
   if (!fPositions)  fPositions = new TObjArray(100);
   TVolumePosition *position =  (TVolumePosition *) fPositions->At(fDepth);
   if (position) position->Reset(node,x,y,z,matrix);
   else {
      position = new TVolumePosition(node,x,y,z,matrix);
      fPositions->AddAtAndExpand(position,fDepth);
   }
   return position;
}

//______________________________________________________________________________
TVolumePosition *TVolumeViewIter::SetPositionAt(TVolumePosition &curPosition)
{
   //to be documented
   if (!fPositions)  fPositions = new TObjArray(100);
   TVolumePosition *position =  (TVolumePosition *) fPositions->At(fDepth);
   if (position) *position = curPosition;
   else {
      position = new TVolumePosition(curPosition);
      fPositions->AddAtAndExpand(position,fDepth);
   }
   return position;
}


 TVolumeViewIter.cxx:1
 TVolumeViewIter.cxx:2
 TVolumeViewIter.cxx:3
 TVolumeViewIter.cxx:4
 TVolumeViewIter.cxx:5
 TVolumeViewIter.cxx:6
 TVolumeViewIter.cxx:7
 TVolumeViewIter.cxx:8
 TVolumeViewIter.cxx:9
 TVolumeViewIter.cxx:10
 TVolumeViewIter.cxx:11
 TVolumeViewIter.cxx:12
 TVolumeViewIter.cxx:13
 TVolumeViewIter.cxx:14
 TVolumeViewIter.cxx:15
 TVolumeViewIter.cxx:16
 TVolumeViewIter.cxx:17
 TVolumeViewIter.cxx:18
 TVolumeViewIter.cxx:19
 TVolumeViewIter.cxx:20
 TVolumeViewIter.cxx:21
 TVolumeViewIter.cxx:22
 TVolumeViewIter.cxx:23
 TVolumeViewIter.cxx:24
 TVolumeViewIter.cxx:25
 TVolumeViewIter.cxx:26
 TVolumeViewIter.cxx:27
 TVolumeViewIter.cxx:28
 TVolumeViewIter.cxx:29
 TVolumeViewIter.cxx:30
 TVolumeViewIter.cxx:31
 TVolumeViewIter.cxx:32
 TVolumeViewIter.cxx:33
 TVolumeViewIter.cxx:34
 TVolumeViewIter.cxx:35
 TVolumeViewIter.cxx:36
 TVolumeViewIter.cxx:37
 TVolumeViewIter.cxx:38
 TVolumeViewIter.cxx:39
 TVolumeViewIter.cxx:40
 TVolumeViewIter.cxx:41
 TVolumeViewIter.cxx:42
 TVolumeViewIter.cxx:43
 TVolumeViewIter.cxx:44
 TVolumeViewIter.cxx:45
 TVolumeViewIter.cxx:46
 TVolumeViewIter.cxx:47
 TVolumeViewIter.cxx:48
 TVolumeViewIter.cxx:49
 TVolumeViewIter.cxx:50
 TVolumeViewIter.cxx:51
 TVolumeViewIter.cxx:52
 TVolumeViewIter.cxx:53
 TVolumeViewIter.cxx:54
 TVolumeViewIter.cxx:55
 TVolumeViewIter.cxx:56
 TVolumeViewIter.cxx:57
 TVolumeViewIter.cxx:58
 TVolumeViewIter.cxx:59
 TVolumeViewIter.cxx:60
 TVolumeViewIter.cxx:61
 TVolumeViewIter.cxx:62
 TVolumeViewIter.cxx:63
 TVolumeViewIter.cxx:64
 TVolumeViewIter.cxx:65
 TVolumeViewIter.cxx:66
 TVolumeViewIter.cxx:67
 TVolumeViewIter.cxx:68
 TVolumeViewIter.cxx:69
 TVolumeViewIter.cxx:70
 TVolumeViewIter.cxx:71
 TVolumeViewIter.cxx:72
 TVolumeViewIter.cxx:73
 TVolumeViewIter.cxx:74
 TVolumeViewIter.cxx:75
 TVolumeViewIter.cxx:76
 TVolumeViewIter.cxx:77
 TVolumeViewIter.cxx:78
 TVolumeViewIter.cxx:79
 TVolumeViewIter.cxx:80
 TVolumeViewIter.cxx:81
 TVolumeViewIter.cxx:82
 TVolumeViewIter.cxx:83
 TVolumeViewIter.cxx:84
 TVolumeViewIter.cxx:85
 TVolumeViewIter.cxx:86
 TVolumeViewIter.cxx:87
 TVolumeViewIter.cxx:88
 TVolumeViewIter.cxx:89
 TVolumeViewIter.cxx:90
 TVolumeViewIter.cxx:91
 TVolumeViewIter.cxx:92
 TVolumeViewIter.cxx:93
 TVolumeViewIter.cxx:94
 TVolumeViewIter.cxx:95
 TVolumeViewIter.cxx:96
 TVolumeViewIter.cxx:97
 TVolumeViewIter.cxx:98
 TVolumeViewIter.cxx:99
 TVolumeViewIter.cxx:100
 TVolumeViewIter.cxx:101
 TVolumeViewIter.cxx:102
 TVolumeViewIter.cxx:103
 TVolumeViewIter.cxx:104
 TVolumeViewIter.cxx:105
 TVolumeViewIter.cxx:106
 TVolumeViewIter.cxx:107
 TVolumeViewIter.cxx:108
 TVolumeViewIter.cxx:109
 TVolumeViewIter.cxx:110
 TVolumeViewIter.cxx:111
 TVolumeViewIter.cxx:112
 TVolumeViewIter.cxx:113
 TVolumeViewIter.cxx:114
 TVolumeViewIter.cxx:115
 TVolumeViewIter.cxx:116
 TVolumeViewIter.cxx:117
 TVolumeViewIter.cxx:118
 TVolumeViewIter.cxx:119
 TVolumeViewIter.cxx:120
 TVolumeViewIter.cxx:121
 TVolumeViewIter.cxx:122
 TVolumeViewIter.cxx:123
 TVolumeViewIter.cxx:124
 TVolumeViewIter.cxx:125
 TVolumeViewIter.cxx:126
 TVolumeViewIter.cxx:127
 TVolumeViewIter.cxx:128
 TVolumeViewIter.cxx:129
 TVolumeViewIter.cxx:130
 TVolumeViewIter.cxx:131
 TVolumeViewIter.cxx:132
 TVolumeViewIter.cxx:133
 TVolumeViewIter.cxx:134
 TVolumeViewIter.cxx:135
 TVolumeViewIter.cxx:136
 TVolumeViewIter.cxx:137
 TVolumeViewIter.cxx:138
 TVolumeViewIter.cxx:139
 TVolumeViewIter.cxx:140
 TVolumeViewIter.cxx:141
 TVolumeViewIter.cxx:142
 TVolumeViewIter.cxx:143
 TVolumeViewIter.cxx:144
 TVolumeViewIter.cxx:145
 TVolumeViewIter.cxx:146
 TVolumeViewIter.cxx:147
 TVolumeViewIter.cxx:148
 TVolumeViewIter.cxx:149
 TVolumeViewIter.cxx:150
 TVolumeViewIter.cxx:151
 TVolumeViewIter.cxx:152
 TVolumeViewIter.cxx:153
 TVolumeViewIter.cxx:154
 TVolumeViewIter.cxx:155
 TVolumeViewIter.cxx:156
 TVolumeViewIter.cxx:157
 TVolumeViewIter.cxx:158
 TVolumeViewIter.cxx:159
 TVolumeViewIter.cxx:160
 TVolumeViewIter.cxx:161
 TVolumeViewIter.cxx:162
 TVolumeViewIter.cxx:163
 TVolumeViewIter.cxx:164
 TVolumeViewIter.cxx:165
 TVolumeViewIter.cxx:166
 TVolumeViewIter.cxx:167
 TVolumeViewIter.cxx:168
 TVolumeViewIter.cxx:169
 TVolumeViewIter.cxx:170
 TVolumeViewIter.cxx:171
 TVolumeViewIter.cxx:172
 TVolumeViewIter.cxx:173
 TVolumeViewIter.cxx:174
 TVolumeViewIter.cxx:175
 TVolumeViewIter.cxx:176
 TVolumeViewIter.cxx:177
 TVolumeViewIter.cxx:178
 TVolumeViewIter.cxx:179
 TVolumeViewIter.cxx:180
 TVolumeViewIter.cxx:181
 TVolumeViewIter.cxx:182
 TVolumeViewIter.cxx:183
 TVolumeViewIter.cxx:184
 TVolumeViewIter.cxx:185
 TVolumeViewIter.cxx:186