library(grid)

args = commandArgs()
#print(args)
#print(args[5])
#print(args[6])

# args[5] -> input directory
# args[6] -> TF name
# args[7] -> observed score
# args[8] -> output directory



#x <- matrix(0.25,nrow=4,ncol=50)
#x[,1] <- 0.01
#x[,2] <- 0.01
#x[1,1] <- 0.97
#x[2,2] <- 0.97
#pwm <- makePWM(x)
#seqLogo(pwm)


calculateic <- function(pwm, background) {
  if( length(background) != nrow(pwm) ) {
    stop("background length is not equal to pwm row length")
  }
  ic <- 0
  for(i in 1:ncol(pwm)) {
    tx <- 0
    for(j in 1:nrow(pwm)) {
      tx <- tx + pwm[j,i]*log2(pwm[j,i] / background[j])
    }
    ic[i] <- tx
  }
  ic
}

## get information content profile from PWM
pwm2ic<-function(pwm) {
    npos<-ncol(pwm)
    ic<-numeric(length=npos)
    for (i in 1:npos) {
        ic[i]<-2 + sum(sapply(pwm[, i], function(x) { 
            if (x > 0) { x*log2(x) } else { 0 }
        }))
    }    
    ic
}

logoB <- function (pwm, ic.scale = TRUE, xaxis = TRUE, yaxis = TRUE, xfontsize = 15, yfontsize = 15, background=c(0.25,0.25,0.25,0.25), plus_one=0) 
{
#    print(pwm)
    if (class(pwm) == "pwm") {
        pwm <- pwm@pwm
    }
    else if (class(pwm) == "data.frame") {
        pwm <- as.matrix(pwm)
    }
    else if (class(pwm) != "matrix") {
        stop("pwm must be of class matrix or data.frame")
    }
    if (any(abs(1 - apply(pwm, 2, sum)) > 0.01)) 
        stop("Columns of PWM must add up to 1.0")

    chars <- c("A", "C", "G", "U")
    letters <- list(x = NULL, y = NULL, id = NULL, fill = NULL)
    npos <- ncol(pwm)
    if (ic.scale) {
        ylim <- 2.0
        ylab <- "Information content"
        facs <- pwm2ic(pwm)
#        facs <- calculateic(pwm,background)
    }
    else {
        ylim <- 1
        ylab <- "Probability"
        facs <- rep(1, npos)
    }
    wt <- 1
    x.pos <- 0
    for (j in 1:npos) {
        column <- pwm[, j]
        hts <- 0.95 * column * facs[j]
        letterOrder <- order(hts)
        y.pos <- 0
        for (i in 1:4) {
            letter <- chars[letterOrder[i]]
            ht <- hts[letterOrder[i]]
            if (ht > 0) 
                letters <- addLetter(letters, letter, x.pos, 
                  y.pos, ht, wt)
            y.pos <- y.pos + ht + 0.01
        }
        x.pos <- x.pos + wt
    }
    grid.newpage()
    bottomMargin = ifelse(xaxis, 2 + xfontsize/3.5, 2)
    leftMargin = ifelse(yaxis, 2 + yfontsize/3.5, 2)
    pushViewport(plotViewport(c(bottomMargin, leftMargin, 2, 2)))
#    pushViewport(dataViewport(0:ncol(pwm), 0:ylim, name = "vp1"))
    pushViewport(dataViewport(0:ncol(pwm), seq(0,2.0,by=0.5), name = "vp1"))
    grid.polygon(x = unit(letters$x, "native"), y = unit(letters$y,"native"), id = letters$id, gp = gpar(fill = letters$fill,col = "transparent"))
    if (xaxis) {
      labels <- 0
      ats <- 0
      if(plus_one > 0) {
        total_tics <- floor(ncol(pwm) / 10)
        labels[1] <- "+1"
        labels[2] <- ""
        labels[3] <- ""
        ats[1] <- plus_one
        ats[2] <- 1
        ats[3] <- ncol(pwm)
        i <- plus_one + 10
        j <- 4
        while( i < ncol(pwm)-1 ) {
          labels[j] <- paste("+",abs(i - plus_one),sep="")
          ats[j] <- i - 1
          i <- i + 10
          j <- j + 1
        }
        i <- plus_one - 10
        while( i > 1 ) {
          labels[j] <- paste("-",abs(i - plus_one),sep="")
          ats[j] <- i
          j <- j + 1
          i <- i - 10
        }
        ats <- ats - 0.5
      }
      else {
        labels <- 1:ncol(pwm)
        ats <- seq(0.5,ncol(pwm)-0.5)
      }
        grid.xaxis(at = ats, label = labels, gp = gpar(fontsize = xfontsize))
        grid.text("Position", y = unit(-3, "lines"), gp = gpar(fontsize = xfontsize))
    }
    if (yaxis) {
        grid.yaxis(gp = gpar(fontsize = yfontsize))
        grid.text(ylab, x = unit(-3, "lines"), rot = 90, gp = gpar(fontsize = yfontsize))
    }
    popViewport()
    popViewport()
    par(ask = FALSE)
}













     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)
   
   }
 
addLetter <- function(letters,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")
  }
 
  letters$x <- c(letters$x,letter$x)
  letters$y <- c(letters$y,letter$y)
  lastID <- ifelse(is.null(letters$id),0,max(letters$id))
  letters$id <- c(letters$id,lastID+letter$id)
  letters$fill <- c(letters$fill,letter$fill)
  letters
} 

pdf(paste(args[5], "pdf"),width=14,height=7, pagecentre=TRUE)

#grid(17, 17, lty=1)
print(args[6])

# Narrow_Peak
data = read.table(args[5], sep=",", header=FALSE)
x    = as.matrix(data)
#back <- c(0.262,0.242,0.236,0.260)
#back <- c(0.224627689666608,0.275372310333392,0.275372310333392,0.224627689666608)
back = c(0.25,0.25,0.25,0.25)
if(args[6] == "yeast"){
	back = c(0.11694,0.38306,0.38306,0.11694)
}
if(args[6] == "arabidopsis"){
 	back = c(0.14026,0.35974,0.35974,0.14026)
}
if(args[6] == "human"){
 	back = c(0.224627689666608,0.275372310333392,0.275372310333392,0.224627689666608)
}
# else{
#     back = c(0.25,0.25,0.25,0.25)
# }
	
logoB(x,background=back)

dev.off()

