ROOT logo
//*-- AUTHOR : Ilse Koenig
//*-- Created : 10/11/03 by Ilse Koenig
//*-- Modified : 09/05/2006 by Ilse Koenig

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////////////
// HGeomInterface
//
// Manager class for geometry used by simulation
//
///////////////////////////////////////////////////////////////////////////////

using namespace std;
#include <iostream>
#include <iomanip>
#include <time.h>
#include "hgeominterface.h"
#include "hgeomio.h"
#include "hgeomasciiio.h"
#include "hgeommedia.h"
#include "hgeomshapes.h"
#include "hgeomset.h"
#include "hgeomhit.h"
#include "hgeombuilder.h"
#include "hgeomcave.h"
#include "hgeomsectors.h"
#include "hgeommdc.h"
#include "hgeomcoils.h"
#include "hgeomtof.h"
#include "hgeomrich.h"
#include "hgeomshower.h"
#include "hgeomframes.h"
#include "hgeomtarget.h"
#include "hgeomstart.h"
#include "hgeomfwall.h"
#include "hgeomrpc.h"
#include "hgeomemc.h"
#include "hgeomuser.h"
#include "hgeomnode.h"
#include "hspecgeompar.h"
#include "hdetgeompar.h"
#include "TClass.h"

ClassImp(HGeomInterface)

HGeomInterface::HGeomInterface() {
  // Constructor
  fileInput=0;
  oraInput=0;
  output=0;
  media=new HGeomMedia();
  shapes=new HGeomShapes();
  masterNodes=new TList();
  nSets=14;
  sets=new TObjArray(nSets);
  nActualSets=0;
  nFiles=0;
  geoBuilder=0;
  addDateTime = kTRUE;
}

HGeomInterface::~HGeomInterface() {
  // Destructor
  if (fileInput) {
    delete fileInput;
    fileInput=0;
  }
  if (oraInput) {
    delete oraInput;
    oraInput=0;
  }
  if (output) {
    delete output;
    output=0;
  }
  if (geoBuilder) {
    delete geoBuilder;
    geoBuilder=0;
  }
  if (masterNodes) {
    masterNodes->Delete();
    delete masterNodes;
    masterNodes=0;
  }
  if (sets) {
    sets->Delete();
    delete sets;
    sets=0;
  }
  if (media) {
    delete media;
    media=0;
  }
  if (shapes) {
    delete shapes;
    shapes=0;
  }
}

void HGeomInterface::addInputFile(const Char_t* file) {
  // Adds the input file and creates the corresponding detector object
  HGeomSet* pSet=0;
  TString setName(file);
  setName.ToLower();
  Int_t l=setName.Last('/')+1;
  setName=setName(l,setName.Length()-l);

  if (setName.Contains("media")) {
    media->setInputFile(file);
  } else {
    if (setName.Contains("cave")) {
      pSet=(HGeomSet*)sets->At(kHGeomCave);
      if (!pSet) {
        pSet=new HGeomCave;
        sets->AddAt(pSet,kHGeomCave);
      }
    } else if (setName.Contains("sect")) {
      pSet=(HGeomSet*)sets->At(kHGeomSect);
      if (!pSet) {
        pSet=new HGeomSectors;
        sets->AddAt(pSet,kHGeomSect);
      }
    } else if (setName.Contains("rich")) {
      pSet=(HGeomSet*)sets->At(kHGeomRich);
      if (!pSet&&!setName.Contains(".hit")) {
        pSet=new HGeomRich;
        sets->AddAt(pSet,kHGeomRich);
      }
    } else if (setName.Contains("target")) {
      pSet=(HGeomSet*)sets->At(kHGeomTarget);
      if (!pSet) {
        pSet=new HGeomTarget;
        sets->AddAt(pSet,kHGeomTarget);
      }
    } else if (setName.Contains("mdc")) {
      pSet=(HGeomSet*)sets->At(kHGeomMdc);
      if (!pSet&&!setName.Contains(".hit")) {
        pSet=new HGeomMdc;
        sets->AddAt(pSet,kHGeomMdc);
      }
    } else if (setName.Contains("tof")) {
      pSet=(HGeomSet*)sets->At(kHGeomTof);
      if (!pSet&&!setName.Contains(".hit")) {
        pSet=new HGeomTof;
        sets->AddAt(pSet,kHGeomTof);
      }
    } else if (setName.Contains("shower")) {
      pSet=(HGeomSet*)sets->At(kHGeomShower);
      if (!pSet&&!setName.Contains(".hit")) {
        pSet=new HGeomShower;
        sets->AddAt(pSet,kHGeomShower);
      }
    } else if (setName.Contains("coils")) {
      pSet=(HGeomSet*)sets->At(kHGeomCoils);
      if (!pSet) {
        pSet=new HGeomCoils;
        sets->AddAt(pSet,kHGeomCoils);
      }
    } else if (setName.Contains("frames")) {
      pSet=(HGeomSet*)sets->At(kHGeomFrames);
      if (!pSet) {
        pSet=new HGeomFrames;
        sets->AddAt(pSet,kHGeomFrames);
      }
    } else if (setName.Contains("start")) {
      pSet=(HGeomSet*)sets->At(kHGeomStart);
      if (!pSet&&!setName.Contains(".hit")) {
        pSet=new HGeomStart;
        sets->AddAt(pSet,kHGeomStart);
      }
    } else if (setName.Contains("wall")) {
     pSet=(HGeomSet*)sets->At(kHGeomFWall);
      if (!pSet&&!setName.Contains(".hit")) {
        pSet=new HGeomFWall;
        sets->AddAt(pSet,kHGeomFWall);
      }
    } else if (setName.Contains("rpc")) {
      pSet=(HGeomSet*)sets->At(kHGeomRpc);
      if (!pSet&&!setName.Contains(".hit")) {
        pSet=new HGeomRpc;
        sets->AddAt(pSet,kHGeomRpc);
      }
    } else if (setName.Contains("emc")) {
      pSet=(HGeomSet*)sets->At(kHGeomEmc);
      if (!pSet&&!setName.Contains(".hit")) {
        pSet=new HGeomEmc;
        sets->AddAt(pSet,kHGeomEmc);
      }  
    } else if (setName.Contains("user")) {
      pSet=(HGeomSet*)sets->At(kHGeomUser);
      if (!pSet&&!setName.Contains(".hit")) {
        pSet=new HGeomUser;
        sets->AddAt(pSet,kHGeomUser);
      }
    } else Error("addInputFile","Unknown detector set: %s",file);
    if (pSet) {
      pSet->setShapes(shapes);
      pSet->setMasterNodes(masterNodes);
      if (setName.Contains(".hit")) pSet->setHitFile(file);
      else {
        if (strlen(pSet->getGeomFile())==0) pSet->setGeomFile(file);
	nActualSets++;
      }
    }
  }
  if (setName.Contains(".geo")||setName.Contains(".hit")) nFiles++;
}

