From eaea8d6f363f781a337d052919d4b24b73092d14 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Tue, 6 Feb 2018 14:27:20 +0100
Subject: [PATCH] parsing of global parameters supported

---
 .../converter/model/sbml/SbmlExporter.java    |  3 +
 .../model/sbml/SbmlParameterExporter.java     | 32 +++++++
 .../model/sbml/SbmlParameterParser.java       | 39 ++++++++
 .../converter/model/sbml/SbmlParser.java      |  9 +-
 .../converter/model/sbml/SbmlParserTest.java  | 13 +++
 .../layoutExample/kinetic_global_paramter.xml | 90 +++++++++++++++++++
 6 files changed, 181 insertions(+), 5 deletions(-)
 create mode 100644 converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParameterExporter.java
 create mode 100644 converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParameterParser.java
 create mode 100644 converter-sbml/testFiles/layoutExample/kinetic_global_paramter.xml

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 1b159bd344..2124b0065b 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 0000000000..a89e7aebdf
--- /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 0000000000..111f6fe8b8
--- /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 38045d6103..b7eb54f4ac 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 91893ec7d4..19a431f9f7 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 0000000000..350fb62672
--- /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>
-- 
GitLab