Line data Source code
1 : #ifndef ALIITSV11GEOMETRY_H
2 : #define ALIITSV11GEOMETRY_H
3 : /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 : * See cxx source for full Copyright notice */
5 :
6 : /*
7 : $Id$
8 : */
9 :
10 : /*
11 : Base class for defining large parts of the ITS geometry, v11.
12 : */
13 : #include <TObject.h>
14 : #include <AliLog.h>
15 : class TGeoArb8;
16 : class TGeoPcon;
17 : class TGeoTube;
18 : class TGeoTubeSeg;
19 : class TGeoConeSeg;
20 : class TGeoBBox;
21 :
22 0 : class AliITSv11Geometry : public TObject {
23 : public:
24 15 : AliITSv11Geometry():fDebug(AliDebugLevel()) {};
25 2 : AliITSv11Geometry(Int_t debug):fDebug(debug) {};
26 8 : virtual ~AliITSv11Geometry(){};
27 : //
28 : // Sets the debug flag for debugging output
29 0 : void SetDebug(Int_t level=5){fDebug=level;}
30 : // Clears the debug flag so no debugging output will be generated
31 0 : void SetNoDebug(){fDebug=0;}
32 : // Returns the debug flag value
33 6492 : Bool_t GetDebug(Int_t level=1)const {return fDebug>=level;}
34 : //
35 : // Static functions
36 : //
37 : // Define Trig functions for use with degrees (standerd TGeo angles).
38 : // Sine function
39 7266 : Double_t SinD(Double_t deg)const{return TMath::Sin(deg*TMath::DegToRad());}
40 : // Cosine function
41 7280 : Double_t CosD(Double_t deg)const{return TMath::Cos(deg*TMath::DegToRad());}
42 : // Tangent function
43 166 : Double_t TanD(Double_t deg)const{return TMath::Tan(deg*TMath::DegToRad());}
44 : // Determine the intersection of two lines
45 : void IntersectLines(Double_t m, Double_t x0, Double_t y0,
46 : Double_t n, Double_t x1, Double_t y1,
47 : Double_t &xi, Double_t &yi)const;
48 : // Determine the intersection of a line and a circle
49 : static Bool_t IntersectCircle(Double_t m, Double_t x0, Double_t y0,
50 : Double_t rr, Double_t xc, Double_t yc,
51 : Double_t &xi1, Double_t &yi1,
52 : Double_t &xi2, Double_t &yi2);
53 : // Given the line, defined by the two points (x0,y0) and (x1,y1) and the
54 : // point x, return the value of y.
55 : Double_t Yfrom2Points(Double_t x0,Double_t y0,
56 : Double_t x1,Double_t y1,Double_t x)const;
57 : // Given the line, defined by the two points (x0,y0) and (x1,y1) and the
58 : // point y, return the value of x.
59 : Double_t Xfrom2Points(Double_t x0,Double_t y0,
60 : Double_t x1,Double_t y1,Double_t y)const;
61 : // Given 2 points from a TGeoPcon(z and Rmax) finds Rmax at given z
62 : Double_t RmaxFrom2Points(const TGeoPcon *p,Int_t i1,Int_t i2,
63 : Double_t z)const;
64 : // Given 2 points from a TGeoPcon(z and Rmin) finds Rmin at given z
65 : Double_t RminFrom2Points(const TGeoPcon *p,Int_t i1,Int_t i2,
66 : Double_t z)const;
67 : // Give two points in the array ar and az, returns the value r
68 : // corresponding z along the line defined by those two points
69 : Double_t RFrom2Points(const Double_t *ar,const Double_t *az,
70 : Int_t i1,Int_t i2,Double_t z)const;
71 : // Given 2 points from a TGeoPcon(z and Rmax) finds z at given Rmin
72 : Double_t Zfrom2MinPoints(const TGeoPcon *p,Int_t i1,Int_t i2,
73 : Double_t r)const;
74 : // Given 2 points from a TGeoPcon(z and Rmax) finds z at given Rmax
75 : Double_t Zfrom2MaxPoints(const TGeoPcon *p,Int_t i1,Int_t i2,
76 : Double_t r)const;
77 : // Give two points in the array ar and az, returns the value z
78 : // corresponding r along the line defined by those two points
79 : Double_t Zfrom2Points(const Double_t *az,const Double_t *ar,
80 : Int_t i1,Int_t i2,Double_t r)const;
81 : // Given 1 point from a TGeoPcon(z and Rmax) the angle tc returns r for
82 : // a given z, an offset (distnace perpendicular to line at angle tc) of
83 : // th may be applied.
84 : Double_t RmaxFromZpCone(const TGeoPcon *p,int ip,Double_t tc,
85 : Double_t z,Double_t th=0.0)const;
86 : Double_t RFromZpCone(const Double_t *ar,const Double_t *az,int ip,
87 : Double_t tc,Double_t z,Double_t th=0.0)const;
88 : // Given 1 point from a TGeoPcon(z and Rmin) the angle tc returns r for
89 : // a given z, an offset (distnace perpendicular to line at angle tc) of
90 : // th may be applied.
91 : Double_t RminFromZpCone(const TGeoPcon *p,Int_t ip,Double_t tc,
92 : Double_t z,Double_t th=0.0)const;
93 : // Given 1 point from a TGeoPcon(z and Rmax) the angle tc returns z for
94 : // a given Rmax, an offset (distnace perpendicular to line at angle tc) of
95 : // th may be applied.
96 : Double_t ZFromRmaxpCone(const TGeoPcon *p,int ip,Double_t tc,
97 : Double_t r,Double_t th=0.0)const;
98 : // General Outer cone Surface equation for z.
99 : Double_t ZFromRmaxpCone(const Double_t *ar,const Double_t *az,
100 : Int_t ip,Double_t tc,Double_t r,
101 : Double_t th=0.0)const;
102 : // Given 1 point from a TGeoPcon(z and Rmin) the angle tc returns z for
103 : // a given Rmin, an offset (distnace perpendicular to line at angle tc) of
104 : // th may be applied.
105 : Double_t ZFromRminpCone(const TGeoPcon *p,int ip,Double_t tc,
106 : Double_t r,Double_t th=0.0)const;
107 : // Given two lines defined by the points i1, i2,i3 in the TGeoPcon
108 : // class p that intersect at point p->GetZ(i2) return the point z,r
109 : // that is Cthick away in the TGeoPcon class q. If points i1=i2
110 : // and max == kTRUE, then p->GetRmin(i1) and p->GetRmax(i2) are used.
111 : // if points i2=i3 and max=kTRUE then points p->GetRmax(i2) and
112 : // p->GetRmin(i3) are used. If i2=i3 and max=kFALSE, then p->GetRmin(i2)
113 : // and p->GetRmax(i3) are used.
114 : void InsidePoint(const TGeoPcon *p,Int_t i1,Int_t i2,Int_t i3,
115 : Double_t Cthick,TGeoPcon *q,Int_t j1,Bool_t max)const;
116 : // Given two intersecting lines defined by the points (x0,y0), (x1,y1) and
117 : // (x1,y1), (x2,y2) {intersecting at (x1,y1)} the point (x,y) a distance
118 : // c away is returned such that two lines a distance c away from the
119 : // lines defined above intersect at (x,y).
120 : void InsidePoint(Double_t x0,Double_t y0,Double_t x1,Double_t y1,
121 : Double_t x2,Double_t y2,Double_t c,
122 : Double_t &x,Double_t &y)const;
123 : // Given a initial point z0,r0, the initial angle theta0, and the radius
124 : // of curvature, returns the point z1, r1 at the angle theta1. Theta
125 : // measured from the r axis in the clock wise direction [degrees].
126 : void RadiusOfCurvature(Double_t rc,Double_t theta0,Double_t z0,
127 : Double_t r0,Double_t theta1,Double_t &z1,
128 : Double_t &r1)const;
129 : //
130 : // Output functions for debugging
131 : //
132 : // Prints out the contents of the TGeoArb8
133 : void PrintArb8(const TGeoArb8 *a) const;
134 : // Prints out the contents of the TGeoPcon
135 : void PrintPcon(const TGeoPcon *a) const;
136 : // Prints out the contents of the TGeoTube
137 : void PrintTube(const TGeoTube *a) const;
138 : // Prints out the contents of the TGeoTubeSeg
139 : void PrintTubeSeg(const TGeoTubeSeg *a) const;
140 : // Prints out the contents of the TGeoConeSeg
141 : void PrintConeSeg(const TGeoConeSeg *a) const;
142 : // Prints out the contents of the TGeoBBox
143 : void PrintBBox(const TGeoBBox *a) const;
144 : // Draws a 2D crossection of the TGeoPcon r,z section
145 : void DrawCrossSection(const TGeoPcon *p,Int_t fillc=7,Int_t fills=4050,
146 : Int_t linec=3,Int_t lines=1,Int_t linew=4,
147 : Int_t markc=2,Int_t marks=4,
148 : Float_t marksize=1.0) const;
149 : // Compute the angles where a line intersects a circle.
150 : Bool_t AngleOfIntersectionWithLine(Double_t x0,Double_t y0,
151 : Double_t x1,Double_t y1,
152 : Double_t xc,Double_t yc,
153 : Double_t rc,Double_t &t0,
154 : Double_t &t1)const;
155 : void AnglesForRoundedCorners(Double_t x0,Double_t y0,Double_t r0,
156 : Double_t x1,Double_t y1,Double_t r1,
157 : Double_t &t0,Double_t &t1)const;
158 : // Define a general CreateMaterials function here so that if
159 : // any specific subdetector does not define it this null function
160 : // will due. This function is not declaired const so that a sub-
161 : // detector's version may use class variables if they wish.
162 : void CreateDefaultMaterials();
163 0 : virtual void CreateMaterials(){};
164 : // Function to create figure needed for this class' documentation
165 : void MakeFigure1(Double_t x0=0.0,Double_t y0=0.0,Double_t r0=2.0,
166 : Double_t x1=-4.0,Double_t y1=-2.0,Double_t r1=1.0);
167 : protected:
168 :
169 : // Units, Convert from k?? to cm,degree,GeV,seconds,
170 : static const Double_t fgkmicron; // Convert micron to TGeom's cm.
171 : static const Double_t fgkmm; // Convert mm to TGeom's cm.
172 : static const Double_t fgkcm; // Convert cm to TGeom's cm.
173 : static const Double_t fgkDegree; //Convert degrees to TGeom's degrees
174 : static const Double_t fgkRadian; //To Radians
175 : static const Double_t fgkgcm3; // Density in g/cm^3
176 : static const Double_t fgkKgm3; // Density in kg/m^3
177 : static const Double_t fgkKgdm3; // Density in kg/dm^3
178 : static const Double_t fgkCelsius; // Temperature in degrees Celcius
179 : static const Double_t fgkPascal; // Preasure in Pascal
180 : static const Double_t fgkKPascal; // Preasure in KPascal
181 : static const Double_t fgkeV; // Energy in eV
182 : static const Double_t fgkKeV; // Energy in KeV
183 : static const Double_t fgkMeV; // Energy in MeV
184 : static const Double_t fgkGeV; // Energy in GeV
185 :
186 : private:
187 : Double_t AngleForRoundedCorners0(Double_t dx,Double_t dy,
188 : Double_t sdr)const;
189 : Double_t AngleForRoundedCorners1(Double_t dx,Double_t dy,
190 : Double_t sdr)const;
191 : Int_t fDebug; //! Debug flag/level
192 122 : ClassDef(AliITSv11Geometry,1) // Base class for ITS v11 geometry
193 : };
194 :
195 : #endif
|