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

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////////////
// HGeomRootBuilder
//
// Class to create the geometry in ROOT
//
///////////////////////////////////////////////////////////////////////////////

#include "hgeomrootbuilder.h"
#include "hgeommedium.h"
#include "hgeomnode.h"
#include "hgeomtransform.h"
#include "hgeommdcwire.h"

#include "TGeoManager.h"
#include "TGeoMedium.h"
#include "TGeoMaterial.h"
#include "TGeoVolume.h"
#include "TGeoMatrix.h"
#include "TGeoPgon.h"
#include "TGeoPcon.h"

ClassImp(HGeomRootBuilder)

HGeomRootBuilder::HGeomRootBuilder() {
  // Default constructor
  geoManager=0;
}

HGeomRootBuilder::HGeomRootBuilder(const Char_t* name,const Char_t* title)
               : HGeomBuilder(name,title) {
  // Constructor
  geoManager=0;
}

Bool_t HGeomRootBuilder::createNode(HGeomNode* volu) {
  // Creates the volume
  if (!geoManager||!volu) return kFALSE;
  //volu->print();
  TString nodeName(volu->GetName(),4);
  HGeomNode* mother=volu->getMotherNode();
  if (!mother&&!volu->isTopNode()) {
    Error("createNode","Mother volume of %s not found\n",volu->GetName());
    return kFALSE;
  }
  TGeoVolume* rv=0;
  HGeomNode* cv=volu->getCopyNode();
  //if (cv) cout<<"Copy of "<<cv->GetName()<<endl;
  if (cv) rv=cv->getRootVolume();
  if (!rv) {
    HGeomMedium* medium=volu->getMedium();
    Int_t nMed=medium->getMediumIndex();
    if (nMed<=0) nMed=createMedium(medium);
    if (nMed<=0) return kFALSE;
    TArrayD* par=volu->getParameters();
    // for (Int_t k=0;k<par->GetSize();k++) cout<<par->At(k)<<" ";
    // cout<<endl;
    rv=geoManager->Volume(nodeName.Data(),volu->getShape().Data(),
          nMed,par->GetArray(),par->GetSize());
    volu->setCreated();
    if (volu->isModule()&&cv) {
      cv->setCreated();
      cv->setRootVolume(rv);
      cv->getPosition();
    }
  }
  if (!rv) return kFALSE;
  volu->setRootVolume(rv);
  if (volu->isTopNode()) geoManager->SetTopVolume(rv);
  else {
    HGeomTransform* trans=volu->getPosition();
    const HGeomRotation& rot=trans->getRotMatrix();
    const HGeomVector& pos=trans->getTransVector();
    TGeoMatrix* tr=0;
    if (((HGeomRotation&)rot).isUnitMatrix())
      tr=new TGeoTranslation(pos.getX(),pos.getY(),pos.getZ());
    else {
      nRot++;
      Char_t b[10];
      sprintf(b,"R%i",nRot);
      TGeoRotation* r=new TGeoRotation(b);
      Double_t a[9];
      for (Int_t i=0;i<9;i++) a[i]=rot(i);
      r->SetMatrix(a);
      tr=new TGeoCombiTrans(pos.getX(),pos.getY(),pos.getZ(),r);
    }
    TGeoVolume* mo=mother->getRootVolume();
    if (!mo) return kFALSE;
    mo->AddNode(rv,volu->getCopyNo(),tr);
  }
  return kTRUE;
}

Int_t HGeomRootBuilder::createMedium(HGeomMedium* med) {
  // Creates the medium
  if (!geoManager&&!med) return 0;
  Int_t nComp=med->getNComponents();
  Int_t weightFac=med->getWeightFac();
  TGeoMaterial* material=0;
  Double_t p[3];
  if (nComp==1) {
    med->getComponent(0,p);
    material=new TGeoMaterial(med->GetName(),p[0],p[1],med->getDensity(),
                         med->getRadiationLength());
          // Interaction length not defined!!!!!!
  } else {
    material=new TGeoMixture(med->GetName(),nComp,med->getDensity());
    Double_t sumWeights=0.;
    if (weightFac<0) {
      for(Int_t i=0;i<nComp;i++) {
        med->getComponent(i,p);
        sumWeights+=p[0]*p[2];
      }
    }
    for(Int_t i=0;i<nComp;i++) {
      med->getComponent(i,p);
      if (weightFac>0)
        ((TGeoMixture*)material)->DefineElement(i,p[0],p[1],p[2]);
      else
        ((TGeoMixture*)material)->DefineElement(i,p[0],p[1],p[0]*p[2]/sumWeights);
    }
  }
  nMed++;
  med->setMediumIndex(nMed);
  Double_t mp[10];
  med->getMediumPar(mp);
  TGeoMedium* medium=new TGeoMedium(med->GetName(),nMed,material,mp);
  if (medium) return nMed;
  else return 0;
}

