SUBROUTINE SEDIT C C Allows the user to looks at the data on a scan by scan basis C and edit out bad data. C C VERSION 2.0 14 September 1988 C C 26 Oct added undelete C IMPLICIT UNDEFINED (A-Z) SAVE REAL *4 PI, PISQ PARAMETER ( PI = 3.1415926535 ) PARAMETER (PISQ = PI*PI ) CHARACTER *11 VERSN, VERSD PARAMETER ( VERSN = 'VERSION 3.1' ) PARAMETER ( VERSD = '30 OCT 1988' ) INTEGER *4 ICNT PARAMETER ( ICNT = 50 ) INTEGER *4 NSUM, IERR, IREC, SYMBOL(5), BPTR, SPTR, XTYPE INTEGER *4 N, I, J, K, L, MONTH, DAY, YEAR, VCNT, NPTS INTEGER *4 IBASE, ISTAR, ICOLOR, NDATA, NDARK, ICHAN INTEGER *4 FITTED(2), IFILT(4), BEGIN, NAME(4), SPECTRUM INTEGER *4 IGRAPH, IPOINT, MASK(4), KCHAN REAL *4 INTTIME, UT, RX, RY REAL *4 CALAVG, CALRMS, BVAR(4), DEN, NPHOT, VAMP(4), VSQ REAL *4 SLOPE, CONST, SIGMA, FLUX(4), NAVG, NRMS, VAVG, VRMS REAL *4 PAR, RV, PMRA, PMDEC, MAGLIM, VMEAN, MEAN REAL *8 RAM, DECM INCLUDE 'VPLOT.INC' INCLUDE 'HARDCOPY.INC' LOGICAL *4 LBAD(ICNT,4), HCOPY REAL *4 XPLOT(ICNT), YPLOT(ICNT,7) REAL *4 XMIN, XMAX, YMIN, YMAX, XHI, XLO, YHI, YLO C CHARACTER * 1 CH CHARACTER * 4 LABEL(6) CHARACTER * 7 ICMD CHARACTER *12 OUTNAME CHARACTER *40 TITLE(6) C********************************************************************** DATA FITTED / 1, 10 / DATA SYMBOL / 16, 3, 5, 6, 13 / DATA LABEL / ' N', 'DARK', ' V1', ' V2', ' V3', ' V4' / DATA MASK / 1, 2, 4, 8 / C---------------------------------------------------------------------- WRITE(6,*) ' SCAN EDITOR ' WRITE(6,*) ' ', VERSN, ' ', VERSD C C Pointers C SPTR to the current star BPTR to the current baseline C ICHAN to the current channel XTYPE to the X axis type C IGRAPH to the current graph IPOINT to this point in the graph C HCOPY = .FALSE. SPTR = 1 BPTR = 1 ICHAN = 1 XTYPE = 1 10 CONTINUE IGRAPH = 1 IPOINT = 1 C C Set ega graphics C IF ( HCOPY ) THEN NPLOTS = NPLOTS + 1 WRITE(PLOTFILE(6:8),'(I3.3)') NPLOTS CALL PGBEGIN(0, PLOTFILE//PLOT_DEV, 1, 1 ) ELSE CALL PGBEGIN(0, '/EGA', 1, 1) END IF 100 CONTINUE C C Start the plot for each new star/baseline pair here C ISTAR = SLIST(SPTR) IBASE = BLIST(BPTR) IF ( XTYPE .EQ. 1 ) THEN TITLE(1) = 'TIME (HOURS)' ELSE TITLE(1) = 'HOUR ANGLE(HOURS)' END IF TITLE(2) = ' ' WRITE( TITLE(3),1500) SLIST(SPTR), ICHAN, FILTERID(ICHAN) WRITE( TITLE(4),1510) IBASE TITLE(5) = ' ' TITLE(6) = ' ' 1500 FORMAT ( 'DATA FOR STAR ', I5, ' CHANNEL =', I2, A8 ) 1510 FORMAT ( 'BASELINE NUMBER', I5, 20X ) YMIN = 0.0 YMAX = 1.1 IF ( XTYPE .EQ. 1 ) THEN XMIN = 1.0 XMAX = 14.0 ELSE XMIN = -8. XMAX = 8. END IF ICOLOR = 5 CALL PGSCI ( ICOLOR ) CALL PGSCH ( 1.5 ) CALL PGSLS ( 1 ) CALL PGRNGE ( XMIN, XMAX, XLO, XHI ) CALL PGRNGE ( YMIN, YMAX, YLO, YHI ) CALL PGENV ( XLO, XHI, YLO, YHI, 0, 1 ) CALL PGMTEXT ( 'T', 2.5, 0.5, 0.5, TITLE(3) ) CALL PGSCH ( 1.0 ) CALL PGMTEXT ( 'B', 3.5, 0.5, 0.5, TITLE(1) ) CALL PGMTEXT ( 'L', 3.5, 0.5, 0.5, TITLE(2) ) CALL PGMTEXT ( 'T', 1.5, 0.5, 0.5, TITLE(4) ) CALL PGMTEXT ( 'R', 2.5, 0.5, 0.5, TITLE(5) ) CALL PGMTEXT ( 'B', 5.0, 0.5, 0.5, TITLE(6) ) CALL PGSLW ( 1 ) ICOLOR = 1 C C Select all scans for this star/baseline that are not completely C deleted. C K = 0 KCHAN = 0 NPHOT = 0. DO 140 I = 1, ISCAN IF ( BASE(I) .NE. IBASE ) GO TO 140 IF ( STAR(I) .NE. ISTAR ) GO TO 140 IF ( OKSCAN(I) .EQ. 15 ) GO TO 140 K = K + 1 IF (XTYPE .EQ. 1 ) THEN XPLOT(K) = HOURS(I) ELSE XPLOT(K) = HA(I) END IF YPLOT(K,1) = BDEN(I,ICHAN) - D(I,ICHAN) YPLOT(K,2) = 10.*D(I,ICHAN) DO 130 J = 1, 4 YPLOT(K,J+2) = VIS(I,J) IF ( IAND(OKSCAN(I),MASK(J)) .EQ. 0 ) THEN LBAD(K,J) = .FALSE. ELSE LBAD(K,J) = .TRUE. END IF 130 CONTINUE SCANLIST(K)= I IF ( LBAD(I,ICHAN) ) GO TO 140 KCHAN = KCHAN + 1 NPHOT = MAX ( NPHOT, YPLOT(K,1) ) 140 CONTINUE C C Don't divide by zero if there is no data. C IF ( KCHAN .EQ. 0 ) THEN NPHOT = 1. END IF C C Normalize the photon flux and 10*the number of dark counts C DO 170 I = 1, K YPLOT(I,1) = YPLOT(I,1) / NPHOT YPLOT(I,2) = YPLOT(I,2) / NPHOT 170 CONTINUE C C Make the plots C DO 210 L = 1, 2 ICOLOR = ICOLOR + 1 CALL PGSCI ( ICOLOR ) CALL PGSLS ( L+1 ) CALL MYLINE (K,XPLOT,YPLOT(1,L), LBAD(1,ICHAN) ) CALL MYPOINT(K,XPLOT,YPLOT(1,L), LBAD(1,ICHAN),SYMBOL(1)) CALL PGTEXT ( XPLOT(1)-1., YPLOT(1,L), LABEL(L) ) 210 CONTINUE DO 230 L = 1, 4 ICOLOR = ICOLOR + 1 CALL PGSCI ( ICOLOR ) CALL PGSLS ( MOD(L+2,5)+1 ) CALL MYLINE (K, XPLOT, YPLOT(1,L+2), LBAD(1,L) ) CALL MYPOINT(K, XPLOT, YPLOT(1,L+2), LBAD(1,L), SYMBOL(1)) CALL PGTEXT ( XPLOT(1)-1., YPLOT(1,L+2), LABEL(L+2) ) 230 CONTINUE 650 CONTINUE C C If this is a hardcopy, terminate it. C IF ( HCOPY ) THEN HCOPY = .FALSE. CALL PGEND GO TO 10 END IF C C Prompt for next command while the graph is still displayed C CALL EGA_RESTORE_DEFAULT CALL LOCATE (0,0) IF ( K .EQ. 0 ) THEN CALL WRITE_STRING( 'NO DATA THIS STAR. COMMAND:' ) ELSE IF ( KCHAN .EQ. 0 ) THEN CALL WRITE_STRING( 'NO DATA THIS CHANNEL. COMMAND:' ) ELSE CALL WRITE_STRING( 'COMMAND:' ) END IF 660 CONTINUE IF ( KCHAN .EQ. 0 ) THEN RX = XLO RY = YLO ELSE IF ( LBAD(IPOINT,ICHAN) ) THEN RX = XLO RY = YLO ELSE RX = XPLOT(IPOINT) RY = YPLOT(IPOINT, IGRAPH) END IF CALL PGCURSE ( RX, RY, CH ) CALL CAPS ( CH ) IF ( CH .EQ. '?' ) THEN CALL LOCATE (0,1) CALL WRITE_STRING( ' N next star ') CALL LOCATE (0,2) CALL WRITE_STRING( ' P previous star ') CALL LOCATE (0,3) CALL WRITE_STRING( ' B next baseline ') CALL LOCATE (0,4) CALL WRITE_STRING( ' C next channel ') CALL LOCATE (0,5) CALL WRITE_STRING( ' E edit dark counts ') CALL LOCATE (0,6) CALL WRITE_STRING( ' D delete point ') CALL LOCATE (0,7) CALL WRITE_STRING( ' U undelete points ') CALL LOCATE (0,8) CALL WRITE_STRING( ' R right one point ') CALL LOCATE (0,9) CALL WRITE_STRING( ' L left one point ') CALL LOCATE (0,10) CALL WRITE_STRING( ' T toggle cursor positon') CALL LOCATE (0,11) CALL WRITE_STRING( ' X toggle x axis ') CALL LOCATE (0,12) CALL WRITE_STRING( ' H hardcopy ') CALL LOCATE (0,13) CALL WRITE_STRING( ' Q quit ') GO TO 650 ELSE IF ( CH .EQ. 'R' ) THEN DO 665, J = 1, K IPOINT = MOD(IPOINT, K ) + 1 IF ( .NOT. LBAD(IPOINT,ICHAN)) GO TO 660 665 CONTINUE ELSE IF ( CH .EQ. 'L' ) THEN DO 666 J = 1, K IPOINT = MOD ( IPOINT+K-2, K ) + 1 IF ( .NOT. LBAD(IPOINT,ICHAN)) GO TO 660 666 CONTINUE ELSE IF ( CH .EQ. 'T' ) THEN IGRAPH = MOD ( IGRAPH, 6 ) + 1 GO TO 660 ELSE IF ( CH .EQ. 'C' ) THEN ICHAN = MOD(ICHAN,4) + 1 ELSE IF ( CH .EQ. 'D' ) THEN C C Delete the current point, for channel ICHAN C LBAD(IPOINT,ICHAN) = .TRUE. OKSCAN(SCANLIST(IPOINT)) = $ IOR(OKSCAN(SCANLIST(IPOINT)), MASK(ICHAN) ) DO 667, J = 1, K IPOINT = MOD(IPOINT,K) + 1 IF ( .NOT. LBAD(IPOINT,ICHAN) ) GO TO 668 667 CONTINUE SPTR = MOD(SPTR,NSTAR)+1 IGRAPH = 1 IPOINT = 1 668 CONTINUE ELSE IF ( CH .EQ. 'U' ) THEN DO 670 J = 1, ISCAN IF ( STAR(J) .EQ. SLIST(SPTR) ) THEN OKSCAN(J) = 0 END IF 670 CONTINUE ELSE IF ( CH .EQ. 'E' ) THEN IF ( K .EQ. 1 ) THEN CALL LOCATE(0,2) CALL WRITE_STRING('CANNOT AVERAGE DARK WITH 1 POINT') ELSE IF ( IPOINT .EQ. K ) THEN D(SCANLIST(K),ICHAN) = D(SCANLIST(K-1),ICHAN) ELSE IF ( IPOINT.EQ.1 ) THEN D(SCANLIST(1),ICHAN) = D(SCANLIST(2),ICHAN) ELSE D(SCANLIST(IPOINT),ICHAN) = 0.5 * ( $ D(SCANLIST(IPOINT-1),ICHAN) $ + D(SCANLIST(IPOINT+1),ICHAN) ) END IF ELSE IF ( CH .EQ. 'N' ) THEN SPTR = MOD ( SPTR, NSTAR ) + 1 IPOINT = 1 IGRAPH = 1 ELSE IF ( CH .EQ. 'P' ) THEN SPTR = MOD ( SPTR+NSTAR-2, NSTAR) + 1 ELSE IF ( CH .EQ. 'B' ) THEN BPTR = MOD ( BPTR, NBASE ) +1 ELSE IF ( CH .EQ. 'X' ) THEN XTYPE = MOD(XTYPE,2) + 1 ELSE IF ( CH .EQ. 'H' ) THEN HCOPY = .TRUE. CALL PGEND GO TO 10 ELSE IF ( CH .EQ. 'Q' ) THEN CALL PGEND GO TO 680 END IF CALL PGASK ( .FALSE. ) CALL PGADVANCE GO TO 100 680 CONTINUE 900 CONTINUE RETURN END SUBROUTINE MYLINE ( N, X, Y, LBAD ) IMPLICIT UNDEFINED (A-Z) SAVE INTEGER *4 N, NPTS, I, J PARAMETER ( NPTS=1000) REAL *4 X(*), Y(*), XPLT(NPTS), YPLT(NPTS) LOGICAL LBAD(*) I = 0 DO 100 J = 1, N IF ( LBAD(J) ) GO TO 100 I = I + 1 XPLT(I) = X(J) YPLT(I) = Y(J) IF ( I .EQ. NPTS ) GO TO 110 100 CONTINUE 110 CONTINUE IF ( I .GT. 0 ) THEN CALL PGLINE ( I, XPLT, YPLT ) END IF RETURN END SUBROUTINE MYPOINT ( N, X, Y, LBAD, SYMBOL ) IMPLICIT UNDEFINED (A-Z) SAVE INTEGER *4 N, I, SYMBOL REAL *4 X(*), Y(*) LOGICAL LBAD(*) DO 100 I = 1, N IF ( LBAD(I) ) GO TO 100 CALL PGPOINT( 1, X(I), Y(I), SYMBOL ) 100 CONTINUE RETURN END