From noreply at r-forge.r-project.org Sun Dec 1 15:04:02 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Sun, 1 Dec 2013 15:04:02 +0100 (CET) Subject: [Zooimage-commits] r243 - pkg/zooimage/man Message-ID: <20131201140402.DBE801865B0@r-forge.r-project.org> Author: phgrosjean Date: 2013-12-01 15:04:02 +0100 (Sun, 01 Dec 2013) New Revision: 243 Added: pkg/zooimage/man/import.Rd Modified: pkg/zooimage/man/utilities.Rd pkg/zooimage/man/zid.Rd pkg/zooimage/man/zooimage.package.Rd Log: Wrong path in zidUncompress() and zidUncompressAll() solved. Addition of calcVarsVIS(). Added: pkg/zooimage/man/import.Rd =================================================================== --- pkg/zooimage/man/import.Rd (rev 0) +++ pkg/zooimage/man/import.Rd 2013-12-01 14:04:02 UTC (rev 243) @@ -0,0 +1,47 @@ +\name{import} +\alias{readFlowCAMctx} +\alias{readFlowCAMlst} +\alias{importFlowCAM} + +\title{ Function to import data from the FlowCAM } +\description{ + These functions read data and metadata from FlowCAM runs and import them into + ZooImage objects. +} + +\usage{ +readFlowCAMctx(ctx, stop.it = TRUE) +readFlowCAMlst(lst, skip = 2, read.ctx = TRUE) +importFlowCAM(lst) +} + +\arguments{ + \item{ctx}{ the path to a .ctx FlowCAM file. } + \item{stop.it}{ should the process stop in case of an error? Set this to + \code{FALSE} when you run in batch mode and want the error to be repported + back to the calling code. } + \item{lst}{ the path to a .lst FlowCAM file. } + \item{skip}{ the number of lines to skip in the .lst table before reading the + data. This is usally two lines. } + \item{read.ctx}{ should we also read the .ctx file with \code{readFlowCAMctx()}? } +} + +\value{ + A \code{zidb} object with the converted data, metadata and images. +} + +\details{ + The Visual Spreadsheet software provided with the FlowCAM is constantly + changing specifications from version to version. This is mainly testes with + VS 1.5.14. +} + +\author{Philippe Grosjean } + +\seealso{\code{\link{selectObject}}} + +\examples{ +## TODO... +} + +\keyword{ utilities } Property changes on: pkg/zooimage/man/import.Rd ___________________________________________________________________ Added: svn:executable + * Modified: pkg/zooimage/man/utilities.Rd =================================================================== --- pkg/zooimage/man/utilities.Rd 2013-09-15 20:08:52 UTC (rev 242) +++ pkg/zooimage/man/utilities.Rd 2013-12-01 14:04:02 UTC (rev 243) @@ -6,6 +6,7 @@ \alias{makeId} \alias{addClass} \alias{calcVars} +\alias{calcVarsVIS} \alias{dropVars} \alias{ecd} \alias{parseIni} @@ -31,6 +32,7 @@ makeId(ZIDat) addClass(ZIDat, ZIobj) calcVars(x, drop.vars = NULL, drop.vars.def = dropVars()) +calcVarsVIS(x, drop.vars = NULL, drop.vars.def = dropVars()) dropVars() ecd(area) @@ -89,10 +91,10 @@ element found. The data.frame with additional columns for calculated variables with - \code{calcVars()}. Variables to drop are gathered using \code{dropVars()}, - altogether with a list provided explicitly in the \code{drop.vars =} argument. - The list of variable names to drop automatically and silently can be stored in - a variable named \code{ZI.dropVarsDef} or in + \code{calcVars()} or \code{calcVarsVIS()}. Variables to drop are gathered + using \code{dropVars()}, altogether with a list provided explicitly in the + \code{drop.vars =} argument. The list of variable names to drop automatically + and silently can be stored in a variable named \code{ZI.dropVarsDef} or in \code{options(ZI.dropVarsDef = ....)}. A vector of numerical values for \code{ecd()}. Modified: pkg/zooimage/man/zid.Rd =================================================================== --- pkg/zooimage/man/zid.Rd 2013-09-15 20:08:52 UTC (rev 242) +++ pkg/zooimage/man/zid.Rd 2013-12-01 14:04:02 UTC (rev 243) @@ -26,8 +26,8 @@ zidDatRead(zidfile) zidUncompress(zidfile, path = dirname(zidfile), delete.source = FALSE) -zidUncompressAll(path = ".", zidfiles = zidList(path), path.extract = path, - skip.existing.dirs = TRUE, delete.source = FALSE) +zidUncompressAll(path = ".", zidfiles = zidList(path, full.names = TRUE), + path.extract = path, skip.existing.dirs = TRUE, delete.source = FALSE) zidVerify(zidir, type = c("ZI1", "ZI2", "ZI3"), check.vignettes = TRUE) zidVerifyAll(path = ".", samples = NULL, type = c("ZI1", "ZI2", "ZI3"), Modified: pkg/zooimage/man/zooimage.package.Rd =================================================================== --- pkg/zooimage/man/zooimage.package.Rd 2013-09-15 20:08:52 UTC (rev 242) +++ pkg/zooimage/man/zooimage.package.Rd 2013-12-01 14:04:02 UTC (rev 243) @@ -16,8 +16,8 @@ \tabular{ll}{ Package: \tab zooimage\cr Type: \tab Package\cr - Version: \tab 3.0-4\cr - Date: \tab 2013-02-12\cr + Version: \tab 3.0-6\cr + Date: \tab 2013-12-01\cr License: \tab GPL 2 or above at your convenience.\cr } Everytime you publish results that use ZooImage, you must place a reference From noreply at r-forge.r-project.org Tue Dec 10 12:07:45 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Tue, 10 Dec 2013 12:07:45 +0100 (CET) Subject: [Zooimage-commits] r244 - in pkg/zooimage: . R man Message-ID: <20131210110745.DBBCE186AA6@r-forge.r-project.org> Author: phgrosjean Date: 2013-12-10 12:07:44 +0100 (Tue, 10 Dec 2013) New Revision: 244 Modified: pkg/zooimage/DESCRIPTION pkg/zooimage/NAMESPACE pkg/zooimage/NEWS pkg/zooimage/R/gui.R pkg/zooimage/R/guiutils.R pkg/zooimage/R/import.R pkg/zooimage/R/utilities.R pkg/zooimage/R/zid.R pkg/zooimage/R/zim.R pkg/zooimage/man/import.Rd pkg/zooimage/man/zooimage.package.Rd Log: Improvement in the FlowCAM importation functions Modified: pkg/zooimage/DESCRIPTION =================================================================== --- pkg/zooimage/DESCRIPTION 2013-12-01 14:04:02 UTC (rev 243) +++ pkg/zooimage/DESCRIPTION 2013-12-10 11:07:44 UTC (rev 244) @@ -1,12 +1,12 @@ Package: zooimage Type: Package Title: Analysis of numerical zooplankton images -Version: 3.0-4 -Date: 2013-02-12 +Version: 3.0-7 +Date: 2013-12-10 Author: Ph. Grosjean, K. Denis & R. Francois Maintainer: Philippe Grosjean Depends: R (>= 2.14.0), svMisc (>= 0.9-67), svDialogs (>= 0.9-53), mlearning -Imports: filehash, jpeg, png, ipred, rpart, e1071, tree, utils +Imports: filehash, jpeg, png, tiff, utils Suggests: rJava, mlbench Description: ZooImage is a free (open source) solution for analyzing digital images of zooplankton. In combination with ImageJ, a free image analysis Modified: pkg/zooimage/NAMESPACE =================================================================== --- pkg/zooimage/NAMESPACE 2013-12-01 14:04:02 UTC (rev 243) +++ pkg/zooimage/NAMESPACE 2013-12-10 11:07:44 UTC (rev 244) @@ -7,6 +7,7 @@ import(filehash) import(jpeg) import(png) +import(tiff) #import(ipred) #import(MASS) #import(randomForest) @@ -94,6 +95,7 @@ # Utilities export(addClass) export(calcVars) +export(calcVarsVIS) export(calibrate) export(dropVars) export(ecd) @@ -167,6 +169,11 @@ export(startPgm) export(modalAssistant) +# Importation +export(readFlowCAMctx) +export(readFlowCAMlst) +export(importFlowCAM) + # S3 methods S3method(template, default) S3method(recode, ZITrain) Modified: pkg/zooimage/NEWS =================================================================== --- pkg/zooimage/NEWS 2013-12-01 14:04:02 UTC (rev 243) +++ pkg/zooimage/NEWS 2013-12-10 11:07:44 UTC (rev 244) @@ -1,5 +1,36 @@ = zooimage News +== Changes in zooimage 3.0-7 + +* readFlowCAMlst() can now read Visual Spreadsheet .lst file format 017 where + the name of the columns is explicitly provided in the header of the file. + +* zimDatMakeFlowCAM() now uses readFlowCAMlst() instead of the hidden function + .lstRead() to avoid duplicated code. + +* zidVerify() now builds automatically the _dat1.zim file from FlowCAM data if + it is not there, but corresponding .lst and .zim files are found in the parent + directory. + + +== Changes in zooimage 3.0-6 + +* zidUncompress() unzipped files in current dir., ignoring its path argument. + Solved now. + +* zidUncompressAll() now computes full names for zidfiles argument by default. + +* calcVarsVIS() added. Specific function to calculate derived variables from + FlowCAM's Visualspreadsheet software. + +* Added the extraction of RGB vignettes when importing FlowCAM data. + + +== Changes in zooimage 3.0-5 + +* Functions to import FlowCAM data directly. + + == Changes in zooimage 3.0-4 * Default dropVars(): adding a few items, including 'Skew', 'Kurt' and Modified: pkg/zooimage/R/gui.R =================================================================== --- pkg/zooimage/R/gui.R 2013-12-01 14:04:02 UTC (rev 243) +++ pkg/zooimage/R/gui.R 2013-12-10 11:07:44 UTC (rev 244) @@ -433,7 +433,7 @@ system.file("imagej", "ij.jar", package = "zooimage"), system.file("imagej", "plugins", "_zooimage.jar", package = "zooimage"), ij.plugin, - tools:::file_path_as_absolute(zimfile)) + tools::file_path_as_absolute(zimfile)) return(invisible(system(cmd, intern = TRUE))) } ## TODO: update a progress bar from ImageJ (using sockets ?) Modified: pkg/zooimage/R/guiutils.R =================================================================== --- pkg/zooimage/R/guiutils.R 2013-12-01 14:04:02 UTC (rev 243) +++ pkg/zooimage/R/guiutils.R 2013-12-10 11:07:44 UTC (rev 244) @@ -138,7 +138,7 @@ { if (isWin()) { startPgm("ImageViewer", sprintf('"%s"', - tools:::file_path_as_absolute(dir))) + tools::file_path_as_absolute(dir))) } else if (isMac()) { cmd <- sprintf('/Applications/Utilities/XnViewMP.app/Contents/MacOS/xnview "%s"', dir) Modified: pkg/zooimage/R/import.R =================================================================== --- pkg/zooimage/R/import.R 2013-12-01 14:04:02 UTC (rev 243) +++ pkg/zooimage/R/import.R 2013-12-10 11:07:44 UTC (rev 244) @@ -76,12 +76,12 @@ V } -ctxFile <- "/Users/phgrosjean/Desktop/Intercalibration/BE.ArMix.2009-04-29.300A4X_01/BE.ArMix.2009-04-29.300A4X_01.ctx" -readFlowCAMctx(ctxFile) - +## Examples +#ctxFile <- "/Users/phgrosjean/Desktop/Intercalibration/BE.ArMix.2009-04-29.300A4X_01/BE.ArMix.2009-04-29.300A4X_01.ctx" +#readFlowCAMctx(ctxFile) ## A 1.5.14 file -ctxFile1 <- "/Users/phgrosjean/Documents/Pgm/ZooPhytoImage_1.2-1-examples/FlowCAM-example-FIT-VIS/143-144526.ctx" -readFlowCAMctx(ctxFile1) +#ctxFile1 <- "/Users/phgrosjean/Documents/Pgm/ZooPhytoImage_1.2-1-examples/FlowCAM-example-FIT-VIS/143-144526.ctx" +#readFlowCAMctx(ctxFile1) ## Read a flowCAM .lst file readFlowCAMlst <- function (lst, skip = 2, read.ctx = TRUE) @@ -98,59 +98,118 @@ } read.ctx <- isTRUE(as.logical(read.ctx)) - ## Determine the version of the FlowCAM's table according to number of cols - ncol <- length( - read.table(lst, header = FALSE, sep = ":", dec = ".", skip = 2, nrows = 1)) + ## For format 017 we have now column names hardcoded + header <- scan(lst, what = character(), nlines = 2L, quiet = TRUE) + if (as.integer(header[1]) >= 17 && substr(header[2], 1, 10) == "num-fields") { + ## Format >= 17. Columns names are hardcoded! + nfields <- as.integer(strsplit(header[2], "|", fixed = TRUE)[[1]][2]) + if (!length(nfields) || is.na(nfields) || nfields < 44) + stop("Unrecognized .lst file format: number of fields is ", nfields) + skip <- nfields + 2 + ## Read column header information + hcol <- scan(lst, what = character(), sep = "|", skip = 2L, + nlines = nfields, quiet = TRUE) + if (length(hcol) != nfields * 2) + stop("Unrecognized .lst file format: incorrect header") + hcol <- matrix(hcol, ncol = 2, byrow = TRUE) + cnames <- hcol[, 1] + ## Make sure all names start with FIT_ and are Capitalized + capital <- function(x) { + s <- strsplit(x, "_") + sapply(s, function (x) paste(toupper(substring(x, 1, 1)), + substring(x, 2), sep = "", collapse = "_")) + } + cnames <- paste("FIT", capital(cnames), sep = "_") + ## Special replacements + cnames <- sub("Abd", "ABD", cnames) + cnames <- sub("Esd", "ESD", cnames) + cnames <- sub("FIT_Ch([1-9])_Width", "FIT_Ch\\1_TOF", cnames) + ## We need to replace names by their zooimage equivalent + cnames[cnames == "FIT_Id"] <- "Id" # The only one not starting woth FIT_ + cnames[cnames == "FIT_ABD_Area"] <- "FIT_Area_ABD" + cnames[cnames == "FIT_ABD_Diameter"] <- "FIT_Diameter_ABD" + cnames[cnames == "FIT_ESD_Diameter"] <- "FIT_Diameter_ESD" + cnames[cnames == "FIT_Raw_Perimeter"] <- "FIT_Raw_Perim" + cnames[cnames == "FIT_Raw_Convex_Perimeter"] <- "FIT_Raw_Convex_Perim" + cnames[cnames == "FIT_Collage_File"] <- "FIT_Filename" + cnames[cnames == "FIT_Timestamp"] <- "FIT_Timestamp1" + cnames[cnames == "FIT_Image_X"] <- "FIT_SaveX" + cnames[cnames == "FIT_Image_Y"] <- "FIT_SaveY" + cnames[cnames == "FIT_Image_W"] <- "FIT_PixelW" + cnames[cnames == "FIT_Image_H"] <- "FIT_PixelH" + cnames[cnames == "FIT_Src_X"] <- "FIT_CaptureX" + cnames[cnames == "FIT_Src_Y"] <- "FIT_CaptureY" + cnames[cnames == "FIT_Src_Image"] <- "FIT_Source_Image" + cnames[cnames == "FIT_Cal_Image"] <- "FIT_Calibration_Image" + ## Note: in comparison to old format, we have in addition: + #"FIT_Camera", "FIT_Fringe_Size", "FIT_Circle_Fit", "FIT_Ch1_Area", + #"FIT_Ch2_Area", "FIT_Ch3_Area" + + ## Read the data in + tab <- read.table(lst, header = FALSE, sep = "|", dec = ".", + skip = skip, col.names = cnames) + ## Add missing fields from the previous versions + tab$FIT_Ch4_Peak <- NA + tab$FIT_Ch4_TOF <- NA + tab$FIT_High_U32 <- NA + tab$FIT_Low_U32 <- NA + tab$FIT_Total <- NA + tab$FIT_Timestamp2 <- as.character(NA) + } else { # Older format. We have to guess column names! + ## Determine version of the FlowCAM's table according to number of cols + ncol <- length(read.table(lst, header = FALSE, sep = ":", dec = ".", + skip = skip, nrows = 1)) - ## Read .lst data - ## TODO: if export file exists, verify column names here (.csv file) - if (ncol == 44) { # This should be FlowCAM II - tab <- read.table(lst, header = FALSE, sep = ":", dec = '.', skip = skip, - col.names = c("Id", "FIT_Cal_Const", "FIT_Raw_Area", - "FIT_Raw_Feret_Max", "FIT_Raw_Feret_Min", "FIT_Raw_Feret_Mean", - "FIT_Raw_Perim", "FIT_Raw_Convex_Perim", "FIT_Area_ABD", - "FIT_Diameter_ABD", "FIT_Length", "FIT_Width", "FIT_Diameter_ESD", - "FIT_Perimeter", "FIT_Convex_Perimeter", "FIT_Intensity", - "FIT_Sigma_Intensity", "FIT_Compactness", "FIT_Elongation", - "FIT_Sum_Intensity", "FIT_Roughness", "FIT_Feret_Max_Angle", - "FIT_Avg_Red", "FIT_Avg_Green", "FIT_Avg_Blue", "FIT_PPC", - "FIT_Ch1_Peak", "FIT_Ch1_TOF", "FIT_Ch2_Peak", "FIT_Ch2_TOF", - "FIT_Ch3_Peak", "FIT_Ch3_TOF", "FIT_Ch4_Peak", "FIT_Ch4_TOF", - "FIT_Filename", "FIT_SaveX", "FIT_SaveY", "FIT_PixelW", - "FIT_PixelH", "FIT_CaptureX", "FIT_CaptureY", "FIT_High_U32", - "FIT_Low_U32", "FIT_Total")) + ## Read .lst data + ## TODO: if export file exists, verify column names here (.csv file) + if (ncol == 44) { # This should be FlowCAM II + tab <- read.table(lst, header = FALSE, sep = ":", dec = '.', + skip = skip, col.names = c("Id", "FIT_Cal_Const", "FIT_Raw_Area", + "FIT_Raw_Feret_Max", "FIT_Raw_Feret_Min", "FIT_Raw_Feret_Mean", + "FIT_Raw_Perim", "FIT_Raw_Convex_Perim", "FIT_Area_ABD", + "FIT_Diameter_ABD", "FIT_Length", "FIT_Width", "FIT_Diameter_ESD", + "FIT_Perimeter", "FIT_Convex_Perimeter", "FIT_Intensity", + "FIT_Sigma_Intensity", "FIT_Compactness", "FIT_Elongation", + "FIT_Sum_Intensity", "FIT_Roughness", "FIT_Feret_Max_Angle", + "FIT_Avg_Red", "FIT_Avg_Green", "FIT_Avg_Blue", "FIT_PPC", + "FIT_Ch1_Peak", "FIT_Ch1_TOF", "FIT_Ch2_Peak", "FIT_Ch2_TOF", + "FIT_Ch3_Peak", "FIT_Ch3_TOF", "FIT_Ch4_Peak", "FIT_Ch4_TOF", + "FIT_Filename", "FIT_SaveX", "FIT_SaveY", "FIT_PixelW", + "FIT_PixelH", "FIT_CaptureX", "FIT_CaptureY", "FIT_High_U32", + "FIT_Low_U32", "FIT_Total")) - ## Add columns present in .lst from FlowCAM III (same table for all) - tab$FIT_Feret_Min_Angle <- NA - tab$FIT_Edge_Gradient <- NA - tab$FIT_Timestamp1 <- NA - tab$FIT_Timestamp2 <- NA - tab$FIT_Source_Image <- NA - tab$FIT_Calibration_Image <- NA + ## Add columns present in .lst from FlowCAM III (same table for all) + tab$FIT_Feret_Min_Angle <- NA + tab$FIT_Edge_Gradient <- NA + tab$FIT_Timestamp1 <- NA + tab$FIT_Timestamp2 <- NA + tab$FIT_Source_Image <- NA + tab$FIT_Calibration_Image <- NA - } else if (ncol == 47) { # This should be FlowCAM III - tab <- read.table(lst, header = FALSE, sep = ":", dec = '.', skip = skip, - col.names = c("Id", "FIT_Cal_Const", "FIT_Raw_Area", - "FIT_Raw_Feret_Max", "FIT_Raw_Feret_Min", "FIT_Raw_Feret_Mean", - "FIT_Raw_Perim", "FIT_Raw_Convex_Perim", "FIT_Area_ABD", - "FIT_Diameter_ABD", "FIT_Length", "FIT_Width", "FIT_Diameter_ESD", - "FIT_Perimeter", "FIT_Convex_Perimeter", "FIT_Intensity", - "FIT_Sigma_Intensity", "FIT_Compactness", "FIT_Elongation", - "FIT_Sum_Intensity", "FIT_Roughness", "FIT_Feret_Max_Angle", - "FIT_Feret_Min_Angle", "FIT_Avg_Red", "FIT_Avg_Green", - "FIT_Avg_Blue", "FIT_PPC", "FIT_Ch1_Peak", "FIT_Ch1_TOF", - "FIT_Ch2_Peak", "FIT_Ch2_TOF", "FIT_Ch3_Peak", "FIT_Ch3_TOF", - "FIT_Ch4_Peak", "FIT_Ch4_TOF", "FIT_Filename", "FIT_SaveX", - "FIT_SaveY", "FIT_PixelW", "FIT_PixelH", "FIT_CaptureX", - "FIT_CaptureY", "FIT_Edge_Gradient", "FIT_Timestamp1", - "FIT_Timestamp2", "FIT_Source_Image", "FIT_Calibration_Image")) + } else if (ncol == 47) { # This should be FlowCAM III + tab <- read.table(lst, header = FALSE, sep = ":", dec = '.', + skip = skip, col.names = c("Id", "FIT_Cal_Const", "FIT_Raw_Area", + "FIT_Raw_Feret_Max", "FIT_Raw_Feret_Min", "FIT_Raw_Feret_Mean", + "FIT_Raw_Perim", "FIT_Raw_Convex_Perim", "FIT_Area_ABD", + "FIT_Diameter_ABD", "FIT_Length", "FIT_Width", "FIT_Diameter_ESD", + "FIT_Perimeter", "FIT_Convex_Perimeter", "FIT_Intensity", + "FIT_Sigma_Intensity", "FIT_Compactness", "FIT_Elongation", + "FIT_Sum_Intensity", "FIT_Roughness", "FIT_Feret_Max_Angle", + "FIT_Feret_Min_Angle", "FIT_Avg_Red", "FIT_Avg_Green", + "FIT_Avg_Blue", "FIT_PPC", "FIT_Ch1_Peak", "FIT_Ch1_TOF", + "FIT_Ch2_Peak", "FIT_Ch2_TOF", "FIT_Ch3_Peak", "FIT_Ch3_TOF", + "FIT_Ch4_Peak", "FIT_Ch4_TOF", "FIT_Filename", "FIT_SaveX", + "FIT_SaveY", "FIT_PixelW", "FIT_PixelH", "FIT_CaptureX", + "FIT_CaptureY", "FIT_Edge_Gradient", "FIT_Timestamp1", + "FIT_Timestamp2", "FIT_Source_Image", "FIT_Calibration_Image")) - ## Add columns present in list files from FlowCAM II - tab$FIT_High_U32 <- NA - tab$FIT_Low_U32 <- NA - tab$FIT_Total <- NA + ## Add columns present in list files from FlowCAM II + tab$FIT_High_U32 <- NA + tab$FIT_Low_U32 <- NA + tab$FIT_Total <- NA - } else stop("Unrecognized FlowCAM format") # TODO: adapt for the new soft + } else stop("Unrecognized FlowCAM format") # TODO: adapt for the new soft + } ## New variables calculation (present in export .csv from the FlowCAM) ## Code already checked @@ -174,14 +233,14 @@ tab } -lstFile <- "/Users/phgrosjean/Desktop/Intercalibration/BE.ArMix.2009-04-29.300A4X_01/BE.ArMix.2009-04-29.300A4X_01.lst" -res <- readFlowCAMlst(lstFile) +## Example +#lstFile <- "/Users/phgrosjean/Desktop/Intercalibration/BE.ArMix.2009-04-29.300A4X_01/BE.ArMix.2009-04-29.300A4X_01.lst" +#res <- readFlowCAMlst(lstFile) +#lstFile1 <- "/Users/phgrosjean/Documents/Pgm/ZooPhytoImage_1.2-1-examples/FlowCAM-example-FIT-VIS/143-144526.lst" +#res1 <- readFlowCAMlst(lstFile1) -lstFile1 <- "/Users/phgrosjean/Documents/Pgm/ZooPhytoImage_1.2-1-examples/FlowCAM-example-FIT-VIS/143-144526.lst" -res1 <- readFlowCAMlst(lstFile1) - ## Temporary name! -importFlowCAM <- function (lst) +importFlowCAM <- function (lst, rgb.vigs = TRUE) { dat <- readFlowCAMlst(lst, skip = 2, read.ctx = TRUE) ## Check results @@ -194,8 +253,8 @@ ## TODO... ## ImportVignettes - require(tiff) - require(png) + #require(tiff) + #require(png) ## List all tiff files in the directory (but exclude masks with _bin.tif) sampledir <- dirname(lst) @@ -203,6 +262,7 @@ on.exit(setwd(odir)) ## Make sure zidbdir exists and is empty + ## TODO: use a fresh dir, or erase existing one with user's acceptation zidbdir <- file.path(dirname(sampledir), "_import", basename(sampledir)) if (file.exists(zidbdir) && dir(zidbdir) != 0) stop("The destination dir already exists and is not empty!") @@ -221,8 +281,20 @@ ## Read all background calibration images into a list cals <- list() - for (i in 1:length(calFiles)) + for (i in 1:length(calFiles)) { cals[[i]] <- readTIFF(source = calFiles[i]) + ## If the image is RGB, we got three dimensions to reduce to two + cdim <- dim(cals[[i]]) + if (length(cdim) == 3 && cdim[3] == 3) { + ## Calculate the CIE 1931 linear luminance Y as grayscale + ## Y = 0.2126 R + 0.7152 G + 0.0722 B + cals[[i]] <- 0.2126 * cals[[i]][, , 1] + 0.7152 * cals[[i]][, , 2] + + 0.0722 * cals[[i]][, , 3] + } + if (length(dim(cals[[i]])) != 2) + stop("unrecognized calibration image type; ", + "cannot convert it to 8-bit grayscale") + } ## Read collages one by one and extract vignettes from them, ## using information gathered into dat @@ -241,18 +313,34 @@ ## Determine best gray level for background after substraction gray <- attr(dat, "FlowCAM.metadata")$CaptureParameters$ThresholdLight - if (!length(gray)) gray <- 0 - gray <- max(gray, 40)/255 # Target something like 40 + if (!length(gray)) { + warning("Unknown threshold gray level; using 40") + gray <- 40 # Target something like 40 + } + gray <- gray / 255 + ## Threshold = 2 * gray, since we add it once while subtracting background + threshold <- 1 - 2 * gray ## Proceed with each vignette for (i in 1:nrow(dat1)) { d <- dat1[i, ] ## Do we need to load the next collage? - if (d$FIT_Filename != colFile) { + if (as.character(d$FIT_Filename) != colFile) { filename <- as.character(d$FIT_Filename) collage <- readTIFF(source = filename) colFile <- d$FIT_Filename colFiles <- colFiles[colFiles != filename] + ## If the image is RGB, we got three dimensions to reduce to two + cdim <- dim(collage) + if (length(cdim) == 3 && cdim[3] == 3) { + ## Calculate the CIE 1931 linear luminance Y as grayscale + ## Y = 0.2126 R + 0.7152 G + 0.0722 B + collage <- 0.2126 * collage[, , 1] + 0.7152 * collage[, , 2] + + 0.0722 * collage[, , 3] + } + if (length(dim(collage)) != 2) + stop("unrecognized collage image type; ", + "cannot convert it to 8-bit grayscale") } ## Get coordinates of the vignette in that collage @@ -264,6 +352,8 @@ ## Extract the vignette and corresponding background from the collage vig <- crop(collage, colCoords) + ## If FIT_Calibration_Image is NA, use first one => TODO: check this! + if (is.na(d$FIT_Calibration_Image)) d$FIT_Calibration_Image <- 1 back <- crop(cals[[d$FIT_Calibration_Image]], calCoords) ## Substract background and save vignette @@ -271,6 +361,17 @@ vig2[vig2 > 1] <- 1 vig2[vig2 < 0] <- 0 + if (isTRUE(rgb.vigs)) { + ## Calculate mask + mask <- matrix(1, nrow = nrow(vig2), ncol = ncol(vig2)) + mask[vig2 > threshold] <- 0 + ## Do we need to fill holes? + ## TODO... + + ## Combine grayscales and mask into a RGB image + vig2 <- structure(c(vig2, vig2, mask), dim = c(dim(vig2), 3)) + } + ## Write this vignette vigFile <- file.path(zidbdir, sub("\\.tif$", paste0("_", i, ".png"), filename)) @@ -279,13 +380,14 @@ ## Create zidb ## TODO... + dat } -## Test versin 2.2.1 -lstFile <- "/Users/phgrosjean/Desktop/Intercalibration/BE.ArMix.2009-04-29.300A4X_01/BE.ArMix.2009-04-29.300A4X_01.lst" -res <- importFlowCAM(lstFile) - +## Example +## Test version 2.2.1 +#lstFile <- "/Users/phgrosjean/Desktop/Intercalibration/BE.ArMix.2009-04-29.300A4X_01/BE.ArMix.2009-04-29.300A4X_01.lst" +#res <- importFlowCAM(lstFile) ## Test version 1.5.14 ## TODO: This does not work (incorrect number of dimensions => imports images as an array?) -lstFile1 <- "/Users/phgrosjean/Documents/Pgm/ZooPhytoImage_1.2-1-examples/FlowCAM-example-FIT-VIS/143-144526.lst" -res1 <- importFlowCAM(lstFile1) +#lstFile1 <- "/Users/phgrosjean/Documents/Pgm/ZooPhytoImage_1.2-1-examples/FlowCAM-example-FIT-VIS/143-144526.lst" +#res1 <- importFlowCAM(lstFile1) Modified: pkg/zooimage/R/utilities.R =================================================================== --- pkg/zooimage/R/utilities.R 2013-12-01 14:04:02 UTC (rev 243) +++ pkg/zooimage/R/utilities.R 2013-12-10 11:07:44 UTC (rev 244) @@ -181,6 +181,47 @@ x } +## Calculate derived variables... FlowCAM's Visual Spreadsheet +calcVarsVIS <- function (x, drop.vars = NULL, drop.vars.def = dropVars()) +{ + ## A small hack to correct some 0 (which can be problematic in further calcs) + noZero <- function(x) { + x[x == 0] <- 1e-09 + x + } + + ## Euclidean distance between two points + distance <- function (x, y) + sqrt(x^2 + y^2) + + x$FIT_Area_ABD <- noZero(x$FIT_Area_ABD) + x$FIT_Perimeter <- noZero(x$FIT_Perimeter) + x$FIT_Length <- noZero(x$FIT_Length) + x$FIT_Width <- noZero(x$FIT_Width) + x$ARFeret <- x$FIT_Width/x$FIT_Length + x$EdgeRange <- abs(x$FIT_Intensity - x$FIT_Edge_Gradient) + x$CV <- x$FIT_Sigma_Intensity/x$FIT_Intensity * 100 + x$MeanFDia <- (x$FIT_Length + x$FIT_Width) / 2 + x$Transp2 <- 1 - (x$FIT_Diameter_ABD/x$MeanFDia) + x$Transp2[x$Transp2 < 0] <- 0 + x$FeretRoundness <- 4 * x$FIT_Area_ABD/(pi * sqrt(x$FIT_Length)) + x$Circ. <- 4 * pi * x$FIT_Area_ABD / sqrt(x$FIT_Perimeter) # ImageJ calculation + x$EdgeCV <- x$FIT_Sigma_Intensity/x$FIT_Edge_Gradient * 100 + x$EdgeSDNorm <- x$FIT_Intensity/x$EdgeRange + x$Perim_Ratio <- x$FIT_Convex_Perimeter / x$FIT_Perimeter + + ## Eliminate variables that are not predictors... and use Id as rownames + Id <- x$Id + if (length(Id)) rownames(x) <- Id + + ## Variables to drop + dropAll <- unique(as.character(c(drop.vars, drop.vars.def))) + for (dropVar in dropAll) x[[dropVar]] <- NULL + + ## Return the recalculated data frame + x +} + ## Calculate equivalent circular diameter (similar to equivalent spherical ## diameter, but for 2D images) ecd <- function (area) Modified: pkg/zooimage/R/zid.R =================================================================== --- pkg/zooimage/R/zid.R 2013-12-01 14:04:02 UTC (rev 243) +++ pkg/zooimage/R/zid.R 2013-12-10 11:07:44 UTC (rev 244) @@ -30,8 +30,30 @@ ## Check the list of _dat1.zim dat1files <- zimDatList(zidir) if (!length(dat1files)) { - warning("no '_dat1.zim' file!") - return(invisible(FALSE)) + ## Special case for the FlowCAM where the _dat1.zim file is not created + ## automatically, but all data are there to do so + lstfile <- paste(zidir, "lst", sep = ".") + zimfile <- paste(zidir, "zim", sep = ".") + if (file.exists(lstfile)) { + if (!file.exists(zimfile)) { + warning("FlowCAM data with no '_dat1.zim' file and no '.zim' file to create it") + return(invisible(FALSE)) + } + ## Try to create the _dat1.zim file now + res <- zimDatMakeFlowCAM(zimfile) + if (!res) { + warning("cannot create the '_dat1.zim' file from FlowCAM data") + return(invisible(FALSE)) + } + dat1files <- zimDatList(zidir) + if (!length(dat1files)) { + warning("impossible to create '_dat1.zim' file!") + return(invisible(FALSE)) + } + } else { + warning("no '_dat1.zim' file!") + return(invisible(FALSE)) + } } ## Check the content of all these "_dat1.zim" files @@ -284,7 +306,7 @@ message("Unzipping '", zidfile, "' ...") ## Uncompress it - if (!length(tryCatch(unzip(zidfile, overwrite = FALSE, exdir = "."), + if (!length(tryCatch(unzip(zidfile, overwrite = FALSE, exdir = path), error = function (e) warning(e), warning = function (w) return()))) { message(" ... not done!") @@ -299,8 +321,9 @@ } ## Uncompress all .zid files in the 'path.extract' directory -zidUncompressAll <- function (path = ".", zidfiles = zidList(path), -path.extract = path, skip.existing.dirs = TRUE, delete.source = FALSE) +zidUncompressAll <- function (path = ".", zidfiles = zidList(path, +full.names = TRUE), path.extract = path, skip.existing.dirs = TRUE, +delete.source = FALSE) { ## Initial checks if (!length(zidfiles)) { @@ -547,7 +570,7 @@ tmpd <- tempdir() unzip(zidfile, file, exdir = tmpd, overwrite = TRUE, junkpaths = TRUE) - res <- file.path(tmpd, file) + res <- file.path(tmpd, basename(file)) if (file.exists(res)) res else NULL } rdata <- zidExtract(rdata, zidfile) Modified: pkg/zooimage/R/zim.R =================================================================== --- pkg/zooimage/R/zim.R 2013-12-01 14:04:02 UTC (rev 243) +++ pkg/zooimage/R/zim.R 2013-12-10 11:07:44 UTC (rev 244) @@ -1,4 +1,4 @@ -## Copyright (c) 2004-2012, Ph. Grosjean +## Copyright (c) 2004-2013, Ph. Grosjean ## ## This file is part of ZooImage ## @@ -450,8 +450,10 @@ ## Read list file ## Read visual spreadsheet data (from the FlowCAM) - visdata <- .lstRead(file.path(zidir, - paste(basename(zidir), "lst", sep = ".")), skip = 2) + #visdata <- .lstRead(file.path(zidir, + # paste(basename(zidir), "lst", sep = ".")), skip = 2) + lstfile <- sub("\\.zim$", ".lst", zimfile) + visdata <- readFlowCAMlst(lstfile, skip = 2, read.ctx = FALSE) ## Read ImageJ results (from FITVis) fitdata <- read.table(file.path(zidir, "results.csv"), @@ -461,15 +463,16 @@ alldata <- cbind(visdata, fitdata) ## Add Label columns - alldata$Label <- rep(basename(zidir), nrow(alldata)) + sample <- sub("\\.zim$", "", basename(zimfile)) + alldata$Label <- rep(sample, nrow(alldata)) ## Transform Id column in !Item column names(alldata)[grep("Id", names(alldata))] <- "!Item" ## Select only useful columns alldata$FIT_Filename <- NULL ## Create _dat1.zim file - zidatfile <- file.path(zidir, basename(zidir), - sub("\\.zim$", "_dat1.zim", basename(zimfile))) + zidatfile <- file.path(zidir, sample, + paste(sample, "dat1.zim", sep = "_")) if (!file.exists(dirname(zidatfile))) { warning("directory ", dirname(zidatfile), " does not exist") return(invisible(FALSE)) @@ -478,8 +481,9 @@ ## Add table of measurements at the end cat("\n[Data]\n", file = zidatfile, append = TRUE) - write.table(alldata, file = zidatfile, append = TRUE, quote = FALSE, - sep = "\t", col.names = TRUE, row.names = FALSE, dec = ".") + suppressWarnings(write.table(alldata, file = zidatfile, append = TRUE, + quote = FALSE, sep = "\t", col.names = TRUE, row.names = FALSE, + dec = ".")) # In R 3.0.2: "appending column names to file" warning invisible(TRUE) } @@ -516,81 +520,81 @@ ## FlowCAM special treatment because the plugin doesn't export dat1.zim! ## Read list file -## TODO: avoid duplicated code between versions -.lstRead <- function (lstfile, skip = 2) -{ - ## Determine the version of the FlowCAM - ncol <- length(read.table(lstfile, header = FALSE, sep = ":", dec = ".", - skip = skip, nrows = 1)) - if (ncol <= 44) { - ## FlowCAM II with 44 columns - ## Read the table - tab <- read.table(lstfile, header = FALSE, sep = ":", dec = '.', - col.names = c("Id", "FIT_Cal_Const", "FIT_Raw_Area", - "FIT_Raw_Feret_Max", "FIT_Raw_Feret_Min", "FIT_Raw_Feret_Mean", - "FIT_Raw_Perim", "FIT_Raw_Convex_Perim", "FIT_Area_ABD", - "FIT_Diameter_ABD", "FIT_Length", "FIT_Width", - "FIT_Diameter_ESD", "FIT_Perimeter", "FIT_Convex_Perimeter", - "FIT_Intensity", "FIT_Sigma_Intensity", "FIT_Compactness", - "FIT_Elongation", "FIT_Sum_Intensity", "FIT_Roughness", - "FIT_Feret_Max_Angle", "FIT_Avg_Red", "FIT_Avg_Green", - "FIT_Avg_Blue", "FIT_PPC", "FIT_Ch1_Peak", "FIT_Ch1_TOF", - "FIT_Ch2_Peak", "FIT_Ch2_TOF", "FIT_Ch3_Peak", "FIT_Ch3_TOF", - "FIT_Ch4_Peak", "FIT_Ch4_TOF", "FIT_Filename", "FIT_SaveX", - "FIT_SaveY", "FIT_PixelW", "FIT_PixelH", "FIT_CaptureX", - "FIT_CaptureY", "FIT_High_U32", "FIT_Low_U32", "FIT_Total"), - skip = skip) - ## Add columns present in list files from FlowCAM III - tab$FIT_Feret_Min_Angle <- NA - tab$FIT_Edge_Gradient <- NA - tab$FIT_Timestamp1 <- NA - tab$FIT_Timestamp2 <- NA - tab$FIT_Source_Image <- NA - tab$FIT_Calibration_Image <- NA - tab$FIT_Ch2_Ch1_Ratio <- tab$FIT_Ch2_Peak / tab$FIT_Ch1_Peak - ## New variables calc (present in dataexport.csv from the FlowCAM) - tab$FIT_Volume_ABD <- (4/3) * pi * (tab$FIT_Diameter_ABD/2)^3 - tab$FIT_Volume_ESD <- (4/3) * pi * (tab$FIT_Diameter_ESD/2)^3 - tab$FIT_Aspect_Ratio <- tab$FIT_Width / tab$FIT_Length - tab$FIT_Transparency <- 1 - (tab$FIT_Diameter_ABD/tab$FIT_Diameter_ESD) - tab$FIT_Red_Green_Ratio <- tab$FIT_Avg_Red / tab$FIT_Avg_Green - tab$FIT_Blue_Green_Ratio <- tab$FIT_Avg_Blue / tab$FIT_Avg_Green - tab$FIT_Red_Blue_Ratio <- tab$FIT_Avg_Red / tab$FIT_Avg_Blue - } else { # FlowCAM III with 47 columns - ## Read the table - tab <- read.table(lstfile, header = FALSE, sep = ":", dec = '.', - col.names = c("Id", "FIT_Cal_Const", "FIT_Raw_Area", - "FIT_Raw_Feret_Max", "FIT_Raw_Feret_Min", "FIT_Raw_Feret_Mean", - "FIT_Raw_Perim", "FIT_Raw_Convex_Perim", "FIT_Area_ABD", - "FIT_Diameter_ABD", "FIT_Length", "FIT_Width", - "FIT_Diameter_ESD", "FIT_Perimeter", "FIT_Convex_Perimeter", - "FIT_Intensity", "FIT_Sigma_Intensity", "FIT_Compactness", - "FIT_Elongation", "FIT_Sum_Intensity", "FIT_Roughness", - "FIT_Feret_Max_Angle", "FIT_Feret_Min_Angle", "FIT_Avg_Red", - "FIT_Avg_Green", "FIT_Avg_Blue", "FIT_PPC", "FIT_Ch1_Peak", - "FIT_Ch1_TOF", "FIT_Ch2_Peak", "FIT_Ch2_TOF", "FIT_Ch3_Peak", - "FIT_Ch3_TOF", "FIT_Ch4_Peak", "FIT_Ch4_TOF", "FIT_Filename", - "FIT_SaveX", "FIT_SaveY", "FIT_PixelW", "FIT_PixelH", - "FIT_CaptureX", "FIT_CaptureY", "FIT_Edge_Gradient", - "FIT_Timestamp1", "FIT_Timestamp2", "FIT_Source_Image", - "FIT_Calibration_Image"), - skip = skip) - ## Add columns present in list files from FlowCAM II - tab$FIT_High_U32 <- NA - tab$FIT_Low_U32 <- NA - tab$FIT_Total <- NA - ## New variables calcul (present in dataexport.csv from the FlowCAM) - tab$FIT_Volume_ABD <- (4/3) * pi * (tab$FIT_Diameter_ABD/2)^3 - tab$FIT_Volume_ESD <- (4/3) * pi * (tab$FIT_Diameter_ESD/2)^3 - tab$FIT_Aspect_Ratio <- tab$FIT_Width / tab$FIT_Length - tab$FIT_Transparency <- 1 - (tab$FIT_Diameter_ABD/tab$FIT_Diameter_ESD) - tab$FIT_Red_Green_Ratio <- tab$FIT_Avg_Red / tab$FIT_Avg_Green - tab$FIT_Blue_Green_Ratio <- tab$FIT_Avg_Blue / tab$FIT_Avg_Green - tab$FIT_Red_Blue_Ratio <- tab$FIT_Avg_Red / tab$FIT_Avg_Blue - tab$FIT_Ch2_Ch1_Ratio <- tab$FIT_Ch2_Peak / tab$FIT_Ch1_Peak - } - tab -} +## TODO: eliminate this. Code is now in readFlowCAMlst() function! +#.lstRead <- function (lstfile, skip = 2) +#{ +# ## Determine the version of the FlowCAM +# ncol <- length(read.table(lstfile, header = FALSE, sep = ":", dec = ".", +# skip = skip, nrows = 1)) +# if (ncol <= 44) { +# ## FlowCAM II with 44 columns +# ## Read the table +# tab <- read.table(lstfile, header = FALSE, sep = ":", dec = '.', +# col.names = c("Id", "FIT_Cal_Const", "FIT_Raw_Area", +# "FIT_Raw_Feret_Max", "FIT_Raw_Feret_Min", "FIT_Raw_Feret_Mean", +# "FIT_Raw_Perim", "FIT_Raw_Convex_Perim", "FIT_Area_ABD", +# "FIT_Diameter_ABD", "FIT_Length", "FIT_Width", +# "FIT_Diameter_ESD", "FIT_Perimeter", "FIT_Convex_Perimeter", +# "FIT_Intensity", "FIT_Sigma_Intensity", "FIT_Compactness", +# "FIT_Elongation", "FIT_Sum_Intensity", "FIT_Roughness", +# "FIT_Feret_Max_Angle", "FIT_Avg_Red", "FIT_Avg_Green", +# "FIT_Avg_Blue", "FIT_PPC", "FIT_Ch1_Peak", "FIT_Ch1_TOF", +# "FIT_Ch2_Peak", "FIT_Ch2_TOF", "FIT_Ch3_Peak", "FIT_Ch3_TOF", +# "FIT_Ch4_Peak", "FIT_Ch4_TOF", "FIT_Filename", "FIT_SaveX", +# "FIT_SaveY", "FIT_PixelW", "FIT_PixelH", "FIT_CaptureX", +# "FIT_CaptureY", "FIT_High_U32", "FIT_Low_U32", "FIT_Total"), +# skip = skip) +# ## Add columns present in list files from FlowCAM III +# tab$FIT_Feret_Min_Angle <- NA +# tab$FIT_Edge_Gradient <- NA +# tab$FIT_Timestamp1 <- NA +# tab$FIT_Timestamp2 <- NA +# tab$FIT_Source_Image <- NA +# tab$FIT_Calibration_Image <- NA +# tab$FIT_Ch2_Ch1_Ratio <- tab$FIT_Ch2_Peak / tab$FIT_Ch1_Peak +# ## New variables calc (present in dataexport.csv from the FlowCAM) +# tab$FIT_Volume_ABD <- (4/3) * pi * (tab$FIT_Diameter_ABD/2)^3 +# tab$FIT_Volume_ESD <- (4/3) * pi * (tab$FIT_Diameter_ESD/2)^3 +# tab$FIT_Aspect_Ratio <- tab$FIT_Width / tab$FIT_Length +# tab$FIT_Transparency <- 1 - (tab$FIT_Diameter_ABD/tab$FIT_Diameter_ESD) +# tab$FIT_Red_Green_Ratio <- tab$FIT_Avg_Red / tab$FIT_Avg_Green +# tab$FIT_Blue_Green_Ratio <- tab$FIT_Avg_Blue / tab$FIT_Avg_Green +# tab$FIT_Red_Blue_Ratio <- tab$FIT_Avg_Red / tab$FIT_Avg_Blue +# } else { # FlowCAM III with 47 columns +# ## Read the table +# tab <- read.table(lstfile, header = FALSE, sep = ":", dec = '.', +# col.names = c("Id", "FIT_Cal_Const", "FIT_Raw_Area", +# "FIT_Raw_Feret_Max", "FIT_Raw_Feret_Min", "FIT_Raw_Feret_Mean", +# "FIT_Raw_Perim", "FIT_Raw_Convex_Perim", "FIT_Area_ABD", +# "FIT_Diameter_ABD", "FIT_Length", "FIT_Width", +# "FIT_Diameter_ESD", "FIT_Perimeter", "FIT_Convex_Perimeter", +# "FIT_Intensity", "FIT_Sigma_Intensity", "FIT_Compactness", +# "FIT_Elongation", "FIT_Sum_Intensity", "FIT_Roughness", +# "FIT_Feret_Max_Angle", "FIT_Feret_Min_Angle", "FIT_Avg_Red", +# "FIT_Avg_Green", "FIT_Avg_Blue", "FIT_PPC", "FIT_Ch1_Peak", +# "FIT_Ch1_TOF", "FIT_Ch2_Peak", "FIT_Ch2_TOF", "FIT_Ch3_Peak", +# "FIT_Ch3_TOF", "FIT_Ch4_Peak", "FIT_Ch4_TOF", "FIT_Filename", +# "FIT_SaveX", "FIT_SaveY", "FIT_PixelW", "FIT_PixelH", +# "FIT_CaptureX", "FIT_CaptureY", "FIT_Edge_Gradient", +# "FIT_Timestamp1", "FIT_Timestamp2", "FIT_Source_Image", +# "FIT_Calibration_Image"), +# skip = skip) +# ## Add columns present in list files from FlowCAM II +# tab$FIT_High_U32 <- NA +# tab$FIT_Low_U32 <- NA +# tab$FIT_Total <- NA +# ## New variables calcul (present in dataexport.csv from the FlowCAM) +# tab$FIT_Volume_ABD <- (4/3) * pi * (tab$FIT_Diameter_ABD/2)^3 +# tab$FIT_Volume_ESD <- (4/3) * pi * (tab$FIT_Diameter_ESD/2)^3 +# tab$FIT_Aspect_Ratio <- tab$FIT_Width / tab$FIT_Length +# tab$FIT_Transparency <- 1 - (tab$FIT_Diameter_ABD/tab$FIT_Diameter_ESD) +# tab$FIT_Red_Green_Ratio <- tab$FIT_Avg_Red / tab$FIT_Avg_Green +# tab$FIT_Blue_Green_Ratio <- tab$FIT_Avg_Blue / tab$FIT_Avg_Green +# tab$FIT_Red_Blue_Ratio <- tab$FIT_Avg_Red / tab$FIT_Avg_Blue +# tab$FIT_Ch2_Ch1_Ratio <- tab$FIT_Ch2_Peak / tab$FIT_Ch1_Peak +# } +# tab +#} ## Read context file ## TODO: avoid duplicated code between versions Modified: pkg/zooimage/man/import.Rd =================================================================== --- pkg/zooimage/man/import.Rd 2013-12-01 14:04:02 UTC (rev 243) +++ pkg/zooimage/man/import.Rd 2013-12-10 11:07:44 UTC (rev 244) [TRUNCATED] To get the complete diff run: svnlook diff /svnroot/zooimage -r 244