library(ctl) library(stringi); library(rjson) options(stringsAsFactors = FALSE); args = commandArgs(trailingOnly=TRUE) imgDir = Sys.getenv("GENERATED_IMAGE_DIR") if (length(args)==0) { stop("Argument for the data file", call.=FALSE) } else { json_file_path = args[1] } json_file_path # add validation for the files input <- fromJSON(file = json_file_path) cat("The input data is \n") genoData <- input$genoData phenoData <- input$phenoData parametric <- switch( input$parametric, "True" = TRUE, "False" = FALSE ) # create the matixes # genotypes Matrix of genotypes. (individuals x markers) # phenotypes Matrix of phenotypes. (individuals x phenotypes) geno_matrix = t(matrix(unlist(genoData$genotypes), nrow=length(genoData$markernames), ncol=length(genoData$individuals), dimnames=list(genoData$markernames, genoData$individuals), byrow=TRUE)) pheno_matrix = t(matrix(as.numeric(unlist(phenoData$traits)), nrow=length(phenoData$trait_db_list), ncol=length( phenoData$individuals), dimnames= list(phenoData$trait_db_list, phenoData$individuals), byrow=TRUE)) ctls <- CTLscan(geno_matrix,pheno_matrix,nperm=input$nperm,strategy=input$strategy,parametric=parametric,nthreads=3,verbose=TRUE) genImageRandStr <- function(prefix){ randStr <- paste(prefix,stri_rand_strings(1, 9, pattern = "[A-Za-z0-9]"),sep="_") return(paste(randStr,".png",sep="")) } genRandomFileName <- function(prefix,file_ext=".png"){ randStr = paste(prefix,stri_rand_strings(1, 9, pattern = "[A-Za-z0-9]"),sep="_") return(paste(randStr,file_ext,sep="")) } # #output matrix significant CTL interactions with 4 columns: trait, marker, trait, lod ctl_significant <- CTLsignificant(ctls,significance = input$significance) colnames(ctl_significant) = c("trait","marker","trait_2","LOD","dcor") imageLoc = file.path(input$imgDir,genRandomFileName("CTLline")) png(imageLoc,width=1000,height=600,type='cairo-png') # Create the lineplot ctl.lineplot(ctls,significance = input$significance, gap = 50, col = "orange", bg.col = "lightgray", cex = 1, verbose = FALSE) dev.off() n = 2 ctl_plots = c() for (trait in phenoData$trait_db_list) { image_loc = file.path(input$imgDir,genRandomFileName(paste("CTL",n,sep=""))) png(image_loc,width=1000, height=600, type='cairo-png') plot.CTLobject(ctls,n-1,significance= input$significance, main=paste("Phenotype",trait,sep="")) ctl_plots = append(ctl_plots,image_loc) dev.off() n = n + 1 } network_file_name = paste("ctlnet",stri_rand_strings(1, 9, pattern = "[A-Za-z0-9]"),sep="_") netfile = file.path(input$imgDir,paste(network_file_name,".sif",sep="")) nodefile = file.path(input$imgDir,paste(network_file_name,".nodes",sep="")) # fn overrides ctlnetwork function to target gn2 use case CTLnetworkGn<- function(CTLobject, mapinfo, significance = 0.05, LODdrop = 2, what = c("names","ids"), short = FALSE, add.qtls = FALSE,verbose = TRUE){ if(missing(CTLobject) || is.null(CTLobject)) stop("argument 'CTLobject' is missing, with no default") if("CTLscan" %in% class(CTLobject)) CTLobject = list(CTLobject) if(length(what) > 1) what = what[1] results <- NULL significant <- CTLsignificant(CTLobject, significance, what = "ids") if(!is.null(significant)){ all_m <- NULL; all_p <- NULL; cat("",file=netfile); cat("",file=nodefile); if(verbose) cat("NETWORK.SIF\n") edges <- NULL for(x in 1:nrow(significant)){ data <- as.numeric(significant[x,]) CTLscan <- CTLobject[[data[1]]] markern <- rownames(CTLscan$dcor) traitsn <- colnames(CTLscan$dcor) name <- ctl.name(CTLscan) if(what=="ids"){ tid <- which(traitsn %in% ctl.name(CTLobject[[data[1]]])) name <- paste("P",tid,sep="") markern <- paste("M",1:nrow(CTLobject[[data[1]]]$dcor), sep="") traitsn <- paste("P", 1:ncol(CTLobject[[data[1]]]$dcor), sep="") } if(add.qtls){ # Add QTL to the output SIF bfc <- length(CTLscan$qtl) above <- which(CTLscan$qtl > -log10(significance)) qtlnms <- names(above); qtlmid <- 1 for(m in above){ cat(name,"\tQTL\t",markern[m],"\tQTL\t",CTLscan$qtl[m],"\n",sep="",file=netfile,append=TRUE) all_m <- CTLnetwork.addmarker(all_m, mapinfo, markern[data[2]], qtlnms[qtlmid]) qtlmid <- qtlmid+1 } } lod <- CTLscan$ctl[data[2],data[3]] qlod1 <- CTLscan$qtl[data[2]] qlod2 <- qlod1 edgetype <- NA if(length(CTLobject) >= data[3]){ # Edge type based on QTL LOD scores qlod2 <- CTLobject[[data[3]]]$qtl[data[2]] if((qlod1-qlod2) > LODdrop){ edgetype <- 1 }else if((qlod1-qlod2) < -LODdrop){ edgetype <- -1 }else{ edgetype <- 0; } } else { cat("Warning: Phenotype", data[3], "from", data[1], "no CTL/QTL information\n") qlod2 <- NA; } #Store the results results <- rbind(results, c(data[1], data[2], data[3], lod, edgetype, qlod1, qlod2)) if(nodefile == "" && !verbose){ }else{ if(short){ edge <- paste(name,traitsn[data[3]]) edgeI <- paste(traitsn[data[3]],name) if(!edge %in% edges && !edgeI %in% edges){ cat(name, "\t", markern[data[2]],"\t", traitsn[data[3]],"\n",file=netfile, append=TRUE,sep="") edges <- c(edges,edge) } }else{ cat(name, "\t", "CTL_", data[1],"_",data[3], "\t", markern[data[2]],file=netfile, append=TRUE,sep="") cat("\tCTL\t", lod, "\n", file=netfile, append=TRUE,sep="") cat(markern[data[2]], "\t", "CTL_", data[1],"_",data[3], "\t",file=netfile, append=TRUE,sep="") cat(traitsn[data[3]],"\tCTL\t", lod, "\n", file=netfile,append=TRUE,sep="") } } all_m <- CTLnetwork.addmarker(all_m, mapinfo, markern[data[2]], rownames(CTLscan$dcor)[data[2]]) all_p <- unique(c(all_p, name, traitsn[data[3]])) } colnames(results) <- c("TRAIT1","MARKER","TRAIT2","LOD_C","CAUSAL","LOD_T1","LOD_T2") if(verbose) cat("NODE.DESCRIPTION\n") if(nodefile == "" && !verbose){ }else{ for(m in all_m){ cat(m,"\n", sep="", file=nodefile, append=TRUE); } for(p in all_p){ cat(p,"\tPHENOTYPE\n", sep="", file=nodefile, append=TRUE); } } } if(!is.null(results)){ class(results) <- c(class(results),"CTLnetwork") } invisible(results) } CTLnetwork.addmarker <- function(markers, mapinfo, name, realname){ if(!missing(mapinfo)){ id <- which(rownames(mapinfo) %in% realname) fname <- paste(name,"\tMARKER\t",mapinfo[id,1],"\t",mapinfo[id,2],sep="") markers <- unique(c(markers, fname)) } return(markers) } # generating network ctl_network = CTLnetworkGn(ctls, significance = input$significance, LODdrop = 2,short = FALSE, add.qtls = FALSE, verbose = TRUE) json_data <- list(phenotypes = input$phenoData$trait_db_list,significance_data = ctl_significant,image_loc = imageLoc,ctl_plots=ctl_plots,network_file_name = network_file_name) json_data <- toJSON(json_data) write(json_data,file= json_file_path)