.packageName <- "mmgmos"
  setClass("exprReslt",
         representation(prcfive="exprMatrix",
			prctwfive="exprMatrix",
			prcfifty="exprMatrix",
			prcsevfive="exprMatrix",
			prcninfive="exprMatrix"),
         prototype=list(prcfive=matrix(nr=0,nc=0),
	 prctwfive=matrix(nr=0,nc=0),
	 prcfifty=matrix(nr=0,nc=0),
	 prcsevfive=matrix(nr=0,nc=0),
	 prcninfive=matrix(nr=0,nc=0),
	 exprs=matrix(nr=0,nc=0),
         se.exprs = matrix(nr=0,nc=0),
         description=new("MIAME"),
         annotation="",
         notes="",
         cdfName="",
         nrow=0,
         ncol=0), contains="exprSet")
	 
  ##define a generic for obtaining the data
  if( !isGeneric("prcfive") )
    setGeneric("prcfive", function(object) standardGeneric("prcfive"))
  setMethod("prcfive", "exprReslt", function(object) object@prcfive)
  
  if( !isGeneric("prcfive<-") )
    setGeneric("prcfive<-", function(object, value)
               standardGeneric("prcfive<-"))

  setReplaceMethod("prcfive", "exprReslt",
                   function(object, value) {
                     object@prcfive <- value
                     return(object)
                   })

  ##define a generic for obtaining the data
  if( !isGeneric("prctwfive") )
    setGeneric("prctwfive", function(object) standardGeneric("prctwfive"))
  setMethod("prctwfive", "exprReslt", function(object) object@prctwfive)

  if( !isGeneric("prctwfive<-") )
    setGeneric("prctwfive<-", function(object, value)
               standardGeneric("prctwfive<-"))

  setReplaceMethod("prctwfive", "exprReslt",
                   function(object, value) {
                     object@prctwfive <- value
                     return(object)
                   })
    ##define a generic for obtaining the data
  if( !isGeneric("prcfifty") )
    setGeneric("prcfifty", function(object) standardGeneric("prcfifty"))
  setMethod("prcfifty", "exprReslt", function(object) object@prcfifty)

  if( !isGeneric("prcfifty<-") )
    setGeneric("prcfifty<-", function(object, value)
               standardGeneric("prcfifty<-"))

  setReplaceMethod("prcfifty", "exprReslt",
                   function(object, value) {
                     object@prcfifty <- value
                     return(object)
                   })
    ##define a generic for obtaining the data
  if( !isGeneric("prcsevfive") )
    setGeneric("prcsevfive", function(object) standardGeneric("prcsevfive"))
  setMethod("prcsevfive", "exprReslt", function(object) object@prcsevfive)

  if( !isGeneric("prcsevfive<-") )
    setGeneric("prcsevfive<-", function(object, value)
               standardGeneric("prcsevfive<-"))

  setReplaceMethod("prcsevfive", "exprReslt",
                   function(object, value) {
                     object@prcsevfive <- value
                     return(object)
                   })
    ##define a generic for obtaining the data
  if( !isGeneric("prcninfive") )
    setGeneric("prcninfive", function(object) standardGeneric("prcninfive"))
  setMethod("prcninfive", "exprReslt", function(object) object@prcninfive)
  
  if( !isGeneric("prcninfive<-") )
    setGeneric("prcninfive<-", function(object, value)
               standardGeneric("prcninfive<-"))

  setReplaceMethod("prcninfive", "exprReslt",
                   function(object, value) {
                     object@prcninfive <- value
                     return(object)
                   })
  
  setMethod("show", "exprReslt", function(object ) {
    dm <-dim(exprs(object))
    ngenes <- dm[1]
    nsamples <- dm[2]
    cat("Expression Set (exprReslt) with \n\t", ngenes, " genes\n\t", sep="")
    cat(nsamples, "samples\n\t")
    show(phenoData(object))
  })

  	 
  if( !isGeneric("write.reslts") )
    setGeneric("write.reslts", function(x,...) standardGeneric("write.reslts"))
  setMethod("write.reslts", signature(x="exprReslt"),
            function(x,file = "tmp",
                     append = FALSE, quote = FALSE, sep = ",",
                     eol = "\n", na = "NA", dec = ".", row.names = TRUE,
                     col.names = NA, qmethod = c("escape", "double")){
            write.table(exprs(x),file = paste(file,"_exprs.csv",sep=""), append = append,
                        quote = quote,
                        sep = sep,eol = eol, na = na, dec = dec,
                        row.names = row.names, col.names = col.names,
                        qmethod = qmethod)

            write.table(se.exprs(x),file = paste(file,"_se.csv",sep=""), append = append,
                        quote = quote,
                        sep = sep,eol = eol, na = na, dec = dec,
                        row.names = row.names, col.names = col.names,
                        qmethod = qmethod)
	    
            write.table(prcfive(x),file = paste(file,"_prctile5.csv",sep=""), append = append,
                        quote = quote,
                        sep = sep,eol = eol, na = na, dec = dec,
                        row.names = row.names, col.names = col.names,
                        qmethod = qmethod)
	    
            write.table(prctwfive(x),file = paste(file,"_prctile25.csv",sep=""), append = append,
                        quote = quote,
                        sep = sep,eol = eol, na = na, dec = dec,
                        row.names = row.names, col.names = col.names,
                        qmethod = qmethod)
	    
            write.table(prcfifty(x),file = paste(file,"_prctile50.csv",sep=""), append = append,
                        quote = quote,
                        sep = sep,eol = eol, na = na, dec = dec,
                        row.names = row.names, col.names = col.names,
                        qmethod = qmethod)
	    
            write.table(prcsevfive(x),file = paste(file,"_prctile75.csv",sep=""), append = append,
                        quote = quote,
                        sep = sep,eol = eol, na = na, dec = dec,
                        row.names = row.names, col.names = col.names,
                        qmethod = qmethod)
	    
            write.table(prcninfive(x),file = paste(file,"_prctile95.csv",sep=""), append = append,
                        quote = quote,
                        sep = sep,eol = eol, na = na, dec = dec,
                        row.names = row.names, col.names = col.names,
                        qmethod = qmethod)})


