ROOT logo
#ifndef HMDCGEOMOBJ_H
#define HMDCGEOMOBJ_H

#include "TObject.h"
#include "TObjArray.h"
#include "TArrayI.h"
#include "hgeomvector.h"
#include "hgeomtransform.h"
#include "TMath.h"

class HMdcPointPlane : public TObject {
  protected:
    Double_t x;
    Double_t y;
  public:
    HMdcPointPlane(Double_t xi=0, Double_t yi=0) {x=xi; y=yi;}
    ~HMdcPointPlane(){}
    void     clear()                               {x=y=0.0;}
    void     copy(HMdcPointPlane &point) const     {point.x=x; point.y=y;}
    void     setX(Double_t xn)                     {x=xn;}
    void     setY(Double_t yn)                     {y=yn;}
    void     set(const HMdcPointPlane& point)      {x=point.x; y=point.y;}
    void     set(Double_t xo, Double_t yo)         {x=xo; y=yo;}
    void     setVector(Double_t* vc)               {x=vc[0]; y=vc[1];}
    Double_t getX() const                          {return x;}
    Double_t getY() const                          {return y;}
    void     get(Double_t &xo, Double_t &yo) const {xo=x; yo=y;}
    void     getVector(Double_t* vc) const         {vc[0]=x; vc[1]=y;}
    void     print() const;
  protected:

  ClassDef(HMdcPointPlane,1)
};

class HMdcTrapPlane : public TObject {
  protected:
    HMdcPointPlane points[16];
    Int_t          nPoints;     // number points
    UChar_t        xMinPoint;   // point number with minimal x
    UChar_t        xMaxPoint;   // point number with maximal x
    UChar_t        yMinPoint;   // point number with minimal y
    UChar_t        yMaxPoint;   // point number with maximal y
    Char_t         dir;
  public:
    HMdcTrapPlane() {nPoints=4; dir=0;}
    HMdcTrapPlane(const HMdcTrapPlane& otrap);
    ~HMdcTrapPlane() {}
    HMdcPointPlane& operator[](Int_t i);
    void     print() const;
    void     copy(HMdcTrapPlane& otrap);
    void     set(const HMdcTrapPlane& otrap);
    void     clear();
    void     clearNPoints(void);
    void     addPoint(const HGeomVector& v);
    void     addPoint(const HMdcPointPlane& p);
    Int_t    getNPoints(void) const      {return nPoints;}
    void     getXYMinMax(Int_t& xMin,Int_t& xMax,Int_t& yMin,Int_t& yMax) const;
    Bool_t   getLineInd(Int_t line, Int_t& p1,Int_t& p2) const;
    Bool_t   getXCross(Int_t line,Double_t y, Double_t& x) const;
    Bool_t   getXminXmax(Double_t y, Double_t& x1,Double_t& x2);
    Bool_t   getXminXmax(Double_t y1i,Double_t y2i,Double_t& x1,Double_t& x2);
    Int_t    getXMinPoint(void) const    {return xMinPoint;}
    Int_t    getXMaxPoint(void) const    {return xMaxPoint;}
    Int_t    getYMinPoint(void) const    {return yMinPoint;}
    Int_t    getYMaxPoint(void) const    {return yMaxPoint;}
    Double_t getXMin(void) const         {return points[xMinPoint].getX();}
    Double_t getXMax(void) const         {return points[xMaxPoint].getX();}
    Double_t getYMin(void) const         {return points[yMinPoint].getY();}
    Double_t getYMax(void) const         {return points[yMaxPoint].getY();}
    void     calcDir(void);
    Int_t    twoContoursSum(const HMdcTrapPlane& c1i,
                            const HMdcTrapPlane& c2i);
  protected:
    Double_t calcX(Int_t ip1,Int_t ip2,Double_t y) const;
    Int_t    nextP(Int_t p) const        {p++; return p<nPoints ? p:0;}
    Int_t    prevP(Int_t p) const        {if(p<=0) p=nPoints; return --p;}
    // For nextPXMax and nextPXMin calcDir must be called before.
    Int_t    nextXMaxP(Int_t p) const    {return dir==1 ? nextP(p):prevP(p);}
    Int_t    nextXMinP(Int_t p) const    {return dir==1 ? prevP(p):nextP(p);}
    Int_t    prevXMaxP(Int_t p) const    {return dir==1 ? prevP(p):nextP(p);}
    Int_t    prevXMinP(Int_t p) const    {return dir==1 ? nextP(p):prevP(p);}
  ClassDef(HMdcTrapPlane,1)
};

