[Zooimage-commits] r242 - in pkg: zooimage/R zooimageJ zooimageJ/R zooimageJ/inst/java zooimageJ/inst/java/plugins

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Sun Sep 15 22:08:52 CEST 2013


Author: phgrosjean
Date: 2013-09-15 22:08:52 +0200 (Sun, 15 Sep 2013)
New Revision: 242

Added:
   pkg/zooimage/R/import.R
   pkg/zooimageJ/ij-1.42n.jar.old.jar
   pkg/zooimageJ/inst/java/plugins/zooimage_plugins.jar
Modified:
   pkg/zooimage/R/zim.R
   pkg/zooimageJ/R/ImageJ.R
   pkg/zooimageJ/R/zooimageJ-internal.R
   pkg/zooimageJ/inst/java/ij.jar
Log:
Import in zooimage and further workk on ZooImageJ

Added: pkg/zooimage/R/import.R
===================================================================
--- pkg/zooimage/R/import.R	                        (rev 0)
+++ pkg/zooimage/R/import.R	2013-09-15 20:08:52 UTC (rev 242)
@@ -0,0 +1,291 @@
+## ZooImage >= 3 importation routines
+
+#### Importation of FlowCAM data without image reanalysis ######################
+## Read a FlowCAM .ctx file
+readFlowCAMctx <- function (ctx, stop.it = TRUE)
+{
+	## Check arguments
+	stop.it <- isTRUE(as.logical(stop.it))
+	## ctx must be an existing file
+	if (!file.exists(ctx))
+		if (stop.it)
+			stop("'ctx' must be an existing (.ctx) file") else return(NULL)
+	
+	## Read .ctx data
+	dat <- scan(ctx, what = character(), sep = "\t", skip = 0,
+		blank.lines.skip = TRUE, flush = TRUE, quiet = TRUE, comment.char = "")
+	
+	## This is an .ini format
+	V <- parseIni(dat, label = "")
+	
+	## Rework a few fields
+	
+	## Strings are imported as factors, but we really want characters
+	factorsAsStrings <- function (x)
+		as.data.frame(lapply(x, function (x)
+		if (is.factor(x)) as.character(x) else x), stringsAsFactors = FALSE)
+	V <- lapply(V, factorsAsStrings)
+	
+	## Empty strings are imported as logical with NA value
+	logicalNaAsStrings <- function (x)
+		as.data.frame(lapply(x, function (x)
+		if (is.logical(x) && is.na(x)) "" else x), stringsAsFactors = FALSE)
+	V <- lapply(V, logicalNaAsStrings)
+	
+	## Special conversion into POSIXct for $General$RunStartTime and $RunEndTime
+	V$General$RunStartTime <- as.POSIXct(V$General$RunStartTime)
+	V$General$RunEndTime <- as.POSIXct(V$General$RunEndTime)
+	
+	## We need these keys that may not be present in old .ctx files	
+	if (is.null(V$Fluid$TotalVolumeML)) {
+		## Volume calculation
+		Height <- (V$CaptureRegion$AcceptableBottom -
+			V$CaptureRegion$AcceptableTop) * V$Fluid$CalibConstant
+		Width <- (V$CaptureRegion$AcceptableRight -
+			V$CaptureRegion$AcceptableLeft) * V$Fluid$CalibConstant
+		Area <- Height * Width
+		## Volume of one image
+		Volume <- (Area / (1e8)) * (V$Fluid$FlowCellDepth / 10000) # mL
+		V$Fluid$TotalVolumeML <- Volume * V$CaptureStats$RawImageTotal
+	}
+
+	## This is missing in 1.5.14, but can be calculated
+	if (is.null(V$CameraBehavior$AutoImageRate))
+		V$CameraBehavior$AutoImageRate <- V$CaptureStats$RawImageTotal /
+			V$CaptureStats$ImageCaptureTotal.Seconds
+	
+	## In 1.5.14, no distinction beween ThresholdDark and ThresholdLight
+	## So, copy Threshold to both of them
+	if (!is.null(V$CaptureParameters$Threshold) &&
+		is.null(V$CaptureParameters$ThresholdDark)) {
+		V$CaptureParameters$ThresholdDark <- V$CaptureParameters$Threshold
+		V$CaptureParameters$ThresholdLight <- V$CaptureParameters$Threshold
+	}
+	
+	## In 1.5.14, no RecalibrationIntervalMinutes but SaveIntervalMinutes
+	V$Files$RecalibrationIntervalMinutes <- V$Files$SaveIntervalMinutes 
+	
+	## Calculated fields (wrong units or other problems)
+	mins <- V$RunTermination$MaxRunTimeMinutes
+	if (length(mins) == 0) mins <- 0
+	secs <- V$RunTermination$MaxRunTimeSeconds
+	if (length(secs) == 0) secs <- 0
+	V$RunTermination$MaxRunTime <- mins * 60 + secs
+	
+	## Return the resulting list
+	V	
+}
+
+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)
+
+## Read a flowCAM .lst file
+readFlowCAMlst <- function (lst, skip = 2, read.ctx = TRUE)
+{
+    ## Check arguments
+	## lst must be an existing file
+	if (!file.exists(lst))
+		stop("'lst' must be an existing (.lst) file")
+	## skip at least 2 rows, but for realtime, can skip more...
+	skip <- as.integer(skip)[1]
+	if (skip < 2) {
+		warning("'skip' cannot be lower than 2... fixed!")
+		skip <- 2
+	}
+	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))
+    
+	## 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
+    
+	} 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
+		
+    } else stop("Unrecognized FlowCAM format") # TODO: adapt for the new soft
+	
+	## New variables calculation (present in export .csv from the FlowCAM)
+	## Code already checked
+    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
+    
+    ## Try to extract metadata from .ctx file, if it exists
+    ctx <- sub("\\.lst$", ".ctx", lst)
+	if (read.ctx && file.exists(ctx)) {
+		ctxData <- readFlowCAMctx(ctx)
+		## TODO: return data in correct ZooImage format directly
+		attr(tab, "FlowCAM.metadata") <- ctxData
+    }
+	
+    tab
+}
+
+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)
+
+## Temporary name!
+importFlowCAM <- function (lst)
+{
+	dat <- readFlowCAMlst(lst, skip = 2, read.ctx = TRUE)
+	## Check results
+	if (!is.data.frame(dat) && NROW(dat) < 1)
+		stop("Problem while importing FlowCAM data, or empty series")
+	if (is.null(attr(dat, "FlowCAM.metadata")))
+		stop("Problem while importing FlowCAM metadata from the .ctx file")
+	
+	## Create metadata from FlowCAM.metadatata
+	## TODO...
+	
+	## ImportVignettes
+	require(tiff)
+	require(png)
+	
+	## List all tiff files in the directory (but exclude masks with _bin.tif)
+	sampledir <- dirname(lst)
+	odir <- setwd(sampledir)
+	on.exit(setwd(odir))
+	
+	## Make sure zidbdir exists and is empty
+	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!")
+	dir.create(zidbdir, recursive = TRUE, showWarnings = FALSE)
+	
+	tif <- dir(sampledir, pattern = "[0-9]\\.tif$", full.names = FALSE)
+	## Separate the list into collages and background calibration images
+	isCal <- grepl("^.*cal_image_[0-9]+\\.tif$", tif)
+	calFiles <- tif[isCal]
+	colFiles <- tif[!isCal]
+	## Check we have at least one image for each set
+	if (length(calFiles) == 0)
+		stop("No background calibration image found")
+	if (length(colFiles) == 0)
+		stop("No collages found")
+		
+	## Read all background calibration images into a list
+	cals <- list()
+	for (i in 1:length(calFiles))
+		cals[[i]] <- readTIFF(source = calFiles[i])
+	
+	## Read collages one by one and extract vignettes from them,
+	## using information gathered into dat
+	colFile <- "" # File of current collage
+	## Since R indexing starts at 1 but FlowCAM pixel indexing starts at 0,
+	## add one where it is required
+	dat1 <- dat
+	dat1$FIT_SaveX <- dat$FIT_SaveX + 1
+	dat1$FIT_SaveY <- dat$FIT_SaveY + 1
+	dat1$FIT_CaptureX <- dat$FIT_CaptureX + 1
+	dat1$FIT_CaptureY <- dat$FIT_CaptureY + 1
+	
+	## Extract a submatrix, given coordinates X1, Y1, X2, Y2
+	crop <- function (mat, coords)
+		mat[coords[2]:coords[4], coords[1]:coords[3]]
+	
+	## 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
+	
+	## 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) {
+			filename <- as.character(d$FIT_Filename)
+			collage <- readTIFF(source = filename)
+			colFile <- d$FIT_Filename
+			colFiles <- colFiles[colFiles != filename]
+		}
+		
+		## Get coordinates of the vignette in that collage
+		size <- c(d$FIT_PixelW, d$FIT_PixelH) - 1 # Still the problem of 0 vs 1
+		colCoords <- c(d$FIT_SaveX, d$FIT_SaveY)
+		colCoords <- c(colCoords, colCoords + size)
+		calCoords <- c(d$FIT_CaptureX, d$FIT_CaptureY)
+		calCoords <- c(calCoords, calCoords + size)
+			
+		## Extract the vignette and corresponding background from the collage
+		vig <- crop(collage, colCoords)
+		back <- crop(cals[[d$FIT_Calibration_Image]], calCoords)
+		
+		## Substract background and save vignette
+		vig2 <- 1 + vig - back - gray
+		vig2[vig2 > 1] <- 1
+		vig2[vig2 < 0] <- 0
+		
+		## Write this vignette
+		vigFile <- file.path(zidbdir,
+			sub("\\.tif$", paste0("_", i, ".png"), filename))
+		writePNG(image = vig2, target =  vigFile)
+	}
+	
+	## Create zidb
+	## TODO...
+}
+
+## 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)
+
+## 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)

