staden-lg/src/staden/nipf.f

2111 lines
59 KiB
Fortran

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