ROOT logo
//*--- AUTHOR : Pechenov Vladimir
//*--- Modified: 12.02.08 V.Pechenov
//*--- Modified: 26.11.07 V.Pechenov
//*--- Modified: 16.08.05 V.Pechenov
//*--- Modified: 07.05.02 V.Pechenov
//*--- Modified: 25.02.99

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////////////
//
// HMdcPointPlane - poin on the plane
// HMdcTrap - trapeze in vol. is used for mdc cell sensitive volume
// HMdcTrapPlane - polygon on the plane is used for cell projection calculation
// HMdcPlane - param. of project planes
//
// HMdcPointOnPlane 
//
//     This class keep point on the plane HMdcPlane
//
// HMdcLineParam
//
//     This class keep straight line parameters.
//     Parameters are two point on the two planes
//     (two HMdcPointOnPlane objects).
//
///////////////////////////////////////////////////////////////////////////////
using namespace std;
#include "hmdcgeomobj.h"
//#include <iostream> 
//#include <iomanip>

ClassImp(HMdcPointPlane)
ClassImp(HMdcTrap)
ClassImp(HMdcTrapPlane)
ClassImp(HMdcPlane)
ClassImp(HMdcPointOnPlane)
ClassImp(HMdcLineParam)

void HMdcPointPlane::print() const {
  printf("x=%7f y=%7f\n",x,y);
}

//-----------------------------------------------------
HMdcTrap::HMdcTrap(const HMdcTrap& otrap):TObject(otrap) {
  // constructor creates the copy of obj. Trap
  for(Int_t i=0; i<8; i++) points[i] = otrap.points[i];
  dbPoint = otrap.dbPoint;
}

HGeomVector& HMdcTrap::operator[](Int_t i) {
  if(i<0 || i>7) {
    Error("operator[]","index=%i out of bounds! Set index=0", i);
    return points[0];
  }
  return points[i];
}

void HMdcTrap::copy(HMdcTrap& otrap) const {
  // copy obj "this" to otarp
  for(Int_t i=0; i<8; i++) otrap.points[i]=points[i];
  otrap.dbPoint = dbPoint;
}

void HMdcTrap::set(const HMdcTrap& otrap) {
  // copy obj "this" to otrap
  for(Int_t i=0; i<8; i++) points[i]=otrap.points[i];
  dbPoint = otrap.dbPoint;
}

void HMdcTrap::clear() {
  // copy obj "this" to otrap
  for(Int_t i=0; i<8; i++) points[i].clear();
  dbPoint = -1;
}

void HMdcTrap::transFrom(const HGeomTransform &s) {
  for(Int_t i=0; i<8; i++) points[i]=s.transFrom(points[i]);
}

void HMdcTrap::transTo(const HGeomTransform &s) {
  for(Int_t i=0; i<8; i++) points[i]=s.transTo(points[i]);
}

Bool_t HMdcTrap::getRibInd(Int_t rib,Int_t& ind1,Int_t& ind2) {
  if(rib<0 || rib>11) return kFALSE;
  if(rib < 4) {
    if(dbPoint>=0 && rib==dbPoint) return kFALSE;
    ind1 = rib;
    ind2 = nextPoint(ind1);
    if(ind2 == dbPoint) ind2 = nextPoint(ind2);
  } else if(rib < 8) {
    if(dbPoint>=0 && rib==dbPoint+4) return kFALSE;
    ind1 = rib;
    ind2 = nextPoint(ind1);
    if(ind2 == dbPoint+4) ind2 = nextPoint(ind2);
  } else {
    if(dbPoint>=0 && rib==dbPoint+8) return kFALSE;
    ind1 = rib-8;
    ind2 = ind1+4;
  }
  return kTRUE;
}

