1 #include "geant321/pilot.h"
2 *CMZ : 3.21/02 29/03/94 15.41.24 by S.Giani
6 C. ******************************************************************
8 C. * Muon track. Computes step size and propagates particle *
11 C. * ==>Called by : GTRACK *
12 C. * Authors R.Brun, F.Bruyant, M.Maire ******** *
14 C. ******************************************************************
16 #include "geant321/gcbank.inc"
17 #include "geant321/gccuts.inc"
18 #include "geant321/gcjloc.inc"
19 #include "geant321/gckine.inc"
20 #include "geant321/gcmate.inc"
21 #include "geant321/gcmulo.inc"
22 #include "geant321/gconsp.inc"
23 #include "geant321/gcphys.inc"
24 #include "geant321/gcstak.inc"
25 #include "geant321/gctmed.inc"
26 #include "geant321/gctrak.inc"
27 #include "geant321/gcunit.inc"
28 #include "geant321/gcking.inc"
29 #if defined(CERNLIB_USRJMP)
30 #include "geant321/gcjump.inc"
33 #if !defined(CERNLIB_OLD)
34 #include "geant321/gcvolu.inc"
35 #include "geant321/gcvdma.inc"
37 #if !defined(CERNLIB_SINGLE)
38 PARAMETER (EPSMAC=1.E-6)
39 DOUBLE PRECISION DEMEAN,STOPRG,STOPMX,STOPC
40 DOUBLE PRECISION ONE,XCOEF1,XCOEF2,XCOEF3
42 #if defined(CERNLIB_SINGLE)
43 PARAMETER (EPSMAC=1.E-11)
49 C. ------------------------------------------------------------------
51 * *** Particle below energy threshold ? short circuit
53 IF (GEKIN.LE.CUTMUO) GO TO 100
55 * *** Update local pointers if medium has changed
76 IKCUT = Q(JMULOF+NEK1+1)
77 STOPC = Q(JMULOF+NEK1+2)
82 #if defined(CERNLIB_ASHO)
90 * *** Compute current step size
98 * ** Step limitation due to bremsstrahlung ?
101 STEPBR = GEKRT1*Q(JBREM+IEK2) +GEKRAT*Q(JBREM+IEK2+1)
102 SBREM = STEPBR*ZINTBR
103 IF (SBREM.LT.STEP) THEN
109 * ** Step limitation due to pair production ?
112 STEPPA = GEKRT1*Q(JPAIR+IEK1) +GEKRAT*Q(JPAIR+IEK1+1)
113 SPAIR = STEPPA*ZINTPA
114 IF (SPAIR.LT.STEP) THEN
120 * ** Step limitation due to decay ?
123 SDCAY = SUMLIF*VECT(7)/AMASS
124 IF (SDCAY.LT.STEP) THEN
130 * ** Step limitation due to delta-ray ?
133 STEPDR = GEKRT1*Q(JDRAY+IEK2) +GEKRAT*Q(JDRAY+IEK2+1)
134 SDRAY = STEPDR*ZINTDR
135 IF (SDRAY.LT.STEP) THEN
141 * ** Step limitation due to nuclear interaction ?
145 STEPMU = GEKRT1*Q(JMUNU+IEKBIN) +GEKRAT*Q(JMUNU+IEKBIN+1)
146 SMUNU = STEPMU*ZINTMU
147 IF (SMUNU.LT.STEP) THEN
161 * ** Step limitation due to energy-loss,multiple scattering
162 * or magnetic field ?
164 IF (JMULOF.NE.0) THEN
165 SMULOF = GEKRT1*Q(JMULOF+IEKBIN) +GEKRAT*Q(JMULOF+IEKBIN+1)
166 IF (SMULOF.LT.STEP) THEN
172 * ** Step limitation due to geometry ?
174 IF (STEP.GE.0.95*SAFETY) THEN
176 IF (IGNEXT.NE.0) THEN
181 * Update SAFETY in stack companions, if any
182 IF (IQ(JSTAK+3).NE.0) THEN
183 DO 10 IST = IQ(JSTAK+3),IQ(JSTAK+1)
184 JST = JSTAK + 3 + (IST-1)*NWSTAK
193 * *** Linear transport when no field or very short step
195 IF (IFIELD.EQ.0.OR.STEP.LE.PREC) THEN
197 IF (IGNEXT.NE.0) THEN
199 VECTMP = VECT(I) +STEP*VECT(I+3)
200 IF(VECTMP.EQ.VECT(I)) THEN
202 * *** Correct for machine precision
204 IF(VECT(I+3).NE.0.) THEN
206 + VECT(I)+ABS(VECT(I))*SIGN(1.,VECT(I+3))*EPSMAC
208 IF(LMEC(NMEC).EQ.104) NMEC=NMEC-1
212 #if defined(CERNLIB_DEBUG)
215 WRITE(CHMAIL, 10100) GEKIN, NUMED, STEP, SNEXT
217 10000 FORMAT(' Boundary correction in GTMUON: ',
218 + ' GEKIN NUMED STEP SNEXT')
219 10100 FORMAT(31X,E10.3,1X,I10,1X,E10.3,1X,E10.3,1X)
230 VECT(I) = VECT(I) +STEP*VECT(I+3)
235 * *** otherwise, swim particle in magnetic field
237 #if !defined(CERNLIB_OLD)
238 if(mycoun.gt.1.and.nfmany.gt.0.and.step.ge.safety)then
239 nlevel=manyle(nfmany)
241 names(i)=manyna(nfmany,i)
242 number(i)=manynu(nfmany,i)
244 call glvolu(nlevel,names,number,ier)
245 if(ier.ne.0)print *,'Fatal error in GLVOLU'
252 #if !defined(CERNLIB_USRJMP)
253 40 CALL GUSWIM (CHARGE, STEP, VECT, VOUT)
255 #if defined(CERNLIB_USRJMP)
256 40 CALL JUMPT4(JUSWIM, CHARGE, STEP, VECT, VOUT)
259 * ** When near to boundary, take proper action (cut-step,crossing...)
261 IF(STEP.GE.SAFETY)THEN
263 IF (IGNEXT.NE.0) THEN
265 VNEXT(I+3) = VECT(I+3)
266 VNEXT(I) = VECT(I) +SNEXT*VECT(I+3)
269 IF (ABS(VOUT(I)-VNEXT(I)).GT.EPSIL) GO TO 70
274 70 CALL GINVOL (VOUT, ISAME)
276 IF ((INEAR.NE.0).OR.(STEP.LT.EPSIL)) THEN
283 IF (LMEC(NMEC).NE.24) THEN
298 * *** Correct the step due to multiple scattering
301 CORR=0.0001*(STEP/RADL)*(GETOT/(VECT(7)*VECT(7)))**2
302 IF (CORR.GT.0.25) CORR = 0.25
303 STEP = (1.+CORR)*STEP
308 * *** Generate Cherenkov photons if required
318 * *** apply energy loss : find the kinetic energy corresponding
319 * to the new stopping range = stopmx - step
324 IF(GEKRAT.LT.0.7) THEN
327 I1 = MIN(IEKBIN,NEKBIN-1)
331 XCOEF2 = Q(JCOEF+I1+1)
332 XCOEF3 = Q(JCOEF+I1+2)
333 IF(XCOEF1.NE.0.) THEN
334 STOPMX = -XCOEF2+SIGN(ONE,XCOEF1)*SQRT(XCOEF2**2 - (XCOEF3-
337 STOPMX = - (XCOEF3-GEKIN)/XCOEF2
339 STOPRG = STOPMX - STEP
340 IF (STOPRG.LT.STOPC) THEN
341 STEP = STOPMX - STOPC
345 IF(XCOEF1.NE.0.) THEN
346 DEMEAN=GEKIN-XCOEF1*(XCOEF3+STOPRG*(2.*XCOEF2+STOPRG))
348 DEMEAN=GEKIN-XCOEF2*STOPRG-XCOEF3
350 IF(DEMEAN.LE.5.*GEKIN*EPSMAC) THEN
351 DEMEAN=(GEKRT1*Q(JLOSS+IEKBIN)+GEKRAT*Q(JLOSS+IEKBIN+1))
354 IF (ILOSS.EQ.4.OR.IEKBIN.LE.IKCUT+1) THEN
358 CALL GFLUCT(DEMS,DESTEP)
360 IF (DESTEP.LT.0.) DESTEP = 0.
361 GEKINT = GEKIN -DESTEP
362 IF (GEKINT.LE.(1.01*CUTMUO)) GO TO 100
366 VECT(7)= SQRT((GETOT+AMASS)*GEKIN)
370 * *** Apply multiple scattering.
378 * *** Update time of flight
380 SUMLIF = SUMLIF -STEP*AMASS/VECT(7)
381 TOFG = TOFG +STEP*GETOT/(VECT(7)*CLIGHT)
382 IF (TOFG.GE.TOFMAX) THEN
389 * *** Update interaction probabilities
391 IF (IBREM.GT.0) ZINTBR = ZINTBR -STEP/STEPBR
392 IF (IPAIR.GT.0) ZINTPA = ZINTPA -STEP/STEPPA
393 IF (IDRAY.GT.0) ZINTDR = ZINTDR -STEP/STEPDR
394 IF (IMUNU.GT.0) ZINTMU = ZINTMU -STEP/STEPMU
396 * *** otherwise, apply the selected process if any
398 90 IF (IPROC.EQ.0) GO TO 999
402 * ** Bremsstrahlung ?
407 * ** Pair production ?
409 ELSE IF (IPROC.EQ.6) THEN
414 ELSE IF (IPROC.EQ.5) THEN
420 ELSE IF (IPROC.EQ.10) THEN
423 * ** Nuclear interaction ?
425 ELSE IF (IPROC.EQ.21) THEN
430 * *** Special treatment for overstopped tracks
444 TOFG = TOFG +SUMLIF/CLIGHT
446 IF (TOFG.GE.TOFMAX) THEN
455 999 IF(NGPHOT.GT.0) THEN
456 IF(ITCKOV.EQ.2.AND.ISTOP.EQ.0) THEN
458 * The muon has produced Cerenkov photons and it is still alive
459 * we put it in the stack and we let the photons to be tracked
461 GKIN(1,NGKINE) = VECT(4)*VECT(7)
462 GKIN(2,NGKINE) = VECT(5)*VECT(7)
463 GKIN(3,NGKINE) = VECT(6)*VECT(7)
464 GKIN(4,NGKINE) = GETOT
465 GKIN(5,NGKINE) = IPART
468 c----put position as well
469 GPOS(1,NGKINE)=VECT(1)
470 GPOS(2,NGKINE)=VECT(2)
471 GPOS(3,NGKINE)=VECT(3)