SUBROUTINE cmprsp (NCHAN, NENERG, MXELEM, MXGRPS, MXTGRP, RSP_MIN,
& matrix, rspmat, ngroup, ichanb, nchang, nelem,
& ntgrps)
INTEGER NCHAN, NENERG, MXELEM, MXGRPS, MXTGRP
REAL RSP_MIN
REAL matrix (NCHAN, NENERG)
REAL rspmat (MXELEM)
INTEGER ngroup (NENERG)
INTEGER ichanb (MXTGRP)
INTEGER nchang (MXTGRP)
INTEGER nelem, ntgrps
c Example routine to compress a response matrix to the XSPEC format
c kaa 3/13/89
c Arguments :
c NCHAN i i: Number of channels in response matrix
c NENERG i i: Number of energy bins in response matrix
c MXELEM i i: Max. number of non-zero response elements
c MXGRPS i i: Max. number of groups at a given energy
c MXTGRP i i: Max. number of total groups
c RSP_MIN r i: Minimum value of response that is stored
c matrix r i: Response matrix
c rspmat r r: Non-zero response elements
c ngroup i r: Number of contiguous channel sets
c ichanb i r: Start channel of a group
c nchang i r: Number of channels in a group
c nelem i r: Number of non-zero response elements
c ntgrps i r: Number of groups
REAL effic, rsp
INTEGER i, j, igroup, iresp
LOGICAL counting
c create the response matrix - start by looping over energies
igroup = 0
iresp = 0
DO i = 1, NENERG
c loop over channels
effic = 0
ngroup(i) = 0
counting = .FALSE.
DO j = 1, NCHAN
rsp = matrix (j, i)
c if response greater than minimum acceptable then include
IF ( rsp .GT. RSP_MIN ) THEN
iresp = iresp + 1
IF ( iresp .GT. MXELEM ) THEN
WRITE (*,*) 'Too many response elements'//
& ' - increase MXELEM'
CALL exit(1)
ENDIF
rspmat(iresp) = rsp
effic = effic + rsp
c if not currently in a group then start one
IF ( .NOT.counting ) THEN
igroup = igroup + 1
IF ( igroup .GT. MXTGRP ) THEN
WRITE (*,*) 'Too many response groups'//
& ' - increase MXTGRP'
WRITE (*,*) igroup, 'groups on ',
& j, i
CALL exit(1)
ENDIF
ichanb(igroup) = j
counting = .TRUE.
ngroup(i) = ngroup(i) + 1
IF ( ngroup(i) .GT. MXGRPS ) THEN
WRITE (*,*) 'Too many response groups'//
& ' - increase MXGRPS'
CALL exit(1)
ENDIF
ENDIF
c if response not greater than acceptable minimum and in a group
c then end that group
ELSE
IF ( counting ) THEN
counting = .FALSE.
nchang(igroup) = j - ichanb(igroup)
ENDIF
ENDIF
ENDDO
IF ( counting ) THEN
nchang(igroup) = NCHAN - ichanb(igroup) + 1
ENDIF
ENDDO
nelem = iresp
ntgrps = igroup
WRITE (*,*) 'Total number of response elements : ', iresp
WRITE (*,*) 'in ', igroup, ' groups.'
RETURN
END