Bool_t HMdcTrap::getRibInXYContour(Int_t rib,Int_t& i,Int_t& j) {
  // For rib in X-Y contour all others points must be from one size of rib
  if(!getRibInd(rib,i,j)) return kFALSE;
  Double_t x2 = points[j].getX();
  Double_t y2 = points[j].getY();
  Double_t dX = points[i].getX()-x2;
  Double_t dY = points[i].getY()-y2;
  if(fabs(dX) > fabs(dY)) {
    if(dX == 0.) return kFALSE;
    Double_t coeff = dY/dX;
    Short_t fl = 0;
    for(Int_t k=0;k<8;k++) if(k!=i && k!=j) {
      // For all k  Yk-Yrib(Xk) must have the same sign
      Double_t yt = (points[k].getX()-x2)*coeff + y2 - points[k].getY();
      if(yt > 0.0)      fl |= 1;
      else if(yt < 0.0) fl |= 2;
      if(fl==3) return kFALSE;
    }
  } else {
    if(dY == 0.) return kFALSE;
    Double_t coeff = dX/dY;
    Short_t fl = 0;
    for(Int_t k=0;k<8;k++) if(k!=i && k!=j) {
      Double_t xt = (points[k].getY()-y2)*coeff + x2 - points[k].getX();
      if(xt > 0.0)      fl |= 1;
      else if(xt < 0.0) fl |= 2;
      if(fl==3) return kFALSE;
    }
  }
  return kTRUE;
}

Int_t HMdcTrap::getXYContour(HMdcTrapPlane& tr) {
  // Return number of lines(corners) in contour on XY plane
  // and fill "tr" object by contour points.
  Int_t p1[12],p2[12];
  Int_t nRibs = 0;
  Int_t i,j;
  for(Int_t rib=0;rib<12;rib++) if(getRibInXYContour(rib,i,j)) {
    p1[nRibs] = i;
    p2[nRibs] = j;
    nRibs++;
  }
  tr.clearNPoints();
  Int_t pnt0  = p1[0];
  Int_t pnt   = p2[0];
  tr.addPoint(points[pnt0]);
  tr.addPoint(points[pnt]);
  Int_t nPOut = 2;
  for(Int_t nr=1;nr<nRibs;nr++) if(p1[nr]>=0) {
    if     (p1[nr] == pnt) pnt = p2[nr];
    else if(p2[nr] == pnt) pnt = p1[nr];
    else continue;
    if(pnt == pnt0) break;
    tr.addPoint(points[pnt]);
    nPOut++;
    p1[nr] = -1;
    nr = 0;
  }
  tr.calcDir();
  return nPOut;
}

void HMdcTrap::print() {
  // print Trap;
  printf("\nTrap. from 8 points:\n");
  for(Int_t i=0; i<8; i++) {
    printf("%2i) ",i);
    points[i].print();
  }
}

//------------------------------------------------------
HMdcTrapPlane::HMdcTrapPlane(const HMdcTrapPlane& otrap):TObject(otrap) {
  // constructor creates the copy of obj. Trap
  nPoints   = otrap.nPoints;
  xMinPoint = otrap.xMinPoint;
  xMaxPoint = otrap.xMaxPoint;
  yMinPoint = otrap.yMinPoint;
  yMaxPoint = otrap.yMaxPoint;
  dir       = otrap.dir;
  for(Int_t i=0; i<nPoints; i++) points[i].set(otrap.points[i]);
}

HMdcPointPlane& HMdcTrapPlane:: operator[](Int_t i) {
  if(i<0 || i>=nPoints) {
    Error("operator[]","index=%i out of bounds! Set index=0", i);
    return points[0];
  }
  return points[i];
}

void HMdcTrapPlane::copy(HMdcTrapPlane& otrap) {
  // copy obj "this" to otarp
  otrap.nPoints   = nPoints;
  otrap.xMinPoint = xMinPoint;
  otrap.xMaxPoint = xMaxPoint;
  otrap.yMinPoint = yMinPoint;
  otrap.yMaxPoint = yMaxPoint;
  otrap.dir       = dir;
  for(Int_t i=0; i<nPoints; i++) points[i].copy(otrap.points[i]);
}

void HMdcTrapPlane::set(const HMdcTrapPlane& otrap) {
  // copy obj "this" to otrap
  nPoints   = otrap.nPoints;
  xMinPoint = otrap.xMinPoint;
  xMaxPoint = otrap.xMaxPoint;
  yMinPoint = otrap.yMinPoint;
  yMaxPoint = otrap.yMaxPoint;
  dir       = otrap.dir;
  for(Int_t i=0; i<nPoints; i++) points[i].set(otrap.points[i]);
}

