Skip to content
Snippets Groups Projects
Commit 8df588b4 authored by Piotr Gawron's avatar Piotr Gawron
Browse files

Merge branch '365-the-same-species-appears-multiple-times-in-sbml' into 'master'

Resolve "The same species appears multiple times in SBML"

Closes #365

See merge request piotr.gawron/minerva!265
parents 80b7b4e0 22b50def
No related branches found
No related tags found
1 merge request!265Resolve "The same species appears multiple times in SBML"
Pipeline #
Showing
with 132 additions and 14 deletions
......@@ -42,16 +42,16 @@ public abstract class SbmlBioEntityExporter<T extends BioEntity, S extends org.s
sbmlModel = model;
Collection<T> speciesList = getElementList();
for (T species : speciesList) {
S sbmlCompartment = getSbmlElement(species, null);
S sbmlElement = getSbmlElement(species);
if (sbmlElementByElementId.get(species.getElementId()) != null) {
throw new InconsistentModelException("More than one species with id: " + species.getElementId());
}
sbmlElementByElementId.put(species.getElementId(), sbmlCompartment);
sbmlElementByElementId.put(species.getElementId(), sbmlElement);
}
for (T species : speciesList) {
AbstractReferenceGlyph compartmentGlyph = createGlyph(species);
sbmlGlyphByElementId.put(species.getElementId(), compartmentGlyph);
AbstractReferenceGlyph elementGlyph = createGlyph(species);
sbmlGlyphByElementId.put(species.getElementId(), elementGlyph);
}
}
......@@ -59,8 +59,8 @@ public abstract class SbmlBioEntityExporter<T extends BioEntity, S extends org.s
public abstract S createSbmlElement(T element) throws InconsistentModelException;
public S getSbmlElement(T element, String compartmentName) throws InconsistentModelException {
String mapKey = element.getClass().getSimpleName() + "\n" + element.getElementId() + "\n" + compartmentName;
public S getSbmlElement(T element) throws InconsistentModelException {
String mapKey = getSbmlIdKey(element);
if (sbmlElementByElementNameAndCompartmentName.get(mapKey) == null) {
S sbmlElement = createSbmlElement(element);
XmlAnnotationParser parser = new XmlAnnotationParser();
......@@ -81,6 +81,8 @@ public abstract class SbmlBioEntityExporter<T extends BioEntity, S extends org.s
return sbmlElementByElementNameAndCompartmentName.get(mapKey);
}
protected abstract String getSbmlIdKey(T element);
protected abstract void assignLayoutToGlyph(T element, AbstractReferenceGlyph compartmentGlyph);
protected AbstractReferenceGlyph createGlyph(T element) {
......
......@@ -31,4 +31,9 @@ public class SbmlCompartmentExporter extends SbmlElementExporter<Compartment, or
return getLayout().createCompartmentGlyph(glyphId, sbmlCompartmentId);
}
@Override
protected String getSbmlIdKey(Compartment element) {
return element.getName();
}
}
......@@ -10,6 +10,7 @@ import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph;
import org.sbml.jsbml.ext.layout.CompartmentGlyph;
import org.sbml.jsbml.ext.layout.Layout;
import lcsb.mapviewer.commands.layout.ApplySimpleLayoutModelCommand;
import lcsb.mapviewer.common.Pair;
import lcsb.mapviewer.converter.InvalidInputDataExecption;
import lcsb.mapviewer.model.map.compartment.Compartment;
......@@ -44,6 +45,8 @@ public class SbmlCompartmentParser extends SbmlElementParser<org.sbml.jsbml.Comp
for (Element element : result) {
Compartment parent = element.getCompartment();
for (Compartment compartment : minervaModel.getCompartments()) {
compartment.setNamePoint(compartment.getX() + ApplySimpleLayoutModelCommand.COMPARTMENT_BORDER,
compartment.getY() + ApplySimpleLayoutModelCommand.COMPARTMENT_BORDER);
if (parent == null || parent.getSize() > compartment.getSize()) {
if (compartment.contains(element)) {
parent = compartment;
......
......@@ -231,4 +231,9 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb
super.setSbmlModel(sbmlModel);
}
@Override
protected String getSbmlIdKey(Reaction element) {
return element.getClass().getSimpleName() + "\n" + element.getElementId();
}
}
......@@ -26,7 +26,7 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j
org.sbml.jsbml.Species result = getSbmlModel().createSpecies("species_" + (getNextId()));
result.setSBOTerm(SBOTermSpeciesType.getTermByType(element.getClass()));
if (element.getCompartment() != null) {
result.setCompartment(compartmentExporter.getSbmlElement(element.getCompartment(), null));
result.setCompartment(compartmentExporter.getSbmlElement(element.getCompartment()));
}
return result;
}
......@@ -42,4 +42,13 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j
return getMinervaModel().getSpeciesList();
}
@Override
protected String getSbmlIdKey(Species element) {
String compartmentName = null;
if (element.getCompartment() != null) {
compartmentName = element.getCompartment().getName();
}
return element.getClass().getSimpleName() + "\n" + element.getName() + "\n" + compartmentName;
}
}
......@@ -5,16 +5,16 @@ import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import lcsb.mapviewer.converter.model.sbml.reaction.AllSbmlReactionParserTests;
import lcsb.mapviewer.converter.model.sbml.species.SbmlSpeciesParserTest;
import lcsb.mapviewer.converter.model.sbml.species.AllSbmlSpeciesTests;
@RunWith(Suite.class)
@SuiteClasses({ AllSbmlReactionParserTests.class, //
AllSbmlSpeciesTests.class, //
GenericSbmlParserTest.class, //
GenericSbmlToXmlParserTest.class, //
SbmlExporterTest.class, //
SbmlPareserForInvalidReactionTest.class, //
SbmlParserTest.class, //
SbmlSpeciesParserTest.class,//
})
public class AllSbmlConverterTests {
......
......@@ -9,8 +9,11 @@ import java.awt.Desktop;
import java.awt.geom.Point2D;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.StringWriter;
import java.nio.file.Files;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.junit.Test;
......@@ -20,6 +23,7 @@ import lcsb.mapviewer.converter.IConverter;
import lcsb.mapviewer.converter.graphics.AbstractImageGenerator;
import lcsb.mapviewer.converter.graphics.NormalImageGenerator;
import lcsb.mapviewer.converter.graphics.PngImageGenerator;
import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser;
import lcsb.mapviewer.model.graphics.PolylineData;
import lcsb.mapviewer.model.map.compartment.Compartment;
import lcsb.mapviewer.model.map.model.Model;
......@@ -237,7 +241,7 @@ public class SbmlExporterTest {
assertEquals(0, comparator.compare(model, model2));
}
@Test
public void testExportModelName() throws Exception {
IConverter converter = new SbmlParser();
......@@ -257,7 +261,4 @@ public class SbmlExporterTest {
assertEquals(0, comparator.compare(model, model2));
}
}
package lcsb.mapviewer.converter.model.sbml.species;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({ SbmlSpeciesExporterTest.class, SbmlSpeciesParserTest.class })
public class AllSbmlSpeciesTests {
}
package lcsb.mapviewer.converter.model.sbml.species;
import static org.junit.Assert.assertEquals;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.sbml.jsbml.SBMLDocument;
import org.sbml.jsbml.ext.layout.Layout;
import org.sbml.jsbml.ext.layout.LayoutModelPlugin;
import lcsb.mapviewer.converter.model.sbml.SbmlCompartmentExporter;
import lcsb.mapviewer.model.map.InconsistentModelException;
import lcsb.mapviewer.model.map.compartment.Compartment;
import lcsb.mapviewer.model.map.model.Model;
import lcsb.mapviewer.model.map.model.ModelFullIndexed;
import lcsb.mapviewer.model.map.species.Element;
import lcsb.mapviewer.model.map.species.GenericProtein;
public class SbmlSpeciesExporterTest {
Logger logger = Logger.getLogger(SbmlSpeciesExporterTest.class);
SbmlCompartmentExporter compartmentExporter;
org.sbml.jsbml.Model sbmlModel;
Layout sbmlLayout;
@Test
public void testOneElementWithTwoAliases() throws InconsistentModelException {
Element protein1 = new GenericProtein("sa1");
protein1.setName("SNCA");
Element protein2 = new GenericProtein("sa2");
protein2.setName("SNCA");
Model model = new ModelFullIndexed(null);
model.addElement(protein1);
model.addElement(protein2);
SbmlSpeciesExporter exporter = createExporter(model);
exporter.exportElements(sbmlModel);
assertEquals(1, sbmlModel.getSpeciesCount());
}
@Test
public void testOneElementButInTwoCompartments() throws InconsistentModelException {
Compartment compartment = new Compartment("c1");
compartment.setName("test");
Element protein1 = new GenericProtein("sa1");
protein1.setName("SNCA");
Element protein2 = new GenericProtein("sa2");
protein2.setName("SNCA");
protein2.setCompartment(compartment);
Model model = new ModelFullIndexed(null);
model.addElement(protein1);
model.addElement(protein2);
model.addElement(compartment);
SbmlSpeciesExporter exporter = createExporter(model);
exporter.exportElements(sbmlModel);
assertEquals(2, sbmlModel.getSpeciesCount());
}
private SbmlSpeciesExporter createExporter(Model model) throws InconsistentModelException {
SBMLDocument doc = new SBMLDocument(3, 1);
sbmlModel = doc.createModel(model.getIdModel());
LayoutModelPlugin layoutPlugin = new LayoutModelPlugin(sbmlModel);
sbmlLayout = new Layout();
layoutPlugin.add(sbmlLayout);
sbmlModel.addExtension("layout", layoutPlugin);
SbmlCompartmentExporter compartmentExporter = new SbmlCompartmentExporter(sbmlLayout, model);
compartmentExporter.exportElements(sbmlModel);
SbmlSpeciesExporter result = new SbmlSpeciesExporter(sbmlLayout, model, compartmentExporter);
return result;
}
}
......@@ -41,7 +41,7 @@ public class ApplySimpleLayoutModelCommand extends ApplyLayoutModelCommand {
@SuppressWarnings("unused")
private Logger logger = Logger.getLogger(ApplySimpleLayoutModelCommand.class);
private static final double COMPARTMENT_BORDER = 10;
public static final double COMPARTMENT_BORDER = 10;
private static final double BORDER_FROM_EXISTING_ELEMENTS = 10;
private static final int SPECIES_WIDTH = 90;
private static final int SPECIES_HEIGHT = 30;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment