ROOT logo
//*-- AUTHOR : Ilse Koenig
//*-- Created : 10/11/2003

//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////
// HGeomNode
//
// Class to hold the basic geometry properties of a GEANT volume
//
////////////////////////////////////////////////////////////////

#include "hgeomnode.h"
#include "TList.h"
#include <iostream>
#include <iomanip>

ClassImp(HGeomNode)

HGeomNode::HGeomNode() {
  // Constructor
  labTransform=0;
  clear();
}

HGeomNode::HGeomNode(HGeomNode& r) {
  // Copy constructor
  points=0;
  nPoints = 0;
  fName=r.GetName();
  setVolumePar(r);
  if (r.isActive()) active=kTRUE;
  else active=kFALSE;
  volumeType=r.getVolumeType();
  center=r.getCenterPosition();
  copyNode=r.getCopyNode();
  if (r.isCreated()) created=kTRUE;
  else created=kFALSE; 
  rootVolume=r.getRootVolume();
  labTransform=new HGeomTransform(*(r.getLabTransform()));
}

HGeomNode::~HGeomNode() {
  // Destructor
  if (points) {
    for (Int_t i=0;i<nPoints;i++) points->RemoveAt(i);
    delete points;
    points=0;
  }
  if (labTransform) {
    delete labTransform;
    labTransform=0;
  }
}

void HGeomNode::setVolumePar(HGeomNode& r) {
  // Copies all volume parameters except the name
  setMother(r.getMotherNode());
  medium=r.getMedium();
  setShape(r.getShapePointer());
  Int_t n=r.getNumPoints();
  createPoints(n);
  for (Int_t i=0;i<nPoints;i++) setPoint(i,*(r.getPoint(i)));
  transform=r.getTransform();
}

void HGeomNode::clear() {
  // Clears the volume and deletes the points
  pMother=0;
  medium=0;
  pShape=0;
  volumeType=kHGeomElement;
  active=kFALSE;
  created=kFALSE;
  copyNode=0;
  rootVolume=0;
  if (labTransform) {
    delete labTransform;
    labTransform=0;
  }
  HGeomVolume::clear();
}

Int_t HGeomNode::getCopyNo() {
  // Returns the copy number
  Int_t n=1;
  Int_t l=fName.Length();
  if (l>4) {
    TString s(fName);
    s.Remove(0,4);
    sscanf(s.Data(),"%i",&n);
  }
  return n; 
}

TArrayD* HGeomNode::getParameters() {
  // Returns the parameters to create a GEANT/ROOT volume
  if (pShape) return pShape->calcVoluParam(this);
  return 0;
}

HGeomTransform* HGeomNode::getPosition() {
  // Returns the transformation to position a volume in GEANT/ROOT
  if (pShape&&pMother) {
    pShape->calcVoluPosition(this,pMother->getCenterPosition());
    center.setTransform(*(pShape->getCenterPosition()));
    return pShape->getVoluPosition();
  }
  return 0;
}

void HGeomNode::print() {
  // Prints all parameters of a volume
  cout<<((const Char_t*)fName)<<'\n';
  if (pMother)cout<<((const Char_t*)mother)<<'\n';
  else cout<<"-- unknown mother --\n";
  if (!copyNode) {
    if (pShape) cout<<((const Char_t*)shape)<<'\n';
    else cout<<"-- unknown shape --\n";
    if (medium) cout<<medium->GetName()<<'\n';
    else cout<<"-- unknown medium --\n";
    if (points && pShape) pShape->printPoints(this);
    else cout<<"-- no points --\n";
  }
  transform.getTransVector().print();
  transform.getRotMatrix().print();
  cout<<"//----------------------------------------------------------\n";
}

