setValidity("CopyNumberSet", function(object) {
	##msg <- validMsg(NULL, Biobase:::isValidVersion(object, "CopyNumberSet"))
	msg <- validMsg(NULL, assayDataValidMembers(assayData(object), c("CA", "CB")))
	if (is.null(msg)) TRUE else msg
})
setMethod("CA", "CopyNumberSet", function(object) assayData(object)[["CA"]])
setMethod("CB", "CopyNumberSet", function(object) assayData(object)[["CB"]])
setReplaceMethod("CB", signature(object="CopyNumberSet", value="matrix"),
		 function(object, value) assayDataElementReplace(object, "CB", value))
setReplaceMethod("CA", signature(object="CopyNumberSet", value="matrix"),
		 function(object, value) assayDataElementReplace(object, "CA", value))

setMethod("chromosome", "CopyNumberSet", function(object) fData(object)$chromosome)
setMethod("position", "CopyNumberSet", function(object) fData(object)$position)

setMethod("copyNumber", "CopyNumberSet", function(object){
	##ensure that 2 + NA = 2 by replacing NA's with zero
	CA <- CA(object)
	CB <- CB(object)
	nas <- is.na(CA) & is.na(CB)
	CA[is.na(CA)] <- 0
	CB[is.na(CB)] <- 0
	CN <- CA/100 + CB/100
	##if both CA and CB are NA, report NA
	CN[nas] <- NA
	CN
})

##setMethod("ellipse", "CopyNumberSet", function(x, copynumber, ...){
ellipse.CopyNumberSet <- function(x, copynumber, ...){
	##fittedOrder <- unique(sapply(basename(celFiles), function(x) strsplit(x, "_")[[1]][2]))
	##index <- match(plates, fittedOrder)
	if(nrow(x) > 1) stop("only 1 snp at a time")
	batch <- unique(x$batch)
	if(length(batch) > 1) stop("batch variable not unique")
	nuA <- as.numeric(fData(x)[, match(paste("nuA", batch, sep="_"), fvarLabels(x))])
	nuB <- as.numeric(fData(x)[, match(paste("nuB", batch, sep="_"), fvarLabels(x))])	
	phiA <- as.numeric(fData(x)[, match(paste("phiA", batch, sep="_"), fvarLabels(x))])
	phiB <- as.numeric(fData(x)[, match(paste("phiB", batch, sep="_"), fvarLabels(x))])	
	tau2A <- as.numeric(fData(x)[, match(paste("tau2A", batch, sep="_"), fvarLabels(x))])
	tau2B <- as.numeric(fData(x)[, match(paste("tau2B", batch, sep="_"), fvarLabels(x))])
	sig2A <- as.numeric(fData(x)[, match(paste("sig2A", batch, sep="_"), fvarLabels(x))])
	sig2B <- as.numeric(fData(x)[, match(paste("sig2B", batch, sep="_"), fvarLabels(x))])
	corrA.BB <- as.numeric(fData(x)[, match(paste("corrA.BB", batch, sep="_"), fvarLabels(x))])
	corrB.AA <- as.numeric(fData(x)[, match(paste("corrB.AA", batch, sep="_"), fvarLabels(x))])
	corr <- as.numeric(fData(x)[, match(paste("corr", batch, sep="_"), fvarLabels(x))])
	for(CN in copynumber){
		for(CA in 0:CN){
			CB <- CN-CA
			A.scale <- sqrt(tau2A*(CA==0) + sig2A*(CA > 0))
			B.scale <- sqrt(tau2B*(CB==0) + sig2B*(CB > 0))
			scale <- c(A.scale, B.scale)
			if(CA == 0 & CB > 0) rho <- corrA.BB
			if(CA > 0 & CB == 0) rho <- corrB.AA
			if(CA > 0 & CB > 0) rho <- corr
			lines(ellipse(x=rho, centre=c(log2(nuA+CA*phiA),
					     log2(nuB+CB*phiB)),
				      scale=scale), ...)
		}
	}
}