"drawSagatStory" <-
function(scores.orig,scores.new,U,cutoff,Names,names,noplot=FALSE,layout=NULL,full=FALSE,label.neigh=FALSE,cent.size=7,neigh.size=3,size.by.score=TRUE,font=5)
  {
# Transform weights into adjacency matrix
    U[abs(U) < cutoff] <- 0
    U <- Matrix(U, sparse=TRUE)
    U@x[] <- 1
    adj.mat <- tcrossprod(U)
    rm(U); gc()
    adj.mat@x[] <- 1
    diag(adj.mat) <- 0
    adj.mat <- drop0(adj.mat)

# Subsetting
    graph.sub <- as.logical(rowSums(adj.mat))
    names <- unique(names)
    Names <- Names[graph.sub]
    if(is.null(names) || !length(names) || !all(names %in% Names))
      stop("Invalid names (includes genes that have no associated knowledge)")

# Build graph
    Sim <- adj.mat[graph.sub,graph.sub]    
    rm(adj.mat); gc()
    centers <- as.numeric(sapply(names,function(x) which(Names == x)))
    neighbors <- unique(unlist(lapply(centers,function(x) which(as.numeric(Sim[x,])==1))))
    neighbors <- neighbors[!(neighbors %in% centers)]
    allnodes <- c(centers,neighbors)
    if(noplot) {
      if(full) return(sum(graph.sub))
      else return(length(allnodes))
    }
    rank.diff <- rank(-1*scores.orig,ties.method="min")[graph.sub] - rank(-1*scores.new,ties.method="min")[graph.sub]

    nodecolors <- rep("Gray",sum(graph.sub))
    nodecolors[allnodes] <- "Orange"
    nodecolors[centers][rank.diff[centers] > 0] <- "Red"
    nodecolors[centers][rank.diff[centers] <= 0] <- "SkyBlue2"
    nodesizes <- rep(3,sum(graph.sub))
    if(size.by.score) {
      m.factor <- abs(cent.size-neigh.size)/diff(range(scores.new,na.rm=TRUE))
      nodesizes[allnodes] <- (scores.new[graph.sub][allnodes]-min(scores.new,na.rm=TRUE))*m.factor + min(c(cent.size,neigh.size))
    }
    else {
      nodesizes[centers] <- cent.size
      nodesizes[neighbors] <- neigh.size
    }
    nodelabels <- rep(NA,sum(graph.sub))
    if(label.neigh) nodelabels[allnodes] <- Names[allnodes]
    else nodelabels[centers] <- Names[centers]
    plot.mat <- matrix(0,nrow=sum(graph.sub),ncol=sum(graph.sub))
    plot.mat[allnodes,allnodes] <- as.matrix(Sim[allnodes,allnodes])
    rm(Sim); gc()
    if(!full) {
      nodecolors <- nodecolors[allnodes]
      nodesizes <- nodesizes[allnodes]
      nodelabels <- nodelabels[allnodes]
      plot.mat <- plot.mat[allnodes,allnodes]
    }

    plot.graph <- graph.adjacency(plot.mat,mode="undirected")
    if(is.null(layout)) layout <- layout.fruchterman.reingold(plot.graph)
    else if(!is.matrix(layout) || !is.numeric(layout) || any(layout < 0) || (nrow(layout) != nrow(plot.mat)) || (ncol(layout) != 2))
      stop("Bad layout")
    require(tcltk,quietly=TRUE)
    label.font <- tkfont.create(family="helvetica",size=font,weight="bold")

# Plot
    tkplot(plot.graph, layout=layout, vertex.size=nodesizes, vertex.color=nodecolors, edge.width=1, vertex.label=nodelabels, vertex.label.font=label.font)
}