R/col.panel.R

color.from.01.value = function (value, gene.or.cpd,global.parameters.list) {
    if(gene.or.cpd == "gene"){
        min.value = global.parameters.list$min.gene.value
        max.value = global.parameters.list$max.gene.value
        mid.value = global.parameters.list$mid.gene.value
        high = global.parameters.list$col.gene.high
        mid = global.parameters.list$col.gene.mid
        low = global.parameters.list$col.gene.low
    }else if(gene.or.cpd == "compond"){
        min.value = global.parameters.list$min.cpd.value
        max.value = global.parameters.list$max.cpd.value
        mid.value = global.parameters.list$mid.cpd.value
        high = global.parameters.list$col.cpd.high
        mid = global.parameters.list$col.cpd.mid
        low = global.parameters.list$col.cpd.low
    }
    
    
    
    if(is.na(value) | identical(value,"no.user.data")){
        return("white")
    }
    if (is.na(mid)) {
        low <- col2rgb(low)
        high <- col2rgb(high)
        red <- (low[1, 1] + (high[1, 1] - low[1, 1]) * (value-min.value)/(max.value-min.value))/255
        blue <- (low[2, 1] + (high[2, 1] - low[2, 1]) * (value-min.value)/(max.value-min.value))/255
        green <- (low[3, 1] + (high[3, 1] - low[3, 1]) * (value-min.value)/(max.value-min.value))/255
    } else {
        isodd <- value%%2 == 1
        low <- col2rgb(low)
        row.names(low) = c("red","blue","green")
        mid <- col2rgb(mid)
        row.names(mid) = c("red","blue","green")
        high <- col2rgb(high)
        row.names(high) = c("red","blue","green")
        # lower <- floor(value/2)
        # upper <- value - lower
        if(value<mid.value){
            red <- (low[1, 1] + (mid[1, 1] - low[1, 1]) * (max(min.value,value)-min.value)/(mid.value-min.value))/255    # if the value is out of color key range, use the color as min/max value
            blue <- (low[2, 1] + (mid[2, 1] - low[2, 1]) * (max(min.value,value)-min.value)/(mid.value-min.value))/255
            green <- (low[3, 1] + (mid[3, 1] - low[3, 1]) * (max(min.value,value)-min.value)/(mid.value-min.value))/255
        }else{
            red <- (mid[1, 1] + (high[1, 1] - mid[1, 1]) * (min(max.value,value)-mid.value)/(max.value-mid.value))/255
            blue <- (mid[2, 1] + (high[2, 1] - mid[2, 1]) * (min(max.value,value)-mid.value)/(max.value-mid.value))/255
            green <- (mid[3, 1] + (high[3, 1] - mid[3, 1]) * (min(max.value,value)-mid.value)/(max.value-mid.value))/255
        }
    }
    return(rgb(red, blue, green))
}


# color.panel(100,100,10)
color.panel = function(x,y,gene.or.cpd,col.panel.w,global.parameters.list,if.insert.sbgn.link = TRUE){
    if(gene.or.cpd == "gene"){
        min.value = global.parameters.list$min.gene.value
        max.value = global.parameters.list$max.gene.value
        mid.value = global.parameters.list$mid.gene.value
    }else if(gene.or.cpd == "compond"){
        min.value = global.parameters.list$min.cpd.value
        max.value = global.parameters.list$max.cpd.value
        mid.value = global.parameters.list$mid.cpd.value
    }
    n.grid = global.parameters.list$color.panel.n.grid
    if(n.grid %% 2 ==1){
        n.grid = n.grid-1
    }
    col.values = seq(max.value,min.value,by=(min.value-max.value)/n.grid)
    panel.grid.w = col.panel.w/n.grid
    
    
    col.panel.h = col.panel.w/7
    y.loc.text = y+ (2+1/3) * col.panel.h
    y.loc.link.to.SBGN.notation = y.loc.text + col.panel.h * 1.2
    font.size.color.panel = col.panel.h
    alignment.baseline = "baseline"
    
    
    svg=""
    for(i in seq_len(length.out = length(col.values))){
        col = color.from.01.value(col.values[i],global.parameters.list=global.parameters.list,gene.or.cpd= gene.or.cpd)
        x.loc.text = x - (i-0.5)*panel.grid.w
        svg.rect = plot.rectangle(x=x-i*panel.grid.w,y=y,h=col.panel.h ,w=panel.grid.w+1,id="col.pan",rx=0,ry=0,stroke.width = 0,fill.color = col,stroke.opacity = 0,fill.opacity = 1)
        svg = paste(svg,svg.rect,sep="\n")
    }
    j=0
    
    if(min.value >100) min.value = formatC(min.value,format="e",digits = 0)
    if(mid.value >100) mid.value = formatC(mid.value,format="e",digits = 0)
    if(max.value >100) max.value = formatC(max.value,format="e",digits = 0)
    for (x.loc in seq(x-col.panel.w-panel.grid.w, x,length.out = 11)){
        j=j+1
        LineCoordinates = paste("x1=",x.loc," y1=",y," x2=",x.loc," y2=",y+col.panel.h*5/4,"",sep='"')
        svg.tick = plot.line(LineCoordinates,id="tick",stroke.width = col.panel.w /100)
        svg = paste(svg,svg.tick,sep="\n")
        if(j==11){
            svg.text.high  = sprintf(template.text,x.loc,y.loc.text,"color.panel.max.value",font.size.color.panel,"middle",alignment.baseline,1,alignment.baseline,"black",as.character(max.value))
        }else if(j==6){
            svg.text.mid  = sprintf(template.text,x.loc,y.loc.text,"color.panel.mid.value",font.size.color.panel,"middle",alignment.baseline,1,alignment.baseline,"black",as.character(mid.value))
            if(if.insert.sbgn.link){
                svg.text.link.to.SBGN.panel  = sprintf(template.text,x.loc,y.loc.link.to.SBGN.notation,"Link to SBGN notation",font.size.color.panel ,"middle",alignment.baseline,1,alignment.baseline,"blue","Link to SBGN notation")
                svg.text.link.to.SBGN.panel = paste(link.to.sbgn.start,svg.text.link.to.SBGN.panel,link.to.sbgn.end,sep="\n")
            }else{
                svg.text.link.to.SBGN.panel = ""
            }
        }else if(j == 1){
            svg.text.low  = sprintf(template.text,x.loc,y.loc.text,"color.panel.low.value",font.size.color.panel,"middle",alignment.baseline,1,alignment.baseline,"black",as.character(min.value))
        }
    }
    
    
    svg = paste(svg,svg.text.high,svg.text.low,svg.text.mid,svg.text.link.to.SBGN.panel,sep="\n")
    return(svg)
}


