]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/ggeom/ginpgo.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / ginpgo.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1995/10/24 10:20:50 cernlib
6* Geant
7*
8*
9#include "geant321/pilot.h"
10*CMZ : 3.21/02 29/03/94 15.41.29 by S.Giani
11*-- Author :
12 SUBROUTINE GINPGO(X,P,IYES)
13C.
14C. ******************************************************************
15C. * *
16C. * ROUTINE TO PERFORM GINME FUNCTION FOR A POLYGON. *
17C. * X - A VECTOR DIMENSION 3 GIVING THE POINT. *
18C. * P - THE VECTOR OF PARAMETERS, (1) = PHIMIN, *
19C. * (2) = DPHI, (3) = NDIV, (4) = NZ, (5) = Z(1) *
20C. * (6) = RMIN(1), (7) = RMAX(1), (8) = Z(2), *
21C. * (9) = RMIN(2), (10) = RMAX(2), ETC. *
22C. * RMIN IS THE DISTANCE FROM THE ORIGIN TO THE *
23C. * INSIDE EDGE PROJECTED ALONG THE CENTRE LINE *
24C. * OF THE DIVISION. RMAX IS THE CORRESPONDING *
25C. * PROJECTED DISTANCE FOR THE OUTER EDGE. *
26C. * IYES - RETURNED AS 1 IF POINT IS INSIDE, OTHERWISE 0. *
27C. * *
28C. * ==>Called by : GINME *
29C. * Author A.McPherson ********* *
30C. * *
31C. ******************************************************************
32C.
33#include "geant321/gconsp.inc"
34#include "geant321/gcpoly.inc"
35#if !defined(CERNLIB_SINGLE)
36 DOUBLE PRECISION XX1,XX2,PHI,DELPHI,PH0,R,DZRAT,DIVPHI
37 DOUBLE PRECISION RMN,RMX,HNDIV
38#endif
39 DIMENSION P(10),X(3)
40C.
41C. ---------------------------------
42C.
43 IYES=0
44C
45C FIRST CHECK TOTAL Z RANGE.
46C
47 NZ=P(4)
48 IF(X(3).LT.P(5).OR.X(3).GT.P(NZ*3+2)) GO TO 999
49C
50C Find smallest RMIN and largest RMAX
51C
52 RMIN=P(6)
53 RMAX=P(7)
54 DO 10 I=2,NZ
55 IP=I*3+3
56 IF(P(IP).LT.RMIN)RMIN=P(IP)
57 IF(P(IP+1).GT.RMAX) RMAX=P(IP+1)
58 10 CONTINUE
59*
60* *** Check R against RMIN
61*
62 XX1 = X(1)
63 XX2 = X(2)
64 R = SQRT(XX1**2+XX2**2)
65 IF(R.LT.RMIN)GO TO 999
66 HNDIV=P(3)
67 DELPHI=P(2)
68 DIVPHI=DELPHI/HNDIV
69*
70* *** Find the radius of the outscribed circle
71*
72 RMAX = RMAX/COS(0.5*DIVPHI*DEGRAD)
73*
74* *** Check R against RMAX
75*
76 IF(R.GT.RMAX)GO TO 999
77C
78C If R sufficiently small ignore phi structure.
79C
80 IPSEC=1
81C
82 IF(R.LT.1.0E-5) GO TO 20
83C
84C NOW CHECK PHI.
85C
86 PHI=ATAN2(XX2,XX1)*RADDEG
87 IF(PHI.LT.P(1)) PHI=PHI+360.0
88 IF(PHI.LT.P(1).OR.PHI-P(1).GT.P(2)) GO TO 999
89C
90C NOW FIND PHI DIVISION.
91C
92 IPSEC=MIN((PHI-P(1))/DIVPHI+1.,HNDIV)
93C
94 PH0=(P(1)+DIVPHI*(IPSEC-0.5))*DEGRAD
95C
96C NOW CHECK PROJECTED DISTANCE. FIRST COMPUTE IT.
97C
98 R=XX1*COS(PH0)+XX2*SIN(PH0)
99C
100 20 CONTINUE
101C
102C NOW FIND WHICH Z SECTION THE POINT IS IN.
103C
104 IZL=1
105 IZH=NZ
106 IPL=IZL*3+2
107 IPH=IZH*3+2
108C
109 30 IF(IZH-IZL.GT.1) THEN
110C
111 IZT=(IZL+IZH)/2
112 IPT=IZT*3+2
113 IF(X(3).LE.P(IPT)) THEN
114C
115 IZH=IZT
116 IPH=IPT
117 ELSE
118C
119 IZL=IZT
120 IPL=IPT
121 ENDIF
122C
123 GO TO 30
124 ENDIF
125C
126C THE POINT IS IN THE SECTION BOUNDED BY THE IZL TH AND THE
127C IZH TH Z VALUES.
128C
129C NOW COMPUTE RMIN AND RMAX AND TEST THE VALUE OF R .
130C
131 IZSEC=IZL
132 DZRAT=X(3)-P(IPL)
133 DZRAT=DZRAT/(P(IPH)-P(IPL))
134 RMN=P(IPL+1)+DZRAT*(P(IPH+1)-P(IPL+1))
135*
136* *** Is the point inside the 'hole' at the centre of the volume?
137*
138 IF(R.LT.RMN) GO TO 999
139*
140 RMX=P(IPL+2)+DZRAT*(P(IPH+2)-P(IPL+2))
141*
142* *** Is the point outside the volume?
143*
144 IF(R.GT.RMX) GO TO 999
145C
146C POINT IS IN POLYGON.
147C
148 IYES=1
149C
150 999 END