]> git.uio.no Git - u/mrichter/AliRoot.git/blob - GEANT321/ggeom/ginpco.F
Minor corrections after big transformer changes
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / ginpco.F
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 GINPCO(X,P,IYES)
13 C.
14 C.    ******************************************************************
15 C.    *                                                                *
16 C.    *    ROUTINE TO PERFORM GINME FUNCTION FOR A POLYCONE.           *
17 C.    *        X  -  A VECTOR DIMENSION 3 GIVING THE POINT.            *
18 C.    *        P  -  THE VECTOR OF PARAMETERS, (1) = PHIMIN,           *
19 C.    *                   (2) = DPHI, (3) = NZ, (4) = Z(1),            *
20 C.    *                   (5) = RMIN(1), (6) = RMAX(1), (7) = Z(2),    *
21 C.    *                   (8) = RMIN(2), (9) = RMAX(2), ETC.           *
22 C.    *     IYES  -  RETURNED AS 1 IF POINT IS INSIDE, OTHERWISE 0.    *
23 C.    *                                                                *
24 C.    *    ==>Called by : GINME                                        *
25 C.    *         Author  A.McPherson  *********                         *
26 C.    *                                                                *
27 C.    ******************************************************************
28 C.
29 #include "geant321/gconsp.inc"
30 #include "geant321/gcpoly.inc"
31       DIMENSION P(9),X(3)
32 C.
33 C.                ---------------------------------
34 C.
35       IYES=0
36 C
37 C                 FIRST CHECK TOTAL Z RANGE.
38 C
39       NZ=P(3)
40       IF(X(3).LT.P(4).OR.X(3).GT.P(NZ*3+1)) GO TO 999
41 C
42 C                 NOW CHECK R(SQUARED). FIRST COMPUTE IT.
43 C
44       R2=X(1)*X(1)+X(2)*X(2)
45 C
46 C                 NOW FIND WHICH Z SECTION THE POINT IS IN.
47 C
48       IZL=1
49       IZH=NZ
50       IZT=(NZ+1)/2
51       IPL=IZL*3+1
52       IPH=IZH*3+1
53       IPT=IZT*3+1
54 C
55    10 CONTINUE
56       IF(IZH-IZL.LE.1) GO TO 40
57 C
58       IF(X(3).GT.P(IPT)) GO TO 20
59 C
60       IZH=IZT
61       IPH=IPT
62 C
63       GO TO 30
64 C
65    20 CONTINUE
66 C
67       IZL=IZT
68       IPL=IPT
69 C
70    30 CONTINUE
71 C
72       IZT=(IZL+IZH)/2
73       IPT=IZT*3+1
74 C
75       GO TO 10
76 C
77    40 CONTINUE
78 C
79 C          THE POINT IS IN THE SECTION BOUNDED BY THE IZL TH AND THE
80 C          IZH TH Z VALUES.
81 C
82 C          NOW COMPUTE RMIN AND RMAX AND TEST THE VALUE OF R SQUARED.
83 C
84       IZSEC=IZH
85       IF (P(IPL+2).EQ.0..AND.P(IPH+2).EQ.0.) GO TO 999
86 C
87       IF ( (P(IPH).EQ.P(IPL)) .AND. (X(3).EQ.P(IPL)) ) THEN
88          RMN = MAX( P(IPL+1), P(IPH+1) )
89          RMX = MIN( P(IPL+2), P(IPH+2) )
90       ELSE
91          DZ=P(IPH)-P(IPL)
92          DZ1=X(3)-P(IPL)
93          RMN=(P(IPL+1)*(DZ-DZ1)+P(IPH+1)*DZ1)/DZ
94          RMX=(P(IPL+2)*(DZ-DZ1)+P(IPH+2)*DZ1)/DZ
95       END IF
96 C
97       IF(R2.LT.RMN*RMN.OR.R2.GT.RMX*RMX) GO TO 999
98 C
99 C                 NOW CHECK PHI.
100 C
101       PHI=P(1)+P(2)*0.5
102       IF(X(2).NE.0.0.OR.X(1).NE.0) PHI=ATAN2(X(2),X(1))*RADDEG
103       IF(PHI.LT.P(1)) PHI=PHI+360.0
104       IF(PHI.LT.P(1).OR.PHI-P(1).GT.P(2)) GO TO 999
105 C
106 C           POINT IS IN POLYCONE.
107 C
108       IYES=1
109 C
110   999 CONTINUE
111       END