read.imagene <- function(files,path=NULL,ext=NULL,names=NULL,columns=NULL,other.columns=NULL,wt.fun=NULL,verbose=TRUE,sep="\t",quote="\"",...) {
# Extracts an RG list from a series of Imagene analysis output files.
# Imagene requires special treatment because red and green channel
# intensities are in different files.
# Gordon Smyth
# 14 Aug 2003. Last modified 30 Dec 2006.
if(is.null(dim(files))) {
if(length(files)%%2==0)
files <- matrix(files, ncol=2, byrow=TRUE)
else
stop("Odd number of files: should be two data files for each array")
} else {
files <- as.matrix(files)
if(ncol(files) != 2) stop("Need a two column matrix of file names")
}
if(!is.null(ext)) files <- array(paste(files,ext,sep="."),dim(files))
narrays <- nrow(files)
if(is.null(names)) names <- paste(removeExt(files[,1]),removeExt(files[,2]),sep=".")
# Read header information from first file to get nspots
fullname <- files[1,1]
if(!is.null(path)) fullname <- file.path(path,fullname)
headers <- readImaGeneHeader(fullname)
if(verbose) cat("Read header information\n")
skip <- headers$NHeaderRecords
FD <- headers$"Field Dimensions"
if(is.null(FD)) stop("Can't find Field Dimensions in ImaGene header")
nspots <- sum(apply(FD,1,prod))
# Set signal and background estimation method
if(is.null(columns)) {
SM <- headers$"Measurement parameters"$"Segmentation Method"
if(is.null(SM)) SM <- "none"
if(SM=="auto")
columns <- list(f="Signal Mean",b="Background Mean")
else
columns <- list(f="Signal Mean",b="Background Median")
}
if(is.null(columns$f) || is.null(columns$b)) stop("'columns' should have components 'f' and 'b'")
# Initialize data object
Y <- matrix(0,nspots,narrays)
colnames(Y) <- names
RG <- list(R=Y,G=Y,Rb=Y,Gb=Y,source="imagene",Field.Dimensions=FD)
if(!is.null(wt.fun)) RG$weights <- Y
# Other columns
if(!is.null(other.columns)) {
other.columns <- as.character(other.columns)
if(length(other.columns)) {
RG$other <- list()
G.other.columns <- paste("G",other.columns)
colnames(Y) <- removeExt(files[,1])
for (a in G.other.columns) RG$other[[a]] <- Y
R.other.columns <- paste("R",other.columns)
colnames(Y) <- removeExt(files[,2])
for (a in R.other.columns) RG$other[[a]] <- Y
} else {
other.columns <- NULL
}
}
printer <- list(ngrid.r=FD[1,"Metarows"],ngrid.c=FD[1,"Metacols"],nspot.r=FD[1,"Rows"],nspot.c=FD[1,"Cols"])
if(nrow(FD)==1) {
RG$printer <- printer
} else {
printer$ngrid.r <- sum(FD[,"Metarows"])
if(all(printer$ngrid.c==FD[,"Metacols"]) &&
all(printer$nspot.r==FD[,"Rows"]) &&
all(printer$nspot.c==FD[,"Cols"]) ) RG$printer <- printer
}
# Now read data
for (i in 1:narrays) {
# Green channel
fullname <- files[i,1]
if(!is.null(path)) fullname <- file.path(path,fullname)
if(i > 1) {
headers <- readImaGeneHeader(fullname)
if(any(headers[["Field Dimensions"]] != RG$Field.Dimensions))
stop(paste("Field dimensions of array",i,"not same as those of first array"))
skip <- headers$NHeaderRecords
}
obj<- read.table(fullname,skip=skip,header=TRUE,sep=sep,quote=quote,check.names=FALSE,comment.char="",fill=TRUE,nrows=nspots,...)
if(verbose) cat(paste("Read",fullname,"\n"))
if(i==1) RG$genes <- obj[,c("Field","Meta Row","Meta Column","Row","Column","Gene ID")]
RG$G[,i] <- obj[,columns$f]
RG$Gb[,i] <- obj[,columns$b]
if(!is.null(other.columns)) {
for (j in 1:length(other.columns)) RG$other[[G.other.columns[j]]][,i] <- obj[,other.columns[j]]
}
# Red channel
fullname <- files[i,2]
if(!is.null(path)) fullname <- file.path(path,fullname)
obj<- read.table(fullname,skip=skip,header=TRUE,sep=sep,quote=quote,check.names=FALSE,comment.char="",fill=TRUE,nrows=nspots,...)
if(verbose) cat(paste("Read",fullname,"\n"))
RG$R[,i] <- obj[,columns$f]
RG$Rb[,i] <- obj[,columns$b]
if(!is.null(wt.fun)) RG$weights[,i] <- wt.fun(obj)
if(!is.null(other.columns)) {
for (j in 1:length(other.columns)) RG$other[[R.other.columns[j]]][,i] <- obj[,other.columns[j]]
}
}
new("RGList",RG)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.