From 791b6fafd086cd828e13a8c0c67a7c7cf3134369 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 7 Feb 2018 16:22:42 +0100
Subject: [PATCH] parsing of sbo terms for modifiers added

---
 .../sbml/reaction/SBOTermModifierType.java    | 50 ++++++++++++++++
 .../sbml/reaction/SbmlReactionParser.java     | 13 ++++-
 .../model/sbml/AllSbmlConverterTests.java     |  2 +
 .../sbml/reaction/SbmlReactionParserTest.java | 57 +++++++++++++++++++
 .../testFiles/small/modifier/catalysis.xml    | 45 +++++++++++++++
 .../testFiles/small/modifier/inhibition.xml   | 45 +++++++++++++++
 .../small/modifier/unknown_catalysis.xml      | 45 +++++++++++++++
 .../small/modifier/unknown_inhibition.xml     | 45 +++++++++++++++
 8 files changed, 299 insertions(+), 3 deletions(-)
 create mode 100644 converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SBOTermModifierType.java
 create mode 100644 converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParserTest.java
 create mode 100644 converter-sbml/testFiles/small/modifier/catalysis.xml
 create mode 100644 converter-sbml/testFiles/small/modifier/inhibition.xml
 create mode 100644 converter-sbml/testFiles/small/modifier/unknown_catalysis.xml
 create mode 100644 converter-sbml/testFiles/small/modifier/unknown_inhibition.xml

diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SBOTermModifierType.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SBOTermModifierType.java
new file mode 100644
index 0000000000..605f4b8c5f
--- /dev/null
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SBOTermModifierType.java
@@ -0,0 +1,50 @@
+package lcsb.mapviewer.converter.model.sbml.reaction;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import lcsb.mapviewer.model.map.modifier.Catalysis;
+import lcsb.mapviewer.model.map.modifier.Inhibition;
+import lcsb.mapviewer.model.map.modifier.UnknownCatalysis;
+import lcsb.mapviewer.model.map.modifier.UnknownInhibition;
+import lcsb.mapviewer.model.map.reaction.Modifier;
+
+public enum SBOTermModifierType {
+  CATALYSIS(Catalysis.class, new String[] { "SBO:0000013" }), //
+  INHIBITION(Inhibition.class, new String[] { "SBO:0000537" }), //
+  UNKNOWN_CATALYSIS(UnknownCatalysis.class, new String[] { "SBO:0000462" }), //
+  UNKNOWN_INHIBITION(UnknownInhibition.class, new String[] { "SBO:0000536" }), //
+  ;
+
+  private static Logger logger = Logger.getLogger(SBOTermModifierType.class);
+  private Set<String> sboTerms = new HashSet<>();
+  Class<? extends Modifier> clazz;
+
+  private SBOTermModifierType(Class<? extends Modifier> clazz, String[] inputSboTerms) {
+    this.clazz = clazz;
+    for (String string : inputSboTerms) {
+      sboTerms.add(string);
+    }
+  }
+
+  public static Class<? extends Modifier> getTypeSBOTerm(String sboTerm) {
+    if (sboTerm == null || sboTerm.isEmpty()) {
+      return Modifier.class;
+    }
+    Class<? extends Modifier> result = null;
+    for (SBOTermModifierType term : values()) {
+      for (String string : term.sboTerms) {
+        if (string.equalsIgnoreCase(sboTerm)) {
+          result = term.clazz;
+        }
+      }
+    }
+    if (result == null) {
+      logger.warn("Don't know how to handle SBOTerm " + sboTerm + " for modifier");
+      result = Modifier.class;
+    }
+    return result;
+  }
+}
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java
index bbd35ecbd8..d92ca8f6ea 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java
@@ -235,7 +235,7 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
           operator.setLine(line);
           reactionWithLayout.addNode(operator);
         }
-        minervaModel.addReaction(new StateTransitionReaction(reactionWithLayout));
+        minervaModel.addReaction(reactionWithLayout);
       } catch (InvalidArgumentException e) {
         throw new InvalidInputDataExecption(e);
       }