class HMdcTrap : public TObject {
  protected:
    HGeomVector points[8];
    Char_t      dbPoint;     // double point
  public:
    HMdcTrap()  {}
    HMdcTrap(const HMdcTrap& otrap);
    ~HMdcTrap() {}
    HGeomVector& operator[](Int_t i);
    void   print();
    void   copy(HMdcTrap& otrap) const;
    void   set(const HMdcTrap& otrap);
    void   clear();
    void   transFrom(const HGeomTransform &s);
    void   transTo(const HGeomTransform &s);
    Bool_t getRibInd(Int_t rib,Int_t& ind1,Int_t& ind2);
    void   setDbPointNum(Char_t n)                 {dbPoint = n;}
    Char_t getDbPointNum(void) const               {return dbPoint;}
    Bool_t getRibInXYContour(Int_t rib,Int_t& i,Int_t& j);
    Int_t  getXYContour(HMdcTrapPlane& tr);
  protected:
    Int_t  nextPoint(Int_t i)             {return i==3||i==7 ? i-3 : i+1;}

  ClassDef(HMdcTrap,1)
};

class HMdcPlane : public TObject {
  protected:
    Double_t parA;  // Plane: parA*x+parB*y+c*z=parD  (c=1 !!!)
    Double_t parB;  // parA*parA+parB*parB+c*c must be > 0 and c != 0 !!!
    Double_t parD;
  public:
    HMdcPlane() : parA(0.),parB(0.),parD(0.) {}
    virtual ~HMdcPlane(){;}
    inline HMdcPlane& operator = (const HMdcPlane& p);
    void        print(void) const;
    inline void setPlanePar(const HMdcPlane& p);
    inline void setPlanePar(Double_t al, Double_t bl, Double_t cl, Double_t dl);
    void        setPlanePar(const HGeomTransform& tr);
    Double_t    A() const                                {return parA;}
    Double_t    B() const                                {return parB;}
    Double_t    C() const                                {return 1.;}
    Double_t    D() const                                {return parD;}
    Double_t    getZOnPlane(Double_t x,Double_t y) const {return parD-parA*x-parB*y;}
    Double_t    getYOnPlane(Double_t x,Double_t z) const {return parB!=0.?(parD-parA*x-z)/parB:0.;}
    Double_t    getXOnPlane(Double_t y,Double_t z) const {return parA!=0.?(parD-parB*y-z)/parA:0.;}
    Double_t    dZdX(void) const                         {return -parA;}
    Double_t    dZdY(void) const                         {return -parB;}
    Double_t    calcMinDistance(Double_t x,Double_t y,Double_t z) const;
    Double_t    calcMinDistance(const HGeomVector& p) const;
    Double_t    calcMinDistanceAndErr(const HGeomVector& p,const HGeomVector& dp,Double_t& err) const;
    Double_t    normalLength(void) const                 {return TMath::Abs(calcMinDistance(0,0,0));}
    HGeomVector getNormalVector(void) const;
    HGeomVector getNormalUnitVector(void) const;
    void        transTo(const HGeomTransform* trans);
    void        transFrom(const HGeomTransform* trans);
    inline void getPlanePar(HMdcPlane& p) const;
    inline void getPlanePar(Double_t& a,Double_t& b,Double_t& d) const;
    inline void calcIntersection(const HGeomVector &r,const HGeomVector &dir,
                                  HGeomVector &out) const;
    inline void calcIntersection(const HGeomVector &r,const HGeomVector &dir,
                                 Double_t& x, Double_t& y) const;
    inline void calcIntersection(Double_t x1,Double_t y1,Double_t z1,
                                 Double_t x2, Double_t y2, Double_t z2,
                                 Double_t& x, Double_t& y, Double_t& z) const;
    inline void calcSegIntersec(Float_t z1,Float_t r,Float_t theta,Float_t phi,
                                Float_t& x, Float_t& y, Float_t& z) const;
    inline void calcSegIntersec(Double_t z1,Double_t r,Double_t theta,
                                Double_t phi,Double_t& x, Double_t& y, Double_t& z) const;

    ClassDef(HMdcPlane,1)
};

class HMdcPointOnPlane : public HGeomVector {
  protected:
    HMdcPlane pl;     // plane
  public:
    HMdcPointOnPlane(){}
    HMdcPointOnPlane(HMdcPlane* p);
    HMdcPointOnPlane(HMdcPointOnPlane& p);
    virtual ~HMdcPointOnPlane(){}
    