void HMdcTrapPlane::clear() {
  xMinPoint = 0;
  xMaxPoint = 0;
  yMinPoint = 0;
  yMaxPoint = 0;
  dir       = 0;
  for(Int_t i=0; i<nPoints; i++) points[i].clear();
}

void HMdcTrapPlane::clearNPoints(void)  {
  nPoints   = 0;
  xMinPoint = 0;
  xMaxPoint = 0;
  yMinPoint = 0;
  yMaxPoint = 0;
  dir       = 0;
}


void HMdcTrapPlane::print() const {
  // print Trap;
  printf("\nPolygon on the plane from %i points:\n",nPoints);
  for(Int_t i=0; i<nPoints; i++) {
    printf("%2i) ",i);
    points[i].print();
  }
}

void HMdcTrapPlane::addPoint(const HGeomVector& v) {
  if(nPoints<16) {
    points[nPoints].set(v.getX(),v.getY());
    if(nPoints>0) {
      if(points[yMinPoint].getY() > v.getY()) yMinPoint = nPoints;
      if(points[yMaxPoint].getY() < v.getY()) yMaxPoint = nPoints;
      if(points[xMinPoint].getX() > v.getX()) xMinPoint = nPoints;
      if(points[xMaxPoint].getX() < v.getX()) xMaxPoint = nPoints;
    }
    nPoints++;
  } else Error("addPoint","Too many points (>16).");
}

void HMdcTrapPlane::addPoint(const HMdcPointPlane& p) {
  if(nPoints<16) {
    points[nPoints].set(p);
    if(nPoints>0) {
      if(points[yMinPoint].getY() > p.getY()) yMinPoint = nPoints;
      if(points[yMaxPoint].getY() < p.getY()) yMaxPoint = nPoints;
      if(points[xMinPoint].getX() > p.getX()) xMinPoint = nPoints;
      if(points[xMaxPoint].getX() < p.getX()) xMaxPoint = nPoints;
    }
    nPoints++;
  } else Error("addPoint","Too many points (>16).");
}

void HMdcTrapPlane::calcDir(void) {
  if(nPoints<3) dir = 0;
  else {
    Int_t p1 = prevP(yMinPoint);
    Int_t p2 = nextP(yMinPoint);
    Double_t y1 = points[p1].getY();
    Double_t y2 = points[p2].getY();
    Double_t x1 = points[p1].getX();
    Double_t x2 = points[p2].getX();
    if(y1<y2)      x2 = calcX(yMinPoint,p2,y1);
    else if(y1>y2) x1 = calcX(yMinPoint,p1,y2);
    dir = x1 < x2 ? 1 : -1;
  }
}

void HMdcTrapPlane::getXYMinMax(Int_t& xMin,Int_t& xMax,
                                Int_t& yMin,Int_t& yMax) const {
  // Return points number of maximal and minimal value of X and Y.
  xMin = yMin = 0;
  xMax = yMax = 0;
  for(Int_t p=1;p<nPoints;p++) {
    if(points[yMin].getY() > points[p].getY()) yMin = p;
    if(points[yMax].getY() < points[p].getY()) yMax = p;
    if(points[xMin].getX() > points[p].getX()) xMin = p;
    if(points[xMax].getX() < points[p].getX()) xMax = p;
  }
}

Int_t HMdcTrapPlane::twoContoursSum(const HMdcTrapPlane& c1i,
                                    const HMdcTrapPlane& c2i) {
  // Function combine two countours in one
  clearNPoints();
  Bool_t c1imin = c1i.getYMin() < c2i.getYMin();
  const HMdcTrapPlane& c1 = c1imin ? c1i : c2i;
  const HMdcTrapPlane& c2 = c1imin ? c2i : c1i;
  for(Int_t p=c1.yMinPoint;p!=c1.xMaxPoint;p=c1.nextXMaxP(p)) addPoint(c1.points[p]);
  addPoint(c1.points[c1.xMaxPoint]);  
  for(Int_t p=c2.xMaxPoint;p!=c2.xMinPoint;p=c2.nextXMaxP(p)) addPoint(c2.points[p]);
  addPoint(c2.points[c2.xMinPoint]);
  for(Int_t p=c1.xMinPoint;p!=c1.yMinPoint;p=c1.prevXMinP(p)) addPoint(c1.points[p]);
  calcDir(); 
  return nPoints;
}