find.col.panel.range = function(
            user.data
           ,max.gene.value 
           ,mid.gene.value 
           ,min.gene.value 
           ,max.cpd.value 
           ,mid.cpd.value 
           ,min.cpd.value 
){
    if(! "max.gene" %in% names(user.data)){
        user.data[["max.gene"]] = 1
        user.data[["min.gene"]] = -1
        if.has.gene.data = FALSE
    }else{
        if.has.gene.data = TRUE
    }
    if(! "max.cpd" %in% names(user.data)){
        user.data[["max.cpd"]] = 1 
        user.data[["min.cpd"]] = -1
        if.has.cpd.data = FALSE
    }else{
        if.has.cpd.data = TRUE
    }
    if(is.null(max.gene.value)) max.gene.value = signif(user.data[["max.gene"]],2) + 0.1
    if(is.null(min.gene.value)) min.gene.value = signif(user.data[["min.gene"]],2) - 0.1
    if(is.null(max.cpd.value)) max.cpd.value = signif(user.data[["max.cpd"]],2) + 0.1
    if(is.null(min.cpd.value)) min.cpd.value = signif(user.data[["min.cpd"]],2) - 0.1
    if(is.null(mid.gene.value)){
        mid.gene.value = signif(median(c(max.gene.value,min.gene.value)),2) + 0.1
    }
    if(is.null(mid.cpd.value)){
        mid.cpd.value = signif(median(c(max.cpd.value,min.cpd.value)),2) + 0.1
    }
    return(list(if.has.gene.data = if.has.gene.data
           ,if.has.cpd.data = if.has.cpd.data
           ,max.gene.value = max.gene.value
           ,mid.gene.value = mid.gene.value
           ,min.gene.value = min.gene.value
           ,max.cpd.value = max.cpd.value
           ,mid.cpd.value = mid.cpd.value
           ,min.cpd.value = min.cpd.value
           ))
}

find.col.panel.position.and.plot = function(
    y.margin
    ,global.parameters.list
    ,if.has.gene.data
    ,if.has.cpd.data
    ,parse.glyph.out.list
    ,max.x ,max.y, min.x,min.y
){
    col.panel.w =  y.margin * 0.8
    if(global.parameters.list$key.pos == "none"){
        print("no color panel will be plotted")
        col.panel.svg = ""
        col.panel.svg.chemical = ""
        col.panel.h = 0
    }else{
        if(all(if.has.gene.data,if.has.cpd.data)){
            col.panel.h = col.panel.w
        }else{
            col.panel.h = col.panel.w/2
        }
        result.list = find.key.pos(parse.glyph.out.list
                                   ,col.panel.w
                                   ,col.panel.h
                                   ,ymargin= y.margin
                                   ,max.y
                                   ,max.x
                                   ,min.x
                                   ,min.y
                                   ,key.pos = global.parameters.list$key.pos
                                   ,space.between.color.panel.and.entity = global.parameters.list$space.between.color.panel.and.entity
                                   # ,space.between.color.panel.and.entity = 0
                                   )
        col.panel.x = result.list$col.panel.x
        col.panel.y = result.list$col.panel.y
        
        # plot color panel
        if(if.has.gene.data & if.has.cpd.data){
            col.panel.svg = color.panel(x=col.panel.x,y=col.panel.y,gene.or.cpd="gene",col.panel.w =col.panel.w,global.parameters.list = global.parameters.list , if.insert.sbgn.link = FALSE)
            col.panel.svg.chemical = color.panel(x=col.panel.x,y=col.panel.y + col.panel.w * 0.45 ,gene.or.cpd="compond",col.panel.w =col.panel.w,global.parameters.list = global.parameters.list)
        }else if(if.has.cpd.data){
            col.panel.svg = ""
            col.panel.svg.chemical = color.panel(x=col.panel.x,y=col.panel.y ,gene.or.cpd="compond",col.panel.w =col.panel.w,global.parameters.list = global.parameters.list)
        }else if(if.has.gene.data){
            col.panel.svg.chemical =""
            col.panel.svg = color.panel(x=col.panel.x,y=col.panel.y,gene.or.cpd="gene",col.panel.w =col.panel.w ,global.parameters.list = global.parameters.list)
        }else {
            col.panel.svg.chemical =""
            col.panel.svg =""
        }
    }
    col.panel.svg = paste(col.panel.svg,col.panel.svg.chemical,sep="\n" )
    return(list(col.panel.svg = col.panel.svg
                ,col.panel.w = col.panel.w
                ,col.panel.y = col.panel.y
                ,col.panel.h = col.panel.h
                ))
}