Modified: pkg/zooimage/R/zim.R
===================================================================
--- pkg/zooimage/R/zim.R	2013-02-12 19:57:00 UTC (rev 241)
+++ pkg/zooimage/R/zim.R	2013-09-15 20:08:52 UTC (rev 242)
@@ -281,7 +281,7 @@
 		zimVerify(zimfiles[item]) >= 0
 	}
 	## Batch process all files
-	message("Compression of images...")
+	message("Extraction of ZooImage metadata (.zim) from compressed .zip images...")
 	flush.console()
 	ok <- batch(items, fun = zimExtract, zipfiles = zipfiles,
 		zimfiles = zimfiles, verbose = FALSE)

Modified: pkg/zooimageJ/R/ImageJ.R
===================================================================
--- pkg/zooimageJ/R/ImageJ.R	2013-02-12 19:57:00 UTC (rev 241)
+++ pkg/zooimageJ/R/ImageJ.R	2013-09-15 20:08:52 UTC (rev 242)
@@ -1,4 +1,5 @@
-delayedAssign("ImageJ", {
-	res <- try(.jnew("ij/ImageJ"), silent = TRUE)
-	if (inherits(res, "try-error")) NULL else res
-})
+#delayedAssign("ImageJ", {
+#	res <- try(.jnew("ij/ImageJ"), silent = TRUE)
+#	if (inherits(res, "try-error")) NULL else res
+#})
+delayedAssign("ImageJ", .jnew("ij/ImageJ"))

