5 * Revision 1.1.1.1 1995/10/24 10:20:30 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.28 by S.Giani
14 C. ******************************************************************
17 C. * Computation and tracking of all the light rays. *
19 C. * Author: S.Giani *
21 C. ******************************************************************
23 #include "geant321/gcflag.inc"
24 ********************************************************************************
25 #include "geant321/gcdraw.inc"
26 #include "geant321/gconst.inc"
27 #include "geant321/gcmutr.inc"
28 #include "geant321/pawc.inc"
29 ********************************************************************************
30 #include "geant321/gcbank.inc"
31 #include "geant321/gccuts.inc"
32 #include "geant321/gcjloc.inc"
33 #include "geant321/gckine.inc"
34 #include "geant321/gcking.inc"
35 #include "geant321/gcmate.inc"
36 #include "geant321/gcphys.inc"
37 #include "geant321/gcparm.inc"
38 #include "geant321/gcsets.inc"
39 #include "geant321/gcstak.inc"
40 #include "geant321/gctmed.inc"
41 #include "geant321/gctrak.inc"
42 #include "geant321/gcvolu.inc"
43 #include "geant321/gcunit.inc"
44 #include "geant321/gcnum.inc"
45 #if defined(CERNLIB_USRJMP)
46 #include "geant321/gcjump.inc"
48 ********************************************************************************
49 #include "geant321/gcfdim.inc"
50 #include "geant321/gcpixe.inc"
51 #include "geant321/gcrayt.inc"
52 #include "geant321/gcvdma.inc"
55 DIMENSION VVVMIN(80),VVVMAX(80)
56 SAVE VVVMIN,VVVMAX,ZIMPRE
57 ********************************************************************************
61 DIMENSION CUTS(10),MECA(5,13)
62 EQUIVALENCE (CUTS(1),CUTGAM),(MECA(1,1),IPAIR)
64 #if !defined(CERNLIB_SINGLE)
65 PARAMETER (EPSMAC=1.E-6)
67 #if defined(CERNLIB_SINGLE)
68 PARAMETER (EPSMAC=1.E-11)
71 C. ------------------------------------------------------------------
75 IF(IMAP.EQ.1)ZIMPRE=LIMPRE
85 IF((ZLN-ZRATIO).GT.0.001)THEN
102 VVMA=MAX(VVVMAX(LLL-1),VVVMAX(LLL))
103 VVMI=MIN(VVVMIN(LLL-1),VVVMIN(LLL))
105 IF(((VVV-(VVMA+ZNMAP1)).GT.0.001).OR.
106 + ((VVV-(VVMI-ZNMAP1)).LT.-0.001))GOTO 22
108 IF(IIIJ.EQ.1.AND.JJJI.EQ.1)THEN
111 * print *,vect(1),vect(2),vect(3),'vertex from gtrack'
112 * print *,vect(4),vect(5),vect(6),'impulse from gtrack'
115 XPINTS=ZROTS(1,4)+ZROTS(1,1)*
116 + UUU+ZROTS(1,2)*VVV+ZROTS(1,3)*
118 YPINTS=ZROTS(2,4)+ZROTS(2,1)*
119 + UUU+ZROTS(2,2)*VVV+ZROTS(2,3)*
121 ZPINTS=ZROTS(3,4)+ZROTS(3,1)*
122 + UUU+ZROTS(3,2)*VVV+ZROTS(3,3)*
132 CALL UCTOH('PERS',IPERS,4,4)
133 XCOSXS=(SIN(GTHETA*DEGRAD))*(COS(GPHI*DEGRAD))
134 YCOSYS=(SIN(GTHETA*DEGRAD))*(SIN(GPHI*DEGRAD))
135 ZCOSZS=COS(GTHETA*DEGRAD)
142 IF(IPERS.EQ.IPRJ)THEN
143 CONMOD=1./SQRT(((XPINTS-FPINTX)**2)+((YPINTS-FPINTY)**2)+
144 + ((ZPINTS-FPINTZ)**2))
145 XCOSXS=-(XPINTS-FPINTX)*CONMOD
146 YCOSYS=-(YPINTS-FPINTY)*CONMOD
147 ZCOSZS=-(ZPINTS-FPINTZ)*CONMOD
152 IF(VECT(1).LE.XCUT.OR.VECT(2).LE.YCUT.OR.VECT(3).LE.ZCUT)THEN
153 CALL GTMEDI (VECT, NUMED)
164 * *** Check validity of tracking medium and material parameters
166 10 IF (NUMED.NE.NUMOLD) THEN
169 JTM = LQ(JTMED- NUMED)
171 PRECOR = MIN(0.1*EPSIL, 0.0010)
177 IF(ISCOLO.EQ.-10.OR.IMYSE.EQ.0)ISCOLO=MOD(NUMED,6)+2
178 IF(ISLSTY.EQ.-10.OR.IMYSE.EQ.0)ISLSTY=4
179 IF(ISSEEN.EQ.-10.OR.IMYSE.EQ.0)THEN
181 IF(DENS.LT.0.00130)THEN
192 * If now the particle is entering in the same volume where
193 * it was exiting from last step, and if it has done this for
194 * more than 5 times, we decrease the precision of tracking
196 IF(MOD(NSTOUT,5).EQ.0) THEN
198 * WRITE(CHMAIL,10000)ITRA,ISTAK,NTMULT,NAPART
199 *10000 FORMAT(' *** GTRACK *** Boundary loop: track ',
200 * + I4,' stack ',I4,' NTMULT ',I5,1X,5A4)
202 * WRITE(CHMAIL,10100) EPSCUR
203 *10100 FORMAT(' Precision now set to ',G10.3)
213 * *** Compute SET and DET number if volume is sensitive
215 IF (JSET.GT.0) CALL GFINDS
217 * Clear step dependent variables
226 PREC = MAX(PRECOR,MAX(ABS(VECT(1)),ABS(VECT(2)),
227 + ABS(VECT(3)),SLENG)*EPSCUR)
229 * Give control to user at entrance of volume (INWVOL=1)
231 IF (INWVOL.EQ.1) THEN
233 IF (ISTOP.NE.0) GO TO 22
237 * *** Propagate particle up to next volume boundary or end of track
241 IF (IPARAM.NE.0) THEN
242 IF (GEKIN.LE.PACUTS(ITRTYP)) THEN
246 #if !defined(CERNLIB_USRJMP)
249 #if defined(CERNLIB_USRJMP)
260 * Check for possible endless loop
264 IF (NSTEP.GT.MAXNST) THEN
269 * WRITE(CHMAIL,10200) MAXNST
271 * WRITE(CHMAIL,10300)ITRA,ISTAK,NTMULT,(NAPART(I),I=1,5),
274 *10200 FORMAT(' *** GTRACK *** More than ',I6,
275 * + ' steps, tracking abandoned!')
276 *10300 FORMAT(' Track ',I4,' stack ',I4,' NTMULT ',
277 * + I5,1X,5A4,1X,'Time of flight ',F10.3,' ns')
281 * *** Give control to user at end of each tracking step
283 SAFETY = SAFETY -STEP
286 IF (ISTOP.NE.0) GO TO 22
288 * Renormalize direction cosines
290 CMOD = 1./SQRT(VECT(4)*VECT(4)+VECT(5)*VECT(5)+VECT(6)*VECT(6))
291 VECT(4) = VECT(4)*CMOD
292 VECT(5) = VECT(5)*CMOD
293 VECT(6) = VECT(6)*CMOD
295 IF (INWVOL.EQ.0) GO TO 80
297 IF (NJTMAX.GT.0) THEN
299 IF (NLEVIN.EQ.0) GO TO 100
302 IF (NLEVIN.GE.NLEVEL) THEN
305 IF (NLEVIN.EQ.0) GO TO 100
306 INFROM = LINDEX(NLEVIN+1)
308 IF (NLEVIN.NE.NLEVEL) INGOTO = 0
311 CALL GTMEDI (VECT, NUMED)
314 CALL UHTOC(NAMES(NLEVEL),4,NAME,4)
317 CALL GFIND(NAME,'SEEN',ISSEEN)
318 CALL GFIND(NAME,'COLO',ISCOLO)
319 CALL GFIND(NAME,'LSTY',ISLSTY)
321 * print *,isseen,iscolo,islsty
328 * Track outside setup, give control to user (INWVOL=3)
346 IF(VVV.LT.VVVMIN(IIIJ))THEN
348 ELSEIF(VVV.GT.VVVMAX(IIIJ))THEN