justmgMOS <- function(..., filenames=character(0),
                     widget=getOption("BioC")$affy$use.widgets,
                     compress=getOption("BioC")$affy$compress.cel,
                     celfile.path=getwd(),
                     sampleNames=NULL,
                     phenoData=NULL,
                     description=NULL,
                     notes="",
                     background=TRUE, savepar=FALSE, eps=1.0e-6){

  l <- AllButCelsForReadAffy(..., filenames=filenames,
                             widget=widget,
                             celfile.path=celfile.path,
                             sampleNames=sampleNames,
                             phenoData=phenoData,
                             description=description)


  ##and now we are ready to read cel files
 ret<- just.mgmos(filenames=l$filenames,
                  phenoData=l$phenoData,
                  description=l$description,
                  notes=notes,
                  compress=compress,
                  background=background,
                  savepar=savepar,
                  eps=eps)
  ##sampleNames(ret) <- l$sampleNames
  return(ret)

}

just.mgmos <- function(..., filenames=character(0),
                     phenoData=new("phenoData"),
                     description=NULL,
                     notes="",
                     compress=getOption("BioC")$affy$compress.cel,
                     background=TRUE, savepar=FALSE, eps=1.0e-6){

  auxnames <- as.list(substitute(list(...)))[-1]
  filenames <- .Primitive("c")(filenames, auxnames)

  n <- length(filenames)

  ## error if no file name !
  if (n == 0)
    stop("No file name given !")

  pdata <- pData(phenoData)
  ##try to read sample names form phenoData. if not there use CEL filenames
  if(dim(pdata)[1]!=n){#if empty pdata filename are samplenames
    warning("Incompatible phenoData object. Created a new one.\n")

    samplenames <- gsub("^/?([^/]*/)*", "", unlist(filenames), extended=TRUE	)
    pdata <- data.frame(sample=1:n,row.names=samplenames)
    phenoData <- new("phenoData",pData=pdata,varLabels=list(sample="arbitrary numbering"))
  }
  else samplenames <- rownames(pdata)

  if (is.null(description))
    {
      description <- new("MIAME")
      description@preprocessing$filenames <- filenames
      description@preprocessing$affyversion <- library(help=affy)$info[[2]][[2]][2]
    }
  ## read the first file to see what we have
  ##if (verbose) cat(1, "reading",filenames[[1]],"...")

  ## get information from cdf environment

  headdetails <- .Call("ReadHeader", filenames[[1]], compress, PACKAGE="affy")
  dim.intensity <- headdetails[[2]]
  cdfname <- headdetails[[1]]

  tmp <- new("AffyBatch",
             cdfName=cdfname,
             annotation=cleancdfname(cdfname, addcdf=FALSE))
  pmIndex <- pmindex(tmp)
  probenames <- rep(names(pmIndex), unlist(lapply(pmIndex,length)))
  pmIndex <- unlist(pmIndex)

  ## read pm data into matrix

  pm <- read.probematrix(filenames=filenames,which="pm")$pm
  mm <- read.probematrix(filenames=filenames,which="mm")$mm

  ## pass matrix of probe values to mgmos
  ## call mgmos
  conds <- n
  genes <- length(geneNames(tmp))

  phis <- c(0,0,0)  
  prctiles <- 0.01*c(5, 25, 50, 75, 95);
  
  if (background == TRUE)
  {
    for (i in c(1:conds)){
      m<-min(c(min(pm[,i]),min(mm[,i])))
      pm[,i]<-pm[,i]-m+1
      mm[,i]<-mm[,i]-m+1
    }
  }

  res <-
        .Call("mgmos_c", pm, mm, genes, probenames, phis, prctiles, length(prctiles), savepar, eps, PACKAGE="mmgmos")

  expr <- matrix(res[c(1:genes),],genes,conds)
  se <- matrix(res[c((genes+1):(2*genes)),],genes,conds)
  prc5 <- matrix(res[c((2*genes+1):(3*genes)),],genes,conds)
  prc25 <- matrix(res[c((3*genes+1):(4*genes)),],genes,conds)
  prc50 <- matrix(res[c((4*genes+1):(5*genes)),],genes,conds)
  prc75 <- matrix(res[c((5*genes+1):(6*genes)),],genes,conds)
  prc95 <- matrix(res[c((6*genes+1):(7*genes)),],genes,conds)

  rm(res)

  rownames(expr) <- geneNames(tmp)
  colnames(expr) <- samplenames
  rownames(se) <- geneNames(tmp)
  colnames(se) <- samplenames
  rownames(prc5) <- geneNames(tmp)
  colnames(prc5) <- samplenames
  rownames(prc25) <- geneNames(tmp)
  colnames(prc25) <- samplenames
  rownames(prc50) <- geneNames(tmp)
  colnames(prc50) <- samplenames
  rownames(prc75) <- geneNames(tmp)
  colnames(prc75) <- samplenames
  rownames(prc95) <- geneNames(tmp)
  colnames(prc95) <- samplenames

  phenodata <- phenoData(tmp)
  annotation <- annotation(tmp)
  description <- description(tmp)
  notes <- notes(tmp)

  new("exprReslt", prcfive = prc5, prctwfive = prc25, prcfifty = prc50, prcsevfive = prc75, prcninfive = prc95, 
       exprs = expr, se.exprs = se, phenoData = phenodata,
       annotation = annotation, description = description, notes = notes)
}





