*********************************************************************** c SUBROUTINE STSDIGI c c last modified on: 30/11/2015 by I. Koenig c *********************************************************************** IMPLICIT NONE #include "geant321/gcflag.inc" #include "ststuple.inc" #include "user.inc" INTEGER NHDIM, NVDIM, NHMAX PARAMETER (NHDIM=17,NVDIM=6,NHMAX=10000) 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, 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('FSTS',IUDET,NVDIM,NHDIM,NHMAX,0,NUMVS, & ITRACK,NUMBV,HITS,NHITS) IF (NHITS.GT.NHMAX) THEN ! overflow WRITE(6,*) 'ERROR: overflow in stsdigi.F (nHits>', & NHMAX,') in Sts cell',IMOD RETURN ENDIF DO L=1,NHITS ! loop over hits ! check for short straws in Straw detector IF (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)+HITS(1,L+1))/2.0 ! save parameters at entrance Y_IN = (HITS(2,L)+HITS(2,L+1))/2.0 Z_IN = (HITS(3,L)+HITS(3,L+1))/2.0 PX_IN = HITS(4,L) PY_IN = HITS(5,L) PZ_IN = HITS(6,L) TOF_IN = (HITS(7,L)+HITS(7,L+1))/2.0 LEN_IN = HITS(8,L) c write(6,*) IMOD, HITS(7,L), HITS(7,L+1) 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.MAXTRKSTS) THEN NTRK = NTRK + 1 ! number of tracks STSTRK(NTRK) = CUR_TR ! track number STSPART(NTRK) = HITS(15,L) ! particle id STSMOD(NTRK) = HITS(10,L) ! module number STSLAY(NTRK) = HITS(11,L) ! layer * VMOD STSCELL(NTRK) = HITS(12,L) ! cell number STSSUB(NTRK) = SC STSX(NTRK) = LUNIT*X_IN ! x pos at entrance (in mm) STSY(NTRK) = LUNIT*Y_IN ! y pos at entrance (in mm) STSZ(NTRK) = LUNIT*Z_IN ! z pos at entrance (in mm) PTOT = HITS(16,L)*1.0e3 ! total momentum of the particle (in MeV/c) STSPX(NTRK) = PX_IN*PTOT ! x component of momentum (in MeV/c) STSPY(NTRK) = PY_IN*PTOT ! y component of momentum (in MeV/c) STSPZ(NTRK) = PZ_IN*PTOT ! z component of momentum (in MeV/c) STSTOF(NTRK) = TOF_IN*1.0e9 ! time of flight at entrance (in ns) STSLEN(NTRK) = LUNIT*LEN_IN ! track length (in mm) STSE(NTRK) = HITS(9,L)*1.0e3 ! energy loss (in MeV) ELSE WRITE(6,*) 'ERROR: too many hits (>', & MAXTRKSTS,') in Sts',IMOD RETURN ENDIF ENDIF ENDDO ! end hit loop ENDDO ! end vol loop ENDDO ! end module loop IF(IROOT.EQ.1) THEN CALL FILLSTS ENDIF RETURN END