SUBROUTINE ZDFOC(DATA,NADDS,EDGE,FOCUS,STATUS) C C Module Number: 13.3.1.2 C C Module Name: zdfoc C C Keyphrase: C ---------- C Compute HRS focus parameter C C Description: C ------------ C A merged vector of the edge scan is normalized by dividing C by the number of adds to the data points. The edge PROFIL C is extracted (points 200 to 399 for the left edge, 4701 to 4900 C for the right edge). The focus is computed as the distance C of the 10 and 90 % levels in the edge PROFIL. C C FORTRAN Name: zdfoc.for C C C Keywords of Accessed Files : C -------------------------- C none C C Modules Called: C --------------- C SDAS: C UMSPUT C C History: C -------- C Version Date Author Description C 1 Oct 86 D. Lindler Designed and coded C C------------------------------------------------------------------------ C INCLUDE FILE FOR THE IRAF77 FORTRAN INTERFACE TO THE IRAF VOS C C C FILE I/O ACCESS MODES C INTEGER RDONLY PARAMETER (RDONLY = 1) INTEGER RDWRIT PARAMETER (RDWRIT = 2) INTEGER WRONLY PARAMETER (WRONLY = 3) INTEGER APPEND PARAMETER (APPEND = 4) C C CODES FOR DATA TYPES C INTEGER TYBOOL PARAMETER (TYBOOL = 1) INTEGER TYCHAR PARAMETER (TYCHAR = 2) INTEGER TYINT PARAMETER (TYINT = 4) INTEGER TYREAL PARAMETER (TYREAL = 6) INTEGER TYDOUB PARAMETER (TYDOUB = 7) C C UMSPUT DESTINATIONS -- CB, DAO, 4-SEP-87 C INTEGER STDOUT PARAMETER (STDOUT = 1) INTEGER STDERR PARAMETER (STDERR = 2) C C UHDAS HEADER PARM TYPES -- CB, DAO, 5-SEP-87 C INTEGER GENHDR PARAMETER (GENHDR = 0) INTEGER IMSPEC PARAMETER (IMSPEC = 1) C C THIS SECTION IS FOR PARAMETERS RELEVANT TO TABLE I/O. C C THESE MAY BE SET BY UTPPTI AND/OR READ BY UTPGTI: C C LENGTH OF ROW (UNIT = SIZE OF REAL) INTEGER TBRLEN PARAMETER (TBRLEN = 1) C INCREASE ROW LENGTH INTEGER TBIRLN PARAMETER (TBIRLN = 2) C NUMBER OF ROWS TO ALLOCATE INTEGER TBALLR PARAMETER (TBALLR = 3) C INCREASE ALLOC NUM OF ROWS INTEGER TBIALR PARAMETER (TBIALR = 4) C WHICH TYPE OF TABLE? (ROW OR COLUMN) INTEGER TBWTYP PARAMETER (TBWTYP = 5) C MAXIMUM NUMBER OF USER PARAMETERS INTEGER TBMXPR PARAMETER (TBMXPR = 6) C MAXIMUM NUMBER OF COLUMNS INTEGER TBMXCL PARAMETER (TBMXCL = 7) C TYPE = ROW-ORDERED TABLE INTEGER TBTYPR PARAMETER (TBTYPR = 11) C TYPE = COLUMN-ORDERED TABLE INTEGER TBTYPC PARAMETER (TBTYPC = 12) C C THESE MAY BE READ BY UTPGTI BUT MAY NOT BE SET: C C NUMBER OF ROWS WRITTEN TO INTEGER TBNROW PARAMETER (TBNROW = 21) C C END IRAF77.INC C C INPUT PARAMETERS C DOUBLE PRECISION DATA(5100) C --->MERGED DATA VALUED INTEGER NADDS(5100) C --->NUMBER OF ADDS TO DATA CHARACTER*5 EDGE C --->EDGE LEFT OR RIGHT C C OUTPUT PARAMTERS C DOUBLE PRECISION FOCUS C --->FOCUS VALUE INTEGER STATUS C --->ERROR STATUS C C LOCAL VARIABLES C DOUBLE PRECISION PROFIL(200) C --->EDGE PROFIL DOUBLE PRECISION XPOS(200) C --->X-POSITIONS FOR PROFIL INTEGER NP C --->NUMBER OF POINTS IN PROFIL INTEGER INC C --->INCREMENT +1 LEFT EDGE -1 RIGHT DOUBLE PRECISION DMIN,DMAX C --->EDGE MAX AND MIN DOUBLE PRECISION D10,D90 C --->EDGE 10 AND 90 PERCENT LEVELS DOUBLE PRECISION X10,X90 C --->POSITION OF 10 AND 90 % LEVELS INTEGER IPOS C --->POSITION IN DATA ARRAY INTEGER I C --->INDEX CHARACTER*130 CONTXT,MESS C --->TEXT MESSAGES INTEGER ISTAT C------------------------------------------------------------------------- C C SET EDGE SPECIFIC PARAMETERS C IF(EDGE.EQ.'RIGHT')THEN IPOS=4900 C --->START AT END OF DATA INC=-1 C --->AND WORK BACKWARDS ELSE IPOS=200 INC=1 ENDIF C C EXTRACT EDGE PROFIL AND FIND MIN AND MAX C NP=0 DO 10 I=1,200 IF(NADDS(IPOS).GT.0)THEN NP=NP+1 PROFIL(NP)=DATA(IPOS)/NADDS(IPOS) XPOS(NP)=IPOS ENDIF IPOS=IPOS+INC 10 CONTINUE C C CHECK TO SEE IF EDGE WAS OBSERVED C IF( ( (EDGE.EQ.'LEFT').AND.(XPOS(1).GT.280)) .OR. & ((EDGE.EQ.'RIGHT').AND.(XPOS(1).LT.4820)) .OR. & (NP.LT.10))THEN CONTXT='EDGE NOT OBSERVED' STATUS=1 GO TO 999 ENDIF C C COMPUTE MIN AS AVERAGE FOR FIRST FIVE POINT IN EDGE PROFIL C DMIN=0.0 DO 20 I=1,5 DMIN=DMIN+PROFIL(I) 20 CONTINUE DMIN=DMIN/5.0 C C COMPUTE MAX AS AVERAGE OF LAST FIVE POINTS C DMAX=0.0 DO 30 I=1,5 DMAX=DMAX+PROFIL(NP-I+1) 30 CONTINUE DMAX=DMAX/5.0 C C CHECK IF EDGE VISIBLE C IF(DMAX.LT.(DMIN*2.0))THEN CONTXT='EDGE NOT VISIBLE' GO TO 999 ENDIF C C COMPUTE 10 AND 90 PERCENT LEVELS C D10=DMIN+(DMAX-DMIN)*0.1 D90=DMIN+(DMAX-DMIN)*0.9 C C FIND POSITION OF 10% LEVEL C DO 50 I=2,NP IF(PROFIL(I).GT.D10)GO TO 55 50 CONTINUE 55 X10=XPOS(I-1) + (D10-PROFIL(I-1)) * (XPOS(I)-XPOS(I-1))/ * (PROFIL(I)-PROFIL(I-1)) DO 60 I=2,NP IF(PROFIL(I).GT.D90)GO TO 65 60 CONTINUE 65 X90=XPOS(I-1) + (D90-PROFIL(I-1))* (XPOS(I)-XPOS(I-1))/ * (PROFIL(I)-PROFIL(I-1)) C C COMPUTE FOCUS AS DIFFERENCE IN X10 AND X90 C FOCUS=ABS(X90-X10) C C WRITE RESULTS C WRITE(MESS,99)FOCUS 99 FORMAT(' FOCUS VALUE =',F7.2,' DEFLECTION STEPS') CALL UMSPUT(MESS,STDOUT,0,ISTAT) STATUS=0 GO TO 1000 999 CALL UMSPUT(CONTXT,STDOUT+STDERR,0,ISTAT) 1000 RETURN END