Bool_t HGeomNode::write(fstream& fout) {
  // Writes all parameters of a volume to file
  fout<<fName.Data()<<'\n';
  if (pMother) fout<<((const Char_t*)mother)<<'\n';
  else {
    Error("write","Unknown mother for %s\n",fName.Data());
    return kFALSE;
  }
  if (!copyNode) {
    if (pShape) fout<<((const Char_t*)shape)<<'\n';
    else {
      Error("write","Unknown shape for %s\n",fName.Data());
      return kFALSE;
    }
    if (medium) fout<<medium->GetName()<<'\n';
    else {
      Error("write","Unknown medium for %s\n",fName.Data());
      return kFALSE;
    }
    if (points && pShape) pShape->writePoints(&fout,this);
    else {
      Error("write","No points for %s\n",fName.Data());
      return kFALSE;
    }
  }
  const HGeomRotation& r=transform.getRotMatrix();
  const HGeomVector& v=transform.getTransVector();
  fout.precision(3);
  fout<<v(0)<<" "<<v(1)<<" "<<v(2)<<'\n';
  fout.precision(7);
  for(Int_t i=0;i<9;i++) fout<<r(i)<<"  ";
  fout<<'\n';
  fout<<"//----------------------------------------------------------\n";
  return kTRUE;
}

TList* HGeomNode::getTree() {
  // Returns the tree of the mother volumes
  TList* tree=new TList();  
  HGeomNode* v=this;
  HGeomNode* mother;
  do {
    mother=v->getMotherNode();
    if (mother) tree->Add(mother);
    v=mother;
  } while (v&&!v->isTopNode());
  return tree; 
}

HGeomTransform* HGeomNode::getLabTransform() {
  // Returns the lab transformation
  if (labTransform) return labTransform;
  else return calcLabTransform();
}

HGeomTransform* HGeomNode::calcLabTransform() {
  // Calculates the lab transformation
  labTransform=new HGeomTransform(transform);
  if (!isTopNode()) {
    if (!pMother) {
      Error("calcLabTransform()","Mother volume of %s not found!",GetName());
      delete labTransform;
      return 0;
    }
    HGeomTransform* tm=pMother->getLabTransform();
    if (!tm) {; 
      Error("calcLabTransform()",
            "Lab Transformation of mother volume of %s not found!",GetName());
      delete labTransform;
      return 0;
    } 
    labTransform->transFrom(*tm);
  }
  return labTransform;
}

void HGeomNode::setLabTransform(HGeomTransform& t) {
  // Sets the lab transformation
  if (!isTopNode()) {
    if (labTransform) labTransform->setTransform(t); 
    else labTransform=new HGeomTransform(t);
    if (!pMother) {
      Error("calcLabTransform()","Mother volume of %s not found!",GetName());
      delete labTransform;
      return;
    }
    HGeomTransform* tm=pMother->getLabTransform();
    if (!tm) {; 
      Error("calcLabTransform()",
            "Lab Transformation of mother volume of %s not found!",GetName());
      delete labTransform;
      return;
    } 
    transform=t;
    transform.transTo(*tm);
  }
}

Bool_t HGeomNode::calcModuleTransform(HGeomTransform& modTransform) {
  // Calculates the transformation relative to the detectors coordinate system
  HGeomNode* node=this;
  modTransform=transform;
  while (node&&!node->isModule()) {
    HGeomNode* pm=node->getMotherNode();
    if (!pm) {
      Error("calcModuleTransform","Mother volume of %s not found!",node->GetName());
      return kFALSE;
    }
    modTransform.transFrom(pm->getTransform());
    node=pm;
  }
  if (isTopNode()) return kFALSE;
  else return kTRUE;
}

Bool_t HGeomNode::calcRefPos(HGeomVector& refPos) {
  // Calculates the position in the detectors coordinate system
  HGeomNode* node=this;
  refPos=center.getTransVector();
  do {
    refPos=node->getTransform().transFrom(refPos);
    node=node->getMotherNode();
    if (!node) {
      Error("calcModuleTransform","Mother volume %s not found!",node->GetName());
      return kFALSE;
    }
  } while (node&&!node->isModule());
  if (isTopNode()) return kFALSE;
  else return kTRUE;
}

