From ba0545cb610eabc646773e425d3137fbe356a581 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Fri, 24 Nov 2017 18:05:03 +0100 Subject: [PATCH] basic layout for reactions added --- .../converter/model/sbml/SbmlParser.java | 97 +++- .../model/sbml/SbmlReactionParser.java | 2 +- .../converter/model/sbml/SbmlParserTest.java | 23 +- .../layoutExample/Complete_Example_level2.xml | 475 +++++++++--------- 4 files changed, 356 insertions(+), 241 deletions(-) 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 9b92286338..e73ec1dc9d 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 @@ -1,6 +1,7 @@ package lcsb.mapviewer.converter.model.sbml; import java.awt.Point; +import java.awt.geom.Point2D; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -22,10 +23,20 @@ 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.celldesigner.types.ModifierType; +import lcsb.mapviewer.model.graphics.PolylineData; import lcsb.mapviewer.model.map.InconsistentModelException; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.model.ModelFullIndexed; +import lcsb.mapviewer.model.map.reaction.AbstractNode; +import lcsb.mapviewer.model.map.reaction.AndOperator; +import lcsb.mapviewer.model.map.reaction.Modifier; +import lcsb.mapviewer.model.map.reaction.NodeOperator; +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.SplitOperator; import lcsb.mapviewer.model.map.species.Element; public class SbmlParser implements IConverter { @@ -110,14 +121,18 @@ public class SbmlParser implements IConverter { } private void createLayout(Model model, Layout layout) { - for (Element element : model.getElements()) { if (element.getWidth() == 0 || element.getHeight() == 0) { element.setWidth(100); element.setHeight(20); Point coord = nextCoordinates(); element.setX(coord.x * 120); - element.setX(coord.y * 30); + element.setY(coord.y * 50); + } + } + for (Reaction reaction : model.getReactions()) { + if (!hasLayout(reaction)) { + createLayoutForReaction(reaction); } } @@ -149,6 +164,83 @@ public class SbmlParser implements IConverter { model.setHeight(height); } + private void createLayoutForReaction(Reaction reaction) { + Point2D reactantStartPoint = reaction.getReactants().get(0).getElement().getCenter(); + Point2D productEndPoint = reaction.getProducts().get(0).getElement().getCenter(); + Point2D center = new Point2D.Double((reactantStartPoint.getX() + productEndPoint.getX()) / 2, + (reactantStartPoint.getY() + productEndPoint.getY()) / 2); + + Point2D reactantMergePoint = new Point2D.Double((reactantStartPoint.getX() + center.getX() * 3) / 4, + (reactantStartPoint.getY() + center.getY() * 3) / 4); + Point2D productMergePoint = new Point2D.Double((productEndPoint.getX() + center.getX() * 3) / 4, + (productEndPoint.getY() + center.getY() * 3) / 4); + + if (reaction.getReactants().size()==1) { + PolylineData line = new PolylineData(); + line.addPoint(reactantStartPoint); + line.addPoint(center); + reaction.getReactants().get(0).setLine(line); + } else { + for (Reactant reactant: reaction.getReactants()) { + PolylineData line = new PolylineData(); + line.addPoint(reactantMergePoint); + line.addPoint(reactant.getElement().getCenter()); + reactant.setLine(line); + } + NodeOperator operator = new AndOperator(); + PolylineData line = new PolylineData(); + line.addPoint(reactantMergePoint); + line.addPoint(center); + + operator.addInputs(reaction.getReactants()); + operator.setLine(line); + reaction.addNode(operator); + } + + if (reaction.getProducts().size()==1) { + PolylineData line = new PolylineData(); + line.addPoint(productEndPoint); + line.addPoint(center); + reaction.getProducts().get(0).setLine(line); + } else { + for (Product product: reaction.getProducts()) { + PolylineData line = new PolylineData(); + line.addPoint(product.getElement().getCenter()); + line.addPoint(productMergePoint); + product.setLine(line); + } + NodeOperator operator = new SplitOperator(); + PolylineData line = new PolylineData(); + line.addPoint(productMergePoint); + line.addPoint(center); + + operator.addOutputs(reaction.getProducts()); + operator.setLine(line); + reaction.addNode(operator); + } + for (Modifier modifier: reaction.getModifiers()) { + PolylineData line = new PolylineData(); + line.addPoint(modifier.getElement().getCenter()); + line.addPoint(center); + modifier.setLine(line); + if (modifier.getClass()==Modifier.class) { + line.setEndAtd(ModifierType.MODULATION_STRING.getAtd()); + } + } + + } + + private boolean hasLayout(Reaction reaction) { + for (AbstractNode node : reaction.getNodes()) { + if (node.getLine() == null) { + return false; + } else if (node.getLine().length() == 0) { + return false; + } + } + return true; + } + Point coordinates = null; int radius = 0; @@ -174,6 +266,7 @@ public class SbmlParser implements IConverter { private Layout getSbmlLayout(org.sbml.jsbml.Model sbmlModel) { Layout layout = null; + if (sbmlModel.getExtensionCount() > 0) { for (SBasePlugin plugin : sbmlModel.getExtensionPackages().values()) { if (plugin.getClass().equals(org.sbml.jsbml.ext.layout.LayoutModelPlugin.class)) { 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 index 2acf38c9ff..50be3be76d 100644 --- 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 @@ -227,7 +227,7 @@ public class SbmlReactionParser { } protected Reaction parse(org.sbml.jsbml.Reaction sbmlReaction, Model sbmlModel) throws InvalidInputDataExecption { - Reaction reaction = new Reaction(); + Reaction reaction = new StateTransitionReaction(); reaction.setIdReaction(sbmlReaction.getId()); if (sbmlReaction.getKineticLaw() != null) { throw new NotImplementedException("KineticLaw not implemented"); diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java index 260e80486d..dfa7b80ef1 100644 --- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java @@ -108,7 +108,28 @@ public class SbmlParserTest { assertNotNull(node.getLine()); assertTrue(node.getLine().length() > 0); } -// assertEquals(2, reaction.getOperators().size()); + assertEquals(2, reaction.getOperators().size()); + + AbstractImageGenerator.Params params = new AbstractImageGenerator.Params().height(model.getHeight()) + .width(model.getWidth()).nested(true).scale(1).level(20).x(0).y(0).model(model); + NormalImageGenerator nig = new PngImageGenerator(params); + nig.saveToFile("tmp.png"); + Desktop.getDesktop().open(new File("tmp.png")); + + } + + @Test + public void testReactionWithoutLayout() throws Exception { + Model model = parser.createModel(new ConverterParams().filename("testFiles/layoutExample/Complete_Example_level2.xml")); + assertNotNull(model); + assertEquals(1, model.getReactions().size()); + Reaction reaction = model.getReactions().iterator().next(); + for (ReactionNode node : reaction.getReactionNodes()) { + logger.debug(node.getClass()+","+node.getElement()); + assertNotNull(node.getLine()); + assertTrue(node.getLine().length() > 0); + } + assertEquals(2, reaction.getOperators().size()); AbstractImageGenerator.Params params = new AbstractImageGenerator.Params().height(model.getHeight()) .width(model.getWidth()).nested(true).scale(1).level(20).x(0).y(0).model(model); diff --git a/converter-sbml/testFiles/layoutExample/Complete_Example_level2.xml b/converter-sbml/testFiles/layoutExample/Complete_Example_level2.xml index ce678f269f..0517a9d2f2 100644 --- a/converter-sbml/testFiles/layoutExample/Complete_Example_level2.xml +++ b/converter-sbml/testFiles/layoutExample/Complete_Example_level2.xml @@ -1,240 +1,241 @@ <?xml version="1.0" encoding="UTF-8"?> <sbml xmlns="http://www.sbml.org/sbml/level2" level="2" version="1"> -<model id="TestModel_with_modifiers"> -<annotation> -<listOfLayouts xmlns="http://projects.eml.org/bcb/sbml/level2" -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> -<layout id="Layout_1"> -<dimensions width="400" height="230"/> -<listOfCompartmentGlyphs> -<compartmentGlyph id="CompartmentGlyph_1" compartment="Yeast"> -<boundingBox id="bb1"> -<position x="5" y="5"/> -<dimensions width="390" height="220"/> -</boundingBox> -</compartmentGlyph> -</listOfCompartmentGlyphs> -<listOfSpeciesGlyphs> -<speciesGlyph id="SpeciesGlyph_Glucose" species="Glucose"> -<boundingBox id="bb2"> -<position x="105" y="20"/> -<dimensions width="130" height="20"/> -</boundingBox> -</speciesGlyph> -<speciesGlyph id="SpeciesGlyph_G6P" species="G6P"> -<boundingBox id="bb5"> -<position x="50" y="190"/> -<dimensions width="270" height="20"/> -</boundingBox> -</speciesGlyph> -<speciesGlyph id="SpeciesGlyph_ATP" species="ATP"> -<boundingBox id="bb3"> -<position x="270" y="70"/> -<dimensions width="80" height="20"/> -</boundingBox> -</speciesGlyph> -<speciesGlyph id="glyph_ADP" species="ADP"> -<boundingBox id="bb4"> -<position x="270" y="140"/> -<dimensions width="80" height="20"/> -</boundingBox> -</speciesGlyph> -<speciesGlyph id="SpeciesGlyph_Pi" species="Pi"> -<boundingBox id="bb6"> -<position x="50" y="100"/> -<dimensions width="60" height="20"/> -</boundingBox> -</speciesGlyph> -</listOfSpeciesGlyphs> -<listOfReactionGlyphs> -<reactionGlyph id="glyph_Hexokinase" reaction="Hexokinase"> -<curve> -<listOfCurveSegments> -<curveSegment xsi:type="LineSegment"> -<start x="170" y="100"/> -<end x="170" y="130"/> -</curveSegment> -</listOfCurveSegments> -</curve> -<listOfSpeciesReferenceGlyphs> -<speciesReferenceGlyph id="SpeciesReferenceGlyph_Glucose" -speciesReference="SpeciesReference_Glucose" -speciesGlyph="SpeciesGlyph_Glucose" role="substrate"> -<curve> -<listOfCurveSegments> -<curveSegment xsi:type="LineSegment"> -<start x="170" y="100"/> -<end x="170" y="50"/> -</curveSegment> -</listOfCurveSegments> -</curve> -</speciesReferenceGlyph> -<speciesReferenceGlyph id="SpeciesReferenceGlyph_ATP" -speciesReference="SpeciesReference_ATP" -speciesGlyph="SpeciesGlyph_ATP" role="sidesubstrate"> -<curve> -<listOfCurveSegments> -<curveSegment xsi:type="CubicBezier"> -<start x="170" y="100"/> -<end x="260" y="80"/> -<basePoint1 x="170" y="80"/> -<basePoint2 x="170" y="80"/> -</curveSegment> -</listOfCurveSegments> -</curve> -</speciesReferenceGlyph> -<speciesReferenceGlyph id="SpeciesReferenceGlyph_G6P_1" -speciesReference="SpeciesReference_G6P" -speciesGlyph="SpeciesGlyph_G6P" role="product"> -<curve> -<listOfCurveSegments> -<curveSegment xsi:type="LineSegment"> -<start x="170" y="130"/> -<end x="170" y="180"/> -</curveSegment> -</listOfCurveSegments> -</curve> -</speciesReferenceGlyph> -<speciesReferenceGlyph id="SpeciesReferenceGlyph_ADP" -speciesReference="SpeciesReference_ADP" -speciesGlyph="glyph_ADP" role="sideproduct"> -<curve> -<listOfCurveSegments> -<curveSegment xsi:type="CubicBezier"> -<start x="170" y="130"/> -<end x="260" y="150"/> -<basePoint1 x="170" y="150"/> -<basePoint2 x="170" y="150"/> -</curveSegment> -</listOfCurveSegments> -</curve> -</speciesReferenceGlyph> -<speciesReferenceGlyph id="SpeciesReferenceGlyph_G6P_2" -speciesReference="ModifierSpeciesReference_G6P" -speciesGlyph="SpeciesGlyph_G6P" role="inhibitor"> -<curve> -<listOfCurveSegments> -<curveSegment xsi:type="CubicBezier"> -<start x="45" y="200"/> -<end x="165" y="120"/> -<basePoint1 x="0" y="200"/> -<basePoint2 x="0" y="120"/> -</curveSegment> -</listOfCurveSegments> -</curve> -</speciesReferenceGlyph> -<speciesReferenceGlyph id="SpeciesReferenceGlyph_PI" -speciesReference="ModifierSpeciesReference_Pi" -speciesGlyph="SpeciesGlyph_Pi" role="activator"> -<curve> -<listOfCurveSegments> -<curveSegment xsi:type="CubicBezier"> -<start x="115" y="110"/> -<end x="165" y="110"/> -<basePoint1 x="140" y="110"/> -<basePoint2 x="140" y="110"/> -</curveSegment> -</listOfCurveSegments> -</curve> -</speciesReferenceGlyph> -</listOfSpeciesReferenceGlyphs> -</reactionGlyph> -</listOfReactionGlyphs> -<listOfTextGlyphs> -<textGlyph id="TextGlyph_Glucose" graphicalObject="SpeciesGlyph_Glucose" -originOfText="Glucose"> -<boundingBox id="bbA"> -<position x="115" y="20"/> -<dimensions width="110" height="20"/> -</boundingBox> -</textGlyph> -<textGlyph id="TextGlyph_G6P" graphicalObject="SpeciesGlyph_G6P" -originOfText="G6P"> -<boundingBox id="bbD"> -<position x="60" y="190"/> -<dimensions width="250" height="20"/> -</boundingBox> -</textGlyph> -<textGlyph id="TextGlyph_ATP" graphicalObject="SpeciesGlyph_ATP" -originOfText="ATP"> -<boundingBox id="bbB"> -<position x="280" y="70"/> -<dimensions width="60" height="20"/> -</boundingBox> -</textGlyph> -<textGlyph id="TextGlyph_ADP" graphicalObject="glyph_ADP" -originOfText="ADP"> -<boundingBox id="bbC"> -<position x="280" y="140"/> -<dimensions width="60" height="20"/> -</boundingBox> -</textGlyph> -<textGlyph id="TextGlyph_PI" graphicalObject="SpeciesGlyph_Pi" -originOfText="Pi"> -<boundingBox id="bbE"> -<position x="60" y="100"/> -<dimensions width="40" height="20"/> -</boundingBox> -</textGlyph> -</listOfTextGlyphs> -</layout> -</listOfLayouts> -</annotation> -<listOfCompartments> -<compartment id="Yeast"/> -</listOfCompartments> -<listOfSpecies> -<species id="Glucose" compartment="Yeast"/> -<species id="G6P" name="Glucose-6-phosphate" compartment="Yeast"/> -<species id="ATP" compartment="Yeast"/> -<species id="ADP" compartment="Yeast"/> -<species id="Pi" compartment="Yeast"/> -</listOfSpecies> -<listOfReactions> -<reaction id="Hexokinase" reversible="false"> -<listOfReactants> -<speciesReference species="Glucose"> -<annotation> -<layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" -id="SpeciesReference_Glucose"/> -</annotation> -</speciesReference> -<speciesReference species="ATP"> -<annotation> -<layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" -id="SpeciesReference_ATP"/> -</annotation> -</speciesReference> -</listOfReactants> -<listOfProducts> -<speciesReference species="G6P"> -<annotation> -<layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" -id="SpeciesReference_G6P"/> -</annotation> -</speciesReference> -<speciesReference species="ADP"> -<annotation> -<layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" -id="SpeciesReference_ADP"/> -</annotation> -</speciesReference> -</listOfProducts> -<listOfModifiers> -<modifierSpeciesReference species="G6P"> -<annotation> -<layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" -id="ModifierSpeciesReference_G6P"/> -</annotation> -</modifierSpeciesReference> -<modifierSpeciesReference species="Pi"> -<annotation> -<layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" -id="ModifierSpeciesReference_Pi"/> -</annotation> -</modifierSpeciesReference> -</listOfModifiers> -</reaction> -</listOfReactions> -</model> + <model id="TestModel_with_modifiers"> + <annotation> + <listOfLayouts xmlns="http://projects.eml.org/bcb/sbml/level2" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <layout id="Layout_1"> + <dimensions width="400" height="230" /> + <listOfCompartmentGlyphs> + <compartmentGlyph id="CompartmentGlyph_1" + compartment="Yeast"> + <boundingBox id="bb1"> + <position x="5" y="5" /> + <dimensions width="390" height="220" /> + </boundingBox> + </compartmentGlyph> + </listOfCompartmentGlyphs> + <listOfSpeciesGlyphs> + <speciesGlyph id="SpeciesGlyph_Glucose" species="Glucose"> + <boundingBox id="bb2"> + <position x="105" y="20" /> + <dimensions width="130" height="20" /> + </boundingBox> + </speciesGlyph> + <speciesGlyph id="SpeciesGlyph_G6P" species="G6P"> + <boundingBox id="bb5"> + <position x="50" y="190" /> + <dimensions width="270" height="20" /> + </boundingBox> + </speciesGlyph> + <speciesGlyph id="SpeciesGlyph_ATP" species="ATP"> + <boundingBox id="bb3"> + <position x="270" y="70" /> + <dimensions width="80" height="20" /> + </boundingBox> + </speciesGlyph> + <speciesGlyph id="glyph_ADP" species="ADP"> + <boundingBox id="bb4"> + <position x="270" y="140" /> + <dimensions width="80" height="20" /> + </boundingBox> + </speciesGlyph> + <speciesGlyph id="SpeciesGlyph_Pi" species="Pi"> + <boundingBox id="bb6"> + <position x="50" y="100" /> + <dimensions width="60" height="20" /> + </boundingBox> + </speciesGlyph> + </listOfSpeciesGlyphs> + <listOfReactionGlyphs> + <reactionGlyph id="glyph_Hexokinase" reaction="Hexokinase"> + <curve> + <listOfCurveSegments> + <curveSegment xsi:type="LineSegment"> + <start x="170" y="100" /> + <end x="170" y="130" /> + </curveSegment> + </listOfCurveSegments> + </curve> + <listOfSpeciesReferenceGlyphs> + <speciesReferenceGlyph id="SpeciesReferenceGlyph_Glucose" + speciesReference="SpeciesReference_Glucose" speciesGlyph="SpeciesGlyph_Glucose" + role="substrate"> + <curve> + <listOfCurveSegments> + <curveSegment xsi:type="LineSegment"> + <start x="170" y="100" /> + <end x="170" y="50" /> + </curveSegment> + </listOfCurveSegments> + </curve> + </speciesReferenceGlyph> + <speciesReferenceGlyph id="SpeciesReferenceGlyph_ATP" + speciesReference="SpeciesReference_ATP" speciesGlyph="SpeciesGlyph_ATP" + role="sidesubstrate"> + <curve> + <listOfCurveSegments> + <curveSegment xsi:type="CubicBezier"> + <start x="170" y="100" /> + <end x="260" y="80" /> + <basePoint1 x="170" y="80" /> + <basePoint2 x="170" y="80" /> + </curveSegment> + </listOfCurveSegments> + </curve> + </speciesReferenceGlyph> + <speciesReferenceGlyph id="SpeciesReferenceGlyph_G6P_1" + speciesReference="SpeciesReference_G6P" speciesGlyph="SpeciesGlyph_G6P" + role="product"> + <curve> + <listOfCurveSegments> + <curveSegment xsi:type="LineSegment"> + <start x="170" y="130" /> + <end x="170" y="180" /> + </curveSegment> + </listOfCurveSegments> + </curve> + </speciesReferenceGlyph> + <speciesReferenceGlyph id="SpeciesReferenceGlyph_ADP" + speciesReference="SpeciesReference_ADP" speciesGlyph="glyph_ADP" + role="sideproduct"> + <curve> + <listOfCurveSegments> + <curveSegment xsi:type="CubicBezier"> + <start x="170" y="130" /> + <end x="260" y="150" /> + <basePoint1 x="170" y="150" /> + <basePoint2 x="170" y="150" /> + </curveSegment> + </listOfCurveSegments> + </curve> + </speciesReferenceGlyph> + <speciesReferenceGlyph id="SpeciesReferenceGlyph_G6P_2" + speciesReference="ModifierSpeciesReference_G6P" speciesGlyph="SpeciesGlyph_G6P" + role="inhibitor"> + <curve> + <listOfCurveSegments> + <curveSegment xsi:type="CubicBezier"> + <start x="45" y="200" /> + <end x="165" y="120" /> + <basePoint1 x="0" y="200" /> + <basePoint2 x="0" y="120" /> + </curveSegment> + </listOfCurveSegments> + </curve> + </speciesReferenceGlyph> + <speciesReferenceGlyph id="SpeciesReferenceGlyph_PI" + speciesReference="ModifierSpeciesReference_Pi" speciesGlyph="SpeciesGlyph_Pi" + role="activator"> + <curve> + <listOfCurveSegments> + <curveSegment xsi:type="CubicBezier"> + <start x="115" y="110" /> + <end x="165" y="110" /> + <basePoint1 x="140" y="110" /> + <basePoint2 x="140" y="110" /> + </curveSegment> + </listOfCurveSegments> + </curve> + </speciesReferenceGlyph> + </listOfSpeciesReferenceGlyphs> + </reactionGlyph> + </listOfReactionGlyphs> + <listOfTextGlyphs> + <textGlyph id="TextGlyph_Glucose" graphicalObject="SpeciesGlyph_Glucose" + originOfText="Glucose"> + <boundingBox id="bbA"> + <position x="115" y="20" /> + <dimensions width="110" height="20" /> + </boundingBox> + </textGlyph> + <textGlyph id="TextGlyph_G6P" graphicalObject="SpeciesGlyph_G6P" + originOfText="G6P"> + <boundingBox id="bbD"> + <position x="60" y="190" /> + <dimensions width="250" height="20" /> + </boundingBox> + </textGlyph> + <textGlyph id="TextGlyph_ATP" graphicalObject="SpeciesGlyph_ATP" + originOfText="ATP"> + <boundingBox id="bbB"> + <position x="280" y="70" /> + <dimensions width="60" height="20" /> + </boundingBox> + </textGlyph> + <textGlyph id="TextGlyph_ADP" graphicalObject="glyph_ADP" + originOfText="ADP"> + <boundingBox id="bbC"> + <position x="280" y="140" /> + <dimensions width="60" height="20" /> + </boundingBox> + </textGlyph> + <textGlyph id="TextGlyph_PI" graphicalObject="SpeciesGlyph_Pi" + originOfText="Pi"> + <boundingBox id="bbE"> + <position x="60" y="100" /> + <dimensions width="40" height="20" /> + </boundingBox> + </textGlyph> + </listOfTextGlyphs> + </layout> + </listOfLayouts> + </annotation> + <listOfCompartments> + <compartment id="Yeast" /> + </listOfCompartments> + <listOfSpecies> + <species id="Glucose" compartment="Yeast" /> + <species id="G6P" name="Glucose-6-phosphate" compartment="Yeast" /> + <species id="ATP" compartment="Yeast" /> + <species id="ADP" compartment="Yeast" /> + <species id="Pi" compartment="Yeast" /> + </listOfSpecies> + <listOfReactions> + <reaction id="Hexokinase" reversible="false"> + <listOfReactants> + <speciesReference species="Glucose"> + <annotation> + <layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" + id="SpeciesReference_Glucose" /> + </annotation> + </speciesReference> + <speciesReference species="ATP"> + <annotation> + <layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" + id="SpeciesReference_ATP" /> + </annotation> + </speciesReference> + </listOfReactants> + <listOfProducts> + <speciesReference species="G6P"> + <annotation> + <layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" + id="SpeciesReference_G6P" /> + </annotation> + </speciesReference> + <speciesReference species="ADP"> + <annotation> + <layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" + id="SpeciesReference_ADP" /> + </annotation> + </speciesReference> + </listOfProducts> + <listOfModifiers> + <modifierSpeciesReference species="G6P"> + <annotation> + <layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" + id="ModifierSpeciesReference_G6P" /> + </annotation> + </modifierSpeciesReference> + <modifierSpeciesReference species="Pi"> + <annotation> + <layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" + id="ModifierSpeciesReference_Pi" /> + </annotation> + </modifierSpeciesReference> + </listOfModifiers> + </reaction> + </listOfReactions> + </model> </sbml> \ No newline at end of file -- GitLab