From 76d49fc094b6d65b1510e77f32fe4f61f43fb745 Mon Sep 17 00:00:00 2001 From: Mayo Roettger <mayo.roettger@uni-duesseldorf.de> Date: Tue, 10 Mar 2020 10:15:07 +0100 Subject: [PATCH] Corrections for CRAN issues --- DESCRIPTION | 6 ++-- R/readSBMLmod.R | 9 +++--- R/sybilSBML.R | 38 ++++++++++++---------- configure | 20 ++++++------ configure.ac | 4 +-- inst/NEWS.Rd | 7 ++++- src/Makevars | 3 -- src/config.h | 82 ------------------------------------------------ src/init.c | 2 +- src/sybilSBML.c | 34 ++++++++++---------- src/sybilSBML.h | 2 +- src/symbols.rds | Bin 2023 -> 2899 bytes 12 files changed, 66 insertions(+), 141 deletions(-) delete mode 100644 src/Makevars delete mode 100644 src/config.h diff --git a/DESCRIPTION b/DESCRIPTION index 6798ad6..d0982c3 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: sybilSBML Type: Package Title: SBML Integration in Package 'Sybil' -Version: 3.0.7 -Date: 2019-08-02 +Version: 3.0.8 +Date: 2020-03-10 Authors@R: c(person("Mayo", "Roettger", role = "cre", email = "mayo.roettger@hhu.de"), person("Gabriel", "Gelius-Dietrich", role = c("aut", "ctb")), person(c("C.", "Jonathan"), "Fritzemeier", role = "ctb", email = "clausjonathan.fritzemeier@uni-duesseldorf.de"), @@ -17,7 +17,7 @@ License: GPL-3 | file LICENSE LazyLoad: yes Collate: generics.R sbmlPtrClass.R sbmlErrorClass.R sybilSBML.R uglyHack.R readSBMLmod.R zzz.R -Packaged: 2019-08-02 15:05:20 UTC; mayo +Packaged: 2020-03-10 09:00:00 UTC; mayo Author: Mayo Roettger [cre], Gabriel Gelius-Dietrich [aut, ctb], C. Jonathan Fritzemeier [ctb], diff --git a/R/readSBMLmod.R b/R/readSBMLmod.R index 5575ee0..66f13ef 100644 --- a/R/readSBMLmod.R +++ b/R/readSBMLmod.R @@ -973,16 +973,15 @@ else { # if there were fbcgprRules or notes with gpr rules, # create reaction x nGene matrix, with TRUE for respective genes for each reaction - if (isTRUE(hasNotes) || !is.null(fbcgprRules) ) { + if (isTRUE(hasNotes) || !is.null(fbcgprRules) ) { message("GPR mapping ... ", appendLF = FALSE) # Vector with all gene names != "": - #allGenes <- unique(allGenes) - #allGenesTMP <- unique(allGenes) allGenesTMP <- unique(unlist(genes)) temp <- nchar(allGenesTMP) allGenes <- allGenesTMP[which(temp != 0)] - + + # reaction x nGene matrix initialization with FALSE: rxnGeneMat <- Matrix::Matrix(FALSE, nrow = numreact, ncol = length(allGenes), @@ -990,7 +989,7 @@ else { for (i in 1 : numreact) { # if genes list element i has only 1 element and that element is not equal "" - if ( (length(genes[[i]] == 1)) && (genes[[i]] != "") ) { + if ( (length(genes[[i]] == 1)) && all(genes[[i]] != "") ) { geneInd <- match(genes[[i]], allGenes)# find gene in allGenes # Mark which genes are used in reaction with TRUE rxnGeneMat[i, geneInd] <- TRUE diff --git a/R/sybilSBML.R b/R/sybilSBML.R index 12c0a0a..00afb09 100644 --- a/R/sybilSBML.R +++ b/R/sybilSBML.R @@ -362,15 +362,15 @@ writeSBML<- function(morg=NULL,level=2,version=4,fbcLevel=0,filename="export.xml # 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) + if(version != 2) + { + warning("just Level 1 Version 2 will be supported") + version=2 + } + } else if (level==2) { fbcLevel=0 - if(version >5) + if(version > 5) { warning("Level 2 Version 5 will be supported") version=5 @@ -380,16 +380,19 @@ writeSBML<- function(morg=NULL,level=2,version=4,fbcLevel=0,filename="export.xml 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 { + } else if (level==3) + { + if(fbcLevel > 2) + { + print("FBC level 2 will be supported") + 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") } @@ -630,6 +633,7 @@ writeSBML<- function(morg=NULL,level=2,version=4,fbcLevel=0,filename="export.xml as.integer(obj_coef(morg)), as.character(newsubS), subSysGroups, + as.character(names(subSysGroups)), as.character(deformatGene(gpr(morg))), as.numeric(shrinkMatrix(morg,j=1:react_num(morg))), mod_notes, diff --git a/configure b/configure index 331c6a4..c1eee2a 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sybilSBML 3.0.7. +# Generated by GNU Autoconf 2.69 for sybilSBML 3.0.8. # # Report bugs to <mayo.roettger@hhu.de>. # @@ -580,8 +580,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sybilSBML' PACKAGE_TARNAME='sybilsbml' -PACKAGE_VERSION='3.0.7' -PACKAGE_STRING='sybilSBML 3.0.7' +PACKAGE_VERSION='3.0.8' +PACKAGE_STRING='sybilSBML 3.0.8' PACKAGE_BUGREPORT='mayo.roettger@hhu.de' PACKAGE_URL='' @@ -1241,7 +1241,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sybilSBML 3.0.7 to adapt to many kinds of systems. +\`configure' configures sybilSBML 3.0.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1303,7 +1303,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sybilSBML 3.0.7:";; + short | recursive ) echo "Configuration of sybilSBML 3.0.8:";; esac cat <<\_ACEOF @@ -1390,7 +1390,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sybilSBML configure 3.0.7 +sybilSBML configure 3.0.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1759,7 +1759,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sybilSBML $as_me 3.0.7, which was +It was created by sybilSBML $as_me 3.0.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2118,7 +2118,7 @@ if test -z "${R_HOME}"; then fi CC=`"${R_HOME}/bin/R" CMD config CC` -CPP=`"${R_HOME}/bin/R" CMD config CPP` +#CPP=`"${R_HOME}/bin/R" CMD config CPP` CFLAGS=`"${R_HOME}/bin/R" CMD config CFLAGS` CPPFLAGS=`"${R_HOME}/bin/R" CMD config CPPFLAGS` ac_ext=c @@ -4249,7 +4249,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sybilSBML $as_me 3.0.7, which was +This file was extended by sybilSBML $as_me 3.0.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -4311,7 +4311,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sybilSBML config.status 3.0.7 +sybilSBML config.status 3.0.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index b063948..da79320 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([sybilSBML], [3.0.7], [mayo.roettger@hhu.de]) +AC_INIT([sybilSBML], [3.0.8], [mayo.roettger@hhu.de]) dnl # -------------------------------------------------------------------- dnl # global (environment) variables @@ -21,7 +21,7 @@ fi dnl # GNU R default settings CC=`"${R_HOME}/bin/R" CMD config CC` -CPP=`"${R_HOME}/bin/R" CMD config CPP` +#CPP=`"${R_HOME}/bin/R" CMD config CPP` CFLAGS=`"${R_HOME}/bin/R" CMD config CFLAGS` CPPFLAGS=`"${R_HOME}/bin/R" CMD config CPPFLAGS` AC_PROG_CC diff --git a/inst/NEWS.Rd b/inst/NEWS.Rd index 06c5ee4..bf802cd 100644 --- a/inst/NEWS.Rd +++ b/inst/NEWS.Rd @@ -6,15 +6,19 @@ \newcommand{\CRANpkg}{\href{https://cran.r-project.org/package=#1}{\pkg{#1}}} % ---------------------------------------------------------------------------- % -\section{Changes in version 3.0.4 - 3.0.7 2019-08-02}{ +\section{Changes in version 3.0.4 - 3.0.8 2020-03-10}{ \itemize{ \item Maintainer change. \item Changes to be able to build package without libSBML FBC and Groups plugins. In that case, FBC-constraints and groups in the SBML model will be ignored. Added functions \code{isAvailableFBCPlugin} and \code{isAvailableGroupsPlugin}. + \item Corrections for CRAN, where && or || encountered arguments of length > 1. + \item Fix for CRAN issue: 'config' variable 'CPP' is deprecated. + \item Fix for CRAN issue: too many states (abstraction error?). } } + % ---------------------------------------------------------------------------- % \section{Changes in version 3.0.3 2018-01-02}{ \itemize{ @@ -23,6 +27,7 @@ for some newer models. } } + % ---------------------------------------------------------------------------- % \section{Changes in version 3.0.2 2017-10-24}{ \itemize{ diff --git a/src/Makevars b/src/Makevars deleted file mode 100644 index 5838658..0000000 --- a/src/Makevars +++ /dev/null @@ -1,3 +0,0 @@ -PKG_CFLAGS= -PKG_CPPFLAGS=-I/usr/include -I/usr/local/include -I/usr/include/sbml -I/usr/local/include/sbml -PKG_LIBS= -L/usr/local/lib -L/usr/lib -L/usr/lib64 -lsbml diff --git a/src/config.h b/src/config.h deleted file mode 100644 index 6042341..0000000 --- a/src/config.h +++ /dev/null @@ -1,82 +0,0 @@ -/* src/config.h. Generated from config.h.in by configure. */ -/* src/config.h.in. Generated from configure.ac by autoheader. */ - -/* Define to 1 if you have the `FbcReactionPlugin_getLowerFluxBound' function. - */ -#define HAVE_FBCREACTIONPLUGIN_GETLOWERFLUXBOUND 1 - -/* define if FBC plugin is available */ -#define HAVE_FBC_PLUGIN 1 - -/* Define to 1 if you have the `GeneProductAssociation_setAssociation' - function. */ -#define HAVE_GENEPRODUCTASSOCIATION_SETASSOCIATION 1 - -/* define if Groups plugin is available */ -#define HAVE_GROUPS_PLUGIN 1 - -/* Define to 1 if you have the <inttypes.h> header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the `sbml' library (-lsbml). */ -#define HAVE_LIBSBML 1 - -/* Define to 1 if you have the <memory.h> header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the `SBase_getPlugin' function. */ -#define HAVE_SBASE_GETPLUGIN 1 - -/* Define to 1 if you have the `SBMLExtensionRegistry_getRegisteredPackages' - function. */ -#define HAVE_SBMLEXTENSIONREGISTRY_GETREGISTEREDPACKAGES 1 - -/* Define to 1 if you have the <sbml/packages/fbc/common/FbcExtensionTypes.h> - header file. */ -#define HAVE_SBML_PACKAGES_FBC_COMMON_FBCEXTENSIONTYPES_H 1 - -/* Define to 1 if you have the - <sbml/packages/groups/common/GroupsExtensionTypes.h> header file. */ -#define HAVE_SBML_PACKAGES_GROUPS_COMMON_GROUPSEXTENSIONTYPES_H 1 - -/* Define to 1 if you have the <stdint.h> header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the <stdlib.h> header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the <strings.h> header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the <string.h> header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the <sys/stat.h> header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the <sys/types.h> header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the <unistd.h> header file. */ -#define HAVE_UNISTD_H 1 - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "mayo.roettger@hhu.de" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "sybilSBML" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "sybilSBML 3.0.6" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "sybilsbml" - -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "3.0.6" - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 diff --git a/src/init.c b/src/init.c index 89e831f..d5905ed 100644 --- a/src/init.c +++ b/src/init.c @@ -55,7 +55,7 @@ static const R_CallMethodDef callMethods[] = { {"getSBMLCompartList", (DL_FUNC) &getSBMLCompartList, 1}, {"getSBMLSpeciesList", (DL_FUNC) &getSBMLSpeciesList, 1}, {"getSBMLReactionsList", (DL_FUNC) &getSBMLReactionsList, 1}, - {"exportSBML", (DL_FUNC) &exportSBML, 34}, + {"exportSBML", (DL_FUNC) &exportSBML, 35}, {"getSBMLFbcversion", (DL_FUNC) &getSBMLFbcversion, 1}, {"isAvailableFbcPlugin", (DL_FUNC) &isAvailableFbcPlugin, 0}, {"isAvailableGroupsPlugin", (DL_FUNC) &isAvailableGroupsPlugin, 0}, diff --git a/src/sybilSBML.c b/src/sybilSBML.c index 32e1b94..a76ff8c 100644 --- a/src/sybilSBML.c +++ b/src/sybilSBML.c @@ -1682,12 +1682,12 @@ void ParseModtoAnno (SBase_t* comp , char* Mannocopy) -SEXP exportSBML (SEXP version, SEXP level, SEXP FbcLevel, SEXP filename, SEXP sybil_max, SEXP mod_desc, SEXP mod_name, SEXP mod_compart, SEXP met_id, SEXP met_name, SEXP met_comp, SEXP met_form, SEXP met_charge, SEXP react_id, SEXP react_name, SEXP react_rev, SEXP lowbnd, SEXP uppbnd, SEXP obj_coef, SEXP subSys, SEXP subSysGroups, SEXP gpr, SEXP SMatrix, SEXP mod_notes, SEXP mod_anno, SEXP com_notes , SEXP com_anno, SEXP met_notes, SEXP met_anno, SEXP met_bnd , SEXP react_notes, SEXP react_anno, SEXP ex_react, SEXP allgenes) +SEXP exportSBML (SEXP version, SEXP level, SEXP FbcLevel, SEXP filename, SEXP sybil_max, SEXP mod_desc, SEXP mod_name, SEXP mod_compart, SEXP met_id, SEXP met_name, SEXP met_comp, SEXP met_form, SEXP met_charge, SEXP react_id, SEXP react_name, SEXP react_rev, SEXP lowbnd, SEXP uppbnd, SEXP obj_coef, SEXP subSys, SEXP subSysGroups, SEXP subSysGroupsNames, SEXP gpr, SEXP SMatrix, SEXP mod_notes, SEXP mod_anno, SEXP com_notes , SEXP com_anno, SEXP met_notes, SEXP met_anno, SEXP met_bnd , SEXP react_notes, SEXP react_anno, SEXP ex_react, SEXP allgenes) { #if defined(HAVE_FBC_PLUGIN) && defined(HAVE_GROUPS_PLUGIN) - //Varaibles from R + //Variables from R const char* fname = CHAR(STRING_ELT(filename, 0)); - const char* model_desc = CHAR(STRING_ELT(mod_desc, 0)); + //unused: const char* model_desc = CHAR(STRING_ELT(mod_desc, 0)); const char* model_name = CHAR(STRING_ELT(mod_name, 0)); int SBMLlevel = INTEGER(level)[0]; @@ -1698,7 +1698,7 @@ SEXP exportSBML (SEXP version, SEXP level, SEXP FbcLevel, SEXP filename, SEXP sy double sybilmin = sybilmax*(-1); // variable FBC - XMLNamespaces_t * fbc; + //currently unused: XMLNamespaces_t * fbc; SBMLNamespaces_t * sbmlns; FluxBound_t * fluxBound; Objective_t * objective; @@ -1712,13 +1712,13 @@ SEXP exportSBML (SEXP version, SEXP level, SEXP FbcLevel, SEXP filename, SEXP sy // Variable inital - - SBMLDocument_t* sbmlDoc; + SBMLDocument_t* sbmlDoc = NULL; + Model_t* model; XMLNamespaces_t* xmlns; - UnitDefinition_t* unitdef; - Unit_t* unit; + //currently unused: UnitDefinition_t* unitdef; + //currently unused: Unit_t* unit; Species_t *sp; Reaction_t* reaction; @@ -1727,7 +1727,7 @@ SEXP exportSBML (SEXP version, SEXP level, SEXP FbcLevel, SEXP filename, SEXP sy KineticLaw_t* kl; Parameter_t* para; - // ASTNode_t* flux; + // ASTNode_t* flux; ASTNode_t* astMath; //ASTNode_t* ast; //char* mathXMLString; @@ -2300,6 +2300,7 @@ SEXP exportSBML (SEXP version, SEXP level, SEXP FbcLevel, SEXP filename, SEXP sy }// ENDE REACTION + if(SBMLfbcversion == 1) { @@ -2358,30 +2359,31 @@ SEXP exportSBML (SEXP version, SEXP level, SEXP FbcLevel, SEXP filename, SEXP sy } } - + /* add subsystem as groups if fbc is >= 2 */ if(SBMLfbcversion >= 2){ if(!Rf_isNull(subSysGroups)){ - GroupsModelPlugin_t* groupsPlug = NULL; + GroupsModelPlugin_t* groupsPlug = NULL; groupsPlug = (GroupsModelPlugin_t*) SBase_getPlugin((SBase_t *)(model), "groups"); - + for(int i=0; i < Rf_length(subSysGroups); i++){ Group_t* newGroup = GroupsModelPlugin_createGroup(groupsPlug); Group_setKindAsString(newGroup, "partonomy"); - Group_setName(newGroup, CHAR(STRING_ELT(Rf_getAttrib(subSysGroups, R_NamesSymbol), i))); + Group_setName(newGroup, CHAR(STRING_ELT(subSysGroupsNames, i))); SBase_setSBOTerm((SBase_t *) newGroup, 0000633); - + for(int j=0; j < Rf_length(VECTOR_ELT(subSysGroups, i)); j++){ Member_t* newMember = Member_create(SBMLlevel, SBMLversion, SBMLgroupsversion); Member_setIdRef(newMember, CHAR(STRING_ELT(VECTOR_ELT(subSysGroups, i), j))); Group_addMember(newGroup, newMember); } + //GroupsModelPlugin_addGroup(groupsPlug, newGroup); } } } - + // write SBML file int result = writeSBML(sbmlDoc, fname); SEXP out = R_NilValue; @@ -2390,7 +2392,7 @@ SEXP exportSBML (SEXP version, SEXP level, SEXP FbcLevel, SEXP filename, SEXP sy #else SEXP out = Rf_ScalarLogical(0);/* no success */ #endif - + //UNPROTECT(1); return out; } diff --git a/src/sybilSBML.h b/src/sybilSBML.h index 3f7526a..86ce41d 100644 --- a/src/sybilSBML.h +++ b/src/sybilSBML.h @@ -112,7 +112,7 @@ SEXP getSBMLGroupsList(SEXP sbmlmod); SEXP getSBMLReactionsList(SEXP sbmlmod); /* export Modelorg to SBML*/ -SEXP exportSBML (SEXP version, SEXP level, SEXP FbcLevel, SEXP filename, SEXP sybil_max, SEXP mod_desc, SEXP mod_name, SEXP mod_compart, SEXP met_id, SEXP met_name, SEXP met_comp, SEXP met_form, SEXP met_charge, SEXP react_id, SEXP react_name, SEXP react_rev, SEXP lowbnd, SEXP uppbnd, SEXP obj_coef, SEXP subSys, SEXP subSysGroups, SEXP gpr, SEXP SMatrix, SEXP mod_notes, SEXP mod_anno, SEXP com_notes , SEXP com_anno, SEXP met_notes, SEXP met_anno, SEXP met_bnd , SEXP react_notes, SEXP react_anno, SEXP ex_react, SEXP allgenes); +SEXP exportSBML (SEXP version, SEXP level, SEXP FbcLevel, SEXP filename, SEXP sybil_max, SEXP mod_desc, SEXP mod_name, SEXP mod_compart, SEXP met_id, SEXP met_name, SEXP met_comp, SEXP met_form, SEXP met_charge, SEXP react_id, SEXP react_name, SEXP react_rev, SEXP lowbnd, SEXP uppbnd, SEXP obj_coef, SEXP subSys, SEXP subSysGroups, SEXP subSysGroupsNames, SEXP gpr, SEXP SMatrix, SEXP mod_notes, SEXP mod_anno, SEXP com_notes , SEXP com_anno, SEXP met_notes, SEXP met_anno, SEXP met_bnd , SEXP react_notes, SEXP react_anno, SEXP ex_react, SEXP allgenes); /* check, if FBC-Plugin is available */ SEXP isAvailableFbcPlugin(); diff --git a/src/symbols.rds b/src/symbols.rds index 86d3f8e1d4117ef59178496ee79fda1f4224d930..6c50fca8d9500273b256cbe890ebb2d111bb0c44 100644 GIT binary patch literal 2899 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 literal 2023 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 HWMBXQvfKVf -- GitLab