1 #include "geant321/pilot.h"
2 *CMZ : 3.21/02 03/07/94 17.57.24 by S.Giani
6 C. ******************************************************************
8 C. * Charged hadron 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 ******** *
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/gcking.inc"
21 #include "geant321/gcmate.inc"
22 #include "geant321/gcmulo.inc"
23 #include "geant321/gconsp.inc"
24 #include "geant321/gcphys.inc"
25 #include "geant321/gcstak.inc"
26 #include "geant321/gctmed.inc"
27 #include "geant321/gctrak.inc"
28 #include "geant321/gcunit.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 GKR,DEMEAN,STOPP,STOPMX,STOPRG,STOPC,EKIPR
40 DOUBLE PRECISION ONE,XCOEF1,XCOEF2,XCOEF3,YCOEF1,YCOEF2,YCOEF3
42 #if defined(CERNLIB_SINGLE)
43 PARAMETER (EPSMAC=1.E-11)
45 PARAMETER (THRESH=0.7,ONE=1)
47 SAVE CFLD,CHARG2,RMASS,CUTPRO,IKCUT,STOPC
49 C. ------------------------------------------------------------------
51 * *** Particle below energy threshold ? short circuit
53 IF (GEKIN.LE.CUTHAD) GO TO 100
55 * *** Update local pointers if medium has changed
60 JRANG = LQ(JMA-16) + NEK1
61 JCOEF = LQ(JMA-18) + 3*NEK1
62 CHARG2 = CHARGE*CHARGE
64 OMCMOL = Q(JPROB+21)*CHARG2
65 CHCMOL = Q(JPROB+25)*ABS(CHARGE)
66 CUTPRO = MAX(CUTHAD*RMASS,ELOW(1))
67 IKCUT = GEKA*LOG10(CUTPRO) + GEKB
68 GKR = (CUTPRO - ELOW(IKCUT))/(ELOW(IKCUT+1) - ELOW(IKCUT))
69 STOPC = (1.-GKR)*Q(JRANG+IKCUT) + GKR*Q(JRANG+IKCUT+1)
70 IF (FIELDM.NE.0.) THEN
71 CFLD = 3333.*DEGRAD*TMAXFD/ABS(FIELDM*CHARGE)
87 #if defined(CERNLIB_ASHO)
95 * *** Compute current step size
101 * ** Step limitation due to hadron interaction ?
104 #if !defined(CERNLIB_USRJMP)
107 #if defined(CERNLIB_USRJMP)
110 IF (SHADR.LT.STEP) THEN
111 IF (SHADR.LE.0.) SHADR = PREC
117 * ** Step limitation due to decay ?
120 SDCAY = SUMLIF*VECT(7)/AMASS
121 IF (SDCAY.LT.STEP) THEN
127 * ** Step limitation due to delta-ray production ?
128 * (Cannot be tabulated easily because dependent on AMASS)
132 IF (GEKIN.GT.DCUTM) THEN
133 GAMASS = GETOT +AMASS
134 TMAX = EMASS*GEKIN*GAMASS/(0.5*AMASS*AMASS+EMASS*GETOT)
135 IF (TMAX.GT.DCUTM) THEN
136 BET2 = GEKIN*GAMASS/(GETOT*GETOT)
138 SIG = (1.-Y+BET2*Y*LOG(Y))/DCUTM
139 * extra term for spin 1/2
140 IF (AMASS.GT.0.9) SIG=SIG+0.5*(TMAX-DCUTM)/(GETOT*GETOT)
141 SIG = SIG*Q(JPROB+17)*CHARG2*EMASS/BET2
145 SDRAY = STEPDR*ZINTDR
146 IF (SDRAY.LE.STEP) THEN
160 * ** Step limitation due to energy loss (stopping range) ?
163 IF(GEKRAT.LT.THRESH) THEN
166 I1 = MIN(IEKBIN,NEKBIN-1)
170 XCOEF2 = Q(JCOEF+I1+1)
171 XCOEF3 = Q(JCOEF+I1+2)
173 STOPP = -XCOEF2+SIGN(ONE,XCOEF1)* SQRT(XCOEF2
174 + **2 -(XCOEF3-GEKIN*RMASS/XCOEF1))
176 STOPP = - (XCOEF3-GEKIN*RMASS)/XCOEF2
178 STOPMX = (STOPP - STOPC)/(RMASS*CHARG2)
179 IF (STOPMX.LT.MIN(STEP,STMIN)) THEN
187 EKF = (1. - DEEMAX)*GEKIN*RMASS
188 IF (EKF.LT.ELOW(1)) THEN
191 ELSEIF (EKF.GE.ELOW(NEKBIN)) THEN
193 IF (EKF.GE.ELOW(NEK1)) THEN
194 EKF = ELOW(NEK1)*0.99
197 IKF=GEKA*LOG10(EKF)+GEKB
199 GKR=(EKF-ELOW(IKF))/(ELOW(IKF+1)-ELOW(IKF))
200 IF(GKR.LT.THRESH) THEN
203 IK1 = MIN(IKF,NEKBIN-1)
207 YCOEF2=Q(JCOEF+IK1+1)
208 YCOEF3=Q(JCOEF+IK1+2)
209 IF(YCOEF1.NE.0.) THEN
210 SLOSP = -YCOEF2+SIGN(ONE,YCOEF1)*SQRT(YCOEF2**2- (YCOEF3-
213 SLOSP = - (YCOEF3-EKF)/YCOEF2
215 SLOSP = STOPP - SLOSP
216 SLOSS = MAX(STMIN, SLOSP/(RMASS*CHARG2) )
217 IF (SLOSS.LT.STEP) THEN
223 * ** Step limitation due to bending in magnetic field ?
225 IF (IFIELD.NE.0) THEN
226 SFIELD = CFLD*VECT(7)
227 SFIELD=MAX(SFIELD, STMIN)
228 IF (SFIELD.LT.STEP) THEN
234 * ** Step limitation due to multiple scattering ?
237 SMULS=MIN(2232.*RADL*((VECT(7)**2)/(GETOT*CHARGE))**2,10.*RADL)
238 SMULS = MAX(STMIN, SMULS )
239 IF (SMULS.LT.STEP) THEN
247 * ** Step limitation due to Cerenkov production ?
249 IF (IMCKOV.GT.0) THEN
251 STCKOV = MXPHOT/MAX(3.*DNDL,1E-10)
252 SMULS = MAX(STMIN, STCKOV)
253 IF (SMULS.LT.STEP) THEN
259 * ** Step limitation due to geometry ?
261 IF (STEP.GE.0.95*SAFETY) THEN
263 IF (IGNEXT.NE.0) THEN
268 * Update SAFETY in stack companions, if any
269 IF (IQ(JSTAK+3).NE.0) THEN
270 DO 20 IST = IQ(JSTAK+3),IQ(JSTAK+1)
271 JST = JSTAK + 3 + (IST-1)*NWSTAK
280 * *** Linear transport when no field or very short step
282 IF (IFIELD.EQ.0.OR.STEP.LE.PREC) THEN
284 IF (IGNEXT.NE.0) THEN
286 VECTMP = VECT(I) +STEP*VECT(I+3)
287 IF(VECTMP.EQ.VECT(I)) THEN
289 * *** Correct for machine precision
291 IF(VECT(I+3).NE.0.) THEN
293 + VECT(I)+ABS(VECT(I))*SIGN(1.,VECT(I+3))*EPSMAC
295 IF(LMEC(NMEC).EQ.104) NMEC=NMEC-1
299 #if defined(CERNLIB_DEBUG)
302 WRITE(CHMAIL, 10100) GEKIN, NUMED, STEP, SNEXT
304 10000 FORMAT(' Boundary correction in GTHADR: ',
305 + ' GEKIN NUMED STEP SNEXT')
306 10100 FORMAT(31X,E10.3,1X,I10,1X,E10.3,1X,E10.3,1X)
317 VECT(I) = VECT(I) +STEP*VECT(I+3)
322 * *** otherwise, swim particle in magnetic field
324 #if !defined(CERNLIB_OLD)
325 if(mycoun.gt.1.and.nfmany.gt.0.and.step.ge.safety)then
326 nlevel=manyle(nfmany)
328 names(i)=manyna(nfmany,i)
329 number(i)=manynu(nfmany,i)
331 call glvolu(nlevel,names,number,ier)
332 if(ier.ne.0)print *,'Fatal error in GLVOLU'
339 #if !defined(CERNLIB_USRJMP)
340 50 CALL GUSWIM (CHARGE, STEP, VECT, VOUT)
342 #if defined(CERNLIB_USRJMP)
343 50 CALL JUMPT4(JUSWIM, CHARGE, STEP, VECT, VOUT)
346 * ** When near to boundary, take proper action (cut-step,crossing...)
348 IF(STEP.GE.SAFETY)THEN
350 IF (IGNEXT.NE.0) THEN
352 VNEXT(I+3) = VECT(I+3)
353 VNEXT(I) = VECT(I) +SNEXT*VECT(I+3)
356 IF (ABS(VOUT(I)-VNEXT(I)).GT.EPSIL) GO TO 80
361 80 CALL GINVOL (VOUT, ISAME)
363 IF ((INEAR.NE.0).OR.(STEP.LT.EPSIL)) THEN
370 IF (LMEC(NMEC).NE.24) THEN
385 * *** Correct the step due to multiple scattering
388 CORR=0.0001*CHARG2*(STEP/RADL)*(GETOT/(VECT(7)*VECT(7)))**2
389 IF (CORR.GT.0.25) CORR = 0.25
390 STEP = (1.+CORR)*STEP
395 * *** Generate Cherenkov photons if required
405 * *** apply energy loss : find the kinetic energy corresponding
406 * to the new stopping range = stopmx - step
411 STOPRG = STOPP - STEP*RMASS*CHARG2
412 IF (STOPRG.LE.STOPC) THEN
416 IF(XCOEF1.NE.0.) THEN
417 EKIPR = XCOEF1*(XCOEF3+STOPRG*(2.*XCOEF2+STOPRG))
419 EKIPR = XCOEF2*STOPRG+XCOEF3
421 DEMEAN=GEKIN - EKIPR/RMASS
422 IF(DEMEAN.LE.5.*GEKIN*EPSMAC) THEN
423 DEMEAN=(GEKRT1*Q(JLOSS+IEKBIN)+GEKRAT*Q(JLOSS+IEKBIN+1))
426 IF (ILOSS.EQ.4.OR.IEKBIN.LE.IKCUT+1) THEN
430 CALL GFLUCT(DEMS,DESTEP)
431 DESTEP = DESTEP*CHARG2
433 DESTEP=MAX(DESTEP,0.)
434 GEKINT = GEKIN -DESTEP
435 IF (GEKINT.LE.(1.01*CUTHAD)) GO TO 100
439 VECT(7)= SQRT((GETOT+AMASS)*GEKIN)
443 * *** Apply multiple scattering.
451 * *** Update time of flight
453 SUMLIF = SUMLIF -STEP*AMASS/VECT(7)
454 TOFG = TOFG +STEP*GETOT/(VECT(7)*CLIGHT)
455 IF (TOFG.GE.TOFMAX) THEN
462 * *** Update interaction probabilities
464 IF (IHADR.GT.0) ZINTHA = ZINTHA*(1.-STEP/SHADR)
465 IF (IDRAY.GT.0) ZINTDR = ZINTDR -STEP/STEPDR
469 * ** Special treatment for overstopped tracks
483 TOFG = TOFG +0.5*(1+GAMMA)*SUMLIF/CLIGHT
485 IF (TOFG.GE.TOFMAX) THEN
501 * *** apply slected process if any
503 110 IF (IPROC.EQ.0) GO TO 999
507 * ** Hadron interaction ?
509 IF (IPROC.EQ.12) THEN
510 #if !defined(CERNLIB_USRJMP)
513 #if defined(CERNLIB_USRJMP)
516 * * Check time cut-off for decays at rest
517 IF (LMEC(NMEC).EQ.5) THEN
518 TOFG = TOFG +SUMLIF/CLIGHT
520 IF (TOFG.GE.TOFMAX) THEN
529 ELSE IF (IPROC.EQ.5) THEN
535 ELSE IF (IPROC.EQ.10) THEN
538 999 IF(NGPHOT.GT.0) THEN
539 IF(ITCKOV.EQ.2.AND.ISTOP.EQ.0) THEN
541 * The hadron has produced Cerenkov photons and it is still alive
542 * we put it in the stack and we let the photons to be tracked
544 GKIN(1,NGKINE) = VECT(4)*VECT(7)
545 GKIN(2,NGKINE) = VECT(5)*VECT(7)
546 GKIN(3,NGKINE) = VECT(6)*VECT(7)
547 GKIN(4,NGKINE) = GETOT
548 GKIN(5,NGKINE) = IPART
551 c----put position as well
552 GPOS(1,NGKINE)=VECT(1)
553 GPOS(2,NGKINE)=VECT(2)
554 GPOS(3,NGKINE)=VECT(3)