Int_t HGeomNode::compare(HGeomNode& rn) {
  // Compares the volume with the volume rn and prints the diagnose
  // Returns kTRUE if the volume parameters are the same
  Int_t diff[]={0,0,0,0,0,0};
  Int_t n=0;
  cout<<fName<<'\t';
  if (mother.CompareTo(rn.getMother())!=0) {
    diff[0]=1;
    n++;
  }
  if (medium&&rn.getMedium()) {
    TString med=medium->GetName();
     if (med.CompareTo(rn.getMedium()->GetName())!=0) {
       diff[1]=1;
       n++;
     }
  } else {
    diff[1]=1;
    n++;
  }
  if (shape.CompareTo(rn.getShape())!=0) {
    diff[2]=1;
    n++;
  }
  Int_t np=rn.getNumPoints();
  if (points&&nPoints==np) {
    for (Int_t i=0;i<np;i++) {
      HGeomVector v1=*(getPoint(i));
      HGeomVector v2=*(rn.getPoint(i));
      if (fabs(v1(0)-v2(0))>=0.001||fabs(v1(1)-v2(1))>=0.001||fabs(v1(2)-v2(2))>=0.001) {
        diff[3]=1;
        n++;
        break;
      }
    }
  } else {
    diff[3]=1;
    n++;
  }
  HGeomVector v1=transform.getTransVector();
  HGeomVector v2=rn.getTransform().getTransVector();
  if (fabs(v1(0)-v2(0))>=0.001||fabs(v1(1)-v2(1))>=0.001||fabs(v1(2)-v2(2))>=0.001) {
    diff[4]=1;
    n++;
  }
  HGeomRotation r1=transform.getRotMatrix();
  HGeomRotation r2=rn.getTransform().getRotMatrix();
  for (Int_t i=0;i<9;i++) {
    if (fabs(r1(i)-r2(i))>=1.e-7) {
      diff[5]=1;
      n++;
      break;
    }
  }
  if (n>0) {
    for (Int_t i=0;i<6;i++) cout<<"    "<<diff[i]<<"  ";
    cout<<'\n';
  } else cout<<" same\n";
  return n;
}
 hgeomnode.cc:1
 hgeomnode.cc:2
 hgeomnode.cc:3
 hgeomnode.cc:4
 hgeomnode.cc:5
 hgeomnode.cc:6
 hgeomnode.cc:7
 hgeomnode.cc:8
 hgeomnode.cc:9
 hgeomnode.cc:10
 hgeomnode.cc:11
 hgeomnode.cc:12
 hgeomnode.cc:13
 hgeomnode.cc:14
 hgeomnode.cc:15
 hgeomnode.cc:16
 hgeomnode.cc:17
 hgeomnode.cc:18
 hgeomnode.cc:19
 hgeomnode.cc:20
 hgeomnode.cc:21
 hgeomnode.cc:22
 hgeomnode.cc:23
 hgeomnode.cc:24
 hgeomnode.cc:25
 hgeomnode.cc:26
 hgeomnode.cc:27
 hgeomnode.cc:28
 hgeomnode.cc:29
 hgeomnode.cc:30
 hgeomnode.cc:31
 hgeomnode.cc:32
 hgeomnode.cc:33
 hgeomnode.cc:34
 hgeomnode.cc:35
 hgeomnode.cc:36
 hgeomnode.cc:37
 hgeomnode.cc:38
 hgeomnode.cc:39
 hgeomnode.cc:40
 hgeomnode.cc:41
 hgeomnode.cc:42
 hgeomnode.cc:43
 hgeomnode.cc:44
 hgeomnode.cc:45
 hgeomnode.cc:46
 hgeomnode.cc:47
 hgeomnode.cc:48
 hgeomnode.cc:49
 hgeomnode.cc:50
 hgeomnode.cc:51
 hgeomnode.cc:52
 hgeomnode.cc:53
 hgeomnode.cc:54
 hgeomnode.cc:55
 hgeomnode.cc:56
 hgeomnode.cc:57
 hgeomnode.cc:58
 hgeomnode.cc:59
 hgeomnode.cc:60
 hgeomnode.cc:61
 hgeomnode.cc:62
 hgeomnode.cc:63
 hgeomnode.cc:64
 hgeomnode.cc:65
 hgeomnode.cc:66
 hgeomnode.cc:67
 hgeomnode.cc:68
 hgeomnode.cc:69
 hgeomnode.cc:70
 hgeomnode.cc:71
 hgeomnode.cc:72
 hgeomnode.cc:73
 hgeomnode.cc:74
 hgeomnode.cc:75
 hgeomnode.cc:76
 hgeomnode.cc:77
 hgeomnode.cc:78
 hgeomnode.cc:79
 hgeomnode.cc:80
 hgeomnode.cc:81
 hgeomnode.cc:82
 hgeomnode.cc:83
 hgeomnode.cc:84
 hgeomnode.cc:85
 hgeomnode.cc:86
 hgeomnode.cc:87
 hgeomnode.cc:88
 hgeomnode.cc:89
 hgeomnode.cc:90
 hgeomnode.cc:91
 hgeomnode.cc:92
 hgeomnode.cc:93
 hgeomnode.cc:94
 hgeomnode.cc:95
 hgeomnode.cc:96
 hgeomnode.cc:97
 hgeomnode.cc:98
 hgeomnode.cc:99
 hgeomnode.cc:100
 hgeomnode.cc:101
 hgeomnode.cc:102
 hgeomnode.cc:103
 hgeomnode.cc:104
 hgeomnode.cc:105
 hgeomnode.cc:106
 hgeomnode.cc:107
 hgeomnode.cc:108
 hgeomnode.cc:109
 hgeomnode.cc:110
 hgeomnode.cc:111
 hgeomnode.cc:112
 hgeomnode.cc:113
 hgeomnode.cc:114
 hgeomnode.cc:115
 hgeomnode.cc:116
 hgeomnode.cc:117
 hgeomnode.cc:118
 hgeomnode.cc:119
 hgeomnode.cc:120
 hgeomnode.cc:121
 hgeomnode.cc:122
 hgeomnode.cc:123
 hgeomnode.cc:124
 hgeomnode.cc:125
 hgeomnode.cc:126
 hgeomnode.cc:127
 hgeomnode.cc:128
 hgeomnode.cc:129
 hgeomnode.cc:130
 hgeomnode.cc:131
 hgeomnode.cc:132
 hgeomnode.cc:133
 hgeomnode.cc:134
 hgeomnode.cc:135
 hgeomnode.cc:136
 hgeomnode.cc:137
 hgeomnode.cc:138
 hgeomnode.cc:139
 hgeomnode.cc:140
 hgeomnode.cc:141
 hgeomnode.cc:142
 hgeomnode.cc:143
 hgeomnode.cc:144
 hgeomnode.cc:145
 hgeomnode.cc:146
 hgeomnode.cc:147
 hgeomnode.cc:148
 hgeomnode.cc:149
 hgeomnode.cc:150
 hgeomnode.cc:151
 hgeomnode.cc:152
 hgeomnode.cc:153
 hgeomnode.cc:154
 hgeomnode.cc:155
 hgeomnode.cc:156
 hgeomnode.cc:157
 hgeomnode.cc:158
 hgeomnode.cc:159
 hgeomnode.cc:160
 hgeomnode.cc:161
 hgeomnode.cc:162
 hgeomnode.cc:163
 hgeomnode.cc:164
 hgeomnode.cc:165
 hgeomnode.cc:166
 hgeomnode.cc:167
 hgeomnode.cc:168
 hgeomnode.cc:169
 hgeomnode.cc:170
 hgeomnode.cc:171
 hgeomnode.cc:172
 hgeomnode.cc:173
 hgeomnode.cc:174
 hgeomnode.cc:175
 hgeomnode.cc:176
 hgeomnode.cc:177
 hgeomnode.cc:178
 hgeomnode.cc:179
 hgeomnode.cc:180
 hgeomnode.cc:181
 hgeomnode.cc:182
 hgeomnode.cc:183
 hgeomnode.cc:184
 hgeomnode.cc:185
 hgeomnode.cc:186
 hgeomnode.cc:187
 hgeomnode.cc:188
 hgeomnode.cc:189
 hgeomnode.cc:190
 hgeomnode.cc:191
 hgeomnode.cc:192
 hgeomnode.cc:193
 hgeomnode.cc:194
 hgeomnode.cc:195
 hgeomnode.cc:196
 hgeomnode.cc:197
 hgeomnode.cc:198
 hgeomnode.cc:199
 hgeomnode.cc:200
 hgeomnode.cc:201
 hgeomnode.cc:202
 hgeomnode.cc:203
 hgeomnode.cc:204
 hgeomnode.cc:205
 hgeomnode.cc:206
 hgeomnode.cc:207
 hgeomnode.cc:208
 hgeomnode.cc:209
 hgeomnode.cc:210
 hgeomnode.cc:211
 hgeomnode.cc:212
 hgeomnode.cc:213
 hgeomnode.cc:214
 hgeomnode.cc:215
 hgeomnode.cc:216
 hgeomnode.cc:217
 hgeomnode.cc:218
 hgeomnode.cc:219
 hgeomnode.cc:220
 hgeomnode.cc:221
 hgeomnode.cc:222
 hgeomnode.cc:223
 hgeomnode.cc:224
 hgeomnode.cc:225
 hgeomnode.cc:226
 hgeomnode.cc:227
 hgeomnode.cc:228
 hgeomnode.cc:229
 hgeomnode.cc:230
 hgeomnode.cc:231
 hgeomnode.cc:232
 hgeomnode.cc:233
 hgeomnode.cc:234
 hgeomnode.cc:235
 hgeomnode.cc:236
 hgeomnode.cc:237
 hgeomnode.cc:238
 hgeomnode.cc:239
 hgeomnode.cc:240
 hgeomnode.cc:241
 hgeomnode.cc:242
 hgeomnode.cc:243
 hgeomnode.cc:244
 hgeomnode.cc:245
 hgeomnode.cc:246
 hgeomnode.cc:247
 hgeomnode.cc:248
 hgeomnode.cc:249
 hgeomnode.cc:250
 hgeomnode.cc:251
 hgeomnode.cc:252
 hgeomnode.cc:253
 hgeomnode.cc:254
 hgeomnode.cc:255
 hgeomnode.cc:256
 hgeomnode.cc:257
 hgeomnode.cc:258
 hgeomnode.cc:259
 hgeomnode.cc:260
 hgeomnode.cc:261
 hgeomnode.cc:262
 hgeomnode.cc:263
 hgeomnode.cc:264
 hgeomnode.cc:265
 hgeomnode.cc:266
 hgeomnode.cc:267
 hgeomnode.cc:268
 hgeomnode.cc:269
 hgeomnode.cc:270
 hgeomnode.cc:271
 hgeomnode.cc:272
 hgeomnode.cc:273
 hgeomnode.cc:274
 hgeomnode.cc:275
 hgeomnode.cc:276
 hgeomnode.cc:277
 hgeomnode.cc:278
 hgeomnode.cc:279
 hgeomnode.cc:280
 hgeomnode.cc:281
 hgeomnode.cc:282
 hgeomnode.cc:283
 hgeomnode.cc:284
 hgeomnode.cc:285
 hgeomnode.cc:286
 hgeomnode.cc:287
 hgeomnode.cc:288
 hgeomnode.cc:289
 hgeomnode.cc:290
 hgeomnode.cc:291
 hgeomnode.cc:292
 hgeomnode.cc:293
 hgeomnode.cc:294
 hgeomnode.cc:295
 hgeomnode.cc:296
 hgeomnode.cc:297
 hgeomnode.cc:298
 hgeomnode.cc:299
 hgeomnode.cc:300
 hgeomnode.cc:301
 hgeomnode.cc:302
 hgeomnode.cc:303
 hgeomnode.cc:304
 hgeomnode.cc:305
 hgeomnode.cc:306
 hgeomnode.cc:307
 hgeomnode.cc:308
 hgeomnode.cc:309
 hgeomnode.cc:310
 hgeomnode.cc:311
 hgeomnode.cc:312
 hgeomnode.cc:313
 hgeomnode.cc:314
 hgeomnode.cc:315
 hgeomnode.cc:316
 hgeomnode.cc:317
 hgeomnode.cc:318
 hgeomnode.cc:319