README.md

SlicerMorphR

Convenience functions for importing SlicerMorph dataset into R.

install via devtools

devtools::install_github('SlicerMorph/SlicerMorphR')

Usage

> library(SlicerMorphR)
# point out to the analysis.json file created by the SlicerMorph's GPA function. 
# you can also have it point out to older analysis.log file by setting the json=FALSE

> SM.output=parser2(file.choose(), json=TRUE)
#An example of using read.markups.fcsv() with the forceLPS parameter
#forceLPS = FALSE
> file = "https://raw.githubusercontent.com/SlicerMorph/SampleData/master/Gorilla_template_LM1.fcsv"
> lms = read.markups.fcsv(file = file, forceLPS = FALSE) #default setting for forceLPS
#Return a 41x3 matrix that stores raw landmark coordinates from the fcsv files; rownames = labels in the FCSV file; colnames = "x", "y", "z"
> lms[1:3, ]
                             X       Y         Z
Gorilla_template_LM1-1 111.987 312.757 -148.0780
Gorilla_template_LM1-2 114.785 381.650 -128.2390
Gorilla_template_LM1-3 109.137 294.534  -97.4347

#forceLPS = TRUE
> file = "https://raw.githubusercontent.com/SlicerMorph/SampleData/master/Gorilla_template_LM1.fcsv"
> lms = read.markups.fcsv(file = file, forceLPS = TRUE)
#Because forceLPS = TRUE, the function will read the "coordinateSystem" in the 2nd line of the fcsv to see if it is "LPS"
> x <- readLines(file, n = 2)
> x[[2]]
[1] "# CoordinateSystem = 0"
#The coordinateSystem is not "LPS", so the signs of x, y coordinates are reversed to be consistent with the LPS coordinate system.
> lms[1:3, ]
                           [,1]     [,2]      [,3]
Gorilla_template_LM1-1 -111.987 -312.757 -148.0780
Gorilla_template_LM1-2 -114.785 -381.650 -128.2390
Gorilla_template_LM1-3 -109.137 -294.534  -97.4347

How to run a geomorph analysis with SlicerMorph data and get the results back into SlicerMorph for visualization

Since there is no sliding implemented in SlicerMorph, one may want to use R/geomorph to slide the semi-landmarks, and then visualize the results in SlicerMorph. This code snippet shows that use case and can be generalized for other use cases.

Provided code will download a zip file which contains 4 gorilla skull landmarks with 41 fixed landmarks and 880 surface patch landmarks (also generated by SlicerMorph). While the code downloads the zip file, you have to manually unzip the file into that folder to proceed with the second part. Please modify the output.path variable to a valid folder in your computer.

library(SlicerMorphR)
library(geomorph)
output.path="/Users/amaga/Desktop/geomorph_example/"
if (!dir.exists(output.path)) dir.create(output.path)

download.file(url="https://raw.githubusercontent.com/SlicerMorph/SampleData/master/Gorilla%20patch%20semi-landmarks.zip", 
              destfile = paste0(output.path, "Gorilla patch semi-landmarks.zip"))

#unzip the contents of the zip file into this folder. 

setwd(paste0(output.path, "Gorilla patch semi-landmarks/merged" ))

files=dir(patt='json')

fixed.LMs = 1:41
semi.LMs = 42:921
samples = gsub(".mrk.json", '', fixed=T, files)

LMs = array(dim=c(921, 3, 4))

for (i in 1:4) LMs[,,i] = read.markups.json(files[i])
dimnames(LMs) = list(paste0("LM_",1:921), c("x", "y", "z"), samples)

gpa = gpagen(A=LMs, surfaces = semi.LMs, ProcD = TRUE)
pca = gm.prcomp(gpa$coords)
geomorph2slicermorph2(gpa=gpa, pca=pca, paste0(output.path, "sliding'))

then go to the Load Previous Analysis section of the SlicerMorph's GPA module, click the ... button next to the Results Directory section and navigate to the Sliding subfolder. Hit the Load GPA + PCA Analysis from file button to load the results into SlicerMorph. Note that due to the number of landmarks, interactive visualization will be slow.



SlicerMorph/SlicerMorphR documentation built on April 14, 2025, 12:43 p.m.