From c9d686eea7dcf3e91d1d32eae47933625972de96 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 7 Feb 2018 15:40:23 +0100
Subject: [PATCH] species types are assigned based on sbo terms

---
 .../sbml/species/SBOTermSpeciesType.java      | 68 +++++++++++++++++++
 .../model/sbml/species/SbmlSpeciesParser.java | 11 +--
 .../testFiles/small/unknown_species.xml       |  2 +-
 3 files changed, 71 insertions(+), 10 deletions(-)
 create mode 100644 converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SBOTermSpeciesType.java

diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SBOTermSpeciesType.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SBOTermSpeciesType.java
new file mode 100644
index 0000000000..dce3f6eabb
--- /dev/null
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SBOTermSpeciesType.java
@@ -0,0 +1,68 @@
+package lcsb.mapviewer.converter.model.sbml.species;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import lcsb.mapviewer.model.map.species.AntisenseRna;
+import lcsb.mapviewer.model.map.species.Complex;
+import lcsb.mapviewer.model.map.species.Degraded;
+import lcsb.mapviewer.model.map.species.Drug;
+import lcsb.mapviewer.model.map.species.Gene;
+import lcsb.mapviewer.model.map.species.GenericProtein;
+import lcsb.mapviewer.model.map.species.Ion;
+import lcsb.mapviewer.model.map.species.IonChannelProtein;
+import lcsb.mapviewer.model.map.species.Phenotype;
+import lcsb.mapviewer.model.map.species.ReceptorProtein;
+import lcsb.mapviewer.model.map.species.Rna;
+import lcsb.mapviewer.model.map.species.SimpleMolecule;
+import lcsb.mapviewer.model.map.species.Species;
+import lcsb.mapviewer.model.map.species.Unknown;
+
+public enum SBOTermSpeciesType {
+  ANTISENSE_RNA(AntisenseRna.class, new String[] { "SBO:0000334" }), //
+  COMPLEX(Complex.class, new String[] { "SBO:0000297" }), //
+  DEGRADED(Degraded.class, new String[] { "SBO:0000291" }), //
+  DRUG(Drug.class, new String[] { "SBO:0000298" }), //
+  GENE(Gene.class, new String[] { "SBO:0000243" }), //
+  GENERIC_PROTEIN(GenericProtein.class, new String[] { "SBO:0000252" }), //
+  ION(Ion.class, new String[] { "SBO:0000327" }), //
+  ION_CHANNEL(IonChannelProtein.class, new String[] { "SBO:0000284" }), //
+  PHENOTYPE(Phenotype.class, new String[] { "SBO:0000358" }), //
+  RECEPTOR(ReceptorProtein.class, new String[] { "SBO:0000244" }), //
+  RNA(Rna.class, new String[] { "SBO:0000278" }), //
+  SIMPLE_MOLECULE(SimpleMolecule.class, new String[] { "SBO:0000247", "SBO:0000299" }), //
+  UNKNOWN(Unknown.class, new String[] { "SBO:0000285" }), //
+  ;
+
+  private static Logger logger = Logger.getLogger(SBOTermSpeciesType.class);
+  private Set<String> sboTerms = new HashSet<>();
+  Class<? extends Species> clazz;
+
+  private SBOTermSpeciesType(Class<? extends Species> clazz, String[] inputSboTerms) {
+    this.clazz = clazz;
+    for (String string : inputSboTerms) {
+      sboTerms.add(string);
+    }
+  }
+
+  public static Class<? extends Species> getTypeSBOTerm(String sboTerm) {
+    if (sboTerm == null || sboTerm.isEmpty()) {
+      return SimpleMolecule.class;
+    }
+    Class<? extends Species> result = null;
+    for (SBOTermSpeciesType 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 species");
+      result = SimpleMolecule.class;
+    }
+    return result;
+  }
+}
diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParser.java
index f93acacea8..07a3d675f7 100644
--- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParser.java
+++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesParser.java
@@ -18,7 +18,6 @@ import lcsb.mapviewer.converter.InvalidInputDataExecption;
 import lcsb.mapviewer.converter.model.sbml.SbmlElementParser;
 import lcsb.mapviewer.model.map.compartment.Compartment;
 import lcsb.mapviewer.model.map.species.Element;
-import lcsb.mapviewer.model.map.species.SimpleMolecule;
 import lcsb.mapviewer.model.map.species.Species;
 
 public class SbmlSpeciesParser extends SbmlElementParser<org.sbml.jsbml.Species> {
@@ -30,14 +29,8 @@ public class SbmlSpeciesParser extends SbmlElementParser<org.sbml.jsbml.Species>
 
   @Override
   protected Species parse(org.sbml.jsbml.Species species, Model sbmlModel) throws InvalidInputDataExecption {
-    String type = species.getSpeciesType();
-    Class<? extends Species> clazz = null;
-    if (type == null || type.isEmpty()) {
-      clazz = SimpleMolecule.class;
-    }
-    if (clazz == null) {
-      throw new InvalidInputDataExecption("Unknown species type: " + type);
-    }
+    String sboTerm = species.getSBOTermID();
+    Class<? extends Species> clazz = SBOTermSpeciesType.getTypeSBOTerm(sboTerm);
     try {
       Species result = clazz.getConstructor(String.class).newInstance(species.getId());
       assignBioEntityData(species, result);
diff --git a/converter-sbml/testFiles/small/unknown_species.xml b/converter-sbml/testFiles/small/unknown_species.xml
index fe21d6e802..25cc6d75a6 100644
--- a/converter-sbml/testFiles/small/unknown_species.xml
+++ b/converter-sbml/testFiles/small/unknown_species.xml
@@ -18,7 +18,7 @@
       </compartment>
     </listOfCompartments>
     <listOfSpecies>
-      <species boundaryCondition="false" compartment="cell" initialConcentration="1" id="s1" name="nm1" sboTerm="SBO:0000462">
+      <species boundaryCondition="false" compartment="cell" initialConcentration="1" id="s1" name="nm1" sboTerm="SBO:0000285">
         <annotation/>
       </species>
     </listOfSpecies>
-- 
GitLab