staden-lg/src/bap/movgel.f

96 lines
2.9 KiB
Fortran

SUBROUTINE MOVGEL(RELPG,LNGTHG,LNBR,RNBR,NGELS,NCONTS,IDBSIZ,
+GEL,FROM,TO,IDEVR,IDEVW,IDEVN,MAXGEL,KBOUT)
C Subroutine to move a gel from line from to line to
C Extended 22-5-91
C AUTHOR: RODGER STADEN
INTEGER RELPG(IDBSIZ),FROM,TO
INTEGER LNGTHG(IDBSIZ),LNBR(IDBSIZ),RNBR(IDBSIZ)
CHARACTER NAMGEL*16,GEL(MAXGEL)
INTEGER GCLIN,CHAINL
LOGICAL LEFTE,RIGHTE
EXTERNAL GCLIN,CHAINL
LEFTE = .FALSE.
RIGHTE = .FALSE.
C
C left end ?
C
IF(LNBR(FROM).EQ.0) LEFTE = .TRUE.
C
C right end ?
C
IF(RNBR(FROM).EQ.0) RIGHTE = .TRUE.
C
C if both true remove the contig line, then overwrite the gel
C
IF(LEFTE.AND.RIGHTE) THEN
NCONTO = GCLIN(RELPG,LNGTHG,LNBR,RNBR,NGELS,NCONTS,
+ IDBSIZ,FROM)
IF(NCONTO.EQ.0)THEN
WRITE(KBOUT,*)
+ 'This gel has no left neighbour but does not'
WRITE(KBOUT,*)'appear in a contig line!'
ELSE
LNBR(NCONTO) = TO
RNBR(NCONTO) = TO
CALL WRITER(IDEVR,NCONTO,RELPG(NCONTO),LNGTHG(NCONTO),
+ LNBR(NCONTO),RNBR(NCONTO))
END IF
ELSE IF(LEFTE) THEN
NCONTO = GCLIN(RELPG,LNGTHG,LNBR,RNBR,NGELS,NCONTS,
+ IDBSIZ,FROM)
IF(NCONTO.EQ.0)THEN
WRITE(KBOUT,*)
+ 'This gel has no left neighbour but does not'
WRITE(KBOUT,*)'appear in a contig line!'
ELSE
LNBR(NCONTO) = TO
CALL WRITER(IDEVR,NCONTO,RELPG(NCONTO),LNGTHG(NCONTO),
+ LNBR(NCONTO),RNBR(NCONTO))
END IF
ELSE IF(RIGHTE) THEN
I = CHAINL(RELPG,LNGTHG,LNBR,RNBR,NGELS,NCONTS,
+ IDBSIZ,FROM)
NCONTO = GCLIN(RELPG,LNGTHG,LNBR,RNBR,NGELS,NCONTS,
+ IDBSIZ,I)
IF(NCONTO.EQ.0)THEN
WRITE(KBOUT,*)
+ 'This gel has no right neighbour and does not'
WRITE(KBOUT,*)'appear in a contig!'
ELSE
IF(RNBR(NCONTO).NE.FROM)THEN
WRITE(KBOUT,*)
+ 'This gel has no right neighbour but does not'
WRITE(KBOUT,*)'appear in a contig line!'
ELSE
RNBR(NCONTO) = TO
CALL WRITER(IDEVR,NCONTO,RELPG(NCONTO),LNGTHG(NCONTO),
+ LNBR(NCONTO),RNBR(NCONTO))
END IF
END IF
END IF
RELPG(TO)=RELPG(FROM)
LNGTHG(TO)=LNGTHG(FROM)
LNBR(TO)=LNBR(FROM)
RNBR(TO)=RNBR(FROM)
CALL READW(IDEVW,FROM,GEL,MAXGEL)
CALL WRITEW(IDEVW,TO,GEL,MAXGEL)
CALL READN(IDEVN,FROM,NAMGEL)
CALL WRITEN(IDEVN,TO,NAMGEL)
CALL WRITER(IDEVR,TO,RELPG(TO),LNGTHG(TO),
+LNBR(TO),RNBR(TO))
C Do neighbours
IF(LNBR(FROM).NE.0) THEN
I=LNBR(FROM)
RNBR(I)=TO
CALL WRITER(IDEVR,I,RELPG(I),LNGTHG(I),
+ LNBR(I),RNBR(I))
END IF
IF(RNBR(FROM).NE.0) THEN
I=RNBR(FROM)
LNBR(I)=TO
CALL WRITER(IDEVR,I,RELPG(I),LNGTHG(I),
+ LNBR(I),RNBR(I))
END IF
CALL MOVTAG(FROM,TO)
END