Bool_t HMdcTrapPlane::getLineInd(Int_t line, Int_t& p1,Int_t& p2) const {
  // Return points indices for line number "line".
  if(line>=nPoints) return kFALSE;
  p1 = line;
  p2 = p1+1;
  if(p2 == nPoints) p2 = 0;
  return kTRUE;
}

Bool_t HMdcTrapPlane::getXCross(Int_t line,Double_t y, Double_t& x) const {
  // Function calculate X for Y="y" on the piece of line number "line".
  // Return kFALSE if it don't cross this line piece.
  Int_t ip1,ip2;
  if( !getLineInd(line,ip1,ip2) ) return kFALSE;       // no line number "line"
  const HMdcPointPlane& p1 = points[ip1];
  const HMdcPointPlane& p2 = points[ip2];
  Double_t y1 = p1.getY();
  Double_t y2 = p2.getY();
  if((y<y1 && y<y2) || (y>y1 && y>y2)) return kFALSE;  // no cross point
  x = (y-y1)/(y1-y2)*(p1.getX()-p2.getX()) + p1.getX();
  return kTRUE;
}

Double_t HMdcTrapPlane::calcX(Int_t ip1,Int_t ip2,Double_t y) const {
  // Function calculate X for Y="y" on the piece of line p1-p2.
  const HMdcPointPlane& p1 = points[ip1];
  const HMdcPointPlane& p2 = points[ip2];
  Double_t y1 = p1.getY();
  Double_t y2 = p2.getY();
  Double_t x1 = p1.getX();
  Double_t x2 = p2.getX();
  return (y-y1)/(y1-y2)*(x1-x2) + x1;
}

Bool_t HMdcTrapPlane::getXminXmax(Double_t y, Double_t& x1,Double_t& x2) {
  // Function calculate X for Y="y" on the piece of line number "line".
  // Return kFALSE if it don't cross this line piece.
  if(y>points[yMaxPoint].getY() || y<points[yMinPoint].getY()) return kFALSE;
  if(dir == 0) calcDir();
  
  Int_t p1,p2;
  for(p2 = nextXMinP(p1=yMinPoint); p2!=yMaxPoint; p2=nextXMinP(p1=p2))
                                               if(y < points[p2].getY()) break;
  x1 = calcX(p1,p2,y);
  for(p2 = nextXMaxP(p1=yMinPoint); p2!=yMaxPoint; p2=nextXMaxP(p1=p2))
                                               if(y < points[p2].getY()) break;
  x2 = calcX(p1,p2,y);
  return kTRUE;
}

