.packageName <- "RMAGEML"
.packageName <- "RMAGEML"


##############################################################################
##                                                                          ##
## This is an R Package for handling MAGE-ML documents in Bioconductor.     ##
##                                                                          ##
##@Authors  Steffen Durinck,Joke Allemeersch                                ##
## ESAT-SCD KULeuven                                                        ##
##############################################################################


.First.lib <- function(libname, pkgname, where) {
  require(methods)
  require(Biobase) || stop("can't load without Biobase")
  
  require(marray)
  suppressWarnings(require(SJava)) || stop("Can't load without package SJava")
  dir1<-system.file("classes", package="RMAGEML")
  dir2<-system.file("jaxp", package="RMAGEML")
  dir3<-system.file("MAGEstk.jar", package="RMAGEML")
  cpvec <- c(dir1,paste(dir2,"lib/endorsed/xercesImpl.jar", sep="/" ),dir3)
  
  if (as.numeric(R.Version()$minor) < 9){
    if (as.numeric(package.description("SJava", fields="Version")) < .67) .JavaInit(javaConfig(cpvec))
    else .JavaInit(classPath=cpvec)
  }
  else{   
    if (as.numeric(packageDescription("SJava")$Version) < .67) .JavaInit(javaConfig(cpvec))
    else .JavaInit(classPath=cpvec)
  }
  
  if(.Platform$OS.type == "windows" && require(Biobase) && interactive()
     && .Platform$GUI ==  "Rgui"){
    addVigs2WinMenu("RMAGEML")
  }
}


importMAGEML <- function( directory = ".", package = "marray",DED = "none", QTD = "none", name.Rf="none", name.Rb="none", name.Gf="none" ,name.Gb = "none"){
 suppressWarnings(require(SJava))
 if ( package != "marray" && package !="limma" ){
   writeLines( "The current MAGEML package only imports MAGEML to the marray and limma packages of BioConductor" )
 }
 if( package == "marray" ){

   require(marray) || stop("Can't load without package marray")	       
   writeLines( "parsing MAGEML files" )
   mageOM <- .JNew( "MAGEML.RMAGESTK",directory , .convert = TRUE)
   Gnames <- getGnames( mageOM, DED )
   Layout <- getArrayLayout( mageOM )
   writeLines( "making Layout and Gnames objects" )
   raw <- makeMarrayRaw( mageOM, Layout,Gnames,directory, DED = DED, QTD = QTD, name.Rf = name.Rf, name.Rb = name.Rb, name.Gf=name.Gf ,name.Gb = name.Gb )
   return(raw)
 }
 if (package == "limma"){
   require(limma)
   writeLines( "parsing MAGEML files" )
   mageOM <- .JNew( "MAGEML.RMAGESTK",directory, .convert = TRUE )
   genes <- getArrayLayoutLimma( mageOM )
   RG <- makeRG( mageOM = mageOM, genes = genes, directory = directory,DED = DED, QTD = QTD, name.Rf = name.Rf, name.Rb = name.Rb, name.Gf = name.Gf ,name.Gb = name.Gb)
   return(RG)
 }
}

#importADF <- function( file, package = "marray" ){
# if ( package != "marray" && package !="limma" ){
#   writeLines( "The current MAGEML package only imports ADF to the marray and limma packages of BioConductor" )
# }
# if( package == "marray" ){
#   require(marrayInput) || stop("Can't load without package marrayInput")
#  # return(raw)
# }
# if (package == "limma"){
##   require(limma)
#   dat <- read.table(file,header=TRUE,sep="\t")
#   maxCol<-max(dat[,"MetaColumn"])
#   Row<- dat[,"Row"]
#   Column <-dat[,"Column"]
#   Name <- dat[,6]
#   ID<- dat[,8]
#   mcol<-dat[,"MetaColumn"]
#   mrow<-dat[,"MetaRow"]
#   Block <- (maxCol*(mcol-1))+mrow
#   genes <- as.data.frame(list(Block=Block,Row=Row, Column=Column,ID=ID,Name=Name))
#   return(genes)
# }
#}


####################################################
#
#import MAGEML to marray package
####################################################

getGnames <- function( mageOM , DED = "none"){
  require(marray)
  suppressWarnings(require(SJava))
  .Java(mageOM, "importFeatures","marray", DED, .convert = TRUE)
  databaseEntry <- .Java(mageOM,"getBioSequenceID", .convert = TRUE)
  names <- .Java(mageOM,"getBioSequenceNames", .convert = TRUE)
  db <- .Java(mageOM,"getBioSeqDB", .convert = TRUE)
  mInfo <- new("marrayInfo")
  maInfo <- as.data.frame(databaseEntry)
  names(maInfo) <- c("Identification")
  mInfo@maLabels <- names
  mInfo@maInfo <- maInfo
  mInfo@maNotes <- c(paste("Identifiers refer to database:",db))
  return(mInfo)
}

getArrayLayout<-function(mageOM){
  require(marray)
  suppressWarnings(require(SJava))
  layout <-.Java(mageOM,"getGridDimensions", .convert = TRUE)
  ngr <- layout[2]
  ngc <- layout[1]
  nsr <- layout[4]
  nsc <- layout[3]
  nspots <- as.integer(ngr) * as.integer(ngc) * as.integer(nsr) * as.integer(nsc)

  mlayout <- new("marrayLayout", maNgr = as.integer(ngr),
                 maNgc = as.integer(ngc),
                 maNsr = as.integer(nsr),
                 maNsc = as.integer(nsc),
                 maNspots = nspots,maNotes="")
  return(mlayout)
}