justmmgMOS <- function(..., filenames=character(0),
                     widget=getOption("BioC")$affy$use.widgets,
                     compress=getOption("BioC")$affy$compress.cel,
                     celfile.path=getwd(),
                     sampleNames=NULL,
                     phenoData=NULL,
                     description=NULL,
                     notes="",
                     background=TRUE, savepar=FALSE, eps=1.0e-6){

  l <- AllButCelsForReadAffy(..., filenames=filenames,
                             widget=widget,
                             celfile.path=celfile.path,
                             sampleNames=sampleNames,
                             phenoData=phenoData,
                             description=description)


  ##and now we are ready to read cel files
 ret<- just.mmgmos(filenames=l$filenames,
                  phenoData=l$phenoData,
                  description=l$description,
                  notes=notes,
                  compress=compress,
                  background=background,
                  savepar=savepar,
                  eps=eps)
  ##sampleNames(ret) <- l$sampleNames
  return(ret)

}

just.mmgmos <- function(..., filenames=character(0),
                     phenoData=new("phenoData"),
                     description=NULL,
                     notes="",
                     compress=getOption("BioC")$affy$compress.cel,
                     background=TRUE, savepar=FALSE, eps=1.0e-6){

  auxnames <- as.list(substitute(list(...)))[-1]
  filenames <- .Primitive("c")(filenames, auxnames)

  n <- length(filenames)

  ## error if no file name !
  if (n == 0)
    stop("No file name given !")

  pdata <- pData(phenoData)
  ##try to read sample names form phenoData. if not there use CEL filenames
  if(dim(pdata)[1]!=n){#if empty pdata filename are samplenames
    warning("Incompatible phenoData object. Created a new one.\n")

    samplenames <- gsub("^/?([^/]*/)*", "", unlist(filenames), extended=TRUE	)
    pdata <- data.frame(sample=1:n,row.names=samplenames)
    phenoData <- new("phenoData",pData=pdata,varLabels=list(sample="arbitrary numbering"))
  }
  else samplenames <- rownames(pdata)

  if (is.null(description))
    {
      description <- new("MIAME")
      description@preprocessing$filenames <- filenames
      description@preprocessing$affyversion <- library(help=affy)$info[[2]][[2]][2]
    }
  ## read the first file to see what we have
  ##if (verbose) cat(1, "reading",filenames[[1]],"...")

  ## get information from cdf environment

  headdetails <- .Call("ReadHeader", filenames[[1]], compress, PACKAGE="affy")
  dim.intensity <- headdetails[[2]]
  cdfname <- headdetails[[1]]

  tmp <- new("AffyBatch",
             cdfName=cdfname,
             annotation=cleancdfname(cdfname, addcdf=FALSE))
  pmIndex <- pmindex(tmp)
  probenames <- rep(names(pmIndex), unlist(lapply(pmIndex,length)))
  pmIndex <- unlist(pmIndex)

  ## read pm data into matrix

  pm <- read.probematrix(filenames=filenames,which="pm")$pm
  mm <- read.probematrix(filenames=filenames,which="mm")$mm

  ## pass matrix of probe values to mmgmos
  ## call mmgmos
  conds <- n
  genes <- length(geneNames(tmp))

  cdf <- cleancdfname(cdfName(tmp))
  phiname <- paste(substr(cdf,1,nchar(cdf)-3), "phis", sep="")
  if(phiname %in% do.call("data", list(package="mmgmos"))$results[, 3])
  {
      do.call("data", list(phiname))
      phis <- eval(parse(text=phiname))
  }
  else
      phis <- c(0,0,0)
      
  prctiles <- 0.01*c(5, 25, 50, 75, 95);
  
  if (background == TRUE)
  {
    for (i in c(1:conds)){
      m<-min(c(min(pm[,i]),min(mm[,i])))
      pm[,i]<-pm[,i]-m+1
      mm[,i]<-mm[,i]-m+1
    }
  }

  res <-
        .Call("mmgmos_c", pm, mm, genes, probenames, phis, prctiles, length(prctiles), savepar, eps, PACKAGE="mmgmos")

  expr <- matrix(res[c(1:genes),],genes,conds)
  se <- matrix(res[c((genes+1):(2*genes)),],genes,conds)
  prc5 <- matrix(res[c((2*genes+1):(3*genes)),],genes,conds)
  prc25 <- matrix(res[c((3*genes+1):(4*genes)),],genes,conds)
  prc50 <- matrix(res[c((4*genes+1):(5*genes)),],genes,conds)
  prc75 <- matrix(res[c((5*genes+1):(6*genes)),],genes,conds)
  prc95 <- matrix(res[c((6*genes+1):(7*genes)),],genes,conds)

  rm(res)

  rownames(expr) <- geneNames(tmp)
  colnames(expr) <- samplenames
  rownames(se) <- geneNames(tmp)
  colnames(se) <- samplenames
  rownames(prc5) <- geneNames(tmp)
  colnames(prc5) <- samplenames
  rownames(prc25) <- geneNames(tmp)
  colnames(prc25) <- samplenames
  rownames(prc50) <- geneNames(tmp)
  colnames(prc50) <- samplenames
  rownames(prc75) <- geneNames(tmp)
  colnames(prc75) <- samplenames
  rownames(prc95) <- geneNames(tmp)
  colnames(prc95) <- samplenames

  phenodata <- phenoData(tmp)
  annotation <- annotation(tmp)
  description <- description(tmp)
  notes <- notes(tmp)

  new("exprReslt", prcfive = prc5, prctwfive = prc25, prcfifty = prc50, prcsevfive = prc75, prcninfive = prc95, 
       exprs = expr, se.exprs = se, phenoData = phenodata,
       annotation = annotation, description = description, notes = notes)
}





