C NIPF SUBROUTINE FMAIN() PARAMETER (MAXSEQ=400000,MAXFIL=200,MAXCOM=20000) CHARACTER SEQ(MAXSEQ),PAA(5,5,5) INTEGER BOTOPT,TOPOPT PARAMETER (NAMLEN = 60) CHARACTER*(NAMLEN) HELPF,POINTF,FILMAR,FILNAM,NAMES(MAXFIL) INTEGER STARTS(MAXFIL),ST(MAXFIL),LE(MAXFIL) INTEGER SUMCOD(4096),MTT(64,3) REAL MT(4,4),ET(4,4) INTEGER COUNTS(MAXCOM),POINTS(MAXCOM),TOTCOU,SUMCS,DIFFER(MAXSEQ) REAL WORKR(MAXSEQ) PARAMETER (BOTOPT=-10,TOPOPT=70, + MAXMEN=-3, + MAXOPT=39, + MAXDEV=9, + IDM = 5) PARAMETER ( + HELPF='NIPFHELP', + POINTF='NIPFHPNT', + FILMAR='NIPFMARG') INTEGER HELPS(BOTOPT:TOPOPT),HELPE(BOTOPT:TOPOPT),DEVNOS(MAXDEV) INTEGER OPT,MARGB(MAXOPT),MARGT(MAXOPT) INTEGER BATCH,AVALL,FVREST,ON,OFF,SORT,GRAPH,BCHANG(5,5) PARAMETER (AVALL = 1, FVREST = 2, OFF = 1, ON = 2) CHARACTER CHRSET(IDM),ACID,CANACD,TRANF PARAMETER (MAXPRM = 28) CHARACTER PROMPT(2)*(MAXPRM) INTEGER AMINOP,FACID(22),FBASE(5),CTONUM,BCHAMG(5,5,3) EXTERNAL IMAXA,IMINA,TRANF,VARIM,AMINOP,FINF,CTONUM,RMAXA,RMINA EQUIVALENCE (WORKR,DIFFER) DATA CHRSET/'T','C','A','G','-'/ DATA PAA/'F','F','L','L','-','S','S','S','S','S', 1'Y','Y','*','*','-','C','C','*','W','-', 1'-','-','-','-','-','L','L','L','L','L', 1'P','P','P','P','P','H','H','Q','Q','-', 1'R','R','R','R','R','-','-','-','-','-','I','I','I','M','-', 1'T','T','T','T','T', 1'N','N','K','K','-','S','S','R','R','-','-','-','-','-','-', 1'V','V','V','V','V','A','A','A','A','A','D','D','E','E','-', 1'G','G','G','G','G', 1'-','-','-','-','-','-','-','-','-','-', 1'-','-','-','-','-','-','-','-','-','-', 1'-','-','-','-','-','-','-','-','-','-'/ C Initialise help CALL INTHLP('nipf', TOPOPT) C GET DEVICE NUMBERS CALL UNITNO(KBIN,KBOUT,DEVNOS,MAXDEV) CALL OPENGR(DEVNOS(3)) IGORT = 0 MTCALL = 0 WRITE(KBOUT,1000) 1000 FORMAT( +' NIPF v1.0 Copyright Rodger Staden'/) C READ IN THE POINTERS TO THE HELP FILE IDEVH = DEVNOS(4) CALL SETHLP(HELPS,HELPE,BOTOPT,TOPOPT,POINTF,IDEVH,KBOUT) CALL INITGR(KBIN,KBOUT,HELPS(0),HELPE(0),HELPF,IDEVH) IOK=0 CALL INITLU(IDM) C GET SCREEN AND MARGIN SIZES CALL GETMRG(ISXMAX,ISYMAX,MARGL,MARGR,MARGB,MARGT, +MAXOPT,DEVNOS(1),FILMAR) IDEV=KBOUT MOPT=0 IDIMT = 0 CALL EMT(MTT) C C 1 CONTINUE C C C IF(IOK.NE.0)GO TO 9999 C give menu, get option C IDEV=KBOUT LINLEN=60 PROMPT(1) = 'Use file of file names' PROMPT(2) = 'Type in a pair of file names' IB = 1 CALL RADION('Select input mode',PROMPT,2,IB, + IHELPS,IHELPE,HELPF,IDEVH,KBIN,KBOUT) IF(IB.LT.1) GO TO 999 IF(IB.EQ.1) THEN CALL GETSQS(DEVNOS(1),DEVNOS(2),SEQ,MAXSEQ, + STARTS,NAMES, + FILNAM,NFILE,MAXFIL,MAXNAM,KBIN,KBOUT, + IHELPS,IHELPE,HELPF,IDEVH) SORT = ON BATCH = FVREST ELSE C C Read in the two sequences C CALL TGETF(DEVNOS(1),FILNAM,KBIN,KBOUT, + SEQ,MAXSEQ,STARTS,NAMES,MAXFIL,MAXNAM,NFILE,IOK, + IHELPS,IHELPE,HELPF,IDEVH) SORT = OFF BATCH = FVREST END IF WRITE(KBOUT,*)'Working with ',NFILE,' files' C C SET DEFAULTS FOR ACTIVE REGION C C ST(I) contains the active region start for sequence I relative to its start C LE(I) contains the active region end of sequence I C STARTS(I) contains the start for sequence I in seq C DO 2 I=1,NFILE ST(I) = 1 LE(I) = STARTS(I+1) - STARTS(I) 2 CONTINUE LONGS = IMAXA(ST,NFILE) LONGE = IMINA(LE,NFILE) I1=1 N1=IDIM1 I2=1 N2=IDIM2 IDIM3=N1-I1+1 IDIM4=N2-I2+1 IDIML=MIN(IDIM3,IDIM4) BATCH = FVREST 100 CONTINUE CALL BPAUSE(KBIN,KBOUT,IOK) CALL MENU(OPT,KOPT,MOPT,MAXOPT,MAXMEN,KBIN,KBOUT, +HELPS(0),HELPE(0),HELPF,DEVNOS(4)) C IF(0.EQ.0) GO TO 99 C C stop C IF(OPT.EQ.2) GO TO 999 C C type text C IF(OPT.EQ.6) THEN CALL TTEXT(DEVNOS(1),FILNAM,KBIN,KBOUT, + HELPS(OPT),HELPE(OPT),HELPF,DEVNOS(4)) GO TO 100 END IF C C help C IF(OPT.EQ.1) THEN CALL HELP(HELPS,HELPE,BOTOPT,TOPOPT,HELPF,DEVNOS(4), + KBIN,KBOUT) GO TO 100 END IF C C clear all C IF(OPT.EQ.10) THEN CALL CLEARG GO TO 100 END IF C C ruler C IF(OPT.EQ.12)THEN CALL RULER(LONGS,LONGE,MARGL,MARGR, + MARGB(OPT),MARGT(OPT),ISXMAX,ISYMAX,KBIN,KBOUT,1, + HELPS(OPT),HELPE(OPT),HELPF,DEVNOS(4)) GO TO 100 END IF C C xhairs C IF(OPT.EQ.13) THEN XMAX = LONGE XMIN = LONGS YMAX=ISYMAX YMIN=0. IIIIX=0 IIIIY=0 CALL CLEARV CALL XHAIRN(XMAX,XMIN,YMAX,YMIN, + MARGL,MARGR,MARGB(OPT),MARGT(OPT), + ISXMAX,ISYMAX,IIIIX,IIIIY,N,KBOUT, + SEQ(LONGS),LONGS,LONGE-LONGS+1, + SEQ(LONGS),LONGS,LONGE-LONGS+1,1) GO TO 100 END IF C C clear vt100 C IF(OPT.EQ.11)THEN CALL CLEARV GO TO 100 END IF C C CHANGE MARGINS C IF(OPT.EQ.14)THEN CALL MARGC(ISXMAX,ISYMAX,MARGL,MARGR,MARGB,MARGT, + HELPS(OPT),HELPE(OPT),MAXOPT,HELPF,IDEVH,KBIN,KBOUT) GO TO 100 END IF C C WRITE LABELS C IF(OPT.EQ.15) THEN CALL LABLER(KBIN,KBOUT,ISXMAX,ISYMAX, + HELPS(OPT),HELPE(OPT),HELPF,DEVNOS(4)) GO TO 100 END IF C C GET DISK OUTPUT FILE ON UNIT DEVNOS(2) IF REQUIRED C IF(OPT.EQ.7)THEN CALL REDIR(IDEV,DEVNOS(2),DEVNOS(3),IGORT,FILNAM,KBIN,KBOUT, + HELPS(OPT),HELPE(OPT),HELPF,IDEVH,KOPT) GO TO 100 END IF IF(OPT.EQ.5)THEN LINLEN=60 CALL LISTN(SEQ,MAXSEQ,STARTS,NFILE,LINLEN,LONGS,LONGE, + IDEV,KBOUT,NAMES,MAXFIL) GO TO 100 END IF IF(OPT.EQ.32)THEN LINLEN=60 CALL LISTND(SEQ,MAXSEQ,STARTS,NFILE,LINLEN,LONGS,LONGE, + IDEV,KBOUT,NAMES,MAXFIL) GO TO 100 END IF IF(OPT.EQ.9)THEN LINLEN=60 CALL LISTNT(SEQ,MAXSEQ,STARTS,NFILE,LINLEN,LONGS,LONGE, + IDEV,KBOUT,NAMES,MAXFIL,PAA) GO TO 100 END IF IF(OPT.EQ.33)THEN LINLEN=60 CALL LISTNV(SEQ,MAXSEQ,STARTS,NFILE,LINLEN,LONGS,LONGE, + IDEV,KBOUT,NAMES,MAXFIL,PAA) GO TO 100 END IF IF ((OPT.EQ.37).AND.(NFILE.EQ.2)) THEN LINLEN=60 CALL TRAN(SEQ(STARTS(1)),MAXSEQ,ST(1),LE(1), + SEQ(STARTS(2)),MAXSEQ,ST(2),LE(2), + KBIN,KBOUT,IDEV,LINLEN,PAA) GO TO 100 END IF IF(OPT.EQ.4)THEN ISTART = 1 IEND = STARTS(2) - 1 DO 7 I=1,NFILE CALL GTREG(KBIN,KBOUT,ISTART,IEND,ST(I),LE(I), + 'Define active region', + HELPS(OPT),HELPE(OPT),HELPF,IDEVH,IOK) ST(I+1) = ST(I) LE(I+1) = LE(I) IF(IOK.NE.0) GO TO 100 7 CONTINUE C C Get max values C LONGS = IMAXA(ST,NFILE) LONGE = IMINA(LE,NFILE) GO TO 100 END IF IF(OPT.EQ.17) THEN PROMPT(1) = 'All versus all' PROMPT(2) = 'First versus rest' IB = BATCH CALL RADION('Select comparison mode',PROMPT,2,IB, + HELPS(OPT),HELPE(OPT),HELPF,IDEVH,KBIN,KBOUT) IF(IB.LT.1) GO TO 100 BATCH = IB GO TO 100 END IF IF(OPT.EQ.18) THEN PROMPT(ON) = 'Sort on' PROMPT(OFF) = 'Sort off' IB = ON CALL RADION('Select sort mode',PROMPT,2,IB, + HELPS(OPT),HELPE(OPT),HELPF,IDEVH,KBIN,KBOUT) IF(IB.LT.1) GO TO 100 SORT = IB GO TO 100 END IF C C start of batch processing C ICOUNT = 0 TOTCOU = 0 SUMCS = 0 C C need to allow different batch comparison modes C IF(BATCH.EQ.AVALL) THEN KFILES = 1 KFILEE = NFILE-1 NEEDS = (NFILES-1)*NFILES/2 IF (NEEDS.GT.MAXCOM) THEN WRITE(*,*)'Sorry unsufficient space for this comparison' GO TO 100 END IF ELSE IF(BATCH.EQ.FVREST) THEN KFILES = 1 KFILEE = KFILES ELSE WRITE(*,*)'Batch mode not set!!' GO TO 100 END IF IF((OPT.EQ.24).OR.(OPT.EQ.35).OR.(OPT.EQ.36).OR.(OPT.EQ.39)) THEN DO 111 I=1,5 DO 111 J=1,5 BCHANG(I,J) = 0 DO 111 K = 1,3 BCHAMG(I,J,K) = 0 111 CONTINUE END IF IF(OPT.EQ.38) THEN CALL INITMT(MT,SUMCOD,MTCALL) MTCALL = MTCALL + 1 END IF GRAPH = -1 IF((OPT.EQ.25).OR.(OPT.EQ.26).OR.(OPT.EQ.27).OR.(OPT.EQ.31) +.OR.(OPT.EQ.34)) THEN PROMPT(1) = 'List results' PROMPT(2) = 'Plot results' GRAPH = ON CALL RADION('Select output mode',PROMPT,2,GRAPH, + HELPS(OPT),HELPE(OPT),HELPF,IDEVH,KBIN,KBOUT) IF(GRAPH.LT.1) GO TO 100 CALL FILLI(DIFFER,LONGE-LONGS+1,0) END IF IF(OPT.EQ.31) THEN IPOSM = (LONGE-LONGS+1)/3 CALL FILLR(WORKR,IPOSM,0.0) IW = 0 DO 600 IPOS = LONGS,LONGS-1+IPOSM*3,3 CALL FILLI(FACID,22,0) DO 500 IFILE = KFILES,KFILEE CANACD = TRANF(SEQ(STARTS(IFILE)+IPOS-1),PAA) DO 450 JFILE = IFILE+1,NFILE ACID = TRANF(SEQ(STARTS(JFILE)+IPOS-1),PAA) IF(CANACD.NE.ACID) + FACID(AMINOP(ACID)) = FACID(AMINOP(ACID)) + 1 450 CONTINUE 500 CONTINUE IW = IW + 1 WORKR(IW) = VARIM(FACID) 600 CONTINUE IF(GRAPH.EQ.ON) THEN XMIN = 1. XMAX = REAL(LONGE - LONGS + 1)/3. YMIN = 0. YMAX = RMAXA(WORKR,IPOSM) CALL GETRL(0.,9999.,YMAX,'Maximum Y value for plotting', + VAL,KBIN,KBOUT,HELPS(OPT),HELPE(OPT),HELPF,IDEVH,IOK) IF(IOK.NE.0) GO TO 100 YMAX = VAL CALL PLTR(WORKR,IPOSM, + XMAX,XMIN,YMAX,YMIN, + MARGL,MARGR,MARGB(OPT),MARGT(OPT),ISXMAX,ISYMAX) GO TO 100 END IF IF(GRAPH.EQ.OFF) THEN WRITE(IDEV,6667) + (LONGS+3*(KKKK-1),WORKR(KKKK),KKKK=1,IPOSM) 6667 FORMAT(I6,F10.3) GO TO 100 END IF END IF IF(OPT.EQ.34) THEN IPOSM = LONGE-LONGS+1 CALL FILLR(WORKR,IPOSM,0.0) IW = 0 DO 700 IPOS = LONGS,LONGE CALL FILLI(FBASE,5,0) DO 650 JFILE = 1,NFILE C WRITE(*,*)JFILE I = CTONUM(SEQ(STARTS(JFILE)+IPOS-1)) FBASE(I) = FBASE(I) + 1 650 CONTINUE IW = IW + 1 WORKR(IW) = FINF(FBASE) 700 CONTINUE IF(GRAPH.EQ.ON) THEN XMIN = 1. XMAX = REAL(LONGE - LONGS + 1) YMIN = RMINA(WORKR,IPOSM) YMAX = RMAXA(WORKR,IPOSM) CALL GETRL(-9999.,9999.,YMAX,'Maximum Y value for plotting', + VAL,KBIN,KBOUT,HELPS(OPT),HELPE(OPT),HELPF,IDEVH,IOK) IF(IOK.NE.0) GO TO 100 YMAX = VAL CALL PLTR(WORKR,IPOSM, + XMAX,XMIN,YMAX,YMIN, + MARGL,MARGR,MARGB(OPT),MARGT(OPT),ISXMAX,ISYMAX) GO TO 100 END IF IF(GRAPH.EQ.OFF) THEN WRITE(IDEV,6667) + (LONGS+KKKK-1,WORKR(KKKK),KKKK=1,IPOSM) GO TO 100 END IF END IF DO 300 IFILE = KFILES,KFILEE DO 200 JFILE = IFILE+1,NFILE IF(OPT.EQ.21)THEN C C MISMAT NUMBER OF BASE DIFFERENCES C CALL BSCHN1( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + MISMAT,IDEV) END IF IF(OPT.EQ.22)THEN C C CODON CHANGES C CALL COCHAN( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + ICONSA,ISAME,ICONSC,MISMAT,IDEV,SUMCOD) C CONSERVED ACIDS ICONSA=KSUM C CONSERVATIVE CHANGES ICONSC=SUMC C UNCHANGED CODONS ISAME=ISUM SUMCS = SUMCS + ICONSC END IF IF(OPT.EQ.23)THEN C NUMBER OF GENETIC EVENTS CALL BSCHN2( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + MISMAT,IDEV) END IF IF(OPT.EQ.24)THEN C MISMAT NUMBER OF BASE DIFFERENCES CALL BSCHN3( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE),BCHANG) END IF IF(OPT.EQ.35)THEN C MISMAT NUMBER OF BASE DIFFERENCES CALL BSCHM3( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE),BCHAMG) END IF IF(OPT.EQ.3000)THEN C MISMAT NUMBER OF BASE DIFFERENCES CALL BSCHN5( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + MISMAT,IDEV,PAA) END IF IF(OPT.EQ.28)THEN C MISMAT NUMBER OF expressed BASE DIFFERENCES CALL BSCHN7( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + MISMAT,IDEV,PAA) END IF IF(OPT.EQ.29)THEN C MISMAT NUMBER OF silent BASE DIFFERENCES CALL BSCHN8( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + MISMAT,IDEV,PAA) END IF IF(OPT.EQ.30)THEN C MISMAT NUMBER OF Amino acid DIFFERENCES CALL BSCHN9( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + MISMAT,IDEV,PAA) END IF C C GET DIFFERENCES IN DIFFER C IF(OPT.EQ.25)THEN CALL BSCHN4( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + DIFFER) END IF C C GET DIFFERENCES IN DIFFER (accumulated counts of bases that change the C amino acid) C IF(OPT.EQ.26)THEN CALL COCHN1( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + DIFFER,PAA) END IF C C estimate mutation rate from observed silent changes C IF(OPT.EQ.38)THEN CALL COCHN4( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + SUMCOD) END IF C C GET DIFFERENCES IN DIFFER (accumulated counts of bases that dont change the C amino acid) C IF(OPT.EQ.27)THEN CALL COCHN2( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + DIFFER,PAA) END IF IF(OPT.EQ.36)THEN CALL COCHN3( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + BCHANG,PAA) END IF IF(OPT.EQ.39)THEN CALL COCHN5( + SEQ(STARTS(IFILE)),STARTS(IFILE+1)-STARTS(IFILE), + ST(IFILE),LE(IFILE), + SEQ(STARTS(JFILE)),STARTS(JFILE+1)-STARTS(JFILE), + ST(JFILE),LE(JFILE), + BCHANG,PAA) END IF ICOUNT = ICOUNT + 1 COUNTS(ICOUNT) = MISMAT POINTS(ICOUNT) = ICOUNT TOTCOU = TOTCOU + MISMAT 200 CONTINUE 300 CONTINUE IF(OPT.EQ.38) THEN C CALL UPDET(SUMCOD,PAA,MTT) CALL UPDE(MT,ET,MTT,SUMCOD,PAA) WRITE(IDEV,1010)(CHRSET(K),K=1,4) DO 323 I=1,4 WRITE(IDEV,1012)CHRSET(I),(MT(I,K),K=1,4) 323 CONTINUE 1012 FORMAT(' ',A1,' ',4(F5.4,1X)) GO TO 100 END IF IF(GRAPH.EQ.ON) THEN XMIN = 1. XMAX = LONGE - LONGS + 1 YMIN = 0. YMAX = IMAXA(DIFFER,LONGE-LONGS+1) IYMAX = YMAX CALL GETINT(0,9999,IYMAX,'Maximum Y value for plotting', + IVAL,KBIN,KBOUT,HELPS(OPT),HELPE(OPT),HELPF,IDEVH,IOK) IF(IOK.NE.0) GO TO 100 YMAX = IVAL CALL PLTI(DIFFER,LONGE-LONGS+1, + XMAX,XMIN,YMAX,YMIN, + MARGL,MARGR,MARGB(OPT),MARGT(OPT),ISXMAX,ISYMAX) GO TO 100 END IF IF(GRAPH.EQ.OFF) THEN WRITE(IDEV,6666) + (KKKK+LONGS-1,DIFFER(KKKK),KKKK=1,LONGE-LONGS+1) 6666 FORMAT(2I6) C CLOSE(UNIT=DEVNOS(1)) GO TO 100 END IF IF(GRAPH.EQ.ON) THEN XMIN = 1. XMAX = LONGE - LONGS + 1 YMIN = 0. YMAX = IMAXA(DIFFER,LONGE-LONGS+1) IYMAX = YMAX CALL GETINT(0,9999,IYMAX,'Maximum Y value for plotting', + IVAL,KBIN,KBOUT,HELPS(OPT),HELPE(OPT),HELPF,IDEVH,IOK) IF(IOK.NE.0) GO TO 100 YMAX = IVAL CALL PLTI(DIFFER,LONGE-LONGS+1, + XMAX,XMIN,YMAX,YMIN, + MARGL,MARGR,MARGB(OPT),MARGT(OPT),ISXMAX,ISYMAX) GO TO 100 END IF IF(GRAPH.EQ.OFF) THEN WRITE(IDEV,6666) + (KKKK+LONGS-1,DIFFER(KKKK),KKKK=1,LONGE-LONGS+1) GO TO 100 END IF IF(OPT.EQ.24) THEN WRITE(IDEV,1010)CHRSET 1010 FORMAT(' ',5(2X,A1,3X)) DO 320 I=1,5 WRITE(IDEV,1011)CHRSET(I),(BCHANG(I,K),K=1,5) 1011 FORMAT(' ',A1,5I6) 320 CONTINUE CALL KIMURA(BCHANG,DIST) WRITE(*,*)'Kimura evolutionary distance=',DIST GO TO 100 END IF IF(OPT.EQ.35) THEN DO 333 IP=1,3 WRITE(IDEV,1010)CHRSET DO 321 I=1,5 WRITE(IDEV,1011)CHRSET(I),(BCHAMG(I,K,IP),K=1,5) 321 CONTINUE 333 CONTINUE GO TO 100 END IF IF(OPT.EQ.36) THEN WRITE(IDEV,1010)CHRSET DO 322 I=1,5 WRITE(IDEV,1011)CHRSET(I),(BCHANG(I,K),K=1,5) 322 CONTINUE GO TO 100 END IF IF(OPT.EQ.39) THEN WRITE(IDEV,1010)CHRSET DO 324 I=1,5 WRITE(IDEV,1011)CHRSET(I),(BCHANG(I,K),K=1,5) 324 CONTINUE GO TO 100 END IF IF(SORT.EQ.OFF) GO TO 100 CALL BUB2AS(COUNTS,POINTS,ICOUNT) WRITE(IDEV,*)' Sorted list' DO 400 II=1,ICOUNT N = II CALL IANDJ(NFILE,POINTS(N),I,J) WRITE(IDEV,1015)NAMES(I)(1:20),NAMES(J)(1:20),COUNTS(II) 1015 FORMAT(' ',A,' ',A,' distance',I6) 400 CONTINUE WRITE(IDEV,1020)TOTCOU 1020 FORMAT(' Total distance ',I6) IF(OPT.EQ.22)WRITE(IDEV,1021)SUMCS 1021 FORMAT(' Total conservative changes',I6) GO TO 100 999 CONTINUE CALL SHUTD END REAL FUNCTION VARIM(FACID) INTEGER FACID(22),IMAXA EXTERNAL IMAXA C Variability defined (as kabat): C C Number of different acids / Freq of most common acid C NACIDS = 0 TACIDS = 0. DO 10 K = 1,22 TACIDS = TACIDS + FACID(K) IF(FACID(K).NE.0) NACIDS = NACIDS + 1 10 CONTINUE VARIM = 0. IF(TACIDS.GT.0.) THEN FREQC = REAL(IMAXA(FACID,22)) / TACIDS VARIM = REAL(NACIDS) / FREQC END IF END INTEGER FUNCTION AMINOP(ACID) CHARACTER ALLONE*22,ACID SAVE ALLONE DATA ALLONE/'ACDEFGHIKLMNPQRSTVWY*-'/ AMINOP = 22 DO 10 I=1,21 IF(ACID.EQ.ALLONE(I:I)) THEN AMINOP = I RETURN END IF 10 CONTINUE END SUBROUTINE TGETF(IDEV,FILNAM,KBIN,KBOUT, +SEQ1,MAXSEQ,STARTS,NAMES,MAXFIL,MAXNAM,NFILE,IOK, +IHELPS,IHELPE,HELPF,IDEVH) CHARACTER SEQ1(MAXSEQ),FILNAM*(*),HELPF*(*) CHARACTER*(*) NAMES(MAXFIL) INTEGER STARTS(MAXFIL) C C Routine to read in two sequences C FILNAM = ' ' CALL OPENF1(IDEV,FILNAM,0,IOK,KBIN,KBOUT, +'File name of first sequence', +IHELPS,IHELPE,HELPF,IDEVH) IF(IOK.NE.0)RETURN IDIM1 = MAXSEQ CALL ARRFIL(IDEV,SEQ1,IDIM1,KBOUT) CLOSE(UNIT=IDEV) NAMES(1) = FILNAM STARTS(1) = 1 FILNAM = ' ' CALL OPENF1(IDEV,FILNAM,0,IOK,KBIN,KBOUT, +'File name of second sequence', +IHELPS,IHELPE,HELPF,IDEVH) IF(IOK.NE.0)RETURN STARTS(2) = IDIM1 + 1 IDIM1 = MAXSEQ - IDIM1 CALL ARRFIL(IDEV,SEQ1(STARTS(2)),IDIM1,KBOUT) CLOSE(UNIT=IDEV) NAMES(2) = FILNAM STARTS(3) = STARTS(2) + IDIM1 NFILE = 2 END SUBROUTINE GETSQS(IDEV1,IDEV2,SEQ,MAXSEQ,STARTS,NAMES, +FILNAM,NFILE,MAXFIL,MAXNAM,KBIN,KBOUT, +IHELPS,IHELPE,HELPF,IDEVH) CHARACTER SEQ(MAXSEQ),HELPF*(*) CHARACTER*(*) FILNAM,NAMES(MAXFIL) INTEGER STARTS(MAXFIL) NFILE = 0 IEND = 0 FILNAM = ' ' CALL OPENF1(IDEV1,FILNAM,0,IOK,KBIN,KBOUT, +'File of file names', +IHELPS,IHELPE,HELPF,IDEVH) 2 CONTINUE IF (NFILE.LT.MAXFIL) THEN READ(IDEV1,1000,END=3)FILNAM 1000 FORMAT(A) NFILE = NFILE + 1 STARTS(NFILE) = IEND + 1 NAMES(NFILE) = FILNAM IDIM2 = MAXSEQ - IEND IF (IDIM2.GT.0) THEN CALL OPENRS(IDEV2,FILNAM,IOK,LRECL,2) CALL ARRFIL(IDEV2,SEQ(STARTS(NFILE)),IDIM2,KBOUT) CLOSE(UNIT=IDEV2) IEND = IEND + IDIM2 GO TO 2 END IF C C if we get here weve run out of array space C NFILE = NFILE - 1 WRITE(KBOUT,*)'Only ',NFILE,' files read: no more memory' CLOSE(UNIT=IDEV1) RETURN ELSE C C if we get here weve got too many files C NFILE = NFILE - 1 CLOSE(UNIT=IDEV1) WRITE(KBOUT,*)'Maximum files ',NFILE,' read' RETURN END IF 3 CONTINUE STARTS(NFILE+1) = IEND + 1 CLOSE(UNIT=IDEV1) END SUBROUTINE LISTN(SEQ,MAXCHR,LENSEQ,NFILE,LINLEN,I1,I2, +IDEV,KBOUT,NAMES,MAXFIL) CHARACTER*(*) NAMES(MAXFIL) PARAMETER (MAXLIN = 120) CHARACTER SEQ(MAXCHR),LINE*(MAXLIN) INTEGER LENSEQ(MAXFIL) EXTERNAL NOTIRL C SET WIDTH FOR LAST PAGE LPAGE=MOD(I2-I1+1,LINLEN) C HOW MANY PAGE WIDTHS? NPAGE=1+(I2-I1+1)/LINLEN IF(MOD(I2-I1+1,LINLEN).EQ.0)THEN NPAGE=NPAGE-1 LPAGE=LINLEN END IF ISTART=I1-LINLEN DO 50 I=1,NPAGE ISTART=ISTART+LINLEN IF(I.EQ.NPAGE)LINLEN=LPAGE WRITE(IDEV,1006)(K,K=ISTART+9,ISTART+LINLEN-1,10) DO 40 J=1,NFILE KF = ISTART + LENSEQ(J) - 1 KT = MIN(KF+LINLEN,LENSEQ(J+1)) - 1 LINE(1:) = ' ' WRITE(LINE,1003,ERR=60)(SEQ(K),K=KF,KT) 1003 FORMAT(' ',60A1) LINE(KT-KF+4:) = NAMES(J)(1:15) WRITE(IDEV,1004,ERR=60)LINE(1:NOTIRL(LINE,MAXLIN,' ')) 1004 FORMAT(A) 1006 FORMAT(' ',10I10) 40 CONTINUE WRITE(IDEV,1008) 1008 FORMAT( ) 50 CONTINUE RETURN 60 CONTINUE WRITE(KBOUT,*)' Error writing file' END SUBROUTINE LISTND(SEQ,MAXCHR,LENSEQ,NFILE,LINLEN,I1,I2, +IDEV,KBOUT,NAMES,MAXFIL) CHARACTER*(*) NAMES(MAXFIL) PARAMETER (MAXLIN = 120) CHARACTER SEQ(MAXCHR),LINE*(MAXLIN) INTEGER LENSEQ(MAXFIL),CTONUM EXTERNAL NOTIRL,CTONUM C SET WIDTH FOR LAST PAGE LPAGE=MOD(I2-I1+1,LINLEN) C HOW MANY PAGE WIDTHS? NPAGE=1+(I2-I1+1)/LINLEN IF(MOD(I2-I1+1,LINLEN).EQ.0)THEN NPAGE=NPAGE-1 LPAGE=LINLEN END IF ISTART=I1-LINLEN DO 50 I=1,NPAGE ISTART=ISTART+LINLEN IF(I.EQ.NPAGE)LINLEN=LPAGE WRITE(IDEV,1006)(K,K=ISTART+9,ISTART+LINLEN-1,10) KF = ISTART + LENSEQ(1) - 1 KT = MIN(KF+LINLEN,LENSEQ(2)) - 1 WRITE(LINE,1003,ERR=60)(SEQ(K),K=KF,KT) 1003 FORMAT(' ',60A1) LINE(KT-KF+4:) = NAMES(1)(1:15) WRITE(IDEV,1004,ERR=60)LINE(1:NOTIRL(LINE,MAXLIN,' ')) DO 40 J=2,NFILE KF = ISTART + LENSEQ(J) - 1 KT = MIN(KF+LINLEN,LENSEQ(J+1)) - 1 KSF = ISTART + LENSEQ(1) - 2 LINE(1:) = ' ' KKL = 1 DO 35 KK = KF,KT KKL = KKL + 1 KSF = KSF + 1 IF(CTONUM(SEQ(KK)).EQ.CTONUM(SEQ(KSF))) THEN LINE(KKL:KKL) = '-' ELSE LINE(KKL:KKL) = SEQ(KK) END IF 35 CONTINUE LINE(KT-KF+4:) = NAMES(J)(1:15) WRITE(IDEV,1004,ERR=60)LINE(1:NOTIRL(LINE,MAXLIN,' ')) 1004 FORMAT(A) 1006 FORMAT(' ',10I10) 40 CONTINUE WRITE(IDEV,1008) 1008 FORMAT( ) 50 CONTINUE RETURN 60 CONTINUE WRITE(KBOUT,*)' Error writing file' END SUBROUTINE LISTNT(SEQ,MAXCHR,LENSEQ,NFILE,LINLIN,I1,I2, +IDEV,KBOUT,NAMES,MAXFIL,PAA) CHARACTER*(*) NAMES(MAXFIL) PARAMETER (MAXLIN = 120) CHARACTER SEQ(MAXCHR),LINE*(MAXLIN),PAA*(*),TRANF INTEGER LENSEQ(MAXFIL) EXTERNAL NOTIRL,TRANF C C line length is linlen acids which needs 3*linlen bases C LINLEN = LINLIN I2MI1 = I2 - I1 + 1 C number of whole codons I2MI1 = I2MI1/3 C SET WIDTH FOR LAST PAGE LPAGE=MOD(I2MI1,LINLEN) C HOW MANY PAGE WIDTHS? NPAGE=1+I2MI1/LINLEN IF(MOD(I2MI1,LINLEN).EQ.0)THEN NPAGE=NPAGE-1 LPAGE=LINLEN END IF ISTART=I1-3*LINLEN DO 50 I=1,NPAGE ISTART=ISTART+3*LINLEN IF(I.EQ.NPAGE)LINLEN=LPAGE WRITE(IDEV,1006)(K,K=ISTART+29,ISTART+3*LINLEN-1,30) DO 40 J=1,NFILE KF = ISTART + LENSEQ(J) - 1 KT = MIN(KF+3*LINLEN,LENSEQ(J+1)) - 1 LINE(1:) = ' ' LL = KF - 3 DO 30 L = 1,LINLEN LL = LL + 3 LINE(L:L) = TRANF(SEQ(LL),PAA) 30 CONTINUE LINE(1+(KT-KF+4)/3:) = NAMES(J)(1:15) WRITE(IDEV,1004,ERR=60)LINE(1:NOTIRL(LINE,MAXLIN,' ')) 1004 FORMAT(' ',A) 1006 FORMAT(' ',10I10) 40 CONTINUE WRITE(IDEV,1008) 1008 FORMAT( ) 50 CONTINUE RETURN 60 CONTINUE WRITE(KBOUT,*)' Error writing file' END SUBROUTINE LISTNV(SEQ,MAXCHR,LENSEQ,NFILE,LINLIN,I1,I2, +IDEV,KBOUT,NAMES,MAXFIL,PAA) CHARACTER*(*) NAMES(MAXFIL) PARAMETER (MAXLIN = 120) CHARACTER SEQ(MAXCHR),LINE*(MAXLIN),PAA*(*),TRANF INTEGER LENSEQ(MAXFIL) EXTERNAL NOTIRL,TRANF C C line length is linlen acids which needs 3*linlen bases C LINLEN = LINLIN I2MI1 = I2 - I1 + 1 C number of whole codons I2MI1 = I2MI1/3 C SET WIDTH FOR LAST PAGE LPAGE=MOD(I2MI1,LINLEN) C HOW MANY PAGE WIDTHS? NPAGE=1+I2MI1/LINLEN IF(MOD(I2MI1,LINLEN).EQ.0)THEN NPAGE=NPAGE-1 LPAGE=LINLEN END IF ISTART=I1-3*LINLEN DO 50 I=1,NPAGE ISTART=ISTART+3*LINLEN IF(I.EQ.NPAGE)LINLEN=LPAGE WRITE(IDEV,1006)(K,K=ISTART+29,ISTART+3*LINLEN-1,30) KF = ISTART + LENSEQ(1) - 1 KT = MIN(KF+3*LINLEN,LENSEQ(2)) - 1 LINE(1:) = ' ' LL = KF - 3 DO 20 L = 1,LINLEN LL = LL + 3 LINE(L:L) = TRANF(SEQ(LL),PAA) 20 CONTINUE LINE(1+(KT-KF+4)/3:) = NAMES(1)(1:15) WRITE(IDEV,1004,ERR=60)LINE(1:NOTIRL(LINE,MAXLIN,' ')) DO 40 J=2,NFILE KF = ISTART + LENSEQ(J) - 1 KT = MIN(KF+3*LINLEN,LENSEQ(J+1)) - 1 KFS = ISTART + LENSEQ(1) - 1 LINE(1:) = ' ' LL = KF - 3 LLS = KFS - 3 DO 30 L = 1,LINLEN LL = LL + 3 LLS = LLS + 3 IF(TRANF(SEQ(LLS),PAA).EQ.TRANF(SEQ(LL),PAA)) THEN LINE(L:L) = '-' ELSE LINE(L:L) = TRANF(SEQ(LL),PAA) END IF 30 CONTINUE LINE(1+(KT-KF+4)/3:) = NAMES(J)(1:15) WRITE(IDEV,1004,ERR=60)LINE(1:NOTIRL(LINE,MAXLIN,' ')) 1004 FORMAT(' ',A) 1006 FORMAT(' ',10I10) 40 CONTINUE WRITE(IDEV,1008) 1008 FORMAT( ) 50 CONTINUE RETURN 60 CONTINUE WRITE(KBOUT,*)' Error writing file' END SUBROUTINE IANDJ(N,L,I,J) C ROUTINE, GIVEN N FILES AND ELEMENT L FROM LIST C CALC ROW I AND COL J NOS ASSUMING L LIES IN TOP C RIGHT CORNER OF MATRIX I=1 J1=0 K=0 10 CONTINUE J1=J1+1 J=J1 11 CONTINUE C REACHED ELEMENT L? IF(K.EQ.L)RETURN J=J+1 K=K+1 C REACHED END OF ROW? IF(J.LE.N)GO TO 11 C YES, POINT TO NEX ROW I=I+1 K=K-1 GO TO 10 END INTEGER FUNCTION IMAXA(I,N) INTEGER I(N) IMAXA = I(1) DO 10 J=2,N IMAXA = MAX(IMAXA,I(J)) 10 CONTINUE END INTEGER FUNCTION IMINA(I,N) INTEGER I(N) IMINA = I(1) DO 10 J=2,N IMINA = MIN(IMINA,I(J)) 10 CONTINUE END SUBROUTINE PLTI(IY,NY, +XMAX,XMIN,YMAX,YMIN, +MARGL,MARGR,MARGB,MARGT,ISXMAX,ISYMAX) INTEGER IY(NY) CALL VECTOM CALL FRAME(MARGL,MARGR,MARGB,MARGT,ISXMAX,ISYMAX) YF = YMIN DO 100 I=1,NY XF = I YT = IY(I) CALL LINE(XF,XF,YF,YT,XMAX,XMIN,YMAX,YMIN, + MARGL,MARGR,MARGB,MARGT,ISXMAX,ISYMAX) 100 CONTINUE CALL VT100M END REAL FUNCTION RMAXA(I,N) REAL I(N) RMAXA = I(1) DO 10 J=2,N RMAXA = MAX(RMAXA,I(J)) 10 CONTINUE END REAL FUNCTION RMINA(I,N) REAL I(N) RMINA = I(1) DO 10 J=2,N RMINA = MIN(RMINA,I(J)) 10 CONTINUE END SUBROUTINE PLTR(IY,NY, +XMAX,XMIN,YMAX,YMIN, +MARGL,MARGR,MARGB,MARGT,ISXMAX,ISYMAX) REAL IY(NY) CALL VECTOM CALL FRAME(MARGL,MARGR,MARGB,MARGT,ISXMAX,ISYMAX) YF = YMIN DO 100 I=1,NY XF = I YT = IY(I) CALL LINE(XF,XF,YF,YT,XMAX,XMIN,YMAX,YMIN, + MARGL,MARGR,MARGB,MARGT,ISXMAX,ISYMAX) 100 CONTINUE CALL VT100M END SUBROUTINE COCHAN(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2, +ICONSA,ISAME,ICONSC,MISMAT,IDEV,SUM) INTEGER SJ(6) INTEGER SUM(4096),SAME(77),SUMC CHARACTER SEQ1(IDIM1),SEQ2(IDIM1) CHARACTER AA(18) EXTERNAL JCODNO DATA AA/'F','L','I','V','S','P','T','A','Y','H','Q','N', +'K','D','E','C','R','G'/ DATA SAME/2,1,2,6,3,4,17,18,19,20,3,33,34,35,4,49,50,51, +52,6,5,6,7,8,45,46,4,21,22,23,24,4,37,38,39,40,4,53,54, +55,56,2,9,10,2,25,26,2,27,28,2,41,42,2,43,44,2,57,58,2, +59,60,2,13,14,6,29,30,31,32,47,48,4,61,62,63,64/ C CONSERVED ACIDS ICONSA=KSUM C CONSERVATIVE CHANGES ICONSC=SUMC C UNCHANGED CODONS ISAME=ISUM DO 55 I=1,4096 SUM(I)=0 55 CONTINUE C IDIM3=N1-I1+1 IDIM4=N2-I2+1 C C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) C SET MIN TO NUMBER OF CODONS MINL=MINL/3 MAXL=MAX(IDIM3,IDIM4) MAXL=MAXL/3 J=I1 K=I2 C C MAIN LOOP C DO 100 I=1,MINL IP1=JCODNO(SEQ1,IDIM1,J) IF(IP1.EQ.0)GO TO 199 IP2=JCODNO(SEQ2,IDIM2,K) IF(IP2.EQ.0)GO TO 199 IP=IP1*64+IP2-64 SUM(IP)=SUM(IP)+1 199 CONTINUE J=J+3 K=K+3 100 CONTINUE C C SUM THOSE CONSERVED C ISUM=0 SUMC=0 IK1=2 C C LOOP FOR EACH AMINO ACID WITH MORE THAN 1 CODON C DO 120 K=1,18 NUM=SAME(IK1-1) C C FIRST ELEMENT IN SAME IS THE NUMBER OF CODONS FOR THIS AMINO ACID C SUCCEEDING ELEMENTS ARE THE CODON NUMBERS C LOOP FOR EACH CODON C DO 110 I=1,NUM IP=SAME(IK1+I-1) NP=(IP-1)*64 C C LOOP FOR EACH CODON CALCULATING POINTERS TO EACH CHANGE NOT C AFFECTING AMINO ACID C DO 105 J=1,NUM MP=SAME(IK1+J-1) JP=NP+MP SJ(J)=SUM(JP) 105 CONTINUE DO 104 N=1,NUM IF(N.EQ.I)ISUM=ISUM+SJ(N) SUMC=SUMC+SJ(N) SJ(N)=0 104 CONTINUE 110 CONTINUE IK1=IK1+NUM+1 120 CONTINUE C ADD MET AND TRP CODONS TO THOSE CONSERVING ACID KSUM=SUMC+SUM(2276)+SUM(976) FKSUM=100.*FLOAT(KSUM)/FLOAT(MAXL) WRITE(IDEV,1005)KSUM,FKSUM 1005 FORMAT(' Number of conserved amino acids ',I6,' = ',F6.2,'%') C1005 FORMAT(' NUMBER OF CONSERVED AMINO ACIDS=',I6,', AS PERCENT=' C 1,F6.2) C C SUBTRACT CONSERVED CODONS FROM THOSE CONSERVING AMINO ACID SUMC=SUMC-ISUM FSUMC=100.*FLOAT(SUMC)/FLOAT(MAXL) WRITE(IDEV,1001)SUMC,FSUMC 1001 FORMAT(' Number of conservative codon changes ',I6,' = ',F6.2,'%') C1001 FORMAT(' NUMBER OF CONSERVATIVE CODON CHANGES=',I6,', AS', C 1' PERCENT=', C 1F6.2) C ADD MET AND TRP TO UNCHANGED CODONS ISUM=ISUM+SUM(2276)+SUM(976) FISUM=100.*FLOAT(ISUM)/FLOAT(MAXL) WRITE(IDEV,1004)ISUM,FISUM 1004 FORMAT(' Number of unchanged codons ',I6,' = ',F6.2,'%') C1004 FORMAT(' NUMBER OF UNCHANGED CODONS=',I6,', AS PERCENT=',F6.2) C C CONSERVED ACIDS ICONSA=KSUM C CONSERVATIVE CHANGES ICONSC=SUMC C UNCHANGED CODONS ISAME=ISUM C CODONS CHANGING AMINO ACID MISMAT=MAXL-ICONSA RETURN END SUBROUTINE BSCHN2(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,MISMAT, 1IDEV) C THIS ROUTINE COUNTS GENETIC EVENTS AND 1 BASE INSERTION C EQUALS N BASE INSERTION CHARACTER SEQ1(IDIM1),SEQ2(IDIM2) INTEGER CTONUM EXTERNAL CTONUM IDIM3=N1-I1+1 IDIM4=N2-I2+1 C C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) C SET MIN TO NUMBER OF BASES MAXL=MAX(IDIM3,IDIM4) MISMAT=0 J=I2-1 IDASH1=0 IDASH2=0 DO 5 I=I1,I1+MINL-1 J=J+1 IF(CTONUM(SEQ1(I)).EQ.5)IDASH1=IDASH1+1 IF(CTONUM(SEQ1(I)).NE.5)IDASH1=0 IF(CTONUM(SEQ2(J)).EQ.5)IDASH2=IDASH2+1 IF(CTONUM(SEQ2(J)).NE.5)IDASH2=0 IF(SEQ1(I).EQ.SEQ2(J))GO TO 5 MISMAT=MISMAT+1 IF((IDASH1.GT.1).OR.(IDASH2.GT.1))MISMAT=MISMAT-1 5 CONTINUE C cantor and jukes P = REAL(MISMAT)/REAL(MAXL) D = -0.75*LOG(1.0 - 4.0*P/3.0) V = P*(1.0-P)/(REAL(MAXL)*(1.0-4.0*P/3.0)**2) CONS=MINL-MISMAT CONS=CONS*100./MAXL WRITE(IDEV,1001)MISMAT,CONS 1001 FORMAT(' Number of events ',I6,' = ',F6.2,'%') C1001 FORMAT(' NUMBER OF EVENTS=',I6,' PERCENTAGE CONSERVATION=', C 1F6.2) WRITE(IDEV,1002)D,V 1002 FORMAT(' Expected number of substitutions per site and variance ' +,F10.5,F10.7) C1002 FORMAT( C +' JC SUBSTITUTIONS PER SITE=',F10.5,' AND VARIANCE=',F10.7) END C SUBROUTINE BSCHN1(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,MISMAT, +IDEV) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2) INTEGER CTONUM EXTERNAL CTONUM C COUNT DIFFERENCES (BASE CHANGES) IDIM3=N1-I1+1 IDIM4=N2-I2+1 C C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) C SET MIN TO NUMBER OF BASES MAXL=MAX(IDIM3,IDIM4) MISMAT=0 J=I2-1 DO 10 I=I1,I1+MINL-1 J=J+1 IF(CTONUM(SEQ1(I)).NE.CTONUM(SEQ2(J))) MISMAT=MISMAT+1 10 CONTINUE CONS=MINL-MISMAT CONS=CONS*100./MAXL WRITE(IDEV,1001)MISMAT,CONS 1001 FORMAT(' Number of differences ',I6,' = ',F6.2,'%') END SUBROUTINE BSCHN6(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,MISMAT, 1IDEV) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2) C COUNT DIFFERENCES (BASE CHANGES) INTEGER CTONUM EXTERNAL CTONUM IDIM3=N1-I1+1 IDIM4=N2-I2+1 C C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) C SET MIN TO NUMBER OF BASES MAXL=MAX(IDIM3,IDIM4) MISMAT=0 J=I2-1 DO 10 I=I1,I1+MINL-1 J=J+1 K1 = CTONUM(SEQ1(I)) K2 = CTONUM(SEQ2(J)) IF(K1.EQ.K2) GO TO 10 IF(K1.EQ.5) GO TO 10 IF(K2.EQ.5) GO TO 10 MISMAT=MISMAT+1 10 CONTINUE CONS=MINL-MISMAT CONS=CONS*100./MAXL WRITE(IDEV,1001)MISMAT,CONS 1001 FORMAT(' NUMBER OF DIFFERENCES=',I6,' PERCENTAGE CONSERVATION', 1' = ',F6.2) RETURN END C SUBROUTINE BSCHN4(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,DIFFER) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2) INTEGER DIFFER(IDIM1) INTEGER CTONUM EXTERNAL CTONUM IDIM3=N1-I1+1 IDIM4=N2-I2+1 C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) J1 = I1 - 1 J2 = I2 - 1 DO 10 I=1,MINL J1 = J1 + 1 J2 = J2 + 1 IF(CTONUM(SEQ1(J1)).NE.CTONUM(SEQ2(J2))) + DIFFER(I)=DIFFER(I)+1 10 CONTINUE END C SUBROUTINE BSCHN3(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,CHANGE) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2) INTEGER CHANGE(5,5) INTEGER CTONUM EXTERNAL CTONUM IDIM3=N1-I1+1 IDIM4=N2-I2+1 C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) C SET MIN TO NUMBER OF BASES MAXL=MAX(IDIM3,IDIM4) MISMAT=0 J=I2-1 DO 10 I=I1,I1+MINL-1 J=J+1 II=CTONUM(SEQ1(I)) JJ=CTONUM(SEQ2(J)) CHANGE(II,JJ)=CHANGE(II,JJ)+1 10 CONTINUE END SUBROUTINE BSCHM3(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,CHANGE) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2) INTEGER CHANGE(5,5,3) INTEGER CTONUM EXTERNAL CTONUM IDIM3=N1-I1+1 IDIM4=N2-I2+1 C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) C SET MIN TO NUMBER OF BASES MAXL=MAX(IDIM3,IDIM4) MISMAT=0 J=I2-3 DO 10 I=I1,I1+MINL-2,3 J=J+3 DO 5 K=0,2 II=CTONUM(SEQ1(I+K)) JJ=CTONUM(SEQ2(J+K)) CHANGE(II,JJ,K+1)=CHANGE(II,JJ,K+1)+1 5 CONTINUE 10 CONTINUE END SUBROUTINE KIMURA(CHANGE,DIST) INTEGER CHANGE(5,5) EXTERNAL EVDIST C C Calc P and Q, then calc the evolutionary distance C P = CHANGE(1,2) + CHANGE(2,1) + CHANGE(3,4) + CHANGE(4,3) Q = CHANGE(1,3) + CHANGE(3,1) + CHANGE(1,4) + CHANGE(4,1) Q = Q + CHANGE(3,2) + CHANGE(2,3) + CHANGE(2,4) + CHANGE(4,2) NSITES = 0 C C dont count changes to dash C DO 10 I=1,4 DO 5 J=1,4 NSITES = NSITES + CHANGE(I,J) 5 CONTINUE 10 CONTINUE WRITE(*,*)'NP=',P WRITE(*,*)'NQ=',Q WRITE(*,*)'NSITES=',NSITES P = 58 Q = 63 NSITES = 438 WRITE(*,*)'NP=',P WRITE(*,*)'NQ=',Q WRITE(*,*)'NSITES=',NSITES P = P / REAL(NSITES) Q = Q / REAL(NSITES) DIST = EVDIST(P,Q) END REAL FUNCTION EVDIST(P,Q) C C Calc evolutionary distance per site according to kimura C C P and Q are the fractions if sites with respectively type I and II C substitutions (ie transitions and transversions) C EVDIST = -0.5 * LOG((1.0 - 2.0*P - Q) * SQRT(1.0 - 2.0 * Q)) C C standard error C A = 1.0 / (1.0 - 2.0 * P - Q) B = 0.5 * (1.0 / ( A - 1.0 / (1.0 - 2.0 * Q))) C C !!!!!!!!!!!!!! NOT SURE I CAN READ THIS IN THE PAPER C AND CANT READ THE NEXT BIT END C C SUBROUTINE TO WRITE 3 LINES OF SEQUENCES C SUBROUTINE FMT2(IDEV,SEQ1,SEQ2,IDIM,ISW,ISX,LINLEN) CHARACTER SEQ1(IDIM),SEQ2(IDIM),MATCH(120) INTEGER KL(12) C C ISXX=ISX-1 ISWW=ISW-1 IE=0 1 CONTINUE WRITE(IDEV,1003) 1003 FORMAT( ) DO 50 J=1,LINLEN/10 ISWW=ISWW+10 KL(J)=ISWW 50 CONTINUE WRITE(IDEV,1001)(KL(KKK),KKK=1,LINLEN/10) IS=IE+1 IE=IE+LINLEN IF(IE.GT.IDIM)IE=IDIM C COMPARE THE TWO SECTIONS OF SEQUENCE IL=IE-IS+1 CALL SQMTCH(SEQ1(IS),SEQ2(IS),MATCH,IL) WRITE(IDEV,1002)(SEQ1(K),K=IS,IE) WRITE(IDEV,1002)(MATCH(K),K=1,IL) WRITE(IDEV,1002)(SEQ2(K),K=IS,IE) 1002 FORMAT( ' ',12(10A1,1X)) C SET UP DECIMAL COUNTERS DO 60 J=1,LINLEN/10 ISXX=ISXX+10 KL(J)=ISXX 60 CONTINUE WRITE(IDEV,1001)(KL(KKK),KKK=1,LINLEN/10) 1001 FORMAT( ' ',12(5X,I6)) IF(IE.EQ.IDIM)RETURN GO TO 1 END C C C C RETURNS POINTER TO CODON NUMBER FROM 1 - 64 INTEGER FUNCTION JCODNO(SEQ,IDIM,I) C AUTHOR: RODGER STADEN CHARACTER SEQ(IDIM) INTEGER CTONUM,JP(3) EXTERNAL CTONUM C CHECK FOR BAD CHAR IN SEQ JCODNO=0 IP=I-1 DO 1 J=1,3 JP(J)=CTONUM(SEQ(IP+J)) 1 IF(JP(J).EQ.5)RETURN JCODNO=JP(1)*16+4*JP(2)+JP(3)-20 RETURN END C SUBROUTINE BSCHN5(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,MISMAT, 1IDEV,PAA) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2),PAA(5,5,5) INTEGER CFCOD1 EXTERNAL CFCOD1 IDIM3=N1-I1+1 IDIM4=N2-I2+1 C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) J1=I1 - 3 J2 = I2 - 3 ISUM = 0 JSUM = 0 DO 10 I=1,MINL-2,3 J1 = J1 + 3 J2 = J2 + 3 ISUM = ISUM + CFCOD1(SEQ1(J1),SEQ2(J2),PAA) JSUM = JSUM + CFCOD1(SEQ2(J2),SEQ1(J1),PAA) 10 CONTINUE WRITE(IDEV,1000)ISUM WRITE(IDEV,1001)JSUM 1000 FORMAT(' 1 TO 2 =',I6) 1001 FORMAT(' 2 TO 1 =',I6) MISMAT = ISUM + JSUM END SUBROUTINE BSCHN7(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,MISMAT, +IDEV,PAA) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2),PAA(5,5,5) INTEGER CFCOD1 EXTERNAL CFCOD1 IDIM3=N1-I1+1 IDIM4=N2-I2+1 C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) J1=I1 - 3 J2 = I2 - 3 MISMAT = 0 DO 10 I=1,MINL-2,3 J1 = J1 + 3 J2 = J2 + 3 MISMAT = MISMAT + CFCOD1(SEQ1(J1),SEQ2(J2),PAA) 10 CONTINUE WRITE(IDEV,1000)MISMAT 1000 FORMAT(' Expressed base changes ',I6) END SUBROUTINE BSCHN8(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,MISMAT, +IDEV,PAA) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2),PAA(5,5,5) INTEGER CFCOD2 EXTERNAL CFCOD2 IDIM3=N1-I1+1 IDIM4=N2-I2+1 C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) J1=I1 - 3 J2 = I2 - 3 MISMAT = 0 DO 10 I=1,MINL-2,3 J1 = J1 + 3 J2 = J2 + 3 MISMAT = MISMAT + CFCOD2(SEQ1(J1),SEQ2(J2),PAA) 10 CONTINUE WRITE(IDEV,1000)MISMAT 1000 FORMAT(' Silent base changes ',I6) END SUBROUTINE BSCHN9(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,MISMAT, +IDEV,PAA) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2),PAA(5,5,5) INTEGER CFCOD3 EXTERNAL CFCOD3 IDIM3=N1-I1+1 IDIM4=N2-I2+1 C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) J1=I1 - 3 J2 = I2 - 3 MISMAT = 0 DO 10 I=1,MINL-2,3 J1 = J1 + 3 J2 = J2 + 3 MISMAT = MISMAT + CFCOD3(SEQ1(J1),SEQ2(J2),PAA) 10 CONTINUE WRITE(IDEV,1000)MISMAT 1000 FORMAT(' Number of changed acids ',I6) END SUBROUTINE COCHN1(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,DIFFER, +PAA) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2),PAA(5,5,5) INTEGER DIFFER(IDIM1) C count number of expressed base changes IDIM3=N1-I1+1 IDIM4=N2-I2+1 C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) J1=I1 - 3 J2 = I2 - 3 DO 10 I=1,MINL-2,3 J1 = J1 + 3 J2 = J2 + 3 CALL SCFCD1(SEQ1(J1),SEQ2(J2),PAA,DIFFER(I)) C DIFFER(I) = DIFFER(I) + CFCOD1(SEQ1(J1),SEQ2(J2),PAA) 10 CONTINUE END SUBROUTINE SCFCD1(COD1,COD2,PAA,DIFF) CHARACTER COD1(3),COD2(3),COD(3),ACID,TRANF,PAA(5,5,5) INTEGER DIFF(3) EXTERNAL TRANF C C returns 1 for each base in a codon cod2 that changes the acid from that C encoded by cod1 C ACID = TRANF(COD1,PAA) DO 10 I = 1,3 COD(I) = COD1(I) 10 CONTINUE DO 20 I = 1,3 COD(I) = COD2(I) IF(TRANF(COD,PAA).NE.ACID)DIFF(I) = DIFF(I) + 1 COD(I) = COD1(I) 20 CONTINUE END INTEGER FUNCTION CFCOD1(COD1,COD2,PAA) CHARACTER COD1(3),COD2(3),COD(3),ACID,TRANF,PAA(5,5,5) EXTERNAL TRANF C C returns 1 for each base in a codon cod2 that changes the acid from that C encoded by cod1 C CFCOD1 = 0 ACID = TRANF(COD1,PAA) DO 10 I = 1,3 COD(I) = COD1(I) 10 CONTINUE DO 20 I = 1,3 COD(I) = COD2(I) IF(TRANF(COD,PAA).NE.ACID)CFCOD1 = CFCOD1 + 1 COD(I) = COD1(I) 20 CONTINUE END SUBROUTINE COCHN2(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,DIFFER, +PAA) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2),PAA(5,5,5) INTEGER DIFFER(IDIM1) C count number of silent base changes IDIM3=N1-I1+1 IDIM4=N2-I2+1 C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) J1=I1 - 3 J2 = I2 - 3 DO 10 I=1,MINL-2,3 J1 = J1 + 3 J2 = J2 + 3 CALL SCFCD2(SEQ1(J1),SEQ2(J2),PAA,DIFFER(I)) C DIFFER(I) = DIFFER(I) + CFCOD2(SEQ1(J1),SEQ2(J2),PAA) 10 CONTINUE END SUBROUTINE SCFCD2(COD1,COD2,PAA,DIFF) CHARACTER COD1(3),COD2(3),COD(3),ACID,TRANF,PAA(5,5,5) INTEGER DIFF(3) EXTERNAL TRANF C C compare each base, if different does this base alone change the acid C if not then add 1 to score ACID = TRANF(COD1,PAA) DO 10 I = 1,3 COD(I) = COD1(I) 10 CONTINUE DO 20 I = 1,3 IF(COD1(I).NE.COD2(I)) THEN COD(I) = COD2(I) IF(TRANF(COD,PAA).EQ.ACID)DIFF(I) = DIFF(I) + 1 COD(I) = COD1(I) END IF 20 CONTINUE END INTEGER FUNCTION CFCOD2(COD1,COD2,PAA) CHARACTER COD1(3),COD2(3),COD(3),ACID,TRANF,PAA(5,5,5) EXTERNAL TRANF C C compare each base, if different does this base alone change the acid C if not then add 1 to score CFCOD2 = 0 ACID = TRANF(COD1,PAA) DO 10 I = 1,3 COD(I) = COD1(I) 10 CONTINUE DO 20 I = 1,3 IF(COD1(I).NE.COD2(I)) THEN COD(I) = COD2(I) IF(TRANF(COD,PAA).EQ.ACID)CFCOD2 = CFCOD2 + 1 COD(I) = COD1(I) END IF 20 CONTINUE END INTEGER FUNCTION CFCOD3(COD1,COD2,PAA) CHARACTER COD1(3),COD2(3),TRANF,PAA(5,5,5) EXTERNAL TRANF C C compare each acid, count if different C CFCOD3 = 0 IF(TRANF(COD1,PAA).NE.TRANF(COD2,PAA)) CFCOD3 = 1 END REAL FUNCTION FINF(COMP) INTEGER COMP(5) F = 0. S = 5. DO 10 I=1,5 S = S + COMP(I) 10 CONTINUE DO 20 I=1,5 X = (1.0+REAL(COMP(I)))/S F = F - X * LOG(X) 20 CONTINUE FINF = F END SUBROUTINE COCHN3(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,CHANGE, +PAA) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2),PAA(5,5,5) INTEGER CHANGE(5,5) C count number of expressed base changes IDIM3=N1-I1+1 IDIM4=N2-I2+1 C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) J1=I1 - 3 J2 = I2 - 3 DO 10 I=1,MINL-2,3 J1 = J1 + 3 J2 = J2 + 3 CALL SCFCD3(SEQ1(J1),SEQ2(J2),PAA,CHANGE) 10 CONTINUE END SUBROUTINE SCFCD3(COD1,COD2,PAA,CHANGE) CHARACTER COD1(3),COD2(3),COD(3),ACID,TRANF,PAA(5,5,5) INTEGER CHANGE(5,5),CTONUM EXTERNAL TRANF,CTONUM C C compare each base, if different does this base alone change the acid C if so then add 1 to score ACID = TRANF(COD1,PAA) DO 10 I = 1,3 COD(I) = COD1(I) 10 CONTINUE DO 20 I = 1,3 IF(COD1(I).NE.COD2(I)) THEN COD(I) = COD2(I) IF(TRANF(COD,PAA).NE.ACID) THEN K1 = CTONUM(COD1(I)) K2 = CTONUM(COD2(I)) CHANGE(K1,K2) = CHANGE(K1,K2) + 1 END IF COD(I) = COD1(I) END IF 20 CONTINUE END SUBROUTINE COCHN5(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,CHANGE, +PAA) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2),PAA(5,5,5) INTEGER CHANGE(5,5) C count number of expressed base changes IDIM3=N1-I1+1 IDIM4=N2-I2+1 C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) J1=I1 - 3 J2 = I2 - 3 DO 10 I=1,MINL-2,3 J1 = J1 + 3 J2 = J2 + 3 CALL SCFCD4(SEQ1(J1),SEQ2(J2),PAA,CHANGE) 10 CONTINUE END SUBROUTINE SCFCD4(COD1,COD2,PAA,CHANGE) CHARACTER COD1(3),COD2(3),TRANF,PAA(5,5,5) INTEGER CHANGE(5,5),CTONUM EXTERNAL TRANF,CTONUM C C if the acid is the same count the mutations C IF (TRANF(COD1,PAA).EQ.TRANF(COD2,PAA)) THEN DO 20 I = 1,3 K1 = CTONUM(COD1(I)) K2 = CTONUM(COD2(I)) CHANGE(K1,K2) = CHANGE(K1,K2) + 1 20 CONTINUE END IF END SUBROUTINE TRAN(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2, +KBIN,KBOUT,IDEV,LINLEN,PAA) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2),SYM1,SYM2,MATCH(120),TRANF CHARACTER PAA(5,5,5) INTEGER CTONUM EXTERNAL CTONUM,TRANF SYM2 = ':' SYM1 = ' ' IF(0.EQ.1) THEN WRITE(KBOUT,2000) 2000 FORMAT(' ? IDENTITY SYMBOL=',$) READ(KBIN,2001)SYM2 2001 FORMAT(A1) WRITE(KBOUT,2002) 2002 FORMAT(' ? MISMATCH SYMBOL=',$) READ(KBIN,2001)SYM1 END IF J1=I1 J2=I1+LINLEN-1 IF(J2.GT.N1)J2=N1 K1=I2 K2=I2+LINLEN-1 IF(K2.GT.N2)K2=N2 20 CONTINUE WRITE(IDEV,1004) WRITE(IDEV,1000)(TRANF(SEQ1(K),PAA),K=J1,J2-1,3) WRITE(IDEV,1003)(SEQ1(K),K=J1,J2) DO 30 JJ=1,LINLEN MATCH(JJ)=SYM1 30 CONTINUE DO 40 JJ=1,MIN((J2-J1+1),(K2-K1+1),(N1-J1+1),(N2-K1+1)) KK=CTONUM(SEQ1(J1-1+JJ)) LL=CTONUM(SEQ2(K1-1+JJ)) IF(KK.EQ.LL)MATCH(JJ)=SYM2 40 CONTINUE WRITE(IDEV,1003)(MATCH(K),K=1,MIN((J2-J1+1),(K2-K1+1), +(N1-J1+1),(N2-K1+1))) WRITE(IDEV,1003)(SEQ2(K),K=K1,K2) WRITE(IDEV,1000)(TRANF(SEQ2(K),PAA),K=K1,K2-1,3) C J1=J2+1 J2=J2+LINLEN IF(J1.GT.N1)RETURN IF(J2.GT.N1)J2=N1 K1=K2+1 K2=K2+LINLEN IF(K1.GT.N2)RETURN IF(K2.GT.N2)K2=N2 GO TO 20 1000 FORMAT(3X,40(2X,1A1)) 1001 FORMAT(4X,40(2X,1A1)) 1002 FORMAT(5X,40(2X,1A1)) 1003 FORMAT(4X,120A1) 1004 FORMAT( ) 1005 FORMAT(4X,12I10) END SUBROUTINE INITMT(M,S,JOB) INTEGER S(4096) REAL M(16) CALL FILLI(S,4096,0) C only initialise mutation rates if first pass IF(JOB.EQ.0) CALL FILLR(M,16,0.25) END SUBROUTINE MAKED(M,D) REAL M(4,4),D(17) INTEGER T,C,A,G SAVE T,C,A,G DATA T,C,A,G/1,2,3,4/ C C To use these values: 1. add m(x,y) to d where x,y is the selected change C 2. correct each of the appropriate m's using the C d values and add m(x,y)/d to m(x,y) C D(1) = M(T,C) + M(T,A) + M(T,G) D(2) = M(T,A) + M(T,G) D(3) = M(T,G) D(4) = 0. D(5) = M(C,T) + M(C,A) + M(C,G) D(6) = M(C,A) + M(C,G) D(7) = 0. D(8) = M(A,T) + M(A,C) + M(A,G) D(9) = M(A,T) + M(A,C) D(10) = M(A,G) D(11) = 0. D(12) = M(G,T) + M(G,C) + M(G,A) D(13) = M(G,T) + M(G,C) D(14) = 0. D(15) = M(C,T) + M(C,G) D(16) = M(C,G) D(17) = M(A,T) + M(A,G) C DO 10 I=1,17 C WRITE(*,*)I,D(I) C 10 CONTINUE END SUBROUTINE UPDM(M,D,E,MC,B1,B2,IADD,ND) REAL M(4,4),D(17),E(4,4) INTEGER T,C,A,G,B1,B2,ND(17) SAVE T,C,A,G PARAMETER (DELTA = 1E-10) DATA T,C,A,G/1,2,3,4/ IF (IADD.EQ.0) RETURN C ND(MC) = ND(MC) + IADD ADD = IADD C E(B1,B2) = E(B1,B2) + ADD C IF(0.EQ.0) RETURN C C add the rate for the observed mutation to the denominator C X = D(MC) + M(B1,B2) + DELTA C WRITE(*,*)'B1,B2,MC,ADD,D,X',B1,B2,MC,ADD,D(MC),X IF (MC.EQ.1) THEN C T>T IF(0.EQ.0) RETURN C WRITE(*,*)'D(1),M(B1,B2)',D(1),M(B1,B2) C C add in the observed mutation to the appropriate mutation rate C which is equivalent to adding (1 - the corrections) C E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X C C now add in the corrections for the barred bases C E(B1,C) = E(B1,C) + ADD*M(B1,C)/X E(B1,A) = E(B1,A) + ADD*M(B1,A)/X E(B1,G) = E(B1,G) + ADD*M(B1,G)/X ELSE IF (MC.EQ.2) THEN E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X E(B1,A) = E(B1,A) + ADD*M(B1,A)/X E(B1,G) = E(B1,G) + ADD*M(B1,G)/X ELSE IF (MC.EQ.3) THEN C WRITE(*,*)'D(3),M(B1,B2)',D(3),M(B1,B2) E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X E(B1,G) = E(B1,G) + ADD*M(B1,G)/X ELSE IF (MC.EQ.4) THEN C T>TCAG C WRITE(*,*)'D(),M(B1,B2)',D(4),M(B1,B2) E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X ELSE IF (MC.EQ.5) THEN C C>C IF(0.EQ.0) RETURN E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X E(B1,T) = E(B1,T) + ADD*M(B1,T)/X E(B1,A) = E(B1,A) + ADD*M(B1,A)/X E(B1,G) = E(B1,G) + ADD*M(B1,G)/X ELSE IF (MC.EQ.6) THEN C C>CT E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X E(B1,A) = E(B1,A) + ADD*M(B1,A)/X E(B1,G) = E(B1,G) + ADD*M(B1,G)/X ELSE IF (MC.EQ.7) THEN C C>TCAG E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X ELSE IF (MC.EQ.8) THEN C A>A IF(0.EQ.0) RETURN C WRITE(*,*)'D(8),M(B1,B2)',D(8),M(B1,B2) E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X E(B1,T) = E(B1,T) + ADD*M(B1,T)/X E(B1,C) = E(B1,C) + ADD*M(B1,C)/X E(B1,G) = E(B1,G) + ADD*M(B1,G)/X ELSE IF (MC.EQ.9) THEN C A>AG E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X E(B1,T) = E(B1,T) + ADD*M(B1,T)/X E(B1,C) = E(B1,C) + ADD*M(B1,C)/X ELSE IF (MC.EQ.10) THEN C A>TCA E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X E(B1,G) = E(B1,G) + ADD*M(B1,G)/X ELSE IF (MC.EQ.11) THEN C A>TCAG E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X ELSE IF (MC.EQ.12) THEN C G>G IF(0.EQ.0) RETURN C WRITE(*,*)'D(12),M(B1,B2)',D(12),M(B1,B2) E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X E(B1,T) = E(B1,T) + ADD*M(B1,T)/X E(B1,C) = E(B1,C) + ADD*M(B1,C)/X E(B1,A) = E(B1,A) + ADD*M(B1,A)/X ELSE IF (MC.EQ.13) THEN C G>AG E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X E(B1,T) = E(B1,T) + ADD*M(B1,T)/X E(B1,C) = E(B1,C) + ADD*M(B1,C)/X ELSE IF (MC.EQ.14) THEN C G>TCAG E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X ELSE IF (MC.EQ.15) THEN C C>CA E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X E(B1,T) = E(B1,T) + ADD*M(B1,T)/X E(B1,G) = E(B1,G) + ADD*M(B1,G)/X ELSE IF (MC.EQ.16) THEN C C>TCA E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X E(B1,G) = E(B1,G) + ADD*M(B1,G)/X ELSE IF (MC.EQ.17) THEN C A>CA E(B1,B2) = E(B1,B2) + ADD*M(B1,B2)/X E(B1,T) = E(B1,T) + ADD*M(B1,T)/X E(B1,G) = E(B1,G) + ADD*M(B1,G)/X ELSE WRITE(*,*)'SCREAM UPDM',MC END IF END SUBROUTINE UPDE(M,E,MC,SUMS,PAA) REAL M(4,4),D(17),E(4,4),T(4),PREV(4,4),DELTA INTEGER SUMS(4,4,4,4,4,4),MC(4,4,4,3),CYCLE,ND(17) CHARACTER PAA(5,5,5) PARAMETER (SMALL = 1E-10) SAVE DELTA DATA DELTA/0.01/ DO 1 I=1,4 DO 1 J=1,4 PREV(I,J) = M(I,J) 1 CONTINUE DO 3 I=1,17 ND(I) = 0 3 CONTINUE IR = 0 5 CONTINUE IR = IR + 1 CALL MAKED(M,D) DO 10 I=1,4 DO 10 J=1,4 E(I,J) = 0. 10 CONTINUE DO 20 I=1,4 DO 20 J=1,4 DO 20 K=1,4 DO 15 II=1,4 DO 15 JJ=1,4 DO 15 KK=1,4 IF(PAA(K,J,I).EQ.PAA(KK,JJ,II)) THEN IF((I.NE.II).OR.(J.NE.JJ).OR.(K.NE.KK)) THEN CALL UPDM(M,D,E,MC(K,J,I,1),I,II,SUMS(I,J,K,II,JJ,KK),ND) CALL UPDM(M,D,E,MC(K,J,I,2),J,JJ,SUMS(I,J,K,II,JJ,KK),ND) CALL UPDM(M,D,E,MC(K,J,I,3),K,KK,SUMS(I,J,K,II,JJ,KK),ND) END IF END IF 15 CONTINUE 20 CONTINUE C WRITE(*,*)'NEW E ' C DO 55 I=1,4 C WRITE(*,*)(E(I,J),J=1,4) C 55 CONTINUE CALL FILLR(T,4,SMALL) DO 30 I=1,4 DO 30 J=1,4 T(I) = T(I) + E(I,J) 30 CONTINUE C WRITE(*,*)'ROW TOTS',T DO 40 I=1,4 DO 40 J=1,4 M(I,J) = E(I,J)/T(I) 40 CONTINUE C WRITE(*,*)' NEW M' C DO 50 I=1,4 C WRITE(*,1000)(M(I,J),J=1,4) C WRITE(*,1000)(PREV(I,J),J=1,4) C 50 CONTINUE C 1000 FORMAT(4F8.5) CYCLE = 0 DO 60 I=1,4 DO 60 J=1,4 IF (ABS(M(I,J)-PREV(I,J)).GT.DELTA) CYCLE = 1 C PREV(I,J) = M(I,J) 60 CONTINUE C WRITE(*,*)IR DO 70 I=1,4 DO 70 J=1,4 PREV(I,J) = M(I,J) 70 CONTINUE IF(CYCLE.EQ.1) GO TO 5 WRITE(*,*)'Number of iterations',IR C WRITE(*,*)(K,ND(K),K=1,17) END SUBROUTINE UPDET(SUMS,PAA,MC) INTEGER SUMS(4,4,4,4,4,4),MC(4,4,4,3) CHARACTER PAA(5,5,5),BASES(4) SAVE BASES DATA BASES/'T','C','A','G'/ DO 20 I=1,4 DO 20 J=1,4 DO 20 K=1,4 DO 15 II=1,4 DO 15 JJ=1,4 DO 15 KK=1,4 IF(PAA(K,J,I).EQ.PAA(KK,JJ,II)) THEN C IF(PAA(I,J,K).EQ.PAA(II,JJ,KK)) THEN C WRITE(*,*)I,J,K,' to',II,JJ,KK,SUMS(I,J,K,II,JJ,KK) WRITE(*,*)BASES(I),BASES(J),BASES(K), +BASES(II),BASES(JJ),BASES(KK),MC(K,J,I,1),MC(K,J,I,2), +MC(K,J,I,3),SUMS(I,J,K,II,JJ,KK) END IF 15 CONTINUE 20 CONTINUE END SUBROUTINE COCHN4(SEQ1,IDIM1,I1,N1,SEQ2,IDIM2,I2,N2,CHANGE) CHARACTER SEQ1(IDIM1),SEQ2(IDIM2) INTEGER CHANGE(4,4,4,4,4,4),CTONUM,K1(3),K2(3) EXTERNAL CTONUM IDIM3=N1-I1+1 IDIM4=N2-I2+1 C GET MINIMUM LENGTH TO SCAN MINL=MIN(IDIM3,IDIM4) J1=I1 - 3 J2 = I2 - 3 DO 10 I=1,MINL-2,3 J1 = J1 + 3 J2 = J2 + 3 DO 5 JJ=1,3 KK = CTONUM(SEQ1(J1+JJ-1)) IF(KK.EQ.5) GO TO 10 K1(JJ) = KK KK = CTONUM(SEQ2(J2+JJ-1)) IF(KK.EQ.5) GO TO 10 K2(JJ) = KK 5 CONTINUE C WRITE(*,*)I,K1,K2 CHANGE(K1(1),K1(2),K1(3),K2(1),K2(2),K2(3)) = + CHANGE(K1(1),K1(2),K1(3),K2(1),K2(2),K2(3)) + 1 10 CONTINUE END SUBROUTINE EMT(MTT) INTEGER MTT(64,3) CHARACTER MTTC(64)*3 SAVE MTTC DATA MTTC/ +'112','116','219','21D', +'154','157','15B','15E', +'182','186','199','19D', +'1C2','1C6','1D8','1CC', +'514','517','61B','61E', +'554','557','55B','55E', +'582','586','589','58D', +'5C4','5C7','FCB','FCE', +'813','81G','81A','81C', +'854','857','85B','85E', +'882','886','889','88D', +'8C2','8C6','HC9','HCD', +'C14','C17','C1B','C1E', +'C54','C57','C5B','C5E', +'C82','C86','C89','C8D', +'CC4','CC7','CCB','CCE'/ CALL CTI(MTTC,MTT) C CALL WRTCOI(SUM,6,PAA,MTTC) C CALL EM(PAA,KBOUT) END SUBROUTINE CTI(MTTC,MTT) CHARACTER MTTC(64)*3 INTEGER MTT(64,3) CHARACTER C*17 DATA C/'123456789ABCDEFGH'/ DO 10 J=1,64 DO 8 M=1,3 DO 5 K=1,17 IF(MTTC(J)(M:M).EQ.C(K:K)) THEN MTT(J,M) = K GO TO 8 END IF 5 CONTINUE 8 CONTINUE 10 CONTINUE END SUBROUTINE WRTCOI(SUM,IDEV,PAA,MTT) C AUTHOR: RODGER STADEN INTEGER SUM(4,4,4) CHARACTER BASE(4),PAA(5,5,5),MTT(4,4,4)*3 SAVE BASE DATA BASE/'T','C','A','G'/ C WRITE(IDEV,1001) 1001 FORMAT(6X,'===========================================') DO 10 I=1,4 DO 20 K=1,4 WRITE(IDEV,1000)(PAA(K,J,I), +BASE(I),BASE(J),BASE(K),SUM(I,J,K),J=1,4) WRITE(IDEV,1002)(MTT(K,J,I),J=1,4) 1002 FORMAT(5X,4(1X,1X,A,5X)) 20 CONTINUE 10 WRITE(IDEV,1001) 1000 FORMAT(5X,4(1X,A1,1X,3A1,I5)) END