HGeomSet* HGeomInterface::findSet(const Char_t* name) {
  // Find the detector set in the actual setup
  HGeomSet* pSet=0;
  TString setName(name);
  setName.ToLower();
  Int_t l=setName.Last('/')+1;
  setName=setName(l,setName.Length()-l);
  if (setName.Contains("cave"))        pSet=(HGeomSet*)sets->At(kHGeomCave);
  else if (setName.Contains("sect"))   pSet=(HGeomSet*)sets->At(kHGeomSect);
  else if (setName.Contains("rich"))   pSet=(HGeomSet*)sets->At(kHGeomRich);
  else if (setName.Contains("target")) pSet=(HGeomSet*)sets->At(kHGeomTarget);
  else if (setName.Contains("mdc"))    pSet=(HGeomSet*)sets->At(kHGeomMdc);
  else if (setName.Contains("tof"))    pSet=(HGeomSet*)sets->At(kHGeomTof);
  else if (setName.Contains("shower")) pSet=(HGeomSet*)sets->At(kHGeomShower);
  else if (setName.Contains("coils"))  pSet=(HGeomSet*)sets->At(kHGeomCoils);
  else if (setName.Contains("frames")) pSet=(HGeomSet*)sets->At(kHGeomFrames);
  else if (setName.Contains("start"))  pSet=(HGeomSet*)sets->At(kHGeomStart);
  else if (setName.Contains("wall"))   pSet=(HGeomSet*)sets->At(kHGeomFWall);
  else if (setName.Contains("rpc"))    pSet=(HGeomSet*)sets->At(kHGeomRpc);
  else if (setName.Contains("emc"))    pSet=(HGeomSet*)sets->At(kHGeomEmc);
  else if (setName.Contains("user"))   pSet=(HGeomSet*)sets->At(kHGeomUser);
  return pSet;
}

Bool_t HGeomInterface::readSet(HGeomSet* pSet) {
  // Reads the geometry for the detector part
  Bool_t rc=kFALSE;
  HGeomIo* input=0;
  if (pSet) {
    input=connectInput(pSet->getGeomFile());
    if (input) rc=input->read(pSet,media);
    HGeomHit* pHit=pSet->getHit();
    if (rc&&pHit) {
      TString f=pHit->getHitFile();
      if (f.Length()>0) input=connectInput(pHit->getHitFile());
      else input=connectInput("_gdb");
      if (input) rc=input->read(pHit);
    }
  }
  return rc;
}

Bool_t HGeomInterface::writeSet(const Char_t* name,const Char_t* author,const Char_t* descr) {
  HGeomSet* set = findSet(name);
  TString v;
  if (set) {
    set->setAuthor(v=author);
    set->setDescription(v=descr);
    return writeSet(set);
  } 
  Error("writeSet","Set %s is not found!",name);
  return kFALSE;
}

Bool_t HGeomInterface::writeMedia(const Char_t* author,const Char_t* descr) {
  TString v;
  if (media != NULL) {
    media->setAuthor(v=author);
    media->setDescription(v=descr);
    return writeMedia();
  } 
  Error("writeMedia","Media is not defined!");
  return kFALSE;
}

Bool_t HGeomInterface::writeSet(HGeomSet* pSet) {
  // Writes the geometry for the detector part to output
  Bool_t rc=kFALSE;
  if (pSet&&connectOutput(pSet->GetName())) {
    rc=output->write(pSet);
    HGeomHit* pHit=pSet->getHit();
    if (rc&&pHit) {
      if (connectOutput(pSet->GetName(),"hit")) rc=output->write(pHit);
    }
  }
  return rc;
}

Bool_t HGeomInterface::writeSet(HGeomSet* pSet, const Char_t* filename) {
  // Writes the geometry for the detector part to file
  if (pSet&&output) {
    output->open(filename,"out");
    if (output->isOpen()) return output->write(pSet);
  }
  return kFALSE;
}

void HGeomInterface::deleteSet(HGeomSet* pSet) {
  // Deletes the set
  if (pSet) {
    sets->Remove(pSet);
    delete pSet;
    pSet=0;
  }
}

Bool_t HGeomInterface::readMedia() {
  // Reads the media
  Bool_t rc=kFALSE;
  HGeomIo* input=connectInput(media->getInputFile());
  if (input) {
    rc=input->read(media);
  }
  return rc;  
}

Bool_t HGeomInterface::writeMedia() {
  // Writes the media to output
  if (connectOutput("media")) return output->write(media);
  return kFALSE;
}

Bool_t HGeomInterface::writeMedia(const Char_t* filename) {
  // Writes the media to file
  if (output) {
    output->open(filename,"out");
    if (output->isOpen()) return output->write(media);
  }
  return kFALSE;
}

Bool_t HGeomInterface::readAll() {
  // Reads the media and the whole geometry and hit definitions
  Bool_t rc=kTRUE;
  if (nFiles==0&&oraInput) {
    rc=oraInput->readGeomConfig(this);
    if (rc) addInputFile("media_gdb");
  } 
  if(rc) rc=readSetupFile();
  if(rc) rc=readMedia();  
  HGeomSet* pSet=0;
  for(Int_t i=0;i<nSets&&rc;i++) {
    pSet=(HGeomSet*)sets->At(i);
    if (pSet) {
      cout<<"Read "<<pSet->GetName()<<endl;
      rc=readSet(pSet);
    }
  }
  return rc;
}

Bool_t HGeomInterface::writeAll() {
  // Reads the media and the whole geometry to output
  Bool_t rc=kTRUE;
  HGeomSet* pSet=0;
  rc=writeMedia();
  for(Int_t i=0;i<nSets&&rc;i++) {
    pSet=(HGeomSet*)sets->At(i);
    if (pSet) rc=writeSet(pSet);
  }
  return rc;
}

Bool_t HGeomInterface::createAll(Bool_t withCleanup) {
  // Creates the whole geometry
  // (if withCleanup==kTRUE, the geometry input is deleted afterwards)
  Bool_t rc=kTRUE;
  Int_t n=0;  
  if (geoBuilder) {
    HGeomSet* pSet=0;
    for(Int_t i=0;i<nSets&&rc;i++) {
      pSet=(HGeomSet*)sets->At(i);
      if (pSet) {
        cout<<"Create "<<pSet->GetName()<<endl;
        rc=pSet->create(geoBuilder, paramFile, media);
        n++;
        if (withCleanup) {
          sets->RemoveAt(i);
          delete pSet;
        }
      }
    }
    if (rc&&n>0) geoBuilder->finalize();
  } else Error("createAll()","No Builder");
  return rc;
}

