1 #include "geant321/pilot.h"
2 *CMZ : 3.21/04 22/02/95 16.08.31 by S.Giani
6 C. ******************************************************************
8 C. * Electron type track. Computes step size and propagates *
9 C. * particle through step. *
11 C. * ==> Called by : GTRACK *
12 C. * Authors R.Brun, F.Bruyant, M.Maire L.Urban ******** *
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,ZERO
42 #if defined(CERNLIB_SINGLE)
43 PARAMETER (EPSMAC=1.E-11)
45 PARAMETER (ONE=1,ZERO=0.)
48 *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
50 PARAMETER ( TLIM = 0.0002)
52 *<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
54 C. ------------------------------------------------------------------
56 * *** Particle below energy threshold ? short circuit
58 IF (GEKIN.LE.CUTELE) GO TO 100
60 * *** Update local pointers if medium or particle code has changed
64 IF (CHARGE.LT.0.) THEN
71 JBREM = LQ(JMA-9) +NEK1
72 JLOSS = LQ(JMA-1) +NEK1
73 JDRAY = LQ(JMA-11) +NEK1
74 JRANG = LQ(JMA-15) +NEK1
75 JCOEF = LQ(JMA-17) +3*NEK1
88 IKCUT = Q(JMULOF+NEK1+1)
89 STOPC = Q(JMULOF+NEK1+2)
94 #if defined(CERNLIB_ASHO)
102 * *** Compute current step size
108 * ** Step limitation due to bremsstrahlung ?
111 STEPBR = GEKRT1*Q(JBREM+IEKBIN) +GEKRAT*Q(JBREM+IEKBIN+1)
112 SBREM = STEPBR*ZINTBR
113 IF (SBREM.LT.STEP) THEN
119 * ** Step limitation due to delta-ray production ?
122 STEPDR = GEKRT1*Q(JDRAY+IEKBIN) +GEKRAT*Q(JDRAY+IEKBIN+1)
123 SDRAY = STEPDR*ZINTDR
124 IF (SDRAY.LT.STEP) THEN
130 * ** Step limitation due to annihilation ?
132 IF (CHARGE.GT.0.) THEN
134 STEPAN = GEKRT1*Q(JANNI+IEKBIN) +GEKRAT*Q(JANNI+IEKBIN+1)
135 SANNI = STEPAN*ZINTAN
136 IF (SANNI.LT.STEP) THEN
148 * ** Step limitation due to energy-loss,multiple scattering
149 * or magnetic field ?
151 IF (JMULOF.NE.0) THEN
152 SMULOF = GEKRT1*Q(JMULOF+IEKBIN) +GEKRAT*Q(JMULOF+IEKBIN+1)
153 IF (SMULOF.LT.STEP) THEN
159 * ** Step limitation due to geometry ?
161 IF (STEP.GE.0.95*SAFETY) THEN
163 IF (IGNEXT.NE.0) THEN
168 * Update SAFETY in stack companions, if any
169 IF (IQ(JSTAK+3).NE.0) THEN
170 DO 10 IST = IQ(JSTAK+3),IQ(JSTAK+1)
171 JST = JSTAK + 3 + (IST-1)*NWSTAK
180 IF (IFIELD.EQ.0.OR.STEP.LE.PREC) THEN
182 * *** Linear transport when no field or very short step
184 IF (IGNEXT.NE.0) THEN
186 * *** Particle is supposed to cross the boundary during step
189 VECTMP = VECT(I) +STEP*VECT(I+3)
190 IF(VECTMP.EQ.VECT(I)) THEN
192 * *** Correct for machine precision
194 IF(VECT(I+3).NE.0.) THEN
196 + VECT(I)+ABS(VECT(I))*SIGN(1.,VECT(I+3))*EPSMAC
198 IF(LMEC(NMEC).EQ.104) NMEC=NMEC-1
202 #if defined(CERNLIB_DEBUG)
205 WRITE(CHMAIL, 10100) GEKIN, NUMED, STEP, SNEXT
207 10000 FORMAT(' Boundary correction in GTELEC: ',
208 + ' GEKIN NUMED STEP SNEXT')
209 10100 FORMAT(31X,E10.3,1X,I10,1X,E10.3,1X,E10.3,1X)
220 VECT(I) = VECT(I) +STEP*VECT(I+3)
225 * *** otherwise, swim particle in magnetic field
227 #if !defined(CERNLIB_OLD)
228 if(mycoun.gt.1.and.nfmany.gt.0.and.step.ge.safety)then
229 nlevel=manyle(nfmany)
231 names(i)=manyna(nfmany,i)
232 number(i)=manynu(nfmany,i)
234 call glvolu(nlevel,names,number,ier)
235 if(ier.ne.0)print *,'Fatal error in GLVOLU'
242 #if !defined(CERNLIB_USRJMP)
243 40 CALL GUSWIM (CHARGE, STEP, VECT, VOUT)
245 #if defined(CERNLIB_USRJMP)
246 40 CALL JUMPT4(JUSWIM,CHARGE, STEP, VECT, VOUT)
249 * ** When near to boundary, take proper action (cut-step,crossing...)
251 IF(STEP.GE.SAFETY)THEN
253 IF (IGNEXT.NE.0) THEN
255 VNEXT(I+3) = VECT(I+3)
256 VNEXT(I) = VECT(I) +SNEXT*VECT(I+3)
259 IF (ABS(VOUT(I)-VNEXT(I)).GT.EPSIL) GO TO 70
264 70 CALL GINVOL (VOUT, ISAME)
266 IF ((INEAR.NE.0).OR.(STEP.LT.EPSIL)) THEN
273 IF (LMEC(NMEC).NE.24) THEN
290 * *** Correct the step due to multiple scattering
293 CORR=0.0001*(STEP/RADL)*(GETOT/(VECT(7)*VECT(7)))**2
294 IF (CORR.GT.0.25) CORR = 0.25
295 STEP = (1.+CORR)*STEP
300 * ** Apply synchrotron radiation if required
302 IF(ISYNC*IFIELD.NE.0) THEN
308 * *** Generate Cherenkov photons if required
318 * *** Apply energy loss : find the kinetic energy corresponding
319 * to the new stopping range = stopmx - step
323 IF(GEKRAT.LT.0.7) THEN
326 I1 = MIN(IEKBIN,NEKBIN-1)
330 XCOEF2 = Q(JCOEF+I1+1)
331 XCOEF3 = Q(JCOEF+I1+2)
332 IF(XCOEF1.NE.0.) THEN
333 STOPMX = -XCOEF2+SIGN(ONE,XCOEF1)*SQRT(XCOEF2**2 - (XCOEF3-
336 STOPMX = - (XCOEF3-GEKIN)/XCOEF2
339 STOPRG = STOPMX - STEP
340 IF (STOPRG.LT.STOPC) THEN
341 STEP = MAX(STOPMX - STOPC,ZERO)
346 IF(XCOEF1.NE.0.) THEN
347 DEMEAN=GEKIN-XCOEF1*(XCOEF3+STOPRG*(2.*XCOEF2+STOPRG))
349 DEMEAN=GEKIN-XCOEF2*STOPRG-XCOEF3
351 IF(DEMEAN.LE.5.*GEKIN*EPSMAC) THEN
352 DEMEAN=(GEKRT1*Q(JLOSS+IEKBIN)+GEKRAT*Q(JLOSS+IEKBIN+1))
355 IF (ILOSS.EQ.4.OR.IEKBIN.LE.IKCUT+1) THEN
359 CALL GFLUCT (DEMS,DESTEP)
361 DESTEP=MAX(DESTEP,0.)
362 GEKINT = GEKIN -DESTEP
363 IF (GEKINT.LE.(1.01*CUTELE)) GO TO 100
367 VECT(7)= SQRT((GETOT+AMASS)*GEKIN)
370 * IABAN = 1 does not distinguish between sensitive and
371 * non-sensitive volumes, and can stop particles above the CUTE
375 * STOP electron/positron if range < safety AND no brems
377 IF(STOPMX.LE.SAFETY) THEN
378 IF(SBREM.GT.STOPMX) THEN
379 * + condition in case of Cherenkov generation:
380 * STOP if E/p >refractive index (i.e. e+/e- is below threshold)
383 ***** IF(THRIND.GT.Q(JINDEX+1)) GOTO 100
384 IF(THRIND.GT.Q(JINDEX+1)) GOTO 98
390 STOPRG = STOPMX - STEP
391 IF (STOPRG.LT.STOPC) THEN
392 STEP = MAX(STOPMX - STOPC,ZERO)
397 * IABAN = 2 distinguishes between sensitive and non-sensitive
399 * In sensitive volumes additional tests are applied before
400 * the particle is stopped
404 IF(STOPMX.LE.SAFETY) THEN
406 * test for brems and annihilation only
408 IF((IBREM.GT.0).AND.(SBREM.LE.STOPMX)) GOTO 97
409 IF((CHARGE.GT.0.).AND.(IANNI.GT.0).and.
410 + (SANNI.LE.STOPMX)) GOTO 97
415 * sensitive volume ---> more tests !!
416 * is energy below TLIM (=200 keV ) ?
418 IF(GEKIN.LE.TLIM) THEN
420 * range of the particle is the overestimated stopping range here
422 TOSTOP=STOPMX-STEP*DESTEP/DEMEAN-STOPC
424 * does the track remain in the actual volume?
426 IF(TOSTOP.LE.SAFETY) THEN
428 * is there no delta ray, brems, annihilation ?
430 IF((IDRAY.GT.0).AND.(SDRAY.LE.TOSTOP)) GOTO 97
431 IF((IBREM.GT.0).AND.(SBREM.LE.TOSTOP)) GOTO 97
432 IF((CHARGE.GT.0.).AND.(IANNI.GT.0).and.
433 + (SANNI.LE.TOSTOP)) GOTO 97
435 * extra condition in case of Cherenkov generation:
440 * continue only if e+/e- below threshold
442 IF(THRIND.LT.Q(JINDEX+1)) GOTO 97
445 * do not make transport if this estimated range negative...
447 IF(TOSTOP.LE.0.) GOTO 98
449 * estimate final position/direction of the particle
450 * from energy loss + multiple scattering
451 * ( multiple scattering with path length = range of the particle)
455 TGTH2=ALFA*ALFA1/(1.2+ALFA)
456 S=TOSTOP*SQRT(1.+TGTH2)/ALFA1
459 IF(THET.Lt.0.) THET=PI-THET
471 VMM=SQRT(VECT(4)*VECT(4)+VECT(5)*VECT(5))
475 V4=PD1*VECT(6)*D1-PD2*D2+VECT(4)*D3
476 V5=PD2*VECT(6)*D1+PD1*D2+VECT(5)*D3
477 V6=-VMM*D1+VECT(6)*D3
483 VP=1./SQRT(V4*V4+V5*V5+V6*V6)
488 * transport particle ( assuming FIELD = 0. )
491 VECT(I)=VECT(I)+S*VECT(I+3)
494 * put back into GEKIN the original value in order to have
501 *++++++++++++++++++++++++++++++++++++++++++++++++++++++
506 *<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
508 * *** Apply multiple scattering.
516 * *** Update time of flight
518 TOFG = TOFG +STEP*GETOT/(VECT(7)*CLIGHT)
519 IF (TOFG.GE.TOFMAX) THEN
526 * *** Update interaction probabilities
528 IF (IBREM.GT.0) ZINTBR = ZINTBR -STEP/STEPBR
529 IF (IDRAY.GT.0) ZINTDR = ZINTDR -STEP/STEPDR
530 IF (CHARGE.GT.0.) THEN
531 IF (IANNI.GT.0) ZINTAN = ZINTAN -STEP/STEPAN
534 * *** Apply the selected process if any
536 90 IF (IPROC.EQ.0) GO TO 999
540 * ** Bremsstrahlung ?
547 ELSE IF (IPROC.EQ.10) THEN
549 IF((IPART.EQ.2).OR.((IPART.EQ.3).AND.(GEKIN.GT.2.*DCUTE))) THEN
555 * ** Positron annihilation ?
557 ELSE IF (IPROC.EQ.11) THEN
563 * *** Special treatment for overstopped tracks
565 98 GEKIN=GEKIN+DESTEP
574 IF ((CHARGE.LT.0.).OR.(IANNI.EQ.0)) THEN
581 999 IF(NGPHOT.GT.0) THEN
582 IF(ITCKOV.EQ.2.AND.ISTOP.EQ.0) THEN
584 * The electron has produced Cerenkov photons and it is still alive
585 * we put it in the stack and we let the photons to be tracked
587 GKIN(1,NGKINE) = VECT(4)*VECT(7)
588 GKIN(2,NGKINE) = VECT(5)*VECT(7)
589 GKIN(3,NGKINE) = VECT(6)*VECT(7)
590 GKIN(4,NGKINE) = GETOT
591 GKIN(5,NGKINE) = IPART
594 c----put position as well
595 GPOS(1,NGKINE)=VECT(1)
596 GPOS(2,NGKINE)=VECT(2)
597 GPOS(3,NGKINE)=VECT(3)