Line data Source code
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 : /*
17 : $Id$
18 : */
19 :
20 :
21 : ////////////////////////////////////////////////////////////////////////
22 : // This class is a base class for the ITS geometry version 11. It
23 : // contains common/standard functions used in many places in defining
24 : // the ITS geometry, version 11. Large posions of the ITS geometry,
25 : // version 11, should be derived from this class so as to make maximum
26 : // use of these common functions. This class also defines the proper
27 : // conversion valuse such, to cm and degrees, such that the most usefull
28 : // units, those used in the Engineering drawings, can be used.
29 : ////////////////////////////////////////////////////////////////////////
30 :
31 :
32 : #include <Riostream.h>
33 : #include <TMath.h>
34 : #include <TArc.h>
35 : #include <TLine.h>
36 : #include <TArrow.h>
37 : #include <TCanvas.h>
38 : #include <TText.h>
39 : #include <TGeoPcon.h>
40 : #include <TGeoCone.h>
41 : #include <TGeoTube.h> // contaings TGeoTubeSeg
42 : #include <TGeoArb8.h>
43 : #include <TGeoElement.h>
44 : #include <TGeoMaterial.h>
45 : #include <TPolyMarker.h>
46 : #include <TPolyLine.h>
47 : #include <AliMagF.h>
48 : #include <AliRun.h>
49 : #include "AliITSv11Geometry.h"
50 :
51 : using std::endl;
52 : using std::cout;
53 : using std::cin;
54 116 : ClassImp(AliITSv11Geometry)
55 :
56 : const Double_t AliITSv11Geometry::fgkmicron = 1.0E-4;
57 : const Double_t AliITSv11Geometry::fgkmm = 0.10;
58 : const Double_t AliITSv11Geometry::fgkcm = 1.00;
59 : const Double_t AliITSv11Geometry::fgkDegree = 1.0;
60 : const Double_t AliITSv11Geometry::fgkRadian = 180./3.14159265358979323846;
61 : const Double_t AliITSv11Geometry::fgkgcm3 = 1.0; // assume default is g/cm^3
62 : const Double_t AliITSv11Geometry::fgkKgm3 = 1.0E+3;// assume Kg/m^3
63 : const Double_t AliITSv11Geometry::fgkKgdm3 = 1.0; // assume Kg/dm^3
64 : const Double_t AliITSv11Geometry::fgkCelsius = 1.0; // Assume default is C
65 : const Double_t AliITSv11Geometry::fgkPascal = 1.0E-3; // Assume kPascal
66 : const Double_t AliITSv11Geometry::fgkKPascal = 1.0; // Asume kPascal
67 : const Double_t AliITSv11Geometry::fgkeV = 1.0E-9; // GeV default
68 : const Double_t AliITSv11Geometry::fgkKeV = 1.0e-6; // GeV default
69 : const Double_t AliITSv11Geometry::fgkMeV = 1.0e-3; // GeV default
70 : const Double_t AliITSv11Geometry::fgkGeV = 1.0; // GeV default
71 : //______________________________________________________________________
72 : void AliITSv11Geometry::IntersectLines(Double_t m, Double_t x0, Double_t y0,
73 : Double_t n, Double_t x1, Double_t y1,
74 : Double_t &xi, Double_t &yi)const{
75 : // Given the two lines, one passing by (x0,y0) with slope m and
76 : // the other passing by (x1,y1) with slope n, returns the coordinates
77 : // of the intersecting point (xi,yi)
78 : // Inputs:
79 : // Double_t m The slope of the first line
80 : // Double_t x0,y0 The x and y coord. of the first point
81 : // Double_t n The slope of the second line
82 : // Double_t x1,y1 The x and y coord. of the second point
83 : // Outputs:
84 : // The coordinates xi and yi of the intersection point
85 : // Return:
86 : // none.
87 : // Created: 14 Dec 2009 Mario Sitta
88 :
89 28 : if (TMath::Abs(m-n) < 0.000001) {
90 0 : AliError(Form("Lines are parallel: m = %f n = %f\n",m,n));
91 0 : return;
92 : }
93 :
94 14 : xi = (y1 - n*x1 - y0 + m*x0)/(m - n);
95 14 : yi = y0 + m*(xi - x0);
96 :
97 14 : return;
98 14 : }
99 : //______________________________________________________________________
100 : Bool_t AliITSv11Geometry::IntersectCircle(Double_t m, Double_t x0, Double_t y0,
101 : Double_t rr, Double_t xc, Double_t yc,
102 : Double_t &xi1, Double_t &yi1,
103 : Double_t &xi2, Double_t &yi2){
104 : // Given a lines passing by (x0,y0) with slope m and a circle with
105 : // radius rr and center (xc,yc), returns the coordinates of the
106 : // intersecting points (xi1,yi1) and (xi2,yi2) (xi1 > xi2)
107 : // Inputs:
108 : // Double_t m The slope of the line
109 : // Double_t x0,y0 The x and y coord. of the point
110 : // Double_t rr The radius of the circle
111 : // Double_t xc,yc The x and y coord. of the center of circle
112 : // Outputs:
113 : // The coordinates xi and yi of the intersection points
114 : // Return:
115 : // kFALSE if the line does not intercept the circle, otherwise kTRUE
116 : // Created: 18 Dec 2009 Mario Sitta
117 :
118 4 : Double_t p = m*x0 - y0;
119 2 : Double_t q = m*m + 1;
120 :
121 2 : p = p-m*xc+yc;
122 :
123 2 : Double_t delta = m*m*p*p - q*(p*p - rr*rr);
124 :
125 2 : if (delta < 0)
126 0 : return kFALSE;
127 : else {
128 2 : Double_t root = TMath::Sqrt(delta);
129 2 : xi1 = (m*p + root)/q + xc;
130 2 : xi2 = (m*p - root)/q + xc;
131 2 : yi1 = m*(xi1 - x0) + y0;
132 2 : yi2 = m*(xi2 - x0) + y0;
133 : return kTRUE;
134 : }
135 2 : }
136 : //______________________________________________________________________
137 : Double_t AliITSv11Geometry::Yfrom2Points(Double_t x0,Double_t y0,
138 : Double_t x1,Double_t y1,
139 : Double_t x)const{
140 : // Given the two points (x0,y0) and (x1,y1) and the location x, returns
141 : // the value y corresponding to that point x on the line defined by the
142 : // two points.
143 : // Inputs:
144 : // Double_t x0 The first x value defining the line
145 : // Double_t y0 The first y value defining the line
146 : // Double_t x1 The second x value defining the line
147 : // Double_t y1 The second y value defining the line
148 : // Double_t x The x value for which the y value is wanted.
149 : // Outputs:
150 : // none.
151 : // Return:
152 : // The value y corresponding to the point x on the line defined by
153 : // the two points (x0,y0) and (x1,y1).
154 :
155 12 : if(x0==x1 && y0==y1) {
156 0 : printf("Error: AliITSv11Geometry::Yfrom2Ponts The two points are "
157 : "the same (%e,%e) and (%e,%e)",x0,y0,x1,y1);
158 0 : return 0.0;
159 : } // end if
160 6 : if(x0==x1){
161 0 : printf("Warning: AliITSv11Geometry::Yfrom2Points x0=%e == x1=%e. "
162 : "line vertical ""returning mean y",x0,x1);
163 0 : return 0.5*(y0+y1);
164 : }// end if x0==x1
165 6 : Double_t m = (y0-y1)/(x0-x1);
166 6 : return m*(x-x0)+y0;
167 6 : }
168 : //______________________________________________________________________
169 : Double_t AliITSv11Geometry::Xfrom2Points(Double_t x0,Double_t y0,
170 : Double_t x1,Double_t y1,
171 : Double_t y)const{
172 : // Given the two points (x0,y0) and (x1,y1) and the location y, returns
173 : // the value x corresponding to that point y on the line defined by the
174 : // two points.
175 : // Inputs:
176 : // Double_t x0 The first x value defining the line
177 : // Double_t y0 The first y value defining the line
178 : // Double_t x1 The second x value defining the line
179 : // Double_t y1 The second y value defining the line
180 : // Double_t y The y value for which the x value is wanted.
181 : // Outputs:
182 : // none.
183 : // Return:
184 : // The value x corresponding to the point y on the line defined by
185 : // the two points (x0,y0) and (x1,y1).
186 :
187 2 : if(x0==x1 && y0==y1) {
188 0 : printf("Error: AliITSv11Geometry::Yfrom2Ponts The two points are "
189 : "the same (%e,%e) and (%e,%e)",x0,y0,x1,y1);
190 0 : return 0.0;
191 : } // end if
192 1 : if(y0==y1){
193 0 : printf("Warrning: AliITSv11Geometry::Yfrom2Points y0=%e == y1=%e. "
194 : "line horizontal returning mean x",y0,y1);
195 0 : return 0.5*(x0+x1);
196 : }// end if y0==y1
197 1 : Double_t m = (x0-x1)/(y0-y1);
198 1 : return m*(y-y0)+x0;
199 1 : }
200 : //______________________________________________________________________
201 : Double_t AliITSv11Geometry::RmaxFrom2Points(const TGeoPcon *p,Int_t i1,
202 : Int_t i2,Double_t z)const{
203 : // functions Require at parts of Volume A to be already defined.
204 : // Retruns the value of Rmax corresponding to point z alone the line
205 : // defined by the two points p.Rmax(i1),p-GetZ(i1) and p->GetRmax(i2),
206 : // p->GetZ(i2).
207 : // Inputs:
208 : // TGeoPcon *p The Polycone where the two points come from
209 : // Int_t i1 Point 1
210 : // Int_t i2 Point 2
211 : // Double_t z The value of z for which Rmax is to be found
212 : // Outputs:
213 : // none.
214 : // Return:
215 : // Double_t Rmax the value corresponding to z
216 : Double_t d0,d1,d2,r;
217 :
218 10 : d0 = p->GetRmax(i1)-p->GetRmax(i2);// cout <<"L263: d0="<<d0<<endl;
219 5 : d1 = z-p->GetZ(i2);// cout <<"L264: d1="<<d1<<endl;
220 5 : d2 = p->GetZ(i1)-p->GetZ(i2);// cout <<"L265: d2="<<d2<<endl;
221 5 : r = p->GetRmax(i2) + d1*d0/d2;// cout <<"L266: r="<<r<<endl;
222 5 : return r;
223 : }
224 : //______________________________________________________________________
225 : Double_t AliITSv11Geometry::RminFrom2Points(const TGeoPcon *p,Int_t i1,
226 : Int_t i2,Double_t z)const{
227 : // Retruns the value of Rmin corresponding to point z alone the line
228 : // defined by the two points p->GetRmin(i1),p->GetZ(i1) and
229 : // p->GetRmin(i2), p->GetZ(i2).
230 : // Inputs:
231 : // TGeoPcon *p The Polycone where the two points come from
232 : // Int_t i1 Point 1
233 : // Int_t i2 Point 2
234 : // Double_t z The value of z for which Rmax is to be found
235 : // Outputs:
236 : // none.
237 : // Return:
238 : // Double_t Rmax the value corresponding to z
239 :
240 15 : return p->GetRmin(i2)+(p->GetRmin(i1)-p->GetRmin(i2))*(z-p->GetZ(i2))/
241 5 : (p->GetZ(i1)-p->GetZ(i2));
242 : }
243 : //______________________________________________________________________
244 : Double_t AliITSv11Geometry::RFrom2Points(const Double_t *p,const Double_t *az,
245 : Int_t i1,Int_t i2,Double_t z)const{
246 : // Retruns the value of Rmin corresponding to point z alone the line
247 : // defined by the two points p->GetRmin(i1),p->GetZ(i1) and
248 : // p->GetRmin(i2), p->GetZ(i2).
249 : // Inputs:
250 : // Double_t az Array of z values
251 : // Double_t r Array of r values
252 : // Int_t i1 First Point in arrays
253 : // Int_t i2 Second Point in arrays
254 : // Double_t z Value z at which r is to be found
255 : // Outputs:
256 : // none.
257 : // Return:
258 : // The value r corresponding to z and the line defined by the two points
259 :
260 0 : return p[i2]+(p[i1]-p[i2])*(z-az[i2])/(az[i1]-az[i2]);
261 : }
262 : //______________________________________________________________________
263 : Double_t AliITSv11Geometry::Zfrom2MinPoints(const TGeoPcon *p,Int_t i1,
264 : Int_t i2,Double_t r)const{
265 : // Retruns the value of Z corresponding to point R alone the line
266 : // defined by the two points p->GetRmin(i1),p->GetZ(i1) and
267 : // p->GetRmin(i2),p->GetZ(i2)
268 : // Inputs:
269 : // TGeoPcon *p The Poly cone where the two points come from.
270 : // Int_t i1 First Point in arrays
271 : // Int_t i2 Second Point in arrays
272 : // Double_t r Value r min at which z is to be found
273 : // Outputs:
274 : // none.
275 : // Return:
276 : // The value z corresponding to r min and the line defined by
277 : // the two points
278 :
279 0 : return p->GetZ(i2)+(p->GetZ(i1)-p->GetZ(i2))*(r-p->GetRmin(i2))/
280 0 : (p->GetRmin(i1)-p->GetRmin(i2));
281 : }
282 : //______________________________________________________________________
283 : Double_t AliITSv11Geometry::Zfrom2MaxPoints(const TGeoPcon *p,Int_t i1,
284 : Int_t i2,Double_t r)const{
285 : // Retruns the value of Z corresponding to point R alone the line
286 : // defined by the two points p->GetRmax(i1),p->GetZ(i1) and
287 : // p->GetRmax(i2),p->GetZ(i2)
288 : // Inputs:
289 : // TGeoPcon *p The Poly cone where the two points come from.
290 : // Int_t i1 First Point in arrays
291 : // Int_t i2 Second Point in arrays
292 : // Double_t r Value r max at which z is to be found
293 : // Outputs:
294 : // none.
295 : // Return:
296 : // The value z corresponding to r max and the line defined by
297 : // the two points
298 :
299 0 : return p->GetZ(i2)+(p->GetZ(i1)-p->GetZ(i2))*(r-p->GetRmax(i2))/
300 0 : (p->GetRmax(i1)-p->GetRmax(i2));
301 : }
302 : //______________________________________________________________________
303 : Double_t AliITSv11Geometry::Zfrom2Points(const Double_t *z,const Double_t *ar,
304 : Int_t i1,Int_t i2,Double_t r)const{
305 : // Retruns the value of z corresponding to point R alone the line
306 : // defined by the two points p->GetRmax(i1),p->GetZ(i1) and
307 : // p->GetRmax(i2),p->GetZ(i2)
308 : // Inputs:
309 : // Double_t z Array of z values
310 : // Double_t ar Array of r values
311 : // Int_t i1 First Point in arrays
312 : // Int_t i2 Second Point in arrays
313 : // Double_t r Value r at which z is to be found
314 : // Outputs:
315 : // none.
316 : // Return:
317 : // The value z corresponding to r and the line defined by the two points
318 :
319 0 : return z[i2]+(z[i1]-z[i2])*(r-ar[i2])/(ar[i1]-ar[i2]);
320 : }
321 : //______________________________________________________________________
322 : Double_t AliITSv11Geometry::RmaxFromZpCone(const TGeoPcon *p,int ip,
323 : Double_t tc,Double_t z,
324 : Double_t th)const{
325 : // General Outer Cone surface equation Rmax.
326 : // Intputs:
327 : // TGeoPcon *p The poly cone where the initial point comes from
328 : // Int_t ip The index in p to get the point location
329 : // Double_t tc The angle of that part of the cone is at
330 : // Double_t z The value of z to compute Rmax from
331 : // Double_t th The perpendicular distance the parralell line is
332 : // from the point ip.
333 : // Outputs:
334 : // none.
335 : // Return:
336 : // The value Rmax correstponding to the line at angle th, offeset by
337 : // th, and the point p->GetZ/Rmin[ip] at the location z.
338 50 : Double_t tantc = TMath::Tan(tc*TMath::DegToRad());
339 25 : Double_t costc = TMath::Cos(tc*TMath::DegToRad());
340 :
341 25 : return -tantc*(z-p->GetZ(ip))+p->GetRmax(ip)+th/costc;
342 : }
343 : //______________________________________________________________________
344 : Double_t AliITSv11Geometry::RFromZpCone(const Double_t *ar,
345 : const Double_t *az,int ip,
346 : Double_t tc,Double_t z,
347 : Double_t th)const{
348 : // General Cone surface equation R(z).
349 : // Intputs:
350 : // Double_t ar The array of R values
351 : // Double_t az The array of Z values
352 : // Int_t ip The index in p to get the point location
353 : // Double_t tc The angle of that part of the cone is at
354 : // Double_t z The value of z to compute R from
355 : // Double_t th The perpendicular distance the parralell line is
356 : // from the point ip.
357 : // Outputs:
358 : // none.
359 : // Return:
360 : // The value R correstponding to the line at angle th, offeset by
361 : // th, and the point p->GetZ/Rmax[ip] at the locatin z.
362 0 : Double_t tantc = TMath::Tan(tc*TMath::DegToRad());
363 0 : Double_t costc = TMath::Cos(tc*TMath::DegToRad());
364 :
365 0 : return -tantc*(z-az[ip])+ar[ip]+th/costc;
366 : }
367 : //______________________________________________________________________
368 : Double_t AliITSv11Geometry::RminFromZpCone(const TGeoPcon *p,Int_t ip,
369 : Double_t tc,Double_t z,
370 : Double_t th)const{
371 : // General Inner Cone surface equation Rmin.
372 : // Intputs:
373 : // TGeoPcon *p The poly cone where the initial point comes from
374 : // Int_t ip The index in p to get the point location
375 : // Double_t tc The angle of that part of the cone is at
376 : // Double_t z The value of z to compute Rmin from
377 : // Double_t th The perpendicular distance the parralell line is
378 : // from the point ip.
379 : // Outputs:
380 : // none.
381 : // Return:
382 : // The value Rmin correstponding to the line at angle th, offeset by
383 : // th, and the point p->GetZ/Rmin[ip] at the location z.
384 44 : Double_t tantc = TMath::Tan(tc*TMath::DegToRad());
385 22 : Double_t costc = TMath::Cos(tc*TMath::DegToRad());
386 :
387 22 : return -tantc*(z-p->GetZ(ip))+p->GetRmin(ip)+th/costc;
388 : }
389 : //______________________________________________________________________
390 : Double_t AliITSv11Geometry::ZFromRmaxpCone(const TGeoPcon *p,int ip,
391 : Double_t tc,Double_t r,
392 : Double_t th)const{
393 : // General Outer cone Surface equation for z.
394 : // Intputs:
395 : // TGeoPcon *p The poly cone where the initial point comes from
396 : // Int_t ip The index in p to get the point location
397 : // Double_t tc The angle of that part of the cone is at
398 : // Double_t r The value of Rmax to compute z from
399 : // Double_t th The perpendicular distance the parralell line is
400 : // from the point ip.
401 : // Outputs:
402 : // none.
403 : // Return:
404 : // The value Z correstponding to the line at angle th, offeset by
405 : // th, and the point p->GetZ/Rmax[ip] at the location r.
406 74 : Double_t tantc = TMath::Tan(tc*TMath::DegToRad());
407 37 : Double_t costc = TMath::Cos(tc*TMath::DegToRad());
408 :
409 37 : return p->GetZ(ip)+(p->GetRmax(ip)+th/costc-r)/tantc;
410 : }
411 : //______________________________________________________________________
412 : Double_t AliITSv11Geometry::ZFromRmaxpCone(const Double_t *ar,
413 : const Double_t *az,int ip,
414 : Double_t tc,Double_t r,
415 : Double_t th)const{
416 : // General Outer cone Surface equation for z.
417 : // Intputs:
418 : // Double_t ar The array of R values
419 : // Double_t az The array of Z values
420 : // Int_t ip The index in p to get the point location
421 : // Double_t tc The angle of that part of the cone is at
422 : // Double_t r The value of Rmax to compute z from
423 : // Double_t th The perpendicular distance the parralell line is
424 : // from the point ip.
425 : // Outputs:
426 : // none.
427 : // Return:
428 : // The value Z correstponding to the line at angle th, offeset by
429 : // th, and the point p->GetZ/Rmax[ip] at the locatin r.
430 0 : Double_t tantc = TMath::Tan(tc*TMath::DegToRad());
431 0 : Double_t costc = TMath::Cos(tc*TMath::DegToRad());
432 :
433 0 : return az[ip]+(ar[ip]+th/costc-r)/tantc;
434 : }
435 : //______________________________________________________________________
436 : Double_t AliITSv11Geometry::ZFromRminpCone(const TGeoPcon *p,int ip,
437 : Double_t tc,Double_t r,
438 : Double_t th)const{
439 : // General Inner cone Surface equation for z.
440 : // Intputs:
441 : // TGeoPcon *p The poly cone where the initial point comes from
442 : // Int_t ip The index in p to get the point location
443 : // Double_t tc The angle of that part of the cone is at
444 : // Double_t r The value of Rmin to compute z from
445 : // Double_t th The perpendicular distance the parralell line is
446 : // from the point ip.
447 : // Outputs:
448 : // none.
449 : // Return:
450 : // The value Z correstponding to the line at angle th, offeset by
451 : // th, and the point p->GetZ/Rmin[ip] at the location r.
452 74 : Double_t tantc = TMath::Tan(tc*TMath::DegToRad());
453 37 : Double_t costc = TMath::Cos(tc*TMath::DegToRad());
454 :
455 37 : return p->GetZ(ip)+(p->GetRmin(ip)+th/costc-r)/tantc;
456 : }
457 : //______________________________________________________________________
458 : void AliITSv11Geometry::RadiusOfCurvature(Double_t rc,Double_t theta0,
459 : Double_t z0,Double_t r0,
460 : Double_t theta1,Double_t &z1,
461 : Double_t &r1)const{
462 : // Given a initial point z0,r0, the initial angle theta0, and the radius
463 : // of curvature, returns the point z1, r1 at the angle theta1. Theta
464 : // measured from the r axis in the clock wise direction [degrees].
465 : // Inputs:
466 : // Double_t rc The radius of curvature
467 : // Double_t theta0 The starting angle (degrees)
468 : // Double_t z0 The value of z at theta0
469 : // Double_t r0 The value of r at theta0
470 : // Double_t theta1 The ending angle (degrees)
471 : // Outputs:
472 : // Double_t &z1 The value of z at theta1
473 : // Double_t &r1 The value of r at theta1
474 : // Return:
475 : // none.
476 :
477 16 : z1 = rc*(TMath::Sin(theta1*TMath::DegToRad())-TMath::Sin(theta0*TMath::DegToRad()))+z0;
478 8 : r1 = rc*(TMath::Cos(theta1*TMath::DegToRad())-TMath::Cos(theta0*TMath::DegToRad()))+r0;
479 8 : return;
480 : }
481 : //______________________________________________________________________
482 : void AliITSv11Geometry::InsidePoint(const TGeoPcon *p,Int_t i1,Int_t i2,
483 : Int_t i3,Double_t c,TGeoPcon *q,Int_t j1,
484 : Bool_t max)const{
485 : // Given two lines defined by the points i1, i2,i3 in the TGeoPcon
486 : // class p that intersect at point p->GetZ(i2) return the point z,r
487 : // that is Cthick away in the TGeoPcon class q. If points i1=i2
488 : // and max == kTRUE, then p->GetRmin(i1) and p->GetRmax(i2) are used.
489 : // if points i2=i3 and max=kTRUE then points p->GetRmax(i2) and
490 : // p->GetRmin(i3) are used. If i2=i3 and max=kFALSE, then p->GetRmin(i2)
491 : // and p->GetRmax(i3) are used.
492 : // Inputs:
493 : // TGeoPcon *p Class where points i1, i2, and i3 are taken from
494 : // Int_t i1 First point in class p
495 : // Int_t i2 Second point in class p
496 : // Int_t i3 Third point in class p
497 : // Double_t c Distance inside the outer surface/inner suface
498 : // that the point j1 is to be computed for.
499 : // TGeoPcon *q Pointer to class for results to be put into.
500 : // Int_t j1 Point in class q where data is to be stored.
501 : // Bool_t max if kTRUE, then a Rmax value is computed,
502 : // else a Rmin valule is computed.
503 : // Output:
504 : // TGeoPcon *q Pointer to class for results to be put into.
505 : // Return:
506 : // none.
507 0 : Double_t x0,y0,x1,y1,x2,y2,x,y;
508 :
509 0 : if(max){
510 0 : c = -c; //cout <<"L394 c="<<c<<endl;
511 0 : y0 = p->GetRmax(i1);
512 0 : if(i1==i2) y0 = p->GetRmin(i1); //cout <<"L396 y0="<<y0<<endl;
513 0 : y1 = p->GetRmax(i2); //cout <<"L397 y1="<<y1<<endl;
514 0 : y2 = p->GetRmax(i3); //cout <<"L398 y2="<<y2<<endl;
515 0 : if(i2==i3) y2 = p->GetRmin(i3); //cout <<"L399 y2="<<y2<<endl;
516 : }else{ // min
517 0 : y0 = p->GetRmin(i1); //cout <<"L401 y0="<<y0<<endl;
518 0 : y1 = p->GetRmin(i2); //cout <<"L402 y1="<<y1<<endl;
519 0 : y2 = p->GetRmin(i3);
520 0 : if(i2==i3) y2 = p->GetRmax(i3); //cout <<"L404 y2="<<y2<<endl;
521 : } // end if
522 0 : x0 = p->GetZ(i1); //cout <<"L406 x0="<<x0<<endl;
523 0 : x1 = p->GetZ(i2); //cout <<"L407 x1="<<x1<<endl;
524 0 : x2 = p->GetZ(i3); //cout <<"L408 x2="<<x2<<endl;
525 : //
526 0 : InsidePoint(x0,y0,x1,y1,x2,y2,c,x,y);
527 0 : q->Z(j1) = x;
528 0 : if(max) q->Rmax(j1) = y;
529 0 : else q->Rmin(j1) = y;
530 : return;
531 0 : }
532 : //----------------------------------------------------------------------
533 : void AliITSv11Geometry::InsidePoint(Double_t x0,Double_t y0,
534 : Double_t x1,Double_t y1,
535 : Double_t x2,Double_t y2,Double_t c,
536 : Double_t &x,Double_t &y)const{
537 : // Given two intersecting lines defined by the points (x0,y0), (x1,y1) and
538 : // (x1,y1), (x2,y2) {intersecting at (x1,y1)} the point (x,y) a distance
539 : // c away is returned such that two lines a distance c away from the
540 : // lines defined above intersect at (x,y).
541 : // Inputs:
542 : // Double_t x0 X point on the first intersecting sets of lines
543 : // Double_t y0 Y point on the first intersecting sets of lines
544 : // Double_t x1 X point on the first/second intersecting sets of lines
545 : // Double_t y1 Y point on the first/second intersecting sets of lines
546 : // Double_t x2 X point on the second intersecting sets of lines
547 : // Double_t y2 Y point on the second intersecting sets of lines
548 : // Double_t c Distance the two sets of lines are from each other
549 : // Output:
550 : // Double_t x X point for the intersecting sets of parellel lines
551 : // Double_t y Y point for the intersecting sets of parellel lines
552 : // Return:
553 : // none.
554 : Double_t dx01,dx12,dy01,dy12,r01,r12,m;
555 :
556 : //printf("InsidePoint: x0=% #12.7g y0=% #12.7g x1=% #12.7g y1=% #12.7g "
557 : // "x2=% #12.7g y2=% #12.7g c=% #12.7g ",x0,y0,x1,y2,x2,y2,c);
558 4212 : dx01 = x0-x1; //cout <<"L410 dx01="<<dx01<<endl;
559 2106 : dx12 = x1-x2; //cout <<"L411 dx12="<<dx12<<endl;
560 2106 : dy01 = y0-y1; //cout <<"L412 dy01="<<dy01<<endl;
561 2106 : dy12 = y1-y2; //cout <<"L413 dy12="<<dy12<<endl;
562 2106 : r01 = TMath::Sqrt(dy01*dy01+dx01*dx01); //cout <<"L414 r01="<<r01<<endl;
563 2106 : r12 = TMath::Sqrt(dy12*dy12+dx12*dx12); //cout <<"L415 r12="<<r12<<endl;
564 2106 : m = dx12*dy01-dy12*dx01;
565 2106 : if(m*m<DBL_EPSILON){ // m == n
566 60 : if(dy01==0.0){ // line are =
567 0 : x = x1+c; //cout <<"L419 x="<<x<<endl;
568 0 : y = y1; //cout <<"L420 y="<<y<<endl;
569 : //printf("dy01==0.0 x=% #12.7g y=% #12.7g\n",x,y);
570 0 : return;
571 60 : }else if(dx01==0.0){
572 0 : x = x1;
573 0 : y = y1+c;
574 : //printf("dx01==0.0 x=% #12.7g y=% #12.7g\n",x,y);
575 0 : return;
576 : }else{ // dx01!=0 and dy01 !=0.
577 60 : x = x1-0.5*c*r01/dy01; //cout <<"L434 x="<<x<<endl;
578 60 : y = y1+0.5*c*r01/dx01; //cout <<"L435 y="<<y<<endl;
579 : //printf("m*m<DBL_E x=% #12.7g y=% #12.7g\n",x,y);
580 : } // end if
581 60 : return;
582 : } //
583 2046 : x = x1+c*(dx12*r01-dx01*r12)/m; //cout <<"L442 x="<<x<<endl;
584 2046 : y = y1+c*(dy12*r01-dy01*r12)/m; //cout <<"L443 y="<<y<<endl;
585 : //printf(" x=% #12.7g y=% #12.7g\n",x,y);
586 : //cout <<"=============================================="<<endl;
587 2046 : return;
588 2106 : }
589 : //----------------------------------------------------------------------
590 : void AliITSv11Geometry:: PrintArb8(const TGeoArb8 *a)const{
591 : // Prints out the content of the TGeoArb8. Usefull for debugging.
592 : // Inputs:
593 : // TGeoArb8 *a
594 : // Outputs:
595 : // none.
596 : // Return:
597 : // none.
598 :
599 0 : if(!GetDebug()) return;
600 0 : printf("%s",a->GetName());
601 0 : a->InspectShape();
602 0 : return;
603 0 : }
604 : //----------------------------------------------------------------------
605 : void AliITSv11Geometry:: PrintPcon(const TGeoPcon *a)const{
606 : // Prints out the content of the TGeoPcon. Usefull for debugging.
607 : // Inputs:
608 : // TGeoPcon *a
609 : // Outputs:
610 : // none.
611 : // Return:
612 : // none.
613 :
614 0 : if(!GetDebug()) return;
615 0 : cout << a->GetName() << ": N=" << a->GetNz() << " Phi1=" << a->GetPhi1()
616 0 : << ", Dphi=" << a->GetDphi() << endl;
617 0 : cout << "i\t Z \t Rmin \t Rmax" << endl;
618 0 : for(Int_t iii=0;iii<a->GetNz();iii++){
619 0 : cout << iii << "\t" << a->GetZ(iii) << "\t" << a->GetRmin(iii)
620 0 : << "\t" << a->GetRmax(iii) << endl;
621 : } // end for iii
622 0 : return;
623 0 : }
624 : //----------------------------------------------------------------------
625 : void AliITSv11Geometry::PrintTube(const TGeoTube *a)const{
626 : // Prints out the content of the TGeoTube. Usefull for debugging.
627 : // Inputs:
628 : // TGeoTube *a
629 : // Outputs:
630 : // none.
631 : // Return:
632 : // none.
633 :
634 0 : if(!GetDebug()) return;
635 0 : cout << a->GetName() <<": Rmin="<<a->GetRmin()
636 0 : <<" Rmax=" <<a->GetRmax()<<" Dz="<<a->GetDz()<<endl;
637 0 : return;
638 0 : }
639 : //----------------------------------------------------------------------
640 : void AliITSv11Geometry::PrintTubeSeg(const TGeoTubeSeg *a)const{
641 : // Prints out the content of the TGeoTubeSeg. Usefull for debugging.
642 : // Inputs:
643 : // TGeoTubeSeg *a
644 : // Outputs:
645 : // none.
646 : // Return:
647 : // none.
648 :
649 0 : if(!GetDebug()) return;
650 0 : cout << a->GetName() <<": Phi1="<<a->GetPhi1()<<
651 0 : " Phi2="<<a->GetPhi2()<<" Rmin="<<a->GetRmin()
652 0 : <<" Rmax=" <<a->GetRmax()<<" Dz="<<a->GetDz()<<endl;
653 0 : return;
654 0 : }
655 : //----------------------------------------------------------------------
656 : void AliITSv11Geometry::PrintConeSeg(const TGeoConeSeg *a)const{
657 : // Prints out the content of the TGeoConeSeg. Usefull for debugging.
658 : // Inputs:
659 : // TGeoConeSeg *a
660 : // Outputs:
661 : // none.
662 : // Return:
663 : // none.
664 :
665 0 : if(!GetDebug()) return;
666 0 : cout << a->GetName() <<": Phi1="<<a->GetPhi1()<<
667 0 : " Phi2="<<a->GetPhi2()<<" Rmin1="<<a->GetRmin1()
668 0 : <<" Rmax1=" <<a->GetRmax1()<<" Rmin2="<<a->GetRmin2()
669 0 : <<" Rmax2=" <<a->GetRmax2()<<" Dz="<<a->GetDz()<<endl;
670 0 : return;
671 0 : }
672 : //----------------------------------------------------------------------
673 : void AliITSv11Geometry::PrintBBox(const TGeoBBox *a)const{
674 : // Prints out the content of the TGeoBBox. Usefull for debugging.
675 : // Inputs:
676 : // TGeoBBox *a
677 : // Outputs:
678 : // none.
679 : // Return:
680 : // none.
681 :
682 0 : if(!GetDebug()) return;
683 0 : cout << a->GetName() <<": Dx="<<a->GetDX()<<
684 0 : " Dy="<<a->GetDY()<<" Dz="<<a->GetDZ() <<endl;
685 0 : return;
686 0 : }
687 : //---------------------------------------------------------------------
688 : void AliITSv11Geometry::CreateDefaultMaterials(){
689 : // Create ITS materials
690 : // Defined media here should correspond to the one defined in galice.cuts
691 : // File which is red in (AliMC*) fMCApp::Init() { ReadTransPar(); }
692 : // Inputs:
693 : // none.
694 : // Outputs:
695 : // none.
696 : // Return:
697 : // none.
698 : Int_t i;
699 : Double_t w;
700 :
701 : // Define some elements
702 0 : TGeoElement *itsH = new TGeoElement("ITS_H","Hydrogen",1,1.00794);
703 0 : TGeoElement *itsHe = new TGeoElement("ITS_He","Helium",2,4.002602);
704 0 : TGeoElement *itsC = new TGeoElement("ITS_C","Carbon",6,12.0107);
705 0 : TGeoElement *itsN = new TGeoElement("ITS_N","Nitrogen",7,14.0067);
706 0 : TGeoElement *itsO = new TGeoElement("ITS_O","Oxygen",8,15.994);
707 0 : TGeoElement *itsF = new TGeoElement("ITS_F","Florine",9,18.9984032);
708 0 : TGeoElement *itsNe = new TGeoElement("ITS_Ne","Neon",10,20.1797);
709 0 : TGeoElement *itsMg = new TGeoElement("ITS_Mg","Magnesium",12,24.3050);
710 0 : TGeoElement *itsAl = new TGeoElement("ITS_Al","Aluminum",13,26981538);
711 0 : TGeoElement *itsSi = new TGeoElement("ITS_Si","Silicon",14,28.0855);
712 0 : TGeoElement *itsP = new TGeoElement("ITS_P" ,"Phosphorous",15,30.973761);
713 0 : TGeoElement *itsS = new TGeoElement("ITS_S" ,"Sulfur",16,32.065);
714 0 : TGeoElement *itsAr = new TGeoElement("ITS_Ar","Argon",18,39.948);
715 0 : TGeoElement *itsTi = new TGeoElement("ITS_Ti","Titanium",22,47.867);
716 0 : TGeoElement *itsCr = new TGeoElement("ITS_Cr","Chromium",24,51.9961);
717 0 : TGeoElement *itsMn = new TGeoElement("ITS_Mn","Manganese",25,54.938049);
718 0 : TGeoElement *itsFe = new TGeoElement("ITS_Fe","Iron",26,55.845);
719 0 : TGeoElement *itsCo = new TGeoElement("ITS_Co","Cobalt",27,58.933200);
720 0 : TGeoElement *itsNi = new TGeoElement("ITS_Ni","Nickrl",28,56.6930);
721 0 : TGeoElement *itsCu = new TGeoElement("ITS_Cu","Copper",29,63.546);
722 0 : TGeoElement *itsZn = new TGeoElement("ITS_Zn","Zinc",30,65.39);
723 0 : TGeoElement *itsKr = new TGeoElement("ITS_Kr","Krypton",36,83.80);
724 0 : TGeoElement *itsMo = new TGeoElement("ITS_Mo","Molylibdium",42,95.94);
725 0 : TGeoElement *itsXe = new TGeoElement("ITS_Xe","Zeon",54,131.293);
726 :
727 : // Start with the Materials since for any one material there
728 : // can be defined more than one Medium.
729 : // Air, dry. at 15degree C, 101325Pa at sea-level, % by volume
730 : // (% by weight). Density is 351 Kg/m^3
731 : // N2 78.084% (75.47%), O2 20.9476% (23.20%), Ar 0.934 (1.28%)%,
732 : // C02 0.0314% (0.0590%), Ne 0.001818% (0.0012%, CH4 0.002% (),
733 : // He 0.000524% (0.00007%), Kr 0.000114% (0.0003%), H2 0.00005% (3.5E-6%),
734 : // Xe 0.0000087% (0.00004 %), H2O 0.0% (dry) + trace amounts at the ppm
735 : // levels.
736 0 : TGeoMixture *itsAir = new TGeoMixture("ITS_Air",9);
737 : w = 75.47E-2;
738 0 : itsAir->AddElement(itsN,w);// Nitorgen, atomic
739 : w = 23.29E-2 + // O2
740 : 5.90E-4 * 2.*15.994/(12.0107+2.*15.994);// CO2.
741 0 : itsAir->AddElement(itsO,w);// Oxygen, atomic
742 : w = 1.28E-2;
743 0 : itsAir->AddElement(itsAr,w);// Argon, atomic
744 : w = 5.90E-4*12.0107/(12.0107+2.*15.994)+ // CO2
745 : 2.0E-5 *12.0107/(12.0107+4.* 1.00794); // CH4
746 0 : itsAir->AddElement(itsC,w);// Carbon, atomic
747 : w = 1.818E-5;
748 0 : itsAir->AddElement(itsNe,w);// Ne, atomic
749 : w = 3.5E-8;
750 0 : itsAir->AddElement(itsHe,w);// Helium, atomic
751 : w = 7.0E-7;
752 0 : itsAir->AddElement(itsKr,w);// Krypton, atomic
753 : w = 3.0E-6;
754 0 : itsAir->AddElement(itsH,w);// Hydrogen, atomic
755 : w = 4.0E-7;
756 0 : itsAir->AddElement(itsXe,w);// Xenon, atomic
757 0 : itsAir->SetDensity(351.0*fgkKgm3); //
758 0 : itsAir->SetPressure(101325*fgkPascal);
759 0 : itsAir->SetTemperature(15.0*fgkCelsius);
760 0 : itsAir->SetState(TGeoMaterial::kMatStateGas);
761 : //
762 : // Silicone
763 0 : TGeoMaterial *itsSiDet = new TGeoMaterial("ITS_Si",itsSi,2.33*fgkgcm3);
764 0 : itsSiDet->SetTemperature(15.0*fgkCelsius);
765 0 : itsSiDet->SetState(TGeoMaterial::kMatStateSolid);
766 : //
767 : // Epoxy C18 H19 O3
768 0 : TGeoMixture *itsEpoxy = new TGeoMixture("ITS_Epoxy",3);
769 0 : itsEpoxy->AddElement(itsC,18);
770 0 : itsEpoxy->AddElement(itsH,19);
771 0 : itsEpoxy->AddElement(itsO,3);
772 0 : itsEpoxy->SetDensity(1.8*fgkgcm3);
773 0 : itsEpoxy->SetTemperature(15.0*fgkCelsius);
774 0 : itsEpoxy->SetState(TGeoMaterial::kMatStateSolid);
775 : //
776 : // Carbon Fiber, M55J, 60% fiber by volume. Fiber density
777 : // 1.91 g/cm^3. See ToryaCA M55J data sheet.
778 : //Begin_Html
779 : /*
780 : <A HREF="http://torayusa.com/cfa/pdfs/M55JDataSheet.pdf"> Data Sheet
781 : </A>
782 : */
783 : //End_Html
784 0 : TGeoMixture *itsCarbonFiber = new TGeoMixture("ITS_CarbonFiber-M55J",4);
785 : // Assume that the epoxy fill in the space between the fibers and so
786 : // no change in the total volume. To compute w, assume 1cm^3 total
787 : // volume.
788 0 : w = 1.91/(1.91+(1.-.60)*itsEpoxy->GetDensity());
789 0 : itsCarbonFiber->AddElement(itsC,w);
790 0 : w = (1.-.60)*itsEpoxy->GetDensity()/(1.91+(1.-.06)*itsEpoxy->GetDensity());
791 0 : for(i=0;i<itsEpoxy->GetNelements();i++)
792 0 : itsCarbonFiber->AddElement(itsEpoxy->GetElement(i),
793 0 : itsEpoxy->GetWmixt()[i]*w);
794 0 : itsCarbonFiber->SetDensity((1.91+(1.-.60)*itsEpoxy->GetDensity())*fgkgcm3);
795 0 : itsCarbonFiber->SetTemperature(22.0*fgkCelsius);
796 0 : itsCarbonFiber->SetState(TGeoMaterial::kMatStateSolid);
797 : //
798 : //
799 : //
800 : // Rohacell 51A millable foam product.
801 : // C9 H13 N1 O2 52Kg/m^3
802 : // Elemental composition, Private comunications with
803 : // Bjorn S. Nilsen
804 : //Begin_Html
805 : /*
806 : <A HREF="http://www.rohacell.com/en/performanceplastics8344.html">
807 : Rohacell-A see Properties
808 : </A>
809 : */
810 : //End_Html
811 0 : TGeoMixture *itsFoam = new TGeoMixture("ITS_Foam",4);
812 0 : itsFoam->AddElement(itsC,9);
813 0 : itsFoam->AddElement(itsH,13);
814 0 : itsFoam->AddElement(itsN,1);
815 0 : itsFoam->AddElement(itsO,2);
816 0 : itsFoam->SetTitle("Rohacell 51 A");
817 0 : itsFoam->SetDensity(52.*fgkKgm3);
818 0 : itsFoam->SetTemperature(22.0*fgkCelsius);
819 0 : itsFoam->SetState(TGeoMaterial::kMatStateSolid);
820 : //
821 : // Kapton % by weight, H 2.6362, C69.1133, N 7.3270, O 20.0235
822 : // Density 1.42 g/cm^3
823 : //Begin_Html
824 : /*
825 : <A HREF="http://www2.dupont.com/Kapton/en_US/assets/downloads/pdf/summaryofprop.pdf">
826 : Kapton. also see </A>
827 : <A HREF="http://physics.nist.gov/cgi-bin/Star/compos.pl?matno=179">
828 : </A>
829 : */
830 : //End_Html
831 0 : TGeoMixture *itsKapton = new TGeoMixture("ITS_Kapton",4);
832 0 : itsKapton->AddElement(itsH,0.026362);
833 0 : itsKapton->AddElement(itsC,0.691133);
834 0 : itsKapton->AddElement(itsN,0.073270);
835 0 : itsKapton->AddElement(itsO,0.200235);
836 0 : itsKapton->SetTitle("Kapton ribon and cable base");
837 0 : itsKapton->SetDensity(1.42*fgkgcm3);
838 0 : itsKapton->SetTemperature(22.0*fgkCelsius);
839 0 : itsKapton->SetState(TGeoMaterial::kMatStateSolid);
840 : //
841 : // UPILEX-S C16 H6 O4 N2 polymer (a Kapton like material)
842 : // Density 1.47 g/cm^3
843 : //Begin_Html
844 : /*
845 : <A HREF="http://northamerica.ube.com/page.php?pageid=9">
846 : UPILEX-S. also see </A>
847 : <A HREF="http://northamerica.ube.com/page.php?pageid=81">
848 : </A>
849 : */
850 : //End_Html
851 0 : TGeoMixture *itsUpilex = new TGeoMixture("ITS_Upilex",4);
852 0 : itsUpilex->AddElement(itsC,16);
853 0 : itsUpilex->AddElement(itsH,6);
854 0 : itsUpilex->AddElement(itsN,2);
855 0 : itsUpilex->AddElement(itsO,4);
856 0 : itsUpilex->SetTitle("Upilex ribon, cable, and pcb base");
857 0 : itsUpilex->SetDensity(1.47*fgkgcm3);
858 0 : itsUpilex->SetTemperature(22.0*fgkCelsius);
859 0 : itsUpilex->SetState(TGeoMaterial::kMatStateSolid);
860 : //
861 : // Aluminum 6061 (Al used by US groups)
862 : // % by weight, Cr 0.04-0.35 range [0.0375 nominal value used]
863 : // Cu 0.15-0.4 [0.275], Fe Max 0.7 [0.35], Mg 0.8-1.2 [1.0],
864 : // Mn Max 0.15 [0.075] Si 0.4-0.8 [0.6], Ti Max 0.15 [0.075],
865 : // Zn Max 0.25 [0.125], Rest Al [97.4625]. Density 2.7 g/cm^3
866 : //Begin_Html
867 : /*
868 : <A HREG="http://www.matweb.com/SpecificMaterial.asp?bassnum=MA6016&group=General">
869 : Aluminum 6061 specifications
870 : </A>
871 : */
872 : //End_Html
873 0 : TGeoMixture *itsAl6061 = new TGeoMixture("ITS_Al6061",9);
874 0 : itsAl6061->AddElement(itsCr,0.000375);
875 0 : itsAl6061->AddElement(itsCu,0.00275);
876 0 : itsAl6061->AddElement(itsFe,0.0035);
877 0 : itsAl6061->AddElement(itsMg,0.01);
878 0 : itsAl6061->AddElement(itsMn,0.00075);
879 0 : itsAl6061->AddElement(itsSi,0.006);
880 0 : itsAl6061->AddElement(itsTi,0.00075);
881 0 : itsAl6061->AddElement(itsZn,0.00125);
882 0 : itsAl6061->AddElement(itsAl,0.974625);
883 0 : itsAl6061->SetTitle("Aluminum Alloy 6061");
884 0 : itsAl6061->SetDensity(2.7*fgkgcm3);
885 0 : itsAl6061->SetTemperature(22.0*fgkCelsius);
886 0 : itsAl6061->SetState(TGeoMaterial::kMatStateSolid);
887 : //
888 : // Aluminum 7075 (Al used by Italian groups)
889 : // % by weight, Cr 0.18-0.28 range [0.23 nominal value used]
890 : // Cu 1.2-2.0 [1.6], Fe Max 0.5 [0.25], Mg 2.1-2.9 [2.5],
891 : // Mn Max 0.3 [0.125] Si Max 0.4 [0.2], Ti Max 0.2 [0.1],
892 : // Zn 5.1-6.1 [5.6], Rest Al [89.395]. Density 2.81 g/cm^3
893 : //Begin_Html
894 : /*
895 : <A HREG="http://asm.matweb.com/search/SpecificMaterial.asp?bassnum=MA7075T6">
896 : Aluminum 7075 specifications
897 : </A>
898 : */
899 : //End_Html
900 0 : TGeoMixture *itsAl7075 = new TGeoMixture("ITS_Al7075",9);
901 0 : itsAl7075->AddElement(itsCr,0.0023);
902 0 : itsAl7075->AddElement(itsCu,0.016);
903 0 : itsAl7075->AddElement(itsFe,0.0025);
904 0 : itsAl7075->AddElement(itsMg,0.025);
905 0 : itsAl7075->AddElement(itsMn,0.00125);
906 0 : itsAl7075->AddElement(itsSi,0.002);
907 0 : itsAl7075->AddElement(itsTi,0.001);
908 0 : itsAl7075->AddElement(itsZn,0.056);
909 0 : itsAl7075->AddElement(itsAl,0.89395);
910 0 : itsAl7075->SetTitle("Aluminum Alloy 7075");
911 0 : itsAl7075->SetDensity(2.81*fgkgcm3);
912 0 : itsAl7075->SetTemperature(22.0*fgkCelsius);
913 0 : itsAl7075->SetState(TGeoMaterial::kMatStateSolid);
914 : //
915 : // "Ruby" spheres, Al2 O3
916 : // "Ruby" Sphere posts, Ryton R-4 04
917 : //Begin_Html
918 : /*
919 : <A HREF="">
920 : Ruby Sphere Posts
921 : </A>
922 : */
923 : //End_Html
924 0 : TGeoMixture *itsRuby = new TGeoMixture("ITS_RubySphere",2);
925 0 : itsRuby->AddElement(itsAl,2);
926 0 : itsRuby->AddElement(itsO,3);
927 0 : itsRuby->SetTitle("Ruby reference sphere");
928 0 : itsRuby->SetDensity(2.81*fgkgcm3);
929 0 : itsRuby->SetTemperature(22.0*fgkCelsius);
930 0 : itsRuby->SetState(TGeoMaterial::kMatStateSolid);
931 : //
932 : //
933 : // Inox, AISI 304L, compoistion % by weight (assumed)
934 : // C Max 0.03 [0.015], Mn Max 2.00 [1.00], Si Max 1.00 [0.50]
935 : // P Max 0.045 [0.0225], S Max 0.03 [0.015], Ni 8.0-10.5 [9.25]
936 : // Cr 18-20 [19.], Mo 2.-2.5 [2.25], rest Fe: density 7.93 Kg/dm^3
937 : //Begin_Html
938 : /*
939 : <A HREF="http://www.cimap.fr/caracter.pdf">
940 : Stainless steal (INOX) AISI 304L composition
941 : </A>
942 : */
943 : //End_Html
944 0 : TGeoMixture *itsInox304L = new TGeoMixture("ITS_Inox304L",9);
945 0 : itsInox304L->AddElement(itsC,0.00015);
946 0 : itsInox304L->AddElement(itsMn,0.010);
947 0 : itsInox304L->AddElement(itsSi,0.005);
948 0 : itsInox304L->AddElement(itsP,0.000225);
949 0 : itsInox304L->AddElement(itsS,0.00015);
950 0 : itsInox304L->AddElement(itsNi,0.0925);
951 0 : itsInox304L->AddElement(itsCr,0.1900);
952 0 : itsInox304L->AddElement(itsMo,0.0225);
953 0 : itsInox304L->AddElement(itsFe,0.679475); // Rest Fe
954 0 : itsInox304L->SetTitle("ITS Stainless Steal (Inox) type AISI 304L");
955 0 : itsInox304L->SetDensity(7.93*fgkKgdm3);
956 0 : itsInox304L->SetTemperature(22.0*fgkCelsius);
957 0 : itsInox304L->SetState(TGeoMaterial::kMatStateSolid);
958 : //
959 : // Inox, AISI 316L, composition % by weight (assumed)
960 : // C Max 0.03 [0.015], Mn Max 2.00 [1.00], Si Max 1.00 [0.50]
961 : // P Max 0.045 [0.0225], S Max 0.03 [0.015], Ni 10.0-14. [12.]
962 : // Cr 16-18 [17.], Mo 2-3 [2.5]: density 7.97 Kg/dm^3
963 : //Begin_Html
964 : /*
965 : <A HREF="http://www.cimap.fr/caracter.pdf">
966 : Stainless steal (INOX) AISI 316L composition
967 : </A>
968 : */
969 : //End_Html
970 0 : TGeoMixture *itsInox316L = new TGeoMixture("ITS_Inox316L",9);
971 0 : itsInox316L->AddElement(itsC,0.00015);
972 0 : itsInox316L->AddElement(itsMn,0.010);
973 0 : itsInox316L->AddElement(itsSi,0.005);
974 0 : itsInox316L->AddElement(itsP,0.000225);
975 0 : itsInox316L->AddElement(itsS,0.00015);
976 0 : itsInox316L->AddElement(itsNi,0.12);
977 0 : itsInox316L->AddElement(itsCr,0.17);
978 0 : itsInox316L->AddElement(itsMo,0.025);
979 0 : itsInox316L->AddElement(itsFe,0.66945); // Rest Fe
980 0 : itsInox316L->SetTitle("ITS Stainless Steal (Inox) type AISI 316L");
981 0 : itsInox316L->SetDensity(7.97*fgkKgdm3);
982 0 : itsInox316L->SetTemperature(22.0*fgkCelsius);
983 0 : itsInox316L->SetState(TGeoMaterial::kMatStateSolid);
984 : //
985 : // Inox, Phynox or Elgiloy AMS 5833, composition % by weight
986 : // C Max 0.15 [0.15], Mn Max 2.00 [2.00], Be max 0.0001 [none]
987 : // Ni 18. [18.], Cr 21.5 [21.5], Mo 7.5 [7.5], Co 42 [42.]:
988 : // density 8.3 Kg/dm^3
989 : //Begin_Html
990 : /*
991 : <A HREF="http://www.freepatentsonline.com/20070032816.html">
992 : Compostion of Phynox or Elgiloy AMS 5833, also see
993 : </A>
994 : <A HREF="http://www.alloywire.com/phynox_alloy.html">
995 : under corss reference number [0024].
996 : </A>
997 : */
998 : //End_Html
999 0 : TGeoMixture *itsPhynox = new TGeoMixture("ITS_Phynox",7);
1000 0 : itsPhynox->AddElement(itsC,0.0015);
1001 0 : itsPhynox->AddElement(itsMn,0.020);
1002 0 : itsPhynox->AddElement(itsNi,0.18);
1003 0 : itsPhynox->AddElement(itsCr,0.215);
1004 0 : itsPhynox->AddElement(itsMo,0.075);
1005 0 : itsPhynox->AddElement(itsCo,0.42);
1006 0 : itsPhynox->AddElement(itsFe,0.885);
1007 0 : itsPhynox->SetTitle("ITS Cooling tube alloy");
1008 0 : itsPhynox->SetDensity(8.3*fgkgcm3);
1009 0 : itsPhynox->SetTemperature(22.0*fgkCelsius);
1010 0 : itsPhynox->SetState(TGeoMaterial::kMatStateSolid);
1011 : //
1012 : // G10FR4
1013 : //
1014 : // Demineralized Water H2O SDD & SSD Cooling liquid
1015 0 : TGeoMixture *itsWater = new TGeoMixture("ITS_Water",2);
1016 0 : itsWater->AddElement(itsH,2);
1017 0 : itsWater->AddElement(itsO,1);
1018 0 : itsWater->SetTitle("ITS Cooling Water");
1019 0 : itsWater->SetDensity(1.0*fgkgcm3);
1020 0 : itsWater->SetTemperature(22.0*fgkCelsius);
1021 0 : itsWater->SetState(TGeoMaterial::kMatStateLiquid);
1022 : //
1023 : // Freon SPD Cooling liquid PerFluorobuthane C4F10
1024 : //Begin_Html
1025 : /*
1026 : <A HREF=" http://st-support-cooling-electronics.web.cern.ch/st-support-cooling-electronics/default.htm">
1027 : SPD 2 phase cooling using PerFluorobuthane
1028 : </A>
1029 : */
1030 : //End_Html
1031 0 : TGeoMixture *itsFreon = new TGeoMixture("ITS_SPD_Freon",2);
1032 0 : itsFreon->AddElement(itsC,4);
1033 0 : itsFreon->AddElement(itsF,10);
1034 0 : itsFreon->SetTitle("ITS SPD 2 phase Cooling freon");
1035 0 : itsFreon->SetDensity(1.52*fgkgcm3);
1036 0 : itsFreon->SetTemperature(22.0*fgkCelsius);
1037 0 : itsFreon->SetState(TGeoMaterial::kMatStateLiquid);
1038 : //
1039 : // Int_t ifield = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ();
1040 : // Float_t fieldm = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max();
1041 :
1042 : // Float_t tmaxfd = 0.1;// 1.0;// Degree
1043 : // Float_t stemax = 1.0;// cm
1044 : // Float_t deemax = 0.1;// 30.0;// Fraction of particle's energy 0<deemax<=1
1045 : // Float_t epsil = 1.0E-4;// 1.0; cm
1046 : // Float_t stmin = 0.0; // cm "Default value used"
1047 :
1048 : // Float_t tmaxfdSi = 0.1; // .10000E+01; // Degree
1049 : // Float_t stemaxSi = 0.0075; // .10000E+01; // cm
1050 : // Float_t deemaxSi = 0.1; // Fraction of particle's energy 0<deemax<=1
1051 : // Float_t epsilSi = 1.0E-4;// .10000E+01;
1052 : /*
1053 : Float_t stminSi = 0.0; // cm "Default value used"
1054 :
1055 : Float_t tmaxfdAir = 0.1; // .10000E+01; // Degree
1056 : Float_t stemaxAir = .10000E+01; // cm
1057 : Float_t deemaxAir = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
1058 : Float_t epsilAir = 1.0E-4;// .10000E+01;
1059 : Float_t stminAir = 0.0; // cm "Default value used"
1060 :
1061 : Float_t tmaxfdServ = 1.0; // 10.0; // Degree
1062 : Float_t stemaxServ = 1.0; // 0.01; // cm
1063 : Float_t deemaxServ = 0.5; // 0.1; // Fraction of particle's energy 0<deemax<=1
1064 : Float_t epsilServ = 1.0E-3; // 0.003; // cm
1065 : Float_t stminServ = 0.0; //0.003; // cm "Default value used"
1066 :
1067 : // Freon PerFluorobuthane C4F10 see
1068 : // http://st-support-cooling-electronics.web.cern.ch/
1069 : // st-support-cooling-electronics/default.htm
1070 : Float_t afre[2] = { 12.011,18.9984032 };
1071 : Float_t zfre[2] = { 6., 9. };
1072 : Float_t wfre[2] = { 4.,10. };
1073 : Float_t densfre = 1.52;
1074 :
1075 : //CM55J
1076 : Float_t aCM55J[4]={12.0107,14.0067,15.9994,1.00794};
1077 : Float_t zCM55J[4]={6.,7.,8.,1.};
1078 : Float_t wCM55J[4]={0.908508078,0.010387573,0.055957585,0.025146765};
1079 : Float_t dCM55J = 1.63;
1080 :
1081 : //ALCM55J
1082 : Float_t aALCM55J[5]={12.0107,14.0067,15.9994,1.00794,26.981538};
1083 : Float_t zALCM55J[5]={6.,7.,8.,1.,13.};
1084 : Float_t wALCM55J[5]={0.817657902,0.0093488157,0.0503618265,0.0226320885,0.1};
1085 : Float_t dALCM55J = 1.9866;
1086 :
1087 : //Si Chips
1088 : Float_t aSICHIP[6]={12.0107,14.0067,15.9994,1.00794,28.0855,107.8682};
1089 : Float_t zSICHIP[6]={6.,7.,8.,1.,14., 47.};
1090 : Float_t wSICHIP[6]={0.039730642,0.001396798,0.01169634,
1091 : 0.004367771,0.844665,0.09814344903};
1092 : Float_t dSICHIP = 2.36436;
1093 :
1094 : //Inox
1095 : Float_t aINOX[9]={12.0107,54.9380, 28.0855,30.9738,32.066,
1096 : 58.6928,55.9961,95.94,55.845};
1097 : Float_t zINOX[9]={6.,25.,14.,15.,16., 28.,24.,42.,26.};
1098 : Float_t wINOX[9]={0.0003,0.02,0.01,0.00045,0.0003,0.12,0.17,0.025,0.654};
1099 : Float_t dINOX = 8.03;
1100 :
1101 : //SDD HV microcable
1102 : Float_t aHVm[5]={12.0107,1.00794,14.0067,15.9994,26.981538};
1103 : Float_t zHVm[5]={6.,1.,7.,8.,13.};
1104 : Float_t wHVm[5]={0.520088819984,0.01983871336,0.0551367996,0.157399667056, 0.247536};
1105 : Float_t dHVm = 1.6087;
1106 :
1107 : //SDD LV+signal cable
1108 : Float_t aLVm[5]={12.0107,1.00794,14.0067,15.9994,26.981538};
1109 : Float_t zLVm[5]={6.,1.,7.,8.,13.};
1110 : Float_t wLVm[5]={0.21722436468,0.0082859922,0.023028867,0.06574077612, 0.68572};
1111 : Float_t dLVm = 2.1035;
1112 :
1113 : //SDD hybrid microcab
1114 : Float_t aHLVm[5]={12.0107,1.00794,14.0067,15.9994,26.981538};
1115 : Float_t zHLVm[5]={6.,1.,7.,8.,13.};
1116 : Float_t wHLVm[5]={0.24281879711,0.00926228815,0.02574224025,0.07348667449, 0.64869};
1117 : Float_t dHLVm = 2.0502;
1118 :
1119 : //SDD anode microcab
1120 : Float_t aALVm[5]={12.0107,1.00794,14.0067,15.9994,26.981538};
1121 : Float_t zALVm[5]={6.,1.,7.,8.,13.};
1122 : Float_t wALVm[5]={0.392653705471,0.0128595919215,
1123 : 0.041626868025,0.118832707289, 0.431909};
1124 : Float_t dALVm = 2.0502;
1125 :
1126 : //X7R capacitors
1127 : Float_t aX7R[7]={137.327,47.867,15.9994,58.6928,63.5460,118.710,207.2};
1128 : Float_t zX7R[7]={56.,22.,8.,28.,29.,50.,82.};
1129 : Float_t wX7R[7]={0.251639432,0.084755042,0.085975822,
1130 : 0.038244751,0.009471271,0.321736471,0.2081768};
1131 : Float_t dX7R = 7.14567;
1132 :
1133 : // AIR
1134 : Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
1135 : Float_t zAir[4]={6.,7.,8.,18.};
1136 : Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
1137 : Float_t dAir = 1.20479E-3;
1138 :
1139 : // Water
1140 : Float_t aWater[2]={1.00794,15.9994};
1141 : Float_t zWater[2]={1.,8.};
1142 : Float_t wWater[2]={0.111894,0.888106};
1143 : Float_t dWater = 1.0;
1144 :
1145 : // CERAMICS
1146 : // 94.4% Al2O3 , 2.8% SiO2 , 2.3% MnO , 0.5% Cr2O3
1147 : Float_t acer[5] = { 26.981539,15.9994,28.0855,54.93805,51.9961 };
1148 : Float_t zcer[5] = { 13., 8., 14., 25., 24. };
1149 : Float_t wcer[5] = {.4443408,.5213375,.0130872,.0178135,.003421};
1150 : Float_t denscer = 3.6;
1151 :
1152 : // G10FR4
1153 : Float_t zG10FR4[14] = {14.00, 20.00, 13.00, 12.00, 5.00,
1154 : 22.00, 11.00, 19.00, 26.00, 9.00,
1155 : 8.00, 6.00, 7.00, 1.00};
1156 : Float_t aG10FR4[14] = {28.0855000,40.0780000,26.9815380,24.3050000,
1157 : 10.8110000,47.8670000,22.9897700,39.0983000,
1158 : 55.8450000,18.9984000,15.9994000,12.0107000,
1159 : 14.0067000,1.0079400};
1160 : Float_t wG10FR4[14] = {0.15144894,0.08147477,0.04128158,0.00904554,
1161 : 0.01397570,0.00287685,0.00445114,0.00498089,
1162 : 0.00209828,0.00420000,0.36043788,0.27529426,
1163 : 0.01415852,0.03427566};
1164 : Float_t densG10FR4= 1.8;
1165 :
1166 : //--- EPOXY --- C18 H19 O3
1167 : Float_t aEpoxy[3] = {15.9994, 1.00794, 12.0107} ;
1168 : Float_t zEpoxy[3] = { 8., 1., 6.} ;
1169 : Float_t wEpoxy[3] = { 3., 19., 18.} ;
1170 : Float_t dEpoxy = 1.8 ;
1171 :
1172 : // rohacell: C9 H13 N1 O2
1173 : Float_t arohac[4] = {12.01, 1.01, 14.010, 16.};
1174 : Float_t zrohac[4] = { 6., 1., 7., 8.};
1175 : Float_t wrohac[4] = { 9., 13., 1., 2.};
1176 : Float_t drohac = 0.05;
1177 :
1178 : // If he/she means stainless steel (inox) + Aluminium and Zeff=15.3383 then
1179 : // %Al=81.6164 %inox=100-%Al
1180 : Float_t aInAl[5] = {27., 55.847,51.9961,58.6934,28.0855 };
1181 : Float_t zInAl[5] = {13., 26.,24.,28.,14. };
1182 : Float_t wInAl[5] = {.816164, .131443,.0330906,.0183836,.000919182};
1183 : Float_t dInAl = 3.075;
1184 :
1185 : // Kapton
1186 : Float_t aKapton[4]={1.00794,12.0107, 14.010,15.9994};
1187 : Float_t zKapton[4]={1.,6.,7.,8.};
1188 : Float_t wKapton[4]={0.026362,0.69113,0.07327,0.209235};
1189 : Float_t dKapton = 1.42;
1190 :
1191 : //SDD ruby sph.
1192 : Float_t aAlOxide[2] = { 26.981539,15.9994};
1193 : Float_t zAlOxide[2] = { 13., 8.};
1194 : Float_t wAlOxide[2] = {0.4707, 0.5293};
1195 : Float_t dAlOxide = 3.97;
1196 : */
1197 0 : }
1198 : //---------------------------------------------------------------------
1199 : void AliITSv11Geometry::DrawCrossSection(const TGeoPcon *p,
1200 : Int_t fillc,Int_t fills,
1201 : Int_t linec,Int_t lines,Int_t linew,
1202 : Int_t markc,Int_t marks,Float_t marksize)const{
1203 : // Draws a cross sectional view of the TGeoPcon, Primarily for debugging.
1204 : // A TCanvas should exist first.
1205 : // Inputs:
1206 : // TGeoPcon *p The TGeoPcon to be "drawn"
1207 : // Int_t fillc The fill color to be used
1208 : // Int_t fills The fill style to be used
1209 : // Int_t linec The line color to be used
1210 : // Int_t lines The line style to be used
1211 : // Int_t linew The line width to be used
1212 : // Int_t markc The markder color to be used
1213 : // Int_t marks The markder style to be used
1214 : // Float_t marksize The marker size
1215 : // Outputs:
1216 : // none.
1217 : // Return:
1218 : // none.
1219 0 : Int_t n=0,m=0,i=0;
1220 : Double_t *z=0,*r=0;
1221 : TPolyMarker *pts=0;
1222 : TPolyLine *line=0;
1223 :
1224 0 : n = p->GetNz();
1225 0 : if(n<=0) return;
1226 0 : m = 2*n+1;
1227 0 : z = new Double_t[m];
1228 0 : r = new Double_t[m];
1229 :
1230 0 : for(i=0;i<n;i++){
1231 0 : z[i] = p->GetZ(i);
1232 0 : r[i] = p->GetRmax(i);
1233 0 : z[i+n] = p->GetZ(n-1-i);
1234 0 : r[i+n] = p->GetRmin(n-1-i);
1235 : } // end for i
1236 0 : z[n-1] = z[0];
1237 0 : r[n-1] = r[0];
1238 :
1239 0 : line = new TPolyLine(n,z,r);
1240 0 : pts = new TPolyMarker(n,z,r);
1241 :
1242 0 : line->SetFillColor(fillc);
1243 0 : line->SetFillStyle(fills);
1244 0 : line->SetLineColor(linec);
1245 0 : line->SetLineStyle(lines);
1246 0 : line->SetLineWidth(linew);
1247 0 : pts->SetMarkerColor(markc);
1248 0 : pts->SetMarkerStyle(marks);
1249 0 : pts->SetMarkerSize(marksize);
1250 :
1251 0 : line->Draw("f");
1252 0 : line->Draw();
1253 0 : pts->Draw();
1254 :
1255 0 : delete[] z;
1256 0 : delete[] r;
1257 :
1258 0 : cout<<"Hit Return to continue"<<endl;
1259 0 : cin >> n;
1260 0 : delete line;
1261 0 : delete pts;
1262 0 : return;
1263 0 : }
1264 : //______________________________________________________________________
1265 : Bool_t AliITSv11Geometry::AngleOfIntersectionWithLine(Double_t x0,Double_t y0,
1266 : Double_t x1,Double_t y1,
1267 : Double_t xc,Double_t yc,
1268 : Double_t rc,Double_t &t0,
1269 : Double_t &t1)const{
1270 : // Computes the angles, t0 and t1 corresponding to the intersection of
1271 : // the line, defined by {x0,y0} {x1,y1}, and the circle, defined by
1272 : // its center {xc,yc} and radius r. If the line does not intersect the
1273 : // line, function returns kFALSE, otherwise it returns kTRUE. If the
1274 : // line is tangent to the circle, the angles t0 and t1 will be the same.
1275 : // Inputs:
1276 : // Double_t x0 X of first point defining the line
1277 : // Double_t y0 Y of first point defining the line
1278 : // Double_t x1 X of Second point defining the line
1279 : // Double_t y1 Y of Second point defining the line
1280 : // Double_t xc X of Circle center point defining the line
1281 : // Double_t yc Y of Circle center point defining the line
1282 : // Double_t r radius of circle
1283 : // Outputs:
1284 : // Double_t &t0 First angle where line intersects circle
1285 : // Double_t &t1 Second angle where line intersects circle
1286 : // Return:
1287 : // kTRUE, line intersects circle, kFALSE line does not intersect circle
1288 : // or the line is not properly defined point {x0,y0} and {x1,y1}
1289 : // are the same point.
1290 0 : Double_t dx,dy,cx,cy,s2,t[4];
1291 : Double_t a0,b0,c0,a1,b1,c1,sinthp,sinthm,costhp,costhm;
1292 : Int_t i,j;
1293 :
1294 0 : t0 = 400.0;
1295 0 : t1 = 400.0;
1296 0 : dx = x1-x0;
1297 0 : dy = y1-y0;
1298 0 : cx = xc-x0;
1299 0 : cy = yc-y0;
1300 0 : s2 = dx*dx+dy*dy;
1301 0 : if(s2==0.0) return kFALSE;
1302 :
1303 0 : a0 = rc*rc*s2;
1304 0 : if(a0==0.0) return kFALSE;
1305 0 : b0 = 2.0*rc*dx*(dx*cy-cx*dy);
1306 0 : c0 = dx*dx*cy*cy-2.0*dy*dx*cy*cx+cx*cx*dy*dy-rc*rc*dy*dy;
1307 0 : c0 = 0.25*b0*b0/(a0*a0)-c0/a0;
1308 0 : if(c0<0.0) return kFALSE;
1309 0 : sinthp = -0.5*b0/a0+TMath::Sqrt(c0);
1310 0 : sinthm = -0.5*b0/a0-TMath::Sqrt(c0);
1311 :
1312 : a1 = rc*rc*s2;
1313 0 : if(a1==0.0) return kFALSE;
1314 0 : b1 = 2.0*rc*dy*(dy*cx-dx*cy);
1315 0 : c1 = dy*dy*cx*cx-2.0*dy*dx*cy*cx+dx*dx*cy*cy-rc*rc*dx*dx;
1316 0 : c1 = 0.25*b1*b1/(a1*a1)-c1/a1;
1317 0 : if(c1<0.0) return kFALSE;
1318 0 : costhp = -0.5*b1/a1+TMath::Sqrt(c1);
1319 0 : costhm = -0.5*b1/a1-TMath::Sqrt(c1);
1320 :
1321 0 : t[0] = t[1] = t[2] = t[3] = 400.;
1322 0 : a0 = TMath::ATan2(sinthp,costhp); if(a0<0.0) a0 += 2.0*TMath::Pi();
1323 0 : a1 = TMath::ATan2(sinthp,costhm); if(a1<0.0) a1 += 2.0*TMath::Pi();
1324 0 : b0 = TMath::ATan2(sinthm,costhp); if(b0<0.0) b0 += 2.0*TMath::Pi();
1325 0 : b1 = TMath::ATan2(sinthm,costhm); if(b1<0.0) b1 += 2.0*TMath::Pi();
1326 0 : x1 = xc+rc*TMath::Cos(a0);
1327 0 : y1 = yc+rc*TMath::Sin(a0);
1328 0 : s2 = dx*(y1-y0)-dy*(x1-x0);
1329 0 : if(s2*s2<DBL_EPSILON) t[0] = a0*TMath::RadToDeg();
1330 0 : x1 = xc+rc*TMath::Cos(a1);
1331 0 : y1 = yc+rc*TMath::Sin(a1);
1332 0 : s2 = dx*(y1-y0)-dy*(x1-x0);
1333 0 : if(s2*s2<DBL_EPSILON) t[1] = a1*TMath::RadToDeg();
1334 0 : x1 = xc+rc*TMath::Cos(b0);
1335 0 : y1 = yc+rc*TMath::Sin(b0);
1336 0 : s2 = dx*(y1-y0)-dy*(x1-x0);
1337 0 : if(s2*s2<DBL_EPSILON) t[2] = b0*TMath::RadToDeg();
1338 0 : x1 = xc+rc*TMath::Cos(b1);
1339 0 : y1 = yc+rc*TMath::Sin(b1);
1340 0 : s2 = dx*(y1-y0)-dy*(x1-x0);
1341 0 : if(s2*s2<DBL_EPSILON) t[3] = b1*TMath::RadToDeg();
1342 0 : for(i=0;i<4;i++)for(j=i+1;j<4;j++){
1343 0 : if(t[i]>t[j]) {t0 = t[i];t[i] = t[j];t[j] = t0;}
1344 : } // end for i,j
1345 0 : t0 = t[0];
1346 0 : t1 = t[1];
1347 : //
1348 0 : return kTRUE;
1349 0 : }
1350 : //______________________________________________________________________
1351 : Double_t AliITSv11Geometry::AngleForRoundedCorners0(Double_t dx,Double_t dy,
1352 : Double_t sdr)const{
1353 : // Basic function used to determine the ending angle and starting angles
1354 : // for rounded corners given the relative distance between the centers
1355 : // of the circles and the difference/sum of their radii. Case 0.
1356 : // Inputs:
1357 : // Double_t dx difference in x locations of the circle centers
1358 : // Double_t dy difference in y locations of the circle centers
1359 : // Double_t sdr difference or sum of the circle radii
1360 : // Outputs:
1361 : // none.
1362 : // Return:
1363 : // the angle in Degrees
1364 : Double_t a,b;
1365 :
1366 80 : b = dy*dy+dx*dx-sdr*sdr;
1367 40 : if(b<0.0) Error("AngleForRoundedCorners0",
1368 : "dx^2(%e)+dy^2(%e)-sdr^2(%e)=b=%e<0",dx,dy,sdr,b);
1369 40 : b = TMath::Sqrt(b);
1370 40 : a = -sdr*dy+dx*b;
1371 40 : b = -sdr*dx-dy*b;
1372 40 : return TMath::ATan2(a,b)*TMath::RadToDeg();
1373 :
1374 : }
1375 : //______________________________________________________________________
1376 : Double_t AliITSv11Geometry::AngleForRoundedCorners1(Double_t dx,Double_t dy,
1377 : Double_t sdr)const{
1378 : // Basic function used to determine the ending angle and starting angles
1379 : // for rounded corners given the relative distance between the centers
1380 : // of the circles and the difference/sum of their radii. Case 1.
1381 : // Inputs:
1382 : // Double_t dx difference in x locations of the circle centers
1383 : // Double_t dy difference in y locations of the circle centers
1384 : // Double_t sdr difference or sum of the circle radii
1385 : // Outputs:
1386 : // none.
1387 : // Return:
1388 : // the angle in Degrees
1389 : Double_t a,b;
1390 :
1391 160 : b = dy*dy+dx*dx-sdr*sdr;
1392 80 : if(b<0.0) Error("AngleForRoundedCorners1",
1393 : "dx^2(%e)+dy^2(%e)-sdr^2(%e)=b=%e<0",dx,dy,sdr,b);
1394 80 : b = TMath::Sqrt(b);
1395 80 : a = -sdr*dy-dx*b;
1396 80 : b = -sdr*dx+dy*b;
1397 80 : return TMath::ATan2(a,b)*TMath::RadToDeg();
1398 :
1399 : }
1400 : //----------------------------------------------------------------------
1401 : void AliITSv11Geometry::AnglesForRoundedCorners(Double_t x0,Double_t y0,
1402 : Double_t r0,Double_t x1,
1403 : Double_t y1,Double_t r1,
1404 : Double_t &t0,Double_t &t1)
1405 : const{
1406 : // Function to compute the ending angle, for arc 0, and starting angle,
1407 : // for arc 1, such that a straight line will connect them with no
1408 : // discontinuities.
1409 : //Begin_Html
1410 : /*
1411 : <img src="picts/ITS/AliITSv11Geometry_AnglesForRoundedCorners.gif">
1412 : */
1413 : //End_Html
1414 : // Inputs:
1415 : // Double_t x0 X Coordinate of arc 0 center.
1416 : // Double_t y0 Y Coordinate of arc 0 center.
1417 : // Double_t r0 Radius of curvature of arc 0. For signe see figure.
1418 : // Double_t x1 X Coordinate of arc 1 center.
1419 : // Double_t y1 Y Coordinate of arc 1 center.
1420 : // Double_t r1 Radius of curvature of arc 1. For signe see figure.
1421 : // Outputs:
1422 : // Double_t t0 Ending angle of arch 0, with respect to x axis, Degrees.
1423 : // Double_t t1 Starting angle of arch 1, with respect to x axis,
1424 : // Degrees.
1425 : // Return:
1426 : // none.
1427 : Double_t t;
1428 :
1429 240 : if(r0>=0.0&&r1>=0.0) { // Inside to inside ++
1430 30 : t = AngleForRoundedCorners1(x1-x0,y1-y0,r1-r0);
1431 30 : t0 = t1 = t;
1432 30 : return;
1433 90 : }else if(r0>=0.0&&r1<=0.0){ // Inside to Outside +-
1434 40 : r1 = -r1; // make positive
1435 40 : t = AngleForRoundedCorners0(x1-x0,y1-y0,r1+r0);
1436 40 : t0 = 180.0 + t;
1437 40 : if(t0<0.0) t += 360.;
1438 50 : if(t<0.0) t += 360.;
1439 40 : t1 = t;
1440 40 : return;
1441 50 : }else if(r0<=0.0&&r1>=0.0){ // Outside to Inside -+
1442 50 : r0 = - r0; // make positive
1443 50 : t = AngleForRoundedCorners1(x1-x0,y1-y0,r1+r0);
1444 50 : t0 = 180.0 + t;
1445 90 : if(t0>180.) t0 -= 360.;
1446 50 : if(t >180.) t -= 360.;
1447 50 : t1 = t;
1448 50 : return;
1449 0 : }else if(r0<=0.0&&r1<=0.0) { // Outside to outside --
1450 0 : r0 = -r0; // make positive
1451 0 : r1 = -r1; // make positive
1452 0 : t = AngleForRoundedCorners0(x1-x0,y1-y0,r1-r0);
1453 0 : t0 = t1 = t;
1454 0 : return;
1455 : } // end if
1456 0 : return;
1457 120 : }
1458 : //----------------------------------------------------------------------
1459 : void AliITSv11Geometry::MakeFigure1(Double_t x0,Double_t y0,Double_t r0,
1460 : Double_t x1,Double_t y1,Double_t r1){
1461 : // Function to create the figure discribing how the function
1462 : // AnglesForRoundedCorners works.
1463 : //
1464 : // Inputs:
1465 : // Double_t x0 X Coordinate of arc 0 center.
1466 : // Double_t y0 Y Coordinate of arc 0 center.
1467 : // Double_t r0 Radius of curvature of arc 0. For signe see figure.
1468 : // Double_t x1 X Coordinate of arc 1 center.
1469 : // Double_t y1 Y Coordinate of arc 1 center.
1470 : // Double_t r1 Radius of curvature of arc 1. For signe see figure.
1471 : // Outputs:
1472 : // none.
1473 : // Return:
1474 : // none.
1475 0 : Double_t t0[4],t1[4],xa0[4],ya0[4],xa1[4],ya1[4],ra0[4],ra1[4];
1476 : Double_t xmin,ymin,xmax,ymax,h;
1477 : Int_t j;
1478 :
1479 0 : for(j=0;j<4;j++) {
1480 0 : ra0[j] = r0; if(j%2) ra0[j] = -r0;
1481 0 : ra1[j] = r1; if(j>1) ra1[j] = -r1;
1482 0 : AnglesForRoundedCorners(x0,y0,ra0[j],x1,y1,ra1[j],t0[j],t1[j]);
1483 0 : xa0[j] = TMath::Abs(r0)*CosD(t0[j])+x0;
1484 0 : ya0[j] = TMath::Abs(r0)*SinD(t0[j])+y0;
1485 0 : xa1[j] = TMath::Abs(r1)*CosD(t1[j])+x1;
1486 0 : ya1[j] = TMath::Abs(r1)*SinD(t1[j])+y1;
1487 : } // end for j
1488 0 : if(r0<0.0) r0 = -r0;
1489 0 : if(r1<0.0) r1 = -r1;
1490 0 : xmin = TMath::Min(x0 - r0,x1-r1);
1491 0 : ymin = TMath::Min(y0 - r0,y1-r1);
1492 0 : xmax = TMath::Max(x0 + r0,x1+r1);
1493 0 : ymax = TMath::Max(y0 + r0,y1+r1);
1494 0 : for(j=1;j<4;j++) {
1495 0 : xmin = TMath::Min(xmin,xa0[j]);
1496 0 : xmin = TMath::Min(xmin,xa1[j]);
1497 0 : ymin = TMath::Min(ymin,ya0[j]);
1498 0 : ymin = TMath::Min(ymin,ya1[j]);
1499 :
1500 0 : xmax = TMath::Max(xmax,xa0[j]);
1501 0 : xmax = TMath::Max(xmax,xa1[j]);
1502 0 : ymax = TMath::Max(ymax,ya0[j]);
1503 0 : ymax = TMath::Max(ymax,ya1[j]);
1504 : } // end for j
1505 0 : if(xmin<0.0) xmin *= 1.1; else xmin *= 0.9;
1506 0 : if(ymin<0.0) ymin *= 1.1; else ymin *= 0.9;
1507 0 : if(xmax<0.0) xmax *= 0.9; else xmax *= 1.1;
1508 0 : if(ymax<0.0) ymax *= 0.9; else ymax *= 1.1;
1509 0 : j = (Int_t)(500.0*(ymax-ymin)/(xmax-xmin));
1510 0 : TCanvas *can = new TCanvas("AliITSv11Geometry_AnglesForRoundedCorners",
1511 : "Figure for AliITSv11Geometry",500,j);
1512 0 : h = ymax-ymin; if(h<0) h = -h;
1513 0 : can->Range(xmin,ymin,xmax,ymax);
1514 0 : TArc *c0 = new TArc(x0,y0,r0);
1515 0 : TArc *c1 = new TArc(x1,y1,r1);
1516 0 : TLine *line[4];
1517 0 : TArrow *ar0[4];
1518 0 : TArrow *ar1[4];
1519 0 : for(j=0;j<4;j++){
1520 0 : ar0[j] = new TArrow(x0,y0,xa0[j],ya0[j]);
1521 0 : ar1[j] = new TArrow(x1,y1,xa1[j],ya1[j]);
1522 0 : line[j] = new TLine(xa0[j],ya0[j],xa1[j],ya1[j]);
1523 0 : ar0[j]->SetLineColor(j+1);
1524 0 : ar0[j]->SetArrowSize(0.1*r0/h);
1525 0 : ar1[j]->SetLineColor(j+1);
1526 0 : ar1[j]->SetArrowSize(0.1*r1/h);
1527 0 : line[j]->SetLineColor(j+1);
1528 : } // end for j
1529 0 : c0->Draw();
1530 0 : c1->Draw();
1531 0 : for(j=0;j<4;j++){
1532 0 : ar0[j]->Draw();
1533 0 : ar1[j]->Draw();
1534 0 : line[j]->Draw();
1535 : } // end for j
1536 0 : TText *t = new TText();
1537 0 : t->SetTextSize(0.02);
1538 0 : Char_t txt[100];
1539 0 : snprintf(txt,99,"(x0=%5.2f,y0=%5.2f)",x0,y0);
1540 0 : t->DrawText(x0,y0,txt);
1541 0 : snprintf(txt,99,"(x1=%5.2f,y1=%5.2f)",x1,y1);
1542 0 : for(j=0;j<4;j++) {
1543 0 : t->SetTextColor(j+1);
1544 0 : t->DrawText(x1,y1,txt);
1545 0 : snprintf(txt,99,"r0=%5.2f",ra0[j]);
1546 0 : t->DrawText(0.5*(x0+xa0[j]),0.5*(y0+ya0[j]),txt);
1547 0 : snprintf(txt,99,"r1=%5.2f",ra1[j]);
1548 0 : t->DrawText(0.5*(x1+xa1[j]),0.5*(y1+ya1[j]),txt);
1549 : } // end for j
1550 0 : }
|