#ifndef ALIITSV11GEOMETRY_H
#define ALIITSV11GEOMETRY_H
#include <TObject.h>
#include <AliLog.h>
class TGeoArb8;
class TGeoPcon;
class TGeoTube;
class TGeoTubeSeg;
class TGeoConeSeg;
class TGeoBBox;
class AliITSv11Geometry : public TObject {
public:
AliITSv11Geometry():fDebug(AliDebugLevel()) {};
AliITSv11Geometry(Int_t debug):fDebug(debug) {};
virtual ~AliITSv11Geometry(){};
void SetDebug(Int_t level=5){fDebug=level;}
void SetNoDebug(){fDebug=0;}
Bool_t GetDebug(Int_t level=1)const {return fDebug>=level;}
Double_t SinD(Double_t deg)const{return TMath::Sin(deg*TMath::DegToRad());}
Double_t CosD(Double_t deg)const{return TMath::Cos(deg*TMath::DegToRad());}
Double_t TanD(Double_t deg)const{return TMath::Tan(deg*TMath::DegToRad());}
void IntersectLines(Double_t m, Double_t x0, Double_t y0,
Double_t n, Double_t x1, Double_t y1,
Double_t &xi, Double_t &yi)const;
static Bool_t IntersectCircle(Double_t m, Double_t x0, Double_t y0,
Double_t rr, Double_t xc, Double_t yc,
Double_t &xi1, Double_t &yi1,
Double_t &xi2, Double_t &yi2);
Double_t Yfrom2Points(Double_t x0,Double_t y0,
Double_t x1,Double_t y1,Double_t x)const;
Double_t Xfrom2Points(Double_t x0,Double_t y0,
Double_t x1,Double_t y1,Double_t y)const;
Double_t RmaxFrom2Points(const TGeoPcon *p,Int_t i1,Int_t i2,
Double_t z)const;
Double_t RminFrom2Points(const TGeoPcon *p,Int_t i1,Int_t i2,
Double_t z)const;
Double_t RFrom2Points(const Double_t *ar,const Double_t *az,
Int_t i1,Int_t i2,Double_t z)const;
Double_t Zfrom2MinPoints(const TGeoPcon *p,Int_t i1,Int_t i2,
Double_t r)const;
Double_t Zfrom2MaxPoints(const TGeoPcon *p,Int_t i1,Int_t i2,
Double_t r)const;
Double_t Zfrom2Points(const Double_t *az,const Double_t *ar,
Int_t i1,Int_t i2,Double_t r)const;
Double_t RmaxFromZpCone(const TGeoPcon *p,int ip,Double_t tc,
Double_t z,Double_t th=0.0)const;
Double_t RFromZpCone(const Double_t *ar,const Double_t *az,int ip,
Double_t tc,Double_t z,Double_t th=0.0)const;
Double_t RminFromZpCone(const TGeoPcon *p,Int_t ip,Double_t tc,
Double_t z,Double_t th=0.0)const;
Double_t ZFromRmaxpCone(const TGeoPcon *p,int ip,Double_t tc,
Double_t r,Double_t th=0.0)const;
Double_t ZFromRmaxpCone(const Double_t *ar,const Double_t *az,
Int_t ip,Double_t tc,Double_t r,
Double_t th=0.0)const;
Double_t ZFromRminpCone(const TGeoPcon *p,int ip,Double_t tc,
Double_t r,Double_t th=0.0)const;
void InsidePoint(const TGeoPcon *p,Int_t i1,Int_t i2,Int_t i3,
Double_t Cthick,TGeoPcon *q,Int_t j1,Bool_t max)const;
void InsidePoint(Double_t x0,Double_t y0,Double_t x1,Double_t y1,
Double_t x2,Double_t y2,Double_t c,
Double_t &x,Double_t &y)const;
void RadiusOfCurvature(Double_t rc,Double_t theta0,Double_t z0,
Double_t r0,Double_t theta1,Double_t &z1,
Double_t &r1)const;
void PrintArb8(const TGeoArb8 *a) const;
void PrintPcon(const TGeoPcon *a) const;
void PrintTube(const TGeoTube *a) const;
void PrintTubeSeg(const TGeoTubeSeg *a) const;
void PrintConeSeg(const TGeoConeSeg *a) const;
void PrintBBox(const TGeoBBox *a) const;
void DrawCrossSection(const TGeoPcon *p,Int_t fillc=7,Int_t fills=4050,
Int_t linec=3,Int_t lines=1,Int_t linew=4,
Int_t markc=2,Int_t marks=4,
Float_t marksize=1.0) const;
Bool_t AngleOfIntersectionWithLine(Double_t x0,Double_t y0,
Double_t x1,Double_t y1,
Double_t xc,Double_t yc,
Double_t rc,Double_t &t0,
Double_t &t1)const;
void AnglesForRoundedCorners(Double_t x0,Double_t y0,Double_t r0,
Double_t x1,Double_t y1,Double_t r1,
Double_t &t0,Double_t &t1)const;
void CreateDefaultMaterials();
virtual void CreateMaterials(){};
void MakeFigure1(Double_t x0=0.0,Double_t y0=0.0,Double_t r0=2.0,
Double_t x1=-4.0,Double_t y1=-2.0,Double_t r1=1.0);
protected:
static const Double_t fgkmicron;
static const Double_t fgkmm;
static const Double_t fgkcm;
static const Double_t fgkDegree;
static const Double_t fgkRadian;
static const Double_t fgkgcm3;
static const Double_t fgkKgm3;
static const Double_t fgkKgdm3;
static const Double_t fgkCelsius;
static const Double_t fgkPascal;
static const Double_t fgkKPascal;
static const Double_t fgkeV;
static const Double_t fgkKeV;
static const Double_t fgkMeV;
static const Double_t fgkGeV;
private:
Double_t AngleForRoundedCorners0(Double_t dx,Double_t dy,
Double_t sdr)const;
Double_t AngleForRoundedCorners1(Double_t dx,Double_t dy,
Double_t sdr)const;
Int_t fDebug;
ClassDef(AliITSv11Geometry,1)
};
#endif