Nothing
      cghCall2maximumSubset <- function(CNdata, featuresAndWeights, chr, bpstart, bpend, ncpus=1, verbose=TRUE){
   	############################################################################
	# function shrinks cghCall-object to a subset of the features
	############################################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if (as.character(class(CNdata)) != "cghCall"){ stop("CNdata not of class cghCall.") }
	# if (!(as.character(class(featureSubset))=="numeric" | as.character(class(featureSubset))=="integer" )){ stop("featureSubset of wrong class.") }
	# if (!(as.character(class(weights))=="numeric" | as.character(class(weights))=="integer" )){ stop("weights of wrong class.") }
	# if ( !(length(featureSubset) >= 1) ){ stop("featureSubset contains no row numbers.") }
	# if ( !(min(featureSubset) >= 1 | max(featureSubset) <= nrow(fData(CNdata))) ){ stop("featureSubset contains illegal row numbers.") }
	# if ( length(featureSubset) != length(weights) ){ stop("featureSubset and weights of unequal length.") }
	if (!(as.character(class(chr))=="numeric" | as.character(class(chr))=="integer" )){ stop("chr of wrong class.") }
	if (length(chr) != 1){ stop("chr of wrong length.") }
	if ( !(chr >= 1 | chr <= ncol(fData(CNdata))) ){ stop("chr exceeds number of columns in featureData.") }
	if (!(as.character(class(bpstart))=="numeric" | as.character(class(bpstart))=="integer" )){ stop("bpstart of wrong class.") }
	if (length(bpstart) != 1){ stop("bpstart of wrong length.") }
	if ( !(bpstart >= 1 | bpstart <= ncol(fData(CNdata))) ){ stop("bpstart exceeds number of columns in featureData.") }
	if (!(as.character(class(bpend))=="numeric" | as.character(class(bpend))=="integer" )){ stop("bpend of wrong class.") }
	if (length(bpend) != 1){ stop("bpend of wrong length.") }
	if ( !(bpend >= 1 | chr <= ncol(fData(CNdata))) ){ stop("bpend exceeds number of columns in featureData.") }
	# disecting the cghCall-object
	amplifications <- FALSE
	copynumberMat <- CGHbase::copynumber(CNdata)
	segmentedMat <- CGHbase::segmented(CNdata)
	problossMat <- CGHbase::probloss(CNdata)
	probnormMat <- CGHbase::probnorm(CNdata)
	probgainMat <- CGHbase::probgain(CNdata)
	if (!is.null(CGHbase::probamp(CNdata))){ probampMat <- CGHbase::probamp(CNdata); amplifications <- TRUE }
	if (!is.null(CGHbase::probdloss(CNdata))){ probdlossMat <- CGHbase::probdloss(CNdata); doubleLoss <- TRUE }
	CNann <- fData(CNdata)
	rm(CNdata)
	gc()
	# identify maximum deviating features
	if (verbose){ cat("identify maximum deviating features ...", "\n") }
	if (ncpus == 1){ idMat <- t(sapply(featuresAndWeights, .slhFuncMaxCGHcallData, segmentedMat, simplify=TRUE)) }
	if (ncpus > 1){ 
		sfInit(parallel=TRUE, cpus=ncpus)
		sfLibrary(package="sigaR", verbose=FALSE, character.only=TRUE)
		idMat <- t(sfSapply(featuresAndWeights, .slhFuncMaxCGHcallData, segmentedMat, simplify=TRUE)) 
	}
	# subsetting of segmented data
	if (verbose){ cat("generate subsetted matrices ...", "\n") }
	if (ncpus == 1){ copynumberMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, copynumberMat, simplify=TRUE)) }
	if (ncpus > 1){ copynumberMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, copynumberMat, simplify=TRUE)) }
	if (ncpus == 1){ segmentedMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, segmentedMat, simplify=TRUE)) }
	if (ncpus > 1){ segmentedMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, segmentedMat, simplify=TRUE)) }
	if (ncpus == 1){ problossMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, problossMat, simplify=TRUE)) }
	if (ncpus > 1){ problossMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, problossMat, simplify=TRUE)) }
	if (ncpus == 1){ probnormMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probnormMat, simplify=TRUE)) }
	if (ncpus > 1){ probnormMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probnormMat, simplify=TRUE)) }
	if (ncpus == 1){ probgainMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probgainMat, simplify=TRUE)) }
	if (ncpus > 1){ probgainMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probgainMat, simplify=TRUE)) }
	if (amplifications){ 
		if (ncpus == 1){ probampMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probampMat, simplify=TRUE)) }
		if (ncpus > 1){ probampMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probampMat, simplify=TRUE)) }
	}
	if (doubleLoss){ 
		if (ncpus == 1){ probdlossMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probdlossMat, simplify=TRUE)) }
		if (ncpus > 1){ probdlossMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probdlossMat, simplify=TRUE)) }
	}
	# subsetting of call data
	if (verbose){ cat("generate subsetted call matrices ...", "\n")	}
	callsMat <- numeric()
	for (i in 1:ncol(problossMat)){
		if (!amplifications & !doubleLoss){
			if (ncpus == 1){ callsMat <- cbind(callsMat, apply(cbind(problossMat[,i], probnormMat[,i], probgainMat[,i]), 1, which.max) - 2) }
			if (ncpus > 1){ callsMat <- cbind(callsMat, sfApply(cbind(problossMat[,i], probnormMat[,i], probgainMat[,i]), 1, which.max) - 2) }
		} 
		if (amplifications & !doubleLoss){
			if (ncpus == 1){ callsMat <- cbind(callsMat, apply(cbind(problossMat[,i], probnormMat[,i], probgainMat[,i], probampMat[,i]), 1, which.max) - 2) }
			if (ncpus > 1){ callsMat <- cbind(callsMat, sfApply(cbind(problossMat[,i], probnormMat[,i], probgainMat[,i], probampMat[,i]), 1, which.max) - 2) }
		}
		if (!amplifications & doubleLoss){
			if (ncpus == 1){ callsMat <- cbind(callsMat, apply(cbind(probdlossMat[,i], problossMat[,i], probnormMat[,i], probgainMat[,i]), 1, which.max) - 3) }
			if (ncpus > 1){ callsMat <- cbind(callsMat, sfApply(cbind(probdlossMat[,i], problossMat[,i], probnormMat[,i], probgainMat[,i]), 1, which.max) - 3) }
		}
		if (amplifications & doubleLoss){
			if (ncpus == 1){ callsMat <- cbind(callsMat, apply(cbind(probdlossMat[,i], problossMat[,i], probnormMat[,i], probgainMat[,i], probampMat[,i]), 1, which.max) - 3) }
			if (ncpus > 1){ callsMat <- cbind(callsMat, sfApply(cbind(probdlossMat[,i], problossMat[,i], probnormMat[,i], probgainMat[,i], probampMat[,i]), 1, which.max) - 3) }
		}
	}	
	# weighted subsetting of annotation data
	if (verbose){ cat("reorganize annotation ...", "\n") }
	if (ncpus == 1){ annotation <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetAnnotation, CNann, chr, bpstart, bpend, simplify=TRUE)) }
	if (ncpus > 1){	annotation <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetAnnotation, CNann, chr, bpstart, bpend, simplify=TRUE)) }
	colnames(annotation) <- c("Chromosome", "Start", "End")
	if (ncpus == 1){ rownames(annotation) <- as.character(sapply(featuresAndWeights, .slhFuncCombineFeatureNames, rownames(CNann), simplify=TRUE)) }
	if (ncpus > 1){	rownames(annotation) <- as.character(sfSapply(featuresAndWeights, .slhFuncCombineFeatureNames, rownames(CNann), simplify=TRUE)) }
	if (length(rownames(annotation)) != length(unique(rownames(annotation)))){
		warning("modified feature names are returned")
		newRowNames <- rownames(annotation)
		slh <- rep(1, length(newRowNames))
		for (i in 1:length(unique(newRowNames))){
			ids <- which(newRowNames == unique(newRowNames)[i])
			slh[ids] <- 1:length(ids)
		}
		newRowNames <- paste(newRowNames, slh, sep="__")		
		rownames(annotation) <- newRowNames
	}
	fInfo <- new("AnnotatedDataFrame", data=data.frame(annotation), varMetadata=data.frame(labelDescription=c("Chromosome", "Start", "End")))
	if (ncpus > 1){ sfStop() }
	rownames(copynumberMat) <- rownames(annotation)
	rownames(segmentedMat) <- rownames(annotation)
	rownames(problossMat) <- rownames(annotation)
	rownames(probnormMat) <- rownames(annotation)
	rownames(probgainMat) <- rownames(annotation)
	rownames(callsMat) <- rownames(annotation)
	if (amplifications){ rownames(probampMat) <- rownames(annotation) }
	if (doubleLoss){ rownames(probdlossMat) <- rownames(annotation) }
	# make cghCall object
	if (verbose){ cat("merge into cghCall object ...", "\n") }
	if (!amplifications & !doubleLoss){ 
		CNdata <- new('cghCall', 
			copynumber = data.matrix(data.frame(copynumberMat, row.names=rownames(annotation))), 
			segmented = data.matrix(data.frame(segmentedMat, row.names=rownames(annotation))), 
			calls = data.matrix(data.frame(callsMat, row.names=rownames(annotation))), 
			probloss = data.matrix(data.frame(problossMat, row.names=rownames(annotation))), 
			probnorm = data.matrix(data.frame(probnormMat, row.names=rownames(annotation))), 
			probgain = data.matrix(data.frame(probgainMat, row.names=rownames(annotation))), 
			featureData = fInfo) 
	}
	if (amplifications & !doubleLoss){ 
		CNdata <- new('cghCall', 
			copynumber = data.matrix(data.frame(copynumberMat, row.names=rownames(annotation))), 
			segmented = data.matrix(data.frame(segmentedMat, row.names=rownames(annotation))), 
			calls = data.matrix(data.frame(callsMat, row.names=rownames(annotation))), 
			probloss = data.matrix(data.frame(problossMat, row.names=rownames(annotation))), 
			probnorm = data.matrix(data.frame(probnormMat, row.names=rownames(annotation))), 
			probgain = data.matrix(data.frame(probgainMat, row.names=rownames(annotation))), 
			probamp = data.matrix(data.frame(probampMat, row.names=rownames(annotation))), 
			featureData = fInfo) 
	}
	if (!amplifications & doubleLoss){ 
		CNdata <- new('cghCall', 
			copynumber = data.matrix(data.frame(copynumberMat, row.names=rownames(annotation))), 
			segmented = data.matrix(data.frame(segmentedMat, row.names=rownames(annotation))), 
			calls = data.matrix(data.frame(callsMat, row.names=rownames(annotation))), 
			probdloss = data.matrix(data.frame(probdlossMat, row.names=rownames(annotation))), 
			probloss = data.matrix(data.frame(problossMat, row.names=rownames(annotation))), 
			probnorm = data.matrix(data.frame(probnormMat, row.names=rownames(annotation))), 
			probgain = data.matrix(data.frame(probgainMat, row.names=rownames(annotation))), 
			featureData = fInfo) 
	}
	if (amplifications & doubleLoss){ 
		CNdata <- new('cghCall', 
			copynumber = data.matrix(data.frame(copynumberMat, row.names=rownames(annotation))), 
			segmented = data.matrix(data.frame(segmentedMat, row.names=rownames(annotation))), 
			calls = data.matrix(data.frame(callsMat, row.names=rownames(annotation))), 
			probdloss = data.matrix(data.frame(probdlossMat, row.names=rownames(annotation))), 
			probloss = data.matrix(data.frame(problossMat, row.names=rownames(annotation))), 
			probnorm = data.matrix(data.frame(probnormMat, row.names=rownames(annotation))), 
			probgain = data.matrix(data.frame(probgainMat, row.names=rownames(annotation))), 
			probamp = data.matrix(data.frame(probampMat, row.names=rownames(annotation))), 
			featureData = fInfo) 
	}
	return(CNdata)
}
cghCall2weightedSubset <- function(CNdata, featuresAndWeights, chr, bpstart, bpend, ncpus=1, verbose=TRUE){
   	############################################################################
	# function shrinks cghCall-object to a subset of the features
	############################################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if (as.character(class(CNdata)) != "cghCall"){ stop("CNdata not of class cghCall.") }
	# if (!(as.character(class(featureSubset))=="numeric" | as.character(class(featureSubset))=="integer" )){ stop("featureSubset of wrong class.") }
	# if (!(as.character(class(weights))=="numeric" | as.character(class(weights))=="integer" )){ stop("weights of wrong class.") }
	# if ( !(length(featureSubset) >= 1) ){ stop("featureSubset contains no row numbers.") }
	# if ( !(min(featureSubset) >= 1 | max(featureSubset) <= nrow(fData(CNdata))) ){ stop("featureSubset contains illegal row numbers.") }
	# if ( length(featureSubset) != length(weights) ){ stop("featureSubset and weights of unequal length.") }
	if (!(as.character(class(chr))=="numeric" | as.character(class(chr))=="integer" )){ stop("chr of wrong class.") }
	if (length(chr) != 1){ stop("chr of wrong length.") }
	if ( !(chr >= 1 | chr <= ncol(fData(CNdata))) ){ stop("chr exceeds number of columns in featureData.") }
	if (!(as.character(class(bpstart))=="numeric" | as.character(class(bpstart))=="integer" )){ stop("bpstart of wrong class.") }
	if (length(bpstart) != 1){ stop("bpstart of wrong length.") }
	if ( !(bpstart >= 1 | bpstart <= ncol(fData(CNdata))) ){ stop("bpstart exceeds number of columns in featureData.") }
	if (!(as.character(class(bpend))=="numeric" | as.character(class(bpend))=="integer" )){ stop("bpend of wrong class.") }
	if (length(bpend) != 1){ stop("bpend of wrong length.") }
	if ( !(bpend >= 1 | chr <= ncol(fData(CNdata))) ){ stop("bpend exceeds number of columns in featureData.") }
	# disecting the cghCall-object
	amplifications <- FALSE
	doubleLoss <- FALSE
	copynumberMat <- copynumber(CNdata)
	segmentedMat <- segmented(CNdata)
	problossMat <- probloss(CNdata)
	probnormMat <- probnorm(CNdata)
	probgainMat <- probgain(CNdata)
	if (!is.null(probamp(CNdata))){ probampMat <- probamp(CNdata); amplifications <- TRUE }
	if (!is.null(CGHbase::probdloss(CNdata))){ probdlossMat <- CGHbase::probdloss(CNdata); doubleLoss <- TRUE }
	CNann <- fData(CNdata)
	rm(CNdata)
	gc()
	# weighted subsetting of raw copy number data
	if (verbose){ cat("generate subsetted raw copy number matrix ...", "\n") }
	if (ncpus == 1){ copynumberMat <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, copynumberMat, simplify=TRUE))	}
	if (ncpus > 1){
		sfInit(parallel=TRUE, cpus=ncpus)
		sfLibrary(package="sigaR", verbose=FALSE, character.only=TRUE)
		copynumberMat <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, copynumberMat, simplify=TRUE))	
	}
	# weighted subsetting of segmented data
	if (verbose){ cat("generate subsetted segmented matrix ...", "\n") }
	if (ncpus == 1){ segmentedMat <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, segmentedMat, simplify=TRUE)) }
	if (ncpus > 1){ segmentedMat <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, segmentedMat, simplify=TRUE)) }
	# weighted subsetting of call probability data
	if (verbose){ cat("generate subsetted call probability matrices ...", "\n") }
	if (ncpus == 1){ problossMat <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, problossMat, simplify=TRUE)) }
	if (ncpus > 1){ problossMat <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, problossMat, simplify=TRUE)) }
	if (ncpus == 1){ probnormMat <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, probnormMat, simplify=TRUE)) }
	if (ncpus > 1){ probnormMat <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, probnormMat, simplify=TRUE)) }
	if (ncpus == 1){ probgainMat <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, probgainMat, simplify=TRUE)) }
	if (ncpus > 1){ probgainMat <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, probgainMat, simplify=TRUE)) }
	if (amplifications){ 
		if (ncpus == 1){ probampMat <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, probampMat, simplify=TRUE)) }
		if (ncpus > 1){ probampMat <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, probampMat, simplify=TRUE)) }
	}
	if (doubleLoss){ 
		if (ncpus == 1){ probdlossMat <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, probdlossMat, simplify=TRUE)) }
		if (ncpus > 1){ probdlossMat <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, probdlossMat, simplify=TRUE)) }
	}
	# subsetting of call data
	if (verbose){ cat("generate subsetted call matrices ...", "\n")	}
	callsMat <- numeric()
	for (i in 1:ncol(problossMat)){
		if (!amplifications & !doubleLoss){
			if (ncpus == 1){ callsMat <- cbind(callsMat, apply(cbind(problossMat[,i], probnormMat[,i], probgainMat[,i]), 1, which.max) - 2) }
			if (ncpus > 1){ callsMat <- cbind(callsMat, sfApply(cbind(problossMat[,i], probnormMat[,i], probgainMat[,i]), 1, which.max) - 2) }
		} 
		if (amplifications & !doubleLoss){
			if (ncpus == 1){ callsMat <- cbind(callsMat, apply(cbind(problossMat[,i], probnormMat[,i], probgainMat[,i], probampMat[,i]), 1, which.max) - 2) }
			if (ncpus > 1){ callsMat <- cbind(callsMat, sfApply(cbind(problossMat[,i], probnormMat[,i], probgainMat[,i], probampMat[,i]), 1, which.max) - 2) }
		}
		if (!amplifications & doubleLoss){
			if (ncpus == 1){ callsMat <- cbind(callsMat, apply(cbind(probdlossMat[,i], problossMat[,i], probnormMat[,i], probgainMat[,i]), 1, which.max) - 3) }
			if (ncpus > 1){ callsMat <- cbind(callsMat, sfApply(cbind(probdlossMat[,i], problossMat[,i], probnormMat[,i], probgainMat[,i]), 1, which.max) - 3) }
		}
		if (amplifications & doubleLoss){
			if (ncpus == 1){ callsMat <- cbind(callsMat, apply(cbind(probdlossMat[,i], problossMat[,i], probnormMat[,i], probgainMat[,i], probampMat[,i]), 1, which.max) - 3) }
			if (ncpus > 1){ callsMat <- cbind(callsMat, sfApply(cbind(probdlossMat[,i], problossMat[,i], probnormMat[,i], probgainMat[,i], probampMat[,i]), 1, which.max) - 3) }
		}
	}	
	# weighted subsetting of annotation data
	if (verbose){ cat("reorganize annotation ...", "\n") }
	if (ncpus == 1){ annotation <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetAnnotation, CNann, chr, bpstart, bpend, simplify=TRUE)) }
	if (ncpus > 1){	annotation <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetAnnotation, CNann, chr, bpstart, bpend, simplify=TRUE)) }
	colnames(annotation) <- c("Chromosome", "Start", "End")
	if (ncpus == 1){ rownames(annotation) <- as.character(sapply(featuresAndWeights, .slhFuncCombineFeatureNames, rownames(CNann), simplify=TRUE)) }
	if (ncpus > 1){	rownames(annotation) <- as.character(sfSapply(featuresAndWeights, .slhFuncCombineFeatureNames, rownames(CNann), simplify=TRUE)) }
	if (length(rownames(annotation)) != length(unique(rownames(annotation)))){
		warning("modified feature names are returned")
		newRowNames <- rownames(annotation)
		slh <- rep(1, length(newRowNames))
		for (i in 1:length(unique(newRowNames))){
			ids <- which(newRowNames == unique(newRowNames)[i])
			slh[ids] <- 1:length(ids)
		}
		newRowNames <- paste(newRowNames, slh, sep="__")		
		rownames(annotation) <- newRowNames
	}
	fInfo <- new("AnnotatedDataFrame", data=data.frame(annotation), varMetadata=data.frame(labelDescription=c("Chromosome", "Start", "End")))
	if (ncpus > 1){ sfStop() }
	rownames(copynumberMat) <- rownames(annotation)
	rownames(segmentedMat) <- rownames(annotation)
	rownames(problossMat) <- rownames(annotation)
	rownames(probnormMat) <- rownames(annotation)
	rownames(probgainMat) <- rownames(annotation)
	rownames(callsMat) <- rownames(annotation)
	if (amplifications){ rownames(probampMat) <- rownames(annotation) }
	if (doubleLoss){ rownames(probdlossMat) <- rownames(annotation) }
	# make cghCall object
	if (verbose){ cat("merge into cghCall object ...", "\n") }
	if (!amplifications & !doubleLoss){ 
		CNdata <- new('cghCall', 
			copynumber = data.matrix(data.frame(copynumberMat, row.names=rownames(annotation))), 
			segmented = data.matrix(data.frame(segmentedMat, row.names=rownames(annotation))), 
			calls = data.matrix(data.frame(callsMat, row.names=rownames(annotation))), 
			probloss = data.matrix(data.frame(problossMat, row.names=rownames(annotation))), 
			probnorm = data.matrix(data.frame(probnormMat, row.names=rownames(annotation))), 
			probgain = data.matrix(data.frame(probgainMat, row.names=rownames(annotation))), 
			featureData = fInfo) 
	}
	if (amplifications & !doubleLoss){ 
		CNdata <- new('cghCall', 
			copynumber = data.matrix(data.frame(copynumberMat, row.names=rownames(annotation))), 
			segmented = data.matrix(data.frame(segmentedMat, row.names=rownames(annotation))), 
			calls = data.matrix(data.frame(callsMat, row.names=rownames(annotation))), 
			probloss = data.matrix(data.frame(problossMat, row.names=rownames(annotation))), 
			probnorm = data.matrix(data.frame(probnormMat, row.names=rownames(annotation))), 
			probgain = data.matrix(data.frame(probgainMat, row.names=rownames(annotation))), 
			probamp = data.matrix(data.frame(probampMat, row.names=rownames(annotation))), 
			featureData = fInfo) 
	}
	if (!amplifications & doubleLoss){ 
		CNdata <- new('cghCall', 
			copynumber = data.matrix(data.frame(copynumberMat, row.names=rownames(annotation))), 
			segmented = data.matrix(data.frame(segmentedMat, row.names=rownames(annotation))), 
			calls = data.matrix(data.frame(callsMat, row.names=rownames(annotation))), 
			probdloss = data.matrix(data.frame(probdlossMat, row.names=rownames(annotation))), 
			probloss = data.matrix(data.frame(problossMat, row.names=rownames(annotation))), 
			probnorm = data.matrix(data.frame(probnormMat, row.names=rownames(annotation))), 
			probgain = data.matrix(data.frame(probgainMat, row.names=rownames(annotation))), 
			featureData = fInfo) 
	}
	if (amplifications & doubleLoss){ 
		CNdata <- new('cghCall', 
			copynumber = data.matrix(data.frame(copynumberMat, row.names=rownames(annotation))), 
			segmented = data.matrix(data.frame(segmentedMat, row.names=rownames(annotation))), 
			calls = data.matrix(data.frame(callsMat, row.names=rownames(annotation))), 
			probdloss = data.matrix(data.frame(probdlossMat, row.names=rownames(annotation))), 
			probloss = data.matrix(data.frame(problossMat, row.names=rownames(annotation))), 
			probnorm = data.matrix(data.frame(probnormMat, row.names=rownames(annotation))), 
			probgain = data.matrix(data.frame(probgainMat, row.names=rownames(annotation))), 
			probamp = data.matrix(data.frame(probampMat, row.names=rownames(annotation))), 
			featureData = fInfo) 
	}
	return(CNdata)
}
cghCall2maximumSubset <- function(CNdata, featuresAndWeights, chr, bpstart, bpend, ncpus=1, verbose=TRUE){
   	############################################################################
	# function shrinks cghCall-object to a subset of the features
	############################################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if (as.character(class(CNdata)) != "cghCall"){ stop("CNdata not of class cghCall.") }
	# if (!(as.character(class(featureSubset))=="numeric" | as.character(class(featureSubset))=="integer" )){ stop("featureSubset of wrong class.") }
	# if (!(as.character(class(weights))=="numeric" | as.character(class(weights))=="integer" )){ stop("weights of wrong class.") }
	# if ( !(length(featureSubset) >= 1) ){ stop("featureSubset contains no row numbers.") }
	# if ( !(min(featureSubset) >= 1 | max(featureSubset) <= nrow(fData(CNdata))) ){ stop("featureSubset contains illegal row numbers.") }
	# if ( length(featureSubset) != length(weights) ){ stop("featureSubset and weights of unequal length.") }
	if (!(as.character(class(chr))=="numeric" | as.character(class(chr))=="integer" )){ stop("chr of wrong class.") }
	if (length(chr) != 1){ stop("chr of wrong length.") }
	if ( !(chr >= 1 | chr <= ncol(fData(CNdata))) ){ stop("chr exceeds number of columns in featureData.") }
	if (!(as.character(class(bpstart))=="numeric" | as.character(class(bpstart))=="integer" )){ stop("bpstart of wrong class.") }
	if (length(bpstart) != 1){ stop("bpstart of wrong length.") }
	if ( !(bpstart >= 1 | bpstart <= ncol(fData(CNdata))) ){ stop("bpstart exceeds number of columns in featureData.") }
	if (!(as.character(class(bpend))=="numeric" | as.character(class(bpend))=="integer" )){ stop("bpend of wrong class.") }
	if (length(bpend) != 1){ stop("bpend of wrong length.") }
	if ( !(bpend >= 1 | chr <= ncol(fData(CNdata))) ){ stop("bpend exceeds number of columns in featureData.") }
	# disecting the cghCall-object
	amplifications <- FALSE
	copynumberMat <- copynumber(CNdata)
	segmentedMat <- segmented(CNdata)
	problossMat <- probloss(CNdata)
	probnormMat <- probnorm(CNdata)
	probgainMat <- probgain(CNdata)
	if (!is.null(probamp(CNdata))){ probampMat <- probamp(CNdata); amplifications <- TRUE }
	CNann <- fData(CNdata)
	rm(CNdata)
	gc()
	# identify maximum deviating features
	if (verbose){ cat("generate subsetted segmented matrix ...", "\n") }
	if (ncpus == 1){ idMat <- t(sapply(featuresAndWeights, .slhFuncMaxCGHcallData, segmentedMat, simplify=TRUE)) }
	if (ncpus > 1){ 
		sfInit(parallel=TRUE, cpus=ncpus)
		sfLibrary(package="sigaR", verbose=FALSE, character.only=TRUE)
		idMat <- t(sfSapply(featuresAndWeights, .slhFuncMaxCGHcallData, segmentedMat, simplify=TRUE)) 
	}
	# subsetting of segmented data
	if (ncpus == 1){ copynumberMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, copynumberMat, simplify=TRUE)) }
	if (ncpus > 1){ copynumberMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, copynumberMat, simplify=TRUE)) }
	if (ncpus == 1){ segmentedMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, segmentedMat, simplify=TRUE)) }
	if (ncpus > 1){ segmentedMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, segmentedMat, simplify=TRUE)) }
	if (ncpus == 1){ problossMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, problossMat, simplify=TRUE)) }
	if (ncpus > 1){ problossMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, problossMat, simplify=TRUE)) }
	if (ncpus == 1){ probnormMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probnormMat, simplify=TRUE)) }
	if (ncpus > 1){ probnormMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probnormMat, simplify=TRUE)) }
	if (ncpus == 1){ probgainMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probgainMat, simplify=TRUE)) }
	if (ncpus > 1){ probgainMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probgainMat, simplify=TRUE)) }
	if (amplifications){ 
		if (ncpus == 1){ probampMat <- t(sapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probampMat, simplify=TRUE)) }
		if (ncpus > 1){ probampMat <- t(sfSapply(1:nrow(idMat), .slhFunctMaxFeatures, featuresAndWeights, idMat, probampMat, simplify=TRUE)) }
	}
	# subsetting of call data
	if (verbose){ cat("generate subsetted call matrices ...", "\n")	}
	callsMat <- numeric()
	for (i in 1:ncol(problossMat)){
		if (!amplifications){
			if (ncpus == 1){ callsMat <- cbind(callsMat, apply(cbind(problossMat[,i], probnormMat[,i], probgainMat[,i]), 1, which.max) - 2) }
			if (ncpus > 1){ callsMat <- cbind(callsMat, sfApply(cbind(problossMat[,i], probnormMat[,i], probgainMat[,i]), 1, which.max) - 2) }
		} else {
			if (ncpus == 1){ callsMat <- cbind(callsMat, apply(cbind(problossMat[,i], probnormMat[,i], probgainMat[,i], probampMat[,i]), 1, which.max) - 2) }
			if (ncpus > 1){ callsMat <- cbind(callsMat, sfApply(cbind(problossMat[,i], probnormMat[,i], probgainMat[,i], probampMat[,i]), 1, which.max) - 2) }
		}
	}	
	# weighted subsetting of annotation data
	if (verbose){ cat("reorganize annotation ...", "\n") }
	if (ncpus == 1){ annotation <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetAnnotation, CNann, chr, bpstart, bpend, simplify=TRUE)) }
	if (ncpus > 1){	annotation <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetAnnotation, CNann, chr, bpstart, bpend, simplify=TRUE)) }
	colnames(annotation) <- c("Chromosome", "Start", "End")
	if (ncpus == 1){ rownames(annotation) <- as.character(sapply(featuresAndWeights, .slhFuncCombineFeatureNames, rownames(CNann), simplify=TRUE)) }
	if (ncpus > 1){	rownames(annotation) <- as.character(sfSapply(featuresAndWeights, .slhFuncCombineFeatureNames, rownames(CNann), simplify=TRUE)) }
	if (length(rownames(annotation)) != length(unique(rownames(annotation)))){
		warning("modified feature names are returned")
		newRowNames <- rownames(annotation)
		slh <- rep(1, length(newRowNames))
		for (i in 1:length(unique(newRowNames))){
			ids <- which(newRowNames == unique(newRowNames)[i])
			slh[ids] <- 1:length(ids)
		}
		newRowNames <- paste(newRowNames, slh, sep="__")		
		rownames(annotation) <- newRowNames
	}
	fInfo <- new("AnnotatedDataFrame", data=data.frame(annotation), varMetadata=data.frame(labelDescription=c("Chromosome", "Start", "End")))
	if (ncpus > 1){ sfStop() }
	rownames(copynumberMat) <- rownames(annotation)
	rownames(segmentedMat) <- rownames(annotation)
	rownames(problossMat) <- rownames(annotation)
	rownames(probnormMat) <- rownames(annotation)
	rownames(probgainMat) <- rownames(annotation)
	rownames(callsMat) <- rownames(annotation)
	if (amplifications){ rownames(probampMat) <- rownames(annotation) }
	# make cghCall object
	if (verbose){ cat("merge into cghCall object ...", "\n") }
	if (!amplifications){ 
		CNdata <- new('cghCall', 
			copynumber = data.matrix(data.frame(copynumberMat, row.names=rownames(annotation))), 
			segmented = data.matrix(data.frame(segmentedMat, row.names=rownames(annotation))), 
			calls = data.matrix(data.frame(callsMat, row.names=rownames(annotation))), 
			probloss = data.matrix(data.frame(problossMat, row.names=rownames(annotation))), 
			probnorm = data.matrix(data.frame(probnormMat, row.names=rownames(annotation))), 
			probgain = data.matrix(data.frame(probgainMat, row.names=rownames(annotation))), 
			featureData = fInfo) 
	} else { 
		CNdata <- new('cghCall', 
			copynumber = data.matrix(data.frame(copynumberMat, row.names=rownames(annotation))), 
			segmented = data.matrix(data.frame(segmentedMat, row.names=rownames(annotation))), 
			calls = data.matrix(data.frame(callsMat, row.names=rownames(annotation))), 
			probloss = data.matrix(data.frame(problossMat, row.names=rownames(annotation))), 
			probnorm = data.matrix(data.frame(probnormMat, row.names=rownames(annotation))), 
			probgain = data.matrix(data.frame(probgainMat, row.names=rownames(annotation))), 
			probamp = data.matrix(data.frame(probampMat, row.names=rownames(annotation))), 
			featureData = fInfo) 
	}
	return(CNdata)
}
cghCall2subset <- function(CNdata, featureSubset, verbose=TRUE){
   	############################################################################
	# function shrinks cghCall-object to a subset of the features
	############################################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if (as.character(class(CNdata)) != "cghCall"){ stop("CNdata not of class cghCall.") }
	if (!(as.character(class(featureSubset))=="numeric" | as.character(class(featureSubset))=="integer" )){ stop("featureSubset of wrong class.") }
	if ( !(length(featureSubset) >= 1) ){ stop("featureSubset contains no row numbers.") }
	if ( !(min(featureSubset) >= 1 | max(featureSubset) <= nrow(fData(CNdata))) ){ stop("featureSubset contains illegal row numbers.") }
	# sort out new annotation info
	fd <- fData(CNdata)[featureSubset, , drop=FALSE]
	newRowNames <- rownames(copynumber(CNdata))[featureSubset]
	if (length(newRowNames) != length(unique(newRowNames))){
		warning("modified feature names are returned")
		slh <- rep(1, length(newRowNames))
		for (i in 1:length(unique(newRowNames))){
			ids <- which(newRowNames == unique(newRowNames)[i])
			slh[ids] <- 1:length(ids)
		}
		newRowNames <- paste(newRowNames, slh, sep="__")		
	}
	rownames(fd) <- newRowNames
	# sNames <- sampleNames(CNdata)
	metaData <- data.frame(labelDescription=colnames(fd)) 
	fd <- new("AnnotatedDataFrame", data=data.frame(fd), varMetadata=metaData)
	if (is.null(CGHbase::probdloss(CNdata)[featureSubset, , drop=FALSE])){ 
		if (is.null(probamp(CNdata)[featureSubset, , drop=FALSE])){ 
			CNdata <- new('cghCall', 
				copynumber = data.matrix(data.frame(copynumber(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				segmented = data.matrix(data.frame(segmented(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				calls = data.matrix(data.frame(calls(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probloss = data.matrix(data.frame(probloss(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probnorm = data.matrix(data.frame(probnorm(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probgain = data.matrix(data.frame(probgain(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				featureData = fd) 
		} else { 
			CNdata <- new('cghCall', 
				copynumber = data.matrix(data.frame(copynumber(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				segmented = data.matrix(data.frame(segmented(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				calls = data.matrix(data.frame(calls(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probloss = data.matrix(data.frame(probloss(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probnorm = data.matrix(data.frame(probnorm(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probgain = data.matrix(data.frame(probgain(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probamp = data.matrix(data.frame(probamp(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				featureData = fd) 
		}
	} else {
		if (is.null(probamp(CNdata)[featureSubset, , drop=FALSE])){ 
			CNdata <- new('cghCall', 
				copynumber = data.matrix(data.frame(copynumber(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				segmented = data.matrix(data.frame(segmented(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				calls = data.matrix(data.frame(calls(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probdloss = data.matrix(data.frame(CGHbase::probdloss(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)),  
				probloss = data.matrix(data.frame(probloss(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)),
				probnorm = data.matrix(data.frame(probnorm(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probgain = data.matrix(data.frame(probgain(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				featureData = fd) 
		} else { 
			CNdata <- new('cghCall', 
				copynumber = data.matrix(data.frame(copynumber(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				segmented = data.matrix(data.frame(segmented(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				calls = data.matrix(data.frame(calls(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probdloss = data.matrix(data.frame(CGHbase::probdloss(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)),  
				probloss = data.matrix(data.frame(probloss(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probnorm = data.matrix(data.frame(probnorm(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probgain = data.matrix(data.frame(probgain(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				probamp = data.matrix(data.frame(probamp(CNdata)[featureSubset, , drop=FALSE], row.names=newRowNames)), 
				featureData = fd) 
		}		
	}
	return(CNdata)
}
merge2cghCalls <- function(CNdata1, CNdata2, verbose=TRUE){
   	############################################################################
	# function merges cghCall-objects into one cghCall-object
	############################################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if (as.character(class(CNdata1)) != "cghCall"){ stop("CNdata1 not of class cghCall.") }
	if (as.character(class(CNdata2)) != "cghCall"){ stop("CNdata2 not of class cghCall.") }
	if ( dim(CNdata1)[2] != dim(CNdata2)[2] ){ stop("CNdata1 and CNdata2 have an unequal number of samples.") }
	if ( dim(fData(CNdata1))[2] != dim(fData(CNdata2))[2] ){ stop("CNdata1 and CNdata2 have an unequal annotation columns.") }
	amp1 <- is.null(probamp(CNdata1))
	amp2 <- is.null(probamp(CNdata2))
	if (!(amp1 == amp2)){ stop("One of the cghCall-objects has amplification probabilities whereas the other has not.") }
	# prepare new annotation
	annotation <- rbind(fData(CNdata1), fData(CNdata2))
	newRowNames <- c(rownames(fData(CNdata1)), rownames(fData(CNdata2)))
	if (length(newRowNames) != length(unique(newRowNames))){
		warning("modified feature names are returned")
		slh <- rep(1, length(newRowNames))
		for (i in 1:length(unique(newRowNames))){
			ids <- which(newRowNames == unique(newRowNames)[i])
			slh[ids] <- 1:length(ids)
		}
		newRowNames <- paste(newRowNames, slh, sep="__")		
	}
	rownames(annotation) <- newRowNames
	metaData <- data.frame(labelDescription=colnames(annotation)) 
	annotation <- new("AnnotatedDataFrame", data=data.frame(annotation), varMetadata=metaData)
	if (is.null(CGHbase::probdloss(CNdata1))){ 
		if (is.null(probamp(CNdata1))){ 
			CNdata <- new('cghCall', 
				copynumber = data.matrix(data.frame(rbind(copynumber(CNdata1), copynumber(CNdata2)), row.names=newRowNames)), 
				segmented = data.matrix(data.frame(rbind(segmented(CNdata1), segmented(CNdata2)), row.names=newRowNames)), 
				calls = data.matrix(data.frame(rbind(calls(CNdata1), calls(CNdata2)), row.names=newRowNames)), 
				probloss = data.matrix(data.frame(rbind(probloss(CNdata1), probloss(CNdata2)), row.names=newRowNames)), 
				probnorm = data.matrix(data.frame(rbind(probnorm(CNdata1), probnorm(CNdata2)), row.names=newRowNames)), 
				probgain = data.matrix(data.frame(rbind(probgain(CNdata1), probgain(CNdata2)), row.names=newRowNames)), 
				featureData = annotation) 
		} else { 
			CNdata <- new('cghCall', 
				copynumber = data.matrix(data.frame(rbind(copynumber(CNdata1), copynumber(CNdata2)), row.names=newRowNames)), 
				segmented = data.matrix(data.frame(rbind(segmented(CNdata1), segmented(CNdata2)), row.names=newRowNames)), 
				calls = data.matrix(data.frame(rbind(calls(CNdata1), calls(CNdata2)), row.names=newRowNames)), 
				probloss = data.matrix(data.frame(rbind(probloss(CNdata1), probloss(CNdata2)), row.names=newRowNames)), 
				probnorm = data.matrix(data.frame(rbind(probnorm(CNdata1), probnorm(CNdata2)), row.names=newRowNames)), 
				probgain = data.matrix(data.frame(rbind(probgain(CNdata1), probgain(CNdata2)), row.names=newRowNames)), 
				probamp = data.matrix(data.frame(rbind(probamp(CNdata1), probamp(CNdata2)), row.names=newRowNames)), 
				featureData = annotation) 
		}
	} else {
		if (is.null(probamp(CNdata1))){ 
			CNdata <- new('cghCall', 
				copynumber = data.matrix(data.frame(rbind(copynumber(CNdata1), copynumber(CNdata2)), row.names=newRowNames)), 
				segmented = data.matrix(data.frame(rbind(segmented(CNdata1), segmented(CNdata2)), row.names=newRowNames)), 
				calls = data.matrix(data.frame(rbind(calls(CNdata1), calls(CNdata2)), row.names=newRowNames)), 
				probdloss = data.matrix(data.frame(rbind(CGHbase::probdloss(CNdata1), probloss(CNdata2)), row.names=newRowNames)), 
				probloss = data.matrix(data.frame(rbind(probloss(CNdata1), probloss(CNdata2)), row.names=newRowNames)), 
				probnorm = data.matrix(data.frame(rbind(probnorm(CNdata1), probnorm(CNdata2)), row.names=newRowNames)), 
				probgain = data.matrix(data.frame(rbind(probgain(CNdata1), probgain(CNdata2)), row.names=newRowNames)), 
				featureData = annotation) 
		} else { 
			CNdata <- new('cghCall', 
				copynumber = data.matrix(data.frame(rbind(copynumber(CNdata1), copynumber(CNdata2)), row.names=newRowNames)), 
				segmented = data.matrix(data.frame(rbind(segmented(CNdata1), segmented(CNdata2)), row.names=newRowNames)), 
				calls = data.matrix(data.frame(rbind(calls(CNdata1), calls(CNdata2)), row.names=newRowNames)), 
				probdloss = data.matrix(data.frame(rbind(CGHbase::probdloss(CNdata1), probloss(CNdata2)), row.names=newRowNames)), 
				probloss = data.matrix(data.frame(rbind(probloss(CNdata1), probloss(CNdata2)), row.names=newRowNames)), 
				probnorm = data.matrix(data.frame(rbind(probnorm(CNdata1), probnorm(CNdata2)), row.names=newRowNames)), 
				probgain = data.matrix(data.frame(rbind(probgain(CNdata1), probgain(CNdata2)), row.names=newRowNames)), 
				probamp = data.matrix(data.frame(rbind(probamp(CNdata1), probamp(CNdata2)), row.names=newRowNames)), 
				featureData = annotation) 
		}
	}
	return(CNdata)
}
cghCall2order <- function(CNdata, chr, bpstart, verbose=TRUE){
   	###########################################################################################
	# function that orders cghCall-object genomically
	###########################################################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if (as.character(class(CNdata)) != "cghCall"){ stop("CNdata not of class cghCall.") }
	if (!(as.character(class(chr))=="numeric" | as.character(class(chr))=="integer" )){ stop("chr of wrong class.") }
	if (length(chr) != 1){ stop("chr of wrong length.") }
	if ( !(chr >= 1 | chr <= ncol(fData(CNdata))) ){ stop("chr exceeds number of columns in featureData.") }
	if (!(as.character(class(bpstart))=="numeric" | as.character(class(bpstart))=="integer" )){ stop("bpstart of wrong class.") }
	if (length(bpstart) != 1){ stop("bpstart of wrong length.") }
	if ( !(bpstart >= 1 | bpstart <= ncol(fData(CNdata))) ){ stop("GEbpstart exceeds number of columns in featureData.") }
	# extract annotation data for ordering
	CNann <- fData(CNdata)[, c(chr, bpstart), drop=FALSE]
	# in case columns are of wrong class ....
	for (i in 1:2){
		if (is.factor(CNann[,i])){ CNann[,i] <- as.numeric(levels(CNann[,i]))[CNann[,i]] }
		if (is.character(CNann[,i])){ CNann[,i] <- as.numeric(CNann[,i]) }
	}
	# order ExpressionSet-object genomically	
	fData(CNdata) <- fData(CNdata)[order(CNann[,1], CNann[,2]),]
	copynumber(CNdata) <- copynumber(CNdata)[order(CNann[,1], CNann[,2]),]
	segmented(CNdata) <- segmented(CNdata)[order(CNann[,1], CNann[,2]),]
	calls(CNdata) <- calls(CNdata)[order(CNann[,1], CNann[,2]),]
	probloss(CNdata) <- probloss(CNdata)[order(CNann[,1], CNann[,2]),]
	probnorm(CNdata) <- probnorm(CNdata)[order(CNann[,1], CNann[,2]),]
	probgain(CNdata) <- probgain(CNdata)[order(CNann[,1], CNann[,2]),]
	if (is.null(probamp(CNdata))){ } else { probamp(CNdata) <- probamp(CNdata)[order(CNann[,1], CNann[,2]),] }
	if (is.null(CGHbase::probdloss(CNdata))){ } else { CGHbase::probdloss(CNdata) <- CGHbase::probdloss(CNdata)[order(CNann[,1], CNann[,2]),] }
	return(CNdata)
}
cghSeg2order <- function(CNdata, chr, bpstart, verbose=TRUE){
   	###########################################################################################
	# function that orders cghCall-object genomically
	###########################################################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if (as.character(class(CNdata)) != "cghSeg"){ stop("CNdata not of class cghSeg.") }
	if (!(as.character(class(chr))=="numeric" | as.character(class(chr))=="integer" )){ stop("chr of wrong class.") }
	if (length(chr) != 1){ stop("chr of wrong length.") }
	if ( !(chr >= 1 | chr <= ncol(fData(CNdata))) ){ stop("chr exceeds number of columns in featureData.") }
	if (!(as.character(class(bpstart))=="numeric" | as.character(class(bpstart))=="integer" )){ stop("bpstart of wrong class.") }
	if (length(bpstart) != 1){ stop("bpstart of wrong length.") }
	if ( !(bpstart >= 1 | bpstart <= ncol(fData(CNdata))) ){ stop("bpstart exceeds number of columns in featureData.") }
	# extract annotation data for ordering
	CNann <- fData(CNdata)[, c(chr, bpstart), drop=FALSE]
	# in case columns are of wrong class ....
	for (i in 1:2){
		if (is.factor(CNann[,i])){ CNann[,i] <- as.numeric(levels(CNann[,i]))[CNann[,i]] }
		if (is.character(CNann[,i])){ CNann[,i] <- as.numeric(CNann[,i]) }
	}
	# order ExpressionSet-object genomically	
	fData(CNdata) <- fData(CNdata)[order(CNann[,1], CNann[,2]),]
	copynumber(CNdata) <- copynumber(CNdata)[order(CNann[,1], CNann[,2]),]
	segmented(CNdata) <- segmented(CNdata)[order(CNann[,1], CNann[,2]),]
	return(CNdata)
}
cghCall2cghSeg <- function (CNdata, verbose = TRUE){
    if (verbose) {
        cat("perform input checks...", "\n")
    }
    if (as.character(class(CNdata)) != "cghCall") {
        stop("CNdata not of class cghCall.")
    }
   
    fd <- fData(CNdata)
    newRowNames <- rownames(copynumber(CNdata))
    if (length(newRowNames) != length(unique(newRowNames))) {
        warning("modified feature names are returned")
        slh <- rep(1, length(newRowNames))
        for (i in 1:length(unique(newRowNames))) {
            ids <- which(newRowNames == unique(newRowNames)[i])
            slh[ids] <- 1:length(ids)
        }
        newRowNames <- paste(newRowNames, slh, sep = "__")
    }
    rownames(fd) <- newRowNames
    metaData <- data.frame(labelDescription = colnames(fd))
    fd <- new("AnnotatedDataFrame", data = data.frame(fd), varMetadata = metaData)
    CNdata <- new("cghSeg", copynumber = data.matrix(data.frame(copynumber(CNdata), row.names = newRowNames)), 
		segmented = data.matrix(data.frame(segmented(CNdata), row.names = newRowNames)), featureData = fd)
    return(CNdata)
}
cghSeg2subset <- function (CNdata, featureSubset, verbose = TRUE){
    if (verbose) {
        cat("perform input checks...", "\n")
    }
    if (as.character(class(CNdata)) != "cghSeg") {
        stop("CNdata not of class cghSeg.")
    }
    if (!(as.character(class(featureSubset)) == "numeric" | as.character(class(featureSubset)) == 
        "integer")) {
        stop("featureSubset of wrong class.")
    }
    if (!(length(featureSubset) >= 1)) {
        stop("featureSubset contains no row numbers.")
    }
    if (!(min(featureSubset) >= 1 | max(featureSubset) <= nrow(fData(CNdata)))) {
        stop("featureSubset contains illegal row numbers.")
    }
    fd <- fData(CNdata)[featureSubset, , drop = FALSE]
    newRowNames <- rownames(copynumber(CNdata))[featureSubset]
    if (length(newRowNames) != length(unique(newRowNames))) {
        warning("modified feature names are returned")
        slh <- rep(1, length(newRowNames))
        for (i in 1:length(unique(newRowNames))) {
            ids <- which(newRowNames == unique(newRowNames)[i])
            slh[ids] <- 1:length(ids)
        }
        newRowNames <- paste(newRowNames, slh, sep = "__")
    }
    rownames(fd) <- newRowNames
    metaData <- data.frame(labelDescription = colnames(fd))
    fd <- new("AnnotatedDataFrame", data = data.frame(fd), varMetadata = metaData)
    CNdata <- new("cghSeg", copynumber = data.matrix(data.frame(copynumber(CNdata)[featureSubset, 
            , drop = FALSE], row.names = newRowNames)), segmented = data.matrix(data.frame(segmented(CNdata)[featureSubset, 
            , drop = FALSE], row.names = newRowNames)), featureData = fd)
    return(CNdata)
}
cghSeg2weightedSubset <- function (CNdata, featuresAndWeights, chr, bpstart, bpend, ncpus = 1, verbose = TRUE){
    if (verbose) {
        cat("perform input checks...", "\n")
    }
    if (as.character(class(CNdata)) != "cghSeg") {
        stop("CNdata not of class cghSeg.")
    }
    if (as.character(class(CNdata)) != "cghSeg") {
        stop("CNdata not of class cghSeg.")
    }
    if (!(as.character(class(chr)) == "numeric" | as.character(class(chr)) == 
        "integer")) {
        stop("chr of wrong class.")
    }
    if (length(chr) != 1) {
        stop("chr of wrong length.")
    }
    if (!(chr >= 1 | chr <= ncol(fData(CNdata)))) {
        stop("chr exceeds number of columns in featureData.")
    }
    if (!(as.character(class(bpstart)) == "numeric" | as.character(class(bpstart)) == 
        "integer")) {
        stop("bpstart of wrong class.")
    }
    if (length(bpstart) != 1) {
        stop("bpstart of wrong length.")
    }
    if (!(bpstart >= 1 | bpstart <= ncol(fData(CNdata)))) {
        stop("bpstart exceeds number of columns in featureData.")
    }
    if (!(as.character(class(bpend)) == "numeric" | as.character(class(bpend)) == 
        "integer")) {
        stop("bpend of wrong class.")
    }
    if (length(bpend) != 1) {
        stop("bpend of wrong length.")
    }
    if (!(bpend >= 1 | chr <= ncol(fData(CNdata)))) {
        stop("bpend exceeds number of columns in featureData.")
    }
    copynumberMat <- copynumber(CNdata)
    segmentedMat <- segmented(CNdata)
    CNann <- fData(CNdata)
    rm(CNdata)
    gc()
    if (verbose) {
        cat("generate subsetted raw copy number matrix ...", 
            "\n")
    }
    if (ncpus == 1) {
        copynumberMat <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, 
            copynumberMat, simplify = TRUE))
    }
    if (ncpus > 1) {
        sfInit(parallel = TRUE, cpus = ncpus)
        sfLibrary(package="sigaR", verbose = FALSE, character.only=TRUE)
        copynumberMat <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, 
            copynumberMat, simplify = TRUE))
    }
    if (verbose) {
        cat("generate subsetted segmented matrix ...", "\n")
    }
    if (ncpus == 1) {
        segmentedMat <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, 
            segmentedMat, simplify = TRUE))
    }
    if (ncpus > 1) {
        segmentedMat <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, 
            segmentedMat, simplify = TRUE))
    }
    if (verbose) {
        cat("generate subsetted call matrices ...", "\n")
    }
    if (verbose) {
        cat("reorganize annotation ...", "\n")
    }
    if (ncpus == 1) {
        annotation <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetAnnotation, 
            CNann, chr, bpstart, bpend, simplify = TRUE))
    }
    if (ncpus > 1) {
        annotation <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetAnnotation, 
            CNann, chr, bpstart, bpend, simplify = TRUE))
    }
    colnames(annotation) <- c("Chromosome", "Start", "End")
    if (ncpus == 1) {
        rownames(annotation) <- as.character(sapply(featuresAndWeights, 
            .slhFuncCombineFeatureNames, rownames(CNann), simplify = TRUE))
    }
    if (ncpus > 1) {
        rownames(annotation) <- as.character(sfSapply(featuresAndWeights, 
            .slhFuncCombineFeatureNames, rownames(CNann), simplify = TRUE))
    }
    if (length(rownames(annotation)) != length(unique(rownames(annotation)))) {
        warning("modified feature names are returned")
        newRowNames <- rownames(annotation)
        slh <- rep(1, length(newRowNames))
        for (i in 1:length(unique(newRowNames))) {
            ids <- which(newRowNames == unique(newRowNames)[i])
            slh[ids] <- 1:length(ids)
        }
        newRowNames <- paste(newRowNames, slh, sep = "__")
        rownames(annotation) <- newRowNames
    }
    fInfo <- new("AnnotatedDataFrame", data = data.frame(annotation), 
        varMetadata = data.frame(labelDescription = c("Chromosome", 
            "Start", "End")))
    if (ncpus > 1) {
        sfStop()
    }
    rownames(copynumberMat) <- rownames(annotation)
    rownames(segmentedMat) <- rownames(annotation)
    if (verbose) {
        cat("merge into cghSeg object ...", "\n")
    }
    CNdata <- new("cghSeg", copynumber = data.matrix(data.frame(copynumberMat, 
		row.names = rownames(annotation))), segmented = data.matrix(data.frame(segmentedMat, 
		row.names = rownames(annotation))), featureData = fInfo)
    return(CNdata)
}
splitMatchingAtBreakpoints <- function(matchedIDs, CNdata){
   	############################################################################
	# function splits matching list-object at breakpoints
	############################################################################
	nSamplesWithBreakpoint <- function(X, CNdata){ 
		sum(apply(segmented(CNdata)[X[,2], , drop=FALSE], 2, function(Z){ length(unique(Z)) }) > 1) 
	}
	matrixRows2listwithReg <- function(X, regInfo){
		subList <- sapply(1:nrow(regInfo), function(u, Z, regInfo){ Z[regInfo[u,1]:regInfo[u,2], , drop=FALSE] }, Z=X, regInfo, simplify=FALSE)
		names(subList) <- rep(X[1, 1], nrow(X))
		return(subList)
	}
	
	makeRegions <- function(CNsegData){
		# determine regions
		splitter <- list()
		splitter[[1]] <- c(1)
		index.temp <- 1
		j <- 1
		for (i in 1:(dim(CNsegData)[1]-1)){
			if (all(CNsegData[i,] == CNsegData[i+1,])){
    				index.temp <- c(index.temp,i+1)
	           		splitter[[j]] <- index.temp
			} else {
				index.temp <- i+1
	     			j <- j + 1
      	     		splitter[[j]] <- index.temp
			}
		}
		regDetails <- NULL
		for (i in 1:length(splitter)){
			regDetails <- rbind(regDetails, c(min(splitter[[i]]),max(splitter[[i]])))
		}
		return(regDetails)
	}
	expandMatches <- function(id, matchedIDs, CNdata){
		nEntries <- length(matchedIDs)
		mFeatures <- nrow(matchedIDs[[id]])
		regionsWithinGene <- makeRegions(segmented(CNdata)[as.numeric(matchedIDs[[id]][,2]),,drop=FALSE])
		mIDsInsert <- matrixRows2listwithReg(matchedIDs[[id]], regionsWithinGene)
		if (id < nEntries){ mIDsEnd <- matchedIDs[(id+1):length(matchedIDs)] } else { mIDsEnd <- NULL }
		if (id > 1){ mIDsBegin <- matchedIDs[1:(id-1)] } else { mIDsBegin <- NULL }
		if (id > 1 & id < nEntries){ 
			matchedIDs <- mIDsBegin
			matchedIDs[(length(matchedIDs)+1):(length(matchedIDs)+mFeatures)] <- mIDsInsert
			names(matchedIDs)[(length(matchedIDs)-mFeatures+1):length(matchedIDs)] <- names(mIDsInsert)
			matchedIDs[(length(matchedIDs)+1):(length(matchedIDs)+length(mIDsEnd))] <- mIDsEnd
			names(matchedIDs)[(length(matchedIDs)-length(mIDsEnd)+1):length(matchedIDs)] <- names(mIDsEnd)
		}
		if (id == 1 & id < nEntries){ 
			matchedIDs <- mIDsInsert
			matchedIDs[(length(matchedIDs)+1):(length(matchedIDs)+length(mIDsEnd))] <- mIDsEnd
			names(matchedIDs)[(length(matchedIDs)-length(mIDsEnd)+1):length(matchedIDs)] <- names(mIDsEnd)
		}
		if (id > 1 & id == nEntries){ 
			matchedIDs <- mIDsBegin
			matchedIDs[(length(matchedIDs)+1):(length(matchedIDs)+mFeatures)] <- mIDsInsert
			names(matchedIDs)[(length(matchedIDs)-mFeatures+1):length(matchedIDs)] <- names(mIDsInsert)
		}
		return(matchedIDs)
	}
	# determine matches with breakpoints
	IDs <- sort(which(sapply(matchedIDs, nSamplesWithBreakpoint, CNdata, simplify=TRUE) > 1), decreasing=TRUE)
	# split at breakpoints
	if (length(IDs) > 0){
		for (j in 1:length(IDs)){
			matchedIDs <- expandMatches(IDs[j], matchedIDs, CNdata)
		}
	}
	return(matchedIDs)
}
merge2ExpressionSets <- function(GEdata1, GEdata2, verbose=TRUE){
   	############################################################################
	# function merges ExpressionSet-objects into one ExpressionSet-object
	############################################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if ( !(as.character(class(GEdata1)) == "ExpressionSet" | as.character(class(GEdata1)) == "eSet") ){ stop("GEdata1 not of class ExpressionSet.") }
	if ( !(as.character(class(GEdata2)) == "ExpressionSet" | as.character(class(GEdata2)) == "eSet") ){ stop("GEdata2 not of class ExpressionSet.") }
	if ( dim(GEdata1)[2] != dim(GEdata2)[2] ){ stop("GEdata1 and GEdata2 have an unequal number of samples.") }
	if ( dim(fData(GEdata1))[2] != dim(fData(GEdata2))[2] ){ stop("GEdata1 and GEdata2 have an unequal annotation columns.") }
	# prepare new annotation
	annotation <- rbind(fData(GEdata1), fData(GEdata2))
	newRowNames <- c(rownames(fData(GEdata1)), rownames(fData(GEdata2)))
	if (length(newRowNames) != length(unique(newRowNames))){
		warning("modified feature names are returned")
		slh <- rep(1, length(newRowNames))
		for (i in 1:length(unique(newRowNames))){
			ids <- which(newRowNames == unique(newRowNames)[i])
			slh[ids] <- 1:length(ids)
		}
		newRowNames <- paste(newRowNames, slh, sep="__")		
	}
	rownames(annotation) <- newRowNames
	metaData <- data.frame(labelDescription=colnames(annotation)) 
	probeinfo <- new("AnnotatedDataFrame", data=data.frame(annotation), varMetadata=metaData)
	expMat <- rbind(exprs(GEdata1), exprs(GEdata2))
	rownames(expMat) <- newRowNames
	return(new("ExpressionSet", exprs=expMat, featureData = probeinfo))
}
nBreakpoints <- function(featuresAndWeights, CNdata){
   	############################################################################
	# function calculates the number of samples with at least one breakpoint 
	# within the transcript to which the DNA copy number data have been matched
	############################################################################
	nSamplesWithBreakpoint <- function(X, CNdata){ 
		sum(apply(segmented(CNdata)[X[,1], , drop=FALSE], 2, function(Z){ length(unique(Z)) }) > 1) 
	}
	return(sapply(featuresAndWeights, nSamplesWithBreakpoint, CNdata, simplify=TRUE))
}
expandMatching2singleIDs <- function(matchedIDs){
   	############################################################################
	# function unfolds matching list-object 
	############################################################################
	expandMatches <- function(id, matchedIDs){
		nEntries <- length(matchedIDs)
		mFeatures <- nrow(matchedIDs[[id]])
		mIDsInsert <- .matrixRows2list(matchedIDs[[id]])
		if (id < nEntries){ mIDsEnd <- matchedIDs[(id+1):length(matchedIDs)] } else { mIDsEnd <- NULL }
		if (id > 1){ mIDsBegin <- matchedIDs[1:(id-1)] } else { mIDsBegin <- NULL }
		if (id > 1 & id < nEntries){ 
			matchedIDs <- mIDsBegin
			matchedIDs[(length(matchedIDs)+1):(length(matchedIDs)+mFeatures)] <- mIDsInsert
			names(matchedIDs)[(length(matchedIDs)-mFeatures+1):length(matchedIDs)] <- names(mIDsInsert)
			matchedIDs[(length(matchedIDs)+1):(length(matchedIDs)+length(mIDsEnd))] <- mIDsEnd
			names(matchedIDs)[(length(matchedIDs)-length(mIDsEnd)+1):length(matchedIDs)] <- names(mIDsEnd)
		}
		if (id == 1 & id < nEntries){ 
			matchedIDs <- mIDsInsert
			matchedIDs[(length(matchedIDs)+1):(length(matchedIDs)+length(mIDsEnd))] <- mIDsEnd
			names(matchedIDs)[(length(matchedIDs)-length(mIDsEnd)+1):length(matchedIDs)] <- names(mIDsEnd)
		}
		if (id > 1 & id == nEntries){ 
			matchedIDs <- mIDsBegin
			matchedIDs[(length(matchedIDs)+1):(length(matchedIDs)+mFeatures)] <- mIDsInsert
			names(matchedIDs)[(length(matchedIDs)-mFeatures+1):length(matchedIDs)] <- names(mIDsInsert)
		}
		return(matchedIDs)
	}
	# actual expansion
	IDs <- sort(as.numeric(which(sapply(matchedIDs, function(X){ nrow(X) }, simplify=TRUE) > 1)), decreasing=TRUE)
	if (length(IDs) > 1){
		for (j in 1:length(IDs)){
			matchedIDs <- expandMatches(IDs[j], matchedIDs)
		}
	}
	return(matchedIDs)
}
ExpressionSet2weightedSubset <- function(GEdata, featuresAndWeights, chr, bpstart, bpend, ncpus=1, verbose=TRUE){
   	############################################################################
	# function shrinks ExpressionSet-object to a weighted subset of the features
	############################################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if ( !(as.character(class(GEdata)) == "ExpressionSet" | as.character(class(GEdata)) == "eSet") ){ stop("GEdata not of class ExpressionSet.") }
	if (!(as.character(class(featuresAndWeights))=="list")){ stop("featuresAndWeights of wrong class.") }
	if (!(as.character(class(chr))=="numeric" | as.character(class(chr))=="integer" )){ stop("chr of wrong class.") }
	if (length(chr) != 1){ stop("chr of wrong length.") }
	if ( !(chr >= 1 | chr <= ncol(fData(GEdata))) ){ stop("chr exceeds number of columns in featureData.") }
	if (!(as.character(class(bpstart))=="numeric" | as.character(class(bpstart))=="integer" )){ stop("bpstart of wrong class.") }
	if (length(bpstart) != 1){ stop("bpstart of wrong length.") }
	if ( !(bpstart >= 1 | bpstart <= ncol(fData(GEdata))) ){ stop("bpstart exceeds number of columns in featureData.") }
	if (!(as.character(class(bpend))=="numeric" | as.character(class(bpend))=="integer" )){ stop("bpend of wrong class.") }
	if (length(bpend) != 1){ stop("bpend of wrong length.") }
	if ( !(bpend >= 1 | chr <= ncol(fData(GEdata))) ){ stop("bpend exceeds number of columns in featureData.") }
	# disecting the ExpressionSet-object
	exprMat <- exprs(GEdata)
	GEann <- fData(GEdata)
	rm(GEdata)
	gc()
	# weighted subsetting of expression data
	if (verbose){ cat("generate matched expression matrix ...", "\n") }
	if (ncpus == 1){ exprMat <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, exprMat, simplify=TRUE)) }
	if (ncpus > 1){ 
		sfInit(parallel=TRUE, cpus=ncpus)
		sfLibrary(package="sigaR", verbose=FALSE, character.only=TRUE)
		exprMat <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetData, exprMat, simplify=TRUE))
	}
	# weighted subsetting of annotation data
	if (verbose){ cat("reorganize annotation ...", "\n") }
	if (ncpus == 1){ annotation <- t(sapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetAnnotation, GEann, chr, bpstart, bpend, simplify=TRUE)) }
	if (ncpus > 1){ annotation <- t(sfSapply(featuresAndWeights, .slhFuncWeightedCGHcallExpressionSetAnnotation, GEann, chr, bpstart, bpend, simplify=TRUE)) }
	colnames(annotation) <- c("Chromosome", "Start", "End")
	if (ncpus == 1){ rownames(annotation) <- as.character(sapply(featuresAndWeights, .slhFuncCombineFeatureNames, rownames(GEann), simplify=TRUE)) }
	if (ncpus > 1){ rownames(annotation) <- as.character(sfSapply(featuresAndWeights, .slhFuncCombineFeatureNames, rownames(GEann), simplify=TRUE)) }
	if (length(rownames(annotation)) != length(unique(rownames(annotation)))){
		warning("modified feature names are returned")
		newRowNames <- rownames(annotation)
		slh <- rep(1, length(newRowNames))
		for (i in 1:length(unique(newRowNames))){
			ids <- which(newRowNames == unique(newRowNames)[i])
			slh[ids] <- 1:length(ids)
		}
		newRowNames <- paste(newRowNames, slh, sep="__")		
		rownames(annotation) <- newRowNames
	}
	fInfo <- new("AnnotatedDataFrame", data=data.frame(annotation), varMetadata=data.frame(labelDescription=c("Chromosome", "Start", "End")))
	if (ncpus > 1){ sfStop() }
	rownames(exprMat) <- rownames(annotation)
	# make ExpressionSet object
	if (verbose){ cat("merge into ExpressionSet object ...", "\n") }
	return(new("ExpressionSet", exprs=exprMat, featureData=fInfo))
}
matchCGHcall2ExpressionSet <- function(CNdata, GEdata, CNchr, CNbpstart, CNbpend, GEchr, GEbpstart, GEbpend, method="distance", reference=1, ncpus=1, verbose=TRUE){
   	###########################################################################################
	# function that matches features from cghCall and ExpressionSet-objects on genomic location
	###########################################################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if (as.character(class(CNdata)) != "cghCall"){ stop("CNdata not of class cghCall.") }
	if ( !(as.character(class(GEdata)) == "ExpressionSet" | as.character(class(GEdata)) == "eSet") ){ stop("GEdata not of class ExpressionSet.") }
	if ( !(method %in% c("distance", "overlap", "overlapPlus")) ){ stop("method wrongly specified.") }
	if (!(as.character(class(GEchr))=="numeric" | as.character(class(GEchr))=="integer" )){ stop("GEchr of wrong class.") }
	if (length(GEchr) != 1){ stop("GEchr of wrong length.") }
	if ( !(GEchr >= 1 | GEchr <= ncol(fData(GEdata))) ){ stop("GEchr exceeds number of columns in featureData.") }
	if (!(as.character(class(GEbpstart))=="numeric" | as.character(class(GEbpstart))=="integer" )){ stop("GEbpstart of wrong class.") }
	if (length(GEbpstart) != 1){ stop("GEbpstart of wrong length.") }
	if ( !(GEbpstart >= 1 | GEbpstart <= ncol(fData(GEdata))) ){ stop("GEbpstart exceeds number of columns in featureData.") }
	if (!(as.character(class(GEbpend))=="numeric" | as.character(class(GEbpend))=="integer" )){ stop("GEbpend of wrong class.") }
	if (length(GEbpend) != 1){ stop("GEbpend of wrong length.") }
	if ( !(GEbpend >= 1 | GEbpend <= ncol(fData(GEdata))) ){ stop("GEbpend exceeds number of columns in featureData.") }
	if (!(as.character(class(CNchr))=="numeric" | as.character(class(CNchr))=="integer" )){ stop("CNchr of wrong class.") }
	if (length(CNchr) != 1){ stop("CNchr of wrong length.") }
	if ( !(CNchr >= 1 | CNchr <= ncol(fData(CNdata))) ){ stop("CNchr exceeds number of columns in featureData.") }
	if (!(as.character(class(CNbpstart))=="numeric" | as.character(class(CNbpstart))=="integer" )){ stop("CNbpstart of wrong class.") }
	if (length(CNbpstart) != 1){ stop("CNbpstart of wrong length.") }
	if ( !(CNbpstart >= 1 | CNbpstart <= ncol(fData(CNdata))) ){ stop("GEbpstart exceeds number of columns in featureData.") }
	if (!(as.character(class(CNbpend))=="numeric" | as.character(class(CNbpend))=="integer" )){ stop("CNbpend of wrong class.") }
	if (length(CNbpend) != 1){ stop("CNbpend of wrong length.") }
	if ( !(CNbpend >= 1 | CNbpend <= ncol(fData(CNdata))) ){ stop("CNbpend exceeds number of columns in featureData.") }
	# extract annotation info
	CNann <- cbind(fData(CNdata)[, c(CNchr, CNbpstart, CNbpend), drop=FALSE], c(1:nrow(fData(CNdata))))
	GEann <- cbind(fData(GEdata)[, c(GEchr, GEbpstart, GEbpend), drop=FALSE], c(1:nrow(fData(GEdata))))
	# in case columns are of wrong class ....
	for (i in 1:4){
		if (is.factor(CNann[,i])){ CNann[,i] <- as.numeric(levels(CNann[,i]))[CNann[,i]] }
		if (is.factor(GEann[,i])){ GEann[,i] <- as.numeric(levels(GEann[,i]))[GEann[,i]] }			
		if (is.character(CNann[,i])){ CNann[,i] <- as.numeric(CNann[,i]) }
		if (is.character(GEann[,i])){ GEann[,i] <- as.numeric(GEann[,i]) }			
	}
	# ensure data from gene expression platform is genomicly ordered.
	if (verbose){ cat("order both data sets genomically...", "\n") }
	GEdata <- ExpressionSet2order(GEdata, GEchr, GEbpstart, verbose=verbose)
	GEann <- GEann[order(GEann[,1], GEann[,2]), ]
	# ensure data from copy number platform is genomicly ordered.	
	CNdata <- cghCall2order(CNdata, CNchr, CNbpstart, verbose=verbose)
	CNann <- CNann[order(CNann[,1], CNann[,2]), ]
	# filter genes with complete annotation
	if (verbose){ cat("select probes with complete annotation...", "\n") }
	GEfeaturesKept <- which(apply(GEann, 1, function(x){ all(is.na(x) == FALSE) }))
	if (length(GEfeaturesKept) < 1){ stop("no annotation info for GE-array features provided") }
	GEann <- GEann[GEfeaturesKept, , drop=FALSE]
	CNfeaturesKept <- which(apply(CNann, 1, function(x){ all(is.na(x) == FALSE) }))
	if (length(CNfeaturesKept) < 1){ stop("no annotation info for CN-array features provided") }
	CNann <- CNann[CNfeaturesKept, , drop=FALSE]
	# chromosomes with genes on the expression array
	if (verbose){ cat("select probes on chromosomes present in both data sets...", "\n") }
	GEchrs <- sort(unique(GEann[,1]))
	CNfeaturesKept.2 <- which(CNann[,1] %in% GEchrs)
	CNann <- CNann[CNfeaturesKept.2, , drop=FALSE]
	CNfeaturesKept <- CNfeaturesKept[CNfeaturesKept.2]
	# chromosomes with features on the CN array
	CNchrs <- sort(unique(CNann[,1]))
	GEfeaturesKept.2 <- which(GEann[,1] %in% CNchrs)
	GEann <- GEann[GEfeaturesKept.2, , drop=FALSE]
	GEfeaturesKept <- GEfeaturesKept[GEfeaturesKept.2]
	
	# match by percentage of overlap
	if (verbose){ cat("start actual matching procedure...", "\n") }
	if (ncpus > 1){
		sfInit(parallel=TRUE, cpus=ncpus)
		sfLibrary(package="sigaR", verbose=FALSE, character.only=TRUE)
	}
	if (method == "overlap"){
		# find features with biggest overlap and remove features without any overlap
		if (ncpus == 1){ CNGEmatched.features <- apply(GEann[,-4], 1, .overlapPercentage_CGHcall2ExpressionSet, CNann[,-4], reference) }
		if (ncpus > 1){ CNGEmatched.features <- sfApply(GEann[,-4], 1, .overlapPercentage_CGHcall2ExpressionSet, CNann[,-4], reference) }
		no.match.found <- (is.na(CNGEmatched.features) == FALSE)
		GEfeaturesKept <- GEfeaturesKept[no.match.found]		
		CNGEmatched.features <- CNGEmatched.features[no.match.found]
		CNfeaturesKept <- CNfeaturesKept[CNGEmatched.features]
	}
	# match by percentage of overlap with some interpolation
	if (method == "overlapPlus"){
			# find features with biggest overlap and remove features without any overlap
			if (ncpus == 1){ CNGEmatched.features <- apply(GEann[,-4], 1, .overlapPlusInterpolation_CGHcall2ExpressionSet, CNann[,-4], segmented(CNdata)[CNfeaturesKept, , drop=FALSE], reference) }
			if (ncpus > 1){ CNGEmatched.features <- sfApply(GEann[,-4], 1, .overlapPlusInterpolation_CGHcall2ExpressionSet, CNann[,-4], segmented(CNdata)[CNfeaturesKept, , drop=FALSE], reference) }
			no.match.found <- (is.na(CNGEmatched.features) == FALSE)
			GEfeaturesKept <- GEfeaturesKept[no.match.found]		
			CNGEmatched.features <- CNGEmatched.features[no.match.found]
			CNfeaturesKept <- CNfeaturesKept[CNGEmatched.features]
	}
	# match by distance of mid base pair
	if (method == "distance"){
		# determine mid base pair
		CNannTemp <- cbind(CNann[,1], apply(CNann[,2:3,drop=FALSE], 1, mean, na.rm=TRUE))
		GEannTemp <- cbind(GEann[,1], apply(GEann[,2:3,drop=FALSE], 1, mean, na.rm=TRUE))
		
		# per chromosome find CN-features closed to GE-features
		if (ncpus == 1){ CNGEmatched.features <- apply(GEannTemp, 1, .minDistCghFeature_CGHcall2ExpressionSet, CNannTemp) }
		if (ncpus > 1){ CNGEmatched.features <- sfApply(GEannTemp, 1, .minDistCghFeature_CGHcall2ExpressionSet, CNannTemp) }
		CNfeaturesKept <- CNfeaturesKept[CNGEmatched.features]
	}
	if (ncpus > 1){ sfStop() }
	# in the unlikely event that some genes could not be matched: remove
	if (sum(is.na(CNfeaturesKept)) > 0){
		GEfeaturesKept <- GEfeaturesKept[is.na(CNfeaturesKept) == FALSE]		
		CNfeaturesKept <- CNfeaturesKept[is.na(CNfeaturesKept) == FALSE]
	}
	# in the unlikely event that nothing could be matched: stop
	if ((length(CNfeaturesKept) == 0) | (length(GEfeaturesKept) == 0)){
		stop("No features could be matched. Check format of annotation information.")
	}
	matchedFeatures <- cbind(CNann[CNfeaturesKept,4], GEann[GEfeaturesKept,4])
	return(matchedFeatures)
}
uniqGenomicInfo <- function(chr, bpstart, bpend, verbose=FALSE){
   	############################################################################
	# function shrinks ExpressionSet-object to a weighted subset of the features
	############################################################################
	# check input
	if (verbose){ cat("perform input checks ...", "\n") }
	if (!(as.character(class(chr))=="numeric" | as.character(class(chr))=="integer" )){ stop("chr of wrong class.") }
	if (!(as.character(class(bpstart))=="numeric" | as.character(class(bpstart))=="integer" )){ stop("bpstart of wrong class.") }
	if (!(as.character(class(bpend))=="numeric" | as.character(class(bpend))=="integer" )){ stop("bpend of wrong class.") }
	if (length(chr) != length(bpstart) | length(chr) != length(bpend) | length(bpstart) != length(bpend)){ stop("chr, bpstart and bpend do not have identical length.") }
	# create identifier of unique genomic info's
	if (verbose){ cat("find features with identical genomic info ...", "\n") }
	ann <- cbind(chr, bpstart, bpend)[order(chr, bpstart, bpend),]
	uniques <- apply(cbind(ann[-nrow(ann),], ann[-1,]), 1, function(Z){ !all(Z[1:3] == Z[4:6]) })
	uniques <- c(1, cumsum(uniques) + 1)
	# put features with identical genomic info in list object
	ann <- cbind(1:nrow(ann), ann)
	colnames(ann)[1] <- "featureNo"
	slhFunc <- function(Z, uniques, ann){ ann[which(uniques==Z), , drop=FALSE] }
	uniqueGenomicInfo <- lapply(1:max(uniques), slhFunc, uniques, ann)
	return(uniqueGenomicInfo)
}
matchAnn2Ann <- function(chr1, bpstart1, bpend1, chr2, bpstart2, bpend2, method="distance", maxDist=10000, minPerc=0, reference=1, ncpus=1, verbose=TRUE){
   	###########################################################################################
	# function that matches annotation of to sets of features on genomic location
	###########################################################################################
	# check input
	if (verbose){ cat("perform input checks ...", "\n") }
	if (as.character(class(chr1)) != "numeric" & as.character(class(chr1)) != "integer"){ stop("chr1 of wrong class.") }
	if (as.character(class(bpstart1)) != "numeric" & as.character(class(bpstart1)) != "integer"){ stop("bpstart1 of wrong class.") }
	if (as.character(class(bpend1)) != "numeric" & as.character(class(bpend1)) != "integer"){ stop("bpend1 of wrong class.") }
	if ((length(chr1) != length(bpstart1)) & (length(chr1) != length(bpend1)) & (length(bpstart1) != length(bpend1))){ stop("length of chr1, bpstart1, and bpend1 do not match") }
	if (any(bpstart1 > bpend1)){ stop("inconsistency in bpstart1 and bpend1: for some feature bpstart1 > bpend1") }
	if (as.character(class(chr2)) != "numeric" & as.character(class(chr2)) != "integer"){ stop("chr2 of wrong class.") }
	if (as.character(class(bpstart2)) != "numeric" & as.character(class(bpstart2)) != "integer"){ stop("bpstart2 of wrong class.") }
	if (as.character(class(bpend2)) != "numeric" & as.character(class(bpend2)) != "integer"){ stop("bpend2 of wrong class.") }
	if ((length(chr2) != length(bpstart2)) & (length(chr2) != length(bpend2)) & (length(bpstart2) != length(bpend2))){ stop("length of chr2, bpstart2, and bpend2 do not match") }
	if (any(bpstart2 > bpend2)){ stop("inconsistency in bpstart2 and bpend2: for some feature bpstart2 > bpend2") }
	if ( !(method %in% c("distance", "overlap")) ){ stop("method wrongly specified.") }
	if (as.character(class(maxDist)) != "numeric" & as.character(class(maxDist)) != "integer"){ stop("maxDist of wrong class.") }
	if (as.character(class(minPerc)) != "numeric" & as.character(class(minPerc)) != "integer"){ stop("minPerc of wrong class.") }
	if (as.character(class(ncpus)) != "numeric" & as.character(class(ncpus)) != "integer"){ stop("ncpus of wrong class.") }
	if (maxDist < 1){ stop("maxDist wrongly specified.") }
	if (minPerc < 0 & minPerc > 1){ stop("minPerc wrongly specified.") }
	# extract annotation info
	ann1 <- cbind(chr1, bpstart1, bpend1, 1:length(chr1))
	colnames(ann1)[4] <- "probeNo1"
	ann2 <- cbind(chr2, bpstart2, bpend2, 1:length(chr2))
	colnames(ann2)[4] <- "probeNo2"
	# rm(chr1, chr2, bpstart1, bpstart2, bpend1, bpend2)
	# in case columns are of wrong class ....
	for (i in 1:3){
		if (is.factor(ann1[,i])){ ann1[,i] <- as.numeric(levels(ann1[,i]))[ann1[,i]] }
		if (is.factor(ann2[,i])){ ann2[,i] <- as.numeric(levels(ann2[,i]))[ann2[,i]] }			
		if (is.character(ann1[,i])){ ann1[,i] <- as.numeric(ann1[,i]) }
		if (is.character(ann2[,i])){ ann2[,i] <- as.numeric(ann2[,i]) }			
	}
	# ensure data from gene expression platform is genomicly ordered.
	if (verbose){ cat("order both data sets genomically ...", "\n")	}
	ann1 <- ann1[order(ann1[,1], ann1[,2]), ]
	ann2 <- ann2[order(ann2[,1], ann2[,2]), ]
	# filter features with complete annotation for platform 1
	if (verbose){ cat("select features with complete annotation ...", "\n")	}
	featuresKept1 <- which(apply(ann1, 1, function(x){ all(is.na(x) == FALSE) }))
	if (length(featuresKept1) < 1){ stop("no annotation info for features of platform 1 provided") }
	ann1 <- ann1[featuresKept1, , drop=FALSE]
	ann1removed <- ann1[-featuresKept1, , drop=FALSE]
	# filter features with complete annotation for platform 2
	featuresKept2 <- which(apply(ann2, 1, function(x){ all(is.na(x) == FALSE) }))
	if (length(featuresKept2) < 1){ stop("no annotation info for features of platform 2 provided") }
	ann2removed <- ann2[-featuresKept2, , drop=FALSE]
	ann2 <- ann2[featuresKept2, , drop=FALSE]
	# chromosomes with features on platform 2
	if (verbose){ cat("select features on chromosomes present in both data sets ...", "\n")	}
	chrs2 <- sort(unique(ann2[,1]))
	featuresKept1 <- which(ann1[,1] %in% chrs2)
	ann1removed <- rbind(ann1removed, ann1[-featuresKept1, , drop=FALSE])
	ann1 <- ann1[featuresKept1, , drop=FALSE]
	# chromosomes with features on platform 1
	chrs1 <- sort(unique(ann1[,1]))
	featuresKept2 <- which(ann2[,1] %in% chrs1)
	ann2removed <- rbind(ann2removed, ann2[-featuresKept2, , drop=FALSE])
	ann2 <- ann2[featuresKept2, , drop=FALSE]
	# match by distance of mid base pair
	if (verbose){ cat("start actual matching procedure ...", "\n") }
	if (ncpus > 1){	
		sfInit(parallel=TRUE, cpus=ncpus)
		sfLibrary(package="sigaR", verbose=FALSE, character.only=TRUE)
	}
	if (method == "distance"){
		# determine mid base pair
		ann1temp <- cbind(ann1[,1], apply(ann1[,2:3,drop=FALSE], 1, mean, na.rm=TRUE), ann1[,4])
		ann2temp <- cbind(ann2[,1], apply(ann2[,2:3,drop=FALSE], 1, mean, na.rm=TRUE), ann2[,4])
		
		# per chromosome find CN-features closed to GE-features
		if (ncpus == 1){ matchedFeatures <- apply(ann2temp, 1, .minDistFeature, ann1temp, maxDist) }
		if (ncpus > 1){	matchedFeatures <- sfApply(ann2temp, 1, .minDistFeature, ann1temp, maxDist) }
	}
	# match by percentage of overlap
	if (method == "overlap"){
		# find features with biggest overlap and remove features without any overlap
		if (ncpus == 1){ matchedFeatures <- apply(ann2, 1, .overlapPercentage, ann1, minPerc, reference) }
		if (ncpus > 1){ matchedFeatures <- sfApply(ann2, 1, .overlapPercentage, ann1, minPerc, reference) }
	}
	if (ncpus > 1){ sfStop() }
	if (!is.list(matchedFeatures)){ matchedFeatures <- .matrixRows2list(matchedFeatures) }
	# reformatting
	if (verbose){ cat("reformat matching results ...", "\n") }
	names(matchedFeatures) <- as.character(ann2[,4])
	idsNull <- as.numeric(which(sapply(matchedFeatures, is.null, simplify=TRUE)))
	if (length(idsNull) > 1){ matchedFeatures <- matchedFeatures[-idsNull] }
	return(matchedFeatures)
}
getSegFeatures <- function(featureNo, CNdata, verbose=TRUE){
	###########################################################
	# function that determine features with similar CN signature as featureNo 
	###########################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if (as.character(class(CNdata)) != "cghCall"){ stop("CNdata not of class cghCall.") }
	if (!(as.character(class(featureNo))=="numeric" | as.character(class(featureNo))=="integer" )){ stop("featureSubset of wrong class.") }
	if ( length(featureNo) != 1 ){ stop("featureNo wrongly specified.") }
	if ( !(featureNo >= 1 | featureNo <= nrow(fData(CNdata))) ){ stop("featureNo out of range.") }
	# get features
	CNfeaturesKept <- which(chromosomes(CNdata) == chromosomes(CNdata)[featureNo])
	segSignature <- segmented(CNdata)[featureNo, , drop=FALSE]
	CNfeaturesKept <- CNfeaturesKept[apply(segmented(CNdata)[CNfeaturesKept, , drop=FALSE], 1, function(Y, Z){ all(as.numeric(Y) == as.numeric(Z)) }, Z=segSignature)]
	# in case possible gap between features with same signature
	idTemp <- which(CNfeaturesKept == featureNo)
	if (idTemp == 1){
		checkSeq <- c(0:(length(CNfeaturesKept)-idTemp))
	} else {
		checkSeq <- c(-c((idTemp-1):1), c(0:(length(CNfeaturesKept)-idTemp)))
	}
	CNfeaturesKept <- CNfeaturesKept[which(checkSeq == (CNfeaturesKept - featureNo))]
	return(CNfeaturesKept)
}
ExpressionSet2subset <- function(GEdata, featureSubset, verbose=TRUE){
   	############################################################################
	# function shrinks ExpressionSet-object to a subset of the features
	############################################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if ( !(as.character(class(GEdata)) == "ExpressionSet" | as.character(class(GEdata)) == "eSet") ){ stop("GEdata not of class ExpressionSet.") }
	if (!(as.character(class(featureSubset))=="numeric" | as.character(class(featureSubset))=="integer" )){ stop("featureSubset of wrong class.") }
	if ( !(length(featureSubset) >= 1) ){ stop("featureSubset contains no row numbers.") }
	if ( !(min(featureSubset) >= 1 | max(featureSubset) <= nrow(fData(GEdata))) ){ stop("featureSubset contains illegal row numbers.") }
	# subsetting
	# fData(GEdata) <- fData(GEdata)[featureSubset, , drop=FALSE]	
	# exprs(GEdata) <- exprs(GEdata)[featureSubset, , drop=FALSE]
	GEdata <- GEdata[featureSubset,,drop=FALSE]	
	return(GEdata)
}
ExpressionSet2order <- function(GEdata, chr, bpstart, verbose=TRUE){
   	###########################################################################################
	# function that orders ExpressionSet-object genomically
	###########################################################################################
	# check input
	if (verbose){ cat("perform input checks...", "\n") }
	if ( !(class(GEdata) == "ExpressionSet" | class(GEdata) == "eSet") ){ stop("GEdata not of class ExpressionSet.") }
	if (!(class(chr)=="numeric" | class(chr)=="integer" )){ stop("chr of wrong class.") }
	if (length(chr) != 1){ stop("chr of wrong length.") }
	if ( !(chr >= 1 | chr <= ncol(fData(GEdata))) ){ stop("chr exceeds number of columns in featureData.") }
	if (!(class(bpstart)=="numeric" | class(bpstart)=="integer" )){ stop("bpstart of wrong class.") }
	if (length(bpstart) != 1){ stop("bpstart of wrong length.") }
	if ( !(bpstart >= 1 | bpstart <= ncol(fData(GEdata))) ){ stop("bpstart exceeds number of columns in featureData.") }
	# extract annotation data for ordering
	GEann <- fData(GEdata)[, c(chr, bpstart), drop=FALSE]
	# in case columns are of wrong class ....
	for (i in 1:2){
		if (is.factor(GEann[,i])){ GEann[,i] <- as.numeric(levels(GEann[,i]))[GEann[,i]] }			
		if (is.character(GEann[,i])){ GEann[,i] <- as.numeric(GEann[,i]) }			
	}
	# order ExpressionSet-object genomically
	exprs(GEdata) <- exprs(GEdata)[order(GEann[,1], GEann[,2]), ]
	fData(GEdata) <- fData(GEdata)[order(GEann[,1], GEann[,2]), ]
	return(GEdata)
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.