SUBROUTINE ZPCFIT(SAMP,TOT,NADDS,N,NODES,NITER,AVE, * SMOOTH,RESP,STATUS) C C Module Number: 13.7.2.1 C C Module Name: ZPCFIT C C Keyphrase: C ---------- C compute photocathode response C C Description: C ------------ C This routine computes the HRS photocathode response by removing low C frequency variations in the data. C C FORTRAN Name: ZPCFIT.for C C C Keywords of Accessed Files : C -------------------------- C NONE C C Modules Called: C --------------- C CDBS: C zspfit C SDAS: C umsput C C History: C -------- C Version Date Author Description C 1 1 MAY 86 D. Lindler Designed and coded C 2 APRIL 88 D. LINDLER new sdas i/o and standards C------------------------------------------------------------------------ C PARAMETERS C SAMP - input vector of sample positions C TOT - input vector of total values at each sample position C NADDS - input vector of number of adds to each sample in tot C N - number of data points in SAMP,TOT, NADDS C NODES - Input number of spline nodes C NITER - number of iteration to perform C AVE - average for each point in tot C SMOOTH - smooth curve through ave C RESP - photocathode response for each point C STATUS - output error status C C C UMSPUT DESTINATIONS -- CB, DAO, 4-SEP-87 C INTEGER STDOUT PARAMETER (STDOUT = 1) INTEGER STDERR PARAMETER (STDERR = 2) C END IRAF77.INC C C INPUT/OUTPUT PARAMETERS C INTEGER N,NODES,STATUS,NADDS(2240),NITER DOUBLE PRECISION SAMP(2240),TOT(2240),AVE(2240),RESP(2240), * SMOOTH(2240) C C LOCAL VARIABLES C INTEGER ISTAT CHARACTER*130 CONTXT C --->WHAT HAPPENED INTEGER I,J C --->INDICES DOUBLE PRECISION SNODE(30),RNODE(30) C --->SPLINE NODE POSITIONS DOUBLE PRECISION SGOOD(2240),VGOOD(2240) C --->GOOD DATA POINTS INTEGER NGOOD,NKEEP DOUBLE PRECISION SUM,DEL,RMS C C----------------------------------------------------------------------- C C COMPUTE NODE LOCATIONS (DIODE POSITIONS) C DEL = (SAMP(N)-SAMP(1))/NODES C --->SPACING BETWEEN NODES DO 5 I=1,NODES SNODE(I)=1+DEL*(I-1) 5 CONTINUE C C COMPUTE AVERAGE FOR EACH DATA POINT C DO 10 I=1,N IF(NADDS(I).GT.0)THEN AVE(I)=TOT(I)/NADDS(I) ELSE AVE(I)=0.0D0 ENDIF 10 CONTINUE C C EXTRACT NON-ZERO POINTS AND COMPUTE AVERAGE OF GOOD POINTS C NGOOD=0 SUM=0.0 DO 11 I=1,N IF(AVE(I).GT.0.0D0)THEN NGOOD=NGOOD+1 VGOOD(NGOOD)=AVE(I) SGOOD(NGOOD)=SAMP(I) SUM=SUM+AVE(I) ENDIF 11 CONTINUE C C COMPUTE STARTING NODE VALUES AS AVERAGE OF DATA C SUM=SUM/NGOOD DO 12 J=1,NODES 12 RNODE(J)=SUM C C COMPUTE LOW FREQUENCY VARIATIONS ACROSS MAIN DIODE ARRAY C CALL ZSPFIT(SGOOD,VGOOD,NGOOD,SNODE,RNODE,NODES,NITER, * SMOOTH,STATUS) IF(STATUS.NE.0)THEN CONTXT='Error fitting smooth curve through responses' GO TO 999 C ENDIF C C DELETE POINTS MORE THAN 3 RMS FROM SMOOTH CURVE. PREFORM C THIS PROCESS UP TO TWO TIMES C DO 80 I=1,2 C C COMPUTE RMS RESIDUAL C RMS=0.0 DO 20 J=1,NGOOD 20 RMS=RMS+(VGOOD(J)-SMOOTH(J))**2 RMS=SQRT(RMS/NGOOD) C C KEEP ONLY POINTS LESS THAN 3 RMS DIFFERENCE FROM SMOOTH CURVE C RMS=RMS*3 NKEEP=0 DO 30 J=1,NGOOD IF(ABS(VGOOD(J)-SMOOTH(J)).LT.RMS)THEN NKEEP=NKEEP+1 SGOOD(NKEEP)=SGOOD(J) VGOOD(NKEEP)=VGOOD(J) ENDIF 30 CONTINUE IF(NGOOD.EQ.NKEEP)GO TO 85 C C REPEAT SPLINE FIT WITH GOOD DATA POINTS C CALL ZSPFIT(SGOOD,VGOOD,NKEEP,SNODE,RNODE,NODES,NITER, * SMOOTH,STATUS) IF(STATUS.NE.0)THEN CONTXT='Error fitting smooth curve through responses' GO TO 999 ENDIF NGOOD=NKEEP 80 CONTINUE C C COMPUTE SMOOTH CURVE THROUGH ALL POINTS (INCLUDING SPECIAL DIODES) C 85 CALL ZSPLIN(SAMP,N,SNODE,RNODE,NODES,SMOOTH,STATUS) IF(STATUS.NE.0)THEN CONTXT='Error computing spline curve through all samples' GO TO 999 ENDIF C C COMPUTE RESPONSE BY DIVIDING BY SMOOTH CURVE C DO 90 I=1,N IF(AVE(I).EQ.0)THEN RESP(I)=1.0 ELSE RESP(I)=AVE(I)/SMOOTH(I) ENDIF 90 CONTINUE C C DONE C STATUS=0 GO TO 1000 999 CALL UMSPUT(CONTXT,STDOUT+STDERR,0,ISTAT) 1000 RETURN END