Good afternoon,
I am working with the connectivity data. In the viewer, there is a square at what appears to be the terminal end of each branch of the projection (See below). I am interested in obtaining a list of coordinates for each of these squares for a particular projection. Can you provide some direction as to how I should go about this?
Hi April,
Which viewer are you using? Can you provide a link?
Tyler
Hi Tyler, I had been using the 3d Viewer :: Allen Brain Atlas: Mouse Connectivity browser.
I ended up writing a script to access the terminal endpoints from each neuron. It’s definitely not pretty, and I’m sure there are much better/simpler ways to do it, but in case anybody else encounters the same need, I have posted it below:
library(dplyr)
library(rgl)
library(rjson)
‘%notin%’ = Negate(‘%in%’)
streamline ← fromJSON(file = “streamlines_100141219.json”)
lines ← streamline$lines
curr_mesh ← mesh3d(x = NULL, y = NULL) #starting over with a fresh object
for (i in 1:length(lines)) {
curr_df ← as.data.frame(do.call(rbind, lines[[i]]))
curr_df$x = as.numeric(curr_df$x)
curr_df$y = as.numeric(curr_df$y)
curr_df$z = as.numeric(curr_df$z)
segments ← rbind(1:(nrow(curr_df) - 1), 2:nrow(curr_df))
curr_mesh ← merge(curr_mesh, mesh3d(x = curr_df$x, y = curr_df$y, z = curr_df$z, segments = segments))
}
indices = curr_mesh$is %>% data.frame()
listIndices = unlist(as.list(indices))
duplicatedIndices = listIndices[duplicated(listIndices)]
uniqueIndices = subset(listIndices, listIndices %notin% duplicatedIndices)
#for each of the unique Indices, find the start, stop, and distance
indicesBegin = uniqueIndices[c(TRUE, FALSE)]
indicesEnd = uniqueIndices[c(FALSE, TRUE)]
#You need to add the very last end to the indices begin so that we can calculate how long this segment is
indicesBegin = c(indicesBegin,indicesEnd[length(indicesEnd)] + 1)
#Now, to capture each end, we select the coordinates for each segment, and then select the last one
for(x in 1:(length(indicesBegin)-1)){
segmentCoords = curr_mesh$vb[1:3,indicesBegin:(indicesBegin[x+1]-1)]
startCoord = t(segmentCoords[,ncol(segmentCoords)]) %>% data.frame()
endCoord = t(segmentCoords[,1]) %>% data.frame()
colnames(endCoord) = c(“End_X”, “End_Y”, “End_Z”)
colnames(startCoord) = c(“Start_X”, “Start_Y”, “Start_Z”)
bothCoord = cbind(endCoord, startCoord)
bothCoord$Segment = x
bothCoord$IndexStart = indicesBegin
bothCoord$IndexEnd = indicesBegin[x+1]-1
if(x == 1){
allCoords = bothCoord
} else{
allCoords = rbind(allCoords, bothCoord)
}
}
plot3d(curr_mesh, add = TRUE, col = “black”)
plot3d(allCoords$Start_X, allCoords$Start_Y, allCoords$Start_Z, add = TRUE, col = “red”, alpha = 4)
plot3d(allCoords$End_X, allCoords$End_Y, allCoords$End_Z, col = “blue”, alpha = 4, add = TRUE)