Bool_t HGeomInterface::createGeometry(Bool_t withCleanup) {
  // Reads and creates the whole geometry
  // (if withCleanup==kTRUE, the geometry input is deleted after creation)
  Bool_t rc=kTRUE;  
  Int_t n=0;  
  if (geoBuilder) {
    if (nFiles==0&&oraInput) {
      rc=oraInput->readGeomConfig(this);
      if (rc) addInputFile("media_gdb");
    }
    if (rc) rc=readSetupFile();
    if (rc) rc=readMedia();
    HGeomSet* pSet=0;
    for(Int_t i=0;i<nSets&&rc;i++) {
      pSet=(HGeomSet*)sets->At(i);
      if (pSet) {
	cout<<"Read and create "<<pSet->GetName()<<endl;
        rc=readSet(pSet);
        if (rc) {
          rc=pSet->create(geoBuilder, paramFile, media);
          n++;
        }
        if (withCleanup) {
          sets->RemoveAt(i);
          delete pSet;
        }
      }
    }
    if (rc&&n>0) geoBuilder->finalize();
  } else Error("createAll()","No Builder");
  return rc;
}

HGeomIo* HGeomInterface::connectInput(const Char_t* filename) {
  // Connects the input (ASCII or Oracle)
  HGeomIo* currentIo=0;
  if (filename) {
    TString s(filename);
    s=s.Strip();
    if (s.EndsWith(".dat")||s.EndsWith(".geo")||s.EndsWith(".hit")
        ||s.EndsWith(".setup")) {
      if (!fileInput) fileInput=new HGeomAsciiIo();
      fileInput->open(filename);
      currentIo=fileInput;
    } else if (s.EndsWith("_gdb")) currentIo=oraInput;
  }
  if (currentIo && currentIo->isOpen()) return currentIo;
  return 0; 
}

Bool_t HGeomInterface::connectOutput (const Char_t* name,TString pType) {
  // Connects the output (ASCII or Oracle)
  if (output) {
    if (strcmp(output->IsA()->GetName(),"HGeomAsciiIo")==0) {
      TString fName(name);
      if(addDateTime) {
        Char_t buf[80];
        struct tm* newtime;
        time_t t;
        time(&t);
        newtime=localtime(&t);
        if (newtime->tm_mday<10) sprintf(buf,"_0%i",newtime->tm_mday);
        else sprintf(buf,"_%i",newtime->tm_mday);
        fName=fName+buf;
        if (newtime->tm_mon<9) sprintf(buf,"0%i",newtime->tm_mon+1);
        else sprintf(buf,"%i",newtime->tm_mon+1);
        fName=fName+buf;
        Int_t y=newtime->tm_year-100;
        if (y<10) sprintf(buf,"0%i",y);
        else sprintf(buf,"%i",y);
        fName=fName+buf;
        if (newtime->tm_hour<10) sprintf(buf,"0%i",newtime->tm_hour);
        else sprintf(buf,"%i",newtime->tm_hour);
        fName=fName+buf;
        if (newtime->tm_min<10) sprintf(buf,"0%i",newtime->tm_min);
        else sprintf(buf,"%i",newtime->tm_min);
        fName=fName+buf;
        if (newtime->tm_sec<10) sprintf(buf,"0%i",newtime->tm_sec);
        else sprintf(buf,"%i",newtime->tm_sec);
        fName=fName+buf;
      }
      fName=fName+"."+pType;
      output->open(fName,"out");
      cout<<"Output file for "<<name<<":  "
          <<((HGeomAsciiIo*)output)->getFilename()<<endl;
    }
    if (output->isOpen()&&output->isWritable()) return kTRUE;
  } else Error("connectOutput","No output open");
  return kFALSE;
}

Bool_t HGeomInterface::createSet(HGeomSet* pSet) {
  // Creates the geometry of detector part
  if (!geoBuilder) return kFALSE;
  return pSet->create(geoBuilder, paramFile, media);
}

Bool_t HGeomInterface::addAlignment(HSpecGeomPar* pPar) {
  // Adds the target alignment (not yet implemented for sectors)
  if (!pPar) return kFALSE;
  HGeomSet* pTarget=(HGeomSet*)sets->At(kHGeomTarget);
  HGeomSet* pRich=(HGeomSet*)sets->At(kHGeomRich);
  if (!pTarget||!pRich) {
    Error("addAlignment(HSpecGeomPar*",
          "Target or RICH not found in GEANT geometry!");
    return kFALSE;
  }
  Int_t nTargets=pPar->getNumTargets();
  Double_t meanShiftGeo=0,meanShiftAlign=0,dshift=0;
  Int_t nt=0;
  for (Int_t i=0;i<nTargets;i++) {
    HGeomVolume* vol=pPar->getTarget(i);
    if (vol) {
      HGeomNode* node=pTarget->getVolume(vol->GetName());
      if (!node) {
        Error("addAlignment(HSpecGeomPar*","GEANT Volume %s not found!",
	      vol->GetName()); 
        return kFALSE;
      }
      nt++;
      HGeomTransform& tv=vol->getTransform();
      meanShiftAlign+=tv.getTransVector().getZ();
      HGeomTransform* tn=node->getLabTransform();
      if(!tn) return kFALSE;      
      meanShiftGeo+=tn->getTransVector().getZ();
    }
  }
  dshift=(meanShiftAlign-meanShiftGeo)/nt;
  cout<<"Target alignment: mean shift "<<dshift<<endl;
  HGeomNode* node=pRich->getVolume("RICH");
  HGeomTransform& t=node->getTransform();
  HGeomVector pos(t.getTransVector());
  pos.setZ(t.getTransVector().getZ()+dshift);
  t.setTransVector(pos);
  //  node=pRich->getVolume("RTAM"); 
  //  HGeomNode* rNode=(HGeomNode*)masterNodes->FindObject("RTAM");
  //  HGeomTransform* nTransform=node->getLabTransform();
  //  if (node&&rNode&&nTransform) rNode->setLabTransform(*(nTransform));
/*  Actually Sectors are not changed by the alignment!
  HGeomSet* pSectors=(HGeomSet*)sets->At(kHGeomSect);
  Int_t nSectors=pPar->getNumSectors();
  if (nSectors>0&&!pSectors) {
    Error("addAlignment(HSpecGeomPar*",
          "Sectors not found in GEANT geometry!");
    return kFALSE;
  }
  for (Int_t i=0;i<nSectors;i++) {
    HGeomVolume* vol=pPar->getSector(i);
    if (vol) {
      HGeomNode* node=pSectors->getVolume(vol->GetName());
      if (node) {
        Int_t np=vol->getNumPoints();
        node->createPoints(np);
	for (Int_t i=0;i<np;i++) node->setPoint(i,*(vol->getPoint(i)));
        node->setLabTransform(vol->getTransform());
        HGeomNode* rNode=(HGeomNode*)masterNodes->FindObject(vol->GetName());
        if (rNode) rNode->setLabTransform(vol->getTransform());
      }
    }
  }
*/
  return kTRUE;
}