void HGeomRootBuilder::finalize() {
  // Closes the geometry input in ROOT and draws the cave
  if (geoManager) {
    geoManager->CloseGeometry();
    geoManager->SetVisLevel(2);
    geoManager->GetTopVolume()->Draw();
  }    
}

void HGeomRootBuilder::checkOverlaps(Double_t ovlp) {
  // Checks the geometry for overlaps and extrusions wit a default precision of 1 micron
  if (geoManager) {
    geoManager->CheckOverlaps(ovlp,"SAME");
    geoManager->PrintOverlaps();
  }
}

Bool_t HGeomRootBuilder::createVolume(HGeomMdcWire* pWire, Int_t mediumIndex) {
  // Creates the MDC wire volume and sets the pointer to the ROOT volume in the pWire object
  if (!pWire || mediumIndex<0) return kFALSE;
  TGeoVolume* rv = NULL;
  if (pWire->getCopyNumber() == 1) {
    rv=geoManager->Volume(pWire->getWireName().Data(), "TUBE", mediumIndex, pWire->getParams(), pWire->getNParams());
  }
  if (rv) {
    pWire->setRootVolume(rv);
    return kTRUE;
  }
  return kFALSE;
}

Int_t HGeomRootBuilder::createRotation(HGeomRotation* rot) {
  // Creates a rotation and registers it in the list of matrices in the GeoManager
  // Returns the index in the array
  if (!rot) return -1; 
  Int_t rotInd=0;
  if (rot->isUnitMatrix()==kFALSE) {
    nRot++;
    Char_t b[10];
    sprintf(b,"R%i",nRot);
    TGeoRotation* prot = new TGeoRotation(b);
    Double_t a[9];
    for (Int_t i=0;i<9;i++) a[i] = (*rot)(i);
    prot->SetMatrix(a);
    prot->RegisterYourself();
    rotInd=geoManager->GetListOfMatrices()->GetEntriesFast() -1;
  }
  return rotInd;
}  