Bool_t HMdcTrapPlane::getXminXmax(Double_t y1i,Double_t y2i,
                                  Double_t& x1,Double_t& x2) {
  // Function calculate X minimal (x1) and X maximal (x2) 
  // in Y reagion from y1i to y2i.
  // Return kFALSE if Y region outside of polygon.
  if(dir == 0) calcDir();
  Double_t& y1 = y1i < y2i ? y1i : y2i;
  Double_t& y2 = y1i < y2i ? y2i : y1i;
  if(y1>points[yMaxPoint].getY() || y2<points[yMinPoint].getY()) return kFALSE;
  if(y1 <= points[yMinPoint].getY() && y2 >= points[yMaxPoint].getY()) {
    // Full projection inside region y1 - y2
    x1 = points[xMinPoint].getX();
    x2 = points[xMaxPoint].getX();
    return kTRUE;
  }
    
  if(y2 > points[yMaxPoint].getY()) x1 = x2 = points[yMaxPoint].getX();
  else {
    x1 = +1.0e+20;
    x2 = -1.0e+20;
  }
  // Finding of x1:
  Int_t p1 = yMinPoint;
  for(Int_t p2 = nextXMinP(p1); p1!=yMaxPoint; p2=nextXMinP(p1=p2)) {
    Double_t yp2 = points[p2].getY();
    if(y1 > yp2) continue;
    Double_t yp1 = points[p1].getY();
    if(y1 >= yp1) x1 = TMath::Min(x1,calcX(p1,p2,y1));
    else if(yp1<=y2 && x1>points[p1].getX()) x1 = points[p1].getX();      
    if(y2 > yp2) continue;
    if(y2 >= yp1) x1 = TMath::Min(x1,calcX(p1,p2,y2));
    break;
  }
  // Finding of x2:
  p1  = yMinPoint;
  for(Int_t p2 = nextXMaxP(p1); p1!=yMaxPoint; p2=nextXMaxP(p1=p2)) {
    Double_t yp2 = points[p2].getY();
    if(y1 > yp2) continue;
    Double_t yp1 = points[p1].getY();
    if(y1 >= yp1) x2 = TMath::Max(x2,calcX(p1,p2,y1));
    else if(yp1<=y2 && x2<points[p1].getX()) x2 = points[p1].getX();
    if(y2 > yp2) continue;
    if(y2 >= yp1) x2 = TMath::Max(x2,calcX(p1,p2,y2));
    break;
  }
  return kTRUE;
}
 
//-----------------------------------------------------
void HMdcPlane::setPlanePar(const HGeomTransform& tr) { 
  const HGeomRotation& rt = tr.getRotMatrix();
  const HGeomVector&   tv = tr.getTransVector();
  Double_t c = rt(0)*rt(4)-rt(3)*rt(1);
  if(c == 0.) return;
  parA = (rt(3)*rt(7)-rt(6)*rt(4))/c;
  parB = (rt(6)*rt(1)-rt(0)*rt(7))/c;
  parD = parA*tv.getX()+parB*tv.getY()+tv.getZ();
}

void HMdcPlane::print(void) const {
  printf("Plane equation: %g*x%+g*y+z=%g\n",parA,parB,parD);
}

void HMdcPlane::transTo(const HGeomTransform* trans) {
  HGeomVector p1(  0.,   0.,                parD); // x=0; y= 0; z=D;
  HGeomVector p2(parD, parD, parD*(1.-parA-parB)); // x=D; y= D; z=D*(1-A-B);
  HGeomVector p3(parD,-parD, parD*(1.-parA+parB)); // x=D; y=-D; z=D*(1-A+B);
  p1 = trans->transTo(p1);
  p2 = trans->transTo(p2);
  p3 = trans->transTo(p3);
  HGeomVector p12(p1-p2);
  HGeomVector p13(p1-p3);
  parB = (p12.Z()*p13.X()-p13.Z()*p12.X())/(p13.Y()*p12.X()-p12.Y()*p13.X());
  if(p12.X() != 0.) parA = -(parB*p12.Y() + p12.Z())/p12.X();
  else              parA = -(parB*p13.Y() + p13.Z())/p13.X();
  parD = parA*p1.X() + parB*p1.Y() + p1.Z();
}

void HMdcPlane::transFrom(const HGeomTransform* trans) {
  HGeomVector p1(  0.,   0.,                parD); // x=0; y= 0; z=D;
  HGeomVector p2(parD, parD, parD*(1.-parA-parB)); // x=D; y= D; z=D*(1-A-B);
  HGeomVector p3(parD,-parD, parD*(1.-parA+parB)); // x=D; y=-D; z=D*(1-A+B);
  p1 = trans->transFrom(p1);
  p2 = trans->transFrom(p2);
  p3 = trans->transFrom(p3);
  HGeomVector p12(p1-p2);
  HGeomVector p13(p1-p3);
  parB = (p12.Z()*p13.X()-p13.Z()*p12.X())/(p13.Y()*p12.X()-p12.Y()*p13.X());
  if(p12.X() != 0.) parA = -(parB*p12.Y() + p12.Z())/p12.X();
  else              parA = -(parB*p13.Y() + p13.Z())/p13.X();
  parD = parA*p1.X() + parB*p1.Y() + p1.Z();
}