Bool_t HGeomInterface::addAlignment(HDetGeomPar* pPar) {
  // Adds the detector alignment
  if (!pPar) return kFALSE;
  TString detName=pPar->getDetectorName();
  detName.ToLower();
  HGeomSet* pDet=findSet(detName);
  if (!pDet) {
    Error("addAlignment","Detector %s not defined!",pPar->getDetectorName());
    return kFALSE;
  }
  Double_t shiftFDSR[2] = {1000.,1000.};
  Int_t nModules=pPar->getNumModules();
  for (Int_t i=0;i<nModules;i++) {
    HModGeomPar* mod=pPar->getModule(i);
    if (mod) {
      HGeomNode* node=pDet->getVolume(mod->GetName());
      if (node) {
        TString mo(node->getMother());
        if (!mo.Contains("CAVE")&&!mo.Contains("SEC")) node=pDet->getVolume(mo.Data());  
        HGeomTransform &modtr = mod->getLabTransform();
          
        node->setLabTransform(modtr);
        
        // Correction of MDCIV barrels lab position in according to the mdc alignment:
        if( detName.EqualTo("mdc") ) {
          TString modName(mod->GetName());
          if( modName.BeginsWith("DR4") ) {
            TString bar1name("FDB1");
            TString bar2name("FDB2");
            bar1name += modName[4];  // Sector
            bar2name += modName[4];  // Sector
            HGeomSet*  frames = (HGeomSet*)sets->At(kHGeomFrames);
            if( frames != NULL) {
              HGeomNode* bar1 = frames->getVolume(bar1name.Data());
              HGeomNode* bar2 = frames->getVolume(bar2name.Data());
              bar1->setLabTransform(modtr);
              bar2->setLabTransform(modtr);
            } else Error("addAlignment","No frames loaded!");
          } else if( modName.BeginsWith("DR1") || modName.BeginsWith("DR2")) {
            //  Adjust position of FD1S1...6, FD1R1...6, FD2S1...6, FD2R1...6 according to MDCI,II alignment:
            //  find shift of MDC frustum without overlap with MDC
            Int_t mdcpl = modName.BeginsWith("DR1") ? 0:1;
            
            HGeomVector zVect(0.,0.,1.);                   // direction of z-axis in the lab.system
            zVect = modtr.getRotMatrix().inverse()*zVect;  // rotation of zVect to MDC module coor.sys.
            Double_t A = zVect.getX()/zVect.getZ();
            Double_t B = zVect.getY()/zVect.getZ();
            HGeomVolume* cv = (HGeomVolume*)mod->getRefVolume();
            Double_t zMdc = cv->getPoint(0)->getZ();
            Double_t yMdc = cv->getPoint(0)->getY();
            
            HGeomSet*  frames = (HGeomSet*)sets->At(kHGeomFrames);
            TString FDSname(mdcpl==0 ? "FD1S":"FD2S");
            TString FDRname(mdcpl==0 ? "FD1R":"FD2R");
            FDSname += modName[4];  // Sector
            FDRname += modName[4];  // Sector
            HGeomNode* pFDS = frames->getVolume(FDSname.Data());
            
            Double_t phi  = pFDS->getPoint(1)->getX()*TMath::DegToRad();
            // Points was selected by knowing of MDC frustum volumes.
            // In the case of changing volumes need to be rechecked!
            HGeomVector *par1 = pFDS->getPoint(mdcpl==0 ? 5:4);  // 4
            HGeomVector *par2 = pFDS->getPoint(3);

            HGeomVector point[4];  // Coordinates of points (on frustum volume) which closest TO MDC
            point[0].setXYZ( par1->getZ()/TMath::Tan(phi), par1->getZ(), par1->getX());
            point[1].setXYZ(-par1->getZ()/TMath::Tan(phi), par1->getZ(), par1->getX());
            point[2].setXYZ( par2->getZ()/TMath::Tan(phi), par2->getZ(), par2->getX());
            point[3].setXYZ(-par2->getZ()/TMath::Tan(phi), par2->getZ(), par2->getX());
            for(Int_t p=0;p<4;p++) {
              // Calculate distance from point to the MDC in direction of zVect
              HGeomVector pnt(pFDS->getLabTransform()->transFrom(point[p]));
              pnt = modtr.transTo(pnt);
              Double_t shift = (zMdc-pnt.getZ())*TMath::Sqrt(A*A+B*B+1.);
              if(shift < shiftFDSR[mdcpl]) shiftFDSR[mdcpl] = shift;
            }
            
            
            HGeomNode* pFDR = frames->getVolume(FDRname.Data());
            HGeomVector pnt(0.,pFDR->getPoint(1)->getY(),pFDR->getPoint(2)->getZ());
            pnt = pFDR->getLabTransform()->transFrom(pnt);
            pnt = modtr.transTo(pnt);
            Double_t yCr = pnt.getY() + B*(zMdc-pnt.getZ());
            if(yCr < yMdc) continue;                         // No cross with MDC
            Double_t shift = (zMdc-pnt.getZ())*TMath::Sqrt(A*A+B*B+1.);
            if(shift < 0.) shift -= 0.010;  // -10 mkm for savety rison
            if(shift < shiftFDSR[mdcpl]) shiftFDSR[mdcpl] = shift;
          }
        }
      }
    }
  }
  
  cout<<"Alignment for "<<pPar->getDetectorName()<<" added"<<endl;
  
  if(shiftFDSR[0] < 999.) {
    if(shiftFDSR[0] < 0. || shiftFDSR[0] > 1.) {        // Ignore gap < 1. mm
      shiftNode6sect(kHGeomFrames,"FD1S",shiftFDSR[0]);
      shiftNode6sect(kHGeomFrames,"FD1R",shiftFDSR[0]);
    } else printf("*** FD1S,FD1R - MDCI gap (%f mm) is ignored\n",shiftFDSR[0]);
  }
  if(shiftFDSR[1] < 999.) {
    if(shiftFDSR[1] < 0. || shiftFDSR[1] > 1.) {       // Ignore gap < 1. mm
      shiftNode6sect(kHGeomFrames,"FD2S",shiftFDSR[1]);
      shiftNode6sect(kHGeomFrames,"FD2R",shiftFDSR[1]);
    } else  printf("*** FD2S,FD2R - MDCII gap (%f mm) is ignored\n",shiftFDSR[1]);
  }
  return kTRUE;
}

