SUBROUTINE CDPEAK ( * * inputs * : COUNT, FLAG, OKVAL, HITVAL, DIMMAX, NPEAK, : HPT, VPT, * * output * : PEAKCT, DPEAK, STATUS) * * Module number: * * Module name: * * Keyphrase: * ---------- * Find the brightest NPEAK points and calculate their mean value. * * Description: * ------------ * Maximum size of the array is 80 by 80. * * FORTRAN name: CDPEAK.FOR * * Keywords of accessed files and tables: * -------------------------------------- * Name I/O Description / Comments * * None * * Subroutines Called: * ------------------- * CDBS: * None * SDAS: * UMSPUT * Others: * None * * History: * -------- * Version Date Author Description * 1 01-20-87 J.-C. HSU design and coding * 2 10-20-87 J.-C. HSU F77 SDAS *------------------------------------------------------------------------------- * *== input: * --number of columns and rows of the * --area scan INTEGER HPT, VPT, * --dimension of COUNT, FLAG, X, and Y * --as declared in the calling routine : DIMMAX, * --number of highest counts to be picked * --out : NPEAK * --observed (average) number of counts, * --and its flag REAL COUNT(DIMMAX, DIMMAX), FLAG(DIMMAX, DIMMAX), * --mask value of good data points : OKVAL, * --mask value of particle events : HITVAL * *== output * --average of the highest NPEAK points * --and its mean error REAL PEAKCT, DPEAK * --error status INTEGER STATUS * *== local: * --maximum number and sum REAL MAX, SUM, SUMSQ, * --local flag array : XFLAG(80, 80) * --status and loop indices INTEGER STATOK, I, J, K, JJ, KK CHARACTER*5 CHAR5 * --error message context CHARACTER*130 CONTXT, MESS *=========================begin hsp.inc========================================= * --status return code INTEGER OK, ERRNUM(20) INTEGER DEST, PRIO DATA OK /0/ DATA ERRNUM /701, 702, 703, 704, 705, 706, 707, 708, 709, 710, : 711, 712, 713, 714, 715, 716, 717, 718, 719, 720/ * --message destination and priority DATA DEST, PRIO /1, 0/ *=========================end hsp.inc=========================================== *------------------------------------------------------------------------------ * * check for valid NPEAK value * IF (NPEAK. LT. 1) THEN STATUS = ERRNUM(1) CONTXT = 'non-positive number of peak points was specified' GO TO 999 END IF * * check the dimension of XFLAG * IF (DIMMAX .GT. 80) THEN STATUS = ERRNUM(2) CONTXT = 'improper local array dimension declaration' GO TO 999 END IF * * equate the local flag to the input flag * DO 20 I = 1, DIMMAX DO 10 J = 1, DIMMAX XFLAG(I, J) = FLAG(I, J) 10 CONTINUE 20 CONTINUE * * look for the NPEAK highest points * SUM = 0. SUMSQ = 0. * DO 50 I = 1, NPEAK MAX = -1. * * process each row * DO 40 J = 1, VPT * * process each column * DO 30 K = 1, HPT IF (XFLAG(J, K) .NE. HITVAL .AND. : COUNT(J, K) .GT. MAX) THEN MAX = COUNT(J, K) JJ = J KK = K END IF 30 CONTINUE 40 CONTINUE * * if no maximum number * IF (MAX .LT. 0) THEN STATUS = ERRNUM(3) WRITE (CHAR5, '(I5)') NPEAK CONTXT = 'good data points is less than ' // CHAR5 GO TO 999 END IF XFLAG(JJ, KK) = HITVAL SUM = MAX + SUM SUMSQ = MAX ** 2 + SUMSQ 50 CONTINUE * * mean peak count level and its mean error * PEAKCT = SUM / REAL(NPEAK) IF (NPEAK .EQ. 1) THEN DPEAK = SQRT(PEAKCT) ELSE DPEAK = SQRT((SUMSQ / REAL(NPEAK) - PEAKCT ** 2) / : REAL(NPEAK - 1)) END IF * STATUS = OK GO TO 1000 * 999 MESS = 'CDPEAK: ' // CONTXT CALL UMSPUT (MESS, DEST, PRIO, STATOK) * 1000 RETURN END