diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExporter.java index 1b159bd3442905bda25a7824effc8533808ea921..2124b0065ba3b252e690dde923141ebfdc56537a 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExporter.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExporter.java @@ -27,10 +27,13 @@ public class SbmlExporter { compartmentExporter); SbmlReactionExporter reactionExporter = new SbmlReactionExporter(layout, model, speciesExporter, compartmentExporter); SbmlUnitExporter unitExporter = new SbmlUnitExporter(model); + SbmlParameterExporter parameterExporter = new SbmlParameterExporter(model); + compartmentExporter.exportElements(result); speciesExporter.exportElements(result); reactionExporter.exportElements(result); unitExporter.exportUnits(result); + parameterExporter.exportParameter(result); ByteArrayOutputStream stream = new ByteArrayOutputStream(); diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParameterExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParameterExporter.java new file mode 100644 index 0000000000000000000000000000000000000000..a89e7aebdf0d14bef465ff4bc73d3cb0bc1bcee8 --- /dev/null +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParameterExporter.java @@ -0,0 +1,32 @@ +package lcsb.mapviewer.converter.model.sbml; + +import org.apache.log4j.Logger; +import org.sbml.jsbml.Parameter; + +import lcsb.mapviewer.model.map.kinetics.SbmlParameter; +import lcsb.mapviewer.model.map.model.Model; + +public class SbmlParameterExporter { + Logger logger = Logger.getLogger(SbmlParameterExporter.class); + private Model minervaModel; + + public SbmlParameterExporter(lcsb.mapviewer.model.map.model.Model minervaModel) { + this.minervaModel = minervaModel; + } + + public void exportParameter(org.sbml.jsbml.Model result) { + for (SbmlParameter unit : minervaModel.getParameters()) { + result.addParameter(createParameter(unit)); + } + } + + private Parameter createParameter(SbmlParameter unit) { + Parameter result = new Parameter(); + result.setName(unit.getName()); + result.setValue(unit.getValue()); + result.setId(unit.getParameterId()); + result.setUnits(unit.getUnits().getUnitId()); + return result; + } + +} diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParameterParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParameterParser.java new file mode 100644 index 0000000000000000000000000000000000000000..111f6fe8b874cac340256fb29ff8b79a4baac21c --- /dev/null +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParameterParser.java @@ -0,0 +1,39 @@ +package lcsb.mapviewer.converter.model.sbml; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.log4j.Logger; +import org.sbml.jsbml.ListOf; +import org.sbml.jsbml.Model; + +import lcsb.mapviewer.model.map.kinetics.SbmlParameter; + +public class SbmlParameterParser extends SbmlBioEntityParser { + Logger logger = Logger.getLogger(SbmlParameterParser.class); + + public SbmlParameterParser(lcsb.mapviewer.model.map.model.Model minervaModel) { + this.minervaModel = minervaModel; + } + + protected SbmlParameter parse(org.sbml.jsbml.Parameter unitDefinition, Model sbmlModel) { + SbmlParameter result = new SbmlParameter(unitDefinition.getId()); + result.setName(unitDefinition.getName()); + result.setValue(unitDefinition.getValue()); + result.setUnits(minervaModel.getUnitsByUnitId(unitDefinition.getUnits())); + return result; + } + + protected ListOf<org.sbml.jsbml.Parameter> getSbmlElementList(Model sbmlModel) { + return sbmlModel.getListOfParameters(); + } + + public Collection<SbmlParameter> parseList(Model sbmlModel) { + List<SbmlParameter> result = new ArrayList<>(); + for (org.sbml.jsbml.Parameter unitDefinition : getSbmlElementList(sbmlModel)) { + result.add(parse(unitDefinition, sbmlModel)); + } + return result; + } +} diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java index 38045d6103fd5c8d6f5328d3b13bc6434386c636..b7eb54f4ac0eee14c0cecfa754ee269ada365d6c 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java @@ -66,6 +66,7 @@ public class SbmlParser implements IConverter { SbmlSpeciesParser speciesParser = new SbmlSpeciesParser(layout, model); SbmlReactionParser reactionParser = new SbmlReactionParser(layout, model, speciesParser, compartmentParser); SbmlUnitsParser unitParser = new SbmlUnitsParser(model); + SbmlParameterParser parameterParser = new SbmlParameterParser(model); Set<MiriamData> annotations = compartmentParser.parseAnnotation(sbmlModel.getAnnotation()); if (annotations.size() > 0) { @@ -73,6 +74,7 @@ public class SbmlParser implements IConverter { } model.addUnits(unitParser.parseList(sbmlModel)); + model.addParameters(parameterParser.parseList(sbmlModel)); model.addElements(compartmentParser.parseList(sbmlModel)); model.addElements(speciesParser.parseList(sbmlModel)); @@ -104,14 +106,11 @@ public class SbmlParser implements IConverter { if (sbmlModel.getEventAssignmentCount() > 0) { throw new NotImplementedException("EventAssignemnts not implemented for model"); } - if (sbmlModel.getFunctionDefinitionCount() > 0) { - throw new NotImplementedException("FunctionDefinition not implemented for model"); - } if (sbmlModel.getInitialAssignmentCount() > 0) { throw new NotImplementedException("InitialAssignment not implemented for model"); } - if (sbmlModel.getParameterCount() > 0) { - throw new NotImplementedException("Parameter not implemented for model"); + if (sbmlModel.getFunctionDefinitionCount() > 0) { + throw new NotImplementedException("Function not implemented for model"); } if (sbmlModel.getRuleCount() > 0) { throw new NotImplementedException("Rule not implemented for model"); diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java index 91893ec7d473fdf967df337b2fe70756eb39a58f..19a431f9f72ea7b2b530d49604481b0bad919822 100644 --- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java @@ -59,6 +59,19 @@ public class SbmlParserTest { } } + @Test + public void testParseGlobalParameters() throws FileNotFoundException, InvalidInputDataExecption { + Model model = parser + .createModel(new ConverterParams().filename("testFiles/layoutExample/kinetic_global_paramter.xml")); + assertTrue("There should be a kinetic parameter defined", model.getParameters().size() > 0); + } + + @Test + public void testParseFunctions() throws FileNotFoundException, InvalidInputDataExecption { + Model model = parser.createModel(new ConverterParams().filename("testFiles/layoutExample/kinetic_function.xml")); + assertTrue("There should be a kinetic function defined", model.getFunctions().size() > 0); + } + @Test public void testParseSpecies() throws FileNotFoundException, InvalidInputDataExecption { Model model = parser diff --git a/converter-sbml/testFiles/layoutExample/kinetic_global_paramter.xml b/converter-sbml/testFiles/layoutExample/kinetic_global_paramter.xml new file mode 100644 index 0000000000000000000000000000000000000000..350fb6267230e93abc87c293548d88dad65640d4 --- /dev/null +++ b/converter-sbml/testFiles/layoutExample/kinetic_global_paramter.xml @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="UTF-8"?> +<sbml level="2" version="3" xmlns="http://www.sbml.org/sbml/level2/version3"> + <model name="EnzymaticReaction"> +<listOfParameters> +<parameter metaid="param_id" id="param_id" name="Parameter name" value="12" units="volume"/> +</listOfParameters> + <listOfUnitDefinitions> + <unitDefinition id="per_second"> + <listOfUnits> + <unit kind="second" exponent="-1"/> + </listOfUnits> + </unitDefinition> + <unitDefinition id="litre_per_mole_per_second"> + <listOfUnits> + <unit kind="mole" exponent="-1"/> + <unit kind="litre" exponent="1"/> + <unit kind="second" exponent="-1"/> + </listOfUnits> + </unitDefinition> + </listOfUnitDefinitions> + <listOfCompartments> + <compartment id="cytosol" size="1e-14"/> + </listOfCompartments> + <listOfSpecies> + <species compartment="cytosol" id="ES" initialAmount="0" name="ES"/> + <species compartment="cytosol" id="P" initialAmount="0" name="P"/> + <species compartment="cytosol" id="S" initialAmount="1e-20" name="S"/> + <species compartment="cytosol" id="E" initialAmount="5e-21" name="E"/> + </listOfSpecies> + <listOfReactions> + <reaction id="veq"> + <listOfReactants> + <speciesReference species="E"/> + <speciesReference species="S"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="ES"/> + </listOfProducts> + <kineticLaw> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <times/> + <ci>cytosol</ci> + <apply> + <minus/> + <apply> + <times/> + <ci>kon</ci> + <ci>E</ci> + <ci>S</ci> + </apply> + <apply> + <times/> + <ci>koff</ci> + <ci>ES</ci> + </apply> + </apply> + </apply> + </math> + <listOfParameters> + <parameter id="kon" value="1000000" units="litre_per_mole_per_second"/> + <parameter id="koff" value="0.2" units="per_second"/> + </listOfParameters> + </kineticLaw> + </reaction> + <reaction id="vcat" reversible="false"> + <listOfReactants> + <speciesReference species="ES"/> + </listOfReactants> + <listOfProducts> + <speciesReference species="E"/> + <speciesReference species="P"/> + </listOfProducts> + <kineticLaw> + <math xmlns="http://www.w3.org/1998/Math/MathML"> + <apply> + <times/> + <ci>cytosol</ci> + <ci>kcat</ci> + <ci>ES</ci> + </apply> + </math> + <listOfParameters> + <parameter id="kcat" value="0.1" units="per_second"/> + </listOfParameters> + </kineticLaw> + </reaction> + </listOfReactions> + </model> +</sbml>