void HGeomInterface::adjustSecGeom(void) {
  HGeomSet* pRich  = (HGeomSet*)sets->At(kHGeomRich);
  HGeomSet* pSec   = (HGeomSet*)sets->At(kHGeomSect);
  HGeomSet* frames = (HGeomSet*)sets->At(kHGeomFrames);
  if (pRich==NULL || pSec==NULL || frames==NULL) {
    Error("adjustSecGeom","Sector, RICH or frames not found in GEANT geometry!");
    return;
  }
  HGeomNode*      node     = pRich->getVolume("RICH");
  HGeomTransform& t        = node->getTransform();
  Double_t        zRichEnd = t.getTransVector().getZ()+node->getPoint(4)->getX();
  Double_t        zSect    = pSec->getVolume("SEC1")->getPoint(5)->getX();
  Double_t        zShift   = zRichEnd-zSect;  // >0 - overlap
  
  if(zShift<=0. && zShift > -2.0) {        // Ignore gap < 2. mm
    if(zShift < 0.) printf("*** RICH - Sector gap (%f mm) is ignored\n", -zShift);
    return;
  }
  
  for(Int_t s=1;s<=6;s++) {
    TString secNm("SEC");
    secNm += s;
    HGeomVector *p0 = pSec->getVolume(secNm.Data())->getPoint(0);
    Int_t npnt = p0->getX()+1.1;
    for(Int_t ip=3;ip<=npnt;ip++) {    
      HGeomVector *p = pSec->getVolume(secNm.Data())->getPoint(ip);
      p->setX(p->getX()+zShift);
    }
  }
  shiftNode6sect(kHGeomFrames,"FIWL",zShift);
  shiftNode6sect(kHGeomFrames,"FOWL",zShift);
  shiftNode6sect(kHGeomFrames,"FINC",zShift);
  shiftNode6sect(kHGeomFrames,"FOUC",zShift);
  shiftNode(kHGeomFrames,"FINA",zShift);
  shiftNode(kHGeomFrames,"FIWR",zShift);
  shiftNode(kHGeomFrames,"FOTU",zShift);
  shiftNode(kHGeomFrames,"FTWL",zShift);
  shiftNode(kHGeomFrames,"FTWR",zShift);
  // Test veto:
  HGeomSet* start = (HGeomSet*)sets->At(kHGeomStart);
  if(start != NULL && start->getVolume("VVET") != NULL) {
    HGeomNode* pVVSH = frames->getVolume("VVSH");
    if(pVVSH != 0) shiftNode(kHGeomStart,"VVSH",zShift);
    else shiftNode6sect(kHGeomStart,"VSHS",zShift);
  }
}

void HGeomInterface::shiftNode6sect(Int_t set,const Char_t* name, Double_t zShift) {
  for(Int_t s=1;s<=6;s++) {
    TString nm(name);
    nm += s;
    shiftNode(set,nm.Data(),zShift);
  }
}

void HGeomInterface::shiftNode(Int_t set,const Char_t* name, Double_t zShift) {
  HGeomNode* pNode = ((HGeomSet*)sets->At(set))->getVolume(name);
  if(pNode == NULL) {
    printf("Volume %s is absent in the current setup\n",name);
    return;
  }
  HGeomTransform trNode = ((*(pNode->getLabTransform())));
  HGeomVector pos = trNode.getTransVector();
  pos.setZ(pos.getZ() + zShift);
  trNode.setTransVector(pos);
  pNode->setLabTransform(trNode);
  printf("Volume %s shifted by %f mm\n",name,zShift);
}

void HGeomInterface::print() {
  // Prints the media and the list of detector parts
  media->list();
  cout<<"********************************************************************\n";
  cout<<"List of detector parts:\n";
  HGeomSet* pSet=0;
  for(Int_t i=0;i<nSets;i++) {
    pSet=(HGeomSet*)sets->At(i);
    if (pSet) cout<<"  "<<pSet->GetName()<<":\t"<<pSet->getGeomFile()<<'\n';
  }
  cout<<"********************************************************************\n";
}

Bool_t HGeomInterface::readGeomConfig(const Char_t* configFile) {
  // Reads the GEANT configuration file
  Bool_t rc=kFALSE;
  HGeomIo* input=0;
  if (configFile) {
    input=connectInput(configFile);
    if (input) rc=input->readGeomConfig(this);
  }
  return rc;
}

