#------------------ Librairies ------------------ library(rjson) #------------------ Ontology handling ------------------ get.id.from.acronym <- function(acronym){ rec.func <- function(acronym, json){ if(is.null(json)) return() if(acronym == json$acronym) return(json$id) return(unlist(lapply(json$children, function(x){return(rec.func(acronym, x))}))) } #Loading json data json_data <- fromJSON(file= paste(path.matrices,'ontology.json',sep='/')) json <- json_data$msg[[1]] return(rec.func(acronym, json)) } #------------------ 3D handling ------------------ mesh3d.allen.annot.from.id <- function(id, max.nrows = 349696, bregma = c(5200, 650, 5700)/1000, no.normals = F){ #5400, 650, 5700 In mm, AP/DV/ML fpath <- sprintf('%s/%d.obj', allen.annot.path, id) vert.start <- 0 vert.end <- 0 norm.start <- 0 norm.end <- 0 face.start <- 0 face.end <- 0 i <- 0 con <- file(fpath, 'r') while(TRUE){ i <- i + 1 line = readLines(con, n = 1) if (length(line) == 0) break if(startsWith(line, 'v ') & vert.start == 0) vert.start <- i if(vert.start != 0 & vert.end == 0 & !startsWith(line, 'v ')) vert.end <- i if(startsWith(line, 'vn') & norm.start == 0) norm.start <- i if(norm.start !=0 & norm.end == 0 & !startsWith(line, 'vn')) norm.end <- i if(startsWith(line, 'f') & face.start == 0) face.start <- i if(face.start !=0 & face.end == 0 & !startsWith(line, 'f')) face.end <- i } if(face.end == 0) face.end <- i - 1 close(con) con <- file(fpath, 'r') line = readLines(con, n = (vert.start - 1)) line = readLines(con, n = vert.end - vert.start) vertices <- strsplit(line, ' ') vertices.ul <- unlist(vertices) df.vertices <- data.frame(x = as.numeric(vertices.ul[seq(from = 2, to = 4*length(vertices), by = 4)]), y = as.numeric(vertices.ul[seq(from = 3, to = 4*length(vertices), by = 4)]), z = as.numeric(vertices.ul[seq(from = 4, to = 4*length(vertices), by = 4)])) close(con) con <- file(fpath, 'r') line = readLines(con, n = (norm.start - 1)) line = readLines(con, n = norm.end - norm.start) norm <- strsplit(line, ' ') norm.ul <- unlist(vertices) df.norm <- data.frame( x = as.numeric(norm.ul[seq(from = 2, to = 4*length(norm), by = 4)]), y = as.numeric(norm.ul[seq(from = 3, to = 4*length(norm), by = 4)]), z = as.numeric(norm.ul[seq(from = 4, to = 4*length(norm), by = 4)])) close(con) con <- file(fpath, 'r') line = readLines(con, n = (face.start - 1)) line = readLines(con, n = face.end - face.start) face <- strsplit(line, ' ') face <- lapply(face, function(x){return(unlist(strsplit(x, '//')))}) face.ul <- unlist(face) df.face <- data.frame( x = as.numeric(face.ul[seq(from = 2, to = 7*length(face), by = 7)]), y = as.numeric(face.ul[seq(from = 4, to = 7*length(face), by = 7)]), z = as.numeric(face.ul[seq(from = 6, to = 7*length(face), by = 7)])) close(con) if(!no.normals){ mesh <- tmesh3d(vertices = rbind(t(df.vertices),1), indices = t(df.face), normals = t(df.norm)[c(3,2,1),]) }else{ mesh <- tmesh3d(vertices = rbind(t(df.vertices),1), indices = t(df.face)) } mesh$vb[1:3,] <- mesh$vb[1:3,] / 1000 mesh$vb[1,] <- -mesh$vb[1,] + bregma[1] mesh$vb[2,] <- -mesh$vb[2,] + 0.05 #Maybe not the +0.05 mesh$vb[3,] <- -mesh$vb[3,] + bregma[3] tmp <- mesh$vb[1,] mesh$vb[1,] <- mesh$vb[3,] mesh$vb[3,] <- tmp return(mesh) } mesh3d.show.outline <- function(col = 'lightgray', alpha = 0.1){ shade3d(mesh3d.allen.annot.from.id(get.id.from.acronym('root')), col = col, alpha = alpha) } mesh3d.new.window <- function(show.outline = TRUE){ rgl.open() rgl.bg(color = 'white') par3d(windowRect = c(0, 0, 1920, 1080)) if(show.outline) mesh3d.show.outline() }