]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/ggeom/gnotra.F
Allow any Cherenkov-like particle to be transported
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gnotra.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1995/10/24 10:20:53 cernlib
6* Geant
7*
8*
9#include "geant321/pilot.h"
10*CMZ : 3.21/02 29/03/94 15.41.30 by S.Giani
11*-- Author :
12 SUBROUTINE GNOTRA (X, PAR, IACT, IFLAG, SNEXT, SNXT, SAFE)
13C.
14C. ******************************************************************
15C. * *
16C. * COMPUTE DISTANCE UP TO INTERSECTION WITH 'TRD1' OR 'TRD2' *
17C. * VOLUME, FROM OUTSIDE POINT X(1-3) ALONG DIRECTION X(4-6) *
18C. * *
19C. * PAR (input) : volume parameters *
20C. * IACT (input) : action flag *
21C. * = 0 Compute SAFE only *
22C. * = 1 Compute SAFE, and SNXT only if SNEXT .GT.new SAFE *
23C. * = 2 Compute both SAFE and SNXT *
24C. * = 3 Compute SNXT only *
25C. * IFLAG (input) : = 1 for TRD1, 2 for TRD2 *
26C. * SNEXT (input) : see IACT = 1 *
27C. * SNXT (output) : distance to volume boundary *
28C. * SAFE (output) : shortest distance to any boundary *
29C. * *
30C. * ==>Called by : GNEXT, GTNEXT *
31C. * Author A.McPherson, P.Weidhaas ********* *
32C. * *
33C. ******************************************************************
34C.
35#include "geant321/gconsp.inc"
36 DIMENSION X(6),PAR(5)
37C.
38C. ----------------------------------------------------------------
39C.
40
41 SNXT = BIG
42 IF (IFLAG .EQ. 1) THEN
43 FACTX = (PAR(2) - PAR(1)) / (2.0*PAR(4))
44 ELSEIF (IFLAG .EQ. 2) THEN
45 FACTX = (PAR(2) - PAR(1)) / (2.0*PAR(5))
46 FACTY = (PAR(4) - PAR(3)) / (2.0*PAR(5))
47 ENDIF
48
49 IF (IACT .LT. 3) THEN
50
51C -------------------------------------------------
52C | Compute safety-distance 'SAFE' (P.Weidhaas) |
53C -------------------------------------------------
54
55 IF (IFLAG .EQ. 1) THEN
56C*******************************************************
57C
58C...... Shape "TRD1": only x varies with z.
59C
60C*******************************************************
61
62 SAF2 = MAX (ABS(X(2)) - PAR(3), 0.0)
63 SAF3 = MAX (ABS(X(3)) - PAR(4), 0.0)
64C
65C...... Distance along x-direction to slanted wall.
66C
67 DISTX = PAR(1) + FACTX * (PAR(4) + X(3))
68 IF (ABS(X(1)) .GT. DISTX) THEN
69 SAF1 = (ABS(X(1)) - DISTX) / SQRT(1.0 + FACTX*FACTX)
70 ELSE
71 SAF1 = 0.0
72 ENDIF
73
74
75 ELSE
76C*******************************************************
77C
78C...... Shape "TRD2": both x and y vary with z.
79C
80C*******************************************************
81
82 SAF3 = MAX (ABS(X(3)) - PAR(5), 0.0)
83
84C
85C...... Distance along x-direction to slanted wall.
86C
87 DISTX = PAR(1) + FACTX * (PAR(5) + X(3))
88 IF (ABS(X(1)) .GT. DISTX) THEN
89 SAF1 = (ABS(X(1)) - DISTX) / SQRT(1.0 + FACTX*FACTX)
90 ELSE
91 SAF1 = 0.0
92 ENDIF
93C
94C...... Distance along y-direction to slanted wall.
95C
96 DISTY = PAR(3) + FACTY * (PAR(5) + X(3))
97 IF (ABS(X(2)) .GT. DISTY) THEN
98 SAF2 = (ABS(X(2)) - DISTY) / SQRT(1.0 + FACTY*FACTY)
99 ELSE
100 SAF2 = 0.0
101 ENDIF
102
103 ENDIF
104
105 SAFE = MAX (SAF1, SAF2, SAF3)
106
107 IF (IACT .EQ. 0) GO TO 999
108 IF (IACT .EQ. 1) THEN
109 IF (SNEXT .LT. SAFE) GO TO 999
110 ENDIF
111 ENDIF
112
113
114C ------------------------------------------------
115C | Compute vector-distance 'SNXT' (McPherson) |
116C ------------------------------------------------
117
118
119C
120C Only x varies with z.
121C
122 IF(IFLAG.NE.1) GO TO 50
123 S3=PAR(4)
124 FACTX = (PAR(2) - PAR(1)) / (2.0*S3)
125 S1 = 0.5 * (PAR(1) + PAR(2)) + FACTX * X(3)
126 DS11=X(4) - FACTX * X(6)
127 DS12=X(4) + FACTX * X(6)
128 S2=PAR(3)
129 DS21=X(5)
130 DS22=X(5)
131 GO TO 60
132C
133C Both x and y widths vary with z.
134C
135 50 CONTINUE
136 S3=PAR(5)
137 FACTX = (PAR(2) - PAR(1)) / (2.0*S3)
138 FACTY = (PAR(4) - PAR(3)) / (2.0*S3)
139 S1 = 0.5 * (PAR(1) + PAR(2)) + FACTX * X(3)
140 DS11=X(4) - FACTX * X(6)
141 DS12=X(4) + FACTX * X(6)
142 S2 = 0.5 * (PAR(3) + PAR(4)) + FACTY * X(3)
143 DS21=X(5) - FACTY * X(6)
144 DS22=X(5) + FACTY * X(6)
145
146C
147C FIRST DO THE Z COORDINATE.
148C
149 60 SMAX=9.0E+10
150 SMIN=0.0
151 IF(X(6).EQ.0.0.AND.S3.LT.ABS(X(3))) GO TO 999
152 IF(X(6).EQ.0.0) GO TO 70
153 SMIN=(S3-X(3))/X(6)
154 SMAX=(-S3-X(3))/X(6)
155 IF(SMAX.GT.SMIN) GO TO 70
156 SN=SMAX
157 SMAX=SMIN
158 SMIN=SN
159C
160 70 IF(SMIN.LT.0.0) SMIN=0.0
161 IF(SMAX.LT.SMIN) GO TO 999
162C
163C NOW DO X COORDINATE.
164C
165 SS1=S1-X(1)
166 SS2=-S1-X(1)
167 SN1=-1.0
168 SN2=SMAX
169*
170 IF(SS1.LT.0.0) SN1=SMAX
171 IF(SS2.GT.0.0) SN2=-1.0
172*
173 IF(DS11.NE.0.0) SN1=SS1/DS11
174 IF(DS12.NE.0.0) SN2=SS2/DS12
175 IF(DS12*DS11.EQ.0.0) GO TO 90
176 IF(DS12.LT.0.0.AND.DS11.LT.0.0) GO TO 110
177 ST=SN2
178 SN2=SN1
179 SN1=ST
180 IF(DS12.GT.0.0.AND.DS11.GT.0.0) GO TO 110
181 IF(DS12.LT.0.0) GO TO 80
182 IF(SN2.GT.SN1) SN1=SN2
183 SN2=SMAX
184 GO TO 110
185C
186 80 CONTINUE
187C
188 IF(SN2.GT.SN1) SN2=SN1
189 SN1=0.0
190 GO TO 110
191C
192 90 CONTINUE
193C
194 IF(DS12.EQ.0.0.AND.SS2.GT.0.0) GO TO 999
195 IF(DS12.EQ.0.0.AND.DS11.LT.0.0) GO TO 110
196 IF(DS11.EQ.0.0.AND.SS1.LT.0.0) GO TO 999
197 IF(DS11.EQ.0.0.AND.DS12.LE.0.0) GO TO 110
198 IF(DS11.EQ.0.0) GO TO 100
199 SN2=SN1
200 SN1=0.0
201 GO TO 110
202C
203 100 CONTINUE
204 SN1=SN2
205 SN2=SMAX
206C
207 110 CONTINUE
208C
209 IF(SN1.GT.SMIN) SMIN=SN1
210 IF(SN2.LT.SMAX) SMAX=SN2
211 IF(SMAX.LE.SMIN) GO TO 999
212C
213C NOW DO Y COORDINATE.
214C
215 SS1=S2-X(2)
216 SS2=-S2-X(2)
217 SN1=-1.0
218 SN2=SMAX
219*
220 IF(SS1.LT.0.0) SN1=SMAX
221 IF(SS2.GT.0.0) SN2=-1.0
222*
223 IF(DS21.NE.0.0) SN1=SS1/DS21
224 IF(DS22.NE.0.0) SN2=SS2/DS22
225 IF(DS22*DS21.EQ.0.0) GO TO 130
226 IF(DS22.LT.0.0.AND.DS21.LT.0.0) GO TO 150
227 ST=SN2
228 SN2=SN1
229 SN1=ST
230 IF(DS22.GT.0.0.AND.DS21.GT.0.0) GO TO 150
231 IF(DS22.LT.0.0) GO TO 120
232 IF(SN2.GT.SN1) SN1=SN2
233 SN2=SMAX
234 GO TO 150
235C
236 120 CONTINUE
237C
238 IF(SN2.GT.SN1) SN2=SN1
239 SN1=0.0
240 GO TO 150
241C
242 130 CONTINUE
243C
244 IF(DS22.EQ.0.0.AND.SS2.GT.0.0) GO TO 999
245 IF(DS22.EQ.0.0.AND.DS21.LT.0.0) GO TO 150
246 IF(DS21.EQ.0.0.AND.SS1.LT.0.0) GO TO 999
247 IF(DS21.EQ.0.0.AND.DS22.LE.0.0) GO TO 150
248 IF(DS21.EQ.0.0) GO TO 140
249 SN2=SN1
250 SN1=0.0
251 GO TO 150
252C
253 140 CONTINUE
254 SN1=SN2
255 SN2=SMAX
256C
257 150 CONTINUE
258C
259 IF(SN1.GT.SMIN) SMIN=SN1
260 IF(SN2.LT.SMAX) SMAX=SN2
261C
262 IF(SMAX.LE.SMIN) GO TO 999
263 IF(SMIN.LE.0.)GO TO 999
264 SNXT = SMIN
265
266 999 CONTINUE
267 END