*********************************************************************** c SUBROUTINE FWDETDIGI c c last modified on: 30/11/2015 by I. Koenig c *********************************************************************** IMPLICIT NONE #include "geant321/gcflag.inc" #include "fwdettuple.inc" #include "user.inc" INTEGER NHDIM, NVDIM, NHMAX PARAMETER (NHDIM=17,NVDIM=6,NHMAX=500) INTEGER ITRACK(NHMAX), NUMVS(NVDIM), NUMBV(NVDIM,NHMAX) DATA NUMVS /0, 0, 0, 0, 0, 0/ !mod, layer, d-mod, block, tube, gas INTEGER NHITS, NTUPID REAL HITS(NHDIM,NHMAX) CHARACTER*2 SENSVOL(2) DATA SENSVOL /'SV', 'HV'/ CHARACTER*4 IUDET INTEGER IMOD, VMOD, I, L, N_T, SC REAL CUR_TR, X_IN, Y_IN, Z_IN, PX_IN, PY_IN, PZ_IN REAL TOF_IN, LEN_IN, PTOT NTRK = 0 DO IMOD=1,NMAXMOD ! loop over modules DO VMOD=1,2 ! sens vol index IUDET='A'//CHAR(IMOD+48)//SENSVOL(VMOD) CALL GFHITS('FWDE',IUDET,NVDIM,NHDIM,NHMAX,0,NUMVS, & ITRACK,NUMBV,HITS,NHITS) IF (NHITS.GT.NHMAX) THEN ! overflow WRITE(6,*) 'ERROR: overflow in fwdetdigi.F (nHits>', & NHMAX,') in FwDet cell',IMOD,I RETURN ENDIF DO L=1,NHITS ! loop over hits ! check for short straws in Straw detector IF (IMOD.LE.2 .AND. VMOD.EQ.1) THEN SC = 3 ELSE SC = HITS(13,L) ENDIF IF (HITS(17,L).EQ.1 .OR. HITS(9,L).EQ.0.0 ) THEN ! new volume entered or new track CUR_TR = HITS(14,L) ! save current track X_IN = HITS(1,L) ! save parameters at entrance Y_IN = HITS(2,L) Z_IN = HITS(3,L) PX_IN = HITS(4,L) PY_IN = HITS(5,L) PZ_IN = HITS(6,L) TOF_IN = HITS(7,L) LEN_IN = HITS(8,L) ELSE IF (HITS(14,L).EQ.CUR_TR .AND. ! same track and energy loss > 0 & HITS(9,L).GT.0.0) THEN IF (NTRK.LT.MAXTRKFWDET) THEN NTRK = NTRK + 1 ! number of tracks FWDETTRK(NTRK) = CUR_TR ! track number FWDETPART(NTRK) = HITS(15,L) ! particle id FWDETMOD(NTRK) = HITS(10,L) ! module number FWDETLAY(NTRK) = HITS(11,L) ! layer * VMOD FWDETCELL(NTRK) = HITS(12,L) ! cell number FWDETSUB(NTRK) = SC FWDETX(NTRK) = LUNIT*X_IN ! x pos at entrance (in mm) FWDETY(NTRK) = LUNIT*Y_IN ! y pos at entrance (in mm) FWDETZ(NTRK) = LUNIT*Z_IN ! z pos at entrance (in mm) PTOT = HITS(16,L)*1.0e3 ! total momentum of the particle (in MeV/c) FWDETPX(NTRK) = PX_IN*PTOT ! x component of momentum (in MeV/c) FWDETPY(NTRK) = PY_IN*PTOT ! y component of momentum (in MeV/c) FWDETPZ(NTRK) = PZ_IN*PTOT ! z component of momentum (in MeV/c) FWDETTOF(NTRK) = TOF_IN*1.0e9 ! time of flight at entrance (in ns) FWDETLEN(NTRK) = LUNIT*LEN_IN ! track length (in mm) FWDETE(NTRK) = HITS(9,L)*1.0e3 ! energy loss (in MeV) ELSE WRITE(6,*) 'ERROR: too many hits (>', & MAXTRKFWDET,') in FwDet',IMOD,I RETURN ENDIF ENDIF ENDDO ! end hit loop ENDDO ! end vol loop ENDDO ! end module loop IF(IROOT.EQ.1) THEN CALL FILLFWDET ENDIF RETURN END