Double_t HMdcPlane::calcMinDistance(Double_t x, Double_t y, Double_t z) const {
  // Return minimal distance from x,y,z to the plane
  return (parA*x+parB*y+z - parD) / TMath::Sqrt(parA*parA+parB*parB+1.);
}

Double_t HMdcPlane::calcMinDistance(const HGeomVector& p) const {
  // Return minimal distance from x,y,z to the plane
  return calcMinDistance(p.getX(),p.getY(),p.getZ());
}

Double_t HMdcPlane::calcMinDistanceAndErr(const HGeomVector& p,const HGeomVector& dp,
                                          Double_t& err) const {
  // Return minimal distance from x,y,z to the plane with error
  // HGeomVector dp = (errX,errY,errZ) of (x,y,z) in HGeomVector p
  Double_t norm = TMath::Sqrt(parA*parA+parB*parB+1.);
  HGeomVector errV(parA*dp.getX(),parB*dp.getY(),dp.getZ());
  err = errV.length()/norm;
  return (parA*p.getX()+parB*p.getY()+p.getZ()-parD) / norm;
}

HGeomVector HMdcPlane::getNormalVector(void) const {
  // Return normal vector to the plane
  HGeomVector nv(getNormalUnitVector());
  nv *= normalLength();
  return nv;
}

HGeomVector HMdcPlane::getNormalUnitVector(void) const {
  // Return unit vector of the perpendicular to the plane
  HGeomVector nv(parA,parB,1.);
  nv /= nv.length();
  if(parD<0) nv *= -1;
  return nv;
}

//-----------------------------------------------------
HMdcPointOnPlane::HMdcPointOnPlane(HMdcPlane* p) {
  pl = *p;
}
  
HMdcPointOnPlane::HMdcPointOnPlane(HMdcPointOnPlane& p) : 
    HGeomVector(p.x,p.y,p.z) {
  pl = p.pl;
}

void HMdcPointOnPlane::print(void) const {
  printf("Point x=%7f y=%7f z=%7f on the plane %g*x%+g*y+z=%g\n",
      x,y,z,pl.A(),pl.B(),pl.D());
}
    
void HMdcPointOnPlane::transTo(const HGeomTransform* trans) {
  pl.transTo(trans);
  *((HGeomVector*)this)  = trans->transTo(*((HGeomVector*)this));
}

void HMdcPointOnPlane::transFrom(const HGeomTransform* trans) {
  pl.transFrom(trans);
  *((HGeomVector*)this) = trans->transFrom(*((HGeomVector*)this));
}

//-----------------------------------------------------
void HMdcLineParam::setCoorSys(Int_t s,Int_t m) {
  if(s<-1 || s>5) {
    sec = -2;
    mod = -2;
  } else {
    sec = s;
    if(sec==-1 || m<0 || m>3) mod = -1;
    else mod = m;
  }
}

void HMdcLineParam::setSegmentLine(Double_t r, Double_t z,
    Double_t theta, Double_t phi) {
  Double_t cosPhi = TMath::Cos(phi);
  Double_t sinPhi = TMath::Sin(phi);
  Double_t x1     = -r*sinPhi;   
  Double_t y1     =  r*cosPhi; 
  Double_t dZ     = TMath::Cos(theta);
  Double_t dxy    = TMath::Sqrt(1.-dZ*dZ)*100.;
  Double_t x2     = dxy*cosPhi+x1;
  Double_t y2     = dxy*sinPhi+y1;
  Double_t z2     = dZ*100.+z;
  point1.calcPoint(x1,y1,z,x2,y2,z2);
  point2.calcPoint(x1,y1,z,x2,y2,z2);
}

Double_t HMdcLineParam::getPhiRad(void) const {
  Double_t ph = TMath::ATan2(dY(),dX());
  if(ph >= 0.) return ph;
  return TMath::TwoPi()+ph;
}

void HMdcLineParam::transTo(const HGeomTransform* tr,Int_t s,Int_t m) {
  // if s<-2 - don't change sec
  // if m<-2 - don't change mod
  point1.transTo(tr);
  point2.transTo(tr);
  calcDir();
  if(sec>=-2) sec = s;
  if(mod>=-2) mod = m;
}

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