Thanks, Antonio! It's good to know it's a bug. Then it's just about finding a workaround (like those you provided).
Best, David On Tue, Feb 16, 2016 at 10:39 AM, <[email protected]> wrote: > Dear David, > > when you do many operations in Amira or Avizo for a bug the landmarkAscii > file is converted in a 2setlandmarkAscii file, in fact a second empty > matrix will be added… > > I report two functions to convert a landmarkAscii file or a folder > containing the amira/avizo Landmark files in an array k*3*n, where k=number > of landmarks and n=number of specimens. > My functions read only the matrix between the @1 and @2. > > Let me know if it works or not… > > Best, > Antonio > > #' read.amira.set > #' > #' This function convert a file landmark set of Amira in a array > #' @param name.file character: path of landamrkascii file > #' @param nland numeric: number of landmark sampled in Amira, if is set on > "auto" will be automatically recognized the landmark number > #' @return array.set numeric: an array with landmark coordinates (kxdxn) > #' @author Antonio Profico > #' @export > #' > > read.amira.set=function(name.file,nland){ > A <- readLines(name.file, n = 100) > end <- which(A == "@1") > end_2 <- which(A == "@2") > if(length(end_2!=0)){ > print(paste("file named",name.file, "contains a second matrix of 000")) > B_junk=read.table(name.file,skip=end,nrows=(end_2-end-2)) > if(nland!="auto"){ > if (dim(B_junk)[1] != nland){ > print(paste("nland is different from dim(matrix)[1]: > ",paste("nland=",nland,",",sep=""), > paste("dim(matrix)[1]=", dim(B_junk)[1],sep=""))) > B=matrix(NA,ncol=3,nrow=nland)} > if(dim(B_junk)[1]==nland){ > B=B_junk > }} > if(nland=="auto"){ > B=read.table(name.file,skip=end,nrows=(end_2-end-2)) > }} > if(length(end_2)==0){ > B_junk=read.table(name.file,skip=end) > if(nland!="auto"){ > if (dim(B_junk)[1] != nland){ > print(paste("nland is different from dim(matrix)[1]: > ",paste("nland=",nland,",",sep=""), > paste("dim(matrix)[1]=", dim(B_junk)[1],sep=""))) > B=matrix(NA,ncol=3,nrow=nland)} > if(dim(B_junk)[1]==nland){ > B=B_junk > }} > if(nland=="auto"){ > B=B_junk}} > array.set=array(as.matrix(B),dim=c(dim(B)[1],3,1)) > dimnames(array.set)[[3]]=list(name.file) > return(array.set)} > > > > > #' read.amira.dir > #' > #' This function read and store in array the coordinated allocated in a > folder in separate files (format > #' @param path.dir character: path of the folder > #' @param nland numeric: number of landmark sampled in Amira > #' @return array.set numeric: a kxdxn array with landmark coordinates > #' @author Antonio Profico > #' @export > > read.amira.dir=function(path.dir,nland){ > names=list.files(path.dir) > if(nland=="auto"){ > dims=c() > for(i in 1:length(names)){ > dims[i]=dim(read.amira.set(paste(path.dir,"/",names[i],sep=""),"auto"))[1]} > > array.amira=array(NA,dim=c(as.numeric(names(sort(-table(dims)))[1]),3,length(names)))} > else{array.amira=array(NA,dim=c(nland,3,length(names)))} > for(i in 1:length(names)){ > array.amira[,,i]=read.amira.set(paste(path.dir,"/",names[i],sep=""),nland) > } > if(length(names)==1){ > dimnames(array.amira)[[3]]=list(names)} > if(length(names)!=1){ > dimnames(array.amira)[[3]]=names} > return(array.amira) > } > > > ______________________________________ > > Antonio Profico > PhD student > Department of Environmental Biology – Dipartimento di Biologia Ambientale > SAPIENZA Università di Roma > > Lab. 06 4991 2690 > Mob. 3293440766 > > *Da:* David Katz <[email protected]> > *Data invio:* mercoledì 20 gennaio 2016 06:49 > *A:* Emma Sherratt <[email protected]> > *Cc:* MORPHMET <[email protected]> > > I won't get back to my office, and the hard drive where the files are > stored, for about a week. I'll send something along then. > > Thanks, Emma. > > David > > On Wed, Jan 20, 2016 at 12:08 AM, Emma Sherratt <[email protected]> > wrote: > >> Hi David, >> >> Not sure what the file actually looks like since you’ve not included a >> sample here. However I suggest taking a look at the readland functions in >> geomorph R package to see how we tackle the different types. If you want, >> send it through to us and we can take a look. If there’s a lot of people >> using AVIZO for digitising, we can include a function in geomorph. >> >> Regarding a read function writing? Nope, never heard of that. >> >> Em >> >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> >> Emma Sherratt, PhD. >> >> Lecturer in Zoology, >> Zoology Division, School of Environmental and Rural Science, >> Room L112 Bldg C02, >> University of New England, >> Armidale, NSW, Australia, 2351 >> Tel: +61 2 6773 5041 >> email: [email protected] >> Twitter: @DrEmSherratt >> >> Caecilians are legless amphibians... >> >> * __ >> (\ .-. .-. /_") >> \\_//^\\_//^\\_// >> `"` `"` `"`* >> >> learn more about them here: www.emmasherratt.com/caecilians >> >> >> On 20 January 2016 at 14:50:38, David Katz ([email protected]) wrote: >> >> Hi everyone, >> >> I've collected 3D landmarks on a series of cranial surface models in >> Avizo. Avizo's landmark editor outputs .landmarkAscii files, which I would >> like to read into R. The way I've done the reading has the following very >> unexpected effect: *sometimes,* it* writes *additional data to my >> .landmarkAscii files. I'd like to understand why, but am mostly interested >> in finding a solution. >> >> To read in the landmark files for a specimen... >> >> # Below, avz.file is the filepath for the .landmarkAscii >> # file for a single specimen. >> # The code reads the .landmarkAscii file with read.csv. >> # This is useful because the object created lays out >> # the informational data that precedes the coordinate data >> # predictably. This makes it easy to lop off the >> # informational data. >> read.lms <- read.csv(avz.file, header=FALSE)[,1] >> >> # The last row of informational data will contain the >> # text "@1" and nothing else. >> lm.start <- which(read.lms=="@1")+1 >> >> # Now it is possible to create an object with landmark >> # data only. R interprets each landmark (all three >> # coordinates together) as a factor. I convert the factor >> # vector to a character vector. >> lm.char <- >> as.character(droplevels( >> read.lms[(lm.start):length(read.lms)])) >> >> # Then I create an empty matrix for the landmark data >> lm.mat <- matrix(NA, nrow=length(lm.char), ncol=3) >> >> # Then fill lm.mat with the landmark data. As mentioned, >> # lm.char is a vector. Each element of that vector >> # contains the X, Y, and Z coordinate for a landmark. >> # The coordinates are separated by spaces >> # (or maybe tabs) >> for(i in 1:nrow(lm.mat)) >> {lm.mat[i,] <- >> as.numeric(unlist(strsplit(ctlm.char[i], " ")))} >> >> That's it. The code above will read in the data and make a landmark >> matrix. Unfortunately, it sometimes also writes additional lines to the >> .landmarkAscii file. The first added element is "@2." Thereafter, the >> landmark file adds as many three-coordinate triplets as there are landmarks >> in the original data file. The values of these triplets are 0,0,1 (or maybe >> 1,0,0). >> >> This is really strange behavior. A read function shouldn't write. >> >> My issue may be better suited to an R forum, but I am hoping someone here >> has reliable code for reading Avizo landmarks into R. >> >> Thanks in advance. >> >> David >> >> >> -- >> David Katz >> University of California, Davis >> -- >> MORPHMET may be accessed via its webpage at http://www.morphometrics.org >> --- >> You received this message because you are subscribed to the Google Groups >> "MORPHMET" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> >> -- >> MORPHMET may be accessed via its webpage at http://www.morphometrics.org >> --- >> You received this message because you are subscribed to the Google Groups >> "MORPHMET" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> > > > > -- > David Katz > Doctoral Candidate > Evolutionary Anthropology > University of California, Davis > Young Hall 204 > ResearchGate profile <https://www.researchgate.net/profile/David_Katz29> > > -- > MORPHMET may be accessed via its webpage at http://www.morphometrics.org > --- > You received this message because you are subscribed to the Google Groups > "MORPHMET" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > -- David Katz Doctoral Candidate Evolutionary Anthropology University of California, Davis Young Hall 204 ResearchGate profile <https://www.researchgate.net/profile/David_Katz29> -- MORPHMET may be accessed via its webpage at http://www.morphometrics.org --- You received this message because you are subscribed to the Google Groups "MORPHMET" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