find.key.pos = function(parse.glyph.out.list
                        ,col.panel.w
                        ,col.panel.h
                        ,ymargin
                        ,max.y
                        ,max.x
                        ,min.x
                        ,min.y
                        ,key.pos
                        ,space.between.color.panel.and.entity
                        ){
    
    dist.to.top = ymargin+min.y
    glyph.coors = parse.glyph.out.list$glyph.coors
    if(key.pos == "none"){
        return("no color key")
    }else if(key.pos == "bottomright"){
        if.nodes.within.col.panel.best.area = glyph.coors[,"xw"]>(max.x-col.panel.w)-space.between.color.panel.and.entity & glyph.coors[,"yh"] > max.y-col.panel.h -space.between.color.panel.and.entity
    } else if(key.pos == "topright"){
        # if.nodes.within.col.panel.best.area = glyph.coors[,"xw"]>(max.x-col.panel.w)-space.between.color.panel.and.entity &
        #                                         glyph.coors[,"y"] < ymargin + col.panel.h + space.between.color.panel.and.entity
        if.nodes.within.col.panel.best.area = glyph.coors[,"xw"]>(max.x-col.panel.w)-space.between.color.panel.and.entity &
                                                glyph.coors[,"y"] < dist.to.top + col.panel.h + space.between.color.panel.and.entity
    } else if(key.pos == "bottomleft"){
        if.nodes.within.col.panel.best.area = glyph.coors[,"x"]<(col.panel.w + min.x)+space.between.color.panel.and.entity & glyph.coors[,"yh"] > max.y-col.panel.h -space.between.color.panel.and.entity
    } else if(key.pos == "topleft"){
        if.nodes.within.col.panel.best.area = glyph.coors[,"x"]<(col.panel.w+ min.x)+space.between.color.panel.and.entity & 
                                                glyph.coors[,"y"] < dist.to.top + col.panel.h + 4
    }
    if(any(if.nodes.within.col.panel.best.area)){
        nodes.within.col.panel.best.area = glyph.coors[if.nodes.within.col.panel.best.area,]
        if(is.vector(nodes.within.col.panel.best.area)){
            nodes.within.col.panel.best.area = as.matrix(t(nodes.within.col.panel.best.area))
        }
        if(key.pos == "bottomright"){
            col.panel.y = max(nodes.within.col.panel.best.area[,"yh"]) + col.panel.h/10
            col.panel.x = max.x
        } else if(key.pos == "topright"){
            col.panel.y = max(0+dist.to.top/10,min(nodes.within.col.panel.best.area[,"y"]) - col.panel.h-col.panel.h/10)
            col.panel.x = max.x
        }else if(key.pos == "bottomleft"){
            col.panel.y = max(nodes.within.col.panel.best.area[,"yh"]) + col.panel.h/10
            col.panel.x = col.panel.w + min.x
        } else if(key.pos == "topleft"){
            col.panel.y = max(0+dist.to.top/10,min(nodes.within.col.panel.best.area[,"y"]) - col.panel.h-col.panel.h/10)
            col.panel.x = col.panel.w + min.x
        }
    }else{ if(key.pos == "bottomright"){
        col.panel.y = max.y-col.panel.h+ col.panel.h/10
        col.panel.x = max.x
    } else if(key.pos == "topright"){
        col.panel.y = dist.to.top
        col.panel.x = max.x
    }else if(key.pos == "bottomleft"){
        col.panel.y = max.y-col.panel.h+ col.panel.h/10
        col.panel.x = col.panel.w + min.x
    } else if(key.pos == "topleft"){
        col.panel.y = dist.to.top
        col.panel.x = col.panel.w + min.x
    }
    }
    return(list(col.panel.x = col.panel.x,col.panel.y = col.panel.y))
}
chemokine/OmicsSBGN documentation built on June 27, 2019, 7:52 p.m.