C C This code is distributed under the terms and conditions of the C CCP4 licence agreement as `Part ii)' software. See the conditions C in the CCP4 manual for a copyright statement. C C ============= PROGRAM BPLOT C ============= C C Miri Hirshberg C C--- The current version calculates the maximum B-value for the chain C and adjust the y-axis-scale accordingly. C (The max y-axis-value of the plot is the maximum-B-value ) C C if you want to compare, for example, plots of WT and mutant, C they might have different y-axes-scales C (cause they have different maximum B-value) - and this is annoying. C C So, C C I've added a new key-word BMAX, which will be the maximum-y-axis-value C on the plot C (If the value you supplied is smaller then the calculated C maximum B-value for this chain, the supplied BMAX will not be used.) C C So, C C if you wish, you are well come to use this version C C #!/bin/csh -f C # C # C xyzin s85s102_cyc{$1}.brk plot a.plt << eof C TITLE s85s102 Chain B cyc $1 C RESIDUE B4 B110 C BMAX 50.0 C eof C # C # This output is suitable as is for x84 C # C # Here we are plotting a picture generated which is C # already portrait but we want landscape C # C pltdev -in a.plt -out a.ps -lan \ C -xpos -3.0 -ypos 3.0 -npict 1 -start 1 -lnwt 0.3 << eof C y C C eof C # C cat $CCP/include/pl.header a.ps > a.ps.header C mv a.ps.header Bchain.ps C # C exit C ======================================================= C C C C another improvement (??) to bplot, C C If you ever wanted to compare the b-plot of two chains, C chains A and B of Barnase for example, C the program can handle it now, C just follow the example file. C C #!/bin/csh -f C # C # BPLOT 24-9-92 (updated by Miri Hirshberg) C # C # example for plotting two b-value-traces on the same graph C # Key words C # TITLE C # RES1 first and last residue of chain1 (xyzin1) C # RES2 first and last residue of chain2 (xyzin2) C # COMP (tells the program there are two files to read) C # MAIN / SIDE either main-chain or side-chain C # BMAX set the scale of the y-axis - optional C # C # NOTE chain from the first file (xyzin1) will be plotted C # with a thick line, while chain from the second C # file will be plotted with thiner line C # C # C #goto OneChain C bplot XYZIN1 ~miri/projs/brn_wt/wt6_ws.brk \ C XYZIN2 ~miri/projs/brn_wt/wt9.brk \ C PLOT a.plt << eof C TITLEs B-PLOT WT6 chain C vs. WT9 chain A - main-chain C RES1 A4 A110 C RES2 A4 A110 C COMP C MAIN C !SIDE C eof C # C # This output is suitable as is for x84 C # C # Here we are plotting a picture generated which is C # already portrait but we want landscape C # C pltdev -in a.plt -out a.ps -lan \ C -xpos -3.0 -ypos 3.0 -npict 1 -start 1 -lnwt 0.3 << eof C y C C eof C # C cat $CCP/include/pl.header a.ps > a.ps.header C mv a.ps.header TwoChains.ps C # C /bin/rm -rf a.ps a.plt C # C #exit C C ################################################################## C # BPLOT 24-9-92 (updated by Miri Hirshberg) C # C # example for plotting one b-value-trace C # Key words C # TITLE C # RES1 first and last residue of chain (xyzin1) C # MAIN / SIDE either main-chain or side-chain, C # if omitted both main and side chain will C # be plotted C # BMAX set the scale of the y-axis - optional C # C ################################################################## C # C #OneChain: C bplot XYZIN1 ~miri/projs/brn_wt/wt6_ws.brk \ C PLOT a.plt << eof C TITLEs B-PLOT BARNASE WT6 chain C C RES1 C4 C110 C BMAX 45 C eof C # C # This output is suitable as is for x84 C # C # Here we are plotting a picture generated which is C # already portrait but we want landscape C # C pltdev -in a.plt -out a.ps -lan \ C -xpos -3.0 -ypos 3.0 -npict 1 -start 1 -lnwt 0.3 << eof C y C C eof C # C cat $CCP/include/pl.header a.ps > a.ps.header C mv a.ps.header OneChain.ps C # C /bin/rm -rf a.ps a.plt C # C exit C # C C C C C .. Parameters .. INTEGER MAXATM PARAMETER (MAXATM=10000) C .. C .. Scalars in Common .. REAL BMAXX,X_SCALE,Y_SCALE INTEGER NRES,NRES1 LOGICAL CROSSES,MCCB,NFIL,PLOTX,TEMPMC,TEMPSC CHARACTER SEQBEG*6,SEQBEG1*6,SEQEND*6,SEQEND1*6,TITLE*80 C .. C .. Arrays in Common .. REAL SUMB,SUMB1 INTEGER JRES,JRES1,NATM,NATM1 CHARACTER RESTYP*3,RESTYP1*3,SEQID*6,SEQID1*6 C .. C .. Local Scalars .. REAL BMC,BSC,XX INTEGER I,IFAILX,IFAILX1,IXYZIN1,IXYZIN2,LDUMX,LDUMX1 C .. C .. External Subroutines .. EXTERNAL CCPERR,CCPFYP,CCPRCS,GSENDP,GSMVTO,GSSTOP,PLOTB, + PLOTB1,READDAT,READXYZ1,READXYZ2,XYZCLOSE, + XYZINIT,XYZOPEN C .. C .. Common blocks .. COMMON /CCOORD/RESTYP(MAXATM),SEQID(MAXATM) COMMON /CCOORD1/RESTYP1(MAXATM),SEQID1(MAXATM) COMMON /CDEF/TITLE,SEQBEG,SEQEND,SEQBEG1,SEQEND1 COMMON /COORD/SUMB(2,MAXATM),NATM(2,MAXATM),JRES(MAXATM),NRES COMMON /COORD1/SUMB1(2,MAXATM),NATM1(2,MAXATM),JRES1(MAXATM),NRES1 COMMON /DEF/MCCB,TEMPMC,TEMPSC,PLOTX,X_SCALE,Y_SCALE,CROSSES, + BMAXX,NFIL C .. C .. Save statement .. SAVE C .. C C SEQBEG = ' ' SEQEND = ' ' SEQBEG1 = ' ' SEQEND1 = ' ' PLOTX = .TRUE. CROSSES = .FALSE. NFIL = .FALSE. C C---- Treat CB as SC for temperature factor C MCCB = .FALSE. TEMPMC = .TRUE. TEMPSC = .TRUE. X_SCALE = 0.85 Y_SCALE = 0.85 BMAXX = -1.0 C LDUMX = 80 IFAILX = 0 IXYZIN1 = 0 C C ************************************************* CALL CCPFYP CALL CCPRCS(6,'BPLOT', '$Date: 1997/10/13 15:35:08 $') CALL XYZINIT CALL READDAT CALL XYZOPEN('XYZIN1','INPUT',' ',IXYZIN1,IFAILX) CALL READXYZ1(IXYZIN1) C ************************************************* C C DO 10 I = 1,NRES BMC = -999 BSC = -999 C C---- Calculate average B factors C IF (NATM(1,I).GT.0) THEN BMC = SUMB(1,I)/NATM(1,I) SUMB(1,I) = BMC ELSE SUMB(1,I) = -999.0 END IF C C IF (NATM(2,I).GT.0) THEN BSC = SUMB(2,I)/NATM(2,I) SUMB(2,I) = BSC ELSE SUMB(2,I) = -999.0 END IF C C 10 CONTINUE C C---- read second file C IF (NFIL) THEN C C---- check that either main or side where selected C IF (TEMPMC .AND. TEMPSC) THEN C C ********************************************** CALL CCPERR(1, +' with two input files only main or side-chain can be plot ') C ********************************************** C END IF C C LDUMX1 = 80 IFAILX1 = 0 IXYZIN2 = 0 C C ******************************************** CALL XYZOPEN('XYZIN2','INPUT',' ',IXYZIN2,IFAILX) CALL READXYZ2(IXYZIN2) C ******************************************** C DO 20 I = 1,NRES1 BMC = -999 BSC = -999 C C---- Calculate average B factors C IF (NATM1(1,I).GT.0) THEN BMC = SUMB1(1,I)/NATM1(1,I) SUMB1(1,I) = BMC ELSE SUMB1(1,I) = -999.0 END IF C IF (NATM1(2,I).GT.0) THEN BSC = SUMB1(2,I)/NATM1(2,I) SUMB1(2,I) = BSC ELSE SUMB1(2,I) = -999.0 END IF C C 20 CONTINUE C C END IF C C IF (NFIL) THEN C C ****** CALL PLOTB1 C ****** C ELSE C C ***** CALL PLOTB C ***** C END IF C C XX = 10.0 C C *************************************** CALL GSMVTO(XX,0.0) CALL GSENDP CALL GSSTOP CALL XYZCLOSE(IXYZIN1) IF (NFIL) CALL XYZCLOSE(IXYZIN2) CALL CCPERR(0,' Normal Termination of BPLOT') C *************************************** C END C C C C =========================== SUBROUTINE READXYZ1(IXYZIN1) C =========================== C C C Open and read in the chain coords from the C Brookhaven format file. C C .. Parameters .. INTEGER MAXATM PARAMETER (MAXATM=10000) C .. C .. Arguments .. INTEGER IXYZIN1 C .. C .. Scalars in Common .. REAL BMAXX,X_SCALE,Y_SCALE INTEGER NRES LOGICAL CROSSES,MCCB,NFIL,PLOTX,TEMPMC,TEMPSC CHARACTER SEQBEG*6,SEQBEG1*6,SEQEND*6,SEQEND1*6,TITLE*80 C .. C .. Arrays in Common .. REAL SUMB INTEGER JRES,NATM CHARACTER RESTYP*3,SEQID*6 C .. C .. Local Scalars .. REAL B,OCC,X,Y,Z INTEGER I,IA,IRESN,ISER,J CHARACTER CH*1,RESNAM*3,ATNAM*4,OLDSEQ*6,SEQ*6,LINE*6,ALTCOD*1, + INSCOD*1,SEGID*4,ID*4,RESNO*5,CHNAM*1 C .. C .. Local Arrays .. REAL U(6) CHARACTER ATMNM(14)*4 C .. C .. External Routines .. EXTERNAL CCPERR,XYZADVANCE,XYZATOM,XYZCOORD C .. C .. Common blocks .. COMMON /CCOORD/RESTYP(MAXATM),SEQID(MAXATM) COMMON /CDEF/TITLE,SEQBEG,SEQEND,SEQBEG1,SEQEND1 COMMON /COORD/SUMB(2,MAXATM),NATM(2,MAXATM),JRES(MAXATM),NRES COMMON /DEF/MCCB,TEMPMC,TEMPSC,PLOTX,X_SCALE,Y_SCALE,CROSSES, + BMAXX,NFIL C .. C .. Save statement .. SAVE C .. C .. Data statements .. C C DATA ATMNM/'N ','CA ','C ','CB ','O ','CG ','CG1 ', + 'OG ','OG1 ','CD ','CD1 ','ND1 ','OD1 ','SD '/ C .. C C C---- Zero arrays C OLDSEQ = ' ' C C DO 20 I = 1,MAXATM DO 10 J = 1,2 SUMB(J,I) = 0.0 NATM(J,I) = 0 10 CONTINUE 20 CONTINUE C C---- Counter for number of residues in range C NRES = 0 C 30 CALL XYZADVANCE(IXYZIN1,0,0,*130,*130) CALL XYZCOORD(IXYZIN1,'O','U',X,Y,Z,OCC,B,U) IF (U(2).NE.0.0 .OR. U(3).NE.0.0) THEN IF (X.EQ.0.0 .AND. Y.EQ.0.0 .AND. Z.EQ.0.0) GOTO 30 ENDIF CALL XYZATOM(IXYZIN1,ISER,ATNAM,RESNAM,CHNAM,IRESN,RESNO, + INSCOD,ALTCOD,SEGID,IZ,ID) C C---- Compress Chain ID and sequence number C LINE = CHNAM//RESNO SEQ = ' ' J = 0 C C DO 40 I = 1,6 CH = LINE(I:I) IF (CH.NE.' ') THEN J = J + 1 SEQ(J:J) = CH END IF 40 CONTINUE C C IF (SEQBEG.NE.' ' .AND. SEQ.NE.SEQBEG .AND. + NRES.EQ.0) GO TO 30 C C C C---- Skip atom if zero occupacy C IF (OCC.EQ.0.0) GO TO 30 C C IF (SEQ.NE.OLDSEQ .OR. NRES.EQ.0) THEN C C---- A new residue C IF (SEQEND.NE.' ' .AND. OLDSEQ.EQ.SEQEND) RETURN NRES = NRES + 1 RESTYP(NRES) = RESNAM SEQID(NRES) = SEQ OLDSEQ = SEQ JRES(NRES) = IRESN END IF C C---- Loop over possible atom names C DO 50 I = 1,14 IA = I IF (ATNAM.EQ.ATMNM(I)) GO TO 60 50 CONTINUE C C IA = 15 60 CONTINUE C C GO TO (70,70,70,80,90,100,100,100,100, + 110,110,110,110,110,120) IA C C---- N, CA, C C 70 CONTINUE NATM(1,NRES) = NATM(1,NRES) + 1 SUMB(1,NRES) = SUMB(1,NRES) + B GO TO 30 C C---- CB C 80 CONTINUE IF (MCCB) THEN NATM(1,NRES) = NATM(1,NRES) + 1 SUMB(1,NRES) = SUMB(1,NRES) + B ELSE NATM(2,NRES) = NATM(2,NRES) + 1 SUMB(2,NRES) = SUMB(2,NRES) + B END IF C C GO TO 30 C C---- O C 90 CONTINUE NATM(1,NRES) = NATM(1,NRES) + 1 SUMB(1,NRES) = SUMB(1,NRES) + B GO TO 30 C C---- Gamma atom C 100 CONTINUE NATM(2,NRES) = NATM(2,NRES) + 1 SUMB(2,NRES) = SUMB(2,NRES) + B GO TO 30 C C---- Delta atom C 110 CONTINUE NATM(2,NRES) = NATM(2,NRES) + 1 SUMB(2,NRES) = SUMB(2,NRES) + B GO TO 30 C C---- Any other atom C 120 CONTINUE NATM(2,NRES) = NATM(2,NRES) + 1 SUMB(2,NRES) = SUMB(2,NRES) + B GO TO 30 C C 130 CONTINUE C C IF (NRES.EQ.0) THEN WRITE (6,FMT=6002) SEQBEG 6002 FORMAT (/' *** Residue ',A,' not found in coordinate file.') C C ****************************** CALL CCPERR(1, 'RESIDUE NOT FOUND') C ****************************** C ELSE IF (SEQEND.NE.' ' .AND. OLDSEQ.NE.SEQEND) THEN WRITE (6,FMT=6004) SEQEND,NRES,SEQBEG 6004 FORMAT (/' *** Residue ',A,' not found in coordinate file.', + /' Program will use the ',I4,' residues found in file a', + 'fter residue',A) END IF C C RETURN END C C C C =========================== SUBROUTINE READXYZ2(IXYZIN2) C =========================== C C C Open and read in the chain coords from the C Brookhaven format file. C C .. Parameters .. INTEGER MAXATM PARAMETER (MAXATM=10000) C .. C .. Arguments .. INTEGER IXYZIN2 C .. C .. Scalars in Common .. REAL BMAXX,X_SCALE,Y_SCALE INTEGER NRES1 LOGICAL CROSSES,MCCB,NFIL,PLOTX,TEMPMC,TEMPSC CHARACTER SEQBEG*6,SEQBEG1*6,SEQEND*6,SEQEND1*6,TITLE*80 C .. C .. Arrays in Common .. REAL SUMB1 INTEGER JRES1,NATM1 CHARACTER RESTYP1*3,SEQID1*6 C .. C .. Local Scalars .. REAL B,OCC,X,Y,Z INTEGER I,IA,IRESN,ISER,J CHARACTER CH*1,RESNAM*3,ATNAM*4,OLDSEQ*6,SEQ*6,LINE*6,ALTCOD*1, + INSCOD*1,SEGID*4,ID*4,RESNO*5,CHNAM*1 C .. C .. Local Arrays .. REAL U(6) CHARACTER ATMNM(14)*4 C .. C .. External Routines .. EXTERNAL CCPERR,XYZADVANCE,XYZATOM,XYZCOORD C .. C .. Common blocks .. COMMON /CCOORD1/RESTYP1(MAXATM),SEQID1(MAXATM) COMMON /CDEF/TITLE,SEQBEG,SEQEND,SEQBEG1,SEQEND1 COMMON /COORD1/SUMB1(2,MAXATM),NATM1(2,MAXATM),JRES1(MAXATM),NRES1 COMMON /DEF/MCCB,TEMPMC,TEMPSC,PLOTX,X_SCALE,Y_SCALE,CROSSES, + BMAXX,NFIL C .. C .. Save statement .. SAVE C .. C .. Data statements .. C C DATA ATMNM/'N ','CA ','C ','CB ','O ','CG ','CG1 ', + 'OG ','OG1 ','CD ','CD1 ','ND1 ','OD1 ','SD '/ C .. C C C Zero arrays C OLDSEQ = ' ' C C DO 20 I = 1,MAXATM DO 10 J = 1,2 SUMB1(J,I) = 0.0 NATM1(J,I) = 0 10 CONTINUE 20 CONTINUE C C---- Counter for number of residues in range C NRES1 = 0 C 30 CALL XYZADVANCE(IXYZIN2,0,0,*130,*130) CALL XYZCOORD(IXYZIN2,'O','U',X,Y,Z,OCC,B,U) IF (U(2).NE.0.0 .OR. U(3).NE.0.0) THEN IF (X.EQ.0.0 .AND. Y.EQ.0.0 .AND. Z.EQ.0.0) GOTO 30 ENDIF CALL XYZATOM(IXYZIN2,ISER,ATNAM,RESNAM,CHNAM,IRESN,RESNO, + INSCOD,ALTCOD,SEGID,IZ,ID) C C---- Compress Chain ID and sequence number C LINE = CHNAM//RESNO SEQ = ' ' J = 0 C C DO 40 I = 1,6 CH = LINE(I:I) IF (CH.NE.' ') THEN J = J + 1 SEQ(J:J) = CH END IF 40 CONTINUE C C IF (SEQBEG1.NE.' ' .AND. SEQ.NE.SEQBEG1 .AND. + NRES1.EQ.0) GO TO 30 C C---- Skip atom if zero occupacy C IF (OCC.EQ.0.0) GO TO 30 C IF (SEQ.NE.OLDSEQ .OR. NRES1.EQ.0) THEN C C---- A new residue C IF (SEQEND1.NE.' ' .AND. OLDSEQ.EQ.SEQEND1) RETURN NRES1 = NRES1 + 1 RESTYP1(NRES1) = RESNAM SEQID1(NRES1) = SEQ OLDSEQ = SEQ JRES1(NRES1) = IRESN END IF C C---- Loop over possible atom names C DO 50 I = 1,14 IA = I IF (ATNAM.EQ.ATMNM(I)) GO TO 60 50 CONTINUE C C IA = 15 60 CONTINUE C C GO TO (70,70,70,80,90,100,100,100,100, + 110,110,110,110,110,120) IA C C---- N, CA, C C 70 CONTINUE NATM1(1,NRES1) = NATM1(1,NRES1) + 1 SUMB1(1,NRES1) = SUMB1(1,NRES1) + B GO TO 30 C C---- CB C 80 CONTINUE IF (MCCB) THEN NATM1(1,NRES1) = NATM1(1,NRES1) + 1 SUMB1(1,NRES1) = SUMB1(1,NRES1) + B ELSE NATM1(2,NRES1) = NATM1(2,NRES1) + 1 SUMB1(2,NRES1) = SUMB1(2,NRES1) + B END IF GO TO 30 C C---- O C 90 CONTINUE NATM1(1,NRES1) = NATM1(1,NRES1) + 1 SUMB1(1,NRES1) = SUMB1(1,NRES1) + B GO TO 30 C C---- Gamma atom C 100 CONTINUE NATM1(2,NRES1) = NATM1(2,NRES1) + 1 SUMB1(2,NRES1) = SUMB1(2,NRES1) + B GO TO 30 C C---- Delta atom C 110 CONTINUE NATM1(2,NRES1) = NATM1(2,NRES1) + 1 SUMB1(2,NRES1) = SUMB1(2,NRES1) + B GO TO 30 C C---- Any other atom C 120 CONTINUE NATM1(2,NRES1) = NATM1(2,NRES1) + 1 SUMB1(2,NRES1) = SUMB1(2,NRES1) + B GO TO 30 C C 130 CONTINUE IF (NRES1.EQ.0) THEN WRITE (6,FMT=6002) SEQBEG1 6002 FORMAT (/' *** Residue ',A,' not found in coordinate file.') C C ****************************** CALL CCPERR(1,' RESIDUE NOT FOUND') C ****************************** C ELSE IF (SEQEND1.NE.' ' .AND. OLDSEQ.NE.SEQEND1) THEN WRITE (6,FMT=6004) SEQEND1,NRES1,SEQBEG1 6004 FORMAT (/' *** Residue ',A,' not found in coordinate file.', + /' Program will use the ',I4,' residues found in file a', + 'fter residue',A) END IF C RETURN END C C C ================== SUBROUTINE READDAT C ================== C C Allow default values to be reset C C C C C C .. Parameters .. INTEGER NPARM PARAMETER (NPARM=200) C .. C .. Scalars in Common .. REAL BMAXX,X_SCALE,Y_SCALE LOGICAL CROSSES,MCCB,NFIL,PLOTX,TEMPMC,TEMPSC CHARACTER SEQBEG*6,SEQBEG1*6,SEQEND*6,SEQEND1*6,TITLE*80 C .. C .. Local Scalars .. INTEGER NTOK LOGICAL EOFDAT CHARACTER KEY*4,LINE*400 C .. C .. Local Arrays .. REAL FVALUE(NPARM) INTEGER IBEG(NPARM),IDEC(NPARM),IEND(NPARM),ITYP(NPARM) CHARACTER CVALUE(NPARM)*4 C .. C .. External Subroutines .. EXTERNAL PARSER C .. C .. Common blocks .. COMMON /CDEF/TITLE,SEQBEG,SEQEND,SEQBEG1,SEQEND1 COMMON /DEF/MCCB,TEMPMC,TEMPSC,PLOTX,X_SCALE,Y_SCALE,CROSSES, + BMAXX,NFIL C .. C .. Save statement .. SAVE C .. C C TITLE = ' ' 10 CONTINUE LINE = ' ' NTOK = NPARM KEY = ' ' C C *********************************************************** CALL PARSER(KEY,LINE,IBEG,IEND,ITYP,FVALUE,CVALUE,IDEC,NTOK, + EOFDAT,.TRUE.) C *********************************************************** C C End of file? C IF (EOFDAT) THEN RETURN END IF C C TITLe C IF (KEY.EQ.'TITL') THEN TITLE = LINE(IBEG(2) :IEND(NTOK)) C C PLTY C ELSE IF (KEY.EQ.'PLTY') THEN PLOTX = .FALSE. C C CROSSES C ELSE IF (KEY.EQ.'CROS') THEN CROSSES = .TRUE. C C COMP C ELSE IF (KEY.EQ.'COMP') THEN NFIL = .TRUE. C C MAIN C ELSE IF (KEY.EQ.'MAIN') THEN TEMPMC = .TRUE. TEMPSC = .FALSE. C C SIDE C ELSE IF (KEY.EQ.'SIDE') THEN TEMPMC = .FALSE. TEMPSC = .TRUE. C C XSCALE C ELSE IF (KEY.EQ.'XSCA') THEN X_SCALE = FVALUE(2) C C YSCALE C ELSE IF (KEY.EQ.'YSCA') THEN Y_SCALE = FVALUE(2) C C BMAX C ELSE IF (KEY.EQ.'BMAX') THEN BMAXX = FVALUE(2) C C RESIdue C ELSE IF (KEY.EQ.'RES1') THEN SEQBEG = LINE(IBEG(2) :IEND(2)) SEQEND = LINE(IBEG(3) :IEND(3)) C ELSE IF (KEY.EQ.'RES2') THEN SEQBEG1 = LINE(IBEG(2) :IEND(2)) SEQEND1 = LINE(IBEG(3) :IEND(3)) C C CBMAin C ELSE IF (KEY.EQ.'CBMA') THEN MCCB = .TRUE. C C CBSIde C ELSE IF (KEY.EQ.'CBSI') THEN MCCB = .FALSE. C C ?????? C ELSE WRITE (6,FMT=6000) 6000 FORMAT (' ERROR - LINE IGNORED ') END IF C GO TO 10 C END C C C C ================ SUBROUTINE PLOTB C ================ C C C C---- Plot B factors along the chain C C C .. Parameters .. INTEGER MAXATM PARAMETER (MAXATM=10000) C .. C .. Scalars in Common .. REAL BMAXX,X_SCALE,Y_SCALE INTEGER NRES LOGICAL CROSSES,MCCB,NFIL,PLOTX,TEMPMC,TEMPSC CHARACTER SEQBEG*6,SEQBEG1*6,SEQEND*6,SEQEND1*6,TITLE*80 C .. C .. Arrays in Common .. REAL SUMB INTEGER JRES,NATM CHARACTER RESTYP*3,SEQID*6 C .. C .. Local Scalars .. REAL BMAX,BMAX1,BMAXT,BT,CSIZE,DBMULT,DD,DOTSMM,HCHARB,HSYMB, + PAPLEN,PAPWID,PI,PI2,RDELTAY,TSIZE,TSTEP,X0,XB,XT,XX,XYZ_TIC, + Y0,YB,YT,YY INTEGER I,JDO,JL,KBSTEP,KCOUNT,KRSTEP,LASTI,MIXCLR,NAMRB,NFONT, + NLINES,NRESL,NTHICK CHARACTER CBWORK*4,LABRES*6 C .. C .. Local Arrays .. REAL BOX_X(5),BOX_Y(5) CHARACTER RESLAB(15)*6 C .. C .. External Subroutines .. EXTERNAL CCPERR,GSANCU,GSBSIZ,GSCENC,GSCETX,GSCOLR,GSCSPU,GSDTRN, + GSDWTO,GSFONT,GSINIT,GSLNWT,GSMIXC,GSMVTO,GSORGD,GSPICT, + GSSCLC,GSUROT,PTHICK C .. C .. Intrinsic Functions .. INTRINSIC ATAN2,MAX,MOD,NINT,REAL C .. C .. Common blocks .. COMMON /CCOORD/RESTYP(MAXATM),SEQID(MAXATM) COMMON /CDEF/TITLE,SEQBEG,SEQEND,SEQBEG1,SEQEND1 COMMON /COORD/SUMB(2,MAXATM),NATM(2,MAXATM),JRES(MAXATM),NRES COMMON /DEF/MCCB,TEMPMC,TEMPSC,PLOTX,X_SCALE,Y_SCALE,CROSSES, + BMAXX,NFIL C .. C .. Save statement .. SAVE C .. C .. Data statements .. C DATA BOX_X/20.0,270.0,270.0,20.0,20.0/ DATA BOX_Y/10.0,10.0,140.0,140.0,10.0/ C .. C C C MIXCLR = 1 PI = ATAN2(1.0,1.0)*4.0 PI2 = PI/2.0 PAPWID = 328.0*X_SCALE PAPLEN = 508.0*Y_SCALE NFONT = 1 DOTSMM = 10.0 NTHICK = 1 C C---- Centered symbol height ('mms) B-Plot C HSYMB = 1.5 C C---- Character height (mms) B-Plot C HCHARB = 3.5 CALL GSINIT('PLOT') CALL GSMIXC(MIXCLR) CALL GSBSIZ((PAPWID+1.0), (PAPLEN+1.0)) CALL GSDTRN(DOTSMM,DOTSMM) CALL GSPICT CALL GSFONT(NFONT) C C---- Centred characters with uniform spacing C CALL GSCENC(1) CALL GSCSPU(1) C C---- Plot X C IF (PLOTX) THEN CALL GSORGD(0.0,0.0) CALL GSUROT(0.0,PI2) ELSE C C---- Plot Y C CALL GSORGD(PAPWID,0.0) CALL GSUROT(PI2,PI) END IF C C CSIZE = HCHARB*X_SCALE CALL GSSCLC(CSIZE,CSIZE) CALL GSLNWT(NTHICK) CALL GSCOLR(1) C C---- Draw Box C CALL GSMVTO(BOX_X(1)*X_SCALE,BOX_Y(1)*Y_SCALE) C C DO 10 JDO = 2,5 CALL GSDWTO(BOX_X(JDO)*X_SCALE,BOX_Y(JDO)*Y_SCALE) 10 CONTINUE C C---- Draw zero -line C CALL GSMVTO(16.0*X_SCALE,75.0*Y_SCALE) CALL GSDWTO(20.0*X_SCALE,75.0*Y_SCALE) CALL GSMVTO(16.0*X_SCALE,15.0*Y_SCALE) CALL GSDWTO(270.0*X_SCALE,15.0*Y_SCALE) C C---- Title C IF (TITLE .NE. ' ') THEN CALL GSLNWT(2) CALL GSCOLR(5) TSIZE = HCHARB*1.60*X_SCALE CALL GSSCLC(TSIZE,TSIZE) CALL GSMVTO(143.0*X_SCALE,145.0*Y_SCALE) CALL GSANCU(143.0*X_SCALE,145.0*Y_SCALE) CALL GSCETX(TITLE,2) ENDIF C C---- Find max B C BMAX1 = -999.0 DO 20 I = 1,NRES IF (TEMPMC) BMAX = MAX(BMAX,SUMB(1,I)) IF (TEMPSC) BMAX = MAX(BMAX,SUMB(2,I)) 20 CONTINUE C C NFONT = 1 NTHICK = 1 CALL GSLNWT(NTHICK) CALL GSCOLR(1) C C C CSIZE = 2.75*X_SCALE CALL GSMVTO(16.0*X_SCALE,75.0*Y_SCALE) CALL GSDWTO(20.0*X_SCALE,75.0*Y_SCALE) CALL GSMVTO(16.0*X_SCALE,15.0*Y_SCALE) CALL GSDWTO(270.0*X_SCALE,15.0*Y_SCALE) C C---- first C RDELTAY = 240.0/ (NRES-1) C C CSIZE = HCHARB*X_SCALE CALL GSSCLC(CSIZE,CSIZE) LABRES = SEQID(1) CALL GSMVTO(25.0*X_SCALE,7.0*Y_SCALE) CALL GSDWTO(25.0*X_SCALE,10.0*Y_SCALE) CALL GSMVTO(23.0*X_SCALE,2.0*Y_SCALE) CALL GSANCU(23.0*X_SCALE,2.0*Y_SCALE) CALL GSCETX(LABRES,2) C C---- loop res labels C NRESL = JRES(NRES) - JRES(1) + 1 KRSTEP = NRESL/12 KCOUNT = 1 C C DO 30 JDO = KRSTEP + 1,NRES,KRSTEP RESLAB(KCOUNT) = SEQID(JDO) KCOUNT = KCOUNT + 1 LASTI = JRES(JDO) 30 CONTINUE C C---- zero C CALL GSMVTO(13.0*X_SCALE,15.0*Y_SCALE) CALL GSANCU(13.0*X_SCALE,15.0*Y_SCALE) CSIZE = HCHARB*X_SCALE CALL GSSCLC(CSIZE,CSIZE) CALL GSCETX(' 0 ',3) C C---- C IF (BMAXX.NE.-1.0) THEN IF (BMAXX.LT.BMAX) THEN WRITE (6,FMT=*) ' BMAXX=',BMAXX,' is smaller then the ', + ' calculated value for this chain ',BMAX WRITE (6,FMT=*) ' Calculated value will be used' ELSE BMAX = BMAXX END IF END IF BT = MOD(BMAX,10.0) BMAXT = BMAX + BT + 0.51 NAMRB = NINT(BMAXT/10.0)*10 DBMULT = 120.0/NAMRB KBSTEP = 5 C C DO 50 JDO = KBSTEP,NAMRB,KBSTEP CBWORK = ' ' IF (JDO.LE.9) THEN WRITE (CBWORK,FMT=6000) JDO 6000 FORMAT (' ',I1,' ') GO TO 40 ELSE IF (JDO.LE.99) THEN WRITE (CBWORK,FMT=6002) JDO 6002 FORMAT (' ',I2,' ') GO TO 40 ELSE IF (JDO.LE.999) THEN WRITE (CBWORK,FMT=6003) JDO 6003 FORMAT (I3,' ') GO TO 40 ELSE CALL CCPERR(1,' B values too large to plot'// + ' or supplied BMAX too big') END IF 40 CONTINUE C C XYZ_TIC = (DBMULT*JDO) + 15.0 CALL GSMVTO(13.0*X_SCALE,XYZ_TIC*Y_SCALE) CALL GSANCU(13.0*X_SCALE,XYZ_TIC*Y_SCALE) CALL GSCETX(CBWORK,3) CALL GSMVTO(16.0*X_SCALE,XYZ_TIC*Y_SCALE) CALL GSDWTO(20.0*X_SCALE,XYZ_TIC*Y_SCALE) 50 CONTINUE C C CALL GSLNWT(NTHICK) CALL GSCOLR(2) C C---- Side chain C CSIZE = HCHARB*X_SCALE CALL GSSCLC(CSIZE,CSIZE) C C DD = HSYMB/2.0 C C DO 80 JDO = 1,NRES XX = ((JDO-1)*RDELTAY+25.0)*X_SCALE IF (SUMB(2,JDO).EQ.-999.0) GO TO 60 CALL GSLNWT(NTHICK) CALL GSCOLR(2) CALL GSMVTO(XX,15.0*Y_SCALE) YY = (SUMB(2,JDO)*DBMULT+15.0)*Y_SCALE C C IF (TEMPSC) THEN C C IF (CROSSES) THEN XB = XX YB = YY CALL GSMVTO((XB-DD),YB) CALL GSDWTO((XB+DD),YB) CALL GSMVTO(XB, (YB-DD)) CALL GSDWTO(XB, (YB+DD)) ELSE CALL GSDWTO(XX,YY) END IF C C END IF C 60 CONTINUE C DO 70 JL = 1,KCOUNT IF (SEQID(JDO).EQ.RESLAB(JL)) THEN CALL GSLNWT(NTHICK) CALL GSCOLR(1) XYZ_TIC = XX - 2.0*X_SCALE CALL GSMVTO(XYZ_TIC,2.0*Y_SCALE) CALL GSANCU(XYZ_TIC,2.0*Y_SCALE) CALL GSCETX(RESLAB(JL),2) XYZ_TIC = XX CALL GSMVTO(XYZ_TIC,7.0*Y_SCALE) CALL GSDWTO(XYZ_TIC,10.0*Y_SCALE) END IF 70 CONTINUE 80 CONTINUE C C IF (REAL(NRES-LASTI).GE.REAL(2*KRSTEP/3)) THEN LABRES = SEQID(NRES) CALL GSLNWT(NTHICK) CALL GSCOLR(1) CALL GSMVTO(265.0*X_SCALE,7.0*Y_SCALE) CALL GSDWTO(265.0*X_SCALE,10.0*Y_SCALE) CALL GSMVTO(263.0*X_SCALE,2.0*Y_SCALE) CALL GSANCU(263.0*X_SCALE,2.0*Y_SCALE) CSIZE = HCHARB*X_SCALE CALL GSSCLC(CSIZE,CSIZE) CALL GSCETX(LABRES,2) END IF C C---- Main chain C IF (.NOT.TEMPMC) RETURN C C CALL GSLNWT(3) CALL GSCOLR(4) C C NLINES = 10 TSTEP = 0.075 Y0 = ((SUMB(1,1)*DBMULT+15.0)*Y_SCALE) X0 = (25.0*X_SCALE) C C DO 90 JDO = 2,NRES IF (SUMB(1,JDO).EQ.-999.0) GO TO 90 XX = (((JDO-1)*RDELTAY+25.0)*X_SCALE) YY = ((SUMB(1,JDO)*DBMULT+15.0)*Y_SCALE) XT = XX YT = YY CALL PTHICK(X0,Y0,XX,YY,TSTEP,NLINES) X0 = XT Y0 = YT 90 CONTINUE C C RETURN END C C C C ================= SUBROUTINE PLOTB1 C ================= C C C C---- Plot B factors of two different chains C C C .. Parameters .. INTEGER MAXATM PARAMETER (MAXATM=10000) C .. C .. Scalars in Common .. REAL BMAXX,X_SCALE,Y_SCALE INTEGER NRES,NRES1 LOGICAL CROSSES,MCCB,NFIL,PLOTX,TEMPMC,TEMPSC CHARACTER SEQBEG*6,SEQBEG1*6,SEQEND*6,SEQEND1*6,TITLE*80 C .. C .. Arrays in Common .. REAL SUMB,SUMB1 INTEGER JRES,JRES1,NATM,NATM1 CHARACTER RESTYP*3,RESTYP1*3,SEQID*6,SEQID1*6 C .. C .. Local Scalars .. REAL BMAX,BMAX1,BMAXT,BT,CSIZE,DBMULT,DD,DOTSMM,HCHARB,HSYMB, + PAPLEN,PAPWID,PI,PI2,RDELTAY,TSIZE,TSTEP,X0,XT,XX,XYZ_TIC,Y0, + YT,YY INTEGER I,II,JDO,JL,KBSTEP,KCOUNT,KRSTEP,LASTI,MIXCLR,NAMRB,NFONT, + NLINES,NRESL,NTHICK CHARACTER CBWORK*4,LABRES*6 C .. C .. Local Arrays .. REAL BOX_X(5),BOX_Y(5) CHARACTER RESLAB(15)*6 C .. C .. External Subroutines .. EXTERNAL CCPERR,GSANCU,GSBSIZ,GSCENC,GSCETX,GSCOLR,GSCSPU,GSDTRN, + GSDWTO,GSFONT,GSINIT,GSLNWT,GSMIXC,GSMVTO,GSORGD,GSPICT, + GSSCLC,GSUROT,PTHICK C .. C .. Intrinsic Functions .. INTRINSIC ATAN2,MAX,MOD,NINT,REAL C .. C .. Common blocks .. COMMON /CCOORD/RESTYP(MAXATM),SEQID(MAXATM) COMMON /CCOORD1/RESTYP1(MAXATM),SEQID1(MAXATM) COMMON /CDEF/TITLE,SEQBEG,SEQEND,SEQBEG1,SEQEND1 COMMON /COORD/SUMB(2,MAXATM),NATM(2,MAXATM),JRES(MAXATM),NRES COMMON /COORD1/SUMB1(2,MAXATM),NATM1(2,MAXATM),JRES1(MAXATM),NRES1 COMMON /DEF/MCCB,TEMPMC,TEMPSC,PLOTX,X_SCALE,Y_SCALE,CROSSES, + BMAXX,NFIL C .. C .. Save statement .. SAVE C .. C .. Data statements .. C DATA BOX_X/20.0,270.0,270.0,20.0,20.0/ DATA BOX_Y/10.0,10.0,140.0,140.0,10.0/ C .. C C C MIXCLR = 1 PI = ATAN2(1.0,1.0)*4.0 PI2 = PI/2.0 PAPWID = 328.0*X_SCALE PAPLEN = 508.0*Y_SCALE NFONT = 1 DOTSMM = 10.0 NTHICK = 1 C C---- Centered symbol height ('mms) B-Plot C HSYMB = 1.5 C C---- Character height (mms) B-Plot C HCHARB = 3.5 CALL GSINIT('PLOT') CALL GSMIXC(MIXCLR) CALL GSBSIZ((PAPWID+1.0), (PAPLEN+1.0)) CALL GSDTRN(DOTSMM,DOTSMM) CALL GSPICT CALL GSFONT(NFONT) C C---- Centred characters with uniform spacing C CALL GSCENC(1) CALL GSCSPU(1) C C---- Plot X C IF (PLOTX) THEN CALL GSORGD(0.0,0.0) CALL GSUROT(0.0,PI2) ELSE C C---- Plot Y C CALL GSORGD(PAPWID,0.0) CALL GSUROT(PI2,PI) END IF C C CSIZE = HCHARB*X_SCALE CALL GSSCLC(CSIZE,CSIZE) CALL GSLNWT(NTHICK) CALL GSCOLR(1) C C---- Draw Box C CALL GSMVTO(BOX_X(1)*X_SCALE,BOX_Y(1)*Y_SCALE) C C DO 10 JDO = 2,5 CALL GSDWTO(BOX_X(JDO)*X_SCALE,BOX_Y(JDO)*Y_SCALE) 10 CONTINUE C C---- Draw zero -line C CALL GSMVTO(16.0*X_SCALE,75.0*Y_SCALE) CALL GSDWTO(20.0*X_SCALE,75.0*Y_SCALE) CALL GSMVTO(16.0*X_SCALE,15.0*Y_SCALE) CALL GSDWTO(270.0*X_SCALE,15.0*Y_SCALE) C C---- Title C CALL GSLNWT(2) CALL GSCOLR(5) TSIZE = HCHARB*1.60*X_SCALE CALL GSSCLC(TSIZE,TSIZE) CALL GSMVTO(143.0*X_SCALE,145.0*Y_SCALE) CALL GSANCU(143.0*X_SCALE,145.0*Y_SCALE) CALL GSCETX(TITLE,2) C C---- Find max B C BMAX1 = -999.0 DO 20 I = 1,NRES IF (TEMPMC) BMAX = MAX(BMAX,SUMB(1,I)) IF (TEMPSC) BMAX = MAX(BMAX,SUMB(2,I)) IF (TEMPMC) BMAX = MAX(BMAX,SUMB1(1,I)) IF (TEMPSC) BMAX = MAX(BMAX,SUMB1(2,I)) 20 CONTINUE C C NFONT = 1 NTHICK = 1 CALL GSLNWT(NTHICK) CALL GSCOLR(1) C C C CSIZE = 2.75*X_SCALE CALL GSMVTO(16.0*X_SCALE,75.0*Y_SCALE) CALL GSDWTO(20.0*X_SCALE,75.0*Y_SCALE) CALL GSMVTO(16.0*X_SCALE,15.0*Y_SCALE) CALL GSDWTO(270.0*X_SCALE,15.0*Y_SCALE) C C---- first C RDELTAY = 240.0/ (NRES-1) C C CSIZE = HCHARB*X_SCALE CALL GSSCLC(CSIZE,CSIZE) LABRES = SEQID(1) CALL GSMVTO(25.0*X_SCALE,7.0*Y_SCALE) CALL GSDWTO(25.0*X_SCALE,10.0*Y_SCALE) CALL GSMVTO(23.0*X_SCALE,2.0*Y_SCALE) CALL GSANCU(23.0*X_SCALE,2.0*Y_SCALE) CALL GSCETX(LABRES,2) C C---- loop res labels C NRESL = JRES(NRES) - JRES(1) + 1 KRSTEP = NRESL/12 KCOUNT = 1 C C DO 30 JDO = KRSTEP + 1,NRES,KRSTEP RESLAB(KCOUNT) = SEQID(JDO) KCOUNT = KCOUNT + 1 LASTI = JRES(JDO) 30 CONTINUE C C---- zero C CALL GSMVTO(13.0*X_SCALE,15.0*Y_SCALE) CALL GSANCU(13.0*X_SCALE,15.0*Y_SCALE) CSIZE = HCHARB*X_SCALE CALL GSSCLC(CSIZE,CSIZE) CALL GSCETX(' 0 ',3) C C---- C IF (BMAXX.NE.-1.0) THEN IF (BMAXX.LT.BMAX) THEN WRITE (6,FMT=*) ' BMAXX=',BMAXX,' is smaller then the ', + ' calculated value for this chain ',BMAX WRITE (6,FMT=*) ' Calculated value will be used' ELSE BMAX = BMAXX END IF END IF BT = MOD(BMAX,10.0) BMAXT = BMAX + BT + 0.51 NAMRB = NINT(BMAXT/10.0)*10 DBMULT = 120.0/NAMRB KBSTEP = 5 C C DO 50 JDO = KBSTEP,NAMRB,KBSTEP CBWORK = ' ' IF (JDO.LE.9) THEN WRITE (CBWORK,FMT=6000) JDO 6000 FORMAT (' ',I1,' ') GO TO 40 ELSE IF (JDO.LE.99) THEN WRITE (CBWORK,FMT=6002) JDO 6002 FORMAT (' ',I2,' ') GO TO 40 ELSE IF (JDO.LE.999) THEN WRITE (CBWORK,FMT=6003) JDO 6003 FORMAT (I3,' ') GO TO 40 ELSE CALL CCPERR(1,' B values too large to plot'// + ' or supplied BMAX too big') END IF 40 CONTINUE C C XYZ_TIC = (DBMULT*JDO) + 15.0 CALL GSMVTO(13.0*X_SCALE,XYZ_TIC*Y_SCALE) CALL GSANCU(13.0*X_SCALE,XYZ_TIC*Y_SCALE) CALL GSCETX(CBWORK,3) CALL GSMVTO(16.0*X_SCALE,XYZ_TIC*Y_SCALE) CALL GSDWTO(20.0*X_SCALE,XYZ_TIC*Y_SCALE) 50 CONTINUE C C CALL GSLNWT(NTHICK) CALL GSCOLR(2) C C plot first chain C C CSIZE = HCHARB*X_SCALE CALL GSSCLC(CSIZE,CSIZE) C C DD = HSYMB/2.0 C C DO 80 JDO = 1,NRES XX = ((JDO-1)*RDELTAY+25.0)*X_SCALE IF (SUMB(2,JDO).EQ.-999.0) GO TO 60 CALL GSLNWT(NTHICK) CALL GSCOLR(2) CALL GSMVTO(XX,15.0*Y_SCALE) YY = (SUMB(2,JDO)*DBMULT+15.0)*Y_SCALE C C 60 CONTINUE C DO 70 JL = 1,KCOUNT IF (SEQID(JDO).EQ.RESLAB(JL)) THEN CALL GSLNWT(NTHICK) CALL GSCOLR(1) XYZ_TIC = XX - 2.0*X_SCALE CALL GSMVTO(XYZ_TIC,2.0*Y_SCALE) CALL GSANCU(XYZ_TIC,2.0*Y_SCALE) CALL GSCETX(RESLAB(JL),2) XYZ_TIC = XX CALL GSMVTO(XYZ_TIC,7.0*Y_SCALE) CALL GSDWTO(XYZ_TIC,10.0*Y_SCALE) END IF 70 CONTINUE 80 CONTINUE C C IF (REAL(NRES-LASTI).GE.REAL(2*KRSTEP/3)) THEN LABRES = SEQID(NRES) CALL GSLNWT(NTHICK) CALL GSCOLR(1) CALL GSMVTO(265.0*X_SCALE,7.0*Y_SCALE) CALL GSDWTO(265.0*X_SCALE,10.0*Y_SCALE) CALL GSMVTO(263.0*X_SCALE,2.0*Y_SCALE) CALL GSANCU(263.0*X_SCALE,2.0*Y_SCALE) CSIZE = HCHARB*X_SCALE CALL GSSCLC(CSIZE,CSIZE) CALL GSCETX(LABRES,2) END IF C C C C II = 1 IF (TEMPMC) THEN II = 1 ELSE IF (TEMPSC) II = 2 END IF C CALL GSLNWT(3) CALL GSCOLR(4) C C NLINES = 10 TSTEP = 0.075 Y0 = ((SUMB(1,1)*DBMULT+15.0)*Y_SCALE) X0 = (25.0*X_SCALE) C C DO 90 JDO = 2,NRES IF (SUMB(II,JDO).EQ.-999.0) GO TO 90 XX = (((JDO-1)*RDELTAY+25.0)*X_SCALE) YY = ((SUMB(II,JDO)*DBMULT+15.0)*Y_SCALE) XT = XX YT = YY CALL PTHICK(X0,Y0,XX,YY,TSTEP,NLINES) X0 = XT Y0 = YT 90 CONTINUE CALL GSLNWT(1) CALL GSCOLR(2) C C NLINES = 4 TSTEP = 0.075 Y0 = ((SUMB1(1,1)*DBMULT+15.0)*Y_SCALE) X0 = (25.0*X_SCALE) C C DO 100 JDO = 2,NRES IF (SUMB1(II,JDO).EQ.-999.0) GO TO 100 XX = (((JDO-1)*RDELTAY+25.0)*X_SCALE) YY = ((SUMB1(II,JDO)*DBMULT+15.0)*Y_SCALE) XT = XX YT = YY CALL PTHICK(X0,Y0,XX,YY,TSTEP,NLINES) X0 = XT Y0 = YT 100 CONTINUE C C RETURN END C =========================================== SUBROUTINE PTHICK(X0,Y0,X1,Y1,TSTEP,NLINES) C =========================================== C C Draw line from (X0,Y0) to (X1,Y1) C C Parameters to control line thickness as function of intensity C TSTEP intensity step for each increase in thickness C NLINES maximum number of lines C TSTEP offset step in plotter units C C C C C---- always draw central line C C .. Scalar Arguments .. REAL TSTEP,X0,X1,Y0,Y1 INTEGER NLINES C .. C .. Local Scalars .. REAL STEP,X,X2,XM,XT,Y,Y2,YM,YT INTEGER JDO,NOFF LOGICAL HORIZ C .. C .. External Subroutines .. EXTERNAL GSDWTO,GSMVTO C .. C .. Intrinsic Functions .. INTRINSIC ABS,MOD C .. CALL GSMVTO(X0,Y0) CALL GSDWTO(X1,Y1) C C---- set up current point C XM = X0 YM = Y0 X = X1 Y = Y1 C C---- draw thickening lines C If line nearer horizontal, offsets will be on y and vv C HORIZ = .FALSE. C C IF (ABS(X1-X0).GT.ABS(Y1-Y0)) HORIZ = .TRUE. C C DO 10 JDO = 2,NLINES C C---- Offset alternates between + & -, increasing in size C NOFF = JDO/2 IF (MOD(JDO,2).NE.0) NOFF = -NOFF C C---- Apply offsets C STEP = NOFF*TSTEP C C IF (HORIZ) THEN C C---- . . to y C XT = XM YT = YM + STEP X2 = X Y2 = Y + STEP ELSE C C---- . . to x C XT = X0 + STEP YT = YM X2 = X + STEP Y2 = Y END IF C C---- Plot alternate lines backwards C IF (NOFF.LT.0) THEN CALL GSMVTO(XT,YT) CALL GSDWTO(X2,Y2) ELSE CALL GSMVTO(X2,Y2) CALL GSDWTO(XT,YT) END IF C C 10 CONTINUE C C---- Reset current point C XM = X YM = Y C RETURN END