5 * Revision 1.1.1.1 1995/10/24 10:21:41 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.23 by S.Giani
13 C. ******************************************************************
17 C. * Selects next track segment to be processed and extracts from *
18 C. * the stack JTRACK the relevant information to reload commons *
20 C. * Called by : GTREVE *
21 C. * Authors : S.Banerjee, F.Bruyant *
23 C. ******************************************************************
25 #include "geant321/gcbank.inc"
26 #include "geant321/gckine.inc"
27 #include "geant321/gcnum.inc"
28 #include "geant321/gconsp.inc"
29 #include "geant321/gcphys.inc"
30 #include "geant321/gcstak.inc"
31 #include "geant321/gctmed.inc"
32 #include "geant321/gctrak.inc"
33 #include "geant321/gcunit.inc"
34 #include "geant321/gcvolu.inc"
35 #include "geant321/gcpoly.inc"
36 #if defined(CERNLIB_USRJMP)
37 #include "geant321/gcjump.inc"
39 REAL XC(3), XT(3), X0(3)
45 DATA IDTYP / 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 2, 3, 1,
46 + 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 4, 3, 1, 1, 1,
48 C. ------------------------------------------------------------------
50 * *** Process next track in 'IN current VOlume' chain, if any
54 * ** Reactivate parallel tracking if enough space available
56 IF (NALIVE.LE.NJTMIN) NJTMAX = -NJTMAX
58 * ** Update common /GCVOLU/ and structure JGPAR if necessary
64 IF (LINDEX(ILEV).EQ.LINSAV(ILEV)) GO TO 9
67 JSKLD = LQ(JSKLT-ILEV)
68 JSKD = LQ(JSKLD-LINSAV(ILEV))
70 LQ(JGPAR-ILEV) = LQ(JSKD-1)
71 IQ(JGPAR+ILEV) = IQ(JSKD+1)
73 NAMES(ILEV) = IQ(JVOLUM+IVO)
74 LINDEX(ILEV) = LINSAV(ILEV)
75 LINMX(ILEV) = LMXSAV(ILEV)
76 JVOM = LQ(JVOLUM-LVOLUM(ILEV-1))
77 IF (Q(JVOM+3).GT.0.) THEN
78 JIN = LQ(JVOM-LINDEX(ILEV))
79 NUMBER(ILEV) = Q(JIN+3)
80 GONLY(ILEV) = Q(JIN+8)
82 NUMBER(ILEV) = LINDEX(ILEV)
83 GONLY(ILEV) = GONLY(ILEV-1)
85 IF (LQ(LQ(JVOLUM-IVO)).EQ.0) THEN
86 NLDEV(ILEV) = NLDEV(ILEV-1)
90 GTRAN(1,ILEV) = Q(JSKD+3)
91 GTRAN(2,ILEV) = Q(JSKD+4)
92 GTRAN(3,ILEV) = Q(JSKD+5)
94 GRMAT(I,ILEV) = Q(JSKD+5+I)
95 GRMAT(I+1,ILEV) = Q(JSKD+6+I)
99 IF (NJINVO.NE.0) GO TO 800
102 IF (NJINVO.NE.0) GO TO 800
106 * *** 'IN current VOlume' chain is empty, refill from JSKLT structure
107 * Scan brother chains, starting from current one when going up in
108 * the skeleton structure
113 JSKLD = LQ(JSKLT-NLEVEL)
114 NINSK = LINMX(NLEVEL)
117 20 IF (IQ(JSKLD+INSK).EQ.0) GO TO 589
118 JSKD = LQ(JSKLD-INSK)
120 IF (IFUPD.NE.0.AND.NLEVEL.GT.1) THEN
122 * ** Update common /GCVOLU/ for level NLEVEL
124 LQ(JGPAR-NLEVEL) = LQ(JSKD-1)
125 IQ(JGPAR+NLEVEL) = IQ(JSKD+1)
127 NAMES(NLEVEL) = IQ(JVOLUM+IVO)
128 LINDEX(NLEVEL) = INSK
129 JVOM = LQ(JVOLUM-LVOLUM(NLEVEL-1))
130 IF (Q(JVOM+3).GT.0.) THEN
132 NUMBER(NLEVEL) = Q(JIN+3)
133 GONLY(NLEVEL) = Q(JIN+8)
135 NUMBER(NLEVEL) = INSK
136 GONLY(NLEVEL) = GONLY(NLEVEL-1)
138 IF (LQ(LQ(JVOLUM-IVO)).EQ.0) THEN
139 NLDEV(NLEVEL) = NLDEV(NLEVEL-1)
141 NLDEV(NLEVEL) = NLEVEL
143 GTRAN(1,NLEVEL) = Q(JSKD+3)
144 GTRAN(2,NLEVEL) = Q(JSKD+4)
145 GTRAN(3,NLEVEL) = Q(JSKD+5)
147 GRMAT(I,NLEVEL) = Q(JSKD+5+I)
148 GRMAT(I+1,NLEVEL) = Q(JSKD+6+I)
153 IF (Q(JVO+3).EQ.0.) GO TO 600
156 * ** Sort-out unsorted-out elements in first non-empty brother chain
160 50 LCUR = JTRACK +(NCUR-1)*NWTRAC
161 IF (IQ(LCUR+2).NE.0) GO TO 600
165 C***** Code Expanded From Routine: GTRNSF
167 IF (GRMAT(10,NLEVEL) .EQ. 0.) THEN
168 XC(1) = Q(1+IPCUR) - GTRAN(1,NLEVEL)
169 XC(2) = Q(2+IPCUR) - GTRAN(2,NLEVEL)
170 XC(3) = Q(3+IPCUR) - GTRAN(3,NLEVEL)
173 XL11X = Q(1+IPCUR) - GTRAN(1,NLEVEL)
174 XL21X = Q(2+IPCUR) - GTRAN(2,NLEVEL)
175 XL31X = Q(3+IPCUR) - GTRAN(3,NLEVEL)
176 XC(1) = XL11X*GRMAT(1,NLEVEL) + XL21X*GRMAT(2,NLEVEL) + XL31X*
178 XC(2) = XL11X*GRMAT(4,NLEVEL) + XL21X*GRMAT(5,NLEVEL) + XL31X*
180 XC(3) = XL11X*GRMAT(7,NLEVEL) + XL21X*GRMAT(8,NLEVEL) + XL31X*
184 C***** End of Code Expanded From Routine: GTRNSF
186 IF (NIN.LT.0) GO TO 200
188 * * Case with contents defined by Position
190 JNEAR = LQ(JVO-NIN-1)
192 IF (INFROM.GT.0) THEN
194 IF (LQ(JIN-1).NE.0) JNEAR = LQ(JIN-1)
196 IF (IQ(JNEAR+2).EQ.0) GO TO 300
198 IF (ISEARC.LT.0) THEN
200 * Prepare access list when contents have been ordered by GSORD
202 JSB = LQ(LQ(JVO-NIN-1))
206 IDIV = LOCATF (Q(JSB+3), NSB, XC(IAX))
208 CALL GFCOOR (XC, IAX, CX)
209 IDIV = LOCATF (Q(JSB+3), NSB, CX)
211 IF (IDIV.LT.0) IDIV = -IDIV
213 IF (IAX.NE.6) GO TO 300
215 ELSE IF (IDIV.EQ.NSB) THEN
216 IF (IAX.NE.6) GO TO 300
219 NCONT = IQ(JSC0+IDIV)
220 IF (NCONT.LE.0) GO TO 300
225 IF (ISEARC.GT.0) THEN
226 #if !defined(CERNLIB_USRJMP)
227 CALL GUNEAR (ISEARC, 1, XC, JNEAR)
229 #if defined(CERNLIB_USRJMP)
230 CALL JUMPT4(JUNEAR, ISEARC, 1, XC, JNEAR)
232 IF (IQ(JNEAR+1).EQ.0) GO TO 300
239 110 IN = IQ(JNEAR+INEAR)
240 IF (IN.GT.0) GO TO 150
243 120 IN = IQ(JSCV+ICONT)
245 * For each selected content in turn, check if point is in
249 JVOT = LQ(JVOLUM-IVOT)
250 IF (BTEST(IQ(JVOT),1)) THEN
251 * (case with JVOLUM structure locally developed)
252 JPAR = LQ(LQ(JVOLUM-LVOLUM(NLDEV(NLEVEL))))
253 DO 169 ILEV = NLDEV(NLEVEL), NLEVEL
254 IF (IQ(JPAR+1).EQ.0) THEN
255 IF (ILEV.EQ.NLEVEL) THEN
258 JPAR = LQ(JPAR-LINDEX(ILEV+1))
260 ELSE IF (IQ(JPAR-3).GT.1) THEN
261 JPAR = LQ(JPAR-LINDEX(ILEV+1))
280 C***** Code Expanded From Routine: GITRAN
282 C. ------------------------------------------------------------------
285 XT(1) = XC(1) - Q(JIN+5)
286 XT(2) = XC(2) - Q(JIN+6)
287 XT(3) = XC(3) - Q(JIN+7)
290 XL1 = XC(1) - Q(5+JIN)
291 XL2 = XC(2) - Q(6+JIN)
292 XL3 = XC(3) - Q(7+JIN)
294 XT(1) = XL1*Q(JR+1) + XL2*Q(JR+2) + XL3*Q(JR+3)
295 XT(2) = XL1*Q(JR+4) + XL2*Q(JR+5) + XL3*Q(JR+6)
296 XT(3) = XL1*Q(JR+7) + XL2*Q(JR+8) + XL3*Q(JR+9)
299 C***** Code Expanded From Routine: GITRAN
300 CALL GINME (XT, Q(JVOT+2), Q(JPAR+1), IYES)
303 * Volume found at deeper level
307 JSKL = LQ(JSKLT-NLDOWN)
309 * Clear skeleton at lowest level if necessary
311 JOFF = JSKL +IQ(JSKL-3)
312 DO 184 ILEV = 1,NLEVEL
313 IF (IQ(JOFF+ILEV).EQ.LINDEX(ILEV)) GO TO 184
314 DO 182 I = ILEV,NLEVEL
315 IQ(JOFF+I) = LINDEX(I)
324 * Prepare skeleton for level down if not yet done
326 185 JSK = LQ(JSKL-IN)
327 IF (IQ(JSK+1).EQ.0) THEN
331 CALL GTRMUL (GTRAN(1,NLEVEL), GRMAT(1,NLEVEL),
332 + Q(JIN+5), IROTT, Q(JSK+3), Q(JSK+6))
338 190 IF (ISEARC.LT.0) THEN
339 IF (ICONT.EQ.NCONT) GO TO 300
343 IF (INEAR.EQ.NNEAR) GO TO 300
348 * * Case with contents defined by division
354 JVOT = LQ(JVOLUM-IVOT)
355 IF (NLEVEL.LT.NLDEV(NLEVEL)) THEN
358 * (case with structure JVOLUM locally developped)
359 JPAR = LQ(LQ(JVOLUM-LVOLUM(NLDEV(NLEVEL))))
360 IF (NLEVEL.EQ.NLDEV(NLEVEL)) GO TO 250
361 DO 249 ILEV = NLDEV(NLEVEL), NLEVEL-1
362 IF (IQ(JPAR+1).EQ.0) THEN
363 JPAR = LQ(JPAR-LINDEX(ILEV+1))
364 IF (JPAR.EQ.0) GO TO 250
365 ELSE IF (IQ(JPAR-3).GT.1) THEN
366 JPAR = LQ(JPAR-LINDEX(ILEV+1))
370 IF (ILEV.EQ.NLEVEL-1) THEN
383 260 IDT = IDTYP(IAXIS,ISH)
386 * Division along X, Y or Z axis
391 XTT = XTT - Q(LQ(JGPAR-NLEVEL)+IAXIS+4) * XC(3)
393 YT = XC(2) - Q(LQ(JGPAR-NLEVEL)+6) * XC(3)
394 XTT = XTT - Q(LQ(JGPAR-NLEVEL)+4) * YT
398 IN = (XTT -ORIG)/SDIV +1
399 ELSE IF (IDT.EQ.2) THEN
401 * Division along R axis
403 R = XC(1)**2 + XC(2)**2
404 IF (ISH.EQ.9) R = R + XC(3)**2
406 IF (ISH.EQ.5.OR.ISH.EQ.6.OR.ISH.EQ.9) THEN
407 IN = (R - ORIG) / SDIV + 1
408 ELSE IF (ISH.EQ.7.OR.ISH.EQ.8) THEN
409 IPAR = LQ(JGPAR-NLEVEL)
410 DR = 0.5 * (Q(IPAR+4) - Q(IPAR+2)) / Q(IPAR+1)
411 RMN = 0.5 * (Q(IPAR+4) + Q(IPAR+2)) + DR * XC(3)
412 DR = 0.5 * (Q(IPAR+5) - Q(IPAR+3)) / Q(IPAR+1)
413 RMX = 0.5 * (Q(IPAR+5) + Q(IPAR+3)) + DR * XC(3)
414 STP = (RMX - RMN) / NDIV
415 IN = (R - RMN) / STP + 1
417 IPAR = LQ(JGPAR-NLEVEL)
424 IPT = IPT + 3 * IZSEC
428 IF((XC(3)-Q(IPT+3*IZ))*(XC(3)-Q(IPT+3*IZ+3)).LE.0.)
431 IPT = IPT + 3 * IZSEC
438 262 POR1 = (Q(IPT+3) - XC(3)) / (Q(IPT+3) - Q(IPT))
439 POR2 = (XC(3) - Q(IPT)) / (Q(IPT+3) - Q(IPT))
440 RMN = Q(IPT+1) * POR1 + Q(IPT+4) * POR2
441 RMX = Q(IPT+2) * POR1 + Q(IPT+5) * POR2
444 DPH = Q(IPAR+2) / NPDV
446 IF (XC(1).NE.0..OR.XC(2).NE.0.) THEN
447 PHI = RADDEG * ATAN2 (XC(2), XC(1))
451 PH0 = MOD (PHI-Q(IPAR+1)+360., 360.)
454 PH = DEGRAD * (Q(IPAR+1) + (IPSEC - 0.5) * DPH)
455 R = XC(1) * COS(PH) + XC(2) * SIN(PH)
457 STP = (RMX - RMN) / NDIV
458 IN = (R - RMN) / STP + 1
460 ELSE IF (IDT.EQ.3) THEN
462 * Division along Phi axis
464 IF (XC(1).NE.0..OR.XC(2).NE.0.) THEN
465 PHI = RADDEG * ATAN2 (XC(2), XC(1))
469 IN = MOD (PHI-ORIG+360., 360.) / SDIV + 1
470 ELSE IF (IDT.EQ.4) THEN
472 * Division along Theta axis
474 IF (XC(3).NE.0.0) THEN
475 RXY = SQRT (XC(1)**2 + XC(2)**2)
476 THET = RADDEG * ATAN (RXY/XC(3))
477 IF (THET.LT.0.0) THET = THET + 180.0
481 IN = (THET - ORIG) / SDIV + 1
484 265 IF (IN.GT.NDIV) IN = 0
485 IF (IN.LE.0) GO TO 300
488 IF (IQ(JPAR-3).GT.1) THEN
500 * Volume found at deeper level
504 JSKL = LQ(JSKLT-NLDOWN)
506 * Clear skeleton at lowest level if necessary
508 JOFF = JSKL +IQ(JSKL-3)
509 DO 269 ILEV = 1,NLEVEL
510 IF (IQ(JOFF+ILEV).EQ.LINDEX(ILEV)) GO TO 269
511 DO 267 I = ILEV,NLEVEL
512 IQ(JOFF+I) = LINDEX(I)
521 * Prepare skeleton at level down if not yet done
523 270 JSK = LQ(JSKL-IN)
524 IF (IQ(JSK+1).EQ.0) THEN
533 X0(IAXIS) = ORIG + (IN - 0.5) * SDIV
534 IF (ISH.EQ.4.OR.(ISH.EQ.10.AND.IAXIS.NE.1)) THEN
535 CALL GCENT (IAXIS, X0)
537 IF (GRMAT(10,NLEVEL).EQ.0.0) THEN
538 Q(JSK+3) = GTRAN(1,NLEVEL) + X0(1)
539 Q(JSK+4) = GTRAN(2,NLEVEL) + X0(2)
540 Q(JSK+5) = GTRAN(3,NLEVEL) + X0(3)
542 Q(JSK+5+I) = GRMAT(I,NLEVEL)
543 Q(JSK+6+I) = GRMAT(I+1,NLEVEL)
546 CALL GTRMUL (GTRAN(1,NLEVEL), GRMAT(1,NLEVEL), X0, 0,
547 + Q(JSK+3), Q(JSK+6))
550 ELSE IF (IDT.EQ.3.OR.IDT.EQ.4) THEN
552 PH0 = DEGRAD * (ORIG + (IN - 0.5) * SDIV)
561 Q(JSK+2+I) = GTRAN(I,NLEVEL)
562 Q(JSK+5+I) = GRMAT(I,NLEVEL)*CPHR +GRMAT(I+3,NLEVEL)*SPHR
563 Q(JSK+8+I) = GRMAT(I+3,NLEVEL)*CPHR -GRMAT(I,NLEVEL)*SPHR
564 Q(JSK+11+I)= GRMAT(I+6,NLEVEL)
566 IF (PH0.EQ.0.0.AND.GRMAT(10,NLEVEL).EQ.0.0) THEN
571 IF (ISH.EQ.11) IPSEC = 1
574 Q(JSK+3) = GTRAN(1,NLEVEL)
575 Q(JSK+4) = GTRAN(2,NLEVEL)
576 Q(JSK+5) = GTRAN(3,NLEVEL)
578 Q(JSK+5+I) = GRMAT(I,NLEVEL)
579 Q(JSK+6+I) = GRMAT(I+1,NLEVEL)
586 300 IF (GONLY(NLEVEL).EQ.0.) THEN
598 * Move track down in skeleton
601 IQ(LCUR+1) = IQ(JSKL+IN)
602 * (reset INFROM to 0)
606 510 IF (NSTO.EQ.0) THEN
613 589 IF (IDO.LT.NINSK) THEN
616 IF (INSK.GT.NINSK) INSK = 1
621 * ** No more elements at lowest level, go one level up in skeleton
624 INSK = LINDEX(NLDOWN)
628 600 IF (NLDOWN.GT.NLEVEL) THEN
633 * ** Prepare 'IN current VOlume' chain
635 NJINVO = IQ(JSKLD+INSK)
638 IF (NJTMAX.LT.0) THEN
639 * (save status of skeleton for later reactivation of // tracking)
641 LINSAV(I) = LINDEX(I)
646 * *** Fetch information for next track segment to be processed
649 LCUR = JTRACK +(NCUR-1)*NWTRAC
656 *free IDECAD = IQ(LCUR+8)
661 IF (IPART.NE.IPAOLD) THEN
662 JPA = LQ(JPART-IPART)
664 NAPART(I) = IQ(JPA+I)
687 IPCUR = IPCUR +NWREAL
688 IF (ITRTYP.EQ.1) THEN
695 ELSE IF (ITRTYP.EQ.2) THEN
700 ELSE IF (ITRTYP.EQ.3) THEN
704 ELSE IF (ITRTYP.EQ.4) THEN
709 ELSE IF (ITRTYP.EQ.5) THEN
716 ELSE IF (ITRTYP.EQ.7) THEN
719 ELSE IF (ITRTYP.EQ.8) THEN
727 JVO = LQ(JVOLUM-LVOLUM(NLEVEL))
730 * Link selected track segment area to 'garbaged' chain
735 * Save skeleton status when parallel tracking is frozen
737 IF (NJTMAX.LT.0) THEN
739 DO 889 ILEV = 2,NLDOWN
740 LINSAV(ILEV) = LINDEX(ILEV)
741 LMXSAV(ILEV) = LINMX(ILEV)
745 1001 FORMAT (' GFTRAC : Simple NOT-ONLY configuration assumed. OK?')