@@ -295,7 +295,14 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
 
     for (ModifierSpeciesReference modifier : sbmlReaction.getListOfModifiers()) {
       Species element = minervaModel.getElementByElementId(modifier.getSpecies());
-      reaction.addModifier(new Modifier(element));
+      Class<? extends Modifier> nodeClass = SBOTermModifierType.getTypeSBOTerm(modifier.getSBOTermID());
+      try {
+        Modifier newNode = nodeClass.getConstructor(Element.class).newInstance(element);
+        reaction.addModifier(newNode);
+      } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+          | NoSuchMethodException | SecurityException e) {
+        throw new InvalidInputDataExecption("Problem with creating modifier", e);
+      }
     }
 
     return reaction;
@@ -306,7 +313,7 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
     result.setDefinition(kineticLaw.getMath().toMathML());
 
     SbmlParameterParser parameterParser = new SbmlParameterParser(minervaModel);
-    result.addParameters(parameterParser.parseList((Collection<LocalParameter>)kineticLaw.getListOfLocalParameters()));
+    result.addParameters(parameterParser.parseList((Collection<LocalParameter>) kineticLaw.getListOfLocalParameters()));
 
     try {
       Node node = super.getXmlDocumentFromString(result.getDefinition());
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/AllSbmlConverterTests.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/AllSbmlConverterTests.java
index c6ec3e57c9..8996139330 100644
--- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/AllSbmlConverterTests.java
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/AllSbmlConverterTests.java
@@ -4,6 +4,7 @@ import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
 import org.junit.runners.Suite.SuiteClasses;
 
+import lcsb.mapviewer.converter.model.sbml.reaction.SbmlReactionParserTest;
 import lcsb.mapviewer.converter.model.sbml.species.SbmlSpeciesParserTest;
 
 @RunWith(Suite.class)
@@ -12,6 +13,7 @@ import lcsb.mapviewer.converter.model.sbml.species.SbmlSpeciesParserTest;
     SbmlExporterTest.class, //
     SbmlPareserForInvalidReactionTest.class, //
     SbmlParserTest.class, //
+    SbmlReactionParserTest.class, //
     SbmlSpeciesParserTest.class,//
 })
 public class AllSbmlConverterTests {
diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParserTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParserTest.java
new file mode 100644
index 0000000000..ac66ea7393
--- /dev/null
+++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParserTest.java
@@ -0,0 +1,57 @@
+package lcsb.mapviewer.converter.model.sbml.reaction;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.FileNotFoundException;
+
+import org.apache.log4j.Logger;
+import org.junit.Test;
+
+import lcsb.mapviewer.converter.ConverterParams;
+import lcsb.mapviewer.converter.InvalidInputDataExecption;
+import lcsb.mapviewer.converter.model.sbml.SbmlParser;
+import lcsb.mapviewer.model.map.model.Model;
+import lcsb.mapviewer.model.map.modifier.Catalysis;
+import lcsb.mapviewer.model.map.modifier.Inhibition;
+import lcsb.mapviewer.model.map.modifier.UnknownCatalysis;
+import lcsb.mapviewer.model.map.modifier.UnknownInhibition;
+import lcsb.mapviewer.model.map.reaction.Reaction;
+
+public class SbmlReactionParserTest {
+  Logger logger = Logger.getLogger(SbmlReactionParserTest.class);
+  SbmlParser parser = new SbmlParser();
+
+  @Test
+  public void testParseCatalysis() throws FileNotFoundException, InvalidInputDataExecption {
+    Model model = parser.createModel(new ConverterParams().filename("testFiles/small/modifier/catalysis.xml"));
+    Reaction reaction = model.getReactions().iterator().next();
+    assertNotNull(reaction);
+    assertTrue(reaction.getModifiers().iterator().next() instanceof Catalysis);
+  }
+
+  @Test
+  public void testParseInhibition() throws FileNotFoundException, InvalidInputDataExecption {
+    Model model = parser.createModel(new ConverterParams().filename("testFiles/small/modifier/inhibition.xml"));
+    Reaction reaction = model.getReactions().iterator().next();
+    assertNotNull(reaction);
+    assertTrue(reaction.getModifiers().iterator().next() instanceof Inhibition);
+  }
+
+  @Test
+  public void testParseUnknownCatalysis() throws FileNotFoundException, InvalidInputDataExecption {
+    Model model = parser.createModel(new ConverterParams().filename("testFiles/small/modifier/unknown_catalysis.xml"));
+    Reaction reaction = model.getReactions().iterator().next();
+    assertNotNull(reaction);
+    assertTrue(reaction.getModifiers().iterator().next() instanceof UnknownCatalysis);
+  }
+
+  @Test
+  public void testParseUnknownInhibition() throws FileNotFoundException, InvalidInputDataExecption {
+    Model model = parser.createModel(new ConverterParams().filename("testFiles/small/modifier/unknown_inhibition.xml"));
+    Reaction reaction = model.getReactions().iterator().next();
+    assertNotNull(reaction);
+    assertTrue(reaction.getModifiers().iterator().next() instanceof UnknownInhibition);
+  }
+
+}
diff --git a/converter-sbml/testFiles/small/modifier/catalysis.xml b/converter-sbml/testFiles/small/modifier/catalysis.xml
new file mode 100644
index 0000000000..5e7ce9c465
--- /dev/null
+++ b/converter-sbml/testFiles/small/modifier/catalysis.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sbml xmlns="http://www.sbml.org/sbml/level2/version4" level="2" version="4">
+  <model id="TestGEN">
+    <annotation/>
+    <listOfCompartments>
+      <compartment constant="true" id="cell" name="cell" sboTerm="SBO:0000290" size="1">
+        <annotation>
+          <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:bqmodel="http://biomodels.net/model-qualifiers/" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/">
+            <rdf:Description rdf:about="#">
+              <bqbiol:isVersionOf>
+                <rdf:Bag>
+                  <rdf:li rdf:resource="urn:miriam:obo.go:GO:0005623"/>
+                </rdf:Bag>
+              </bqbiol:isVersionOf>
+            </rdf:Description>
+          </rdf:RDF>
+        </annotation>
+      </compartment>
+    </listOfCompartments>
+    <listOfSpecies>
+      <species compartment="cell" initialConcentration="1" id="s1" name="nm1">
+        <annotation/>
+      </species>
+      <species compartment="cell" initialConcentration="1" id="s2" name="nm2">
+        <annotation/>
+      </species>
+      <species compartment="cell" initialConcentration="1" id="s3" name="nm3">
+        <annotation/>
+      </species>
+    </listOfSpecies>
+    <listOfReactions>
+      <reaction id="re1">
+        <listOfReactants>
+          <speciesReference species="s1" stoichiometry="1"/>
+        </listOfReactants>
+        <listOfProducts>
+          <speciesReference species="s2" stoichiometry="1"/>
+        </listOfProducts>
+        <listOfModifiers>
+          <modifierSpeciesReference species="s3" sboTerm="SBO:0000013"/>
+        </listOfModifiers>
+      </reaction>
+    </listOfReactions>
+  </model>
+</sbml>
\ No newline at end of file
diff --git a/converter-sbml/testFiles/small/modifier/inhibition.xml b/converter-sbml/testFiles/small/modifier/inhibition.xml
new file mode 100644
index 0000000000..e40bd9cb5f
--- /dev/null
+++ b/converter-sbml/testFiles/small/modifier/inhibition.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sbml xmlns="http://www.sbml.org/sbml/level2/version4" level="2" version="4">
+  <model id="TestGEN">
+    <annotation/>
+    <listOfCompartments>
+      <compartment constant="true" id="cell" name="cell" sboTerm="SBO:0000290" size="1">
+        <annotation>
+          <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:bqmodel="http://biomodels.net/model-qualifiers/" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/">
+            <rdf:Description rdf:about="#">
+              <bqbiol:isVersionOf>
+                <rdf:Bag>
+                  <rdf:li rdf:resource="urn:miriam:obo.go:GO:0005623"/>
+                </rdf:Bag>
+              </bqbiol:isVersionOf>
+            </rdf:Description>
+          </rdf:RDF>
+        </annotation>
+      </compartment>
+    </listOfCompartments>
+    <listOfSpecies>
+      <species compartment="cell" initialConcentration="1" id="s1" name="nm1">
+        <annotation/>
+      </species>
+      <species compartment="cell" initialConcentration="1" id="s2" name="nm2">
+        <annotation/>
+      </species>
+      <species compartment="cell" initialConcentration="1" id="s3" name="nm3">
+        <annotation/>
+      </species>
+    </listOfSpecies>
+    <listOfReactions>
+      <reaction id="re1">
+        <listOfReactants>
+          <speciesReference species="s1" stoichiometry="1"/>
+        </listOfReactants>
+        <listOfProducts>
+          <speciesReference species="s2" stoichiometry="1"/>
+        </listOfProducts>
+        <listOfModifiers>
+          <modifierSpeciesReference species="s3" sboTerm="SBO:0000537"/>
+        </listOfModifiers>
+      </reaction>
+    </listOfReactions>
+  </model>
+</sbml>
\ No newline at end of file
diff --git a/converter-sbml/testFiles/small/modifier/unknown_catalysis.xml b/converter-sbml/testFiles/small/modifier/unknown_catalysis.xml
new file mode 100644
index 0000000000..d3f6a2c8e1
--- /dev/null
+++ b/converter-sbml/testFiles/small/modifier/unknown_catalysis.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sbml xmlns="http://www.sbml.org/sbml/level2/version4" level="2" version="4">
+  <model id="TestGEN">
+    <annotation/>
+    <listOfCompartments>
+      <compartment constant="true" id="cell" name="cell" sboTerm="SBO:0000290" size="1">
+        <annotation>
+          <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:bqmodel="http://biomodels.net/model-qualifiers/" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/">
+            <rdf:Description rdf:about="#">
+              <bqbiol:isVersionOf>
+                <rdf:Bag>
+                  <rdf:li rdf:resource="urn:miriam:obo.go:GO:0005623"/>
+                </rdf:Bag>
+              </bqbiol:isVersionOf>
+            </rdf:Description>
+          </rdf:RDF>
+        </annotation>
+      </compartment>
+    </listOfCompartments>
+    <listOfSpecies>
+      <species compartment="cell" initialConcentration="1" id="s1" name="nm1">
+        <annotation/>
+      </species>
+      <species compartment="cell" initialConcentration="1" id="s2" name="nm2">
+        <annotation/>
+      </species>
+      <species compartment="cell" initialConcentration="1" id="s3" name="nm3">
+        <annotation/>
+      </species>
+    </listOfSpecies>
+    <listOfReactions>
+      <reaction id="re1">
+        <listOfReactants>
+          <speciesReference species="s1" stoichiometry="1"/>
+        </listOfReactants>
+        <listOfProducts>
+          <speciesReference species="s2" stoichiometry="1"/>
+        </listOfProducts>
+        <listOfModifiers>
+          <modifierSpeciesReference species="s3" sboTerm="SBO:0000462"/>
+        </listOfModifiers>
+      </reaction>
+    </listOfReactions>
+  </model>
+</sbml>
\ No newline at end of file
diff --git a/converter-sbml/testFiles/small/modifier/unknown_inhibition.xml b/converter-sbml/testFiles/small/modifier/unknown_inhibition.xml
new file mode 100644
index 0000000000..ae574907ea
--- /dev/null
+++ b/converter-sbml/testFiles/small/modifier/unknown_inhibition.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sbml xmlns="http://www.sbml.org/sbml/level2/version4" level="2" version="4">
+  <model id="TestGEN">
+    <annotation/>
+    <listOfCompartments>
+      <compartment constant="true" id="cell" name="cell" sboTerm="SBO:0000290" size="1">
+        <annotation>
+          <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:bqmodel="http://biomodels.net/model-qualifiers/" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/">
+            <rdf:Description rdf:about="#">
+              <bqbiol:isVersionOf>
+                <rdf:Bag>
+                  <rdf:li rdf:resource="urn:miriam:obo.go:GO:0005623"/>
+                </rdf:Bag>
+              </bqbiol:isVersionOf>
+            </rdf:Description>
+          </rdf:RDF>
+        </annotation>
+      </compartment>
+    </listOfCompartments>
+    <listOfSpecies>
+      <species compartment="cell" initialConcentration="1" id="s1" name="nm1">
+        <annotation/>
+      </species>
+      <species compartment="cell" initialConcentration="1" id="s2" name="nm2">
+        <annotation/>
+      </species>
+      <species compartment="cell" initialConcentration="1" id="s3" name="nm3">
+        <annotation/>
+      </species>
+    </listOfSpecies>
+    <listOfReactions>
+      <reaction id="re1">
+        <listOfReactants>
+          <speciesReference species="s1" stoichiometry="1"/>
+        </listOfReactants>
+        <listOfProducts>
+          <speciesReference species="s2" stoichiometry="1"/>
+        </listOfProducts>
+        <listOfModifiers>
+          <modifierSpeciesReference species="s3" sboTerm="SBO:0000536"/>
+        </listOfModifiers>
+      </reaction>
+    </listOfReactions>
+  </model>
+</sbml>
\ No newline at end of file
-- 
GitLab