From c09422ac2f3d395ff058723c7d3fedce329f548f Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Fri, 16 Nov 2018 18:15:01 +0100 Subject: [PATCH] export to sbml includes default compartment, and import ingornes this compartment --- .../model/sbml/SbmlBioEntityExporter.java | 2 +- .../model/sbml/SbmlCompartmentExporter.java | 39 -------- .../model/sbml/SbmlElementParser.java | 6 +- .../converter/model/sbml/SbmlExporter.java | 1 + .../converter/model/sbml/SbmlParser.java | 2 + .../compartment/SbmlCompartmentExporter.java | 96 +++++++++++++++++++ .../SbmlCompartmentParser.java | 12 ++- .../sbml/reaction/SbmlReactionParser.java | 2 +- .../sbml/species/SbmlSpeciesExporter.java | 8 +- .../model/sbml/species/SbmlSpeciesParser.java | 2 +- .../model/sbml/SbmlExporterTest.java | 2 + .../reaction/SbmlReactionExportArrowType.java | 1 + .../reaction/SbmlReactionExporterTest.java | 2 +- .../sbml/species/SbmlSpeciesExporterTest.java | 2 +- 14 files changed, 123 insertions(+), 54 deletions(-) delete mode 100644 converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlCompartmentExporter.java create mode 100644 converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentExporter.java rename converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/{ => compartment}/SbmlCompartmentParser.java (84%) diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java index be31323ace..58f4824698 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java @@ -38,7 +38,7 @@ public abstract class SbmlBioEntityExporter<T extends BioEntity, S extends org.s private Map<String, S> sbmlElementByElementId = new HashMap<>(); Map<String, AbstractReferenceGlyph> sbmlGlyphByElementId = new HashMap<>(); - private Map<String, S> sbmlElementByElementNameAndCompartmentName = new HashMap<>(); + protected Map<String, S> sbmlElementByElementNameAndCompartmentName = new HashMap<>(); private int idCounter = 0; diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlCompartmentExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlCompartmentExporter.java deleted file mode 100644 index 2399328b4f..0000000000 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlCompartmentExporter.java +++ /dev/null @@ -1,39 +0,0 @@ -package lcsb.mapviewer.converter.model.sbml; - -import java.util.List; - -import org.apache.log4j.Logger; -import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph; -import org.sbml.jsbml.ext.layout.Layout; - -import lcsb.mapviewer.model.map.InconsistentModelException; -import lcsb.mapviewer.model.map.compartment.Compartment; - -public class SbmlCompartmentExporter extends SbmlElementExporter<Compartment, org.sbml.jsbml.Compartment> { - Logger logger = Logger.getLogger(SbmlCompartmentExporter.class); - - public SbmlCompartmentExporter(Layout layout, lcsb.mapviewer.model.map.model.Model minervaModel) { - super(layout, minervaModel); - } - - @Override - public org.sbml.jsbml.Compartment createSbmlElement(Compartment element) throws InconsistentModelException { - return getSbmlModel().createCompartment("comp_" + (getNextId())); - } - - @Override - protected List<Compartment> getElementList() { - return getMinervaModel().getCompartments(); - } - - @Override - protected AbstractReferenceGlyph createElementGlyph(String sbmlCompartmentId, String glyphId) { - return getLayout().createCompartmentGlyph(glyphId, sbmlCompartmentId); - } - - @Override - protected String getSbmlIdKey(Compartment element) { - return element.getName(); - } - -} diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java index 8f630430f0..fd13c6671c 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java @@ -33,8 +33,10 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends List<Element> result = new ArrayList<>(); for (T sbmlElement : getSbmlElementList(sbmlModel)) { Element element = parse(sbmlElement, sbmlModel); - result.add(element); - elementBySbmlId.put(element.getElementId(), element); + if (element != null) { + result.add(element); + elementBySbmlId.put(element.getElementId(), element); + } } return result; } 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 c3461c3d7d..4b2b94f06f 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 @@ -18,6 +18,7 @@ import org.sbml.jsbml.ext.render.RenderLayoutPlugin; import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.common.exception.InvalidStateException; +import lcsb.mapviewer.converter.model.sbml.compartment.SbmlCompartmentExporter; import lcsb.mapviewer.converter.model.sbml.reaction.SbmlReactionExporter; import lcsb.mapviewer.converter.model.sbml.species.SbmlSpeciesExporter; import lcsb.mapviewer.converter.model.sbml.units.SbmlUnitExporter; 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 2b97fc6adf..2696dc1037 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 @@ -29,12 +29,14 @@ import lcsb.mapviewer.converter.ConverterException; import lcsb.mapviewer.converter.ConverterParams; import lcsb.mapviewer.converter.IConverter; import lcsb.mapviewer.converter.InvalidInputDataExecption; +import lcsb.mapviewer.converter.model.sbml.compartment.SbmlCompartmentParser; import lcsb.mapviewer.converter.model.sbml.reaction.SbmlReactionParser; import lcsb.mapviewer.converter.model.sbml.species.SbmlSpeciesParser; import lcsb.mapviewer.converter.model.sbml.units.SbmlUnitsParser; import lcsb.mapviewer.model.map.BioEntity; import lcsb.mapviewer.model.map.InconsistentModelException; import lcsb.mapviewer.model.map.MiriamData; +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.modifier.Modulation; diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentExporter.java new file mode 100644 index 0000000000..a2c9440808 --- /dev/null +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentExporter.java @@ -0,0 +1,96 @@ +package lcsb.mapviewer.converter.model.sbml.compartment; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; +import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph; +import org.sbml.jsbml.ext.layout.BoundingBox; +import org.sbml.jsbml.ext.layout.CompartmentGlyph; +import org.sbml.jsbml.ext.layout.Dimensions; +import org.sbml.jsbml.ext.layout.Layout; +import org.sbml.jsbml.ext.layout.Point; + +import lcsb.mapviewer.converter.model.sbml.SbmlElementExporter; +import lcsb.mapviewer.model.map.InconsistentModelException; +import lcsb.mapviewer.model.map.compartment.Compartment; + +public class SbmlCompartmentExporter extends SbmlElementExporter<Compartment, org.sbml.jsbml.Compartment> { + Logger logger = Logger.getLogger(SbmlCompartmentExporter.class); + + public SbmlCompartmentExporter(Layout layout, lcsb.mapviewer.model.map.model.Model minervaModel) { + super(layout, minervaModel); + } + + @Override + public org.sbml.jsbml.Compartment createSbmlElement(Compartment element) throws InconsistentModelException { + if (element == null || element.getElementId().equals("default")) { + return getSbmlModel().createCompartment("default"); + } + return getSbmlModel().createCompartment("comp_" + (getNextId())); + } + + @Override + protected List<Compartment> getElementList() { + List<Compartment> result = new ArrayList<>(); + result.addAll(getMinervaModel().getCompartments()); + boolean defaultFound = false; + for (Compartment compartment : result) { + if (compartment.getElementId().equals("default")) { + defaultFound = true; + } + } + if (!defaultFound) { + Compartment defaultCompartment = new Compartment("default"); + result.add(defaultCompartment); + } + return result; + } + + @Override + protected AbstractReferenceGlyph createElementGlyph(String sbmlCompartmentId, String glyphId) { + if (sbmlCompartmentId.equals("default")) { + glyphId = "default_compartment"; + } + CompartmentGlyph result = getLayout().createCompartmentGlyph(glyphId, sbmlCompartmentId); + return result; + } + + @Override + protected String getSbmlIdKey(Compartment compartment) { + if (compartment == null || compartment.getElementId().equals("default")) { + return "default"; + } + return compartment.getName(); + } + + @Override + protected void assignLayoutToGlyph(Compartment element, AbstractReferenceGlyph speciesGlyph) { + if (element.getElementId().equals("default")) { + BoundingBox boundingBox = new BoundingBox(); + + boundingBox.setPosition(new Point(element.getX(), element.getY())); + Dimensions dimensions = new Dimensions(); + + if (getMinervaModel().getWidth() != null) { + dimensions.setWidth(getMinervaModel().getWidth()); + dimensions.setHeight(getMinervaModel().getHeight()); + } + boundingBox.setDimensions(dimensions); + speciesGlyph.setBoundingBox(boundingBox); + } else { + super.assignLayoutToGlyph(element, speciesGlyph); + } + } + + @Override + public org.sbml.jsbml.Compartment getSbmlElement(Compartment element) throws InconsistentModelException { + String mapKey = getSbmlIdKey(element); + if (element == null && sbmlElementByElementNameAndCompartmentName.get(mapKey) == null) { + org.sbml.jsbml.Compartment sbmlElement = createSbmlElement(element); + sbmlElementByElementNameAndCompartmentName.put(mapKey, sbmlElement); + } + return super.getSbmlElement(element); + } + +} diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlCompartmentParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentParser.java similarity index 84% rename from converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlCompartmentParser.java rename to converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentParser.java index 1853edcf89..7fe2925b57 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlCompartmentParser.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/compartment/SbmlCompartmentParser.java @@ -1,4 +1,4 @@ -package lcsb.mapviewer.converter.model.sbml; +package lcsb.mapviewer.converter.model.sbml.compartment; import java.util.ArrayList; import java.util.List; @@ -13,6 +13,7 @@ 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.converter.model.sbml.SbmlElementParser; import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.compartment.SquareCompartment; import lcsb.mapviewer.model.map.species.Element; @@ -27,6 +28,9 @@ public class SbmlCompartmentParser extends SbmlElementParser<org.sbml.jsbml.Comp @Override protected Compartment parse(org.sbml.jsbml.Compartment compartment, Model sbmlModel) throws InvalidInputDataExecption { + if (compartment.getId().equals("default")) { + return null; + } Compartment result = new SquareCompartment(compartment.getId()); assignBioEntityData(compartment, result); return result; @@ -38,7 +42,7 @@ public class SbmlCompartmentParser extends SbmlElementParser<org.sbml.jsbml.Comp } @Override - protected List<Element> mergeLayout(List<? extends Element> elements, Layout sbmlLayout, Model sbmlModel) + public List<Element> mergeLayout(List<? extends Element> elements, Layout sbmlLayout, Model sbmlModel) throws InvalidInputDataExecption { List<Element> result = super.mergeLayout(elements, sbmlLayout, sbmlModel); @@ -64,7 +68,9 @@ public class SbmlCompartmentParser extends SbmlElementParser<org.sbml.jsbml.Comp protected List<Pair<String, AbstractReferenceGlyph>> getGlyphs(Layout sbmlLayout) { List<Pair<String, AbstractReferenceGlyph>> result = new ArrayList<>(); for (CompartmentGlyph glyph : sbmlLayout.getListOfCompartmentGlyphs()) { - result.add(new Pair<String, AbstractReferenceGlyph>(glyph.getCompartment(), glyph)); + if (!glyph.getCompartment().equals("default")) { + result.add(new Pair<>(glyph.getCompartment(), glyph)); + } } 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 0b001e485d..e3614d5bb4 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 @@ -35,8 +35,8 @@ import lcsb.mapviewer.common.exception.InvalidXmlSchemaException; import lcsb.mapviewer.converter.InvalidInputDataExecption; import lcsb.mapviewer.converter.model.celldesigner.types.ModifierType; import lcsb.mapviewer.converter.model.sbml.SbmlBioEntityParser; -import lcsb.mapviewer.converter.model.sbml.SbmlCompartmentParser; import lcsb.mapviewer.converter.model.sbml.SbmlParameterParser; +import lcsb.mapviewer.converter.model.sbml.compartment.SbmlCompartmentParser; import lcsb.mapviewer.converter.model.sbml.species.SbmlSpeciesParser; import lcsb.mapviewer.model.graphics.ArrowType; import lcsb.mapviewer.model.graphics.ArrowTypeData; diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporter.java index dba417b273..5679f8aabd 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporter.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporter.java @@ -7,8 +7,8 @@ import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph; import org.sbml.jsbml.ext.layout.Layout; import org.sbml.jsbml.ext.render.LocalStyle; -import lcsb.mapviewer.converter.model.sbml.SbmlCompartmentExporter; import lcsb.mapviewer.converter.model.sbml.SbmlElementExporter; +import lcsb.mapviewer.converter.model.sbml.compartment.SbmlCompartmentExporter; import lcsb.mapviewer.model.map.InconsistentModelException; import lcsb.mapviewer.model.map.species.Species; @@ -26,9 +26,7 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j public org.sbml.jsbml.Species createSbmlElement(Species element) throws InconsistentModelException { 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())); - } + result.setCompartment(compartmentExporter.getSbmlElement(element.getCompartment())); if (element.getInitialAmount() != null) { result.setInitialAmount(element.getInitialAmount()); } @@ -56,7 +54,7 @@ public class SbmlSpeciesExporter extends SbmlElementExporter<Species, org.sbml.j if (element.getComplex() != null) { complexName = element.getComplex().getName(); } - return element.getClass().getSimpleName() + "\n" + element.getName() + "\n" + compartmentName+ "\n" + complexName; + return element.getClass().getSimpleName() + "\n" + element.getName() + "\n" + compartmentName + "\n" + complexName; } protected LocalStyle createStyle(Species element) { 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 c17c23765e..baf83327bb 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 @@ -71,7 +71,7 @@ public class SbmlSpeciesParser extends SbmlElementParser<org.sbml.jsbml.Species> if (compartment == null && layout != null) { List<Compartment> compartments = new ArrayList<>(); for (CompartmentGlyph glyph : layout.getListOfCompartmentGlyphs()) { - if (glyph.getCompartment().equals(compartmentId)) { + if (glyph.getCompartment().equals(compartmentId) && !glyph.getCompartment().equals("default")) { compartments.add(minervaModel.getElementByElementId(glyph.getId())); } } diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java index 75a368f66c..5dfe01e510 100644 --- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java @@ -184,6 +184,8 @@ public class SbmlExporterTest { private Model createModelWithReaction() { Model model = new ModelFullIndexed(null); + model.setWidth(1000); + model.setHeight(1000); GenericProtein p1 = new GenericProtein("s1"); p1.setWidth(100); p1.setHeight(20); diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExportArrowType.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExportArrowType.java index 99be077087..bcc59d335e 100644 --- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExportArrowType.java +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExportArrowType.java @@ -93,6 +93,7 @@ public class SbmlReactionExportArrowType { model.addElement(ion3); Reaction reaction = (Reaction) clazz.getConstructor().newInstance(); + reaction.setIdReaction("reactionId"); reaction.addReactant(createReactant(ion)); Product product = createProduct(ion2); reaction.addProduct(product); diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporterTest.java index 472737e3dd..b41612ed3e 100644 --- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporterTest.java +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporterTest.java @@ -10,7 +10,7 @@ import org.sbml.jsbml.ext.layout.Layout; import org.sbml.jsbml.ext.layout.LayoutModelPlugin; import lcsb.mapviewer.converter.model.sbml.SbmlBioEntityExporter; -import lcsb.mapviewer.converter.model.sbml.SbmlCompartmentExporter; +import lcsb.mapviewer.converter.model.sbml.compartment.SbmlCompartmentExporter; import lcsb.mapviewer.converter.model.sbml.species.SbmlSpeciesExporter; import lcsb.mapviewer.model.map.InconsistentModelException; import lcsb.mapviewer.model.map.kinetics.SbmlKinetics; diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporterTest.java index a3ed722dd9..0a5a2db97f 100644 --- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporterTest.java +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporterTest.java @@ -7,8 +7,8 @@ import org.junit.Test; import org.sbml.jsbml.SBMLDocument; import org.sbml.jsbml.ext.layout.Layout; -import lcsb.mapviewer.converter.model.sbml.SbmlCompartmentExporter; import lcsb.mapviewer.converter.model.sbml.SbmlExporter; +import lcsb.mapviewer.converter.model.sbml.compartment.SbmlCompartmentExporter; import lcsb.mapviewer.model.map.InconsistentModelException; import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.model.Model; -- GitLab