    void setPlane(const HMdcPlane* p)        {pl=*p;}
    void setX(Double_t xi)                   {x=xi; calcZ();}
    void setY(Double_t yi)                   {y=yi; calcZ();}
    void setXY(Double_t xi, Double_t yi)     {x=xi; y=yi; calcZ();}
    void setXY(const HMdcPointOnPlane& pi)   {x=pi.x; y=pi.y; calcZ();}
    void setXYZ(const HMdcPointOnPlane& pi)  {x=pi.x; y=pi.y; z=pi.z;}
    void addToX(Double_t xa)                 {x+=xa; calcZ();}
    void addToY(Double_t ya)                 {y+=ya; calcZ();}
    void addToXY(Double_t xa,Double_t ya)    {x+=xa; y+=ya; calcZ();}
    void subFromXY(Double_t xs,Double_t ys)  {x-=xs; y-=ys; calcZ();}
    void calcPoint(Double_t x1,Double_t y1,Double_t z1,
                   Double_t x2,Double_t y2,Double_t z2) {
                                pl.calcIntersection(x1,y1,z1,x2,y2,z2,x,y,z);}
    void transTo(const HGeomTransform* trans);
    void transFrom(const HGeomTransform* trans);
    
    void calcPoint(const HGeomVector& pnt,
                   const HGeomVector& dir)   {pl.calcIntersection(pnt,dir,*this);}
    const HGeomVector& getVector(void) const {return *this;}
    HMdcPlane* getPlane(void)                {return &pl;}
    Double_t getX(void) const                {return x;}
    Double_t getY(void) const                {return y;}
    Double_t getZ(void) const                {return z;}
    Double_t X(void) const                   {return x;}
    Double_t Y(void) const                   {return y;}
    Double_t Z(void) const                   {return z;}
    Double_t dZdX(void) const                {return pl.dZdX();}
    Double_t dZdY(void) const                {return pl.dZdY();}
    void     getVector(HGeomVector& v) const {v.setXYZ(x,y,z);}

    inline HMdcPointOnPlane& operator = (HMdcPointOnPlane& p);
    void print() const;
      
  protected:
    void calcZ(void)                         {z=pl.getZOnPlane(x,y);}

    ClassDef(HMdcPointOnPlane,0)
};

class HMdcLineParam : public TObject {
  protected:
    HMdcPointOnPlane point1;         // First point on the line
    HMdcPointOnPlane point2;         // Second point on the line
    HGeomVector      dir;            // Line direction
    Int_t            sec;            // line in coor.sys. of this sector
                                     // -1 - lab.system
                                     // -2 - not setted system
    Int_t            mod;            // line in coor.sys. of this module
                                     // -1 - lab. or sector system
                                     // -2 - not setted system
  public:
    HMdcLineParam() {sec=-1;mod=-1;}
    ~HMdcLineParam(){}
    inline void setParam(Double_t x1, Double_t y1, Double_t z1,
                         Double_t x2, Double_t y2, Double_t z2);
    inline void setParam(const HGeomVector& point, const HGeomVector& dir); 
    void setCoorSys(Int_t s,Int_t m=-1);
    void setFirstPlane(HMdcPlane* fp)  {point1.setPlane(fp);}
    void setSecondPlane(HMdcPlane* sp) {point2.setPlane(sp);}
    inline void   copyPlanes(HMdcLineParam& lp);
    inline void   copyParam(const HMdcLineParam& lp);
    inline Bool_t compare(const HMdcLineParam& tp, Double_t* lim);
    inline Bool_t compare(const HMdcLineParam& tp,Double_t* lim,Double_t fact);
    inline void   setParam(Int_t ip, Double_t val);          // ip>=0 && ip<=3
    inline void   addToParam(Int_t ip, Double_t add);        // ip>=0 && ip<=3
    inline void   addToParam(Int_t ip1,Double_t add1,Int_t ip2,Double_t add2);
    inline void   setScParam(const Double_t* v1,Double_t s,const Double_t* v2);
    inline void   setScParam(const HMdcLineParam& tp,const Double_t* v1, 
                             Double_t s, const Double_t* v2);
    inline void   getLinePar(Double_t *v);
    void setSegmentLine(Double_t r, Double_t z, Double_t theta, Double_t phi);
    inline HMdcLineParam& operator = (HMdcLineParam& lp);
    
