staden-lg/src/bap/remgel.f

153 lines
5.5 KiB
Fortran

SUBROUTINE REMGEL(RELPG,LNGTHG,LNBR,RNBR,NGELS,NCONTS,IDBSIZ,
+REMME,ICONT,KBOUT,GEL,MAXGEL,IDEVR,IDEVW,IDEVN)
C Routine to remove a reading from a database
C Cases: 1 left end
C 2 right end
C 3 internal and dispensible
C 4 internal and indispensible
C if 1 change contig lnbr, contig length, lnbr of rnbr of remme, relpgs
C if 2 change contig rnbr, contig length, rnbr of lnbr of remme
C if 3 change contig length, lnbr of rnbr of remme rnbr of lnbr of remme
C if 4 need to break contig, then as for 1
C if 1 and 2 then also remove contig line
C for all cases move gel ngels to remme (if remme/=ngels)
C and update line idbsiz
C
INTEGER RELPG(IDBSIZ),LNGTHG(IDBSIZ),LNBR(IDBSIZ),RNBR(IDBSIZ)
INTEGER REMME,CLEN
LOGICAL LEFTE,RIGHTE,DISPEN
CHARACTER GEL(MAXGEL)
EXTERNAL CLEN
LEFTE = .FALSE.
RIGHTE = .FALSE.
DISPEN = .FALSE.
C
C Left end ?
C
IF(LNBR(REMME).EQ.0) LEFTE = .TRUE.
C
C Right end ?
C
IF(RNBR(REMME).EQ.0) RIGHTE = .TRUE.
C
C If both true remove the contig line, then overwrite the gel
C
IF(LEFTE.AND.RIGHTE) THEN
WRITE(KBOUT,*)'Removing reading and contig'
IFROM = NGELS
NGELS = NGELS - 1
CALL REMCNL(RELPG,LNGTHG,LNBR,RNBR,NGELS,NCONTS,IDBSIZ,
+ ICONT,IDEVR)
IF(REMME.NE.IFROM) THEN
WRITE(KBOUT,*)'Renumbering reading',IFROM,' to',REMME
CALL MOVGEL(RELPG,LNGTHG,LNBR,RNBR,NGELS,
+ NCONTS,IDBSIZ,GEL,IFROM,REMME,IDEVR,IDEVW,IDEVN,MAXGEL,KBOUT)
END IF
ELSE IF(LEFTE) THEN
WRITE(KBOUT,*)'Removing reading from left end of contig'
LNBR(ICONT) = RNBR(REMME)
I = 1 - RELPG(RNBR(REMME))
WRITE(KBOUT,*)'Shifting readings in contig by distance=',I
CALL SHIFTC(RELPG,LNGTHG,LNBR,RNBR,NGELS,NCONTS,IDEVR,
+ IDBSIZ,RNBR(REMME),ICONT,I)
I = LNBR(ICONT)
LNBR(I) = 0
CALL WRITER(IDEVR,I,RELPG(I),LNGTHG(I),
+ LNBR(I),RNBR(I))
IFROM = NGELS
IF(REMME.NE.IFROM) THEN
WRITE(KBOUT,*)'Renumbering reading',IFROM,' to',REMME
CALL MOVGEL(RELPG,LNGTHG,LNBR,RNBR,NGELS,
+ NCONTS,IDBSIZ,GEL,IFROM,REMME,IDEVR,IDEVW,IDEVN,MAXGEL,KBOUT)
END IF
NGELS = NGELS - 1
CALL WRITER(IDEVR,IDBSIZ,NGELS,NCONTS,NGELS,NCONTS)
ELSE IF(RIGHTE) THEN
WRITE(KBOUT,*)'Removing reading from right end of contig'
RNBR(ICONT) = LNBR(REMME)
I = RNBR(ICONT)
RNBR(I) = 0
CALL WRITER(IDEVR,I,RELPG(I),LNGTHG(I),
+ LNBR(I),RNBR(I))
RELPG(ICONT) = CLEN(RELPG,LNGTHG,LNBR,RNBR,NGELS,NCONTS,
+ IDBSIZ,LNBR(ICONT))
CALL WRITER(IDEVR,ICONT,RELPG(ICONT),LNGTHG(ICONT),
+ LNBR(ICONT),RNBR(ICONT))
IFROM = NGELS
IF(REMME.NE.IFROM) THEN
WRITE(KBOUT,*)'Renumbering reading',IFROM,' to',REMME
CALL MOVGEL(RELPG,LNGTHG,LNBR,RNBR,NGELS,
+ NCONTS,IDBSIZ,GEL,IFROM,REMME,IDEVR,IDEVW,IDEVN,MAXGEL,KBOUT)
END IF
NGELS = NGELS - 1
CALL WRITER(IDEVR,IDBSIZ,NGELS,NCONTS,NGELS,NCONTS)
ELSE
C Is remme indispensible ?
NSTART = RELPG(RNBR(REMME))
I = REMME
10 CONTINUE
I = LNBR(I)
IF(I.NE.0) THEN
IF((RELPG(I)+ABS(LNGTHG(I))-1).LT.NSTART) GO TO 10
DISPEN = .TRUE.
END IF
IF(DISPEN) THEN
WRITE(KBOUT,*)
+ 'Removing dispensible reading from middle of contig'
I = LNBR(REMME)
RNBR(I) = RNBR(REMME)
CALL WRITER(IDEVR,I,RELPG(I),LNGTHG(I),
+ LNBR(I),RNBR(I))
I = RNBR(REMME)
LNBR(I) = LNBR(REMME)
CALL WRITER(IDEVR,I,RELPG(I),LNGTHG(I),
+ LNBR(I),RNBR(I))
IFROM = NGELS
IF(REMME.NE.IFROM) THEN
WRITE(KBOUT,*)'Renumbering reading',IFROM,' to',REMME
CALL MOVGEL(RELPG,LNGTHG,LNBR,RNBR,NGELS,
+ NCONTS,IDBSIZ,GEL,IFROM,REMME,IDEVR,IDEVW,IDEVN,
+ MAXGEL,KBOUT)
END IF
NGELS = NGELS - 1
RELPG(ICONT) = CLEN(RELPG,LNGTHG,LNBR,RNBR,NGELS,NCONTS,
+ IDBSIZ,LNBR(ICONT))
CALL WRITER(IDEVR,ICONT,RELPG(ICONT),LNGTHG(ICONT),
+ LNBR(ICONT),RNBR(ICONT))
CALL WRITER(IDEVR,IDBSIZ,NGELS,NCONTS,NGELS,NCONTS)
ELSE
WRITE(KBOUT,*)
+ 'Removing indispensible reading from middle of contig'
WRITE(KBOUT,*)'So breaking contig first'
IR = REMME
IL = LNBR(REMME)
ILO = LNBR(ICONT)
NCONTO = ICONT
NCONTR = IDBSIZ - NCONTS - 1
CALL CBREAK(RELPG,LNGTHG,LNBR,RNBR,NGELS,NCONTS,IDBSIZ,
+ KBOUT,IDEVR,IDEVW,IDEVN,IR,IL,ILO,NCONTO,NCONTR,IOK)
IF(IOK.NE.0) RETURN
WRITE(KBOUT,*)'Removing reading from left end of contig'
ICONT = IDBSIZ - NCONTS
LNBR(ICONT) = RNBR(REMME)
I = 1 - RELPG(RNBR(REMME))
WRITE(KBOUT,*)'Shifting readings in contig by distance=',I
CALL SHIFTC(RELPG,LNGTHG,LNBR,RNBR,NGELS,NCONTS,IDEVR,
+ IDBSIZ,RNBR(REMME),ICONT,I)
I = LNBR(ICONT)
LNBR(I) = 0
CALL WRITER(IDEVR,I,RELPG(I),LNGTHG(I),
+ LNBR(I),RNBR(I))
IFROM = NGELS
IF(REMME.NE.IFROM) THEN
WRITE(KBOUT,*)'Renumbering reading',IFROM,' to',REMME
CALL MOVGEL(RELPG,LNGTHG,LNBR,RNBR,NGELS,
+ NCONTS,IDBSIZ,GEL,IFROM,REMME,IDEVR,IDEVW,IDEVN,
+ MAXGEL,KBOUT)
END IF
NGELS = NGELS - 1
CALL WRITER(IDEVR,IDBSIZ,NGELS,NCONTS,NGELS,NCONTS)
END IF
END IF
END