mgmos <- function(object, background=TRUE, savepar=FALSE, eps=1.0e-6){

  probes <- length(probeNames(object))
  conds <- length(object)
  genes <- length(geneNames(object))

  phis <- c(0,0,0)  
  prctiles <- 0.01*c(5, 25, 50, 75, 95);
  
  if (background == TRUE)
  {
    for (i in c(1:conds)){
      m<-min(c(min(pm(object)[,i]),min(mm(object)[,i])))
      pm(object)[,i]<-pm(object)[,i]-m+1
      mm(object)[,i]<-mm(object)[,i]-m+1
    }
  }

  res <-
  	.Call("mgmos_c", pm(object), mm(object), genes, probeNames(object), phis, prctiles, length(prctiles), savepar, eps, PACKAGE="mmgmos")

  expr <- matrix(res[c(1:genes),],genes,conds)
  se <- matrix(res[c((genes+1):(2*genes)),],genes,conds)
  prc5 <- matrix(res[c((2*genes+1):(3*genes)),],genes,conds)
  prc25 <- matrix(res[c((3*genes+1):(4*genes)),],genes,conds)
  prc50 <- matrix(res[c((4*genes+1):(5*genes)),],genes,conds)
  prc75 <- matrix(res[c((5*genes+1):(6*genes)),],genes,conds)
  prc95 <- matrix(res[c((6*genes+1):(7*genes)),],genes,conds)

  rm(res)

  rownames(expr) <- geneNames(object)
  colnames(expr) <- sampleNames(object)
  rownames(se) <- geneNames(object)
  colnames(se) <- sampleNames(object)
  rownames(prc5) <- geneNames(object)
  colnames(prc5) <- sampleNames(object)
  rownames(prc25) <- geneNames(object)
  colnames(prc25) <- sampleNames(object)
  rownames(prc50) <- geneNames(object)
  colnames(prc50) <- sampleNames(object)
  rownames(prc75) <- geneNames(object)
  colnames(prc75) <- sampleNames(object)
  rownames(prc95) <- geneNames(object)
  colnames(prc95) <- sampleNames(object)

  phenodata <- phenoData(object)
  annotation <- annotation(object)
  description <- description(object)
  notes <- notes(object)

  new("exprReslt", prcfive = prc5, prctwfive = prc25, prcfifty = prc50, prcsevfive = prc75, prcninfive = prc95, 
       exprs = expr, se.exprs = se, phenoData = phenodata,
       annotation = annotation, description = description, notes = notes)
}