    void transTo(const HGeomTransform* tr,Int_t sec=-3,Int_t mod=-3);
    void transFrom(const HGeomTransform* tr,Int_t sec=-3,Int_t mod=-3);
    
    Int_t getSec(void) const         {return sec;}
    Int_t getMod(void) const         {return mod;}
    HMdcPlane* getFirstPlane(void)   {return point1.getPlane();}
    HMdcPlane* getSecondPlane(void)  {return point2.getPlane();}
    const HMdcPointOnPlane& getFisrtPoint(void)  const {return point1;}
    const HMdcPointOnPlane& getSecondPoint(void) const {return point2;}
    const HGeomVector& getDir(void) const              {return dir;}
    Double_t x1(void) const          {return point1.X();}
    Double_t y1(void) const          {return point1.Y();}
    Double_t z1(void) const          {return point1.Z();}
    Double_t x2(void) const          {return point2.X();}
    Double_t y2(void) const          {return point2.Y();}
    Double_t z2(void) const          {return point2.Z();}
    Double_t dX(void) const          {return dir.getX();}
    Double_t dY(void) const          {return dir.getY();}
    Double_t dZ(void) const          {return dir.getZ();}
    Double_t getThetaRad(void) const {return TMath::ATan2(dXY(),dZ());}
    Double_t getPhiRad(void) const;
    Double_t getThetaDeg(void) const {return getThetaRad()*TMath::RadToDeg();}
    Double_t getPhiDeg(void) const   {return getPhiRad()*TMath::RadToDeg();}
    
    // Derivatives:
    Double_t dZ1dX1(void) const      {return point1.dZdX();}
    Double_t dZ2dX2(void) const      {return point2.dZdX();}
    Double_t dZ1dY1(void) const      {return point1.dZdY();}
    Double_t dZ2dY2(void) const      {return point2.dZdY();}
    Double_t dDirXdX1(void) const    {return -1.;}
    Double_t dDirXdX2(void) const    {return +1.;}
    Double_t dDirYdY1(void) const    {return -1.;}
    Double_t dDirYdY2(void) const    {return +1.;}
    
    Double_t dDirZdX1(void) const    {return -point1.dZdX();}
    Double_t dDirZdX2(void) const    {return +point2.dZdX();}
    Double_t dDirZdY1(void) const    {return -point1.dZdY();}
    Double_t dDirZdY2(void) const    {return +point2.dZdY();}
  private:
    void     calcDir(void);
    void     calcDirXZ(void);
    void     calcDirYZ(void);
    Double_t dXY(void) const         {return TMath::Sqrt(dX()*dX()+dY()*dY());}
    
  ClassDef(HMdcLineParam,0)
};

// ---- inlines--------------------

inline HMdcPointOnPlane& HMdcPointOnPlane::operator = (HMdcPointOnPlane& p) {
  pl = p.pl;
  x  = p.x;
  y  = p.y;
  z  = p.z;
  return *this;
}
  
inline HMdcLineParam& HMdcLineParam::operator = (HMdcLineParam& lp) {
  point1 = lp.point1;
  point2 = lp.point2;
  dir    = lp.dir;
  sec    = lp.sec;
  mod    = lp.mod;
  return *this;
}

inline void HMdcLineParam::getLinePar(Double_t *v) {
  v[0] = x1();
  v[1] = y1();
  v[2] = z1();
  v[3] = dX();
  v[4] = dY();
  v[5] = dZ();
}

inline void HMdcLineParam::copyPlanes(HMdcLineParam& lp) {
  point1.setPlane(lp.point1.getPlane()); 
  point2.setPlane(lp.point2.getPlane());
  sec = lp.sec;
  mod = lp.mod;
}

inline void HMdcLineParam::copyParam(const HMdcLineParam& lp) {
  point1.setXYZ(lp.point1);
  point2.setXYZ(lp.point2); 
  dir = lp.dir;
}
  
inline void HMdcLineParam::setParam(Double_t x1i, Double_t y1i, Double_t z1i,
                                    Double_t x2i, Double_t y2i, Double_t z2i) {
  point1.calcPoint(x1i,y1i,z1i,x2i,y2i,z2i);
  point2.calcPoint(x1i,y1i,z1i,x2i,y2i,z2i);
  calcDir();
}

inline void HMdcLineParam::setParam(const HGeomVector& point,
                                    const HGeomVector& dir) {
  point1.calcPoint(point,dir);
  point2.calcPoint(point,dir);
  calcDir();
}

