diff lib/tarean/logo_methods.R @ 0:1d1b9e1b2e2f draft

Uploaded
author petr-novak
date Thu, 19 Dec 2019 10:24:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/tarean/logo_methods.R	Thu Dec 19 10:24:45 2019 -0500
@@ -0,0 +1,255 @@
+#! /usr/bin/env Rscript
+
+## FUNCTIONS:
+letterA <- function(x.pos,y.pos,ht,wt,id=NULL){
+    
+    x <- c(0,4,6,10,8,6.8,3.2,2,0,3.6,5,6.4,3.6)
+    y <- c(0,10,10,0,0,3,3,0,0,4,7.5,4,4)
+    x <- 0.1*x
+    y <- 0.1*y
+    
+    x <- x.pos + wt*x
+    y <- y.pos + ht*y
+    
+    if (is.null(id)){
+        id <- c(rep(1,9),rep(2,4))
+    }else{
+        id <- c(rep(id,9),rep(id+1,4))
+    }
+    
+    fill <- c("green","white")
+    
+    list(x=x,y=y,id=id,fill=fill)
+}
+
+## T
+letterT <- function(x.pos,y.pos,ht,wt,id=NULL){
+    
+    x <- c(0,10,10,6,6,4,4,0)
+    y <- c(10,10,9,9,0,0,9,9)
+    x <- 0.1*x
+    y <- 0.1*y
+    
+    x <- x.pos + wt*x
+    y <- y.pos + ht*y
+    
+    if (is.null(id)){
+        id <- rep(1,8)
+    }else{
+        id <- rep(id,8)
+    }
+    
+    fill <- "red"
+    
+    list(x=x,y=y,id=id,fill=fill)
+}
+
+## C
+letterC <- function(x.pos,y.pos,ht,wt,id=NULL){
+    angle1 <- seq(0.3+pi/2,pi,length=100)
+    angle2 <- seq(pi,1.5*pi,length=100)
+    x.l1 <- 0.5 + 0.5*sin(angle1)
+    y.l1 <- 0.5 + 0.5*cos(angle1)
+    x.l2 <- 0.5 + 0.5*sin(angle2)
+    y.l2 <- 0.5 + 0.5*cos(angle2)
+    
+    x.l <- c(x.l1,x.l2)
+    y.l <- c(y.l1,y.l2)
+    
+    x <- c(x.l,rev(x.l))
+    y <- c(y.l,1-rev(y.l))
+    
+    x.i1 <- 0.5 +0.35*sin(angle1)
+    y.i1 <- 0.5 +0.35*cos(angle1)
+    x.i1 <- x.i1[y.i1<=max(y.l1)]
+    y.i1 <- y.i1[y.i1<=max(y.l1)]
+    y.i1[1] <- max(y.l1)
+    
+    x.i2 <- 0.5 +0.35*sin(angle2)
+    y.i2 <- 0.5 +0.35*cos(angle2)
+    
+    x.i <- c(x.i1,x.i2)
+    y.i <- c(y.i1,y.i2)
+    
+    x1 <- c(x.i,rev(x.i))
+    y1 <- c(y.i,1-rev(y.i))
+    
+    x <- c(x,rev(x1))
+    y <- c(y,rev(y1))
+    
+    x <- x.pos + wt*x
+    y <- y.pos + ht*y
+    
+    if (is.null(id)){
+        id <- rep(1,length(x))
+    }else{
+        id <- rep(id,length(x))
+    }
+    
+    fill <- "blue"
+    
+    list(x=x,y=y,id=id,fill=fill)
+}
+
+
+## G
+letterG <- function(x.pos,y.pos,ht,wt,id=NULL){
+    angle1 <- seq(0.3+pi/2,pi,length=100)
+    angle2 <- seq(pi,1.5*pi,length=100)
+    x.l1 <- 0.5 + 0.5*sin(angle1)
+    y.l1 <- 0.5 + 0.5*cos(angle1)
+    x.l2 <- 0.5 + 0.5*sin(angle2)
+    y.l2 <- 0.5 + 0.5*cos(angle2)
+    
+    x.l <- c(x.l1,x.l2)
+    y.l <- c(y.l1,y.l2)
+    
+    x <- c(x.l,rev(x.l))
+    y <- c(y.l,1-rev(y.l))
+    
+    x.i1 <- 0.5 +0.35*sin(angle1)
+    y.i1 <- 0.5 +0.35*cos(angle1)
+    x.i1 <- x.i1[y.i1<=max(y.l1)]
+    y.i1 <- y.i1[y.i1<=max(y.l1)]
+    y.i1[1] <- max(y.l1)
+    
+    x.i2 <- 0.5 +0.35*sin(angle2)
+    y.i2 <- 0.5 +0.35*cos(angle2)
+    
+    x.i <- c(x.i1,x.i2)
+    y.i <- c(y.i1,y.i2)
+    
+    x1 <- c(x.i,rev(x.i))
+    y1 <- c(y.i,1-rev(y.i))
+    
+    x <- c(x,rev(x1))
+    y <- c(y,rev(y1))
+    
+    h1 <- max(y.l1)
+    r1 <- max(x.l1)
+    
+    h1 <- 0.4
+    x.add <- c(r1,0.5,0.5,r1-0.2,r1-0.2,r1,r1)
+    y.add <- c(h1,h1,h1-0.1,h1-0.1,0,0,h1)
+    
+    
+    
+    if (is.null(id)){
+        id <- c(rep(1,length(x)),rep(2,length(x.add)))
+    }else{
+        id <- c(rep(id,length(x)),rep(id+1,length(x.add)))
+    }
+    
+    x <- c(rev(x),x.add)
+    y <- c(rev(y),y.add)
+    
+    x <- x.pos + wt*x
+    y <- y.pos + ht*y
+    
+    
+    fill <- c("orange","orange")
+    
+    list(x=x,y=y,id=id,fill=fill)
+    
+}
+
+Letter <- function(which,x.pos,y.pos,ht,wt){
+    
+    if (which == "A"){
+        letter <- letterA(x.pos,y.pos,ht,wt)
+    }else if (which == "C"){
+        letter <- letterC(x.pos,y.pos,ht,wt)    
+    }else if (which == "G"){
+        letter <- letterG(x.pos,y.pos,ht,wt)    
+    }else if (which == "T"){
+        letter <- letterT(x.pos,y.pos,ht,wt)    
+    }else{
+        stop("which must be one of A,C,G,T")
+    }
+    
+    letter
+}
+
+
+
+
+plot_multiline_logo = function(cons.logo,read=NULL, W=50, setpar=TRUE, gaps = NULL){
+    ## logo - base order  - A C G T
+    if (ncol(cons.logo)==5){
+        gaps_prob = cons.logo[,5]
+    }else{
+        gaps_prob = NULL
+    }
+    ps=10 # Point_Size
+    tm=4
+    pwm=as.matrix(cons.logo[,1:4])
+    N=nrow(pwm)
+    Nori=N
+    if (N<W){
+        W=N
+    }
+    s1=seq(1,N,by=W)
+    s2=seq(W,N,by=W)
+    if (length(s2)<length(s1)){
+	pwm=rbind(pwm,matrix(0,nrow=W*length(s1)-N,ncol=4,dimnames=list(NULL,c('A','C','G','T'))))
+        if (!is.null(read)){
+            pwm_read = rbind(read,matrix(0,nrow=W*length(s1)-N,ncol=4,dimnames=list(NULL,c('A','C','G','T'))))
+        }
+	N=nrow(pwm)
+	s2=seq(W,N,by=W)
+    }
+    if (setpar){
+        par(mfrow = c(ceiling(N/W),1), mar=c(1,4,1,0))
+    }
+    for (i in seq_along(s1)){
+        if (!is.null(read)){
+            plot.logo(pwm_read[s1[i]:s2[i],],maxh=2)
+        }
+        plot.logo(pwm[s1[i]:s2[i],],maxh=max(rowSums(cons.logo)))
+        if(!is.null(gaps)){
+            ## transparent rectangles
+            rect((gaps[ ,'start']-s1[i]+1),0, (gaps[,'end']-s1[i]+2), max(pwm), col="#00000005")
+            
+        }
+        if(!is.null(gaps_prob)){
+            rect(seq_along(s1[i]:s2[i]),
+                 max(rowSums(cons.logo)),
+                 seq_along(s1[i]:s2[i])+1,
+                 max(rowSums(cons.logo)) - gaps_prob[s1[i]:s2[i]],
+                 col="#00000030")
+
+            
+        }
+        ticks=intersect(intersect(pretty(pretty(s1[i]:s2[i])+1),s1[i]:s2[i]),1:Nori)
+        axis(1,at=ticks+1.5-s1[i],label=ticks,tick=FALSE)
+        y=pretty(c(0,max(pwm)),n=tm)
+        axis(2,at=y,label=y,las=2,cex.axis=.7)
+    }
+}
+
+plot.logo=function(pwm,maxh=NULL){
+    acgt=c("A","C","G","T")
+    pwm = pwm[,acgt]
+    nbp=dim(pwm)[1]
+    if (is.null(maxh)) {maxh=max(rowSums(pwm))}
+    
+    plot(0,0,xlim=c(0,nbp),ylim=c(0,maxh),type="n",axes=F,xlab="",ylab="")
+    for ( i in 1:nbp){
+        S=order(pwm[i,])
+        hgts=pwm[i,S]
+        nts=acgt[S]
+        ypos=c(0,cumsum(hgts)[1:3])
+        for (j in 1:4){
+            if (hgts[j]==0) next
+            L=Letter(which=nts[j],x.pos=i,y.pos=ypos[j],ht=hgts[j],wt=1)
+            Id=L$id==1
+            polygon(L$x[Id],L$y[Id],lty=0,col=L$fill[1])
+            if (sum(L$id==2)>0) {
+                polygon(L$x[!Id],L$y[!Id],lty=0,col=L$fill[2])
+            }
+        }
+    }
+}
+
+
+