SUBROUTINE ZDRFIT(BIG,NSETS,NODES,NITER,STATUS) C C Module Number: 13.7.1.2 C C Module Name: ZDRFIT C C Keyphrase: C ---------- C compute diode response C C Description: C ------------ C This routine computes the HRS diode response by removing low C frequency variations in the data. C C FORTRAN Name: zdrfit.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 C------------------------------------------------------------------------ C PARAMETERS C C BIG - 512 x NSETS array of sums for each set. C Output with diode response for each set C NSETS - input number of sets C NODES - Input number of spline nodes C NITER - number of iteration to perform 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 NSETS,NITER,NODES,STATUS DOUBLE PRECISION BIG(512,NSETS) C --->SUMS FOR EACH SET C C LOCAL VARIABLES C DOUBLE PRECISION MAIN(500) C --->DATA FOR MAIN DIODE ARRAY INTEGER ISTAT DOUBLE PRECISION DIODE(512) C --->DIODE LOCATIONS DOUBLE PRECISION DPOS(12) C --->EFFECTIVE DIODE LOCATION C --->OF THE SPECIAL DIODES CHARACTER*130 CONTXT C --->WHAT HAPPENED INTEGER I,J,ISET C --->INDICES DOUBLE PRECISION VAL,RMS,AVE DOUBLE PRECISION SDATA(512) C --->SMOOTHED RESULTS FROM DCURVE DOUBLE PRECISION DNODE(30),RNODE(30) C --->SPLINE NODE POSITIONS DOUBLE PRECISION DGOOD(500) C --->GOOD DATA POINTS INTEGER NGOOD C --->NUMBER OF GOOD DATA POINTS DATA DPOS/-15,-15,-15,-1,-1,-1,502,502,502,516,516,516/ C C----------------------------------------------------------------------- C C GENERATE DIODE LOCATION ARRAY C DO 1 I=1,500 DIODE(I+6)=I 1 CONTINUE DO 2 I=1,6 DIODE(I)=DPOS(I) DIODE(506+I)=DPOS(I+6) 2 CONTINUE C C COMPUTE NODE LOCATIONS (DIODE POSITIONS) C VAL=500/(NODES-1) C --->SPACING BETWEEN NODES DO 5 I=1,NODES DNODE(I)=1+VAL*(I-1) 5 CONTINUE C C LOOP ON OBSERVATION SETS C DO 100 ISET=1,NSETS C C COMPUTE STARTING GUESS FOR SMOOTH CURVE (USE AVERAGE OF 500 MAIN DIODES) C AVE=0.0D0 DO 10 J=1,500 MAIN(J)=BIG(J+6,ISET) AVE=AVE+MAIN(J) 10 CONTINUE AVE=AVE/500.0D0 DO 11 J=1,NODES 11 RNODE(J)=AVE C C COMPUTE LOW FREQUENCY VARIATIONS ACROSS MAIN DIODE ARRAY C CALL ZSPFIT(DIODE(7),MAIN,500,DNODE,RNODE,NODES,NITER, * SDATA,STATUS) IF(STATUS.NE.0)THEN CONTXT='Error fitting smooth curve through responses' GO TO 999 ENDIF C C COMPUTE RMS RESIDUAL C RMS=0.0 DO 20 J=1,500 20 RMS=RMS+(MAIN(J)-SDATA(J))**2 RMS=SQRT(RMS/500.0) C C KEEP ONLY POINTS LESS THAN 3 RMS DIFFERENCE FROM SMOOTH CURVE C RMS=RMS*3 NGOOD=0 DO 30 J=1,500 IF(ABS(MAIN(J)-SDATA(J)).LT.RMS)THEN NGOOD=NGOOD+1 DGOOD(NGOOD)=DIODE(J+6) MAIN(NGOOD)=MAIN(J) ENDIF 30 CONTINUE C C REPEAT SPLINE FIT WITH GOOD DATA POINTS C CALL ZSPFIT(DGOOD,MAIN,NGOOD,DNODE,RNODE,NODES,NITER, * SDATA,STATUS) IF(STATUS.NE.0)THEN CONTXT='Error fitting smooth curve through responses' GO TO 999 ENDIF C C COMPUTE SMOOTH CURVE THROUGH ALL POINTS (INCLUDING SPECIAL DIODES) C CALL ZSPLIN(DIODE,512,DNODE,RNODE,NODES,SDATA,STATUS) IF(STATUS.NE.0)THEN CONTXT='Error computing spline curve through all diodes' GO TO 999 ENDIF C C COMPUTE RESPONSE FOR MAIN ARRAY BY DIVIDING BY SMOOTH CURVE C DO 90 I=1,512 IF(SDATA(I).LE.0.0)THEN CONTXT='INVALID SMOOTH CURVE COMPUTED' STATUS=1 GO TO 999 ENDIF BIG(I,ISET)=BIG(I,ISET)/SDATA(I) 90 CONTINUE C C SET GOLD COVERED DIODES TO RESPONSE OF 1.0 C BIG(3,ISET)=1.0 BIG(510,ISET)=1.0 100 CONTINUE C C DONE C STATUS=0 GO TO 1000 999 CALL UMSPUT(CONTXT,STDOUT+STDERR,0,ISTAT) 1000 RETURN END