mmgmos <- function(object, background=TRUE, savepar=FALSE, eps=1.0e-6){

  probes <- length(probeNames(object))
  conds <- length(object)
  genes <- length(geneNames(object))

  cdf <- cleancdfname(cdfName(object))
  phiname <- paste(substr(cdf,1,nchar(cdf)-3), "phis", sep="")
  if(phiname %in% do.call("data", list(package="mmgmos"))$results[, 3])
  {
      do.call("data", list(phiname))
      phis <- eval(parse(text=phiname))
  }
  else
      phis <- c(0,0,0)
      
  prctiles <- 0.01*c(5, 25, 50, 75, 95);
  
  if (background == TRUE)
  {
    for (i in c(1:conds)){
      m<-min(c(min(pm(object)[,i]),min(mm(object)[,i])))
      pm(object)[,i]<-pm(object)[,i]-m+1
      mm(object)[,i]<-mm(object)[,i]-m+1
    }
  }

  res <-
  	.Call("mmgmos_c", pm(object), mm(object), genes, probeNames(object), phis, prctiles, length(prctiles), savepar, eps, PACKAGE="mmgmos")

  expr <- matrix(res[c(1:genes),],genes,conds)
  se <- matrix(res[c((genes+1):(2*genes)),],genes,conds)
  prc5 <- matrix(res[c((2*genes+1):(3*genes)),],genes,conds)
  prc25 <- matrix(res[c((3*genes+1):(4*genes)),],genes,conds)
  prc50 <- matrix(res[c((4*genes+1):(5*genes)),],genes,conds)
  prc75 <- matrix(res[c((5*genes+1):(6*genes)),],genes,conds)
  prc95 <- matrix(res[c((6*genes+1):(7*genes)),],genes,conds)

  rm(res)

  rownames(expr) <- geneNames(object)
  colnames(expr) <- sampleNames(object)
  rownames(se) <- geneNames(object)
  colnames(se) <- sampleNames(object)
  rownames(prc5) <- geneNames(object)
  colnames(prc5) <- sampleNames(object)
  rownames(prc25) <- geneNames(object)
  colnames(prc25) <- sampleNames(object)
  rownames(prc50) <- geneNames(object)
  colnames(prc50) <- sampleNames(object)
  rownames(prc75) <- geneNames(object)
  colnames(prc75) <- sampleNames(object)
  rownames(prc95) <- geneNames(object)
  colnames(prc95) <- sampleNames(object)

  phenodata <- phenoData(object)
  annotation <- annotation(object)
  description <- description(object)
  notes <- notes(object)

  new("exprReslt", prcfive = prc5, prctwfive = prc25, prcfifty = prc50, prcsevfive = prc75, prcninfive = prc95, 
       exprs = expr, se.exprs = se, phenoData = phenodata,
       annotation = annotation, description = description, notes = notes)
}

.First.lib <- function(lib, pkgname) {
  ## load the compiled code
  library.dynam(pkgname, pkgname, lib)
  if(.Platform$OS.type == "windows" && require("Biobase") && interactive()
        && .Platform$GUI ==  "Rgui"){
        addVigs2WinMenu("mmgmos")
    }
}