makeMarrayRaw <- function(mageOM,layout,gnames,directory = ".", DED="none", QTD = "none", name.Rf="none", name.Rb="none", name.Gf="none" ,name.Gb = "none"){
 require(marray)
 suppressWarnings(require(SJava))
 quantitationTypes<-.Java(mageOM,"selectQTypes", QTD, name.Rf, name.Rb, name.Gf,name.Gb, .convert = TRUE)
 fileNames<-.Java(mageOM,"getExternalData","marray", DED, .convert = TRUE)
 fullnames<-file.path(directory,fileNames)
 Gf<-Gb<-Rf<-Rb<-W<- NULL
 names(Gb)<-names(Rf)<-names(Rb)<-names(W)<-NULL
 fileLabels<-NULL
 for (f in fileNames){
    writeLines(paste("Reading ",f))
    dat<-read.table(file=file.path(directory,f),header=FALSE,sep="\t")
    Gf<-cbind(Gf,as.numeric(dat[[quantitationTypes[1]]]))
    Gb<-cbind(Gb,as.numeric(dat[[quantitationTypes[2]]]))
    Rf<-cbind(Rf,as.numeric(dat[[quantitationTypes[3]]]))
    Rb<-cbind(Rb,as.numeric(dat[[quantitationTypes[4]]]))
  }
  targets<-.Java(mageOM,"getTargets", .convert = TRUE);
  nrrow<-length(targets)
  TargetRG<-matrix(data = NA, nrow = nrrow, ncol = 2)
  colnames(TargetRG)<-c("Cy3","Cy5")
  TargetRG<-as.data.frame(TargetRG)
  rownames <- rep("U",nrrow)
  for (i in 1:nrrow){

     hybInfo<-strsplit(targets[i],"\\$")
     if (hybInfo[[1]][2]=="cy3"){
        TargetRG[i,1] <- hybInfo[[1]][1]
     }
     if (hybInfo[[1]][2]=="cy5"){
        TargetRG[i,2]<-hybInfo[[1]][1]
     }
     if (hybInfo[[1]][4]=="cy3"){
        TargetRG[i,1] <- hybInfo[[1]][3]
     }
     if (hybInfo[[1]][4]=="cy5"){
         TargetRG[i,2]<-hybInfo[[1]][3]
     }
   }
   target<-new("marrayInfo",maLabels=fileNames,maInfo=TargetRG,maNotes="Description of the targets")
   mraw<-new("marrayRaw", maRf=Rf, maRb=Rb, maGf=Gf, maGb=Gb, maLayout=layout, maGnames=gnames, maTargets=target)
 return(mraw)
}

####################################################
#
#import MAGEML to limma package
####################################################



getArrayLayoutLimma <- function(mageOM, DED = "none"){
  suppressWarnings(require(SJava))
  require(limma)
  .Java(mageOM, "importFeatures","limma", DED, .convert = TRUE)
  ID <- .Java(mageOM,"getBioSequenceID", .convert = TRUE)
  NAME <- .Java(mageOM,"getBioSequenceNames", .convert = TRUE)
  ROW <- as.numeric(.Java(mageOM,"getRows", .convert = TRUE))
  COLUMN <- as.numeric(.Java(mageOM,"getColumns", .convert = TRUE))
  BLOCK <- as.numeric(.Java(mageOM,"getZones", .convert = TRUE))
  genes <- as.data.frame(list(Block=BLOCK,Row=ROW,Column=COLUMN,ID=ID,Name= NAME))
  return(genes)

}

makeRG <- function(mageOM,genes, directory = ".", QTD = "none", DED="none", name.Rf="none", name.Rb="none", name.Gf="none" ,name.Gb = "none"){
 require(limma)
 suppressWarnings(require(SJava))
 ngenes <- length(genes$ID)
 quantitationTypes<-.Java(mageOM,"selectQTypes", QTD = QTD, name.Rf=name.Rf, name.Rb=name.Rb, name.Gf=name.Gf ,name.Gb = name.Gb, .convert = TRUE )
 fileNames<-.Java(mageOM,"getExternalData","limma",DED, .convert = TRUE)
 nslides <- length(fileNames)
 fullnames<-file.path(directory,fileNames)
 Gf<-Gb<-Rf<-Rb<-W<- NULL
 names(Gb)<-names(Rf)<-names(Rb)<-names(W)<-NULL
 fileLabels<-NULL
 Y <- matrix(0,ngenes,nslides)
 colnames(Y) <- fileNames
 RG <- list(R=Y,G=Y,Rb=Y,Gb=Y, genes=genes)

 for (i in 1: nslides){
    writeLines(paste("Reading ",fileNames[i]))
    dat<-read.table(file=file.path(directory,fileNames[i]),header=FALSE,sep="\t")
    RG$G[,i]<-as.numeric(dat[,quantitationTypes[1]])
    RG$Gb[,i]<-as.numeric(dat[,quantitationTypes[2]])
    RG$R[,i]<-as.numeric(dat[,quantitationTypes[3]])
    RG$Rb[,i]<-as.numeric(dat[,quantitationTypes[4]])
  }

 RGL <- new("RGList", RG)
 return(RGL)

}


###############################################
#
#import ADF to marray
###############################################



###############################################
#
#import ADF to limma
###############################################


###############################################
#
#import ADF to ExprSet
###############################################



###############################################
#
#other MAGEML related functions
###############################################


importMAGEOM<-function(directory = "."){
  suppressWarnings(require(SJava))
  writeLines("parsing MAGEML files")
  mageOM<-.JNew("MAGEML.RMAGESTK",directory, .convert = TRUE)
  return(mageOM)
}

##############################################
#
#writing MAGEML from BioConductor
##############################################

#writeMAGEML<-function(filename, mageOM){
# require(SJava)
# .Java(mageOM,"writeMAGEML",filename, .convert = TRUE)
#}