inline Bool_t HMdcLineParam::compare(const HMdcLineParam& tp, Double_t* lim) {
  if(TMath::Abs(point1.X()-tp.point1.X()) > lim[0]) return kTRUE;
  if(TMath::Abs(point1.Y()-tp.point1.Y()) > lim[1]) return kTRUE;
  if(TMath::Abs(point2.X()-tp.point2.X()) > lim[2]) return kTRUE;
  if(TMath::Abs(point2.Y()-tp.point2.Y()) > lim[3]) return kTRUE;
  return kFALSE;
}

inline Bool_t HMdcLineParam::compare(const HMdcLineParam& tp, Double_t* lim,
    Double_t fac) {
  if(TMath::Abs(point1.X()-tp.point1.X()) > lim[0]*fac) return kTRUE;
  if(TMath::Abs(point1.Y()-tp.point1.Y()) > lim[1]*fac) return kTRUE;
  if(TMath::Abs(point2.X()-tp.point2.X()) > lim[2]*fac) return kTRUE;
  if(TMath::Abs(point2.Y()-tp.point2.Y()) > lim[3]*fac) return kTRUE;
  return kFALSE;
}

inline void HMdcLineParam::setParam(Int_t ip, Double_t val) {
  if(ip==0)      {point1.setX(val); calcDirXZ();}
  else if(ip==1) {point1.setY(val); calcDirYZ();}
  else if(ip==2) {point2.setX(val); calcDirXZ();}
  else if(ip==3) {point2.setY(val); calcDirYZ();}
}

inline void HMdcLineParam::addToParam(Int_t ip1, Double_t add1, Int_t ip2,
    Double_t add2) {
  addToParam(ip1,add1); 
  addToParam(ip2,add2);
}

inline void HMdcLineParam::addToParam(Int_t ip, Double_t add) {
  if(ip==0)      {point1.addToX(add); calcDirXZ();}
  else if(ip==1) {point1.addToY(add); calcDirYZ();}
  else if(ip==2) {point2.addToX(add); calcDirXZ();}
  else if(ip==3) {point2.addToY(add); calcDirYZ();}
}

inline void HMdcLineParam::setScParam(const Double_t* v1, Double_t s,
    const Double_t* v2) {
  // x = x_old - v1[0]*s*v2[0]
  // y = y_old - v1[1]*s*v2[1]
  // ...
  point1.subFromXY(v1[0]*s*v2[0],v1[1]*s*v2[1]);
  point2.subFromXY(v1[2]*s*v2[2],v1[3]*s*v2[3]);
  calcDir();
}

inline void HMdcLineParam::setScParam(const HMdcLineParam& tp,
    const Double_t* v1, Double_t s, const Double_t* v2) {
  // x = x_tp - v1[0]*s*v2[0]
  // y = y_tp - v1[1]*s*v2[1]
  // ...
  point1.setXY(tp.point1.getX()-v1[0]*s*v2[0],tp.point1.getY()-v1[1]*s*v2[1]);
  point2.setXY(tp.point2.getX()-v1[2]*s*v2[2],tp.point2.getY()-v1[3]*s*v2[3]);
  calcDir();
}

inline void HMdcLineParam::calcDir(void) {
  dir.setXYZ(point2.X()-point1.X(),point2.Y()-point1.Y(),point2.Z()-point1.Z());
}

inline void HMdcLineParam::calcDirXZ(void) {
  dir.setX(point2.X()-point1.X());
  dir.setZ(point2.Z()-point1.Z());
}

inline void HMdcLineParam::calcDirYZ(void) {
  dir.setY(point2.Y()-point1.Y());
  dir.setZ(point2.Z()-point1.Z());
}

inline void HMdcPlane::setPlanePar(const HMdcPlane& p) {
  parA = p.parA;
  parB = p.parB;
  parD = p.parD;
}

inline void HMdcPlane::setPlanePar(Double_t al, Double_t bl, Double_t cl, Double_t dl) {
  if(cl != 0.) {
    parA = al/cl;
    parB = bl/cl;
    parD = dl/cl;
  }
}
inline HMdcPlane& HMdcPlane::operator = (const HMdcPlane& p) {
  parA = p.parA;
  parB = p.parB;
  parD = p.parD;
  return *this;
}

inline void HMdcPlane::getPlanePar(HMdcPlane& p) const {
  p.parA = parA;
  p.parB = parB;
  p.parD = parD;
}

inline void HMdcPlane::getPlanePar(Double_t& a,Double_t& b,Double_t& d) const {
  a = parA;
  b = parB;
  d = parD;
}
    
