From 5cea11f368918c8377952990eb9958875e0df3e1 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Fri, 24 Nov 2017 14:12:14 +0100 Subject: [PATCH] basic parser for reactions --- .../model/sbml/SbmlElementParser.java | 35 +- .../converter/model/sbml/SbmlParser.java | 10 + .../model/sbml/SbmlReactionParser.java | 162 ++++++ .../model/sbml/SbmlSpeciesParser.java | 2 +- .../SbmlPareserForInvalidReactionTest.java | 58 ++ .../invalidReaction/ReactionGlyph_Example.xml | 34 ++ .../ReactionGlyph_Example_level2+id.xml | 0 ...ReactionGlyph_Example_level2+id_level3.xml | 0 .../ReactionGlyph_Example_level2.xml | 0 .../ReactionGlyph_Example_level2_level3.xml | 0 .../layoutExample/Complete_Example.xml | 529 +++++++++--------- .../layoutExample/ReactionGlyph_Example.xml | 33 -- 12 files changed, 552 insertions(+), 311 deletions(-) create mode 100644 converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionParser.java create mode 100644 converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlPareserForInvalidReactionTest.java create mode 100644 converter-sbml/testFiles/invalidReaction/ReactionGlyph_Example.xml rename converter-sbml/testFiles/{layoutExample => invalidReaction}/ReactionGlyph_Example_level2+id.xml (100%) rename converter-sbml/testFiles/{layoutExample => invalidReaction}/ReactionGlyph_Example_level2+id_level3.xml (100%) rename converter-sbml/testFiles/{layoutExample => invalidReaction}/ReactionGlyph_Example_level2.xml (100%) rename converter-sbml/testFiles/{layoutExample => invalidReaction}/ReactionGlyph_Example_level2_level3.xml (100%) delete mode 100644 converter-sbml/testFiles/layoutExample/ReactionGlyph_Example.xml 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 8530ae1a6b..3360e35551 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 @@ -37,26 +37,22 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> { for (T sbmlElement : getSbmlElementList(sbmlModel)) { result.add(parse(sbmlElement, sbmlModel)); } - if (layout != null) { - return mergeLayout(result, layout, sbmlModel); - } else { - return result; - } + return result; } protected abstract ListOf<T> getSbmlElementList(Model sbmlModel); - protected List<Element> mergeLayout(List<Element> elements, Layout sbmlLayout, Model sbmlModel) + protected List<Element> mergeLayout(List<? extends Element> elements, Layout sbmlLayout, Model sbmlModel) throws InvalidInputDataExecption { Set<Element> used = new HashSet<>(); Map<String, Element> elementById = new HashMap<>(); + List<Element> result = new ArrayList<>(); for (Element species : elements) { if (elementById.get(species.getElementId()) != null) { throw new InvalidInputDataExecption("Duplicated element id: " + species.getElementId()); } elementById.put(species.getElementId(), species); } - List<Element> result = new ArrayList<>(); for (Pair<String, AbstractReferenceGlyph> idGlyphPair : getGlyphs(sbmlLayout)) { String id = idGlyphPair.getLeft(); @@ -66,18 +62,21 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> { } used.add(source); AbstractReferenceGlyph glyph = idGlyphPair.getRight(); - Element SpeciesWithLayout = source.copy(); - SpeciesWithLayout.setElementId(glyph.getId()); - SpeciesWithLayout.setX(glyph.getBoundingBox().getPosition().getX()); - SpeciesWithLayout.setY(glyph.getBoundingBox().getPosition().getY()); - SpeciesWithLayout.setWidth(glyph.getBoundingBox().getDimensions().getWidth()); - SpeciesWithLayout.setHeight(glyph.getBoundingBox().getDimensions().getHeight()); - result.add(SpeciesWithLayout); + Element elementWithLayout = source.copy(); + elementWithLayout.setElementId(glyph.getId()); + elementWithLayout.setX(glyph.getBoundingBox().getPosition().getX()); + elementWithLayout.setY(glyph.getBoundingBox().getPosition().getY()); + elementWithLayout.setWidth(glyph.getBoundingBox().getDimensions().getWidth()); + elementWithLayout.setHeight(glyph.getBoundingBox().getDimensions().getHeight()); + minervaModel.addElement(elementWithLayout); + result.add(elementWithLayout); } - for (Element Species : elements) { - if (!used.contains(Species)) { - logger.warn("Layout doesn't contain information about Element: " + Species.getElementId()); - result.add(Species); + for (Element element : elements) { + if (!used.contains(element)) { + logger.warn("Layout doesn't contain information about Element: " + element.getElementId()); + result.add(element); + } else { + minervaModel.removeElement(element); } } return result; 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 a14a15c80c..36b25f1bb6 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 @@ -51,6 +51,7 @@ public class SbmlParser implements IConverter { SbmlCompartmentParser compartmentParser = new SbmlCompartmentParser(layout, model); SbmlSpeciesParser speciesParser = new SbmlSpeciesParser(layout, model); + SbmlReactionParser reactionParser = new SbmlReactionParser(layout, model); Set<MiriamData> annotations = compartmentParser.parseAnnotation(sbmlModel.getAnnotation()); if (annotations.size() > 0) { @@ -58,6 +59,15 @@ public class SbmlParser implements IConverter { } model.addElements(compartmentParser.parseList(sbmlModel)); model.addElements(speciesParser.parseList(sbmlModel)); + model.addReactions(reactionParser.parseList(sbmlModel)); + + if (layout != null) { + compartmentParser.mergeLayout(model.getCompartments(), layout, sbmlModel); + speciesParser.mergeLayout(model.getSpeciesList(), layout, sbmlModel); + reactionParser.mergeLayout(model.getReactions(), layout, sbmlModel); + } + reactionParser.validateReactions(model.getReactions()); + if (sbmlModel.getConstraintCount() > 0) { throw new NotImplementedException("Constraints not implemented for model"); } diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionParser.java new file mode 100644 index 0000000000..627c2db528 --- /dev/null +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionParser.java @@ -0,0 +1,162 @@ +package lcsb.mapviewer.converter.model.sbml; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.log4j.Logger; +import org.sbml.jsbml.Annotation; +import org.sbml.jsbml.ListOf; +import org.sbml.jsbml.Model; +import org.sbml.jsbml.ModifierSpeciesReference; +import org.sbml.jsbml.SpeciesReference; +import org.sbml.jsbml.ext.layout.Layout; +import org.sbml.jsbml.ext.layout.ReactionGlyph; +import org.sbml.jsbml.ext.layout.SpeciesReferenceGlyph; +import org.sbml.jsbml.util.NotImplementedException; + +import lcsb.mapviewer.common.exception.InvalidArgumentException; +import lcsb.mapviewer.converter.InvalidInputDataExecption; +import lcsb.mapviewer.model.map.MiriamData; +import lcsb.mapviewer.model.map.reaction.Modifier; +import lcsb.mapviewer.model.map.reaction.Product; +import lcsb.mapviewer.model.map.reaction.Reactant; +import lcsb.mapviewer.model.map.reaction.Reaction; +import lcsb.mapviewer.model.map.reaction.ReactionNode; +import lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction; +import lcsb.mapviewer.model.map.species.Element; +import lcsb.mapviewer.model.map.species.Species; +import lcsb.mapviewer.modelutils.map.ElementUtils; + +public class SbmlReactionParser { + Logger logger = Logger.getLogger(SbmlReactionParser.class); + + Layout layout; + + lcsb.mapviewer.model.map.model.Model minervaModel; + ElementUtils eu = new ElementUtils(); + + public SbmlReactionParser(Layout sbmlLayout, lcsb.mapviewer.model.map.model.Model minervaModel) { + this.layout = sbmlLayout; + this.minervaModel = minervaModel; + } + + public List<Reaction> parseList(Model sbmlModel) throws InvalidInputDataExecption { + List<Reaction> result = new ArrayList<>(); + for (org.sbml.jsbml.Reaction sbmlElement : getSbmlElementList(sbmlModel)) { + result.add(parse(sbmlElement, sbmlModel)); + } + return result; + } + + protected ListOf<org.sbml.jsbml.Reaction> getSbmlElementList(Model sbmlModel) { + return sbmlModel.getListOfReactions(); + } + + protected void mergeLayout(Collection<Reaction> elements, Layout sbmlLayout, Model sbmlModel) + throws InvalidInputDataExecption { + Set<Reaction> used = new HashSet<>(); + Map<String, Reaction> elementById = new HashMap<>(); + for (Reaction species : elements) { + if (elementById.get(species.getIdReaction()) != null) { + throw new InvalidInputDataExecption("Duplicated reaction id: " + species.getIdReaction()); + } + elementById.put(species.getIdReaction(), species); + } + + for (ReactionGlyph glyph : sbmlLayout.getListOfReactionGlyphs()) { + Reaction source = elementById.get(glyph.getReaction()); + if (source == null) { + throw new InvalidInputDataExecption("Layout contains invalid Species id: " + glyph.getReaction()); + } + used.add(source); + Reaction reactionWithLayout = source.copy(); + reactionWithLayout.setIdReaction(glyph.getId()); + for (SpeciesReferenceGlyph speciesGlyph : glyph.getListOfSpeciesReferenceGlyphs()) { + ReactionNode minervaNode = null; + Element minervaElement = minervaModel.getElementByElementId(speciesGlyph.getSpeciesReference()); + if (minervaElement == null) { + throw new InvalidInputDataExecption("Cannot find source reaction node for layouted reaction: " + + speciesGlyph.getSpeciesReference() + ", " + glyph.getId()); + } + for (ReactionNode node : reactionWithLayout.getReactionNodes()) { + if (node.getElement().equals(minervaElement)) { + minervaNode = node; + } + } + if (minervaNode == null) { + throw new InvalidInputDataExecption("Cannot find reaction node for layouted reaction: " + + speciesGlyph.getSpeciesReference() + ", " + glyph.getId()); + } + minervaElement = minervaModel.getElementByElementId(speciesGlyph.getId()); + if (minervaElement == null) { + throw new InvalidInputDataExecption("Cannot find layouted reaction node for layouted reaction: " + + speciesGlyph.getId() + ", " + glyph.getId()); + } + minervaNode.setElement(minervaElement); + } + try { + minervaModel.addReaction(new StateTransitionReaction(reactionWithLayout)); + } catch (InvalidArgumentException e) { + throw new InvalidInputDataExecption(e); + } + } + for (Reaction reaction : elements) { + if (!used.contains(reaction)) { + logger.warn("Layout doesn't contain information about Element: " + reaction.getIdReaction()); + } else { + minervaModel.removeReaction(reaction); + } + } + } + + protected Reaction parse(org.sbml.jsbml.Reaction sbmlReaction, Model sbmlModel) throws InvalidInputDataExecption { + Reaction reaction = new Reaction(); + reaction.setIdReaction(sbmlReaction.getId()); + if (sbmlReaction.getKineticLaw() != null) { + throw new NotImplementedException("KineticLaw not implemented"); + } + for (SpeciesReference reactant : sbmlReaction.getListOfReactants()) { + Species element = minervaModel.getElementByElementId(reactant.getSpecies()); + reaction.addReactant(new Reactant(element)); + } + for (SpeciesReference product : sbmlReaction.getListOfProducts()) { + Species element = minervaModel.getElementByElementId(product.getSpecies()); + reaction.addProduct(new Product(element)); + } + + for (ModifierSpeciesReference modifier : sbmlReaction.getListOfModifiers()) { + Species element = minervaModel.getElementByElementId(modifier.getSpecies()); + reaction.addModifier(new Modifier(element)); + } + + return reaction; + } + + protected Set<MiriamData> parseAnnotation(Annotation annotation) { + if (annotation.getCVTermCount() > 0) { + throw new NotImplementedException(); + } + Set<MiriamData> result = new HashSet<>(); + return result; + } + + public void validateReactions(Set<Reaction> reactions) throws InvalidInputDataExecption { + for (Reaction reaction : reactions) { + if (reaction.getReactants().size() == 0) { + throw new InvalidInputDataExecption( + eu.getElementTag(reaction) + "At least one reactant is required for reaction"); + } + if (reaction.getProducts().size() == 0) { + throw new InvalidInputDataExecption( + eu.getElementTag(reaction) + "At least one product is required for reaction"); + } + } + + } + +} diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlSpeciesParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlSpeciesParser.java index d84c48257f..ea3fd6196b 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlSpeciesParser.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlSpeciesParser.java @@ -60,7 +60,7 @@ public class SbmlSpeciesParser extends SbmlElementParser<org.sbml.jsbml.Species> } @Override - protected List<Element> mergeLayout(List<Element> elements, Layout sbmlLayout, Model sbmlModel) + protected List<Element> mergeLayout(List<? extends Element> elements, Layout sbmlLayout, Model sbmlModel) throws InvalidInputDataExecption { List<Element> result = super.mergeLayout(elements, sbmlLayout, sbmlModel); diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlPareserForInvalidReactionTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlPareserForInvalidReactionTest.java new file mode 100644 index 0000000000..09c74b274e --- /dev/null +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlPareserForInvalidReactionTest.java @@ -0,0 +1,58 @@ +package lcsb.mapviewer.converter.model.sbml; + +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collection; + +import org.apache.log4j.Logger; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import lcsb.mapviewer.converter.ConverterParams; +import lcsb.mapviewer.converter.IConverter; +import lcsb.mapviewer.converter.InvalidInputDataExecption; + +@RunWith(Parameterized.class) +public class SbmlPareserForInvalidReactionTest { + + static Logger logger = Logger.getLogger(SbmlPareserForInvalidReactionTest.class.getName()); + + private Path filePath; + + public SbmlPareserForInvalidReactionTest(Path filePath) { + this.filePath = filePath; + } + + @Parameters(name = "{index} : {0}") + public static Collection<Object[]> data() throws IOException { + Collection<Object[]> data = new ArrayList<Object[]>(); + Files.walk(Paths.get("testFiles/invalidReaction")).forEach(fPath -> { + if (Files.isRegularFile(fPath) && fPath.toString().endsWith(".xml")) { + data.add(new Object[] { fPath }); + } + }); + return data; + } + + @Test + public void createModelTest() throws Exception { + try { + IConverter converter = new SbmlParser(); + + converter.createModel(new ConverterParams().filename(filePath.toString())); + fail("Exception expected when parsing file: " + filePath.toString()); + } catch (InvalidInputDataExecption e) { + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + +} diff --git a/converter-sbml/testFiles/invalidReaction/ReactionGlyph_Example.xml b/converter-sbml/testFiles/invalidReaction/ReactionGlyph_Example.xml new file mode 100644 index 0000000000..f12628c5d0 --- /dev/null +++ b/converter-sbml/testFiles/invalidReaction/ReactionGlyph_Example.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<sbml xmlns="http://www.sbml.org/sbml/level3/version1/core" + xmlns:layout="http://www.sbml.org/sbml/level3/version1/layout/version1" + level="3" version="1" layout:required="false"> + <model id="TestModel_with_modifiers"> + <listOfReactions> + <reaction id="Hexokinase" reversible="false" fast="false"> + </reaction> + </listOfReactions> + <layout:listOfLayouts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:layout="http://www.sbml.org/sbml/level3/version1/layout/version1"> + <layout:layout layout:id="Layout_1"> + <layout:dimensions layout:width="400" + layout:height="230" /> + <layout:listOfReactionGlyphs> + <layout:reactionGlyph layout:id="glyph_Hexokinase" + layout:reaction="Hexokinase"> + <layout:curve> + <layout:listOfCurveSegments> + <layout:curveSegment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:type="LineSegment"> + <layout:start layout:x="170" layout:y="100" /> + <layout:end layout:x="170" layout:y="130" /> + </layout:curveSegment> + </layout:listOfCurveSegments> + </layout:curve> + <layout:listOfSpeciesReferenceGlyphs> + </layout:listOfSpeciesReferenceGlyphs> + </layout:reactionGlyph> + </layout:listOfReactionGlyphs> + </layout:layout> + </layout:listOfLayouts> + </model> +</sbml> \ No newline at end of file diff --git a/converter-sbml/testFiles/layoutExample/ReactionGlyph_Example_level2+id.xml b/converter-sbml/testFiles/invalidReaction/ReactionGlyph_Example_level2+id.xml similarity index 100% rename from converter-sbml/testFiles/layoutExample/ReactionGlyph_Example_level2+id.xml rename to converter-sbml/testFiles/invalidReaction/ReactionGlyph_Example_level2+id.xml diff --git a/converter-sbml/testFiles/layoutExample/ReactionGlyph_Example_level2+id_level3.xml b/converter-sbml/testFiles/invalidReaction/ReactionGlyph_Example_level2+id_level3.xml similarity index 100% rename from converter-sbml/testFiles/layoutExample/ReactionGlyph_Example_level2+id_level3.xml rename to converter-sbml/testFiles/invalidReaction/ReactionGlyph_Example_level2+id_level3.xml diff --git a/converter-sbml/testFiles/layoutExample/ReactionGlyph_Example_level2.xml b/converter-sbml/testFiles/invalidReaction/ReactionGlyph_Example_level2.xml similarity index 100% rename from converter-sbml/testFiles/layoutExample/ReactionGlyph_Example_level2.xml rename to converter-sbml/testFiles/invalidReaction/ReactionGlyph_Example_level2.xml diff --git a/converter-sbml/testFiles/layoutExample/ReactionGlyph_Example_level2_level3.xml b/converter-sbml/testFiles/invalidReaction/ReactionGlyph_Example_level2_level3.xml similarity index 100% rename from converter-sbml/testFiles/layoutExample/ReactionGlyph_Example_level2_level3.xml rename to converter-sbml/testFiles/invalidReaction/ReactionGlyph_Example_level2_level3.xml diff --git a/converter-sbml/testFiles/layoutExample/Complete_Example.xml b/converter-sbml/testFiles/layoutExample/Complete_Example.xml index d7081bf344..679d836a8f 100644 --- a/converter-sbml/testFiles/layoutExample/Complete_Example.xml +++ b/converter-sbml/testFiles/layoutExample/Complete_Example.xml @@ -1,262 +1,273 @@ <?xml version="1.0" encoding="UTF-8"?> <sbml xmlns="http://www.sbml.org/sbml/level3/version1/core" -xmlns:layout="http://www.sbml.org/sbml/level3/version1/layout/version1" -level="3" version="1" layout:required="false" > -<model id="TestModel_with_modifiers" timeUnits="time"> -<listOfUnitDefinitions> -<unitDefinition id="volume"> -<listOfUnits> -<unit kind="litre" exponent="1" scale="0" multiplier="1"/> -</listOfUnits> -</unitDefinition> -<unitDefinition id="substance"> -<listOfUnits> -<unit kind="mole" exponent="1" scale="0" multiplier="1"/> -</listOfUnits> -</unitDefinition> -<unitDefinition id="time"> -<listOfUnits> -<unit kind="second" exponent="1" scale="0" multiplier="1"/> -</listOfUnits> -</unitDefinition> -</listOfUnitDefinitions> -<listOfCompartments> -<compartment id="Yeast" spatialDimensions="3" units="volume" constant="true"/> -</listOfCompartments> -<listOfSpecies> -<species id="Glucose" compartment="Yeast" substanceUnits="substance" -hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"/> -<species id="G6P" name="Glucose-6-phosphate" compartment="Yeast" -substanceUnits="substance" hasOnlySubstanceUnits="false" -boundaryCondition="false" constant="false"/> -<species id="ATP" compartment="Yeast" substanceUnits="substance" -hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"/> -<species id="ADP" compartment="Yeast" substanceUnits="substance" -hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"/> -<species id="Pi" compartment="Yeast" substanceUnits="substance" -hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false"/> -</listOfSpecies> -<listOfReactions> -<reaction id="Hexokinase" reversible="false" fast="false"> -<listOfReactants> -<speciesReference id="SpeciesReference_Glucose" species="Glucose" -stoichiometry="1" constant="true"/> -<speciesReference id="SpeciesReference_ATP" species="ATP" -stoichiometry="1" constant="true"/> -</listOfReactants> -<listOfProducts> -<speciesReference id="SpeciesReference_G6P" species="G6P" -stoichiometry="1" constant="true"/> -<speciesReference id="SpeciesReference_ADP" species="ADP" -stoichiometry="1" constant="true"/> -</listOfProducts> -<listOfModifiers> -<modifierSpeciesReference id="ModifierSpeciesReference_G6P" species="G6P"/> -<modifierSpeciesReference id="ModifierSpeciesReference_Pi" species="Pi"/> -</listOfModifiers> -</reaction> -</listOfReactions> -<layout:listOfLayouts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xmlns:layout="http://www.sbml.org/sbml/level3/version1/layout/version1"> -<layout:layout layout:id="Layout_1"> -<layout:dimensions layout:width="400" layout:height="230"/> -<layout:listOfCompartmentGlyphs> -<layout:compartmentGlyph layout:id="CompartmentGlyph_1" layout:compartment="Yeast"> -<layout:boundingBox layout:id="bb1"> -<layout:position layout:x="5" layout:y="5"/> -<layout:dimensions layout:width="390" layout:height="220"/> -</layout:boundingBox> -</layout:compartmentGlyph> -</layout:listOfCompartmentGlyphs> -<layout:listOfSpeciesGlyphs> -<layout:speciesGlyph layout:id="SpeciesGlyph_Glucose" layout:species="Glucose"> -<layout:boundingBox layout:id="bb2"> -<layout:position layout:x="105" layout:y="20"/> -<layout:dimensions layout:width="130" layout:height="20"/> -</layout:boundingBox> -</layout:speciesGlyph> -<layout:speciesGlyph layout:id="SpeciesGlyph_G6P" layout:species="G6P"> -<layout:boundingBox layout:id="bb5"> -<layout:position layout:x="50" layout:y="190"/> -<layout:dimensions layout:width="270" layout:height="20"/> -</layout:boundingBox> -</layout:speciesGlyph> -<layout:speciesGlyph layout:id="SpeciesGlyph_ATP" layout:species="ATP"> -<layout:boundingBox layout:id="bb3"> -<layout:position layout:x="270" layout:y="70"/> -<layout:dimensions layout:width="80" layout:height="20"/> -</layout:boundingBox> -</layout:speciesGlyph> -<layout:speciesGlyph layout:id="glyph_ADP" layout:species="ADP"> -<layout:boundingBox layout:id="bb4"> -<layout:position layout:x="270" layout:y="140"/> -<layout:dimensions layout:width="80" layout:height="20"/> -</layout:boundingBox> -</layout:speciesGlyph> -<layout:speciesGlyph layout:id="SpeciesGlyph_Pi" layout:species="Pi"> -<layout:boundingBox layout:id="bb6"> -<layout:position layout:x="50" layout:y="100"/> -<layout:dimensions layout:width="60" layout:height="20"/> -</layout:boundingBox> -</layout:speciesGlyph> -</layout:listOfSpeciesGlyphs> -<layout:listOfReactionGlyphs> -<layout:reactionGlyph layout:id="glyph_Hexokinase" layout:reaction="Hexokinase"> -<layout:curve> -<layout:listOfCurveSegments> -<layout:curveSegment -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:type="LineSegment"> -<layout:start layout:x="170" layout:y="100"/> -<layout:end layout:x="170" layout:y="130"/> -</layout:curveSegment> -</layout:listOfCurveSegments> -</layout:curve> -<layout:listOfSpeciesReferenceGlyphs> -<layout:speciesReferenceGlyph layout:id="SpeciesReferenceGlyph_Glucose" -layout:speciesReference="SpeciesReference_Glucose" -layout:speciesGlyph="SpeciesGlyph_Glucose" -layout:role="substrate"> -<layout:curve> -<layout:listOfCurveSegments> -<layout:curveSegment -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:type="LineSegment"> -<layout:start layout:x="170" layout:y="100"/> -<layout:end layout:x="170" layout:y="50"/> -</layout:curveSegment> -</layout:listOfCurveSegments> -</layout:curve> -</layout:speciesReferenceGlyph> -<layout:speciesReferenceGlyph layout:id="SpeciesReferenceGlyph_ATP" -layout:speciesReference="SpeciesReference_ATP" -layout:speciesGlyph="SpeciesGlyph_ATP" -layout:role="sidesubstrate"> -<layout:curve> -<layout:listOfCurveSegments> -<layout:curveSegment -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:type="CubicBezier"> -<layout:start layout:x="170" layout:y="100"/> -<layout:end layout:x="260" layout:y="80"/> -<layout:basePoint1 layout:x="170" layout:y="80"/> -<layout:basePoint2 layout:x="170" layout:y="80"/> -</layout:curveSegment> -</layout:listOfCurveSegments> -</layout:curve> -</layout:speciesReferenceGlyph> -<layout:speciesReferenceGlyph layout:id="SpeciesReferenceGlyph_G6P_1" -layout:speciesReference="SpeciesReference_G6P" -layout:speciesGlyph="SpeciesGlyph_G6P" -layout:role="product"> -<layout:curve> -<layout:listOfCurveSegments> -<layout:curveSegment -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:type="LineSegment"> -<layout:start layout:x="170" layout:y="130"/> -<layout:end layout:x="170" layout:y="180"/> -</layout:curveSegment> -</layout:listOfCurveSegments> -</layout:curve> -</layout:speciesReferenceGlyph> -<layout:speciesReferenceGlyph layout:id="SpeciesReferenceGlyph_ADP" -layout:speciesReference="SpeciesReference_ADP" -layout:speciesGlyph="glyph_ADP" -layout:role="sideproduct"> -<layout:curve> -<layout:listOfCurveSegments> -<layout:curveSegment -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:type="CubicBezier"> -<layout:start layout:x="170" layout:y="130"/> -<layout:end layout:x="260" layout:y="150"/> -<layout:basePoint1 layout:x="170" layout:y="150"/> -<layout:basePoint2 layout:x="170" layout:y="150"/> -</layout:curveSegment> -</layout:listOfCurveSegments> -</layout:curve> -</layout:speciesReferenceGlyph> -<layout:speciesReferenceGlyph layout:id="SpeciesReferenceGlyph_G6P_2" -layout:speciesReference="ModifierSpeciesReference_G6P" -layout:speciesGlyph="SpeciesGlyph_G6P" -layout:role="inhibitor"> -<layout:curve> -<layout:listOfCurveSegments> -<layout:curveSegment -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:type="CubicBezier"> -<layout:start layout:x="45" layout:y="200"/> -<layout:end layout:x="165" layout:y="120"/> -<layout:basePoint1 layout:x="0" layout:y="200"/> -<layout:basePoint2 layout:x="0" layout:y="120"/> -</layout:curveSegment> -</layout:listOfCurveSegments> -</layout:curve> -</layout:speciesReferenceGlyph> -<layout:speciesReferenceGlyph layout:id="SpeciesReferenceGlyph_PI" -layout:speciesReference="ModifierSpeciesReference_Pi" -layout:speciesGlyph="SpeciesGlyph_Pi" -layout:role="activator"> -<layout:curve> -<layout:listOfCurveSegments> -<layout:curveSegment -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:type="CubicBezier"> -<layout:start layout:x="115" layout:y="110"/> -<layout:end layout:x="165" layout:y="110"/> -<layout:basePoint1 layout:x="140" layout:y="110"/> -<layout:basePoint2 layout:x="140" layout:y="110"/> -</layout:curveSegment> -</layout:listOfCurveSegments> -</layout:curve> -</layout:speciesReferenceGlyph> -</layout:listOfSpeciesReferenceGlyphs> -</layout:reactionGlyph> -</layout:listOfReactionGlyphs> -<layout:listOfTextGlyphs> -<layout:textGlyph layout:id="TextGlyph_Glucose" -layout:originOfText="Glucose" -layout:graphicalObject="SpeciesGlyph_Glucose"> -<layout:boundingBox layout:id="bbA"> -<layout:position layout:x="115" layout:y="20"/> -<layout:dimensions layout:width="110" layout:height="20"/> -</layout:boundingBox> -</layout:textGlyph> -<layout:textGlyph layout:id="TextGlyph_G6P" -layout:originOfText="G6P" -layout:graphicalObject="SpeciesGlyph_G6P"> -<layout:boundingBox layout:id="bbD"> -<layout:position layout:x="60" layout:y="190"/> -<layout:dimensions layout:width="250" layout:height="20"/> -</layout:boundingBox> -</layout:textGlyph> -<layout:textGlyph layout:id="TextGlyph_ATP" -layout:originOfText="ATP" -layout:graphicalObject="SpeciesGlyph_ATP"> -<layout:boundingBox layout:id="bbB"> -<layout:position layout:x="280" layout:y="70"/> -<layout:dimensions layout:width="60" layout:height="20"/> -</layout:boundingBox> -</layout:textGlyph> -<layout:textGlyph layout:id="TextGlyph_ADP" -layout:originOfText="ADP" -layout:graphicalObject="glyph_ADP"> -<layout:boundingBox layout:id="bbC"> -<layout:position layout:x="280" layout:y="140"/> -<layout:dimensions layout:width="60" layout:height="20"/> -</layout:boundingBox> -</layout:textGlyph> -<layout:textGlyph layout:id="TextGlyph_PI" -layout:originOfText="Pi" -layout:graphicalObject="SpeciesGlyph_Pi"> -<layout:boundingBox layout:id="bbE"> -<layout:position layout:x="60" layout:y="100"/> -<layout:dimensions layout:width="40" layout:height="20"/> -</layout:boundingBox> -</layout:textGlyph> -</layout:listOfTextGlyphs> -</layout:layout> -</layout:listOfLayouts> -</model> + xmlns:layout="http://www.sbml.org/sbml/level3/version1/layout/version1" + level="3" version="1" layout:required="false"> + <model id="TestModel_with_modifiers" timeUnits="time"> + <listOfUnitDefinitions> + <unitDefinition id="volume"> + <listOfUnits> + <unit kind="litre" exponent="1" scale="0" multiplier="1" /> + </listOfUnits> + </unitDefinition> + <unitDefinition id="substance"> + <listOfUnits> + <unit kind="mole" exponent="1" scale="0" multiplier="1" /> + </listOfUnits> + </unitDefinition> + <unitDefinition id="time"> + <listOfUnits> + <unit kind="second" exponent="1" scale="0" multiplier="1" /> + </listOfUnits> + </unitDefinition> + </listOfUnitDefinitions> + <listOfCompartments> + <compartment id="Yeast" spatialDimensions="3" units="volume" + constant="true" /> + </listOfCompartments> + <listOfSpecies> + <species id="Glucose" compartment="Yeast" substanceUnits="substance" + hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false" /> + <species id="G6P" name="Glucose-6-phosphate" compartment="Yeast" + substanceUnits="substance" hasOnlySubstanceUnits="false" + boundaryCondition="false" constant="false" /> + <species id="ATP" compartment="Yeast" substanceUnits="substance" + hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false" /> + <species id="ADP" compartment="Yeast" substanceUnits="substance" + hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false" /> + <species id="Pi" compartment="Yeast" substanceUnits="substance" + hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false" /> + </listOfSpecies> + <listOfReactions> + <reaction id="Hexokinase" reversible="false" fast="false"> + <listOfReactants> + <speciesReference id="SpeciesReference_Glucose" + species="Glucose" stoichiometry="1" constant="true" /> + <speciesReference id="SpeciesReference_ATP" + species="ATP" stoichiometry="1" constant="true" /> + </listOfReactants> + <listOfProducts> + <speciesReference id="SpeciesReference_G6P" + species="G6P" stoichiometry="1" constant="true" /> + <speciesReference id="SpeciesReference_ADP" + species="ADP" stoichiometry="1" constant="true" /> + </listOfProducts> + <listOfModifiers> + <modifierSpeciesReference id="ModifierSpeciesReference_G6P" + species="G6P" /> + <modifierSpeciesReference id="ModifierSpeciesReference_Pi" + species="Pi" /> + </listOfModifiers> + </reaction> + </listOfReactions> + <layout:listOfLayouts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:layout="http://www.sbml.org/sbml/level3/version1/layout/version1"> + <layout:layout layout:id="Layout_1"> + <layout:dimensions layout:width="400" + layout:height="230" /> + <layout:listOfCompartmentGlyphs> + <layout:compartmentGlyph layout:id="CompartmentGlyph_1" + layout:compartment="Yeast"> + <layout:boundingBox layout:id="bb1"> + <layout:position layout:x="5" layout:y="5" /> + <layout:dimensions layout:width="390" + layout:height="220" /> + </layout:boundingBox> + </layout:compartmentGlyph> + </layout:listOfCompartmentGlyphs> + <layout:listOfSpeciesGlyphs> + <layout:speciesGlyph layout:id="SpeciesGlyph_Glucose" + layout:species="Glucose"> + <layout:boundingBox layout:id="bb2"> + <layout:position layout:x="105" layout:y="20" /> + <layout:dimensions layout:width="130" + layout:height="20" /> + </layout:boundingBox> + </layout:speciesGlyph> + <layout:speciesGlyph layout:id="SpeciesGlyph_G6P" + layout:species="G6P"> + <layout:boundingBox layout:id="bb5"> + <layout:position layout:x="50" layout:y="190" /> + <layout:dimensions layout:width="270" + layout:height="20" /> + </layout:boundingBox> + </layout:speciesGlyph> + <layout:speciesGlyph layout:id="SpeciesGlyph_ATP" + layout:species="ATP"> + <layout:boundingBox layout:id="bb3"> + <layout:position layout:x="270" layout:y="70" /> + <layout:dimensions layout:width="80" + layout:height="20" /> + </layout:boundingBox> + </layout:speciesGlyph> + <layout:speciesGlyph layout:id="glyph_ADP" + layout:species="ADP"> + <layout:boundingBox layout:id="bb4"> + <layout:position layout:x="270" layout:y="140" /> + <layout:dimensions layout:width="80" + layout:height="20" /> + </layout:boundingBox> + </layout:speciesGlyph> + <layout:speciesGlyph layout:id="SpeciesGlyph_Pi" + layout:species="Pi"> + <layout:boundingBox layout:id="bb6"> + <layout:position layout:x="50" layout:y="100" /> + <layout:dimensions layout:width="60" + layout:height="20" /> + </layout:boundingBox> + </layout:speciesGlyph> + </layout:listOfSpeciesGlyphs> + <layout:listOfReactionGlyphs> + <layout:reactionGlyph layout:id="glyph_Hexokinase" + layout:reaction="Hexokinase"> + <layout:curve> + <layout:listOfCurveSegments> + <layout:curveSegment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:type="LineSegment"> + <layout:start layout:x="170" layout:y="100" /> + <layout:end layout:x="170" layout:y="130" /> + </layout:curveSegment> + </layout:listOfCurveSegments> + </layout:curve> + <layout:listOfSpeciesReferenceGlyphs> + <layout:speciesReferenceGlyph + layout:id="SpeciesReferenceGlyph_Glucose" + layout:speciesReference="SpeciesReference_Glucose" + layout:speciesGlyph="SpeciesGlyph_Glucose" layout:role="substrate"> + <layout:curve> + <layout:listOfCurveSegments> + <layout:curveSegment + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:type="LineSegment"> + <layout:start layout:x="170" layout:y="100" /> + <layout:end layout:x="170" layout:y="50" /> + </layout:curveSegment> + </layout:listOfCurveSegments> + </layout:curve> + </layout:speciesReferenceGlyph> + <layout:speciesReferenceGlyph + layout:id="SpeciesReferenceGlyph_ATP" layout:speciesReference="SpeciesReference_ATP" + layout:speciesGlyph="SpeciesGlyph_ATP" layout:role="sidesubstrate"> + <layout:curve> + <layout:listOfCurveSegments> + <layout:curveSegment + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:type="CubicBezier"> + <layout:start layout:x="170" layout:y="100" /> + <layout:end layout:x="260" layout:y="80" /> + <layout:basePoint1 layout:x="170" layout:y="80" /> + <layout:basePoint2 layout:x="170" layout:y="80" /> + </layout:curveSegment> + </layout:listOfCurveSegments> + </layout:curve> + </layout:speciesReferenceGlyph> + <layout:speciesReferenceGlyph + layout:id="SpeciesReferenceGlyph_G6P_1" layout:speciesReference="SpeciesReference_G6P" + layout:speciesGlyph="SpeciesGlyph_G6P" layout:role="product"> + <layout:curve> + <layout:listOfCurveSegments> + <layout:curveSegment + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:type="LineSegment"> + <layout:start layout:x="170" layout:y="130" /> + <layout:end layout:x="170" layout:y="180" /> + </layout:curveSegment> + </layout:listOfCurveSegments> + </layout:curve> + </layout:speciesReferenceGlyph> + <layout:speciesReferenceGlyph + layout:id="SpeciesReferenceGlyph_ADP" layout:speciesReference="SpeciesReference_ADP" + layout:speciesGlyph="glyph_ADP" layout:role="sideproduct"> + <layout:curve> + <layout:listOfCurveSegments> + <layout:curveSegment + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:type="CubicBezier"> + <layout:start layout:x="170" layout:y="130" /> + <layout:end layout:x="260" layout:y="150" /> + <layout:basePoint1 layout:x="170" layout:y="150" /> + <layout:basePoint2 layout:x="170" layout:y="150" /> + </layout:curveSegment> + </layout:listOfCurveSegments> + </layout:curve> + </layout:speciesReferenceGlyph> + <layout:speciesReferenceGlyph + layout:id="SpeciesReferenceGlyph_G6P_2" layout:speciesReference="ModifierSpeciesReference_G6P" + layout:speciesGlyph="SpeciesGlyph_G6P" layout:role="inhibitor"> + <layout:curve> + <layout:listOfCurveSegments> + <layout:curveSegment + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:type="CubicBezier"> + <layout:start layout:x="45" layout:y="200" /> + <layout:end layout:x="165" layout:y="120" /> + <layout:basePoint1 layout:x="0" layout:y="200" /> + <layout:basePoint2 layout:x="0" layout:y="120" /> + </layout:curveSegment> + </layout:listOfCurveSegments> + </layout:curve> + </layout:speciesReferenceGlyph> + <layout:speciesReferenceGlyph + layout:id="SpeciesReferenceGlyph_PI" layout:speciesReference="ModifierSpeciesReference_Pi" + layout:speciesGlyph="SpeciesGlyph_Pi" layout:role="activator"> + <layout:curve> + <layout:listOfCurveSegments> + <layout:curveSegment + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:type="CubicBezier"> + <layout:start layout:x="115" layout:y="110" /> + <layout:end layout:x="165" layout:y="110" /> + <layout:basePoint1 layout:x="140" layout:y="110" /> + <layout:basePoint2 layout:x="140" layout:y="110" /> + </layout:curveSegment> + </layout:listOfCurveSegments> + </layout:curve> + </layout:speciesReferenceGlyph> + </layout:listOfSpeciesReferenceGlyphs> + </layout:reactionGlyph> + </layout:listOfReactionGlyphs> + <layout:listOfTextGlyphs> + <layout:textGlyph layout:id="TextGlyph_Glucose" + layout:originOfText="Glucose" layout:graphicalObject="SpeciesGlyph_Glucose"> + <layout:boundingBox layout:id="bbA"> + <layout:position layout:x="115" layout:y="20" /> + <layout:dimensions layout:width="110" + layout:height="20" /> + </layout:boundingBox> + </layout:textGlyph> + <layout:textGlyph layout:id="TextGlyph_G6P" + layout:originOfText="G6P" layout:graphicalObject="SpeciesGlyph_G6P"> + <layout:boundingBox layout:id="bbD"> + <layout:position layout:x="60" layout:y="190" /> + <layout:dimensions layout:width="250" + layout:height="20" /> + </layout:boundingBox> + </layout:textGlyph> + <layout:textGlyph layout:id="TextGlyph_ATP" + layout:originOfText="ATP" layout:graphicalObject="SpeciesGlyph_ATP"> + <layout:boundingBox layout:id="bbB"> + <layout:position layout:x="280" layout:y="70" /> + <layout:dimensions layout:width="60" + layout:height="20" /> + </layout:boundingBox> + </layout:textGlyph> + <layout:textGlyph layout:id="TextGlyph_ADP" + layout:originOfText="ADP" layout:graphicalObject="glyph_ADP"> + <layout:boundingBox layout:id="bbC"> + <layout:position layout:x="280" layout:y="140" /> + <layout:dimensions layout:width="60" + layout:height="20" /> + </layout:boundingBox> + </layout:textGlyph> + <layout:textGlyph layout:id="TextGlyph_PI" + layout:originOfText="Pi" layout:graphicalObject="SpeciesGlyph_Pi"> + <layout:boundingBox layout:id="bbE"> + <layout:position layout:x="60" layout:y="100" /> + <layout:dimensions layout:width="40" + layout:height="20" /> + </layout:boundingBox> + </layout:textGlyph> + </layout:listOfTextGlyphs> + </layout:layout> + </layout:listOfLayouts> + </model> </sbml> \ No newline at end of file diff --git a/converter-sbml/testFiles/layoutExample/ReactionGlyph_Example.xml b/converter-sbml/testFiles/layoutExample/ReactionGlyph_Example.xml deleted file mode 100644 index 189da3871f..0000000000 --- a/converter-sbml/testFiles/layoutExample/ReactionGlyph_Example.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<sbml xmlns="http://www.sbml.org/sbml/level3/version1/core" -xmlns:layout="http://www.sbml.org/sbml/level3/version1/layout/version1" -level="3" version="1" layout:required="false" > -<model id="TestModel_with_modifiers"> -<listOfReactions> -<reaction id="Hexokinase" reversible="false" fast="false"> -</reaction> -</listOfReactions> -<layout:listOfLayouts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xmlns:layout="http://www.sbml.org/sbml/level3/version1/layout/version1"> -<layout:layout layout:id="Layout_1"> -<layout:dimensions layout:width="400" layout:height="230"/> -<layout:listOfReactionGlyphs> -<layout:reactionGlyph layout:id="glyph_Hexokinase" layout:reaction="Hexokinase"> -<layout:curve> -<layout:listOfCurveSegments> -<layout:curveSegment -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:type="LineSegment"> -<layout:start layout:x="170" layout:y="100"/> -<layout:end layout:x="170" layout:y="130"/> -</layout:curveSegment> -</layout:listOfCurveSegments> -</layout:curve> -<layout:listOfSpeciesReferenceGlyphs> -</layout:listOfSpeciesReferenceGlyphs> -</layout:reactionGlyph> -</layout:listOfReactionGlyphs> -</layout:layout> -</layout:listOfLayouts> -</model> -</sbml> \ No newline at end of file -- GitLab