Bool_t HGeomInterface::readSetupFile() {
  // Reads the detector setups, needed for create only subsets
  Bool_t rc=kTRUE;
  if (setupFile.Length()>0) {
    HGeomAsciiIo* input=(HGeomAsciiIo*)(connectInput(setupFile));
    if (input) rc=input->readDetectorSetup(this);
  }
  return rc;
}
 hgeominterface.cc:1
 hgeominterface.cc:2
 hgeominterface.cc:3
 hgeominterface.cc:4
 hgeominterface.cc:5
 hgeominterface.cc:6
 hgeominterface.cc:7
 hgeominterface.cc:8
 hgeominterface.cc:9
 hgeominterface.cc:10
 hgeominterface.cc:11
 hgeominterface.cc:12
 hgeominterface.cc:13
 hgeominterface.cc:14
 hgeominterface.cc:15
 hgeominterface.cc:16
 hgeominterface.cc:17
 hgeominterface.cc:18
 hgeominterface.cc:19
 hgeominterface.cc:20
 hgeominterface.cc:21
 hgeominterface.cc:22
 hgeominterface.cc:23
 hgeominterface.cc:24
 hgeominterface.cc:25
 hgeominterface.cc:26
 hgeominterface.cc:27
 hgeominterface.cc:28
 hgeominterface.cc:29
 hgeominterface.cc:30
 hgeominterface.cc:31
 hgeominterface.cc:32
 hgeominterface.cc:33
 hgeominterface.cc:34
 hgeominterface.cc:35
 hgeominterface.cc:36
 hgeominterface.cc:37
 hgeominterface.cc:38
 hgeominterface.cc:39
 hgeominterface.cc:40
 hgeominterface.cc:41
 hgeominterface.cc:42
 hgeominterface.cc:43
 hgeominterface.cc:44
 hgeominterface.cc:45
 hgeominterface.cc:46
 hgeominterface.cc:47
 hgeominterface.cc:48
 hgeominterface.cc:49
 hgeominterface.cc:50
 hgeominterface.cc:51
 hgeominterface.cc:52
 hgeominterface.cc:53
 hgeominterface.cc:54
 hgeominterface.cc:55
 hgeominterface.cc:56
 hgeominterface.cc:57
 hgeominterface.cc:58
 hgeominterface.cc:59
 hgeominterface.cc:60
 hgeominterface.cc:61
 hgeominterface.cc:62
 hgeominterface.cc:63
 hgeominterface.cc:64
 hgeominterface.cc:65
 hgeominterface.cc:66
 hgeominterface.cc:67
 hgeominterface.cc:68
 hgeominterface.cc:69
 hgeominterface.cc:70
 hgeominterface.cc:71
 hgeominterface.cc:72
 hgeominterface.cc:73
 hgeominterface.cc:74
 hgeominterface.cc:75
 hgeominterface.cc:76
 hgeominterface.cc:77
 hgeominterface.cc:78
 hgeominterface.cc:79
 hgeominterface.cc:80
 hgeominterface.cc:81
 hgeominterface.cc:82
 hgeominterface.cc:83
 hgeominterface.cc:84
 hgeominterface.cc:85
 hgeominterface.cc:86
 hgeominterface.cc:87
 hgeominterface.cc:88
 hgeominterface.cc:89
 hgeominterface.cc:90
 hgeominterface.cc:91
 hgeominterface.cc:92
 hgeominterface.cc:93
 hgeominterface.cc:94
 hgeominterface.cc:95
 hgeominterface.cc:96
 hgeominterface.cc:97
 hgeominterface.cc:98
 hgeominterface.cc:99
 hgeominterface.cc:100
 hgeominterface.cc:101
 hgeominterface.cc:102
 hgeominterface.cc:103
 hgeominterface.cc:104
 hgeominterface.cc:105
 hgeominterface.cc:106
 hgeominterface.cc:107
 hgeominterface.cc:108
 hgeominterface.cc:109
 hgeominterface.cc:110
 hgeominterface.cc:111
 hgeominterface.cc:112
 hgeominterface.cc:113
 hgeominterface.cc:114
 hgeominterface.cc:115
 hgeominterface.cc:116
 hgeominterface.cc:117
 hgeominterface.cc:118
 hgeominterface.cc:119
 hgeominterface.cc:120
 hgeominterface.cc:121
 hgeominterface.cc:122
 hgeominterface.cc:123
 hgeominterface.cc:124
 hgeominterface.cc:125
 hgeominterface.cc:126
 hgeominterface.cc:127
 hgeominterface.cc:128
 hgeominterface.cc:129
 hgeominterface.cc:130
 hgeominterface.cc:131
 hgeominterface.cc:132
 hgeominterface.cc:133
 hgeominterface.cc:134
 hgeominterface.cc:135
 hgeominterface.cc:136
 hgeominterface.cc:137
 hgeominterface.cc:138
 hgeominterface.cc:139
 hgeominterface.cc:140
 hgeominterface.cc:141
 hgeominterface.cc:142
 hgeominterface.cc:143
 hgeominterface.cc:144
 hgeominterface.cc:145
 hgeominterface.cc:146
 hgeominterface.cc:147
 hgeominterface.cc:148
 hgeominterface.cc:149
 hgeominterface.cc:150
 hgeominterface.cc:151
 hgeominterface.cc:152
 hgeominterface.cc:153
 hgeominterface.cc:154
 hgeominterface.cc:155
 hgeominterface.cc:156
 hgeominterface.cc:157
 hgeominterface.cc:158
 hgeominterface.cc:159
 hgeominterface.cc:160
 hgeominterface.cc:161
 hgeominterface.cc:162
 hgeominterface.cc:163
 hgeominterface.cc:164
 hgeominterface.cc:165
 hgeominterface.cc:166
 hgeominterface.cc:167
 hgeominterface.cc:168
 hgeominterface.cc:169
 hgeominterface.cc:170
 hgeominterface.cc:171
 hgeominterface.cc:172
 hgeominterface.cc:173
 hgeominterface.cc:174
 hgeominterface.cc:175
 hgeominterface.cc:176
 hgeominterface.cc:177
 hgeominterface.cc:178
 hgeominterface.cc:179
 hgeominterface.cc:180
 hgeominterface.cc:181
 hgeominterface.cc:182
 hgeominterface.cc:183
 hgeominterface.cc:184
 hgeominterface.cc:185
 hgeominterface.cc:186
 hgeominterface.cc:187
 hgeominterface.cc:188
 hgeominterface.cc:189
 hgeominterface.cc:190
 hgeominterface.cc:191
 hgeominterface.cc:192
 hgeominterface.cc:193
 hgeominterface.cc:194
 hgeominterface.cc:195
 hgeominterface.cc:196
 hgeominterface.cc:197
 hgeominterface.cc:198
 hgeominterface.cc:199
 hgeominterface.cc:200
 hgeominterface.cc:201
 hgeominterface.cc:202
 hgeominterface.cc:203
 hgeominterface.cc:204
 hgeominterface.cc:205
 hgeominterface.cc:206
 hgeominterface.cc:207
 hgeominterface.cc:208
 hgeominterface.cc:209
 hgeominterface.cc:210
 hgeominterface.cc:211
 hgeominterface.cc:212
 hgeominterface.cc:213
 hgeominterface.cc:214
 hgeominterface.cc:215
 hgeominterface.cc:216
 hgeominterface.cc:217
 hgeominterface.cc:218
 hgeominterface.cc:219
 hgeominterface.cc:220
 hgeominterface.cc:221
 hgeominterface.cc:222
 hgeominterface.cc:223
 hgeominterface.cc:224
 hgeominterface.cc:225
 hgeominterface.cc:226
 hgeominterface.cc:227
 hgeominterface.cc:228
 hgeominterface.cc:229
 hgeominterface.cc:230
 hgeominterface.cc:231
 hgeominterface.cc:232
 hgeominterface.cc:233
 hgeominterface.cc:234
 hgeominterface.cc:235
 hgeominterface.cc:236
 hgeominterface.cc:237
 hgeominterface.cc:238
 hgeominterface.cc:239
 hgeominterface.cc:240
 hgeominterface.cc:241
 hgeominterface.cc:242
 hgeominterface.cc:243
 hgeominterface.cc:244
 hgeominterface.cc:245
 hgeominterface.cc:246
 hgeominterface.cc:247
 hgeominterface.cc:248
 hgeominterface.cc:249
 hgeominterface.cc:250
 hgeominterface.cc:251
 hgeominterface.cc:252
 hgeominterface.cc:253
 hgeominterface.cc:254
 hgeominterface.cc:255
 hgeominterface.cc:256
 hgeominterface.cc:257
 hgeominterface.cc:258
 hgeominterface.cc:259
 hgeominterface.cc:260
 hgeominterface.cc:261
 hgeominterface.cc:262
 hgeominterface.cc:263
 hgeominterface.cc:264
 hgeominterface.cc:265
 hgeominterface.cc:266
 hgeominterface.cc:267
 hgeominterface.cc:268
 hgeominterface.cc:269
 hgeominterface.cc:270
 hgeominterface.cc:271
 hgeominterface.cc:272
 hgeominterface.cc:273
 hgeominterface.cc:274
 hgeominterface.cc:275
 hgeominterface.cc:276
 hgeominterface.cc:277
 hgeominterface.cc:278
 hgeominterface.cc:279
 hgeominterface.cc:280
 hgeominterface.cc:281
 hgeominterface.cc:282
 hgeominterface.cc:283
 hgeominterface.cc:284
 hgeominterface.cc:285
 hgeominterface.cc:286
 hgeominterface.cc:287
 hgeominterface.cc:288
 hgeominterface.cc:289
 hgeominterface.cc:290
 hgeominterface.cc:291
 hgeominterface.cc:292
 hgeominterface.cc:293
 hgeominterface.cc:294
 hgeominterface.cc:295
 hgeominterface.cc:296
 hgeominterface.cc:297
 hgeominterface.cc:298
 hgeominterface.cc:299
 hgeominterface.cc:300
 hgeominterface.cc:301
 hgeominterface.cc:302
 hgeominterface.cc:303
 hgeominterface.cc:304
 hgeominterface.cc:305
 hgeominterface.cc:306
 hgeominterface.cc:307
 hgeominterface.cc:308
 hgeominterface.cc:309
 hgeominterface.cc:310
 hgeominterface.cc:311
 hgeominterface.cc:312
 hgeominterface.cc:313
 hgeominterface.cc:314
 hgeominterface.cc:315
 hgeominterface.cc:316
 hgeominterface.cc:317
 hgeominterface.cc:318
 hgeominterface.cc:319
 hgeominterface.cc:320
 hgeominterface.cc:321
 hgeominterface.cc:322
 hgeominterface.cc:323
 hgeominterface.cc:324
 hgeominterface.cc:325
 hgeominterface.cc:326
 hgeominterface.cc:327
 hgeominterface.cc:328
 hgeominterface.cc:329
 hgeominterface.cc:330
 hgeominterface.cc:331
 hgeominterface.cc:332
 hgeominterface.cc:333
 hgeominterface.cc:334
 hgeominterface.cc:335
 hgeominterface.cc:336
 hgeominterface.cc:337
 hgeominterface.cc:338
 hgeominterface.cc:339
 hgeominterface.cc:340
 hgeominterface.cc:341
 hgeominterface.cc:342
 hgeominterface.cc:343
 hgeominterface.cc:344
 hgeominterface.cc:345
 hgeominterface.cc:346
 hgeominterface.cc:347
 hgeominterface.cc:348
 hgeominterface.cc:349
 hgeominterface.cc:350
 hgeominterface.cc:351
 hgeominterface.cc:352
 hgeominterface.cc:353
 hgeominterface.cc:354
 hgeominterface.cc:355
 hgeominterface.cc:356
 hgeominterface.cc:357
 hgeominterface.cc:358
 hgeominterface.cc:359
 hgeominterface.cc:360
 hgeominterface.cc:361
 hgeominterface.cc:362
 hgeominterface.cc:363
 hgeominterface.cc:364
 hgeominterface.cc:365
 hgeominterface.cc:366
 hgeominterface.cc:367
 hgeominterface.cc:368
 hgeominterface.cc:369
 hgeominterface.cc:370
 hgeominterface.cc:371
 hgeominterface.cc:372
 hgeominterface.cc:373
 hgeominterface.cc:374
 hgeominterface.cc:375
 hgeominterface.cc:376
 hgeominterface.cc:377
 hgeominterface.cc:378
 hgeominterface.cc:379
 hgeominterface.cc:380
 hgeominterface.cc:381
 hgeominterface.cc:382
 hgeominterface.cc:383
 hgeominterface.cc:384
 hgeominterface.cc:385
 hgeominterface.cc:386
 hgeominterface.cc:387
 hgeominterface.cc:388
 hgeominterface.cc:389
 hgeominterface.cc:390
 hgeominterface.cc:391
 hgeominterface.cc:392
 hgeominterface.cc:393
 hgeominterface.cc:394
 hgeominterface.cc:395
 hgeominterface.cc:396
 hgeominterface.cc:397
 hgeominterface.cc:398
 hgeominterface.cc:399
 hgeominterface.cc:400
 hgeominterface.cc:401
 hgeominterface.cc:402
 hgeominterface.cc:403
 hgeominterface.cc:404
 hgeominterface.cc:405
 hgeominterface.cc:406
 hgeominterface.cc:407
 hgeominterface.cc:408
 hgeominterface.cc:409
 hgeominterface.cc:410
 hgeominterface.cc:411
 hgeominterface.cc:412
 hgeominterface.cc:413
 hgeominterface.cc:414
 hgeominterface.cc:415
 hgeominterface.cc:416
 hgeominterface.cc:417
 hgeominterface.cc:418
 hgeominterface.cc:419
 hgeominterface.cc:420
 hgeominterface.cc:421
 hgeominterface.cc:422
 hgeominterface.cc:423
 hgeominterface.cc:424
 hgeominterface.cc:425
 hgeominterface.cc:426
 hgeominterface.cc:427
 hgeominterface.cc:428
 hgeominterface.cc:429
 hgeominterface.cc:430
 hgeominterface.cc:431
 hgeominterface.cc:432
 hgeominterface.cc:433
 hgeominterface.cc:434
 hgeominterface.cc:435
 hgeominterface.cc:436
 hgeominterface.cc:437
 hgeominterface.cc:438
 hgeominterface.cc:439
 hgeominterface.cc:440
 hgeominterface.cc:441
 hgeominterface.cc:442
 hgeominterface.cc:443
 hgeominterface.cc:444
 hgeominterface.cc:445
 hgeominterface.cc:446
 hgeominterface.cc:447
 hgeominterface.cc:448
 hgeominterface.cc:449
 hgeominterface.cc:450
 hgeominterface.cc:451
 hgeominterface.cc:452
 hgeominterface.cc:453
 hgeominterface.cc:454
 hgeominterface.cc:455
 hgeominterface.cc:456
 hgeominterface.cc:457
 hgeominterface.cc:458
 hgeominterface.cc:459
 hgeominterface.cc:460
 hgeominterface.cc:461
 hgeominterface.cc:462
 hgeominterface.cc:463
 hgeominterface.cc:464
 hgeominterface.cc:465
 hgeominterface.cc:466
 hgeominterface.cc:467
 hgeominterface.cc:468
 hgeominterface.cc:469
 hgeominterface.cc:470
 hgeominterface.cc:471
 hgeominterface.cc:472
 hgeominterface.cc:473
 hgeominterface.cc:474
 hgeominterface.cc:475
 hgeominterface.cc:476
 hgeominterface.cc:477
 hgeominterface.cc:478
 hgeominterface.cc:479
 hgeominterface.cc:480
 hgeominterface.cc:481
 hgeominterface.cc:482
 hgeominterface.cc:483
 hgeominterface.cc:484
 hgeominterface.cc:485
 hgeominterface.cc:486
 hgeominterface.cc:487
 hgeominterface.cc:488
 hgeominterface.cc:489
 hgeominterface.cc:490
 hgeominterface.cc:491
 hgeominterface.cc:492
 hgeominterface.cc:493
 hgeominterface.cc:494
 hgeominterface.cc:495
 hgeominterface.cc:496
 hgeominterface.cc:497
 hgeominterface.cc:498
 hgeominterface.cc:499
 hgeominterface.cc:500
 hgeominterface.cc:501
 hgeominterface.cc:502
 hgeominterface.cc:503
 hgeominterface.cc:504
 hgeominterface.cc:505
 hgeominterface.cc:506
 hgeominterface.cc:507
 hgeominterface.cc:508
 hgeominterface.cc:509
 hgeominterface.cc:510
 hgeominterface.cc:511
 hgeominterface.cc:512
 hgeominterface.cc:513
 hgeominterface.cc:514
 hgeominterface.cc:515
 hgeominterface.cc:516
 hgeominterface.cc:517
 hgeominterface.cc:518
 hgeominterface.cc:519
 hgeominterface.cc:520
 hgeominterface.cc:521
 hgeominterface.cc:522
 hgeominterface.cc:523
 hgeominterface.cc:524
 hgeominterface.cc:525
 hgeominterface.cc:526
 hgeominterface.cc:527
 hgeominterface.cc:528
 hgeominterface.cc:529
 hgeominterface.cc:530
 hgeominterface.cc:531
 hgeominterface.cc:532
 hgeominterface.cc:533
 hgeominterface.cc:534
 hgeominterface.cc:535
 hgeominterface.cc:536
 hgeominterface.cc:537
 hgeominterface.cc:538
 hgeominterface.cc:539
 hgeominterface.cc:540
 hgeominterface.cc:541
 hgeominterface.cc:542
 hgeominterface.cc:543
 hgeominterface.cc:544
 hgeominterface.cc:545
 hgeominterface.cc:546
 hgeominterface.cc:547
 hgeominterface.cc:548
 hgeominterface.cc:549
 hgeominterface.cc:550
 hgeominterface.cc:551
 hgeominterface.cc:552
 hgeominterface.cc:553
 hgeominterface.cc:554
 hgeominterface.cc:555
 hgeominterface.cc:556
 hgeominterface.cc:557
 hgeominterface.cc:558
 hgeominterface.cc:559
 hgeominterface.cc:560
 hgeominterface.cc:561
 hgeominterface.cc:562
 hgeominterface.cc:563
 hgeominterface.cc:564
 hgeominterface.cc:565
 hgeominterface.cc:566
 hgeominterface.cc:567
 hgeominterface.cc:568
 hgeominterface.cc:569
 hgeominterface.cc:570
 hgeominterface.cc:571
 hgeominterface.cc:572
 hgeominterface.cc:573
 hgeominterface.cc:574
 hgeominterface.cc:575
 hgeominterface.cc:576
 hgeominterface.cc:577
 hgeominterface.cc:578
 hgeominterface.cc:579
 hgeominterface.cc:580
 hgeominterface.cc:581
 hgeominterface.cc:582
 hgeominterface.cc:583
 hgeominterface.cc:584
 hgeominterface.cc:585
 hgeominterface.cc:586
 hgeominterface.cc:587
 hgeominterface.cc:588
 hgeominterface.cc:589
 hgeominterface.cc:590
 hgeominterface.cc:591
 hgeominterface.cc:592
 hgeominterface.cc:593
 hgeominterface.cc:594
 hgeominterface.cc:595
 hgeominterface.cc:596
 hgeominterface.cc:597
 hgeominterface.cc:598
 hgeominterface.cc:599
 hgeominterface.cc:600
 hgeominterface.cc:601
 hgeominterface.cc:602
 hgeominterface.cc:603
 hgeominterface.cc:604
 hgeominterface.cc:605
 hgeominterface.cc:606
 hgeominterface.cc:607
 hgeominterface.cc:608
 hgeominterface.cc:609
 hgeominterface.cc:610
 hgeominterface.cc:611
 hgeominterface.cc:612
 hgeominterface.cc:613
 hgeominterface.cc:614
 hgeominterface.cc:615
 hgeominterface.cc:616
 hgeominterface.cc:617
 hgeominterface.cc:618
 hgeominterface.cc:619
 hgeominterface.cc:620
 hgeominterface.cc:621
 hgeominterface.cc:622
 hgeominterface.cc:623
 hgeominterface.cc:624
 hgeominterface.cc:625
 hgeominterface.cc:626
 hgeominterface.cc:627
 hgeominterface.cc:628
 hgeominterface.cc:629
 hgeominterface.cc:630
 hgeominterface.cc:631
 hgeominterface.cc:632
 hgeominterface.cc:633
 hgeominterface.cc:634
 hgeominterface.cc:635
 hgeominterface.cc:636
 hgeominterface.cc:637
 hgeominterface.cc:638
 hgeominterface.cc:639
 hgeominterface.cc:640
 hgeominterface.cc:641
 hgeominterface.cc:642
 hgeominterface.cc:643
 hgeominterface.cc:644
 hgeominterface.cc:645
 hgeominterface.cc:646
 hgeominterface.cc:647
 hgeominterface.cc:648
 hgeominterface.cc:649
 hgeominterface.cc:650
 hgeominterface.cc:651
 hgeominterface.cc:652
 hgeominterface.cc:653
 hgeominterface.cc:654
 hgeominterface.cc:655
 hgeominterface.cc:656
 hgeominterface.cc:657
 hgeominterface.cc:658
 hgeominterface.cc:659
 hgeominterface.cc:660
 hgeominterface.cc:661
 hgeominterface.cc:662
 hgeominterface.cc:663
 hgeominterface.cc:664
 hgeominterface.cc:665
 hgeominterface.cc:666
 hgeominterface.cc:667
 hgeominterface.cc:668
 hgeominterface.cc:669
 hgeominterface.cc:670
 hgeominterface.cc:671
 hgeominterface.cc:672
 hgeominterface.cc:673
 hgeominterface.cc:674
 hgeominterface.cc:675
 hgeominterface.cc:676
 hgeominterface.cc:677
 hgeominterface.cc:678
 hgeominterface.cc:679
 hgeominterface.cc:680
 hgeominterface.cc:681
 hgeominterface.cc:682
 hgeominterface.cc:683
 hgeominterface.cc:684
 hgeominterface.cc:685
 hgeominterface.cc:686
 hgeominterface.cc:687
 hgeominterface.cc:688
 hgeominterface.cc:689
 hgeominterface.cc:690
 hgeominterface.cc:691
 hgeominterface.cc:692
 hgeominterface.cc:693
 hgeominterface.cc:694
 hgeominterface.cc:695
 hgeominterface.cc:696
 hgeominterface.cc:697
 hgeominterface.cc:698
 hgeominterface.cc:699
 hgeominterface.cc:700
 hgeominterface.cc:701
 hgeominterface.cc:702
 hgeominterface.cc:703
 hgeominterface.cc:704
 hgeominterface.cc:705
 hgeominterface.cc:706
 hgeominterface.cc:707
 hgeominterface.cc:708
 hgeominterface.cc:709
 hgeominterface.cc:710
 hgeominterface.cc:711
 hgeominterface.cc:712
 hgeominterface.cc:713
 hgeominterface.cc:714
 hgeominterface.cc:715
 hgeominterface.cc:716
 hgeominterface.cc:717
 hgeominterface.cc:718
 hgeominterface.cc:719
 hgeominterface.cc:720
 hgeominterface.cc:721
 hgeominterface.cc:722
 hgeominterface.cc:723
 hgeominterface.cc:724
 hgeominterface.cc:725
 hgeominterface.cc:726
 hgeominterface.cc:727
 hgeominterface.cc:728
 hgeominterface.cc:729
 hgeominterface.cc:730
 hgeominterface.cc:731
 hgeominterface.cc:732
 hgeominterface.cc:733
 hgeominterface.cc:734
 hgeominterface.cc:735
 hgeominterface.cc:736
 hgeominterface.cc:737
 hgeominterface.cc:738
 hgeominterface.cc:739
 hgeominterface.cc:740
 hgeominterface.cc:741
 hgeominterface.cc:742
 hgeominterface.cc:743
 hgeominterface.cc:744
 hgeominterface.cc:745
 hgeominterface.cc:746
 hgeominterface.cc:747
 hgeominterface.cc:748
 hgeominterface.cc:749
 hgeominterface.cc:750
 hgeominterface.cc:751
 hgeominterface.cc:752
 hgeominterface.cc:753
 hgeominterface.cc:754
 hgeominterface.cc:755
 hgeominterface.cc:756
 hgeominterface.cc:757
 hgeominterface.cc:758
 hgeominterface.cc:759
 hgeominterface.cc:760
 hgeominterface.cc:761