inline void HMdcPlane::calcIntersection(const HGeomVector &r, const HGeomVector &dir,
					HGeomVector &out) const {
  // Calculating a cross of line r,dir (point in vol. and direction)
  // with plane parA*x+parB*y+z=parD
  Double_t x1  = r.getX();
  Double_t y1  = r.getY();
  Double_t z1  = r.getZ();
  Double_t dX  = dir.getX();
  Double_t dY  = dir.getY();
  Double_t dZ  = dir.getZ();
  Double_t del = 1./(parA*dX+parB*dY+dZ);
  Double_t x   = (dX*(parD-z1-parB*y1)+x1*(parB*dY+dZ))*del;
  Double_t y   = (dY*(parD-z1-parA*x1)+y1*(parA*dX+dZ))*del;
  out.setXYZ(x,y,-parA*x-parB*y+parD);
}

inline void HMdcPlane::calcIntersection(const HGeomVector &r, const HGeomVector &dir,
                                        Double_t& x, Double_t& y) const {
  // Calculating a cross of line r,dir (point in vol. and direction)
  // with plane parA*x+parB*y+z=parD
  Double_t x1  = r.getX();
  Double_t y1  = r.getY();
  Double_t z1  = r.getZ();
  Double_t dX  = dir.getX();
  Double_t dY  = dir.getY();
  Double_t dZ  = dir.getZ();
  Double_t del = 1./(parA*dX+parB*dY+dZ);
  x = (dX*(parD-z1-parB*y1)+x1*(parB*dY+dZ))*del;
  y = (dY*(parD-z1-parA*x1)+y1*(parA*dX+dZ))*del;
}

inline void HMdcPlane::calcSegIntersec(Float_t z1,Float_t r,Float_t theta,Float_t phi,
				       Float_t& x, Float_t& y, Float_t& z) const {
  // Calculating a cross of MdcSeg line with plane parA*x+parB*y+z=parD
  Float_t cosPhi = TMath::Cos(phi);
  Float_t sinPhi = TMath::Sin(phi);
  Float_t x1     = -r*sinPhi;   
  Float_t y1     = r*cosPhi; 
  Float_t dZ     = TMath::Cos(theta);
  Float_t dxy    = TMath::Sqrt(1.-dZ*dZ);
  Float_t dX     = dxy*cosPhi;
  Float_t dY     = dxy*sinPhi;
  Float_t del    = 1/(parA*dX+parB*dY+dZ);
  x = (dX*(parD-z1-parB*y1)+x1*(parB*dY+dZ))*del;
  y = (dY*(parD-z1-parA*x1)+y1*(parA*dX+dZ))*del;
  //  z = (dZ*(parD-parA*x1-parB*y1)+z1*(parA*dX+parB*dY))*del; 
  z = parD-parA*x-parB*y;
}

inline void HMdcPlane::calcSegIntersec(Double_t z1,Double_t r,Double_t theta,
				       Double_t phi,Double_t& x, Double_t& y, Double_t& z) const {
  // Calculating a cross of MdcSeg line with plane parA*x+parB*y+z=parD
  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    = sqrt(1.-dZ*dZ);
  Double_t dX     = dxy*cosPhi;
  Double_t dY     = dxy*sinPhi;
  Double_t del    = 1/(parA*dX+parB*dY+dZ);
  x = (dX*(parD-z1-parB*y1)+x1*(parB*dY+dZ))*del;
  y = (dY*(parD-z1-parA*x1)+y1*(parA*dX+dZ))*del;
  //  z = (dZ*(parD-parA*x1-parB*y1)+z1*(parA*dX+parB*dY))*del; 
  z = parD-parA*x-parB*y;
}

inline void HMdcPlane::calcIntersection(Double_t x1,Double_t y1,Double_t z1,
					Double_t x2, Double_t y2, Double_t z2,
					Double_t& x, Double_t& y, Double_t& z) const {
  // Calcul. a cross of the line with plane parA*x+parB*y+c*z=parD
  Double_t dX  = x2-x1;
  Double_t dY  = y2-y1;
  Double_t dZ  = z2-z1;
  Double_t del = 1/(parA*dX+parB*dY+dZ);
  x = (dX*(parD-z1-parB*y1)+x1*(parB*dY+dZ))*del;
  y = (dY*(parD-z1-parA*x1)+y1*(parA*dX+dZ))*del;
  z = parD-parA*x-parB*y;
}

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