SUBROUTINE ZPEDGE(DATA,XDEF,FIRST,XPOS,EDGE,STATUS) C C Module Number: 13.8.1.1 C C Module Name: ZPEDGE C C Keyphrase: C ---------- C Routine to find left or right photocathode edge position for ZMPSC C C Description: C ------------ C This routine takes the data from a single HRS substep bin and locates C the photocathode edge. It uses the interpolated value where the data C is 1/2*(max+min) of the edge profile. It also computes the centroid C of the differential of the edge profile. If the centroid is more than C one diode from the half max edge location, the edge is reported as not C found. C C FORTRAN Name: ZPEDGE.for C C C Keywords of Accessed Files : C -------------------------- C NONE C C Modules Called: C --------------- C SDAS: C UMSPUT C History: C -------- C Version Date Author Description C 1 Mar 10 86 D. Lindler Designed and Coded C 2 Jul 24 86 D. Lindler Added units to output (SPR-26) C 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: C DOUBLE PRECISION DATA(1) C ---> Data array of 500 diodes DOUBLE PRECISION XDEF C ---> x-deflection LOGICAL FIRST C ---> set to true before first call C C OUTPUT: C DOUBLE PRECISION XPOS C ---> found edge position (diode units) CHARACTER*5 EDGE C ---> 'RIGHT' or 'LEFT' edge INTEGER STATUS C ---> error status C C LOCAL VARIABLES C INTEGER IAPP C ---> APPROXIMATE EDGE POSITION DOUBLE PRECISION D(14) C ---> PORTION OF DATA CONTAINING EDGE *, DMAX C ---> MAX OF D *, DMIN C ---> MIN OF D *, TOTDX C ---> TOTAL OF X TIMES D (FOR CENTROID) *, DIFF C ---> DIFFERENCE *, TOTD C ---> TOTAL OF DIFFERENTIAL OF D (FOR CENTROID) *, CENTRD C ---> CENTROID OF DIFFERENTIATED LINE PROFILE *, HMAX C ---> 1/2 (MIN+MAX) INTEGER I C ---> INDEX IN D INTEGER IPOS C ---> INDEX IN DATA CHARACTER*130 HD CHARACTER*130 HD2 CHARACTER*130 MESS C ---> OUTPUT MESSAGE INTEGER ISTAT C C DATA DECLARATIONS C DATA HD/' XDEF EDGE LOC.'/ DATA HD2/' (DIODE NO.)'/ C C DETERMINE IF LEFT OF RIGHT EDGE C EDGE='LEFT' IF(XDEF.GT.2048)EDGE='RIGHT' C C COMPUTE APPROXIMATE EDGE LOCATION C IF(EDGE.EQ.'LEFT') THEN IAPP= -30.0-(XDEF-2048)/8.0 ELSE IAPP=530.0-(XDEF-2048)/8.0 ENDIF C C DETERMINE IF WE ARE TOO CLOSE TO EDGE OF DATA ARRAY C IF ((IAPP.LT.3) .OR. (IAPP.GT.498)) GO TO 999 C C EXTRACT REGION CONTAINING THE EDGE AND FIND MIN AND MAX OF REGION C DMIN=1.0E10 DMAX=0.0 DO 5 I=1,14 IPOS=IAPP + I - 7 D(I)=0.0 IF((IPOS.GT.0) .AND. (IPOS.LT.500)) D(I)=DATA(IPOS) IF(D(I).LT.DMIN) DMIN=D(I) IF(D(I).GT.DMAX) DMAX=D(I) 5 CONTINUE C C CHECK TO SEE IF ALL DATA HAS EQUAL VALUE C IF(DMIN.EQ.DMAX) GO TO 999 C C IF ON RIGHT EDGE INVERT DATA TO LOOK LIKE A LEFT EDGE C IF(EDGE.EQ.'RIGHT') THEN DO 20 I=1,14 D(I)=DMAX-D(I)+DMIN 20 CONTINUE ENDIF C C FIND CENTROID OF THE DIREVATIVE C TOTDX=0.0 TOTD=0.0 DO 30 I=1,13 DIFF=D(I+1)-D(I) TOTDX=TOTDX+I*DIFF TOTD=TOTD+DIFF 30 CONTINUE CENTRD=TOTDX/TOTD C C FIND POSITION AT HALF MAX C HMAX=(DMAX+DMIN)/2.0 DO 40 I=1,13 IF(D(I+1).GT.HMAX) GO TO 10 40 CONTINUE 10 XPOS=I+(HMAX-D(I))/(D(I+1)-D(I)) C C DON'T USE IF CENTROID IS MORE THAN ONE DIODE FROM XPOS C IF(ABS(XPOS-CENTRD).GT.1.0) GO TO 999 C C ADD OFFSET FOR D IN DATA C XPOS=XPOS+IAPP-8 C STATUS=0 IF(FIRST) THEN CALL UMSPUT(HD,STDOUT,0,ISTAT) CALL UMSPUT(HD2,STDOUT,0,ISTAT) ENDIF FIRST=.FALSE. WRITE(MESS,99)XDEF,XPOS 99 FORMAT(10X,F5.0,F10.2) CALL UMSPUT(MESS,STDOUT,0,ISTAT) GO TO 1000 999 STATUS=1 CALL UMSPUT('Edge not found',STDOUT,0,ISTAT) 1000 RETURN END