Modified: pkg/zooimageJ/R/zooimageJ-internal.R
===================================================================
--- pkg/zooimageJ/R/zooimageJ-internal.R	2013-02-12 19:57:00 UTC (rev 241)
+++ pkg/zooimageJ/R/zooimageJ-internal.R	2013-09-15 20:08:52 UTC (rev 242)
@@ -9,7 +9,7 @@
 	#       rely on genericDialog still do not work. The only solution I [PhG]
 	#       have found until now is to start RImageJ from within JGR.
 	.jpackage(pkgname)
-	if (!is.null(ImageJ)) ImageJ$show()
+#	if (!is.null(ImageJ)) ImageJ$show()
 	packageStartupMessage("ImageJ version: ", IJ$getVersion(), "\n", sep = "")
 }
 

Added: pkg/zooimageJ/ij-1.42n.jar.old.jar
===================================================================
(Binary files differ)


Property changes on: pkg/zooimageJ/ij-1.42n.jar.old.jar
___________________________________________________________________
Added: svn:executable
   + *
Added: svn:mime-type
   + application/octet-stream

Modified: pkg/zooimageJ/inst/java/ij.jar
===================================================================
(Binary files differ)

Added: pkg/zooimageJ/inst/java/plugins/zooimage_plugins.jar
===================================================================
(Binary files differ)


Property changes on: pkg/zooimageJ/inst/java/plugins/zooimage_plugins.jar
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream



More information about the Zooimage-commits mailing list