Bool_t HGeomRootBuilder::positionNode(HGeomMdcWire* pWire, HGeomNode* pMother, Int_t rotInd) { 
  // Positions the MDC wire node
  // rotInd is the index of the rotation matrix in the list of matrices in the GeoManager
  if (!pWire || !pMother) return kFALSE;
  TGeoVolume* volu = NULL;
  if (pWire->getCopyNumber() > 1 && pWire->getRootVolume() == NULL) {
    HGeomMdcWire* node = pWire->getCopyNode();
    if (node) volu = node->getRootVolume();
    pWire->setRootVolume(volu);
  } else {
    volu = pWire->getRootVolume();
  }
  TGeoVolume* plane = pMother->getRootVolume();
  if (!volu || !plane) return kFALSE;
  Double_t x = 0., y = 0., z = 0.;
  pWire->getPosition(x, y, z); 
  TGeoMatrix* tr = NULL;
  if (rotInd>0) {
    TGeoMatrix* prot = (TGeoMatrix*)(geoManager->GetListOfMatrices()->At(rotInd));
    if (prot && prot->IsRotation()) {
      tr = new TGeoCombiTrans(x, y, z, (TGeoRotation*)prot);
    } else return kFALSE;
  } else {
    tr=new TGeoTranslation(x, y, z);
  }
  if (!tr) return kFALSE;
  plane->AddNode(volu, pWire->getCopyNumber(), tr);
  return kTRUE;
}
 hgeomrootbuilder.cc:1
 hgeomrootbuilder.cc:2
 hgeomrootbuilder.cc:3
 hgeomrootbuilder.cc:4
 hgeomrootbuilder.cc:5
 hgeomrootbuilder.cc:6
 hgeomrootbuilder.cc:7
 hgeomrootbuilder.cc:8
 hgeomrootbuilder.cc:9
 hgeomrootbuilder.cc:10
 hgeomrootbuilder.cc:11
 hgeomrootbuilder.cc:12
 hgeomrootbuilder.cc:13
 hgeomrootbuilder.cc:14
 hgeomrootbuilder.cc:15
 hgeomrootbuilder.cc:16
 hgeomrootbuilder.cc:17
 hgeomrootbuilder.cc:18
 hgeomrootbuilder.cc:19
 hgeomrootbuilder.cc:20
 hgeomrootbuilder.cc:21
 hgeomrootbuilder.cc:22
 hgeomrootbuilder.cc:23
 hgeomrootbuilder.cc:24
 hgeomrootbuilder.cc:25
 hgeomrootbuilder.cc:26
 hgeomrootbuilder.cc:27
 hgeomrootbuilder.cc:28
 hgeomrootbuilder.cc:29
 hgeomrootbuilder.cc:30
 hgeomrootbuilder.cc:31
 hgeomrootbuilder.cc:32
 hgeomrootbuilder.cc:33
 hgeomrootbuilder.cc:34
 hgeomrootbuilder.cc:35
 hgeomrootbuilder.cc:36
 hgeomrootbuilder.cc:37
 hgeomrootbuilder.cc:38
 hgeomrootbuilder.cc:39
 hgeomrootbuilder.cc:40
 hgeomrootbuilder.cc:41
 hgeomrootbuilder.cc:42
 hgeomrootbuilder.cc:43
 hgeomrootbuilder.cc:44
 hgeomrootbuilder.cc:45
 hgeomrootbuilder.cc:46
 hgeomrootbuilder.cc:47
 hgeomrootbuilder.cc:48
 hgeomrootbuilder.cc:49
 hgeomrootbuilder.cc:50
 hgeomrootbuilder.cc:51
 hgeomrootbuilder.cc:52
 hgeomrootbuilder.cc:53
 hgeomrootbuilder.cc:54
 hgeomrootbuilder.cc:55
 hgeomrootbuilder.cc:56
 hgeomrootbuilder.cc:57
 hgeomrootbuilder.cc:58
 hgeomrootbuilder.cc:59
 hgeomrootbuilder.cc:60
 hgeomrootbuilder.cc:61
 hgeomrootbuilder.cc:62
 hgeomrootbuilder.cc:63
 hgeomrootbuilder.cc:64
 hgeomrootbuilder.cc:65
 hgeomrootbuilder.cc:66
 hgeomrootbuilder.cc:67
 hgeomrootbuilder.cc:68
 hgeomrootbuilder.cc:69
 hgeomrootbuilder.cc:70
 hgeomrootbuilder.cc:71
 hgeomrootbuilder.cc:72
 hgeomrootbuilder.cc:73
 hgeomrootbuilder.cc:74
 hgeomrootbuilder.cc:75
 hgeomrootbuilder.cc:76
 hgeomrootbuilder.cc:77
 hgeomrootbuilder.cc:78
 hgeomrootbuilder.cc:79
 hgeomrootbuilder.cc:80
 hgeomrootbuilder.cc:81
 hgeomrootbuilder.cc:82
 hgeomrootbuilder.cc:83
 hgeomrootbuilder.cc:84
 hgeomrootbuilder.cc:85
 hgeomrootbuilder.cc:86
 hgeomrootbuilder.cc:87
 hgeomrootbuilder.cc:88
 hgeomrootbuilder.cc:89
 hgeomrootbuilder.cc:90
 hgeomrootbuilder.cc:91
 hgeomrootbuilder.cc:92
 hgeomrootbuilder.cc:93
 hgeomrootbuilder.cc:94
 hgeomrootbuilder.cc:95
 hgeomrootbuilder.cc:96
 hgeomrootbuilder.cc:97
 hgeomrootbuilder.cc:98
 hgeomrootbuilder.cc:99
 hgeomrootbuilder.cc:100
 hgeomrootbuilder.cc:101
 hgeomrootbuilder.cc:102
 hgeomrootbuilder.cc:103
 hgeomrootbuilder.cc:104
 hgeomrootbuilder.cc:105
 hgeomrootbuilder.cc:106
 hgeomrootbuilder.cc:107
 hgeomrootbuilder.cc:108
 hgeomrootbuilder.cc:109
 hgeomrootbuilder.cc:110
 hgeomrootbuilder.cc:111
 hgeomrootbuilder.cc:112
 hgeomrootbuilder.cc:113
 hgeomrootbuilder.cc:114
 hgeomrootbuilder.cc:115
 hgeomrootbuilder.cc:116
 hgeomrootbuilder.cc:117
 hgeomrootbuilder.cc:118
 hgeomrootbuilder.cc:119
 hgeomrootbuilder.cc:120
 hgeomrootbuilder.cc:121
 hgeomrootbuilder.cc:122
 hgeomrootbuilder.cc:123
 hgeomrootbuilder.cc:124
 hgeomrootbuilder.cc:125
 hgeomrootbuilder.cc:126
 hgeomrootbuilder.cc:127
 hgeomrootbuilder.cc:128
 hgeomrootbuilder.cc:129
 hgeomrootbuilder.cc:130
 hgeomrootbuilder.cc:131
 hgeomrootbuilder.cc:132
 hgeomrootbuilder.cc:133
 hgeomrootbuilder.cc:134
 hgeomrootbuilder.cc:135
 hgeomrootbuilder.cc:136
 hgeomrootbuilder.cc:137
 hgeomrootbuilder.cc:138
 hgeomrootbuilder.cc:139
 hgeomrootbuilder.cc:140
 hgeomrootbuilder.cc:141
 hgeomrootbuilder.cc:142
 hgeomrootbuilder.cc:143
 hgeomrootbuilder.cc:144
 hgeomrootbuilder.cc:145
 hgeomrootbuilder.cc:146
 hgeomrootbuilder.cc:147
 hgeomrootbuilder.cc:148
 hgeomrootbuilder.cc:149
 hgeomrootbuilder.cc:150
 hgeomrootbuilder.cc:151
 hgeomrootbuilder.cc:152
 hgeomrootbuilder.cc:153
 hgeomrootbuilder.cc:154
 hgeomrootbuilder.cc:155
 hgeomrootbuilder.cc:156
 hgeomrootbuilder.cc:157
 hgeomrootbuilder.cc:158
 hgeomrootbuilder.cc:159
 hgeomrootbuilder.cc:160
 hgeomrootbuilder.cc:161
 hgeomrootbuilder.cc:162
 hgeomrootbuilder.cc:163
 hgeomrootbuilder.cc:164
 hgeomrootbuilder.cc:165
 hgeomrootbuilder.cc:166
 hgeomrootbuilder.cc:167
 hgeomrootbuilder.cc:168
 hgeomrootbuilder.cc:169
 hgeomrootbuilder.cc:170
 hgeomrootbuilder.cc:171
 hgeomrootbuilder.cc:172
 hgeomrootbuilder.cc:173
 hgeomrootbuilder.cc:174
 hgeomrootbuilder.cc:175
 hgeomrootbuilder.cc:176
 hgeomrootbuilder.cc:177
 hgeomrootbuilder.cc:178
 hgeomrootbuilder.cc:179
 hgeomrootbuilder.cc:180
 hgeomrootbuilder.cc:181
 hgeomrootbuilder.cc:182
 hgeomrootbuilder.cc:183
 hgeomrootbuilder.cc:184
 hgeomrootbuilder.cc:185
 hgeomrootbuilder.cc:186
 hgeomrootbuilder.cc:187
 hgeomrootbuilder.cc:188
 hgeomrootbuilder.cc:189
 hgeomrootbuilder.cc:190
 hgeomrootbuilder.cc:191
 hgeomrootbuilder.cc:192
 hgeomrootbuilder.cc:193
 hgeomrootbuilder.cc:194
 hgeomrootbuilder.cc:195
 hgeomrootbuilder.cc:196
 hgeomrootbuilder.cc:197
 hgeomrootbuilder.cc:198
 hgeomrootbuilder.cc:199
 hgeomrootbuilder.cc:200
 hgeomrootbuilder.cc:201
 hgeomrootbuilder.cc:202
 hgeomrootbuilder.cc:203
 hgeomrootbuilder.cc:204
 hgeomrootbuilder.cc:205
 hgeomrootbuilder.cc:206
 hgeomrootbuilder.cc:207
 hgeomrootbuilder.cc:208
 hgeomrootbuilder.cc:209
 hgeomrootbuilder.cc:210
 hgeomrootbuilder.cc:211
 hgeomrootbuilder.cc:212
 hgeomrootbuilder.cc:213