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 0000000000000000000000000000000000000000..dce3f6eabbb4b8ecad6e03d014159e10c6c86f18 --- /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 f93acacea88dcae1c7c0e68d43f76d06fc00ad13..07a3d675f7d6710ed737c90cb33690f0ab5c554f 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 fe21d6e802922002be13b8ae0ade69a2aee673ff..25cc6d75a67bcf98703ddeb0cdfe584123f9e286 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>