]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/ggeom/gvdphi.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gvdphi.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
d43b40e2 5* Revision 1.1.1.1 1999/05/18 15:55:17 fca
6* AliRoot sources
7*
fe4da5cc 8* Revision 1.1.1.1 1995/10/24 10:20:57 cernlib
9* Geant
10*
11*
12#include "geant321/pilot.h"
13*CMZ : 3.21/04 02/03/95 11.58.00 by S.Giani
14*-- Author :
15 SUBROUTINE GVDPHI(ISH,IROT,DX,PARS,CL,CH,IERR)
16C.
17C. **********************************************************
18C. * *
19C. * ROUTINE TO FIND THE PHI LIMITS OF THE OBJECT SHAPE *
20C. * ISH ROTATED BY MATRIX IROT AND DISPLACED BY VECTOR *
21C. * DX. IT HAS NPAR PARAMTERS IN THE ARRAY PARS. THE *
22C. * LOWER LIMIT IS RETURNED IN CL AND THE HIGHER IN CH. *
23C. * NOTE THE OBJECT IS CONTAINED IN THE RANGE OF *
24C. * INCREASING PHI FROM CL TO CH THOUGH CL AND CH ARE *
25C. * FORCED TO LIE IN THE RANGE 0.0 TO 360.0 SO THAT THE *
26C. * VALUE OF CL CAN BE HIGHER THAN THAT OF CH. *
27C. * *
28C. * ==>Called by : GVDLIM modified *
29C. * Author S.Giani ********* *
30C. * *
31C. **********************************************************
32C.
33#include "geant321/gcbank.inc"
34#include "geant321/gconsp.inc"
35#include "geant321/gcshno.inc"
d43b40e2 36 DIMENSION DX(3),PARS(100),X(3),XT(3)
fe4da5cc 37C.
38C. -------------------------------------------
39C.
40 IERR=1
41C
42 DXS=DX(1)*DX(1)+DX(2)*DX(2)
43 IF(DXS.GT.0.0) DXS=SQRT(DXS)
44C
45 IF(ISH.GT.4.AND.ISH.NE.10.AND.ISH.NE.28) GO TO 40
46C
47C
48C CUBOIDS, TRAPEZOIDS, PARALLELEPIPEDS.
49C
50 IERR=0
51 CL=0.0
52 CH=360.0
53C
54C IF IN DOUBT SET IT TO FULL RANGE.
55C
56 IF(DXS.LE.0.0) GO TO 999
57C
58 PHC=90.
59 IF(DX(1).NE.0.)PHC=ATAN2(DX(2),DX(1))*RADDEG
60 IF(DX(1).EQ.0..AND.DX(2).LT.0.)PHC=-90.
61 IF(PHC.LT.0.0) PHC=PHC+360
62 PL=0.0
63 PH=0.0
64C
65 DO 30 IP=1,8
66C
67C THIS IS A LOOP OVER THE 8 CORNERS.
68C FIRST FIND THE LOCAL COORDINATES.
69C
70 IF(ISH.EQ.28) THEN
71C
72C General twisted trapezoid.
73C
74 IL=(IP+1)/2
75 I0=IL*4+11
76 IS=(IP-IL*2)*2+1
77 X(3)=PARS(1)*IS
78 X(1)=PARS(I0)+PARS(I0+2)*X(3)
79 X(2)=PARS(I0+1)+PARS(I0+3)*X(3)
80 GO TO 20
81C
82 ENDIF
83C
84 IP3=ISH+2
85 IF(ISH.EQ.10) IP3=3
86 IF(ISH.EQ.4) IP3=1
87 X(3)=PARS(IP3)
88 IF(IP.LE.4) X(3)=-X(3)
89 IP2=3
90 IF(ISH.GT.2.AND.X(3).GT.0.0) IP2=4
91 IF(ISH.EQ.1.OR.ISH.EQ.10) IP2=2
92 IF(ISH.EQ.4) IP2=4
93 IF(ISH.EQ.4.AND.X(3).GT.0.0) IP2=8
94 X(2)=PARS(IP2)
95 IF(MOD(IP+3,4).LT.2) X(2)=-X(2)
96 IP1=1
97 IF(ISH.NE.1.AND.ISH.NE.10.AND.X(3).GT.0.0) IP1=2
98 IF(ISH.EQ.4) IP1=5
99 IF(ISH.EQ.4.AND.X(3).GT.0.0) IP1=IP1+4
100 IF(ISH.EQ.4.AND.X(2).GT.0.0) IP1=IP1+1
101 X(1)=PARS(IP1)
102 IF(MOD(IP,2).EQ.1) X(1)=-X(1)
103C
104 IF(ISH.NE.10) GO TO 10
105 X(1)=X(1)+X(2)*PARS(4)+X(3)*PARS(5)
106 X(2)=X(2)+X(3)*PARS(6)
107 10 CONTINUE
108C
109 IF(ISH.NE.4) GO TO 20
110 IP4=7
111 IF(X(3).GT.0.0) IP4=11
112 X(1)=X(1)+X(2)*PARS(IP4)+X(3)*PARS(2)
113 X(2)=X(2)+X(3)*PARS(3)
114 20 CONTINUE
115C
116C ROTATE.
117C
118 JROT=LQ(JROTM-IROT)
119 XT(1)=X(1)
120 XT(2)=X(2)
121 XT(3)=X(3)
122 IF(IROT.NE.0) CALL GINROT(X,Q(JROT+1),XT)
123C
124 XPT=DXS+(DX(1)*XT(1)+DX(2)*XT(2))/DXS
125 YPT=(DX(1)*XT(2)-DX(2)*XT(1))/DXS
126C
127 IF(YPT.EQ.0.0.AND.XPT.EQ.0.0) GO TO 999
128 P=ATAN2(YPT,XPT)
129 IF(P.GT.PI) P=P-PI*2.0
130 IF(P.LT.PL) PL=P
131 IF(P.GT.PH) PH=P
132C
133C
134 30 CONTINUE
135C
136C
137 IF(PH-PL.GT.PI) GO TO 999
138 CL=PHC+PL*RADDEG
139 CH=PHC+PH*RADDEG
140C
141*** SG = SIGN(1.0,CL)
142*** CL = MOD( ABS(CL),360.0 )
143*** IF(SG.LE.0.0) CL=360.-CL
144*** SG=SIGN(1.0,CH)
145*** CH = MOD( ABS(CH),360.0 )
146*** IF(SG.LE.0.0) CH=360.-CH
147C
148 GO TO 999
149C
150 40 CONTINUE
151 MYFLAG=0
152 IF(ISH.EQ.11)THEN
153 NZLAST=PARS(4)
154 IZLAST=2+3*NZLAST
155 CLZ=PARS(5)
156 CHZ=PARS(IZLAST)
157 DZ2=ABS(CHZ-CLZ)
158 DZ=DZ2*.5
159 TMPRAD=0.
160 TMPMIN=100000.
161 DO 145 I=7,IZLAST+2,3
162 IF(PARS(I).GT.TMPRAD)TMPRAD=PARS(I)
163 IF(PARS(I-1).LT.TMPMIN)TMPMIN=PARS(I-1)
164 145 CONTINUE
165 RLOW=TMPMIN
166 PHIMIN=PARS(1)
167 PHIMAX=PHIMIN+PARS(2)
168 AANG=ABS(PHIMAX-PHIMIN)
169 NANG=PARS(3)
170 AATMAX=NANG*360./AANG
171 LATMAX=AATMAX
172 ALA=AATMAX-LATMAX
173 IF(ALA.GT..5)LATMAX=LATMAX+1
174 AFINV=1./COS(PI/LATMAX)
175 FINV=ABS(AFINV)
176 RM=TMPRAD*FINV
177 IF(PARS(2).EQ.360)THEN
178 MYFLAG=5
179 ELSE
180 PHIMIN=PARS(1)*DEGRAD
181 PHIMAX=(PARS(1)+PARS(2))*DEGRAD
182 MYFLAG=6
183 ENDIF
184 ELSEIF(ISH.EQ.12)THEN
185 NZLAST=PARS(3)
186 IZLAST=1+3*NZLAST
187 CLZ=PARS(4)
188 CHZ=PARS(IZLAST)
189 DZ2=ABS(CHZ-CLZ)
190 DZ=DZ2*.5
191 TMPRAD=0.
192 TMPMIN=100000.
193 DO 146 I=6,IZLAST+2,3
194 IF(PARS(I).GT.TMPRAD)TMPRAD=PARS(I)
195 IF(PARS(I-1).LT.TMPMIN)TMPMIN=PARS(I-1)
196 146 CONTINUE
197 RM=TMPRAD
198 RLOW=TMPMIN
199 IF(PARS(2).EQ.360)THEN
200 MYFLAG=5
201 ELSE
202 PHIMIN=PARS(1)*DEGRAD
203 PHIMAX=(PARS(1)+PARS(2))*DEGRAD
204 MYFLAG=6
205 ENDIF
206 ELSEIF(ISH.GT.8.AND.ISH.NE.NSCTUB.AND.ISH.NE.13.AND.ISH.NE.14)THEN
207 GO TO 80
208 ENDIF
209C
210C TUBES AND CONES.
211C
212 IERR=0
213 CL=0.0
214 CH=360.0
215C
216C WHEN IN DOUBT SET TO FULL RANGE.
217C
218 IF(MYFLAG.EQ.0)RM=PARS(2)
219 IF(ISH.LE.6.OR.ISH.EQ.NSCTUB.OR.MYFLAG.NE.0) GO TO 50
220**
221 IF(ISH.EQ.13) THEN
222**
223** approxime to a cylinder whit radius
224** equal to the ellipse major axis
225**
226 IF(PARS(1).GT.RM) RM=PARS(1)
227 GOTO 50
228 ENDIF
229 IF(ISH.EQ.14) THEN
230 RM = SQRT(PARS(2)**2+(PARS(3)*TAN(PARS(4)*DEGRAD))**2)
231 GO TO 50
232 ENDIF
233 RM=PARS(3)
234 IF(PARS(5).GT.RM) RM=PARS(5)
235C
236 50 CONTINUE
237C
238 IF(DXS.GT.RM) GO TO 70
239 IF(ISH.EQ.5.OR.ISH.EQ.7.OR.ISH.EQ.14.OR.MYFLAG.EQ.5) GO TO 999
240 IF(ISH.EQ.13) GOTO 999
241* Here we treat the CONS and TUBS
242* This is the simple case, no rotation
243* Compute the position of the limits on
244* the X-Y plane.
245 IF(MYFLAG.EQ.0.AND.ISH.LE.6)THEN
246 PHIMIN=PARS(4)*DEGRAD
247 PHIMAX=PARS(5)*DEGRAD
248 RLOW=PARS(1)
249 ELSEIF(MYFLAG.EQ.0.AND.ISH.EQ.8)THEN
250 PHIMIN=PARS(6)*DEGRAD
251 PHIMAX=PARS(7)*DEGRAD
252 RLOW=MIN(PARS(2),PARS(4))
253 ENDIF
254 CL=PHIMIN*RADDEG
255 CH=PHIMAX*RADDEG
256 IF(DXS.NE.0.)THEN
257 DDX1 = DX(1)+RM*COS(PHIMIN)
258 DDY1 = DX(2)+RM*SIN(PHIMIN)
259 DDX2 = DX(1)+RM*COS(PHIMAX)
260 DDY2 = DX(2)+RM*SIN(PHIMAX)
261 CLA = ATAN2(DDY1,DDX1)*RADDEG
262 CHA = ATAN2(DDY2,DDX2)*RADDEG
263 DDX1 = DX(1)+RLOW*COS(PHIMIN)
264 DDY1 = DX(2)+RLOW*SIN(PHIMIN)
265 DDX2 = DX(1)+RLOW*COS(PHIMAX)
266 DDY2 = DX(2)+RLOW*SIN(PHIMAX)
267 CLB = ATAN2(DDY1,DDX1)*RADDEG
268 CHB = ATAN2(DDY2,DDX2)*RADDEG
269 CL=MIN(CLA,CLB,CHA,CHB)
270 CH=MAX(CLA,CLB,CHA,CHB)
271 IF((CH-CL).GT.(PHIMAX-PHIMIN)*RADDEG)THEN
272 IF(ISH.EQ.6.OR.ISH.EQ.8.OR.MYFLAG.EQ.6)THEN
273 IF(DXS.GT.RLOW)THEN
274 CL=0.
275 CH=360.
276 ENDIF
277 ELSE
278 CL=0.
279 CH=360.
280 ENDIF
281 ENDIF
282 ENDIF
283C
284 60 CONTINUE
285C
286 IF(IROT.EQ.0) GO TO 65
287 IF(CL.EQ.0..AND.CH.EQ.360.)GOTO 65
288 JROT=LQ(JROTM-IROT)
289 IF(Q(JROT+15).NE.0.0.AND.Q(JROT+15).NE.180.0)THEN
290 CL=0.
291 CH=360.
292 GO TO 999
293 ENDIF
294C
295 PHX=Q(JROT+12)
296 PHY=Q(JROT+14)
297 IF(PHY.LT.PHX) PHY=PHY+360.0
298 ISPH=1
299 IF(PHY-PHX.GT.180.0) ISPH=-1
300 IF(DXS.NE.0.)THEN
301 PHI1 = ISPH*PHIMIN+PHX*DEGRAD
302 PHI2 = ISPH*PHIMAX+PHX*DEGRAD
303 DDX1 = DX(1)+RM*COS(PHI1)
304 DDY1 = DX(2)+RM*SIN(PHI1)
305 DDX2 = DX(1)+RM*COS(PHI2)
306 DDY2 = DX(2)+RM*SIN(PHI2)
307 CLA = ATAN2(DDY1,DDX1)*RADDEG
308 CHA = ATAN2(DDY2,DDX2)*RADDEG
309 DDX1 = DX(1)+RLOW*COS(PHI1)
310 DDY1 = DX(2)+RLOW*SIN(PHI1)
311 DDX2 = DX(1)+RLOW*COS(PHI2)
312 DDY2 = DX(2)+RLOW*SIN(PHI2)
313 CLB = ATAN2(DDY1,DDX1)*RADDEG
314 CHB = ATAN2(DDY2,DDX2)*RADDEG
315 CL=MIN(CLA,CLB,CHA,CHB)
316 CH=MAX(CLA,CLB,CHA,CHB)
317 ELSE
318 CL=ISPH*CL+PHX
319 CH=ISPH*CH+PHX
320 ENDIF
321 IF(ISPH.EQ.1) GO TO 65
322 CHT=CH
323 CH=CL
324 CL=CHT
325C
326 65 CONTINUE
327C
328*** SG=SIGN(1.0,CL)
329*** CL = MOD( ABS(CL),360.0 )
330*** IF(SG.LE.0.0) CL=360.-CL
331*** SG=SIGN(1.0,CH)
332*** CH = MOD( ABS(CH),360.0 )
333*** IF(SG.LE.0.0) CH=360.-CH
334C
335 GO TO 999
336C
337 70 CONTINUE
338C
339C DISPLACEMENT GREATER THAN MAXIMUM RADIUS SO
340C ASSUME COMPLETE TUBE TO GENERATE 'WORST CASE'.
341C
342 IF(MYFLAG.EQ.0)DZ=PARS(3)
343 IF(ISH.EQ.NSCTUB) THEN
344 S1 = (1.0-PARS(8))*(1.0+PARS(8))
345 IF( S1 .GT. 0.0) S1 = SQRT(S1)
346 S2 = (1.0-PARS(11))*(1.0+PARS(11))
347 IF( S2 .GT. 0.0) S2 = SQRT(S2)
348 IF( S2 .GT. S1 ) S1 = S2
349 DZ = DZ+RM*S1
350 ELSEIF(ISH.GT.6.AND.ISH.NE.13.AND.ISH.NE.14.AND.MYFLAG.EQ.0)THEN
351 DZ=PARS(1)
352 ENDIF
353C
354 X(1)=0.0
355 X(2)=0.0
356 X(3)=1.0
357C
358C LOCAL Z AXIS.
359C
360 JROT=LQ(JROTM-IROT)
361 XT(1)=X(1)
362 XT(2)=X(2)
363 XT(3)=X(3)
364 IF(IROT.NE.0) CALL GINROT(X,Q(JROT+1),XT)
365C
366 COST=ABS(DX(1)*XT(1)+DX(2)*XT(2))
367 COS2=ABS(DX(1)*XT(2)-DX(2)*XT(1))
368 SINT=(DXS+COST)*(DXS-COST)
369 SIN2=(DXS+COS2)*(DXS-COS2)
370 IF(SINT.GT.0.0) SINT=SQRT(SINT)
371 IF(SIN2.GT.0.0) SIN2=SQRT(SIN2)
372C
373 XPT=DXS-(COST*DZ+SINT*RM)/DXS
374C
375 IF(XPT.LE.0.0) GO TO 999
376 YPT=(SIN2*RM+COS2*DZ)/DXS
377 DP=ATAN(YPT/XPT)
378C
379 P0=ATAN2(DX(2),DX(1))
380 CL=(P0-DP)*RADDEG
381 CH=(P0+DP)*RADDEG
382C
383*** SG=SIGN(1.0,CL)
384*** CL = MOD( ABS(CL),360.0 )
385*** IF(SG.LE.0.0) CL=360.-CL
386*** SG=SIGN(1.0,CH)
387*** CH = MOD( ABS(CH),360.0 )
388*** IF(SG.LE.0.0) CH=360.-CH
389C
390 GO TO 999
391C
392 80 CONTINUE
393 IF(ISH.GT.9.AND.MYFLAG.EQ.0) GO TO 999
394C
395C SPHERE.
396C
397 IERR=0
398 CL=0.0
399 CH=360.0
400C
401 IF(IROT.NE.0.OR.DXS.GT.0.0) GO TO 90
402C
403C UNROTATED AND CENTERED.
404C
405 CL=PARS(5)
406 CH=PARS(6)
407C
408*** SG=SIGN(1.0,CL)
409*** CL = MOD( ABS(CL),360.0 )
410*** IF(SG.LE.0.0) CL=360.-CL
411*** SG=SIGN(1.0,CH)
412*** CH = MOD( ABS(CH),360.0 )
413*** IF(SG.LE.0.0) CH=360.-CH
414C
415 GO TO 999
416C
417 90 CONTINUE
418C
419C ROTATED OR NOT CENTERED.
420C
421 IF(DXS.LT.PARS(2)) GO TO 999
422 P0=ATAN2(DX(2),DX(1))
423 DP=ASIN(PARS(2)/DXS)
424 CL=(P0-DP)*RADDEG
425 CH=(P0+DP)*RADDEG
426C
427*** SG=SIGN(1.0,CL)
428*** CL = MOD( ABS(CL),360.0 )
429*** IF(SG.LE.0.0) CL=360.-CL
430*** SG=SIGN(1.0,CH)
431*** CH = MOD( ABS(CH),360.0 )
432*** IF(SG.LE.0.0) CH=360.-CH
433C
434 999 CONTINUE
435 END