From 74c920eef2f07056810871bfe41144612b4284a8 Mon Sep 17 00:00:00 2001
From: "Habil, Ardalan (arhab001)" <ardalan.habil@uni-duesseldorf.de>
Date: Thu, 24 Nov 2016 14:56:57 +0100
Subject: [PATCH] deformatGene bug

---
 R/sybilSBML.R | 1147 ++++++++++++++++++++++++-------------------------
 1 file changed, 569 insertions(+), 578 deletions(-)

diff --git a/R/sybilSBML.R b/R/sybilSBML.R
index 944d969..3ecc027 100644
--- a/R/sybilSBML.R
+++ b/R/sybilSBML.R
@@ -1,578 +1,569 @@
-#------------------------------------------------------------------------------#
-#                          Link to libSBML for sybil                           #
-#------------------------------------------------------------------------------#
-
-#  sybilSBML.R
-#  Link to libSBML for sybil.
-#
-#  Copyright (C) 2010-2013 Gabriel Gelius-Dietrich, Dpt. for Bioinformatics,
-#  Institute for Informatics, Heinrich-Heine-University, Duesseldorf, Germany.
-#  All right reserved.
-#  Email: geliudie@uni-duesseldorf.de
-#
-#  This file is part of sybilSBML.
-#
-#  SybilSBML is free software: you can redistribute it and/or modify
-#  it under the terms of the GNU General Public License as published by
-#  the Free Software Foundation, either version 3 of the License, or
-#  (at your option) any later version.
-#
-#  SybilSBML is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#  GNU General Public License for more details.
-#
-#  You should have received a copy of the GNU General Public License
-#  along with SybilSBML.  If not, see <http://www.gnu.org/licenses/>.
-
-
-#------------------------------------------------------------------------------#
-
-versionLibSBML <- function() {
-
-    version <- .Call("getLibSBMLversion", PACKAGE = "sybilSBML")
-    return(version)
-
-}
-
-
-#------------------------------------------------------------------------------#
-
-openSBMLfile <- function(fname, ptrtype = "sbml_doc") {
-
-    if ( file.exists(fname) == FALSE ) {
-        stop("file not found: ", sQuote(fname))
-    }
-
-    sbmlf <- .Call("readSBMLfile", PACKAGE = "sybilSBML",
-                   as.character(normalizePath(fname)[1]),
-                   as.character(ptrtype)
-             )
-
-    sbmlfP <- sbmlDocPointer(sbmlf)
-
-    return(sbmlfP)
-}
-
-
-#------------------------------------------------------------------------------#
-
-closeSBMLfile <- function(sbmlf) {
-
-    invisible(
-        .Call("delDocument", PACKAGE = "sybilSBML",
-              sbmlPointer(sbmlf)
-        )
-    )
-
-}
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLmodel <- function(sbmlf, ptrtype = "sbml_mod") {
-
-    sbmlm <- .Call("getSBMLmodel", PACKAGE = "sybilSBML",
-                   sbmlPointer(sbmlf),
-                   as.character(ptrtype)
-             )
-
-    sbmlmP <- sbmlModPointer(sbmlm, sbmlf)
-
-    if (isTRUE(isNULLpointerSBML(sbmlmP))) {
-        sbmlmP <- NULL
-    }
-
-    return(sbmlmP)
-}
-
-
-#------------------------------------------------------------------------------#
-
-delSBMLmodel <- function(sbmlm) {
-
-    invisible(
-        .Call("delModel", PACKAGE = "sybilSBML",
-              sbmlPointer(sbmlm)
-        )
-    )
-
-}
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLlevel <- function(sbmlf) {
-
-    level <- .Call("getSBMLlevel", PACKAGE = "sybilSBML",
-                   sbmlPointer(sbmlf)
-             )
-
-    return(level)
-}
-
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLversion <- function(sbmlf) {
-
-    version <- .Call("getSBMLversion", PACKAGE = "sybilSBML",
-                     sbmlPointer(sbmlf)
-               )
-
-    return(version)
-}
-
-#------------------------------------------------------------------------------#
-
-getSBMLFbcversion <- function(sbmlf) {
-  
-  version <- .Call("getSBMLFbcversion", PACKAGE = "sybilSBML",
-                   sbmlPointer(sbmlf)
-  )
-  
-  return(version)
-}
-
-
-#------------------------------------------------------------------------------#
-
-validateSBMLdocument <- function(sbmlf) {
-
-    if (is(sbmlf, "character")) {
-        sbmlff <- openSBMLfile(fname = sbmlf)
-    }
-    else {
-        sbmlff <- sbmlf
-    }
-    
-    val <- .Call("validateDocument", PACKAGE = "sybilSBML",
-                 sbmlPointer(sbmlff)
-           )
-
-    if (is(sbmlf, "character")) {
-        val <- getSBMLerrors(sbmlff)
-        closeSBMLfile(sbmlff)
-    }
-
-    return(val)
-}
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLerrors <- function(sbmlf) {
-
-    err <- .Call("getSBMLerrors", PACKAGE = "sybilSBML",
-                 sbmlPointer(sbmlf)
-           )
-
-    err <- sbmlError(err, sbmlf)
-
-    return(err)
-}
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLmodId <- function(sbmlm) {
-
-    modid <- .Call("getSBMLmodId", PACKAGE = "sybilSBML",
-                   sbmlPointer(sbmlm)
-             )
-
-    return(modid)
-}
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLmodName <- function(sbmlm) {
-
-    modn <- .Call("getSBMLmodName", PACKAGE = "sybilSBML",
-                  sbmlPointer(sbmlm)
-            )
-
-    return(modn)
-}
-
-#------------------------------------------------------------------------------#
-
-getSBMLmodNotes <- function(sbmlm) {
-  
-  modnotes <- .Call("getSBMLmodNotes", PACKAGE = "sybilSBML",
-                sbmlPointer(sbmlm)
-  )
-  
-  return(modnotes)
-}
-
-#------------------------------------------------------------------------------#
-
-getSBMLmodAnnotation <- function(sbmlm) {
-  
-  modanno <- .Call("getSBMLmodAnnotation", PACKAGE = "sybilSBML",
-                sbmlPointer(sbmlm)
-  )
-  
-  return(modanno)
-}
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLnumCompart <- function(sbmlm) {
-
-    num <- .Call("getSBMLnumCompart", PACKAGE = "sybilSBML",
-                  sbmlPointer(sbmlm)
-            )
-
-    return(num)
-}
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLnumSpecies <- function(sbmlm) {
-
-    num <- .Call("getSBMLnumSpecies", PACKAGE = "sybilSBML",
-                  sbmlPointer(sbmlm)
-            )
-
-    return(num)
-}
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLnumReactions <- function(sbmlm) {
-
-    num <- .Call("getSBMLnumReactions", PACKAGE = "sybilSBML",
-                  sbmlPointer(sbmlm)
-            )
-
-    return(num)
-}
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLunitDefinitionsList <- function(sbmlm) {
-
-    units <- .Call("getSBMLunitDefinitionsList", PACKAGE = "sybilSBML",
-                   sbmlPointer(sbmlm)
-             )
-
-    return(units)
-}
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLCompartList <- function(sbmlm) {
-
-    comp <- .Call("getSBMLCompartList", PACKAGE = "sybilSBML",
-                  sbmlPointer(sbmlm)
-            )
-
-    return(comp)
-}
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLSpeciesList <- function(sbmlm) {
-
-    spec <- .Call("getSBMLSpeciesList", PACKAGE = "sybilSBML",
-                  sbmlPointer(sbmlm)
-            )
-
-    return(spec)
-}
-
-
-#------------------------------------------------------------------------------#
-
-getSBMLReactionsList <- function(sbmlm) {
-
-    react <- .Call("getSBMLReactionsList", PACKAGE = "sybilSBML",
-                   sbmlPointer(sbmlm)
-             )
-
-    return(react)
-}
-
-
-#------------------------------------------------------------------------------#
-#export mod to SBML
-deformatSBMLid <- function(idstr) {
-  idstr <- gsub("-", "_DASH_", idstr, fixed = TRUE)
-  idstr <- gsub("(", "_LPAREN_", idstr, fixed = TRUE)
-  idstr <- gsub(")", "_RPAREN_", idstr, fixed = TRUE)
-  idstr <- gsub("[", "_", idstr, fixed = TRUE)
-  idstr <- gsub("]", "", idstr, fixed = TRUE)
-  idstr <- gsub(",", "_COMMA_", idstr, fixed = TRUE)
-  idstr <- gsub(".", "_PERIOD_", idstr, fixed = TRUE)
-  idstr <- gsub("'", "_APOS_", idstr, fixed = TRUE)
-  idstr <- sub("\\(e\\)$", "_e_", idstr)
-  idstr <- gsub("-", "_", idstr, fixed = TRUE)
-  return(idstr)
-}
-
-deformatGene<-function(idstr) {
-  # idstr <- gsub("and", "&&", idstr, fixed = TRUE)
-  #  idstr <- gsub("or", "||", idstr, fixed = TRUE)
-  idstr <- gsub("( ", "(", idstr, fixed = TRUE)
-  idstr <- gsub(" (", "(", idstr, fixed = TRUE)
-  idstr <- gsub(") ", ")", idstr, fixed = TRUE)
-  idstr <- gsub(" )", ")", idstr, fixed = TRUE)
-  idstr <- gsub(":", "_", idstr, fixed = TRUE)
-  return(idstr)
-}
-
-exportSBML<- function(morg=NULL,level=2,version=4,FbcLevel=0,filename="export.xml",recoverExtMet=TRUE,printNotes=TRUE,printAnnos=TRUE,validation=FALSE ){
-  if(class(morg)!="modelorg"){
-    stop("morg has to be of class modelorg\n")
-  }
-  
-  ###right 
-  if(level==1)
-  { 
-    # test if Matrix has no double values
-    if( !all( S(morg) == floor(S(morg))) ) warning("Level 1 does not support double values")
-    FbcLevel=0
-      if(version != 2)
-      {
-        warning("just Level 1 Version 2 will be supported")
-        version=2
-      }
-  }else if (level==2)
-  { 
-    FbcLevel=0
-    if(version >5)
-    {
-      warning("Level 2 Version 5 will be supported")
-      version=5 
-    }
-    if(version < 1)
-    {
-      warning("Level 2 Version 1 will be supported")
-      version=1 
-    }  
-  }
-  else if (level==3)
-  { if(FbcLevel >2)FbcLevel=2
-  if(version != 1)
-  {
-    print("Level 3 Version 1 will be supported")
-    version=1 
-  }
-  
-  }else {
-    stop(" Support just for Level 1,2 and 3 \n")
-  }
-  
-  ##All GENES### 
-  allgenes<- unique(unlist(genes(morg)))
-  allgenes<-allgenes[allgenes != ""]
-  
-  
-  ##EXCHANGE REACTIONS##
-  ex <- findExchReact(morg)
-  ex_react<-NULL
-  # if recoverExtMet== FALSE => null for ex_react
-  if( (!is.null(ex)) && (recoverExtMet) )
-  {
-    if(!(all(diag(S(morg)[met_pos(ex), react_pos(ex)])==-1)))
-      stop("exchange reactions with Scoeff different than -1\n")
-    ex_react<-as.integer(react_pos(ex))
-  }
-  
-  ### Build wrapper for C Function #####
-  
-  
-  ##Met Attribute###
-  com_meta_id<- NULL
-  met_meta_id<- NULL
-  com_notes <- NULL
-  com_annotation<- NULL
-  met_notes<- NULL
-  met_anno<- NULL
-  met_bnd<- NULL
-  met_charge<-NULL
-  met_formula<-NULL
-  
-  react_notes<-NULL
-  react_anno<-NULL
-  
-  mod_notes<-NULL
-  mod_anno<-NULL
-  
-  #subsystem
-  # is subsystem Empty
-  if(length( colnames(subSys(morg)))==1 && colnames(subSys(morg))[1]=="" ) modhasubSys<-FALSE
-  else modhasubSys<-TRUE
-  
-  newsubS<- NULL
-
-  if( .hasSlot(morg,"mod_attr") &&  .hasSlot(morg,"comp_attr") &&  .hasSlot(morg,"met_attr")  &&  .hasSlot(morg,"react_attr") )
-    newSybil<-TRUE
-  else newSybil<-FALSE
-  ### Start newSybil attr
-  if(newSybil)
-  { 
-    if(("notes" %in% colnames(mod_attr(morg))) && (printNotes) ) mod_notes<-as.character(mod_attr(morg)[['notes']])
-    if(("annotation" %in% colnames(mod_attr(morg))) && (printAnnos) ) mod_annotation<-as.character(mod_attr(morg)[['annotation']])
-    
-    if(("notes" %in% colnames(comp_attr(morg)))    && (printNotes) ) com_notes<-as.character(as.list((comp_attr(morg)[['notes']])))
-    if(("annotation" %in% colnames(comp_attr(morg))) && (printAnnos)  ) com_annotation<-as.character(as.list((comp_attr(morg)[['annotation']])))
-    
-    if("charge" %in% colnames(met_attr(morg))) met_charge<- as.integer(as.list((met_attr(morg)[['charge']])))
-    if("chemicalFormula" %in% colnames(met_attr(morg))) met_formula<-as.character(as.list((met_attr(morg)[['chemicalFormula']])))
-    if(("annotation" %in% colnames(met_attr(morg))) && (printAnnos)) met_anno<-as.character(as.list((met_attr(morg)[['annotation']])))
-    if("boundaryCondition" %in% colnames(met_attr(morg))) met_bnd<-as.logical(as.list((met_attr(morg)[['boundaryCondition']])))
-    
-    if(("notes" %in% colnames(met_attr(morg))) && (printNotes) )
-    {   # delete Formular and charge from notes to do
-      met_notes<-as.character(as.list((met_attr(morg)[['notes']])))
-      if (!is.null(met_charge) || !is.null(met_formula))
-      {  
-        for ( i in 1:met_num(morg)) 
-        {
-          
-          if(nchar(met_notes[i])> 8)
-          { 
-            # Have Assocation in Notes?yes: replace no: append
-            
-            if (regexpr("html:p", met_notes[i], fixed = TRUE) == -1)tag <- "p"
-            else tag <- "html:p"
-            
-            
-            if (!is.null(met_formula))
-            {    
-              haveform<-grepl("FORMULA: [^<]+",met_notes[i])
-              #Have Gene if not ->no need to write in FBC2
-              if(haveform)
-              {  
-                if(FbcLevel==0)met_notes[i]<-sub("FORMULA: [^<]+",paste("FORMULA: ",met_formula[i], sep = ""), met_notes[i], perl = TRUE)
-                else met_notes[i]<-sub(paste("<",tag,">","FORMULA: [^<]+","</",tag,">",sep = ""),"",met_notes[i], perl = TRUE)
-              }    
-              else if(FbcLevel==0) met_notes[i]<-gsub("</notes>",paste("<",tag,">","FORMULA: ",met_formula[i],"</",tag,">","\n</notes>",sep = ""),met_notes[i])
-            }
-            if (!is.null(met_charge))
-            {    
-              havecharge<-grepl("CHARGE: [^<]+",met_notes[i])
-              #Have Subsystem
-              if(havecharge)
-              {  
-                if(FbcLevel !=0 || (level==2 && version==1 ))
-                  met_notes[i]<-sub(paste("<",tag,">","CHARGE: [^<]+","</",tag,">",sep = ""),"",met_notes[i], perl = TRUE)
-                else met_notes[i]<-sub("CHARGE: [^<]+",paste("CHARGE: ",met_charge[i], sep = ""), met_notes[i], perl = TRUE)
-                
-                
-              }  
-              else if(FbcLevel==0) if(level!=2 && version!=1) met_notes[i]<-gsub("</notes>",paste("<",tag,">","CHARGE: ",met_charge[i],"</",tag,">","\n</notes>",sep = ""),met_notes[i])
-            }
-          }
-        }  
-      }
-      
-    }
-    if(("annotation" %in% colnames(react_attr(morg))) && (printAnnos)) react_anno<-as.character(as.list((react_attr(morg)[['annotation']])))
-    
-    # Merge Notes with "our" Notes and make sure gpr Rules from gpr
-    if(("notes" %in% colnames(react_attr(morg))) && (printNotes))
-    {
-      react_notes<-as.character(as.list((react_attr(morg)[['notes']])))
-      # using
-      #  SubSystem EXISTIERT nicht colnames(subSys(ec))
-      
-      for ( i in 1:react_num(morg)) 
-      {
-        # using the for loop
-        if(modhasubSys)newsubS[i]<- paste(names(which(subSys(morg)[i,])), collapse=", ")   
-        if(nchar(react_notes[i])> 8)
-        { 
-          # Have Association in Notes? yes: replace no: append
-          
-          if (regexpr("html:p", react_notes[i], fixed = TRUE) == -1)tag <- "p"
-          else tag <- "html:p"
-          
-          havegene<-grepl("GENE[_ ]?ASSOCIATION: [^<]+",react_notes[i])
-          havesub<-grepl("SUBSYSTEM: [^<]+",react_notes[i])
-          
-          #Have Gene if not ->no need to write in FBC2
-          if(havegene)
-          {
-            if(FbcLevel==2) react_notes[i]<-sub(paste("<",tag,">","GENE[_ ]?ASSOCIATION: [^<]+","</",tag,">",sep = ""),"",react_notes[i], perl = TRUE)
-            else react_notes[i]<-sub("GENE[_ ]?ASSOCIATION: [^<]+",paste("GENE_ASSOCIATION: ",gpr(morg)[i], sep = ""), react_notes[i], perl = TRUE)
-          }
-          else if(FbcLevel!=2)react_notes[i]<-gsub("</notes>",paste("<",tag,">","GENE_ASSOCIATION: ",gpr(morg)[i],"</",tag,">","\n</notes>",sep = ""),react_notes[i])
-          
-          #Have Subsystem
-          if(havesub)react_notes[i]<-sub("SUBSYSTEM: [^<]+",paste("SUBSYSTEM: ",newsubS[i], sep = ""), react_notes[i], perl = TRUE)
-          else if(modhasubSys) react_notes[i]<-gsub("</notes>",paste("<",tag,">","SUBSYSTEM: ",newsubS[i],"</",tag,">","\n</notes>",sep = ""),react_notes[i])
-        }
-      }  
-    }  
-    
-    
-  } ####END newSybil attr
-  
-  # Subsystem
-  if(is.null(newsubS) && !(modhasubSys) ) for ( i in 1:react_num(morg)) {newsubS[i]<- paste(names(which(subSys(morg)[i,])), collapse=", ")}
-  
-  newmet_id <- paste0("M_", (deformatSBMLid(met_id(morg))))
-  #newmet_id <- sub("\\[(\\w)\\]$", "_\\1",  newmet_id) # append compartment id, if in postfix with square brkts
-  
-  newreact_id <- paste0("R_", deformatSBMLid(react_id(morg)))
-  newmet_comp<-mod_compart(morg)[met_comp(morg)]
-  
-  
-  success <-.Call("exportSBML", PACKAGE = "sybilSBML",
-                  as.integer(version),
-                  as.integer(level),
-                  as.integer(FbcLevel),
-                  as.character(filename),
-                  SYBIL_SETTINGS("MAXIMUM"),
-                  as.character(mod_desc(morg)),
-                  as.character(mod_name(morg)),
-                  as.character(mod_compart(morg)),
-                  as.character(newmet_id),
-                  as.character(met_name(morg)),
-                  as.character(newmet_comp),
-                  met_formula,
-                  met_charge,
-                  as.character(newreact_id),
-                  as.character(react_name(morg)),
-                  as.logical(react_rev(morg)),
-                  as.numeric(lowbnd(morg)),
-                  as.numeric(uppbnd(morg)),
-                  as.integer(obj_coef(morg)),
-                  as.character(newsubS),
-                  as.character(deformatGene(gpr(morg))),
-                  as.numeric(shrinkMatrix(morg,j=1:react_num(morg))),
-                  mod_notes,
-                  mod_anno,
-                  com_notes,   
-                  com_annotation, 
-                  met_notes,      
-                  met_anno,
-                  met_bnd,
-                  react_notes,
-                  react_anno,
-                  ex_react,
-                  as.logical(validation),
-                  as.character(deformatGene(allgenes))
-  )
-  return (success)
-}
-
-
-
-
-
-
-
-
+#------------------------------------------------------------------------------#
+#                          Link to libSBML for sybil                           #
+#------------------------------------------------------------------------------#
+
+#  sybilSBML.R
+#  Link to libSBML for sybil.
+#
+#  Copyright (C) 2010-2013 Gabriel Gelius-Dietrich, Dpt. for Bioinformatics,
+#  Institute for Informatics, Heinrich-Heine-University, Duesseldorf, Germany.
+#  All right reserved.
+#  Email: geliudie@uni-duesseldorf.de
+#
+#  This file is part of sybilSBML.
+#
+#  SybilSBML is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+#  SybilSBML is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with SybilSBML.  If not, see <http://www.gnu.org/licenses/>.
+
+
+#------------------------------------------------------------------------------#
+
+versionLibSBML <- function() {
+
+    version <- .Call("getLibSBMLversion", PACKAGE = "sybilSBML")
+    return(version)
+
+}
+
+
+#------------------------------------------------------------------------------#
+
+openSBMLfile <- function(fname, ptrtype = "sbml_doc") {
+
+    if ( file.exists(fname) == FALSE ) {
+        stop("file not found: ", sQuote(fname))
+    }
+
+    sbmlf <- .Call("readSBMLfile", PACKAGE = "sybilSBML",
+                   as.character(normalizePath(fname)[1]),
+                   as.character(ptrtype)
+             )
+
+    sbmlfP <- sbmlDocPointer(sbmlf)
+
+    return(sbmlfP)
+}
+
+
+#------------------------------------------------------------------------------#
+
+closeSBMLfile <- function(sbmlf) {
+
+    invisible(
+        .Call("delDocument", PACKAGE = "sybilSBML",
+              sbmlPointer(sbmlf)
+        )
+    )
+
+}
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLmodel <- function(sbmlf, ptrtype = "sbml_mod") {
+
+    sbmlm <- .Call("getSBMLmodel", PACKAGE = "sybilSBML",
+                   sbmlPointer(sbmlf),
+                   as.character(ptrtype)
+             )
+
+    sbmlmP <- sbmlModPointer(sbmlm, sbmlf)
+
+    if (isTRUE(isNULLpointerSBML(sbmlmP))) {
+        sbmlmP <- NULL
+    }
+
+    return(sbmlmP)
+}
+
+
+#------------------------------------------------------------------------------#
+
+delSBMLmodel <- function(sbmlm) {
+
+    invisible(
+        .Call("delModel", PACKAGE = "sybilSBML",
+              sbmlPointer(sbmlm)
+        )
+    )
+
+}
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLlevel <- function(sbmlf) {
+
+    level <- .Call("getSBMLlevel", PACKAGE = "sybilSBML",
+                   sbmlPointer(sbmlf)
+             )
+
+    return(level)
+}
+
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLversion <- function(sbmlf) {
+
+    version <- .Call("getSBMLversion", PACKAGE = "sybilSBML",
+                     sbmlPointer(sbmlf)
+               )
+
+    return(version)
+}
+
+#------------------------------------------------------------------------------#
+
+getSBMLFbcversion <- function(sbmlf) {
+  
+  version <- .Call("getSBMLFbcversion", PACKAGE = "sybilSBML",
+                   sbmlPointer(sbmlf)
+  )
+  
+  return(version)
+}
+
+
+#------------------------------------------------------------------------------#
+
+validateSBMLdocument <- function(sbmlf) {
+
+    if (is(sbmlf, "character")) {
+        sbmlff <- openSBMLfile(fname = sbmlf)
+    }
+    else {
+        sbmlff <- sbmlf
+    }
+    
+    val <- .Call("validateDocument", PACKAGE = "sybilSBML",
+                 sbmlPointer(sbmlff)
+           )
+
+    if (is(sbmlf, "character")) {
+        val <- getSBMLerrors(sbmlff)
+        closeSBMLfile(sbmlff)
+    }
+
+    return(val)
+}
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLerrors <- function(sbmlf) {
+
+    err <- .Call("getSBMLerrors", PACKAGE = "sybilSBML",
+                 sbmlPointer(sbmlf)
+           )
+
+    err <- sbmlError(err, sbmlf)
+
+    return(err)
+}
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLmodId <- function(sbmlm) {
+
+    modid <- .Call("getSBMLmodId", PACKAGE = "sybilSBML",
+                   sbmlPointer(sbmlm)
+             )
+
+    return(modid)
+}
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLmodName <- function(sbmlm) {
+
+    modn <- .Call("getSBMLmodName", PACKAGE = "sybilSBML",
+                  sbmlPointer(sbmlm)
+            )
+
+    return(modn)
+}
+
+#------------------------------------------------------------------------------#
+
+getSBMLmodNotes <- function(sbmlm) {
+  
+  modnotes <- .Call("getSBMLmodNotes", PACKAGE = "sybilSBML",
+                sbmlPointer(sbmlm)
+  )
+  
+  return(modnotes)
+}
+
+#------------------------------------------------------------------------------#
+
+getSBMLmodAnnotation <- function(sbmlm) {
+  
+  modanno <- .Call("getSBMLmodAnnotation", PACKAGE = "sybilSBML",
+                sbmlPointer(sbmlm)
+  )
+  
+  return(modanno)
+}
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLnumCompart <- function(sbmlm) {
+
+    num <- .Call("getSBMLnumCompart", PACKAGE = "sybilSBML",
+                  sbmlPointer(sbmlm)
+            )
+
+    return(num)
+}
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLnumSpecies <- function(sbmlm) {
+
+    num <- .Call("getSBMLnumSpecies", PACKAGE = "sybilSBML",
+                  sbmlPointer(sbmlm)
+            )
+
+    return(num)
+}
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLnumReactions <- function(sbmlm) {
+
+    num <- .Call("getSBMLnumReactions", PACKAGE = "sybilSBML",
+                  sbmlPointer(sbmlm)
+            )
+
+    return(num)
+}
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLunitDefinitionsList <- function(sbmlm) {
+
+    units <- .Call("getSBMLunitDefinitionsList", PACKAGE = "sybilSBML",
+                   sbmlPointer(sbmlm)
+             )
+
+    return(units)
+}
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLCompartList <- function(sbmlm) {
+
+    comp <- .Call("getSBMLCompartList", PACKAGE = "sybilSBML",
+                  sbmlPointer(sbmlm)
+            )
+
+    return(comp)
+}
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLSpeciesList <- function(sbmlm) {
+
+    spec <- .Call("getSBMLSpeciesList", PACKAGE = "sybilSBML",
+                  sbmlPointer(sbmlm)
+            )
+
+    return(spec)
+}
+
+
+#------------------------------------------------------------------------------#
+
+getSBMLReactionsList <- function(sbmlm) {
+
+    react <- .Call("getSBMLReactionsList", PACKAGE = "sybilSBML",
+                   sbmlPointer(sbmlm)
+             )
+
+    return(react)
+}
+
+
+#------------------------------------------------------------------------------#
+#export mod to SBML
+deformatSBMLid <- function(idstr) {
+  idstr <- gsub("-", "_DASH_", idstr, fixed = TRUE)
+  idstr <- gsub("(", "_LPAREN_", idstr, fixed = TRUE)
+  idstr <- gsub(")", "_RPAREN_", idstr, fixed = TRUE)
+  idstr <- gsub("[", "_", idstr, fixed = TRUE)
+  idstr <- gsub("]", "", idstr, fixed = TRUE)
+  idstr <- gsub(",", "_COMMA_", idstr, fixed = TRUE)
+  idstr <- gsub(".", "_PERIOD_", idstr, fixed = TRUE)
+  idstr <- gsub("'", "_APOS_", idstr, fixed = TRUE)
+  idstr <- sub("\\(e\\)$", "_e_", idstr)
+  idstr <- gsub("-", "_", idstr, fixed = TRUE)
+  return(idstr)
+}
+
+deformatGene<-function(idstr) {
+  idstr<-gsub("\\((\\S+)\\)", "\\1", idstr)
+  #idstr <- gsub("( ", "(", idstr, fixed = TRUE)
+  #idstr <- gsub(" (", "(", idstr, fixed = TRUE)
+  #idstr <- gsub(") ", ")", idstr, fixed = TRUE)
+  #idstr <- gsub(" )", ")", idstr, fixed = TRUE)
+  idstr <- gsub(":", "_", idstr, fixed = TRUE)
+  return(idstr)
+}
+
+exportSBML<- function(morg=NULL,level=2,version=4,FbcLevel=0,filename="export.xml",recoverExtMet=TRUE,printNotes=TRUE,printAnnos=TRUE,validation=FALSE ){
+  if(class(morg)!="modelorg"){
+    stop("morg has to be of class modelorg\n")
+  }
+  
+  ###right 
+  if(level==1)
+  { 
+    # test if Matrix has no double values
+    if( !all( S(morg) == floor(S(morg))) ) warning("Level 1 does not support double values")
+    FbcLevel=0
+      if(version != 2)
+      {
+        warning("just Level 1 Version 2 will be supported")
+        version=2
+      }
+  }else if (level==2)
+  { 
+    FbcLevel=0
+    if(version >5)
+    {
+      warning("Level 2 Version 5 will be supported")
+      version=5 
+    }
+    if(version < 1)
+    {
+      warning("Level 2 Version 1 will be supported")
+      version=1 
+    }  
+  }
+  else if (level==3)
+  { if(FbcLevel >2)FbcLevel=2
+  if(version != 1)
+  {
+    print("Level 3 Version 1 will be supported")
+    version=1 
+  }
+  
+  }else {
+    stop(" Support just for Level 1,2 and 3 \n")
+  }
+  
+  ##All GENES### 
+  allgenes<- unique(unlist(genes(morg)))
+  allgenes<-allgenes[allgenes != ""]
+  
+  
+  ##EXCHANGE REACTIONS##
+  ex <- findExchReact(morg)
+  ex_react<-NULL
+  # if recoverExtMet== FALSE => null for ex_react
+  if( (!is.null(ex)) && (recoverExtMet) )
+  {
+    if(!(all(diag(S(morg)[met_pos(ex), react_pos(ex)])==-1)))
+      stop("exchange reactions with Scoeff different than -1\n")
+    ex_react<-as.integer(react_pos(ex))
+  }
+  
+  ### Build wrapper for C Function #####
+  
+  
+  ##Met Attribute###
+  com_meta_id<- NULL
+  met_meta_id<- NULL
+  com_notes <- NULL
+  com_annotation<- NULL
+  met_notes<- NULL
+  met_anno<- NULL
+  met_bnd<- NULL
+  met_charge<-NULL
+  met_formula<-NULL
+  
+  react_notes<-NULL
+  react_anno<-NULL
+  
+  mod_notes<-NULL
+  mod_anno<-NULL
+  
+  #subsystem
+  # is subsystem Empty
+  if(length( colnames(subSys(morg)))==1 && colnames(subSys(morg))[1]=="" ) modhasubSys<-FALSE
+  else modhasubSys<-TRUE
+  
+  newsubS<- NULL
+
+  if( .hasSlot(morg,"mod_attr") &&  .hasSlot(morg,"comp_attr") &&  .hasSlot(morg,"met_attr")  &&  .hasSlot(morg,"react_attr") )
+    newSybil<-TRUE
+  else newSybil<-FALSE
+  ### Start newSybil attr
+  if(newSybil)
+  { 
+    if(("notes" %in% colnames(mod_attr(morg))) && (printNotes) ) mod_notes<-as.character(mod_attr(morg)[['notes']])
+    if(("annotation" %in% colnames(mod_attr(morg))) && (printAnnos) ) mod_annotation<-as.character(mod_attr(morg)[['annotation']])
+    
+    if(("notes" %in% colnames(comp_attr(morg)))    && (printNotes) ) com_notes<-as.character(as.list((comp_attr(morg)[['notes']])))
+    if(("annotation" %in% colnames(comp_attr(morg))) && (printAnnos)  ) com_annotation<-as.character(as.list((comp_attr(morg)[['annotation']])))
+    
+    if("charge" %in% colnames(met_attr(morg))) met_charge<- as.integer(as.list((met_attr(morg)[['charge']])))
+    if("chemicalFormula" %in% colnames(met_attr(morg))) met_formula<-as.character(as.list((met_attr(morg)[['chemicalFormula']])))
+    if(("annotation" %in% colnames(met_attr(morg))) && (printAnnos)) met_anno<-as.character(as.list((met_attr(morg)[['annotation']])))
+    if("boundaryCondition" %in% colnames(met_attr(morg))) met_bnd<-as.logical(as.list((met_attr(morg)[['boundaryCondition']])))
+    
+    if(("notes" %in% colnames(met_attr(morg))) && (printNotes) )
+    {   # delete Formular and charge from notes to do
+      met_notes<-as.character(as.list((met_attr(morg)[['notes']])))
+      if (!is.null(met_charge) || !is.null(met_formula))
+      {  
+        for ( i in 1:met_num(morg)) 
+        {
+          
+          if(nchar(met_notes[i])> 8)
+          { 
+            # Have Assocation in Notes?yes: replace no: append
+            
+            if (regexpr("html:p", met_notes[i], fixed = TRUE) == -1)tag <- "p"
+            else tag <- "html:p"
+            
+            
+            if (!is.null(met_formula))
+            {    
+              haveform<-grepl("FORMULA: [^<]+",met_notes[i])
+              #Have Gene if not ->no need to write in FBC2
+              if(haveform)
+              {  
+                if(FbcLevel==0)met_notes[i]<-sub("FORMULA: [^<]+",paste("FORMULA: ",met_formula[i], sep = ""), met_notes[i], perl = TRUE)
+                else met_notes[i]<-sub(paste("<",tag,">","FORMULA: [^<]+","</",tag,">",sep = ""),"",met_notes[i], perl = TRUE)
+              }    
+              else if(FbcLevel==0) met_notes[i]<-gsub("</notes>",paste("<",tag,">","FORMULA: ",met_formula[i],"</",tag,">","\n</notes>",sep = ""),met_notes[i])
+            }
+            if (!is.null(met_charge))
+            {    
+              havecharge<-grepl("CHARGE: [^<]+",met_notes[i])
+              #Have Subsystem
+              if(havecharge)
+              {  
+                if(FbcLevel !=0 || (level==2 && version==1 ))
+                  met_notes[i]<-sub(paste("<",tag,">","CHARGE: [^<]+","</",tag,">",sep = ""),"",met_notes[i], perl = TRUE)
+                else met_notes[i]<-sub("CHARGE: [^<]+",paste("CHARGE: ",met_charge[i], sep = ""), met_notes[i], perl = TRUE)
+                
+                
+              }  
+              else if(FbcLevel==0) if(level!=2 && version!=1) met_notes[i]<-gsub("</notes>",paste("<",tag,">","CHARGE: ",met_charge[i],"</",tag,">","\n</notes>",sep = ""),met_notes[i])
+            }
+          }
+        }  
+      }
+      
+    }
+    if(("annotation" %in% colnames(react_attr(morg))) && (printAnnos)) react_anno<-as.character(as.list((react_attr(morg)[['annotation']])))
+    
+    # Merge Notes with "our" Notes and make sure gpr Rules from gpr
+    if(("notes" %in% colnames(react_attr(morg))) && (printNotes))
+    {
+      react_notes<-as.character(as.list((react_attr(morg)[['notes']])))
+      # using
+      #  SubSystem EXISTIERT nicht colnames(subSys(ec))
+      
+      for ( i in 1:react_num(morg)) 
+      {
+        # using the for loop
+        if(modhasubSys)newsubS[i]<- paste(names(which(subSys(morg)[i,])), collapse=", ")   
+        if(nchar(react_notes[i])> 8)
+        { 
+          # Have Association in Notes? yes: replace no: append
+          
+          if (regexpr("html:p", react_notes[i], fixed = TRUE) == -1)tag <- "p"
+          else tag <- "html:p"
+          
+          havegene<-grepl("GENE[_ ]?ASSOCIATION: [^<]+",react_notes[i])
+          havesub<-grepl("SUBSYSTEM: [^<]+",react_notes[i])
+          
+          #Have Gene if not ->no need to write in FBC2
+          if(havegene)
+          {
+            if(FbcLevel==2) react_notes[i]<-sub(paste("<",tag,">","GENE[_ ]?ASSOCIATION: [^<]+","</",tag,">",sep = ""),"",react_notes[i], perl = TRUE)
+            else react_notes[i]<-sub("GENE[_ ]?ASSOCIATION: [^<]+",paste("GENE_ASSOCIATION: ",gpr(morg)[i], sep = ""), react_notes[i], perl = TRUE)
+          }
+          else if(FbcLevel!=2)react_notes[i]<-gsub("</notes>",paste("<",tag,">","GENE_ASSOCIATION: ",gpr(morg)[i],"</",tag,">","\n</notes>",sep = ""),react_notes[i])
+          
+          #Have Subsystem
+          if(havesub)react_notes[i]<-sub("SUBSYSTEM: [^<]+",paste("SUBSYSTEM: ",newsubS[i], sep = ""), react_notes[i], perl = TRUE)
+          else if(modhasubSys) react_notes[i]<-gsub("</notes>",paste("<",tag,">","SUBSYSTEM: ",newsubS[i],"</",tag,">","\n</notes>",sep = ""),react_notes[i])
+        }
+      }  
+    }  
+    
+    
+  } ####END newSybil attr
+  
+  # Subsystem
+  if(is.null(newsubS) && !(modhasubSys) ) for ( i in 1:react_num(morg)) {newsubS[i]<- paste(names(which(subSys(morg)[i,])), collapse=", ")}
+  
+  newmet_id <- paste0("M_", (deformatSBMLid(met_id(morg))))
+  #newmet_id <- sub("\\[(\\w)\\]$", "_\\1",  newmet_id) # append compartment id, if in postfix with square brkts
+  
+  newreact_id <- paste0("R_", deformatSBMLid(react_id(morg)))
+  newmet_comp<-mod_compart(morg)[met_comp(morg)]
+  
+  
+  success <-.Call("exportSBML", PACKAGE = "sybilSBML",
+                  as.integer(version),
+                  as.integer(level),
+                  as.integer(FbcLevel),
+                  as.character(filename),
+                  SYBIL_SETTINGS("MAXIMUM"),
+                  as.character(mod_desc(morg)),
+                  as.character(mod_name(morg)),
+                  as.character(mod_compart(morg)),
+                  as.character(newmet_id),
+                  as.character(met_name(morg)),
+                  as.character(newmet_comp),
+                  met_formula,
+                  met_charge,
+                  as.character(newreact_id),
+                  as.character(react_name(morg)),
+                  as.logical(react_rev(morg)),
+                  as.numeric(lowbnd(morg)),
+                  as.numeric(uppbnd(morg)),
+                  as.integer(obj_coef(morg)),
+                  as.character(newsubS),
+                  as.character(deformatGene(gpr(morg))),
+                  as.numeric(shrinkMatrix(morg,j=1:react_num(morg))),
+                  mod_notes,
+                  mod_anno,
+                  com_notes,   
+                  com_annotation, 
+                  met_notes,      
+                  met_anno,
+                  met_bnd,
+                  react_notes,
+                  react_anno,
+                  ex_react,
+                  as.logical(validation),
+                  as.character(deformatGene(allgenes))
+  )
+  return (success)
+}
\ No newline at end of file
-- 
GitLab