]>
Commit | Line | Data |
---|---|---|
172b0d90 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | /* $Id$ */ | |
17 | #include <stdio.h> | |
18 | #include <stdlib.h> | |
19 | // General Root includes | |
20 | #include <Riostream.h> | |
21 | #include <TMath.h> | |
22 | #include <float.h> | |
23 | #include <TFile.h> // only required for Tracking function? | |
24 | #include <TObjArray.h> | |
25 | #include <TClonesArray.h> | |
26 | #include <TLorentzVector.h> | |
27 | #include <TObjString.h> | |
28 | // Root Geometry includes | |
29 | #include <TGeoManager.h> | |
30 | #include <TGeoVolume.h> | |
31 | #include <TGeoPcon.h> | |
32 | #include <TGeoCone.h> | |
33 | #include <TGeoTube.h> // contaings TGeoTubeSeg | |
34 | #include <TGeoArb8.h> | |
35 | #include <TGeoCompositeShape.h> | |
36 | #include <TGeoMatrix.h> | |
37 | #include <TGeoNode.h> | |
38 | #include <TGeoMaterial.h> | |
39 | #include <TGeoMedium.h> | |
40 | #include "AliITSBaseGeometry.h" | |
41 | #include "AliITSv11Geometry.h" | |
42 | ||
43 | ClassImp(AliITSv11Geometry) | |
44 | //______________________________________________________________________ | |
45 | Double_t AliITSv11Geometry::RmaxFrom2Points(TGeoPcon *p,Int_t i1,Int_t i2,Double_t z){ | |
46 | // functions Require at parts of Volume A to be already defined. | |
47 | // Retruns the value of Rmax corresponding to point z alone the line | |
48 | // defined by the two points p.Rmax(i1),p-GetZ(i1) and p->GetRmax(i2), | |
49 | // p->GetZ(i2). | |
50 | Double_t d0,d1,d2,r; | |
51 | ||
52 | d0 = p->GetRmax(i1)-p->GetRmax(i2);// cout <<"L263: d0="<<d0<<endl; | |
53 | d1 = z-p->GetZ(i2);// cout <<"L264: d1="<<d1<<endl; | |
54 | d2 = p->GetZ(i1)-p->GetZ(i2);// cout <<"L265: d2="<<d2<<endl; | |
55 | r = p->GetRmax(i2) + d1*d0/d2;// cout <<"L266: r="<<r<<endl; | |
56 | return r; | |
57 | } | |
58 | //______________________________________________________________________ | |
59 | Double_t AliITSv11Geometry::RminFrom2Points(TGeoPcon *p,Int_t i1,Int_t i2,Double_t z){ | |
60 | // Retruns the value of Rmin corresponding to point z alone the line | |
61 | // defined by the two points p->GetRmin(i1),p->GetZ(i1) and | |
62 | // p->GetRmin(i2), p->GetZ(i2). | |
63 | ||
64 | return p->GetRmin(i2)+(p->GetRmin(i1)-p->GetRmin(i2))*(z-p->GetZ(i2))/ | |
65 | (p->GetZ(i1)-p->GetZ(i2)); | |
66 | } | |
67 | //______________________________________________________________________ | |
68 | Double_t AliITSv11Geometry::RFrom2Points(Double_t *p,Double_t *Z,Int_t i1, | |
69 | Int_t i2,Double_t z){ | |
70 | // Retruns the value of Rmin corresponding to point z alone the line | |
71 | // defined by the two points p->GetRmin(i1),p->GetZ(i1) and | |
72 | // p->GetRmin(i2), p->GetZ(i2). | |
73 | ||
74 | return p[i2]+(p[i1]-p[i2])*(z-Z[i2])/(Z[i1]-Z[i2]); | |
75 | } | |
76 | //______________________________________________________________________ | |
77 | Double_t AliITSv11Geometry::Zfrom2MinPoints(TGeoPcon *p,Int_t i1,Int_t i2,Double_t r){ | |
78 | // Retruns the value of Z corresponding to point R alone the line | |
79 | // defined by the two points p->GetRmin(i1),p->GetZ(i1) and | |
80 | // p->GetRmin(i2),p->GetZ(i2) | |
81 | ||
82 | return p->GetZ(i2)+(p->GetZ(i1)-p->GetZ(i2))*(r-p->GetRmin(i2))/ | |
83 | (p->GetRmin(i1)-p->GetRmin(i2)); | |
84 | } | |
85 | //______________________________________________________________________ | |
86 | Double_t AliITSv11Geometry::Zfrom2MaxPoints(TGeoPcon *p,Int_t i1,Int_t i2,Double_t r){ | |
87 | // Retruns the value of Z corresponding to point R alone the line | |
88 | // defined by the two points p->GetRmax(i1),p->GetZ(i1) and | |
89 | // p->GetRmax(i2),p->GetZ(i2) | |
90 | ||
91 | return p->GetZ(i2)+(p->GetZ(i1)-p->GetZ(i2))*(r-p->GetRmax(i2))/ | |
92 | (p->GetRmax(i1)-p->GetRmax(i2)); | |
93 | } | |
94 | //______________________________________________________________________ | |
95 | Double_t AliITSv11Geometry::Zfrom2Points(Double_t *Z,Double_t *p,Int_t i1, | |
96 | Int_t i2,Double_t r){ | |
97 | // Retruns the value of Z corresponding to point R alone the line | |
98 | // defined by the two points p->GetRmax(i1),p->GetZ(i1) and | |
99 | // p->GetRmax(i2),p->GetZ(i2) | |
100 | ||
101 | return Z[i2]+(Z[i1]-Z[i2])*(r-p[i2])/(p[i1]-p[i2]); | |
102 | } | |
103 | //______________________________________________________________________ | |
104 | Double_t AliITSv11Geometry::RmaxFromZpCone(TGeoPcon *p,int ip,Double_t tc,Double_t z, | |
105 | Double_t th){ | |
106 | // General SSD Outer Cone surface equation Rmax. | |
107 | Double_t tantc = TMath::Tan(tc*TMath::DegToRad()); | |
108 | Double_t costc = TMath::Cos(tc*TMath::DegToRad()); | |
109 | ||
110 | return -tantc*(z-p->GetZ(ip))+p->GetRmax(ip)+th/costc; | |
111 | } | |
112 | //______________________________________________________________________ | |
113 | Double_t AliITSv11Geometry::RFromZpCone(Double_t *GetRmax,Double_t *GetZ,int ip, | |
114 | Double_t tc,Double_t z,Double_t th){ | |
115 | // General SSD Outer Cone surface equation Rmax. | |
116 | Double_t tantc = TMath::Tan(tc*TMath::DegToRad()); | |
117 | Double_t costc = TMath::Cos(tc*TMath::DegToRad()); | |
118 | ||
119 | return -tantc*(z-GetZ[ip])+GetRmax[ip]+th/costc; | |
120 | } | |
121 | //______________________________________________________________________ | |
122 | Double_t AliITSv11Geometry::RminFromZpCone(TGeoPcon *p,Int_t ip,Double_t tc,Double_t z, | |
123 | Double_t th){ | |
124 | // General SSD Inner Cone surface equation Rmin. | |
125 | Double_t tantc = TMath::Tan(tc*TMath::DegToRad()); | |
126 | Double_t costc = TMath::Cos(tc*TMath::DegToRad()); | |
127 | ||
128 | return -tantc*(z-p->GetZ(ip))+p->GetRmin(ip)+th/costc; | |
129 | } | |
130 | //______________________________________________________________________ | |
131 | Double_t AliITSv11Geometry::ZFromRmaxpCone(TGeoPcon *p,int ip,Double_t tc,Double_t r, | |
132 | Double_t th){ | |
133 | // General SSD Outer cone Surface equation for z. | |
134 | Double_t tantc = TMath::Tan(tc*TMath::DegToRad()); | |
135 | Double_t costc = TMath::Cos(tc*TMath::DegToRad()); | |
136 | ||
137 | return p->GetZ(ip)+(p->GetRmax(ip)+th/costc-r)/tantc; | |
138 | } | |
139 | //______________________________________________________________________ | |
140 | Double_t AliITSv11Geometry::ZFromRmaxpCone(Double_t *GetRmax,Double_t *GetZ,int ip, | |
141 | Double_t tc,Double_t r,Double_t th){ | |
142 | // General SSD Outer cone Surface equation for z. | |
143 | Double_t tantc = TMath::Tan(tc*TMath::DegToRad()); | |
144 | Double_t costc = TMath::Cos(tc*TMath::DegToRad()); | |
145 | ||
146 | return GetZ[ip]+(GetRmax[ip]+th/costc-r)/tantc; | |
147 | } | |
148 | //______________________________________________________________________ | |
149 | Double_t AliITSv11Geometry::ZFromRminpCone(TGeoPcon *p,int ip,Double_t tc,Double_t r, | |
150 | Double_t th){ | |
151 | // General SSD Inner cone Surface equation for z. | |
152 | Double_t tantc = TMath::Tan(tc*TMath::DegToRad()); | |
153 | Double_t costc = TMath::Cos(tc*TMath::DegToRad()); | |
154 | ||
155 | return p->GetZ(ip)+(p->GetRmin(ip)+th/costc-r)/tantc; | |
156 | } | |
157 | //______________________________________________________________________ | |
158 | void AliITSv11Geometry::RadiusOfCurvature(Double_t rc,Double_t theta0,Double_t z0, | |
159 | Double_t r0,Double_t theta1,Double_t &z1, | |
160 | Double_t &r1){ | |
161 | // Given a initial point z0,r0, the initial angle theta0, and the radius | |
162 | // of curvature, returns the point z1, r1 at the angle theta1. Theta | |
163 | // measured from the r axis in the clock wise direction [degrees]. | |
164 | Double_t sin0 = TMath::Sin(theta0*TMath::DegToRad()); | |
165 | Double_t cos0 = TMath::Cos(theta0*TMath::DegToRad()); | |
166 | Double_t sin1 = TMath::Sin(theta1*TMath::DegToRad()); | |
167 | Double_t cos1 = TMath::Cos(theta1*TMath::DegToRad()); | |
168 | ||
169 | z1 = rc*(sin1-sin0)+z0; | |
170 | r1 = rc*(cos1-cos0)+r0; | |
171 | return; | |
172 | } | |
173 | //______________________________________________________________________ | |
174 | void AliITSv11Geometry::InsidePoint(TGeoPcon *p,Int_t i1,Int_t i2,Int_t i3, | |
175 | Double_t c,TGeoPcon *q,Int_t j1,Bool_t max){ | |
176 | // Given two lines defined by the points i1, i2,i3 in the TGeoPcon | |
177 | // class p that intersect at point p->GetZ(i2) return the point z,r | |
178 | // that is Cthick away in the TGeoPcon class q. If points i1=i2 | |
179 | // and max == kTRUE, then p->GetRmin(i1) and p->GetRmax(i2) are used. | |
180 | // if points i2=i3 and max=kTRUE then points p->GetRmax(i2) and | |
181 | // p->GetRmin(i3) are used. If i2=i3 and max=kFALSE, then p->GetRmin(i2) | |
182 | // and p->GetRmax(i3) are used. | |
183 | // Inputs: | |
184 | // TGeoPcon *p Class where points i1, i2, and i3 are taken from | |
185 | // Int_t i1 First point in class p | |
186 | // Int_t i2 Second point in class p | |
187 | // Int_t i3 Third point in class p | |
188 | // Double_t c Distance inside the outer surface/inner suface | |
189 | // that the point j1 is to be computed for. | |
190 | // TGeoPcon *q Pointer to class for results to be put into. | |
191 | // Int_t j1 Point in class q where data is to be stored. | |
192 | // Bool_t max if kTRUE, then a Rmax value is computed, | |
193 | // else a Rmin valule is computed. | |
194 | // Output: | |
195 | // TGeoPcon *q Pointer to class for results to be put into. | |
196 | // Return: | |
197 | // none. | |
198 | Double_t x0,y0,x1,y1,x2,y2,x,y; | |
199 | ||
200 | if(max){ | |
201 | c = -c; //cout <<"L394 c="<<c<<endl; | |
202 | y0 = p->GetRmax(i1); | |
203 | if(i1==i2) y0 = p->GetRmin(i1); //cout <<"L396 y0="<<y0<<endl; | |
204 | y1 = p->GetRmax(i2); //cout <<"L397 y1="<<y1<<endl; | |
205 | y2 = p->GetRmax(i3); //cout <<"L398 y2="<<y2<<endl; | |
206 | if(i2==i3) y2 = p->GetRmin(i3); //cout <<"L399 y2="<<y2<<endl; | |
207 | }else{ // min | |
208 | y0 = p->GetRmin(i1); //cout <<"L401 y0="<<y0<<endl; | |
209 | y1 = p->GetRmin(i2); //cout <<"L402 y1="<<y1<<endl; | |
210 | y2 = p->GetRmin(i3); | |
211 | if(i2==i3) y2 = p->GetRmax(i3); //cout <<"L404 y2="<<y2<<endl; | |
212 | } // end if | |
213 | x0 = p->GetZ(i1); //cout <<"L406 x0="<<x0<<endl; | |
214 | x1 = p->GetZ(i2); //cout <<"L407 x1="<<x1<<endl; | |
215 | x2 = p->GetZ(i3); //cout <<"L408 x2="<<x2<<endl; | |
216 | // | |
217 | InsidePoint(x0,y0,x1,y1,x2,y2,c,x,y); | |
218 | q->Z(j1) = x; | |
219 | if(max) q->Rmax(j1) = y; | |
220 | else q->Rmin(j1) = y; | |
221 | return; | |
222 | } | |
223 | //---------------------------------------------------------------------- | |
224 | void AliITSv11Geometry::InsidePoint(Double_t x0,Double_t y0,Double_t x1,Double_t y1, | |
225 | Double_t x2,Double_t y2,Double_t c, | |
226 | Double_t &x,Double_t &y){ | |
227 | // Given two intersecting lines defined by the points (x0,y0), (x1,y1) and | |
228 | // (x1,y1), (x1,y2) {intersecting at (x1,y1)} the point (x,y) a distance | |
229 | // c away is returned such that two lines a distance c away from the | |
230 | // lines defined above intersect at (x,y). | |
231 | // Inputs: | |
232 | // Double_t x0 X point on the first intersecting sets of lines | |
233 | // Double_t y0 Y point on the first intersecting sets of lines | |
234 | // Double_t x1 X point on the first/second intersecting sets of lines | |
235 | // Double_t y1 Y point on the first/second intersecting sets of lines | |
236 | // Double_t x2 X point on the second intersecting sets of lines | |
237 | // Double_t y2 Y point on the second intersecting sets of lines | |
238 | // Double_t c Distance the two sets of lines are from each other | |
239 | // Output: | |
240 | // Double_t x X point for the intersecting sets of parellel lines | |
241 | // Double_t y Y point for the intersecting sets of parellel lines | |
242 | // Return: | |
243 | // none. | |
244 | Double_t dx01,dx12,dy01,dy12,R01,R12,m; | |
245 | dx01 = x0-x1; //cout <<"L410 dx01="<<dx01<<endl; | |
246 | dx12 = x1-x2; //cout <<"L411 dx12="<<dx12<<endl; | |
247 | dy01 = y0-y1; //cout <<"L412 dy01="<<dy01<<endl; | |
248 | dy12 = y1-y2; //cout <<"L413 dy12="<<dy12<<endl; | |
249 | R01 = TMath::Sqrt(dy01*dy01+dx01*dx01); //cout <<"L414 R01="<<R01<<endl; | |
250 | R12 = TMath::Sqrt(dy12*dy12+dx12*dx12); //cout <<"L415 R12="<<R12<<endl; | |
251 | m = dx12*dy01-dy12*dx01; | |
252 | if(m*m<DBL_EPSILON){ // m == n | |
253 | if(dy01==0.0){ // line are = | |
254 | x = x1+c; //cout <<"L419 x="<<x<<endl; | |
255 | y = y1; //cout <<"L420 y="<<y<<endl; | |
256 | return; | |
257 | }else if(dx01==0.0){ | |
258 | x = x1; | |
259 | y = y1+c; | |
260 | return; | |
261 | }else{ // dx01!=0 and dy01 !=0. | |
262 | x = x1-0.5*c*R01/dy01; //cout <<"L434 x="<<x<<endl; | |
263 | y = y1+0.5*c*R01/dx01; //cout <<"L435 y="<<y<<endl; | |
264 | } // end if | |
265 | return; | |
266 | } // | |
267 | x = x1-c*(dx12*R01-dx01*R12)/m; //cout <<"L442 x="<<x<<endl; | |
268 | y = y1-c*(dy12*R01-dy01*R12)/m; //cout <<"L443 y="<<y<<endl; | |
269 | //cout <<"=============================================="<<endl; | |
270 | return; | |
271 | } | |
272 | //---------------------------------------------------------------------- | |
273 | void AliITSv11Geometry:: printArb8(TGeoArb8 *A){ | |
274 | if(GetDebug()){ | |
275 | cout << A->GetName() << ":"; | |
276 | for(Int_t iii=0;iii<8;iii+=2){ | |
277 | cout <<"("<<A->GetVertices()[iii]<<"," | |
278 | <<A->GetVertices()[iii+1]<<","<<-A->GetDz()<<")"; | |
279 | } // end for iii | |
280 | for(Int_t iii=8;iii<16;iii+=2){ | |
281 | cout <<"("<<A->GetVertices()[iii]<<"," | |
282 | <<A->GetVertices()[iii+1]<<","<<A->GetDz()<<")"; | |
283 | } // end for iii | |
284 | cout << endl; | |
285 | } // end if | |
286 | } | |
287 | //---------------------------------------------------------------------- | |
288 | void AliITSv11Geometry:: printPcon(TGeoPcon *A){ | |
289 | if(GetDebug()) return; | |
290 | cout << A->GetName() << ": N=" << A->GetNz() << " Phi1=" << A->GetPhi1() | |
291 | << ", Dphi=" << A->GetDphi() << endl; | |
292 | cout << "i\t Z \t Rmin \t Rmax" << endl; | |
293 | for(Int_t iii=0;iii<A->GetNz();iii++){ | |
294 | cout << iii << "\t" << A->GetZ(iii) << "\t" << A->GetRmin(iii) | |
295 | << "\t" << A->GetRmax(iii) << endl; | |
296 | } // end for iii | |
297 | } | |
298 | //---------------------------------------------------------------------- | |
299 | void AliITSv11Geometry::printTube(TGeoTube *A){ | |
300 | if(GetDebug()) return; | |
301 | cout << A->GetName() <<": Rmin="<<A->GetRmin() | |
302 | <<" Rmax=" <<A->GetRmax()<<" Dz="<<A->GetDz()<<endl; | |
303 | } | |
304 | //---------------------------------------------------------------------- | |
305 | void AliITSv11Geometry::printTubeSeg(TGeoTubeSeg *A){ | |
306 | if(GetDebug()) return; | |
307 | cout << A->GetName() <<": Phi1="<<A->GetPhi1()<< | |
308 | " Phi2="<<A->GetPhi2()<<" Rmin="<<A->GetRmin() | |
309 | <<" Rmax=" <<A->GetRmax()<<" Dz="<<A->GetDz()<<endl; | |
310 | } | |
311 | //---------------------------------------------------------------------- | |
312 | void AliITSv11Geometry::printConeSeg(TGeoConeSeg *A){ | |
313 | if(GetDebug()) return; | |
314 | cout << A->GetName() <<": Phi1="<<A->GetPhi1()<< | |
315 | " Phi2="<<A->GetPhi2()<<" Rmin1="<<A->GetRmin1() | |
316 | <<" Rmax1=" <<A->GetRmax1()<<" Rmin2="<<A->GetRmin2() | |
317 | <<" Rmax2=" <<A->GetRmax2()<<" Dz="<<A->GetDz()<<endl; | |
318 | } | |
319 | //---------------------------------------------------------------------- | |
320 | void AliITSv11Geometry::printBBox(TGeoBBox *A){ | |
321 | if(GetDebug()) return; | |
322 | cout << A->GetName() <<": Dx="<<A->GetDX()<< | |
323 | " Dy="<<A->GetDY()<<" Dz="<<A->GetDZ() <<endl; | |
324 | } | |
325 |