diff --git a/CHANGELOG b/CHANGELOG index a3c6006bcad3bed452dbccf929402840e5e71658..cd0d0115d5a4e3194d4ab7b13624c823249e5508 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ minerva (15.0.0~alpha.0) stable; urgency=medium * Improvement: logs provided for validation data model are structurized (#325) + * Improvement: import/export of GPML implemented * Small improvement: compartments in not layouted SBML file are more scattered (#326) * Small improvement: when downloading a map results in too big file (>1MB) diff --git a/commons/src/main/java/lcsb/mapviewer/common/Pair.java b/commons/src/main/java/lcsb/mapviewer/common/Pair.java index 0b486d1627ef7c2492a67e48729dd46f3323c1f7..5f26aa5def5390822e6c69e125b85c268a5a5f19 100644 --- a/commons/src/main/java/lcsb/mapviewer/common/Pair.java +++ b/commons/src/main/java/lcsb/mapviewer/common/Pair.java @@ -78,7 +78,9 @@ public class Pair<L, R> implements Serializable { @Override public String toString() { - return "Pair: " + getLeft().toString() + ", " + getRight().toString(); + String left = getLeft() == null ? "null" : getLeft().toString(); + String right = getRight() == null ? "null" : getRight().toString(); + return "Pair: " + left + ", " + right; } } \ No newline at end of file diff --git a/commons/src/main/java/lcsb/mapviewer/common/comparator/AbstractComparator.java b/commons/src/main/java/lcsb/mapviewer/common/comparator/AbstractComparator.java new file mode 100644 index 0000000000000000000000000000000000000000..f3215e5a92793a567ae95c948669f0ca04228c60 --- /dev/null +++ b/commons/src/main/java/lcsb/mapviewer/common/comparator/AbstractComparator.java @@ -0,0 +1,18 @@ +package lcsb.mapviewer.common.comparator; + +import java.util.Comparator; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public abstract class AbstractComparator<T> implements Comparator<T> { + private Logger logger = LogManager.getLogger(); + + public int compare(T o1, T o2, String objectName) { + int result = compare(o1, o2); + if (result != 0) { + logger.debug(objectName + " different: " + o1 + "\t" + o2); + } + return result; + } +} diff --git a/commons/src/main/java/lcsb/mapviewer/common/comparator/ColorComparator.java b/commons/src/main/java/lcsb/mapviewer/common/comparator/ColorComparator.java index a788fe958a5fa3604df900607ee637544f4cfe4f..a077704aa2d78d0af79c181dec939a5476606598 100644 --- a/commons/src/main/java/lcsb/mapviewer/common/comparator/ColorComparator.java +++ b/commons/src/main/java/lcsb/mapviewer/common/comparator/ColorComparator.java @@ -1,7 +1,6 @@ package lcsb.mapviewer.common.comparator; -import java.awt.*; -import java.util.Comparator; +import java.awt.Color; /** * Comparator implementation for {@link Color} class. @@ -9,7 +8,7 @@ import java.util.Comparator; * @author Piotr Gawron * */ -public class ColorComparator implements Comparator<Color> { +public class ColorComparator extends AbstractComparator<Color> { @Override public int compare(Color arg0, Color arg1) { diff --git a/commons/src/main/java/lcsb/mapviewer/common/comparator/DoubleComparator.java b/commons/src/main/java/lcsb/mapviewer/common/comparator/DoubleComparator.java index d5ee693a0f281550991fb32bfc336d9d08e3a0b9..434ca24d0bbd42c2535f7a54df7366c01d626b90 100644 --- a/commons/src/main/java/lcsb/mapviewer/common/comparator/DoubleComparator.java +++ b/commons/src/main/java/lcsb/mapviewer/common/comparator/DoubleComparator.java @@ -1,7 +1,5 @@ package lcsb.mapviewer.common.comparator; -import java.util.Comparator; - import lcsb.mapviewer.common.Configuration; /** @@ -10,7 +8,7 @@ import lcsb.mapviewer.common.Configuration; * @author Piotr Gawron * */ -public class DoubleComparator implements Comparator<Double> { +public class DoubleComparator extends AbstractComparator<Double> { /** * Epsilon value used for comparison of doubles. diff --git a/commons/src/main/java/lcsb/mapviewer/common/comparator/IntegerComparator.java b/commons/src/main/java/lcsb/mapviewer/common/comparator/IntegerComparator.java index 793a591aa4dbd60979578b98ffcaa352e9ec1b3a..5a7408b7a1715d9e8d9161c039e5d947edfd43e6 100644 --- a/commons/src/main/java/lcsb/mapviewer/common/comparator/IntegerComparator.java +++ b/commons/src/main/java/lcsb/mapviewer/common/comparator/IntegerComparator.java @@ -1,14 +1,12 @@ package lcsb.mapviewer.common.comparator; -import java.util.Comparator; - /** * Comparator implemented for {@link Integer} class. * * @author Piotr Gawron * */ -public class IntegerComparator implements Comparator<Integer> { +public class IntegerComparator extends AbstractComparator<Integer> { @Override public int compare(Integer arg0, Integer arg1) { diff --git a/commons/src/main/java/lcsb/mapviewer/common/comparator/StringComparator.java b/commons/src/main/java/lcsb/mapviewer/common/comparator/StringComparator.java index 737c4cde770fc01ee7b809ba0bf8dc7bfea7dcae..c2447f0d935071e6428d3327f530359ad70e3164 100644 --- a/commons/src/main/java/lcsb/mapviewer/common/comparator/StringComparator.java +++ b/commons/src/main/java/lcsb/mapviewer/common/comparator/StringComparator.java @@ -1,7 +1,5 @@ package lcsb.mapviewer.common.comparator; -import java.util.Comparator; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -12,7 +10,7 @@ import org.apache.logging.log4j.Logger; * @author Piotr Gawron * */ -public class StringComparator implements Comparator<String> { +public class StringComparator extends AbstractComparator<String> { /** * Default class logger. */ diff --git a/converter-CellDesigner/pom.xml b/converter-CellDesigner/pom.xml index 6c63f5a7683f4c19af8f8fb9acfa4e26babc9de4..733ba83e10bec191fdc6cf03a7ec210759d02976 100644 --- a/converter-CellDesigner/pom.xml +++ b/converter-CellDesigner/pom.xml @@ -67,6 +67,13 @@ <scope>compile</scope> </dependency> + <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + <version>${springframework.version}</version> + </dependency> + </dependencies> </project> \ No newline at end of file diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/CellDesignerXmlParser.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/CellDesignerXmlParser.java index c6386575d66324c51057c8837de764cddd3d11d8..34aaa538dc4da97460c25497de82897e2efa8379 100644 --- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/CellDesignerXmlParser.java +++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/CellDesignerXmlParser.java @@ -11,6 +11,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.LogEvent; import org.apache.xerces.parsers.DOMParser; +import org.springframework.stereotype.Component; import org.w3c.dom.*; import lcsb.mapviewer.common.*; @@ -55,6 +56,7 @@ import lcsb.mapviewer.model.map.species.Element; * @author Piotr Gawron * */ +@Component public class CellDesignerXmlParser extends Converter { /** diff --git a/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java b/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java index 95ed20c1231cbc99cecb006e58f324b4cc3c8d0d..892dab8549a8c6bb5900b0b5ef8a12a2bf776702 100644 --- a/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java +++ b/converter-SBGNML/src/main/java/lcsb/mapviewer/converter/model/sbgnml/SbgnmlXmlConverter.java @@ -9,12 +9,14 @@ import org.apache.commons.text.StringEscapeUtils; import org.apache.logging.log4j.core.LogEvent; import org.sbgn.SbgnUtil; import org.sbgn.bindings.Sbgn; +import org.springframework.stereotype.Component; import lcsb.mapviewer.common.MimeType; import lcsb.mapviewer.common.MinervaLoggerAppender; import lcsb.mapviewer.converter.*; import lcsb.mapviewer.model.map.model.Model; +@Component public class SbgnmlXmlConverter extends Converter { @Override diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java index 0c2f6c3abb411e3bbdafd857983bebeccbbac9b7..11f6e6a78549e26a4d1f0a76fc9af4f1acce8667 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java @@ -420,8 +420,8 @@ public abstract class SpeciesConverter<T extends Species> extends ElementConvert public void drawText(final T species, final Graphics2D graphics, final ConverterParams params) { String text = getText(species); Font oldFont = graphics.getFont(); - Font font = getFont(species, params); Color oldColor = graphics.getColor(); + Font font = getFont(species, params); graphics.setColor(species.getFontColor()); graphics.setFont(font); 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 1e47dc8e3b0763adfa23f41bf262a4d664eece88..9e0bd55f28c1da9496b0669925471697d91c29ea 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 @@ -13,6 +13,7 @@ import org.sbml.jsbml.ext.SBasePlugin; import org.sbml.jsbml.ext.layout.Layout; import org.sbml.jsbml.ext.layout.LayoutModelPlugin; import org.sbml.jsbml.ext.multi.MultiModelPlugin; +import org.springframework.stereotype.Component; import lcsb.mapviewer.commands.CommandExecutionException; import lcsb.mapviewer.commands.layout.ApplySimpleLayoutModelCommand; @@ -33,6 +34,7 @@ import lcsb.mapviewer.model.map.species.*; import lcsb.mapviewer.model.map.species.field.ModificationResidue; import lcsb.mapviewer.model.map.species.field.SpeciesWithModificationResidue; +@Component public class SbmlParser extends Converter { /** diff --git a/converter/src/main/java/lcsb/mapviewer/converter/ZIndexPopulator.java b/converter/src/main/java/lcsb/mapviewer/converter/ZIndexPopulator.java index 4bbbf8235473913319a911a565a89bf879104935..318375fbe3372a1f2b60ef1f6fe4c449785fe750 100644 --- a/converter/src/main/java/lcsb/mapviewer/converter/ZIndexPopulator.java +++ b/converter/src/main/java/lcsb/mapviewer/converter/ZIndexPopulator.java @@ -40,7 +40,6 @@ public class ZIndexPopulator { int maxZIndex = 0; List<Drawable> bioEntities = new ArrayList<>(); - bioEntities.addAll(model.getBioEntities()); for (Layer layer : model.getLayers()) { bioEntities.addAll(layer.getOvals()); bioEntities.addAll(layer.getRectangles()); diff --git a/model/src/main/java/lcsb/mapviewer/model/graphics/PolylineData.java b/model/src/main/java/lcsb/mapviewer/model/graphics/PolylineData.java index 78926645503b9bef1fcd11abe3ff8df9ebbdc37d..94770529cf87fba15e69f6381d3b41deb0775a50 100644 --- a/model/src/main/java/lcsb/mapviewer/model/graphics/PolylineData.java +++ b/model/src/main/java/lcsb/mapviewer/model/graphics/PolylineData.java @@ -260,15 +260,17 @@ public class PolylineData implements Serializable, Drawable { * @param distToTrim * distance by which end of line should be trimmed */ - public void trimEnd(double distToTrim) { + public double trimEnd(double distToTrim) { Point2D last = points.get(points.size() - 1); Point2D last2 = points.get(points.size() - 2); double oldDist = last.distance(last2); if (distToTrim < 0 && oldDist <= Configuration.EPSILON) { logger.debug("Cannot extend empty line"); last.setLocation(last2); + return 0; } else if (oldDist <= distToTrim) { last.setLocation(last2); + return oldDist; } else { double newDistr = oldDist - distToTrim; double ratio = newDistr / oldDist; @@ -277,6 +279,7 @@ public class PolylineData implements Serializable, Drawable { dx *= ratio; dy *= ratio; last.setLocation(last2.getX() + dx, last2.getY() + dy); + return distToTrim; } } @@ -286,12 +289,13 @@ public class PolylineData implements Serializable, Drawable { * @param distToTrim * distance by which beginning of line should be trimmed */ - public void trimBegin(double distToTrim) { + public double trimBegin(double distToTrim) { Point2D last = points.get(0); Point2D last2 = points.get(1); double oldDist = last.distance(last2); if (oldDist <= distToTrim) { last.setLocation(last2); + return oldDist; } else { double newDistr = oldDist - distToTrim; double ratio = newDistr / oldDist; @@ -300,6 +304,7 @@ public class PolylineData implements Serializable, Drawable { dx *= ratio; dy *= ratio; last.setLocation(last2.getX() + dx, last2.getY() + dy); + return distToTrim; } } diff --git a/model/src/main/java/lcsb/mapviewer/model/map/compartment/Compartment.java b/model/src/main/java/lcsb/mapviewer/model/map/compartment/Compartment.java index 887bef49548405663899777bbc663e9dde6113c7..74400f56281d0b9ae949fa0bc437285d6a8c0539 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/compartment/Compartment.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/compartment/Compartment.java @@ -50,7 +50,7 @@ public class Compartment extends Element { /** * Default thickness of compartment border. */ - private static final int DEFAULT_COMPARTMENT_THICKNESS = 12; + public static final int DEFAULT_COMPARTMENT_THICKNESS = 12; /** * Default class logger. diff --git a/model/src/main/java/lcsb/mapviewer/model/map/layout/graphics/LayerComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/layout/graphics/LayerComparator.java index fd61a1c447f789a5b32c1f8a4539ace01243fea2..53ed7c7276d403ca8b7ebe2935970d2761b86280 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/layout/graphics/LayerComparator.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/layout/graphics/LayerComparator.java @@ -6,6 +6,7 @@ import org.apache.logging.log4j.Logger; import lcsb.mapviewer.common.Comparator; import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.common.comparator.*; +import lcsb.mapviewer.model.graphics.PolylineData; import lcsb.mapviewer.model.graphics.PolylineDataComparator; /** @@ -88,40 +89,32 @@ public class LayerComparator extends Comparator<Layer> { return integerComparator.compare(arg0.getOvals().size(), arg1.getOvals().size()); } - LayerTextComparator textComparator = new LayerTextComparator(epsilon); - for (int i = 0; i < arg0.getTexts().size(); i++) { - int status = textComparator.compare(arg0.getTexts().get(i), arg1.getTexts().get(i)); - if (status != 0) { - logger.debug("layer texts different"); - return status; - } + ListComparator<LayerText> textComparator = new ListComparator<>(new LayerTextComparator(epsilon)); + int status = textComparator.compare(arg0.getTexts(), arg1.getTexts()); + if (status != 0) { + logger.debug("layer texts different"); + return status; } - LayerOvalComparator ovalComparator = new LayerOvalComparator(epsilon); - for (int i = 0; i < arg0.getOvals().size(); i++) { - int status = ovalComparator.compare(arg0.getOvals().get(i), arg1.getOvals().get(i)); - if (status != 0) { - logger.debug("layer ovals different"); - return status; - } + ListComparator<LayerOval> ovalComparator = new ListComparator<>(new LayerOvalComparator(epsilon)); + status = ovalComparator.compare(arg0.getOvals(), arg1.getOvals()); + if (status != 0) { + logger.debug("layer ovals different"); + return status; } - LayerRectComparator rectComparator = new LayerRectComparator(epsilon); - for (int i = 0; i < arg0.getRectangles().size(); i++) { - int status = rectComparator.compare(arg0.getRectangles().get(i), arg1.getRectangles().get(i)); - if (status != 0) { - logger.debug("layer rectangles different "); - return status; - } + ListComparator<LayerRect> rectComparator = new ListComparator<>(new LayerRectComparator(epsilon)); + status = rectComparator.compare(arg0.getRectangles(), arg1.getRectangles()); + if (status != 0) { + logger.debug("layer rectangles different "); + return status; } - PolylineDataComparator lineComparator = new PolylineDataComparator(epsilon); - for (int i = 0; i < arg0.getLines().size(); i++) { - int status = lineComparator.compare(arg0.getLines().get(i), arg1.getLines().get(i)); - if (status != 0) { - logger.debug("layer lines different "); - return status; - } + ListComparator<PolylineData> lineComparator = new ListComparator<>(new PolylineDataComparator(epsilon)); + status = lineComparator.compare(arg0.getLines(), arg1.getLines()); + if (status != 0) { + logger.debug("layer lines different "); + return status; } return 0; diff --git a/model/src/main/java/lcsb/mapviewer/model/map/layout/graphics/LayerTextComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/layout/graphics/LayerTextComparator.java index e656f63c47b6ba0fd0a43cbc592b5d4847ddc790..82ffeb69a3491f3b6dd50bd7ffd24a13b9368ecc 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/layout/graphics/LayerTextComparator.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/layout/graphics/LayerTextComparator.java @@ -1,5 +1,8 @@ package lcsb.mapviewer.model.map.layout.graphics; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import lcsb.mapviewer.common.Comparator; import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.common.comparator.*; @@ -13,6 +16,8 @@ import lcsb.mapviewer.common.comparator.*; */ public class LayerTextComparator extends Comparator<LayerText> { + private Logger logger = LogManager.getLogger(); + /** * Epsilon value used for comparison of doubles. */ @@ -44,35 +49,35 @@ public class LayerTextComparator extends Comparator<LayerText> { IntegerComparator integerComparator = new IntegerComparator(); if (doubleComparator.compare(arg0.getWidth(), arg1.getWidth()) != 0) { - return doubleComparator.compare(arg0.getWidth(), arg1.getWidth()); + return doubleComparator.compare(arg0.getWidth(), arg1.getWidth(), "width"); } if (doubleComparator.compare(arg0.getHeight(), arg1.getHeight()) != 0) { - return doubleComparator.compare(arg0.getHeight(), arg1.getHeight()); + return doubleComparator.compare(arg0.getHeight(), arg1.getHeight(), "height"); } if (doubleComparator.compare(arg0.getX(), arg1.getX()) != 0) { - return doubleComparator.compare(arg0.getX(), arg1.getX()); + return doubleComparator.compare(arg0.getX(), arg1.getX(), "x"); } if (doubleComparator.compare(arg0.getY(), arg1.getY()) != 0) { - return doubleComparator.compare(arg0.getY(), arg1.getY()); + return doubleComparator.compare(arg0.getY(), arg1.getY(), "y"); } if (colorComparator.compare(arg0.getColor(), arg1.getColor()) != 0) { - return colorComparator.compare(arg0.getColor(), arg1.getColor()); + return colorComparator.compare(arg0.getColor(), arg1.getColor(), "color"); } if (stringComparator.compare(arg0.getNotes(), arg1.getNotes()) != 0) { - return stringComparator.compare(arg0.getNotes(), arg1.getNotes()); + return stringComparator.compare(arg0.getNotes(), arg1.getNotes(), "notes"); } if (doubleComparator.compare(arg0.getFontSize(), arg1.getFontSize()) != 0) { - return doubleComparator.compare(arg0.getFontSize(), arg1.getFontSize()); + return doubleComparator.compare(arg0.getFontSize(), arg1.getFontSize(), "fontSize"); } if (integerComparator.compare(arg0.getZ(), arg1.getZ()) != 0) { - return integerComparator.compare(arg0.getZ(), arg1.getZ()); + return integerComparator.compare(arg0.getZ(), arg1.getZ(), "z"); } return 0; diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java index 52bef262b9c4bc71a4c5f74ea4459ca3b94cae06..18d836f3136ac3014bbea7bdba6517b7e1b8856b 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java @@ -117,7 +117,7 @@ public class ElementComparator extends Comparator<Element> { } if (colorComparator.compare(arg0.getFontColor(), arg1.getFontColor()) != 0) { - logger.debug("Border Font different: " + arg0.getFontColor() + ", " + arg1.getFontColor()); + logger.debug("Font color different: " + arg0.getFontColor() + ", " + arg1.getFontColor()); return colorComparator.compare(arg0.getFontColor(), arg1.getFontColor()); } diff --git a/pathvisio/.project b/pathvisio/.project index 7edba154eee624dd2b07c88fb90dd823e8f38d6e..7c27b022d33f191f441d65a7d69e7934f674ee84 100644 --- a/pathvisio/.project +++ b/pathvisio/.project @@ -5,6 +5,11 @@ <projects> </projects> <buildSpec> + <buildCommand> + <name>org.eclipse.wst.common.project.facet.core.builder</name> + <arguments> + </arguments> + </buildCommand> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments> @@ -15,6 +20,11 @@ <arguments> </arguments> </buildCommand> + <buildCommand> + <name>org.eclipse.wst.validation.validationbuilder</name> + <arguments> + </arguments> + </buildCommand> <buildCommand> <name>org.eclipse.m2e.core.maven2Builder</name> <arguments> @@ -22,8 +32,11 @@ </buildCommand> </buildSpec> <natures> + <nature>org.eclipse.jem.workbench.JavaEMFNature</nature> + <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature> <nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.m2e.core.maven2Nature</nature> <nature>net.sf.eclipsecs.core.CheckstyleNature</nature> + <nature>org.eclipse.wst.common.project.facet.core.nature</nature> </natures> </projectDescription> diff --git a/pathvisio/pom.xml b/pathvisio/pom.xml index 9eac37f38a086b402840afb81feb6930ebec46ce..30ee0f01455a80296445bc7ed63ace99ae147b74 100644 --- a/pathvisio/pom.xml +++ b/pathvisio/pom.xml @@ -8,7 +8,7 @@ <artifactId>pathvisio</artifactId> <name>Pathvisio plugin</name> - <packaging>bundle</packaging> +<!-- <packaging>bundle</packaging> <build> <plugins> @@ -128,7 +128,7 @@ </plugin> </plugins> </build> - +--> <repositories> <repository> <id>repo</id> diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/GpmlParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/GpmlParser.java new file mode 100644 index 0000000000000000000000000000000000000000..796d4a006eb3dff90a82508037b8d1b981ca0143 --- /dev/null +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/GpmlParser.java @@ -0,0 +1,57 @@ +package lcsb.mapviewer.wikipathway; + +import java.io.File; +import java.io.IOException; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.stereotype.Component; + +import lcsb.mapviewer.common.MimeType; +import lcsb.mapviewer.converter.*; +import lcsb.mapviewer.model.map.InconsistentModelException; +import lcsb.mapviewer.model.map.model.Model; +import lcsb.mapviewer.wikipathway.XML.GPMLToModel; +import lcsb.mapviewer.wikipathway.XML.ModelToGPML; + +@Component +public class GpmlParser extends Converter { + Logger logger = LogManager.getLogger(); + + @Override + public Model createModel(ConverterParams params) throws InvalidInputDataExecption, ConverterException { + GPMLToModel gpmlToModel = new GPMLToModel(); + File inputFile = null; + try { + Model result = gpmlToModel.getModel(params.getInputStream()); + return result; + + } catch (IOException e) { + throw new ConverterException("Failed to convert input stream to file.", e); + } finally { + assert inputFile == null || inputFile.delete(); + } + } + + @Override + public String model2String(Model model) throws InconsistentModelException, ConverterException { + ModelToGPML modelToGPML = new ModelToGPML(); + return modelToGPML.getGPML(model); + } + + @Override + public String getCommonName() { + return "GPML"; + } + + @Override + public MimeType getMimeType() { + return MimeType.XML; + } + + @Override + public String getFileExtension() { + return "gpml"; + } + +} diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/BiopaxParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/BiopaxParser.java index 0296f8a1e1d69546133b3bb71c1678c2b08f9747..e1a3725b8d2e926e4da1ccfb2d798f3dbfcaa704 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/BiopaxParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/BiopaxParser.java @@ -8,8 +8,8 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import lcsb.mapviewer.common.XmlParser; -import lcsb.mapviewer.common.exception.InvalidArgumentException; -import lcsb.mapviewer.model.map.*; +import lcsb.mapviewer.model.map.MiriamData; +import lcsb.mapviewer.model.map.MiriamType; import lcsb.mapviewer.wikipathway.model.biopax.*; /** @@ -36,11 +36,11 @@ public class BiopaxParser { private Map<MiriamData, String> miriamHash = new HashMap<>(); /** - * Creates data structure from biopax xml node. + * Creates data structure from BioPax xml node. * * @param biopax * xml node - * @return {@link BiopaxData} structure containing biopax data + * @return {@link BiopaxData} structure containing BioPax data */ public BiopaxData parse(Node biopax) { BiopaxData result = new BiopaxData(); @@ -150,12 +150,12 @@ public class BiopaxParser { /** * Returns unique hash for the {@link MiriamData} that can be used as a key in - * Biopax xml. + * BioPax xml. * * @param md * {@link MiriamData} for which we want to have unique hash value * @return unique hash for the {@link MiriamData} that can be used as a key in - * Biopax xml + * BioPax xml */ private String getHash(MiriamData md) { if (miriamHash.get(md) == null) { @@ -167,11 +167,11 @@ public class BiopaxParser { /** * Converts collection of {@link MiriamData} into an xml {@link String} - * representing this collection as a biopax data. + * representing this collection as a BioPax data. * * @param miriamData * collection of {@link MiriamData} - * @return xml {@link String} representing this collection as a biopax data + * @return xml {@link String} representing this collection as a BioPax data */ public String toXml(Collection<MiriamData> miriamData) { StringBuilder sb = new StringBuilder(""); @@ -187,11 +187,11 @@ public class BiopaxParser { } /** - * Converts {@link MiriamData} into xml string in biopax format. + * Converts {@link MiriamData} into xml string in BioPax format. * * @param md * {@link MiriamData} to transform - * @return xml string in biopax format representing {@link MiriamData} + * @return xml string in BioPax format representing {@link MiriamData} */ public String toXml(MiriamData md) { StringBuilder sb = new StringBuilder(); @@ -203,54 +203,4 @@ public class BiopaxParser { sb.append("</bp:PublicationXref>\n"); return sb.toString(); } - - /** - * Creates {@link MiriamData annotation} from {@link BiopaxPublication}. - * - * @param publication - * input biopax structure - * @return {@link MiriamData annotation} - */ - protected MiriamData createMiriamData(BiopaxPublication publication) { - if ("PubMed".equals(publication.getDb())) { - if (publication.getId() == null || publication.getId().equals("")) { - return null; - } else { - return new MiriamData(MiriamRelationType.BQ_BIOL_IS_DESCRIBED_BY, MiriamType.PUBMED, publication.getId()); - } - } else { - throw new InvalidArgumentException("Unknown biopax database: " + publication.getDb()); - } - } - - /** - * Returns list of {@link MiriamData} that are refernced in {@link BiopaxData} - * with identifier given in biopaxReference. - * - * @param biopaxData - * {@link BiopaxData} where annotations are stored - * @param biopaxReference - * list of refrences (to data in {@link BiopaxData}) that we want to - * convert into {@link MiriamData} - * @return list of {@link MiriamData} that are refernced in {@link BiopaxData} - * with identifier given in biopaxReference. - */ - public Collection<MiriamData> getMiriamData(BiopaxData biopaxData, List<String> biopaxReference) { - List<MiriamData> result = new ArrayList<>(); - for (String string : biopaxReference) { - BiopaxPublication bp = biopaxData.getPublicationByReference(string); - if (bp != null) { - MiriamData md = createMiriamData(bp); - if (md != null) { - result.add(md); - } else { - logger.warn("[" + string + "]\tBiopax publication is invalid."); - } - } else { - logger.warn("[" + string + "]\tBiopax publication doesn't exist."); - } - } - return result; - } - } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeParser.java index d1d4c91cb6a66e42556cbdd6f29da81845f7d12e..fe9739662e138fa4532dba0e273eff324e196ca1 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeParser.java @@ -152,8 +152,8 @@ public class EdgeParser extends ElementGpmlParser<Edge> { * thrown when data for the edge is invalid */ protected void parseGraphics(Edge edge, Element graphicsNode) throws ConverterException { - List<Element> points = new ArrayList<Element>(); - List<Element> anchors = new ArrayList<Element>(); + List<Element> points = new ArrayList<>(); + List<Element> anchors = new ArrayList<>(); GpmlLineConnectorType connectorType = GpmlLineConnectorType.STRAIGHT; @@ -163,7 +163,6 @@ public class EdgeParser extends ElementGpmlParser<Edge> { connectorType = GpmlLineConnectorType.getByGpmlName(entry.getRight()); break; case ("LineThickness"): - // line thicknes edge.getLine().setWidth(entry.getRight()); break; case ("LineStyle"): @@ -175,7 +174,6 @@ public class EdgeParser extends ElementGpmlParser<Edge> { edge.setzOrder(Integer.valueOf(entry.getRight())); break; case ("Color"): - // graphics color edge.setColor(hexStringToColor(entry.getRight())); break; default: @@ -184,8 +182,7 @@ public class EdgeParser extends ElementGpmlParser<Edge> { } } - NodeList nodes; - nodes = graphicsNode.getChildNodes(); + NodeList nodes = graphicsNode.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { Node node = nodes.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { @@ -217,6 +214,7 @@ public class EdgeParser extends ElementGpmlParser<Edge> { edge.setType(pointData.getType()); } + edge.setReversibleReaction(pointDataList.get(0).getType() == GpmlInteractionType.ARROW); edge.getLine().setPoints(getPoints(edge.getWarningPrefix(), pointDataList, connectorType)); if (edge.getLine().getPoints().size() < 2) { @@ -252,16 +250,16 @@ public class EdgeParser extends ElementGpmlParser<Edge> { } /** - * This method transforms list of {@link PointData points} from gpml xml into + * This method transforms list of {@link PointData points} from GPML xml into * list of standard {@link Point2D points}. * * @param warningPrefix * prefix that should be used for warnings * @param pointDataList - * list of points from gpml format + * list of points from GPML format * @param connectorType * {@link GpmlLineConnectorType type} defining how points are connected - * in gpml format + * in GPML format * @return list of standard {@link Point2D points} obtained from input data * @throws UnknownGpmlLineConnectorTypeException * thrown when {@link GpmlLineConnectorType type} is unknown @@ -270,7 +268,7 @@ public class EdgeParser extends ElementGpmlParser<Edge> { * @throws UnknownTypeException * throw when connector type is invalid */ - private List<Point2D> getPoints(String warningPrefix, List<PointData> pointDataList, + List<Point2D> getPoints(String warningPrefix, List<PointData> pointDataList, GpmlLineConnectorType connectorType) throws InvalidElbowConnectorException, UnknownTypeException { List<Point2D> result = new ArrayList<>(); @@ -286,11 +284,17 @@ public class EdgeParser extends ElementGpmlParser<Edge> { if (to == null) { to = Direction.EAST; } + if (from == Direction.NONE) { + from = to.nextClockwiseDirection().nextClockwiseDirection(); + for (int i = 0; i < pointDataList.size() - 1; i++) { + from = from.nextClockwiseDirection(); + } + } // how many segments do we have int lines = computeNumberOfPerpendicularSegments(warningPrefix, pointDataList.get(0), pointDataList.get(pointDataList.size() - 1)); - // now we know how many segments should be i the line + // now we know how many segments should be in the line // if segments are defined in the input the it's easy if (lines == pointDataList.size()) { @@ -310,11 +314,11 @@ public class EdgeParser extends ElementGpmlParser<Edge> { // add middle point points.add(1, computeDefaultPoint(from, points.get(0))); // CHECKSTYLE:OFF - // if something is still missing then add defult beginning line + // if something is still missing then add default beginning line if (lines > 3) { points.add(2, computeDefaultPoint(to, points.get(2))); } - // if something is still missing then add defult end line + // if something is still missing then add default end line if (lines > 4) { double x = (points.get(1).getX() + points.get(2).getX()) / 2; double y = (points.get(1).getY() + points.get(2).getY()) / 2; @@ -331,9 +335,9 @@ public class EdgeParser extends ElementGpmlParser<Edge> { // and now transform the points into perpendicular segments result = preparePerpendicularLines(from, points); - // if number of expectred segments is lower than number of defined + // if number of expected segments is lower than number of defined // segments then we probably missed something, let's assume that in - // gpml file the data is correct and parse it + // GPML file the data is correct and parse it } else if (pointDataList.size() > lines) { List<Point2D> points = new ArrayList<>(); for (PointData pd : pointDataList) { @@ -341,7 +345,7 @@ public class EdgeParser extends ElementGpmlParser<Edge> { } result = preparePerpendicularLines(from, points); - // if number of expectred segments is different than number of defined + // if number of expected segments is different than number of defined // segments then something is wrong } else { throw new InvalidElbowConnectorException( @@ -407,10 +411,14 @@ public class EdgeParser extends ElementGpmlParser<Edge> { to = Direction.EAST; } - // result (2 is the minimu) + if (from == Direction.NONE || to == Direction.NONE) { + return 2; + } + + // result (2 is the minimum) int lines = 2; - // if line starts and ends i nthe same axis then number of segments + // if line starts and ends in the same axis then number of segments // should be at least3 if (from.getAxis().equals(to.getAxis())) { lines++; @@ -421,7 +429,7 @@ public class EdgeParser extends ElementGpmlParser<Edge> { // then check if some addition lines are needed if (!from.equals(to)) { int addition = 0; - // check if begining requires additional lines because the end is + // check if beginning requires additional lines because the end is // overlapping the beginning switch (from) { case EAST: @@ -447,7 +455,7 @@ public class EdgeParser extends ElementGpmlParser<Edge> { default: throw new InvalidElbowConnectorException(warningPrefix + "Unknown direction: " + from); } - // check if emdrequires additional lines because the beginning is + // check if end requires additional lines because the beginning is // overlapping end part switch (to) { case EAST: diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java index 4563d839db45485adbe910539edb40b25dce8bae..43be3375771c9693b150f15205de2b7df1f839ed 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java @@ -71,7 +71,7 @@ public class GpmlParser { /** * This function returns parent interaction for edge that has anchor at one end. - * + * * @param graph * model where data is stored * @param edge @@ -107,7 +107,7 @@ public class GpmlParser { /** * This function sets width and height in given graph. - * + * * @param node * xml node where data is stored * @param graph @@ -121,62 +121,66 @@ public class GpmlParser { graph.setBoardHeight(Math.ceil(Double.parseDouble(boardHeight))); } - /** - * This function adds groups to graph and nest them. - * - * @param groups - * xml nodes - * @param graph - * object where data is stored - * @throws UnknownAttributeValueException - * thrown when there is a problem with xml attributes - */ - protected void addGroups(List<Node> groups, Graph graph) throws UnknownAttributeValueException { - // Adding Groups to graph - for (Node nNode : groups) { - if (nNode.getNodeType() == Node.ELEMENT_NODE) { - Element eElement = (Element) nNode; - String graphId = eElement.getAttribute("GraphId"); - String groupId = eElement.getAttribute("GroupId"); - if (graphId.equals("") || graphId == null) { - graphId = groupId; - } - String style = eElement.getAttribute("Style"); - if ("".equals(style)) { - style = null; - } - if (style != null && - !"Complex".equalsIgnoreCase(style) && - !"Group".equalsIgnoreCase(style)) { - throw new UnknownAttributeValueException( - "Unknown value of \"style\" attribute for group node: " + style - + ". Only null, Complex, Group are supported."); - } - Group group = new Group(graphId, groupId); - group.setStyle(style); - graph.addGroup(group); - } - } - // Handling nested groups - Group gr1, gr2; - for (Node nNode : groups) { - if (nNode.getNodeType() == Node.ELEMENT_NODE) { - Element eElement = (Element) nNode; - String groupRef = eElement.getAttribute("GroupRef"); - String groupId = eElement.getAttribute("GroupId"); - if (groupRef != null && !groupRef.equals("")) { - gr1 = graph.getGroupByGroupId(groupRef); - gr2 = graph.getGroupByGroupId(groupId); - gr1.addNode(gr2); - } - } - } - } + /** + * This function adds groups to graph and nest them. + * + * @param groups + * xml nodes + * @param graph + * object where data is stored + * @throws UnknownAttributeValueException + * thrown when there is a problem with xml attributes + */ + protected void addGroups(List<Node> groups, Graph graph) throws UnknownAttributeValueException { + // Adding Groups to graph + for (Node nNode : groups) { + if (nNode.getNodeType() == Node.ELEMENT_NODE) { + Element eElement = (Element) nNode; + String graphId = eElement.getAttribute("GraphId"); + String groupId = eElement.getAttribute("GroupId"); + if (graphId.equals("") || graphId == null) { + graphId = groupId; + } + String style = eElement.getAttribute("Style"); + if ("".equals(style)) { + style = null; + } + if (style != null && + !"Complex".equalsIgnoreCase(style) && + !"Group".equalsIgnoreCase(style)) { + throw new UnknownAttributeValueException( + "Unknown value of \"style\" attribute for group node: " + style + ". Only null, Complex, Group are supported."); + } + Group group = new Group(graphId, groupId); + group.setStyle(style); + + String zIndex = eElement.getAttribute("ZOrder"); + if (zIndex!=null && !zIndex.isEmpty()) { + group.setzOrder(Integer.valueOf(zIndex)); + } + graph.addGroup(group); + } + } + // Handling nested groups + Group gr1, gr2; + for (Node nNode : groups) { + if (nNode.getNodeType() == Node.ELEMENT_NODE) { + Element eElement = (Element) nNode; + String groupRef = eElement.getAttribute("GroupRef"); + String groupId = eElement.getAttribute("GroupId"); + if (groupRef != null && !groupRef.equals("")) { + gr1 = graph.getGroupByGroupId(groupRef); + gr2 = graph.getGroupByGroupId(groupId); + gr1.addNode(gr2); + } + } + } + } /** * This function adds edges to graph. It ignores edges that have no connection * at one end and edges that connects to shapes or labels. - * + * * @param nodes * xml nodes * @param graph @@ -224,31 +228,16 @@ public class GpmlParser { * NodeToNode connection are transformed into Interactions. Second: Edges with * AnchorToNode connection are added to right interaction. Edges with * AnchorToAnchor connection are ignored. - * + * * @param graph - * object where data is sotred + * object where data is sorted * @throws InvalidXmlSchemaException * thrown when the data in input file is invalid */ protected void addInteractions(Graph graph) throws InvalidXmlSchemaException { for (Edge edge : graph.getEdges()) { if (graph.getNodeByGraphId(edge.getEnd()) != null && graph.getNodeByGraphId(edge.getStart()) != null) { - if (graph.getNodeByGraphId(edge.getEnd()) instanceof Label) { - Label label = (Label) graph.getNodeByGraphId(edge.getEnd()); - label.setTreatAsNode(true); - } - if (graph.getNodeByGraphId(edge.getStart()) instanceof Label) { - Label label = (Label) graph.getNodeByGraphId(edge.getStart()); - label.setTreatAsNode(true); - } - if (graph.getShapeByGraphId(edge.getEnd()) instanceof Shape) { - Shape shape = (Shape) graph.getShapeByGraphId(edge.getEnd()); - shape.setTreatAsNode(true); - } - if (graph.getShapeByGraphId(edge.getStart()) instanceof Shape) { - Shape shape = (Shape) graph.getShapeByGraphId(edge.getStart()); - shape.setTreatAsNode(true); - } + markLabelsAndShapesToBecomeSpeciesForEdge(graph, edge); Interaction interaction = new Interaction(edge); graph.addInteraction(interaction); @@ -287,6 +276,7 @@ public class GpmlParser { throw new InvalidStateException( "Unknown internal model type: " + mapping.getModelInputReactionNodeType()); } + markLabelsAndShapesToBecomeSpeciesForEdge(graph, edge); } else { throw new InvalidXmlSchemaException("Unknown interaction type: " + edge.getType()); } @@ -301,7 +291,7 @@ public class GpmlParser { if (mapping != null) { if (mapping.isOutputWarning()) { logger.warn(edge.getWarningPrefix() + "Invalid interaction type \"" + edge.getType() - + "\" as an input to reaction."); + + "\" as an output from reaction."); } if (Modifier.class.isAssignableFrom(mapping.getModelOutputReactionNodeType())) { tmp.addModifier(edge); @@ -313,6 +303,7 @@ public class GpmlParser { throw new InvalidStateException( "Unknown internal model type: " + mapping.getModelOutputReactionNodeType()); } + markLabelsAndShapesToBecomeSpeciesForEdge(graph, edge); } else { throw new InvalidXmlSchemaException("Unknown interaction type: " + edge.getType()); } @@ -328,9 +319,28 @@ public class GpmlParser { } } + private void markLabelsAndShapesToBecomeSpeciesForEdge(Graph graph, Edge edge) { + if (graph.getNodeByGraphId(edge.getEnd()) instanceof Label) { + Label label = (Label) graph.getNodeByGraphId(edge.getEnd()); + label.setTreatAsNode(true); + } + if (graph.getNodeByGraphId(edge.getStart()) instanceof Label) { + Label label = (Label) graph.getNodeByGraphId(edge.getStart()); + label.setTreatAsNode(true); + } + if (graph.getShapeByGraphId(edge.getEnd()) instanceof Shape) { + Shape shape = (Shape) graph.getShapeByGraphId(edge.getEnd()); + shape.setTreatAsNode(true); + } + if (graph.getShapeByGraphId(edge.getStart()) instanceof Shape) { + Shape shape = (Shape) graph.getShapeByGraphId(edge.getStart()); + shape.setTreatAsNode(true); + } + } + /** * Creates gpml {@link Graph} model from gpml input stream. - * + * * @param stream * input stream with gpml model * @return {@link Graph} model @@ -447,7 +457,7 @@ public class GpmlParser { /** * This method merge edges that should be merged into single line. - * + * * @param graph * model where edges are stored */ @@ -518,7 +528,7 @@ public class GpmlParser { /** * Method that merge two {@link Edge edges}. - * + * * @param edge1 * first edge to merge * @param edge2 @@ -572,7 +582,7 @@ public class GpmlParser { /** * Creates edges from lines when it's possible. - * + * * @param lines * xml nodes with lines * @return list of edges that could be created from xml nodes @@ -595,7 +605,7 @@ public class GpmlParser { /** * Creates lines from the list of gpml xml nodes. - * + * * @param lines * list of xml nodes * @return list of {@link PolylineData lines} diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/LabelParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/LabelParser.java index c3c91d277e21792e2163a1e769c5345fa5a4272d..383d5a3718c70f9cc009c5b7fbcc0b8425d37940 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/LabelParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/LabelParser.java @@ -11,6 +11,7 @@ import lcsb.mapviewer.common.Pair; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.common.exception.NotImplementedException; import lcsb.mapviewer.converter.ConverterException; +import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.wikipathway.model.Label; import lcsb.mapviewer.wikipathway.model.UnknownTypeException; @@ -26,7 +27,9 @@ public class LabelParser extends GraphicalPathwayElementParser<Label> { /** * Default class logger. */ - private final Logger logger = LogManager.getLogger(LabelParser.class); + private final Logger logger = LogManager.getLogger(); + + private ReferenceParser referenceParser = new ReferenceParser(); @Override public Label parse(Element eElement) throws UnknownTypeException { @@ -42,6 +45,14 @@ public class LabelParser extends GraphicalPathwayElementParser<Label> { case ("TextLabel"): label.setTextLabel(entry.getRight()); break; + case ("Href"): + MiriamData md = referenceParser.hrefToMiriamData(entry.getRight()); + if (md == null) { + label.addComment(entry.getRight()); + } else { + label.addReference(md); + } + break; case ("GroupRef"): label.setGroupRef(entry.getRight()); break; diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java index c4065bc2c070119eef68f9ad9ba62b00262ae879..b464424687cb37690b025e0cce8339ff67ee7836 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java @@ -1,7 +1,8 @@ package lcsb.mapviewer.wikipathway.XML; import java.awt.Color; -import java.awt.geom.*; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; import java.util.*; import org.apache.commons.text.StringEscapeUtils; @@ -9,17 +10,15 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import lcsb.mapviewer.common.Configuration; -import lcsb.mapviewer.common.Pair; -import lcsb.mapviewer.common.exception.InvalidArgumentException; -import lcsb.mapviewer.common.exception.InvalidStateException; -import lcsb.mapviewer.common.geometry.PointTransformation; +import lcsb.mapviewer.common.exception.*; import lcsb.mapviewer.converter.ConverterException; import lcsb.mapviewer.converter.model.celldesigner.geometry.CellDesignerAliasConverter; -import lcsb.mapviewer.converter.model.celldesigner.geometry.ReactionCellDesignerConverter; +import lcsb.mapviewer.converter.model.celldesigner.geometry.helper.PolylineDataFactory; import lcsb.mapviewer.converter.model.celldesigner.reaction.ReactionLineData; import lcsb.mapviewer.converter.model.celldesigner.types.ModifierType; import lcsb.mapviewer.converter.model.celldesigner.types.ModifierTypeUtils; import lcsb.mapviewer.model.graphics.PolylineData; +import lcsb.mapviewer.model.map.Drawable; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.compartment.*; import lcsb.mapviewer.model.map.layout.graphics.*; @@ -31,8 +30,7 @@ import lcsb.mapviewer.model.map.species.*; import lcsb.mapviewer.model.map.species.field.*; import lcsb.mapviewer.modelutils.map.ElementUtils; import lcsb.mapviewer.wikipathway.model.*; -import lcsb.mapviewer.wikipathway.model.biopax.BiopaxPublication; -import lcsb.mapviewer.wikipathway.utils.Geo; +import lcsb.mapviewer.wikipathway.model.biopax.BiopaxFactory; /** * Class contains methods for GraphToModel conversion. @@ -46,14 +44,7 @@ public class ModelContructor { * Default color used by complexes. */ private static final Color DEFAULT_COMPLEX_ALIAS_COLOR = new Color(102, 255, 255); - /** - * How much of central line is used by and operator that joins reactants. - */ - private static final int AND_OPERATOR_CENTRAL_LINE_RATIO = 10; - /** - * How much of central line is used by split operator that split products. - */ - private static final int SPLIT_OPERATOR_CENTRAL_LINE_RATIO = 10; + /** * Epsilon used for double comparison. */ @@ -90,83 +81,7 @@ public class ModelContructor { /** * Parser used for extracting {@link MiriamData references} from GPML model. */ - private BiopaxParser biopaxParser = new BiopaxParser(); - private PointTransformation pt = new PointTransformation(); - - /** - * This function splits {@link PolylineData} into two parts. It also assumes - * that last segment on the left part is equal to the length of the first - * segment on the right side. - * - * @param pd - * line to split - * @return pair of lines into which parameter was split to - */ - protected Pair<PolylineData, PolylineData> splitPolyline(PolylineData pd) { - PolylineData p1 = new PolylineData(); - PolylineData p2 = new PolylineData(); - p1.setColor(pd.getColor()); - p2.setColor(pd.getColor()); - - List<Line2D> lines = pd.getLines(); - double lenght = 0.0; - for (Line2D line : lines) { - lenght += Geo.lineLen(line); - } - if (lenght > Configuration.EPSILON) { - double tmp = 0.0; - boolean first = true; - for (Line2D line : lines) { - if (tmp + Geo.lineLen(line) > lenght / 2) { - if (first) { - double a = (lenght / 2 - tmp) / Geo.lineLen(line); - double x = line.getX1() + a * (line.getX2() - line.getX1()); - double y = line.getY1() + a * (line.getY2() - line.getY1()); - p1.addPoint((Point2D) line.getP1().clone()); - p1.addPoint(new Point2D.Double(x, y)); - p2.addPoint(new Point2D.Double(x, y)); - first = false; - } - p2.addPoint((Point2D) line.getP2().clone()); - tmp += Geo.lineLen(line); - } else { - p1.addPoint((Point2D) line.getP1().clone()); - tmp += Geo.lineLen(line); - } - } - } else { // we have line with empty length - p1.addPoint((Point2D) pd.getBeginPoint().clone()); - p1.addPoint((Point2D) pd.getBeginPoint().clone()); - p2.addPoint((Point2D) pd.getBeginPoint().clone()); - p2.addPoint((Point2D) pd.getBeginPoint().clone()); - } - - // and now make sure that we have equal distances from left and right - double leftDist = p1.getEndPoint().distance(p1.getPoints().get(p1.getPoints().size() - 2)); - double rightDist = p2.getEndPoint().distance(p2.getPoints().get(p2.getPoints().size() - 2)); - if (Math.abs(leftDist - rightDist) > Configuration.EPSILON) { - if (leftDist > rightDist) { - double ratio = rightDist / leftDist; - double dx = p1.getPoints().get(p1.getPoints().size() - 1).getX() - - p1.getPoints().get(p1.getPoints().size() - 2).getX(); - double dy = p1.getPoints().get(p1.getPoints().size() - 1).getY() - - p1.getPoints().get(p1.getPoints().size() - 2).getY(); - double x = p1.getPoints().get(p1.getPoints().size() - 2).getX() + dx * ratio; - double y = p1.getPoints().get(p1.getPoints().size() - 2).getY() + dy * ratio; - Point2D newPoint = new Point2D.Double(x, y); - p1.addPoint(p1.getPoints().size() - 1, newPoint); - } else { - double ratio = leftDist / rightDist; - double dx = p2.getPoints().get(0).getX() - p2.getPoints().get(1).getX(); - double dy = p2.getPoints().get(0).getY() - p2.getPoints().get(1).getY(); - double x = p2.getPoints().get(1).getX() + dx * ratio; - double y = p2.getPoints().get(1).getY() + dy * ratio; - Point2D newPoint = new Point2D.Double(x, y); - p2.addPoint(1, newPoint); - } - } - return new Pair<PolylineData, PolylineData>(p1, p2); - } + private BiopaxFactory biopaxFactory = new BiopaxFactory(); /** * This function creates Species from DataNode. @@ -177,7 +92,7 @@ public class ModelContructor { * ... * @return {@link Species} created from input {@link DataNode} */ - protected Species createAlias(DataNode dataNode, Data data) { + protected Species createSpecies(DataNode dataNode, Data data) { Species res = null; String type = dataNode.getType(); if (type == null || type.equals("")) { @@ -204,14 +119,18 @@ public class ModelContructor { } res.addMiriamData(dataNode.getReferences()); - res.setZ(dataNode.getzOrder()); res.setName(dataNode.getName()); + StringBuilder notes = new StringBuilder(); + for (String comment : dataNode.getComments()) { + notes.append(comment + "\n\n"); + } + res.setNotes(notes.toString()); return res; } /** - * This function adds ComplexSpecies to model from graph. ComplexName is set as - * groupId from .gpml + * This function adds {@link Complex} to model from graph. ComplexName is set as + * groupId from GPML * * @param model * to this model complexes will be added @@ -220,28 +139,29 @@ public class ModelContructor { * @param data * ... */ - protected void addComplexSpecies(Model model, Graph graph, Data data) { + protected void addComplex(Model model, Graph graph, Data data) { for (Group group : graph.getGroups()) { - Complex alias = new Complex(group.getGraphId()); - alias.setName(group.getGraphId()); + Complex complex = new Complex(group.getGraphId()); + complex.setName(group.getGraphId()); if ("Complex".equalsIgnoreCase(group.getStyle())) { - alias.setHypothetical(false); + complex.setHypothetical(false); } else { - alias.setHypothetical(true); + complex.setHypothetical(true); } Rectangle2D rec = group.getRectangle(); if (rec == null) { rec = new Rectangle2D.Double(0, 0, 0, 0); } - alias.setX(rec.getX()); - alias.setY(rec.getY()); - alias.setWidth((int) rec.getWidth()); - alias.setHeight((int) rec.getHeight()); - alias.setFillColor(DEFAULT_COMPLEX_ALIAS_COLOR); - - data.id2alias.put(group.getGraphId(), alias); - model.addElement(alias); + complex.setX(rec.getX()); + complex.setY(rec.getY()); + complex.setWidth((int) rec.getWidth()); + complex.setHeight((int) rec.getHeight()); + complex.setZ(group.getzOrder()); + complex.setFillColor(DEFAULT_COMPLEX_ALIAS_COLOR); + + data.id2alias.put(group.getGraphId(), complex); + model.addElement(complex); } } @@ -251,14 +171,14 @@ public class ModelContructor { * @param model * model to which species will be added * @param graph - * gpml data model + * GPML data model * @param data * ... */ protected void addElement(Model model, Graph graph, Data data) { for (DataNode dataNode : graph.getDataNodes()) { - Species species = createAlias(dataNode, data); - species.addMiriamData(biopaxParser.getMiriamData(graph.getBiopaxData(), dataNode.getBiopaxReference())); + Species species = createSpecies(dataNode, data); + species.addMiriamData(biopaxFactory.getMiriamData(graph.getBiopaxData(), dataNode.getBiopaxReference())); Element alias = updateAlias(dataNode, species); @@ -268,13 +188,13 @@ public class ModelContructor { for (Label label : graph.getLabels()) { if (label.isTreatAsNode()) { Species species = createSpecies(label); - species.addMiriamData(biopaxParser.getMiriamData(graph.getBiopaxData(), label.getBiopaxReference())); + species.addMiriamData(biopaxFactory.getMiriamData(graph.getBiopaxData(), label.getBiopaxReference())); Element alias = updateAlias(label, species); data.id2alias.put(label.getGraphId(), alias); model.addElement(alias); - } else { + } else if (label.getGroupRef() == null || label.getGroupRef().isEmpty()) { LayerText text = createText(label); data.layer.addLayerText(text); } @@ -282,7 +202,7 @@ public class ModelContructor { for (Shape shape : graph.getShapes()) { if (shape.isTreatAsNode()) { Species species = createSpecies(shape); - species.addMiriamData(biopaxParser.getMiriamData(graph.getBiopaxData(), shape.getBiopaxReference())); + species.addMiriamData(biopaxFactory.getMiriamData(graph.getBiopaxData(), shape.getBiopaxReference())); Element alias = updateAlias(shape, species); @@ -294,6 +214,8 @@ public class ModelContructor { if (shape.getShape().equalsIgnoreCase("oval")) { LayerOval oval = createOval(shape); data.layer.addLayerOval(oval); + } else if (shape.getComments().size() > 0 || shape.getTextLabel() != null) { + data.shapeLabelLayer.addLayerText(createText(shape)); } else { LayerRect rect = createRectangle(shape); data.layer.addLayerRect(rect); @@ -393,12 +315,17 @@ public class ModelContructor { * Creates {@link LayerRect} object from {@link Shape}. * * @param shape - * source gpml object to be transformed + * source GPML object to be transformed * @return {@link LayerRect} obtained from {@link Shape} object */ public LayerRect createRectangle(Shape shape) { LayerRect rect = new LayerRect(); - Rectangle2D rec = shape.getRectangle(); + Rectangle2D rec; + if (shouldRotate90degrees(shape.getRotation())) { + rec = rotate90degrees(shape.getRectangle()); + } else { + rec = shape.getRectangle(); + } rect.setX(rec.getX()); rect.setY(rec.getY()); rect.setHeight(rec.getHeight()); @@ -407,11 +334,39 @@ public class ModelContructor { return rect; } + Rectangle2D rotate90degrees(Rectangle2D rectangle) { + return new Rectangle2D.Double(rectangle.getCenterX() - rectangle.getHeight() / 2, + rectangle.getCenterY() - rectangle.getWidth() / 2, rectangle.getHeight(), rectangle.getWidth()); + } + + boolean shouldRotate90degrees(Double rot) { + if (rot == null) { + return false; + } + double rotation = rot; + while (rotation > Math.PI / 2) { + rotation -= Math.PI; + } + while (rotation < -Math.PI / 2) { + rotation += Math.PI; + } + if (Math.abs(rotation) < Math.PI / 4) { + if (Math.abs(rotation) > Configuration.EPSILON) { + logger.warn("Rotation of objects is not supported. Rotation=" + rot); + } + return false; + } + if ((Math.PI / 2 - Math.abs(rotation)) > Configuration.EPSILON) { + logger.warn("Rotation of objects is not supported. Rotation=" + rot); + } + return true; + } + /** * Creates {@link LayerOval} object from {@link Shape}. * * @param shape - * source gpml object to be transformed + * source GPML object to be transformed * @return {@link LayerOval} obtained from {@link Shape} object */ public LayerOval createOval(Shape shape) { @@ -444,7 +399,38 @@ public class ModelContructor { if (text.getColor().equals(Color.WHITE)) { text.setColor(Color.BLACK); } - text.setNotes(label.getName()); + StringBuilder notes = new StringBuilder(label.getName()); + for (String comment : label.getComments()) { + notes.append(comment + "\n\n"); + } + text.setNotes(notes.toString()); + return text; + } + + public LayerText createText(Shape shape) { + Rectangle2D rec = shape.getRectangle(); + + LayerText text = new LayerText(); + text.setX(rec.getX()); + text.setY(rec.getY()); + text.setHeight(rec.getHeight()); + text.setWidth(rec.getWidth()); + text.setColor(shape.getColor()); + if (text.getColor().equals(Color.WHITE)) { + text.setColor(Color.BLACK); + } + + String name = shape.getTextLabel(); + if (name == null) { + name = ""; + } + + StringBuilder notes = new StringBuilder(name); + for (String comment : shape.getComments()) { + notes.append(comment + "\n\n"); + } + text.setNotes(notes.toString()); + return text; } @@ -481,6 +467,11 @@ public class ModelContructor { if (element instanceof Compartment && !Objects.equals(Color.WHITE, gpmlElement.getFillColor())) { element.setBorderColor(gpmlElement.getFillColor()); } + element.setZ(gpmlElement.getzOrder()); + element.setFontColor(gpmlElement.getColor()); + if (gpmlElement.getFontSize() != null) { + element.setFontSize(gpmlElement.getFontSize()); + } return element; } @@ -495,7 +486,13 @@ public class ModelContructor { logger.warn(label.getWarningPrefix() + " Label cannot be part of reaction. Tranforming to Unknown"); Species res = new Unknown(label.getGraphId()); + res.addMiriamData(label.getReferences()); res.setName(label.getName()); + StringBuilder notes = new StringBuilder(); + for (String comment : label.getComments()) { + notes.append(comment + "\n\n"); + } + res.setNotes(notes.toString()); return res; } @@ -510,6 +507,11 @@ public class ModelContructor { logger.warn(shape.getWarningPrefix() + " Shape can not be part of reaction. Tranforming to Unknown"); Species res = new Unknown(shape.getGraphId()); + StringBuilder notes = new StringBuilder(); + for (String comment : shape.getComments()) { + notes.append(comment + "\n\n"); + } + res.setNotes(notes.toString()); res.setName(shape.getName()); return res; } @@ -518,7 +520,7 @@ public class ModelContructor { * This function add Species to right Complexes. * * @param graph - * gpml data model + * GPML data model * @param data * ... * @throws UnknownChildClassException @@ -527,25 +529,23 @@ public class ModelContructor { protected void putSpeciesIntoComplexes(Graph graph, Data data) throws UnknownChildClassException { for (Group group : graph.getGroups()) { - Complex complexSpecies = (Complex) data.id2alias.get(group.getGraphId()); + Complex complex = (Complex) data.id2alias.get(group.getGraphId()); for (PathwayElement pe : group.getNodes()) { - Element species = data.id2alias.get(pe.getGraphId()); - if (species != null) { - if (species instanceof Species) { - - Species speciesAlias = (Species) species; - speciesAlias.setComplex(complexSpecies); - complexSpecies.addSpecies(speciesAlias); + Element element = data.id2alias.get(pe.getGraphId()); + if (element != null) { + if (element instanceof Species) { + Species species = (Species) element; + complex.addSpecies(species); } // we have label } else if (graph.getLabelByGraphId(pe.getGraphId()) != null) { Label label = graph.getLabelByGraphId(pe.getGraphId()); // if complex has generic name then change it into label - if (complexSpecies.getName().equals(group.getGraphId())) { - complexSpecies.setName(label.getTextLabel()); + if (complex.getName().equals(group.getGraphId())) { + complex.setName(label.getTextLabel()); } else { // if there are more labels than one then merge labels - complexSpecies.setName(complexSpecies.getName() + "\n" + label.getTextLabel()); + complex.setName(complex.getName() + "\n" + label.getTextLabel()); } } else if (graph.getShapeByGraphId(pe.getGraphId()) != null) { Shape shape = graph.getShapeByGraphId(pe.getGraphId()); @@ -567,12 +567,12 @@ public class ModelContructor { * This function creates {@link Reaction} from {@link Interaction} from graph. * * @param interaction - * gpml interaction + * GPML interaction * @param graph - * gpml data model + * GPML data model * @param data * ... - * @return reaction created from gpml {@link Interaction} + * @return reaction created from GPML {@link Interaction} */ protected Reaction createReactionFromInteraction(Interaction interaction, Graph graph, Data data) { InteractionMapping mapping = InteractionMapping.getInteractionMapping(interaction.getType(), @@ -582,32 +582,25 @@ public class ModelContructor { } Reaction reaction = createReactionByType(mapping.getModelReactionType()); reaction.setIdReaction(interaction.getGraphId()); - reaction.setReversible(mapping.isReversible()); + reaction.setReversible(mapping.isReversible() || interaction.isReversible()); reaction.addMiriamData(interaction.getReferences()); reaction.setZ(interaction.getzOrder()); - for (String ref : interaction.getBiopaxReferences()) { - BiopaxPublication publication = graph.getBiopaxData().getPublicationByReference(ref); - MiriamData md = biopaxParser.createMiriamData(publication); - if (md != null) { - reaction.addMiriamData(md); - } - } - - PolylineData pd = interaction.getLine(); + reaction.addMiriamData(biopaxFactory.getMiriamData(graph.getBiopaxData(), interaction.getBiopaxReferences())); - Pair<PolylineData, PolylineData> pair = splitPolyline(pd); - PolylineData pdfirstpart = pair.getLeft(); - PolylineData pdsecondpart = pair.getRight(); + ReactionLayoutFinder layoutFinder = new ReactionLayoutFinder(); + Map<Class<?>, PolylineData> lines = layoutFinder.getNodeLines(interaction); + PolylineData reactantLine = lines.get(Reactant.class); + PolylineData productLine = lines.get(Product.class); Reactant reactant = new Reactant(); reactant.setElement(data.id2alias.get(interaction.getStart())); - reactant.setLine(pdfirstpart); + reactant.setLine(reactantLine); reaction.addReactant(reactant); Product product = new Product(); product.setElement(data.id2alias.get(interaction.getEnd())); - product.setLine(pdsecondpart); + product.setLine(productLine); reaction.addProduct(product); for (Edge e : interaction.getReactants()) { @@ -620,16 +613,8 @@ public class ModelContructor { reaction.addProduct(pro); } - double centralLength = pdfirstpart.getPoints().get(pdfirstpart.getPoints().size() - 2) - .distance(pdfirstpart.getEndPoint()) * 2; - if (reaction.getReactants().size() > 1) { - PolylineData operatorLine = new PolylineData(); - operatorLine.setColor(pdfirstpart.getColor()); - operatorLine.addPoint((Point2D) pdfirstpart.getEndPoint().clone()); - operatorLine.addPoint((Point2D) pdfirstpart.getEndPoint().clone()); - pdfirstpart.trimEnd(centralLength / AND_OPERATOR_CENTRAL_LINE_RATIO); - operatorLine.setStartPoint((Point2D) pdfirstpart.getEndPoint().clone()); + PolylineData operatorLine = lines.get(AndOperator.class); NodeOperator andOperator; // heterodimer association use association operator if (reaction instanceof HeterodimerAssociationReaction) { @@ -642,28 +627,36 @@ public class ModelContructor { andOperator.setLine(operatorLine); for (int i = 1; i < reaction.getReactants().size(); i++) { Reactant r = reaction.getReactants().get(i); - r.getLine().addPoint((Point2D) pdfirstpart.getEndPoint().clone()); + r.getLine().getEndPoint().setLocation(operatorLine.getBeginPoint()); andOperator.addInput(r); } reaction.addNode(andOperator); + } else { + PolylineData operatorLine = lines.get(AndOperator.class); + for (int i = 1; i < operatorLine.getPoints().size(); i++) { + reactantLine.addPoint(operatorLine.getPoints().get(i)); + } + reactant.setLine(PolylineDataFactory.removeCollinearPoints(reactantLine)); } if (reaction.getProducts().size() > 1) { - PolylineData operatorLine = new PolylineData(); - operatorLine.setColor(pdsecondpart.getColor()); + PolylineData operatorLine = lines.get(SplitOperator.class); - operatorLine.addPoint((Point2D) pdsecondpart.getBeginPoint().clone()); - pdsecondpart.trimBegin(centralLength / SPLIT_OPERATOR_CENTRAL_LINE_RATIO); - operatorLine.addPoint((Point2D) pdsecondpart.getBeginPoint().clone()); SplitOperator splitOperator = new SplitOperator(); splitOperator.addOutput(product); - splitOperator.setLine(operatorLine); + splitOperator.setLine(operatorLine.reverse()); for (int i = 1; i < reaction.getProducts().size(); i++) { Product r = reaction.getProducts().get(i); - r.getLine().addPoint(0, (Point2D) pdsecondpart.getBeginPoint().clone()); + r.getLine().getBeginPoint().setLocation(operatorLine.getEndPoint()); splitOperator.addOutput(r); } reaction.addNode(splitOperator); + } else { + PolylineData operatorLine = lines.get(SplitOperator.class); + for (int i = 0; i < operatorLine.getPoints().size()-1; i++) { + productLine.addPoint(i, operatorLine.getPoints().get(i)); + } + product.setLine(PolylineDataFactory.removeCollinearPoints(productLine)); } for (Edge e : interaction.getModifiers()) { @@ -704,7 +697,9 @@ public class ModelContructor { } } - createReactionCenterLine(reaction); + PolylineData modifierLine = lines.get(Modifier.class); + modifierLine.setType(rld.getLineType()); + reaction.setLine(modifierLine); ModifierTypeUtils mtu = new ModifierTypeUtils(); for (Modifier m : reaction.getModifiers()) { @@ -715,36 +710,8 @@ public class ModelContructor { return reaction; } - private void createReactionCenterLine(Reaction reaction) { - AbstractNode input = reaction.getReactants().get(0); - AbstractNode output = reaction.getProducts().get(0); - - for (NodeOperator operator : reaction.getOperators()) { - if (operator.isReactantOperator()) { - input = operator; - } else if (operator.isProductOperator()) { - output = operator; - } - } - PolylineData line = new PolylineData(); - - input.getLine().trimEnd(ReactionCellDesignerConverter.RECT_SIZE / 2 - 1); - line.addPoint(pt.copyPoint(input.getLine().getEndPoint())); - - if (output instanceof NodeOperator) { - output.getLine().trimEnd(ReactionCellDesignerConverter.RECT_SIZE / 2 - 1); - line.addPoint(pt.copyPoint(output.getLine().getEndPoint())); - } else { - output.getLine().trimBegin(ReactionCellDesignerConverter.RECT_SIZE / 2 - 1); - line.addPoint(pt.copyPoint(output.getLine().getBeginPoint())); - } - line.setType(input.getLine().getType()); - line.setColor(input.getLine().getColor()); - reaction.setLine(line); - } - /** - * Creates {@link Reactant} from gpml edge. + * Creates {@link Reactant} from GPML edge. * * @param data * ... @@ -777,13 +744,13 @@ public class ModelContructor { } /** - * Creates {@link Product} from gpml edge. + * Creates {@link Product} from GPML edge. * * @param data * ... * @param e * edge - * @return {@link Product} from gpml edge + * @return {@link Product} from GPML edge */ protected Product createProductFromEdge(Data data, Edge e) { String id = null; @@ -793,7 +760,7 @@ public class ModelContructor { id = e.getEnd(); } if (id == null) { - throw new InvalidStateException("This product is invalid"); + throw new InvalidStateException("[" + e.getGraphId() + "]\tThis product is invalid"); } Product pro = new Product(); pro.setElement(data.id2alias.get(id)); @@ -896,7 +863,7 @@ public class ModelContructor { model.setWidth(graph.getBoardWidth()); model.setHeight(graph.getBoardHeight()); - addComplexSpecies(model, graph, data); + addComplex(model, graph, data); addElement(model, graph, data); putSpeciesIntoComplexes(graph, data); @@ -924,31 +891,68 @@ public class ModelContructor { notes = StringEscapeUtils.unescapeHtml4(notes); } model.setNotes(notes); - StringBuilder references = new StringBuilder(""); - for (String string : graph.getBiopaxReferences()) { - references.append(string + ", "); - } - if (references.length() > 0) { - logger.warn("[Biopax, " + references.toString() + "]\tModel annotations are not supported."); - } + model.addMiriamData(new BiopaxFactory().getMiriamData(graph.getBiopaxData(), graph.getBiopaxReferences())); data.layer.addLayerLines(createLines(graph)); if (!data.layer.isEmpty()) { model.getLayers().add(data.layer); } + if (!data.shapeLabelLayer.isEmpty()) { + model.getLayers().add(data.shapeLabelLayer); + } assignNamesToComplexes(model); assignNamesToCompartments(model); putAliasesIntoCompartments(model); + putMissingZIndexes(model.getDrawables()); + return model; } catch (UnknownChildClassException e) { throw new ConverterException(e); } } + private void putMissingZIndexes(Collection<Drawable> bioEntities) { + int maxZIndex = 0; + for (Drawable bioEntity : bioEntities) { + if (bioEntity.getZ() != null) { + maxZIndex = Math.max(maxZIndex, bioEntity.getZ()); + } + } + + for (Drawable bioEntity : bioEntities) { + if (bioEntity.getZ() == null) { + Integer index = null; + if (bioEntity instanceof Complex) { + index = getMinZIndex(((Complex) bioEntity).getAllChildren()); + } + + if (index == null) { + index = ++maxZIndex; + } else { + index--; + } + bioEntity.setZ(index); + } + } + + } + + private Integer getMinZIndex(List<Species> allChildren) { + Integer result = null; + for (Species species : allChildren) { + if (species.getZ() != null) { + if (result == null) + result = species.getZ(); + result = Math.min(result, species.getZ()); + } + } + return result; + } + /** * Method that put {@link Species aliases} that are not assigned into any * {@link Compartment} into a proper compartment. @@ -1024,18 +1028,20 @@ public class ModelContructor { if (alias instanceof Complex) { if (alias.getName() == null || (alias.getName().isEmpty())) { for (Layer layer : model.getLayers()) { - LayerText toRemove = null; - for (LayerText lt : layer.getTexts()) { - if (alias.contains(lt)) { - alias.setName(lt.getNotes()); - toRemove = lt; + if (layer.getName().equals("defaultLayer")) { + LayerText toRemove = null; + for (LayerText lt : layer.getTexts()) { + if (alias.contains(lt)) { + alias.setName(lt.getNotes()); + toRemove = lt; + break; + } + } + if (toRemove != null) { + layer.removeLayerText(toRemove); break; } } - if (toRemove != null) { - layer.removeLayerText(toRemove); - break; - } } } } @@ -1043,21 +1049,22 @@ public class ModelContructor { } /** - * Tries to find a name to assign to compartments if comparments don't contain + * Tries to find a name to assign to compartments if compartments don't contain * them. * * @param model * model where compartments are placed */ private void assignNamesToCompartments(Model model) { - for (Element alias : model.getElements()) { - if (alias instanceof Compartment) { - if (alias.getName() == null || alias.getName().isEmpty()) { - for (Layer layer : model.getLayers()) { + for (Compartment compartment : model.getCompartments()) { + if (compartment.getName() == null || compartment.getName().isEmpty()) { + for (Layer layer : model.getLayers()) { + if (layer.getName().equals("defaultLayer")) { LayerText toRemove = null; for (LayerText lt : layer.getTexts()) { - if (alias.contains(lt)) { - alias.setName(lt.getNotes()); + if (compartment.contains(lt)) { + compartment.setName(lt.getNotes()); + compartment.setNamePoint(new Point2D.Double(lt.getX(), lt.getY())); toRemove = lt; break; } @@ -1141,6 +1148,11 @@ public class ModelContructor { */ private Layer layer; + /** + * Default layer. + */ + private Layer shapeLabelLayer; + /** * Default constructor. */ @@ -1150,6 +1162,10 @@ public class ModelContructor { layer.setVisible(true); layer.setLayerId("1"); layer.setName("defaultLayer"); + shapeLabelLayer = new Layer(); + shapeLabelLayer.setVisible(true); + shapeLabelLayer.setLayerId("2"); + shapeLabelLayer.setName("shapeLabelLayer"); } } } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java index af1a751a67e6e49fa5fd1f2dca63e3f845258874..ffc86624258d3625c019e9c343faf3f08215cce0 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java @@ -1,5 +1,6 @@ package lcsb.mapviewer.wikipathway.XML; +import java.awt.Color; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.util.HashSet; @@ -9,6 +10,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import lcsb.mapviewer.common.exception.InvalidArgumentException; +import lcsb.mapviewer.common.geometry.ColorParser; import lcsb.mapviewer.converter.ConverterException; import lcsb.mapviewer.model.graphics.PolylineData; import lcsb.mapviewer.model.map.BioEntity; @@ -66,6 +68,8 @@ public class ModelToGPML { */ private BiopaxParser biopaxParser = new BiopaxParser(); + private ColorParser colorParser = new ColorParser(); + /** * Returns new unique identifier for the model. * @@ -198,7 +202,7 @@ public class ModelToGPML { * This function calculates PolylineData based on ReactionNode. * * @param rn - * rection node for which polyline is calculated + * reaction node for which polyline is calculated * @param mainLine * main line to which polyline is attached * @return polyline for {@link ReactionNode} @@ -265,11 +269,11 @@ public class ModelToGPML { /** * This function transform Compartments into Shapes (Oval or Rectangle) from - * PathVisio. LineThickness=3.0 and Color=ffcc66. It can be easily changed. + * PathVisio. * * @param model * model where compartments are placed - * @return String that encodes all compartments in gpml format + * @return String that encodes all compartments in GPML format */ private String getComparments(Model model) { StringBuilder comparments = new StringBuilder(""); @@ -288,9 +292,17 @@ public class ModelToGPML { comparments.append(" <Attribute Key=\"org.pathvisio.CellularComponentProperty\" Value=\"Cell\" />\n"); comparments.append(" <Attribute Key=\"org.pathvisio.DoubleLineProperty\" Value=\"Double\" />\n"); comparments.append( - " <Graphics CenterX=\"" + x + "\" CenterY=\"" + y + "\" Width=\"" + w + "\" Height=\"" + h - + "\" ZOrder=\"" + ca.getZ() + "\" FontSize=\"20\" Valign=\"Bottom\" ShapeType=\"" + shape - + "\" LineThickness=\"3.0\" Color=\"ffcc66\" Rotation=\"0.0\" />\n"); + " <Graphics CenterX=\"" + x + "\" " + + "CenterY=\"" + y + "\" " + + "Width=\"" + w + "\" " + + "Height=\"" + h + "\" " + + "ZOrder=\"" + ca.getZ() + "\" " + + "FontSize=\"" + ca.getFontSize() + "\" " + + "Valign=\"Bottom\" " + + "ShapeType=\"" + shape + "\" " + + "LineThickness=\"3.0\" " + + "Color=\"" + colorToString(ca.getFillColor()) + "\" " + + "Rotation=\"0.0\" />\n"); comparments.append(" </Shape>\n"); } return comparments.toString(); @@ -302,7 +314,7 @@ public class ModelToGPML { * model). * * @param rn - * object representing rectanat/product/modifier + * object representing reactant/product/modifier * @param anchId * identifier of the anchor where it will be connected * @param anchors @@ -326,7 +338,10 @@ public class ModelToGPML { interaction.append(" <Interaction GraphId=\"" + getNewId() + "\">\n"); interaction.append(" <Attribute Key=\"org.pathvisio.core.ds\" Value=\"\"/>\n"); interaction.append(" <Attribute Key=\"org.pathvisio.core.id\" Value=\"\"/>\n"); - interaction.append(" <Graphics ConnectorType=\"Segmented\" ZOrder=\"32827\" LineThickness=\"1.0\">\n"); + interaction.append(" <Graphics " + + "ConnectorType=\"Segmented\" " + + "ZOrder=\"" + rn.getReaction().getZ() + "\" " + + "LineThickness=\"" + rn.getLine().getWidth() + "\">\n"); if (rn instanceof Reactant) { for (Point2D p2d : line.getPoints()) { @@ -385,7 +400,7 @@ public class ModelToGPML { } /** - * This function encode SpeciesAliases into DataNodes from .gpml format. Empty + * This function encode SpeciesAliases into DataNodes from GPML format. Empty * complexes are also transformed into DataNodes. * * @param model @@ -398,45 +413,33 @@ public class ModelToGPML { protected String getDataNodes(Model model) throws ConverterException { StringBuilder dataNodes = new StringBuilder(""); - for (Species sa : model.getNotComplexSpeciesList()) { - if (!(sa instanceof Complex)) { - dataNodes.append(" <DataNode TextLabel=\"" + sa.getName() + "\" GraphId=\"" + sa.getElementId() + "\" Type=\"" - + getType(sa) + "\""); - if (sa.getComplex() != null) { - dataNodes.append(" GroupRef=\"" + sa.getComplex().getElementId() + "\""); + for (Species species : model.getNotComplexSpeciesList()) { + if (!(species instanceof Complex)) { + dataNodes.append( + " <DataNode TextLabel=\"" + species.getName() + "\" GraphId=\"" + species.getElementId() + "\" Type=\"" + + getType(species) + "\""); + if (species.getComplex() != null) { + dataNodes.append(" GroupRef=\"" + species.getComplex().getElementId() + "\""); } dataNodes.append(">\n"); - dataNodes.append(" <Comment>" + sa.getNotes() + "</Comment>\n"); - dataNodes.append(biopaxParser.toReferenceXml(sa.getMiriamData())); + dataNodes.append(" <Comment>" + species.getNotes() + "</Comment>\n"); + dataNodes.append(biopaxParser.toReferenceXml(species.getMiriamData())); - String red = Integer.toHexString(sa.getFillColor().getRed()); - String green = Integer.toHexString(sa.getFillColor().getGreen()); - String blue = Integer.toHexString(sa.getFillColor().getBlue()); - if (red.length() == 1) { - red = "0" + red; - } - if (green.length() == 1) { - green = "0" + green; - } - if (blue.length() == 1) { - blue = "0" + blue; - } - String color = red + green + blue; - Rectangle2D rec = sa.getBorder(); + Rectangle2D rec = species.getBorder(); dataNodes.append( - " <Graphics CenterX=\"" + rec.getCenterX() + - "\" CenterY=\"" + rec.getCenterY() + - "\" Width=\"" + rec.getWidth() + - "\" Height=\"" + rec.getHeight() + - "\" ZOrder=\"" + sa.getZ() + - "\" FontSize=\"10\"" + - " Valign=\"Middle\" " - + "Color=\"" + "0000ff" - + "\" FillColor=\"" + color + "\"/>\n"); - - dataNodes.append(referenceParser.toXml(sa.getMiriamData())); + " <Graphics CenterX=\"" + rec.getCenterX() + "\" " + + "CenterY=\"" + rec.getCenterY() + "\" " + + "Width=\"" + rec.getWidth() + "\" " + + "Height=\"" + rec.getHeight() + "\" " + + "ZOrder=\"" + species.getZ() + "\" " + + "FontSize=\"" + species.getFontSize() + "\" " + + "Valign=\"Middle\" " + + "Color=\"" + colorToString(species.getFontColor()) + "\" " + + "FillColor=\"" + colorToString(species.getFillColor()) + "\"/>\n"); + + dataNodes.append(referenceParser.toXml(species.getMiriamData())); dataNodes.append(" </DataNode>\n"); } } @@ -455,16 +458,16 @@ public class ModelToGPML { Rectangle2D rec = ca.getBorder(); dataNodes.append( - " <Graphics CenterX=\"" + rec.getCenterX() + - "\" CenterY=\"" + rec.getCenterY() + - "\" Width=\"" + rec.getWidth() + - "\" Height=\"" + rec.getHeight() + - "\" ZOrder=\"" + ca.getZ() + - "\" FontSize=\"10\"" + - " Valign=\"Middle\" " + - "Color=\"0000ff\" " + - "FillColor=\"ffffcc\"" + - " LineStyle=\"Broken\"/>\n"); + " <Graphics CenterX=\"" + rec.getCenterX() + "\" " + + "CenterY=\"" + rec.getCenterY() + "\" " + + "Width=\"" + rec.getWidth() + "\" " + + "Height=\"" + rec.getHeight() + "\" " + + "ZOrder=\"" + ca.getZ() + "\" " + + "FontSize=\"" + ca.getFontSize() + "\" " + + "Valign=\"Middle\" " + + "Color=\"" + colorToString(ca.getFontColor()) + "\" " + + "FillColor=\"" + colorToString(ca.getFillColor()) + "\" " + + "LineStyle=\"Broken\"/>\n"); dataNodes.append(referenceParser.toXml(ca.getMiriamData())); dataNodes.append(" </DataNode>\n"); @@ -475,11 +478,11 @@ public class ModelToGPML { } /** - * This function encode ComplexAliases into Groups from .gpml format. + * This function encode ComplexAliases into Groups from GPML format. * * @param model * model where aliases are placed - * @return string representing groups in gpml format + * @return string representing groups in GPML format */ protected String getGroups(Model model) { StringBuilder groups = new StringBuilder(""); @@ -497,11 +500,11 @@ public class ModelToGPML { } /** - * This function encode Reactions into Interactions from .gpml format. + * This function encode Reactions into Interactions from GPML format. * * @param model * model where reactions are placed - * @return string with interactions in gpml format + * @return string with interactions in GPML format * @throws ConverterException * thrown when there is a problem with conversion */ @@ -514,11 +517,10 @@ public class ModelToGPML { interactions.append(" <Interaction GraphId=\"" + reaction.getIdReaction() + "\">\n"); interactions.append(biopaxParser.toReferenceXml(reaction.getMiriamData())); - // interactions.append(" <Attribute Key=\"org.pathvisio.core.ds\" - // Value=\"\"/>\n"); - // interactions.append(" <Attribute Key=\"org.pathvisio.core.id\" - // Value=\"\"/>\n"); - interactions.append(" <Graphics ConnectorType=\"Segmented\" ZOrder=\"32827\" LineThickness=\"1.0\">\n"); + interactions.append(" <Graphics " + + "ConnectorType=\"Segmented\" " + + "ZOrder=\"" + reaction.getZ() + "\" " + + "LineThickness=\"" + reaction.getLine().getWidth() + "\">\n"); /** Start and End **/ Reactant start = reaction.getReactants().get(0); @@ -575,11 +577,11 @@ public class ModelToGPML { } /** - * This function returns Model in .gpml format. + * This function returns Model in GPML format. * * @param model * model to transform - * @return string in gpml format representing model + * @return string in GPML format representing model * @throws ConverterException * thrown when there is a problem with conversion */ @@ -608,4 +610,8 @@ public class ModelToGPML { return gpml.toString(); } + + private String colorToString(Color color) { + return colorParser.colorToHtml(color).substring(1); + } } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReactionLayoutFinder.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReactionLayoutFinder.java new file mode 100644 index 0000000000000000000000000000000000000000..0e07207c462112f8465d11f1e860930874373d13 --- /dev/null +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReactionLayoutFinder.java @@ -0,0 +1,315 @@ +package lcsb.mapviewer.wikipathway.XML; + +import java.awt.geom.Line2D; +import java.awt.geom.Point2D; +import java.util.*; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import lcsb.mapviewer.common.Configuration; +import lcsb.mapviewer.common.Pair; +import lcsb.mapviewer.common.comparator.DoubleComparator; +import lcsb.mapviewer.common.exception.InvalidArgumentException; +import lcsb.mapviewer.common.geometry.LineTransformation; +import lcsb.mapviewer.common.geometry.PointTransformation; +import lcsb.mapviewer.converter.model.celldesigner.geometry.ReactionCellDesignerConverter; +import lcsb.mapviewer.converter.model.celldesigner.geometry.helper.PolylineDataFactory; +import lcsb.mapviewer.model.graphics.PolylineData; +import lcsb.mapviewer.model.map.reaction.*; +import lcsb.mapviewer.wikipathway.model.Edge; +import lcsb.mapviewer.wikipathway.model.Interaction; +import lcsb.mapviewer.wikipathway.utils.Geo; + +class ReactionLayoutFinder { + + @SuppressWarnings("unused") + private Logger logger = LogManager.getLogger(); + + private LineTransformation lt = new LineTransformation(); + private PointTransformation pt = new PointTransformation(); + + private Interaction interaction; + + /** + * Return coordinates where all {@link Reactant} should end, all + * {@link Modifier} should end, and all {@link Product} should start. + * + * @param interaction + * GPML {@link Interaction} + * @return map consisted of three entries for classes: {@link Product}, + * {@link Reactant}, {@link Modifier} + */ + public Map<Class<?>, Point2D> getNodeStartPoints(Interaction interaction) { + this.interaction = interaction; + List<Pair<Class<?>, Point2D>> possiblePoints = getPointsInOrder(interaction); + Point2D modifierPoint = getModifierPoint(possiblePoints); + Point2D reactantPoint = getReactantPoint(possiblePoints, modifierPoint); + Point2D productPoint = getProductPoint(possiblePoints, modifierPoint); + + Map<Class<?>, Point2D> result = new HashMap<>(); + result.put(Reactant.class, reactantPoint); + result.put(Product.class, productPoint); + result.put(Modifier.class, modifierPoint); + + return result; + } + + public Map<Class<?>, PolylineData> getNodeLines(Interaction interaction) { + Map<Class<?>, Point2D> points = getNodeStartPoints(interaction); + + + Map<Class<?>, PolylineData> result = new HashMap<>(); + PolylineData reactantLine = getSubline(interaction.getLine(), interaction.getLine().getBeginPoint(), + points.get(Reactant.class)); + PolylineData inputReactionLine = getSubline(interaction.getLine(), points.get(Reactant.class), + points.get(Modifier.class)); + inputReactionLine.trimEnd(ReactionCellDesignerConverter.RECT_SIZE / 2); + + PolylineData outputReactionLine = getSubline(interaction.getLine(), + points.get(Modifier.class), points.get(Product.class)); + + outputReactionLine.trimBegin(ReactionCellDesignerConverter.RECT_SIZE / 2); + PolylineData productLine = getSubline(interaction.getLine(), + points.get(Product.class), interaction.getLine().getEndPoint()); + PolylineData modifierLine = new PolylineData(pt.copyPoint(inputReactionLine.getEndPoint()), + pt.copyPoint(outputReactionLine.getBeginPoint())); + modifierLine.setColor(interaction.getColor()); + modifierLine.setWidth(productLine.getWidth()); + + result.put(Reactant.class, reactantLine); + result.put(Product.class, productLine); + result.put(Modifier.class, modifierLine); + result.put(AndOperator.class, inputReactionLine); + result.put(SplitOperator.class, outputReactionLine); + + return result; + } + + private List<Pair<Class<?>, Point2D>> getPointsInOrder(Interaction interaction) { + PolylineData pd = interaction.getLine(); + List<Pair<Class<?>, Point2D>> possiblePoints = new ArrayList<>(); + for (Edge e : interaction.getReactants()) { + if (pointOnPolyline(pd, e.getLine().getEndPoint())) { + possiblePoints.add(new Pair<>(Reactant.class, e.getLine().getEndPoint())); + } else if (pointOnPolyline(pd, e.getLine().getBeginPoint())) { + possiblePoints.add(new Pair<>(Reactant.class, e.getLine().getBeginPoint())); + } + } + for (Edge e : interaction.getProducts()) { + if (pointOnPolyline(pd, e.getLine().getEndPoint())) { + possiblePoints.add(new Pair<>(Product.class, e.getLine().getEndPoint())); + } else if (pointOnPolyline(pd, e.getLine().getBeginPoint())) { + possiblePoints.add(new Pair<>(Product.class, e.getLine().getBeginPoint())); + } + } + for (Edge e : interaction.getModifiers()) { + if (pointOnPolyline(pd, e.getLine().getEndPoint())) { + possiblePoints.add(new Pair<>(Modifier.class, e.getLine().getEndPoint())); + } else if (pointOnPolyline(pd, e.getLine().getBeginPoint())) { + possiblePoints.add(new Pair<>(Modifier.class, e.getLine().getBeginPoint())); + } + } + Comparator<Pair<Class<?>, Point2D>> comparator = new Comparator<Pair<Class<?>, Point2D>>() { + + @Override + public int compare(Pair<Class<?>, Point2D> o1, Pair<Class<?>, Point2D> o2) { + double dist1 = distanceFromPolylineStart(pd, o1.getRight()); + double dist2 = distanceFromPolylineStart(pd, o2.getRight()); + return new DoubleComparator(Configuration.EPSILON).compare(dist1, dist2); + } + }; + + Collections.sort(possiblePoints, comparator); + return possiblePoints; + } + + private Point2D getProductPoint(List<Pair<Class<?>, Point2D>> possiblePoints, Point2D modifierPoint) { + Point2D result = null; + for (Pair<Class<?>, Point2D> pair : possiblePoints) { + if (pair.getLeft().equals(Product.class)) { + if (distanceFromPolylineStart(interaction.getLine(), + modifierPoint) < distanceFromPolylineStart(interaction.getLine(), pair.getRight())) { + result = pair.getRight(); + break; + } + } + } + if (result == null) { + for (Point2D point : interaction.getLine().getPoints()) { + if (distanceFromPolylineStart(interaction.getLine(), + modifierPoint) < distanceFromPolylineStart(interaction.getLine(), point)) { + double x = modifierPoint.getX() + (point.getX() - modifierPoint.getX()) / 2; + double y = modifierPoint.getY() + (point.getY() - modifierPoint.getY()) / 2; + result = new Point2D.Double(x, y); + break; + } + } + } + return result; + } + + private Point2D getReactantPoint(List<Pair<Class<?>, Point2D>> possiblePoints, Point2D modifierPoint) { + Point2D result = null; + for (Pair<Class<?>, Point2D> pair : possiblePoints) { + if (pair.getLeft().equals(Reactant.class)) { + if (distanceFromPolylineStart(interaction.getLine(), + modifierPoint) > distanceFromPolylineStart(interaction.getLine(), pair.getRight())) { + result = pair.getRight(); + } + } + } + if (result == null) { + for (Point2D point : interaction.getLine().getPoints()) { + if (distanceFromPolylineStart(interaction.getLine(), + modifierPoint) > distanceFromPolylineStart(interaction.getLine(), point)) { + double x = modifierPoint.getX() + (point.getX() - modifierPoint.getX()) / 2; + double y = modifierPoint.getY() + (point.getY() - modifierPoint.getY()) / 2; + result = new Point2D.Double(x, y); + } + } + } + return result; + } + + private Point2D getModifierPoint(List<Pair<Class<?>, Point2D>> points) { + List<Pair<Class<?>, Point2D>> possiblePoints = new ArrayList<>(points); + int productPoints = 0; + int reactantPoints = 0; + for (Pair<Class<?>, Point2D> pair : possiblePoints) { + if (pair.getLeft().equals(Product.class)) { + productPoints++; + } else if (pair.getLeft().equals(Reactant.class)) { + reactantPoints++; + } + } + int countedReactants = 0; + int countedProducts = 0; + int score = Integer.MIN_VALUE; + Point2D point = null; + for (Pair<Class<?>, Point2D> pair : possiblePoints) { + if (pair.getLeft().equals(Product.class)) { + countedProducts++; + } else if (pair.getLeft().equals(Reactant.class)) { + countedReactants++; + } else if (pair.getLeft().equals(Modifier.class)) { + int currentScore = countedReactants + (productPoints - countedProducts); + if (point == null || score < currentScore) { + score = currentScore; + point = pair.getRight(); + } + } + } + + if (point == null) { + possiblePoints.add(0, new Pair<Class<?>, Point2D>(null, interaction.getLine().getBeginPoint())); + possiblePoints.add(new Pair<Class<?>, Point2D>(null, interaction.getLine().getEndPoint())); + countedReactants = 0; + countedProducts = 0; + + Point2D previousPoint = null; + for (Pair<Class<?>, Point2D> pair : possiblePoints) { + if (previousPoint != null) { + int currentScore = countedReactants + (productPoints - countedProducts); + if (point == null || score < currentScore) { + score = currentScore; + if (reactantPoints == 0) { // shift to most right possible line when there are no other reactants + point = getRightCenterPoint(interaction.getLine(), previousPoint, pair.getRight()); + } else if (productPoints == 0) { + point = getLeftCenterPoint(interaction.getLine(), previousPoint, pair.getRight()); + } else { + point = getCenterPoint(interaction.getLine(), previousPoint, pair.getRight()); + } + } + } + if (pair.getLeft() == Product.class) { + countedProducts++; + } else if (pair.getLeft() == Reactant.class) { + countedReactants++; + } + previousPoint = pair.getRight(); + } + } + return point; + } + + private Point2D getCenterPoint(PolylineData originalPolylineData, Point2D startPoint, Point2D endPoint) { + PolylineData pd = getSubline(originalPolylineData, startPoint, endPoint); + return getCenterPoint(pd); + } + + private Point2D getLeftCenterPoint(PolylineData originalPolylineData, Point2D startPoint, Point2D endPoint) { + PolylineData pd = getSubline(originalPolylineData, startPoint, endPoint); + double x = pd.getPoints().get(0).getX() + (pd.getPoints().get(1).getX() - pd.getPoints().get(0).getX()) / 2; + double y = pd.getPoints().get(0).getY() + (pd.getPoints().get(1).getY() - pd.getPoints().get(0).getY()) / 2; + return new Point2D.Double(x, y); + } + + private Point2D getRightCenterPoint(PolylineData originalPolylineData, Point2D startPoint, Point2D endPoint) { + PolylineData pd = getSubline(originalPolylineData, startPoint, endPoint); + int points = pd.getPoints().size(); + double x = pd.getPoints().get(points - 2).getX() + + (pd.getPoints().get(points - 1).getX() - pd.getPoints().get(points - 2).getX()) / 2; + double y = pd.getPoints().get(points - 2).getY() + + (pd.getPoints().get(points - 1).getY() - pd.getPoints().get(points - 2).getY()) / 2; + return new Point2D.Double(x, y); + } + + private PolylineData getSubline(PolylineData originalPolylineData, Point2D startPoint, Point2D endPoint) { + int start = 0; + int end = originalPolylineData.getPoints().size() - 1; + for (int i = 0; i < originalPolylineData.getPoints().size(); i++) { + if (distanceFromPolylineStart(originalPolylineData, startPoint) > distanceFromPolylineStart(originalPolylineData, + originalPolylineData.getPoints().get(i))) { + start = i; + } + if (distanceFromPolylineStart(originalPolylineData, endPoint) < distanceFromPolylineStart(originalPolylineData, + originalPolylineData.getPoints().get(i))) { + end = Math.min(end, i); + } + } + PolylineData result = originalPolylineData.getSubline(start, end + 1); + result.setStartPoint(pt.copyPoint(startPoint)); + result.setEndPoint(pt.copyPoint(endPoint)); + return PolylineDataFactory.removeCollinearPoints(result); + } + + private Point2D getCenterPoint(PolylineData pd) { + List<Line2D> lines = pd.getLines(); + double lenght = 0.0; + for (Line2D line : lines) { + lenght += Geo.lineLen(line); + } + double tmp = 0.0; + for (Line2D line : lines) { + if (tmp + Geo.lineLen(line) > lenght / 2) { + double x = line.getX1() + (line.getX2() - line.getX1()) / 2; + double y = line.getY1() + (line.getY2() - line.getY1()) / 2; + return new Point2D.Double(x, y); + } else { + tmp += Geo.lineLen(line); + } + } + return pt.copyPoint(pd.getEndPoint()); + } + + double distanceFromPolylineStart(PolylineData line, Point2D point) { + double distance = 0; + for (Line2D l : line.getLines()) { + if (lt.distBetweenPointAndLineSegment(l, point) <= Configuration.EPSILON) { + return distance + point.distance(l.getP1()); + } + distance += l.getP1().distance(l.getP2()); + } + throw new InvalidArgumentException("Point doesn't lay on the line"); + } + + private boolean pointOnPolyline(PolylineData line, Point2D point) { + for (Line2D l : line.getLines()) { + if (lt.distBetweenPointAndLineSegment(l, point) <= Configuration.EPSILON) { + return true; + } + } + return false; + } +} diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReferenceParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReferenceParser.java index f2efd4e5da3c5707f0cafbb68e8fcc1232ae4a37..3439c7fd94af2f96f509d2be4fb996f1ecac68de 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReferenceParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReferenceParser.java @@ -15,7 +15,7 @@ import lcsb.mapviewer.model.map.*; import lcsb.mapviewer.wikipathway.model.ReferenceMapping; /** - * Parser used to extract {@link MiriamData refernces} in miriam format from + * Parser used to extract {@link MiriamData references} in miriam format from * GPML data. * * @author Piotr Gawron @@ -35,7 +35,7 @@ public class ReferenceParser extends ElementGpmlParser<MiriamData> { * - resource identifier * @param db * -database type - * @return {@link MiriamData} object referenceing to the resource + * @return {@link MiriamData} object referencing to the resource */ protected MiriamData createMiriamData(String id, String db) { if (db == null || db.equals("")) { @@ -67,6 +67,26 @@ public class ReferenceParser extends ElementGpmlParser<MiriamData> { } } + public MiriamData hrefToMiriamData(String href) { + if (href == null) { + return null; + } + if (href.startsWith("https://omim.org/entry/")) { + return new MiriamData(MiriamType.OMIM, href.replaceAll("https://omim.org/entry/", "")); + } + if (href.startsWith("http://omim.org/entry/")) { + return new MiriamData(MiriamType.OMIM, href.replaceAll("http://omim.org/entry/", "")); + } + if (href.startsWith("https://omim.org/")) { + return new MiriamData(MiriamType.OMIM, href.replaceAll("https://omim.org/", "")); + } + if (href.startsWith("http://omim.org/")) { + return new MiriamData(MiriamType.OMIM, href.replaceAll("http://omim.org/", "")); + } + logger.warn("Don't know how to process href: " + href); + return null; + } + @Override public MiriamData parse(Element node) { String id = null; diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ShapeParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ShapeParser.java index 532fdd97c23c7eb379bf3e8c90d68b11bdd5925b..cd1834340f271c4eb07094a2c2b4de658193e6fe 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ShapeParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ShapeParser.java @@ -108,6 +108,7 @@ public class ShapeParser extends GraphicalPathwayElementParser<Shape> { switch (value) { case ("Double"): shape.setLineType(LineType.DOUBLE); + shape.setCompartment(true); break; default: logger.warn(shape.getWarningPrefix() + "Unknown line type: " + value); diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/DataNode.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/DataNode.java index 480dfef4fec3c4374d8d183ff5c67948b9e003bb..e3262048f1d0cc409965b29382c4f296152de8ff 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/DataNode.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/DataNode.java @@ -7,7 +7,7 @@ import lcsb.mapviewer.model.graphics.LineType; import lcsb.mapviewer.model.map.MiriamData; /** - * Class used to store data from DataNode from .gpml. + * Class used to store data from DataNode from GPML. * * @author Jan Badura * diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Direction.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Direction.java index 2fddb3e568501e598d8f53504740de1a984b4ef3..f808f3ad8e5a81b2c7a96c3ef064bc7ebbef6ed2 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Direction.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Direction.java @@ -27,7 +27,13 @@ public enum Direction { /** * West. */ - WEST(Axis.EAST_WEST); + WEST(Axis.EAST_WEST), + + /** + * None. + */ + NONE(null), + ; /** * Defines axis in which direction lies (either {@link Axis#NORTH_SOUTH} or @@ -36,7 +42,7 @@ public enum Direction { private Axis axis; /** - * Default cosntructor. + * Default constructor. * * @param axis * {@link #axis} @@ -59,7 +65,11 @@ public enum Direction { * @return next direction (by 90 degrees) in clockwise order */ public Direction nextClockwiseDirection() { - return values()[(this.ordinal() + 1) % values().length]; + Direction result = values()[(this.ordinal() + 1) % values().length]; + if (result == NONE) { + result = values()[(this.ordinal() + 2) % values().length]; + } + return result; } /** diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Edge.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Edge.java index 7baa8a54aaee6be32cf4da62743596f5147b0444..7b9d4d2f11d897d61265afce38ae96254c1bf4f0 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Edge.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Edge.java @@ -29,7 +29,7 @@ public class Edge implements Serializable { private static final long serialVersionUID = 1L; /** - * Epsilon valu used for comparison of doubles. + * Epsilon value used for comparison of doubles. */ private static final Double EPSILON = 1e-6; @@ -39,7 +39,7 @@ public class Edge implements Serializable { private final transient Logger logger = LogManager.getLogger(Edge.class); /** - * Identifier in gpml model. + * Identifier in GPML model. */ private String graphId; @@ -69,9 +69,11 @@ public class Edge implements Serializable { private PolylineData line = new PolylineData(); /** - * Gpml interaction type (arrow). + * GPML interaction type (arrow). */ private GpmlInteractionType type = GpmlInteractionType.LINE; + + private boolean reversibleReaction = false; /** * References for given edge. @@ -89,7 +91,7 @@ public class Edge implements Serializable { private List<String> comments = new ArrayList<>(); /** - * List of identifiers used by biopax nodes that are inside gpml. These biopax + * List of identifiers used by BioPax nodes that are inside GPML. These BioPax * nodes contain annotations. */ private List<String> biopaxReferences = new ArrayList<String>(); @@ -124,6 +126,7 @@ public class Edge implements Serializable { this.comments.addAll(original.getComments()); this.biopaxReferences.addAll(original.getBiopaxReferences()); this.zOrder = original.getzOrder(); + this.reversibleReaction = original.isReversibleReaction(); } /** @@ -467,4 +470,12 @@ public class Edge implements Serializable { this.groupRef = groupRef; } + public boolean isReversibleReaction() { + return reversibleReaction; + } + + public void setReversibleReaction(boolean reversibleReaction) { + this.reversibleReaction = reversibleReaction; + } + } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Graph.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Graph.java index e789c9debc84a97275a71df7007dacbbca90556d..69efb26c026e0bc9b0e100bb524689d2db250303 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Graph.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Graph.java @@ -45,7 +45,7 @@ public class Graph implements Serializable { private double boardHeight; /** - * Information about biopax data in the gpml file. + * Information about BioPax data in the GPML file. */ private BiopaxData biopaxData; @@ -171,7 +171,11 @@ public class Graph implements Serializable { dataNodes.put(node.getGraphId(), node); nodes.put(node.getGraphId(), node); if (node.getGroupRef() != null && !node.getGroupRef().equals("")) { - groupsByGroupId.get(node.getGroupRef()).addNode(node); + if (groupsByGroupId.get(node.getGroupRef()) == null) { + logger.warn(node.getWarningPrefix() + "Missing group: " + node.getGroupRef()); + } else { + groupsByGroupId.get(node.getGroupRef()).addNode(node); + } } } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/GraphicalPathwayElement.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/GraphicalPathwayElement.java index 2bb2c2bd468fb48c4e5d618bd6a9d98490b4f601..76174f80a8b0b4023b599d6b07d7b149671e4ee0 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/GraphicalPathwayElement.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/GraphicalPathwayElement.java @@ -10,7 +10,7 @@ import lcsb.mapviewer.common.geometry.TextAlignment; import lcsb.mapviewer.model.graphics.LineType; /** - * Class with common data for all Gpml elements that have a graphical + * Class with common data for all GPML elements that have a graphical * representation on the map. * * @author Piotr Gawron diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Interaction.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Interaction.java index 563536b9f0ed99fb1c720797903e603b1331bad6..0c70c936581c3746772a858415d81b6287fd3918 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Interaction.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Interaction.java @@ -1,20 +1,23 @@ package lcsb.mapviewer.wikipathway.model; -import java.awt.*; +import java.awt.Color; import java.io.Serializable; import java.util.*; -import java.util.List; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import lcsb.mapviewer.model.graphics.PolylineData; import lcsb.mapviewer.model.map.MiriamData; /** - * Class used to store data from Interaction from .gpml. + * Class used to store data from Interaction from GPML. * * @author Jan Badura * */ public class Interaction implements Serializable { + static Logger logger = LogManager.getLogger(); /** * @@ -22,7 +25,7 @@ public class Interaction implements Serializable { private static final long serialVersionUID = 1L; /** - * Identifier in gpml model. + * Identifier in GPML model. */ private String graphId; @@ -67,28 +70,30 @@ public class Interaction implements Serializable { /** * List of edges representing reactants in interaction. */ - private Set<Edge> reactants = new HashSet<Edge>(); + private Set<Edge> reactants = new HashSet<>(); /** * List of edges representing products in interaction. */ - private Set<Edge> products = new HashSet<Edge>(); + private Set<Edge> products = new HashSet<>(); /** * List of edges representing modifiers in interaction. */ - private Set<Edge> modifiers = new HashSet<Edge>(); + private Set<Edge> modifiers = new HashSet<>(); /** - * Identifiers of biopax references. + * Identifiers of BioPax references. */ - private Set<String> biopaxReferences = new HashSet<String>(); + private Set<String> biopaxReferences = new HashSet<>(); /** * References for given edge. */ private List<MiriamData> references = new ArrayList<>(); + private boolean reversible = false; + /** * Default constructor. * @@ -108,13 +113,14 @@ public class Interaction implements Serializable { setColor(edge.getColor()); this.comments.addAll(edge.getComments()); biopaxReferences.addAll(edge.getBiopaxReferences()); + reversible = edge.isReversibleReaction(); } /** * Empty constructor that should be used only by serialization tools and * subclasses. */ - protected Interaction() { + Interaction() { } /** @@ -385,4 +391,12 @@ public class Interaction implements Serializable { this.zOrder = zOrder; } + public boolean isReversible() { + return reversible; + } + + public void setReversible(boolean reversible) { + this.reversible = reversible; + } + } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Label.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Label.java index d6ba71d23cc78adc7652af090d386ecd27289168..9a59e192093576db4004662ebea56770d1d1d840 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Label.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Label.java @@ -1,13 +1,23 @@ package lcsb.mapviewer.wikipathway.model; +import java.util.HashSet; +import java.util.Set; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import lcsb.mapviewer.model.map.MiriamData; + /** - * Class used to store data from Label from .gpml. + * Class used to store data from Label from GPML. * * @author Jan Badura * */ public class Label extends GraphicalPathwayElement { + static Logger logger = LogManager.getLogger(); + /** * */ @@ -38,6 +48,8 @@ public class Label extends GraphicalPathwayElement { */ private String groupRef; + private Set<MiriamData> references = new HashSet<>(); + /** * Sometimes {@link Label labels} are connected to reactions. This field */ @@ -169,4 +181,15 @@ public class Label extends GraphicalPathwayElement { this.shape = shape; } + public Set<MiriamData> getReferences() { + return references; + } + + public void setReferences(Set<MiriamData> references) { + this.references = references; + } + + public void addReference(MiriamData md) { + this.references.add(md); + } } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PathwayElement.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PathwayElement.java index 4b0a7263e85e47154e805dfa4fe3d3a9900665e2..ad817852bfa0ba1bc8a4a68043ca8105376c6715 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PathwayElement.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PathwayElement.java @@ -9,7 +9,7 @@ import java.util.List; * Abstract class for pathway elements. It defines common functionalities for * all elements in the model. There are two known subclasses: * <ul> - * <li>{@link GraphicalPathwayElement}, representing elemnts with some graphical + * <li>{@link GraphicalPathwayElement}, representing elements with some graphical * representation</li> * <li>{@link Group}, representing just groups of elements</li> * </ul> @@ -41,7 +41,7 @@ public abstract class PathwayElement implements Serializable { /** * - * Reference to biopax node with references about this element. + * Reference to BioPax node with references about this element. */ private List<String> biopaxReferences = new ArrayList<>(); diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PointData.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PointData.java index a651e4af3e98a96233c4bcca32afe340593631a6..bff65363b8b948998d165a48faf8826744b669a4 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PointData.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PointData.java @@ -7,7 +7,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** - * Class that defines infgomration about point stored in gpml structures. + * Class that defines information about point stored in GPML structures. * * @author Piotr Gawron * @@ -20,7 +20,7 @@ public class PointData implements Serializable { private static final long serialVersionUID = 1L; /** - * Defdault clas logger. + * Default class logger. */ private final transient Logger logger = LogManager.getLogger(PointData.class); @@ -35,7 +35,7 @@ public class PointData implements Serializable { private Double y; /** - * String identifing anchor point on the map. + * String identifying anchor point on the map. */ private String graphRef; @@ -52,7 +52,7 @@ public class PointData implements Serializable { private String relY; /** - * Type of line asociated with line that ends in this point. + * Type of line associated with line that ends in this point. */ private GpmlInteractionType type; @@ -180,8 +180,10 @@ public class PointData implements Serializable { return Direction.SOUTH; } else if (relY.equals("-1.0")) { return Direction.NORTH; + } else if (relX.equals("0.0") && relY.equals("0.0")) { + return Direction.NONE; } else { - logger.warn( + logger.warn("[" + graphRef + "]\t" + "Cannot determine connection direction from values: relX=" + relX + "; relY=" + relY + ". Estimating..."); double xVal = Double.valueOf(relX); double yVal = Double.valueOf(relY); @@ -200,4 +202,10 @@ public class PointData implements Serializable { } } } + + @Override + public String toString() { + return "[" + this.getClass().getSimpleName() + " x=" + x + "; y=" + y + "; graphRef=" + graphRef + "; relX=" + relX + + "; relY=" + relY + "; type=" + type + "]"; + } } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Shape.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Shape.java index 8755fc2ebc6ed28f4916d039bf29f876d3a9a91d..4f5c2a2e490482e2b0ce2017efd8ca1e2abced72 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Shape.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Shape.java @@ -1,7 +1,9 @@ package lcsb.mapviewer.wikipathway.model; +import java.awt.Color; + /** - * Class used to store data from Shape from .gpml. + * Class used to store data from Shape from GPML. * * @author Jan Badura * @@ -66,6 +68,7 @@ public class Shape extends GraphicalPathwayElement { setTextLabel(null); setGroupRef(null); setCompartment(false); + setFillColor(Color.GRAY); } /** diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxData.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxData.java index 48b8c782c244708bcabb4fbed7128bfecaff6d09..60422b26e2b2ba444a15d7e1da3b0c2d4e5f795d 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxData.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxData.java @@ -9,7 +9,7 @@ import org.apache.logging.log4j.Logger; import lcsb.mapviewer.common.exception.InvalidArgumentException; /** - * Element containg all biopax information parsed from gpml file. + * Element containing all BioPax information parsed from GPML file. * * @author Piotr Gawron * @@ -30,12 +30,12 @@ public class BiopaxData implements Serializable { /** * List of {@link BiopaxPublication publications}. */ - private Map<String, BiopaxPublication> publications = new HashMap<String, BiopaxPublication>(); + private Map<String, BiopaxPublication> publications = new HashMap<>(); /** - * List of {@link BiopaxOpenControlledVocabulary biopax vocabulary}. + * List of {@link BiopaxOpenControlledVocabulary BioPax vocabulary}. */ - private List<BiopaxOpenControlledVocabulary> openControlledVocabularies = new ArrayList<BiopaxOpenControlledVocabulary>(); + private List<BiopaxOpenControlledVocabulary> openControlledVocabularies = new ArrayList<>(); /** * @return the publications diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxFactory.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..ac63f06475c24a885664eb3b058fd75b6dd80655 --- /dev/null +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxFactory.java @@ -0,0 +1,66 @@ +package lcsb.mapviewer.wikipathway.model.biopax; + +import java.util.*; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import lcsb.mapviewer.common.exception.InvalidArgumentException; +import lcsb.mapviewer.model.map.*; + +public class BiopaxFactory { + private Logger logger = LogManager.getLogger(); + + /** + * Creates {@link MiriamData annotation} from {@link BiopaxPublication}. + * + * @param publication + * input BioPax structure + * @return {@link MiriamData annotation} + */ + public MiriamData createMiriamData(BiopaxPublication publication) { + if ("PubMed".equals(publication.getDb())) { + if (publication.getId() == null || publication.getId().equals("")) { + return null; + } else { + return new MiriamData(MiriamRelationType.BQ_BIOL_IS_DESCRIBED_BY, MiriamType.PUBMED, publication.getId()); + } + } else { + throw new InvalidArgumentException("Unknown biopax database: " + publication.getDb()); + } + } + + /** + * Returns list of {@link MiriamData} that are referenced in {@link BiopaxData} + * with identifier given in biopaxReference. + * + * @param biopaxData + * {@link BiopaxData} where annotations are stored + * @param biopaxReference + * list of references (to data in {@link BiopaxData}) that we want to + * convert into {@link MiriamData} + * @return list of {@link MiriamData} that are referenced in {@link BiopaxData} + * with identifier given in biopaxReference. + */ + public Collection<MiriamData> getMiriamData(BiopaxData biopaxData, Collection<String> biopaxReference) { + List<MiriamData> result = new ArrayList<>(); + for (String string : biopaxReference) { + if (biopaxData != null) { + BiopaxPublication bp = biopaxData.getPublicationByReference(string); + if (bp != null) { + MiriamData md = createMiriamData(bp); + if (md != null) { + result.add(md); + } else { + logger.warn("[" + string + "]\tBiopax publication is invalid."); + } + } else { + logger.warn("[" + string + "]\tBiopax publication doesn't exist."); + } + } else { + logger.warn("[Biopax, " + string + "]\tInvalid BioPax reference."); + } + } + return result; + } +} diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxPublication.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxPublication.java index 7960830511f434a586757bc65a4637b26ca3b91a..27bb5a00f658bfdf43b261a7c0dacfd64c2c73f7 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxPublication.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxPublication.java @@ -3,7 +3,7 @@ package lcsb.mapviewer.wikipathway.model.biopax; import java.io.Serializable; /** - * Describes biopax node with publication. + * Describes BioPax node with publication. * * @author Piotr Gawron * diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/utils/Geo.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/utils/Geo.java index 71d92007b1965eaa3341a2774a44634f94025a16..dc9fa236c55a08f5f954a2f1fd6462fed6e01e0b 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/utils/Geo.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/utils/Geo.java @@ -15,12 +15,12 @@ import lcsb.mapviewer.model.graphics.PolylineData; public final class Geo { /** - * Max distance betwen point and line that still allows to match intersection. + * Max distance between point and line that still allows to match intersection. */ private static final int DISTANCE_PROXIMITY = 10; /** - * Default class constructor. Prevents instatiation. + * Default class constructor. Prevents instantiation. */ private Geo() { @@ -134,55 +134,11 @@ public final class Geo { return res; } - /** - * This function returns point on the middle of rectangle side, that is closest - * to the given point. - * - * @param rect - * rectangle on which we look for a point - * @param point - * point to which result should be as close as possible - * @return point on the middle of rectangle side that is as close as possible to - * the input point - */ - public static Point2D pointOnRectangle(Rectangle2D rect, Point2D point) { - - Point2D p1 = new Point2D.Double(rect.getX(), rect.getY()); - Point2D p2 = new Point2D.Double(rect.getX(), rect.getY() + rect.getHeight()); - Point2D p3 = new Point2D.Double(rect.getX() + rect.getWidth(), rect.getY() + rect.getHeight()); - Point2D p4 = new Point2D.Double(rect.getX() + rect.getWidth(), rect.getY()); - - Point2D p12 = new Point2D.Double((p1.getX() + p2.getX()) / 2, (p1.getY() + p2.getY()) / 2); - Point2D p23 = new Point2D.Double((p2.getX() + p3.getX()) / 2, (p2.getY() + p3.getY()) / 2); - Point2D p34 = new Point2D.Double((p3.getX() + p4.getX()) / 2, (p3.getY() + p4.getY()) / 2); - Point2D p41 = new Point2D.Double((p4.getX() + p1.getX()) / 2, (p4.getY() + p1.getY()) / 2); - - double dis1, dis2, dis3, dis4, min; - dis1 = point.distance(p12); - dis2 = point.distance(p23); - dis3 = point.distance(p34); - dis4 = point.distance(p41); - - min = Math.min(dis1, dis2); - min = Math.min(min, dis3); - min = Math.min(min, dis4); - - if (min == dis1) { - return p12; - } else if (min == dis2) { - return p23; - } else if (min == dis3) { - return p34; - } else { - return p41; - } - } - /** * This function returns point on rectangle that is closest to given point. * * @param rect - * rectangle on which the result poiint will be placed + * rectangle on which the result point will be placed * @param point * point for which we look the closest reference on rectangle * @return the closest possible point on rectangle @@ -213,47 +169,6 @@ public final class Geo { } } - /** - * Returns point that is outside given rectangle, but still close to the given - * point. If the given point is inside rec then the given point is returned. - * - * @param rec - * rectangle - * @param point - * point - * @return point that is outside given rectangle, but still close to the given - * point - */ - public static Point2D pointRightOutsideRec(Rectangle2D rec, Point2D point) { - if (!rec.contains(point)) { - return (Point2D) point.clone(); - } else { - double lx = rec.getX(); - double rx = lx + rec.getWidth(); - double uy = rec.getY(); - double dy = uy + rec.getHeight(); - - double dis1 = Math.abs(point.getX() - lx); - double dis2 = Math.abs(point.getX() - rx); - double dis3 = Math.abs(point.getY() - uy); - double dis4 = Math.abs(point.getY() - dy); - - double min = Math.min(dis1, dis2); - min = Math.min(min, dis3); - min = Math.min(min, dis4); - - if (min == dis1) { - return new Point2D.Double(lx - 1.0, point.getY()); - } else if (min == dis2) { - return new Point2D.Double(rx + 1.0, point.getY()); - } else if (min == dis3) { - return new Point2D.Double(point.getX(), uy - 1.0); - } else { - return new Point2D.Double(point.getX(), uy + 1.0); - } - } - } - /** * Creates a {@link PolylineData} that is identical to parameter line, but * doesn't contain duplicate points. @@ -293,13 +208,13 @@ public final class Geo { } /** - * Returns point on line that is as closse as possible to point. + * Returns point on line that is as close as possible to point. * * @param point * point * @param mainLine * line - * @return point on line that is as closse as possible to point + * @return point on line that is as close as possible to point */ public static Point2D closestPointOnPolyline(PolylineData mainLine, Point2D point) { Point2D res = null; diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/ComplexReactionToModelTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/ComplexReactionToModelTest.java index 6ca53968c42ad10c8f1745bed83f9e7df115a490..5c0944c51e4bc6ae5357a1eb8ff326b1aafd2f9f 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/ComplexReactionToModelTest.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/ComplexReactionToModelTest.java @@ -2,7 +2,7 @@ package lcsb.mapviewer.wikipathway; import static org.junit.Assert.*; -import java.awt.*; +import java.awt.Color; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -48,7 +48,7 @@ public class ComplexReactionToModelTest extends WikipathwaysTestFunctions { assertEquals(2, reaction.getReactants().size()); assertEquals(1, reaction.getProducts().size()); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); } @Test @@ -107,7 +107,7 @@ public class ComplexReactionToModelTest extends WikipathwaysTestFunctions { assertEquals("File " + fileName + " different after transformation", 0, mc.compare(model1, model2)); - assertEquals(5, getWarnings().size()); + assertEquals(4, getWarnings().size()); } @Test @@ -126,7 +126,7 @@ public class ComplexReactionToModelTest extends WikipathwaysTestFunctions { assertFalse(Color.BLACK.equals(redAlias.getFillColor())); assertTrue(Color.WHITE.equals(blackAlias.getFillColor())); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); } @Test @@ -141,9 +141,9 @@ public class ComplexReactionToModelTest extends WikipathwaysTestFunctions { lineCount += node.getLine().getLines().size(); } - assertEquals(4, lineCount); + assertEquals(3, lineCount); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); } } diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/GPMLToModelTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/GPMLToModelTest.java index 3d7e5bab20526882f1efbb274272ec131cc5fd85..5431444858d8ac29f31004022adf3bab3c6cba7f 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/GPMLToModelTest.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/GPMLToModelTest.java @@ -10,6 +10,7 @@ import org.junit.Test; import lcsb.mapviewer.common.geometry.PointTransformation; import lcsb.mapviewer.converter.model.celldesigner.geometry.ReactionCellDesignerConverter; +import lcsb.mapviewer.model.map.Drawable; import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.model.ModelComparator; @@ -19,7 +20,7 @@ import lcsb.mapviewer.wikipathway.XML.GPMLToModel; public class GPMLToModelTest extends WikipathwaysTestFunctions { - static Logger logger = LogManager.getLogger(GPMLToModelTest.class); + static Logger logger = LogManager.getLogger(); private ModelComparator mc = new ModelComparator(1.0); @@ -29,17 +30,31 @@ public class GPMLToModelTest extends WikipathwaysTestFunctions { public void DopamineTest() throws Exception { Model model1 = new GPMLToModel().getModel("testFiles/wikipathways/Dopamine.gpml"); - assertEquals(22, getWarnings().size()); + assertEquals(20, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); assertEquals(0, mc.compare(model1, model2)); } + @Test + public void testZIndex() throws Exception { + try { + Model model1 = new GPMLToModel().getModel("testFiles/wikipathways/Dopamine.gpml"); + + for (Drawable bioEntity : model1.getDrawables()) { + assertNotNull(bioEntity.getElementId() + " has null z-index", bioEntity.getZ()); + } + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + @Test public void WP1403_75220Test() throws Exception { Model model1 = new GPMLToModel().getModel("testFiles/wikipathways/WP1403_75220.gpml"); - assertEquals(22, getWarnings().size()); + assertEquals(20, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); assertEquals(0, mc.compare(model1, model2)); @@ -49,7 +64,7 @@ public class GPMLToModelTest extends WikipathwaysTestFunctions { public void WP528_76269Test() throws Exception { Model model1 = new GPMLToModel().getModel("testFiles/wikipathways/WP528_76269.gpml"); - assertEquals(15, getWarnings().size()); + assertEquals(12, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); assertEquals(0, mc.compare(model1, model2)); @@ -59,7 +74,7 @@ public class GPMLToModelTest extends WikipathwaysTestFunctions { public void WP550_73391Test() throws Exception { Model model1 = new GPMLToModel().getModel("testFiles/wikipathways/WP550_73391.gpml"); - assertEquals(16, getWarnings().size()); + assertEquals(12, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -70,7 +85,7 @@ public class GPMLToModelTest extends WikipathwaysTestFunctions { public void WP197_69902Test() throws Exception { Model model1 = new GPMLToModel().getModel("testFiles/wikipathways/WP197_69902.gpml"); - assertEquals(3, getWarnings().size()); + assertEquals(9, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -92,7 +107,7 @@ public class GPMLToModelTest extends WikipathwaysTestFunctions { public void WP306_71714Test() throws Exception { Model model1 = new GPMLToModel().getModel("testFiles/wikipathways/WP306_71714.gpml"); - assertEquals(41, getWarnings().size()); + assertEquals(40, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -103,7 +118,7 @@ public class GPMLToModelTest extends WikipathwaysTestFunctions { public void WP481_72080Test() throws Exception { Model model1 = new GPMLToModel().getModel("testFiles/wikipathways/WP481_72080.gpml"); - assertEquals(22, getWarnings().size()); + assertEquals(19, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -145,17 +160,6 @@ public class GPMLToModelTest extends WikipathwaysTestFunctions { assertEquals(0, mc.compare(model1, model2)); } - @Test - public void testGstp() throws Exception { - Model model1 = new GPMLToModel().getModel("testFiles/wikipathways/gstp.gpml"); - - assertEquals(3, getWarnings().size()); - - Model model2 = serializeModelOverCellDesignerParser(model1); - - assertEquals(0, mc.compare(model1, model2)); - } - @Test public void testMissingAliasesInCompartment() throws Exception { Model model1 = new GPMLToModel().getModel("testFiles/small/missing_aliases_in_compartment.gpml"); @@ -197,8 +201,11 @@ public class GPMLToModelTest extends WikipathwaysTestFunctions { public void testNonHypotheticlaComplex() throws Exception { String fileName = "testFiles/complex/nonhypothetical_complex.gpml"; Model model = new GPMLToModel().getModel(fileName); - for (Complex species : model.getComplexList()) { - assertFalse("Complex parsed from gpml should be hypothetical", species.isHypothetical()); + for (Complex complex : model.getComplexList()) { + assertFalse("Complex parsed from gpml should be hypothetical", complex.isHypothetical()); + for (Species species : complex.getElements()) { + assertTrue("Complex z index should be lower than children x index", species.getZ() > complex.getZ()); + } } assertEquals(0, getWarnings().size()); } @@ -214,7 +221,7 @@ public class GPMLToModelTest extends WikipathwaysTestFunctions { } } assertTrue("Complex parsed from gpml should have a valid name", nameFound); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); } @Test @@ -312,7 +319,7 @@ public class GPMLToModelTest extends WikipathwaysTestFunctions { assertTrue("Modifier is too far from center point: " + distance, distance < ReactionCellDesignerConverter.RECT_SIZE); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); } @Test @@ -354,4 +361,78 @@ public class GPMLToModelTest extends WikipathwaysTestFunctions { assertNotNull(protein.getStructuralState()); } + @Test + public void parseModelAnnotation() throws Exception { + String fileName = "testFiles/small/model_annotation.gpml"; + Model model = new GPMLToModel().getModel(fileName); + assertEquals(1, model.getMiriamData().size()); + assertEquals(0, getWarnings().size()); + } + + @Test + public void parseInvalidModelAnnotation() throws Exception { + String fileName = "testFiles/small/model_invalid_annotation.gpml"; + Model model = new GPMLToModel().getModel(fileName); + assertEquals(0, model.getMiriamData().size()); + assertEquals(2, getWarnings().size()); + } + + @Test + public void parseElementWithComment() throws Exception { + String fileName = "testFiles/small/element_with_comment.gpml"; + Model model = new GPMLToModel().getModel(fileName); + Element element = model.getElementByElementId("a12"); + assertTrue(element.getNotes().length() > 0); + } + + @Test + public void parseReversibleReaction() throws Exception { + String fileName = "testFiles/small/reversible_reaction.gpml"; + Model model = new GPMLToModel().getModel(fileName); + Reaction reaction = model.getReactionByReactionId("e5d42"); + assertTrue(reaction.isReversible()); + } + + @Test + public void parseReactionWithLabelAsSideProduct() throws Exception { + String fileName = "testFiles/small/reaction_with_label_as_side_product.gpml"; + Model model = new GPMLToModel().getModel(fileName); + Reaction reaction = model.getReactionByReactionId("id6f2bfa37"); + assertEquals(2, reaction.getProducts().size()); + } + + @Test + public void parseNodeWithMissingGroup() throws Exception { + String fileName = "testFiles/small/node_with_missing_group.gpml"; + Model model = new GPMLToModel().getModel(fileName); + assertEquals(1, getWarnings().size()); + assertEquals(1, model.getElements().size()); + } + + @Test + public void parseMoleculeWithColor() throws Exception { + String fileName = "testFiles/small/molecule_with_color.gpml"; + Model model = new GPMLToModel().getModel(fileName); + Element element = model.getElementByElementId("d9620"); + logger.debug(element.getFontColor()); + } + + @Test + public void parseComplexName() throws Exception { + String fileName = "testFiles/small/compartment_without_name_and_with_complex_with_name.gpml"; + Model model = new GPMLToModel().getModel(fileName); + Complex complex = model.getElementByElementId("b33da"); + assertFalse(complex.getName().isEmpty()); + Compartment compartment = model.getElementByElementId("a3e41"); + assertTrue(compartment.getName().isEmpty()); + } + + @Test + public void parseCompartmentFromShape() throws Exception { + String fileName = "testFiles/small/compartment_from_shape.gpml"; + Model model = new GPMLToModel().getModel(fileName); + Compartment compartment = model.getElementByElementId("d5695"); + assertFalse(compartment.getName().isEmpty()); + assertTrue(compartment.contains(compartment.getNamePoint())); + } } diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/ReactionElbowsTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/ReactionElbowsTest.java index 4e9b4a2cd58f9d642a9e6c89215ab52a870f7da0..47bac7caa84620fb41e5c180e49eaaf41ce79932 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/ReactionElbowsTest.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/ReactionElbowsTest.java @@ -43,9 +43,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(5, lines); + assertEquals(4, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -70,9 +70,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(6, lines); + assertEquals(5, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -97,9 +97,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(4, lines); + assertEquals(3, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -124,9 +124,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(7, lines); + assertEquals(6, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -151,9 +151,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(6, lines); + assertEquals(5, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -178,9 +178,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(4, lines); + assertEquals(3, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -205,9 +205,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(4, lines); + assertEquals(3, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -232,9 +232,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(6, lines); + assertEquals(5, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -259,9 +259,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(5, lines); + assertEquals(4, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -286,9 +286,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(6, lines); + assertEquals(5, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -313,9 +313,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(4, lines); + assertEquals(3, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -340,9 +340,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(5, lines); + assertEquals(4, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -367,9 +367,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(5, lines); + assertEquals(4, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -394,9 +394,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(6, lines); + assertEquals(5, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -421,9 +421,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(4, lines); + assertEquals(3, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -448,9 +448,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(5, lines); + assertEquals(4, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -475,9 +475,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(4, lines); + assertEquals(3, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -502,9 +502,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(6, lines); + assertEquals(5, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -529,9 +529,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(6, lines); + assertEquals(5, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -556,9 +556,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(4, lines); + assertEquals(3, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -583,9 +583,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(7, lines); + assertEquals(6, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -610,9 +610,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(6, lines); + assertEquals(5, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -637,9 +637,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(4, lines); + assertEquals(3, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); @@ -664,9 +664,9 @@ public class ReactionElbowsTest extends WikipathwaysTestFunctions { } } - assertEquals(5, lines); + assertEquals(4, lines); - assertEquals(1, getWarnings().size()); + assertEquals(0, getWarnings().size()); Model model2 = serializeModelOverCellDesignerParser(model1); diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/ReactionGpmlInputToModelTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/ReactionGpmlInputToModelTest.java index b0cafb8f6bb0bb44870d0bff5b662ee190f38762..4f27be00af8391a07cf081a72844e27c68aba6d0 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/ReactionGpmlInputToModelTest.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/ReactionGpmlInputToModelTest.java @@ -2,6 +2,10 @@ package lcsb.mapviewer.wikipathway; import static org.junit.Assert.*; +import java.awt.Color; +import java.awt.geom.Point2D; +import java.util.List; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.Test; @@ -1137,4 +1141,18 @@ public class ReactionGpmlInputToModelTest extends WikipathwaysTestFunctions { assertEquals(0, mc.compare(model1, model2)); } + + @Test + public void testProblematicInhibition() throws Exception { + String fileName = "testFiles/reactions/inhibition_with_problematic_line.gpml"; + + Model model1 = new GPMLToModel().getModel(fileName); + Reaction r = model1.getReactionByReactionId("eff08"); + r.getLine().setColor(Color.BLUE); + + List<Point2D> points = r.getProducts().get(0).getLine().getPoints(); + assertTrue("End points shouldn't be too close", + points.get(points.size() - 1).distance(points.get(points.size() - 2)) > 0); + } + } diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/WikipathwaysTestFunctions.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/WikipathwaysTestFunctions.java index 81430606958253c7871315d36b2cc4147b45f43c..c263cc8a5dabcf43a1a001e125cf02256a4007f6 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/WikipathwaysTestFunctions.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/WikipathwaysTestFunctions.java @@ -1,5 +1,6 @@ package lcsb.mapviewer.wikipathway; +import java.awt.Color; import java.io.*; import java.net.URL; import java.net.URLConnection; @@ -24,8 +25,10 @@ import lcsb.mapviewer.common.*; import lcsb.mapviewer.common.exception.InvalidXmlSchemaException; import lcsb.mapviewer.converter.*; import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser; -import lcsb.mapviewer.model.map.BioEntity; +import lcsb.mapviewer.model.graphics.PolylineData; +import lcsb.mapviewer.model.map.Drawable; import lcsb.mapviewer.model.map.InconsistentModelException; +import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.model.Model; public abstract class WikipathwaysTestFunctions { @@ -218,8 +221,17 @@ public abstract class WikipathwaysTestFunctions { protected Model serializeModelOverCellDesignerParser(Model model1) throws InconsistentModelException, InvalidInputDataExecption { - for (BioEntity bioEntity : model1.getBioEntities()) { - bioEntity.setZ(null); + for (Drawable bioEntity : model1.getDrawables()) { + if (!(bioEntity instanceof PolylineData)) { + bioEntity.setZ(null); + } + } + for (lcsb.mapviewer.model.map.species.Element bioEntity : model1.getElements()) { + bioEntity.setFontColor(Color.BLACK); + } + //CellDesigner doesn't allow to store compartment font size + for (Compartment bioEntity : model1.getCompartments()) { + bioEntity.setFontSize(Compartment.DEFAULT_COMPARTMENT_THICKNESS); } new ZIndexPopulator().populateZIndex(model1); CellDesignerXmlParser parser = new CellDesignerXmlParser(); diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/AllXmlTests.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/AllXmlTests.java index f52b49dddb85a54e886ff437c1cf89f87af47d41..b58aafc3d297662f10bff109cec124dd411eee8e 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/AllXmlTests.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/AllXmlTests.java @@ -9,11 +9,13 @@ import org.junit.runners.Suite.SuiteClasses; DataNodeParserTest.class, BugTest.class, EdgeLineParserTest.class, + EdgeParserTest.class, GpmlParserTest.class, LabelParserTest.class, - ReferenceParserTest.class, ModelToGPMLTest.class, ModelContructorTest.class, + ReactionLayoutFinderTest.class, + ReferenceParserTest.class, ShapeParserTest.class, StateParserTest.class, }) diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/EdgeParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/EdgeParserTest.java new file mode 100644 index 0000000000000000000000000000000000000000..e59195edd55a88e15401db9d874ad768d3256a44 --- /dev/null +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/EdgeParserTest.java @@ -0,0 +1,103 @@ +package lcsb.mapviewer.wikipathway.XML; + +import static org.junit.Assert.assertEquals; + +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.List; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.Test; + +import lcsb.mapviewer.common.Configuration; +import lcsb.mapviewer.wikipathway.model.*; + +public class EdgeParserTest { + + Logger logger = LogManager.getLogger(); + + EdgeParser parser = new EdgeParser(); + + @Test + public void testGetPointsWithoutTargetDirection() throws Exception { + List<PointData> gpmlPoints = new ArrayList<>(); + PointData pointData = new PointData(); + pointData.setX(370.0); + pointData.setY(506.9845153753351); + pointData.setRelX("0.0"); + pointData.setRelY("1.0"); + pointData.setGraphRef("db29a"); + gpmlPoints.add(pointData); + + pointData = new PointData(); + pointData.setX(337.9360555506242); + pointData.setY(558.2089552238806); + gpmlPoints.add(pointData); + + pointData = new PointData(); + pointData.setX(305.8721111012484); + pointData.setY(587.6687409348253); + pointData.setRelX("0.0"); + pointData.setRelY("0.0"); + pointData.setGraphRef("ba36a"); + pointData.setType(GpmlInteractionType.CONVERSION); + gpmlPoints.add(pointData); + + GpmlLineConnectorType type = GpmlLineConnectorType.ELBOW; + + List<Point2D> result = parser.getPoints(null, gpmlPoints, type); + + assertEquals(0.0, result.get(0).distance(new Point2D.Double(370.0, 506.9845153753351)), Configuration.EPSILON); + assertEquals(0.0, result.get(1).distance(new Point2D.Double(370.0, 558.2089552238806)), Configuration.EPSILON); + assertEquals(0.0, result.get(2).distance(new Point2D.Double(305.8721111012484, 558.2089552238806)), + Configuration.EPSILON); + assertEquals(0.0, result.get(3).distance(new Point2D.Double(305.8721111012484, 587.6687409348253)), + Configuration.EPSILON); + } + + @Test + public void testGetPointsWithoutSourceDirection() throws Exception { + List<PointData> gpmlPoints = new ArrayList<>(); + PointData pointData = new PointData(); + pointData.setX(418.1490729057133); + pointData.setY(421.3813636363637); + pointData.setRelX("0.0"); + pointData.setRelY("0.0"); + pointData.setGraphRef("f78da"); + gpmlPoints.add(pointData); + + pointData = new PointData(); + pointData.setX(506.83491062039946); + pointData.setY(396.35686597839583); + gpmlPoints.add(pointData); + + pointData = new PointData(); + pointData.setX(506.83491062039946); + pointData.setY(369.3819137749735); + gpmlPoints.add(pointData); + + pointData = new PointData(); + pointData.setX(718.8015247108307); + pointData.setY(343.0727655099894); + pointData.setRelX("0.0"); + pointData.setRelY("1.0"); + pointData.setGraphRef("ca8"); + pointData.setType(GpmlInteractionType.ARROW); + gpmlPoints.add(pointData); + + GpmlLineConnectorType type = GpmlLineConnectorType.ELBOW; + + List<Point2D> result = parser.getPoints(null, gpmlPoints, type); + + assertEquals(0.0, result.get(0).distance(new Point2D.Double(418.1490729057133, 421.3813636363637)), Configuration.EPSILON); + assertEquals(0.0, result.get(1).distance(new Point2D.Double(506.83491062039946, 421.3813636363637)), Configuration.EPSILON); + assertEquals(0.0, result.get(2).distance(new Point2D.Double(506.83491062039946, 369.3819137749735)), + Configuration.EPSILON); + assertEquals(0.0, result.get(3).distance(new Point2D.Double(718.8015247108307, 369.3819137749735)), + Configuration.EPSILON); + assertEquals(0.0, result.get(4).distance(new Point2D.Double(718.8015247108307, 343.0727655099894)), + Configuration.EPSILON); + } + +} diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/LabelParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/LabelParserTest.java index 14f6aeb0f9341a7099559b80e95088af923fc580..aa346f17ef07767653f3a8f4312c37269aea867e 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/LabelParserTest.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/LabelParserTest.java @@ -2,7 +2,7 @@ package lcsb.mapviewer.wikipathway.XML; import static org.junit.Assert.*; -import java.awt.*; +import java.awt.Color; import org.junit.*; import org.w3c.dom.Element; @@ -42,6 +42,17 @@ public class LabelParserTest extends WikipathwaysTestFunctions { assertEquals(0, getWarnings().size()); } + @Test + public void testParseLabeHrefl() throws Exception { + Element node = fileToNode("testFiles/elements/label_href.xml"); + Label label = parser.parse(node); + assertNotNull(label); + + assertEquals(1, label.getReferences().size()); + + assertEquals(0, getWarnings().size()); + } + @Test public void testParseGraphics() throws Exception { Element node = fileToNode("testFiles/elements/label_graphics.xml"); diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelContructorTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelContructorTest.java index 2d960c9302a4dba1fb8cb97d8dfdc02ab875ec65..acb69da6375af10472e03df7a029ac0652ed50ec 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelContructorTest.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelContructorTest.java @@ -1,9 +1,8 @@ package lcsb.mapviewer.wikipathway.XML; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.*; -import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; @@ -11,8 +10,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.*; -import lcsb.mapviewer.common.Pair; -import lcsb.mapviewer.model.graphics.PolylineData; +import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.model.map.model.*; import lcsb.mapviewer.model.map.species.GenericProtein; import lcsb.mapviewer.wikipathway.WikipathwaysTestFunctions; @@ -32,21 +30,6 @@ public class ModelContructorTest extends WikipathwaysTestFunctions { public void tearDown() throws Exception { } - @Test - public void testSplitPolyline() { - Point2D p1 = new Point2D.Double(1455.5988605049254, 562.0578193221613); - Point2D p2 = new Point2D.Double(1455.5988605049254, 562.0578193221613); - PolylineData pd = new PolylineData(p1, p2); - - ModelContructor mc = new ModelContructor(); - Pair<PolylineData, PolylineData> result = mc.splitPolyline(pd); - assertNotNull(result); - assertNotNull(result.getLeft()); - assertNotNull(result.getRight()); - assertEquals(2, result.getLeft().getPoints().size()); - assertEquals(2, result.getRight().getPoints().size()); - } - @Test public void testZIndexForElement() throws Exception { ModelToGPML parser = new ModelToGPML(); @@ -76,4 +59,51 @@ public class ModelContructorTest extends WikipathwaysTestFunctions { return result; } + @Test + public void testShouldRotate90degreesWithNoAsAnswer() { + ModelContructor mc = new ModelContructor(); + assertFalse(mc.shouldRotate90degrees(0.0)); + assertFalse(mc.shouldRotate90degrees(Math.PI)); + assertFalse(mc.shouldRotate90degrees(15 * Math.PI)); + assertFalse(mc.shouldRotate90degrees(-Math.PI)); + assertFalse(mc.shouldRotate90degrees(null)); + } + + @Test + public void testShouldRotate90degrees() { + ModelContructor mc = new ModelContructor(); + assertTrue(mc.shouldRotate90degrees(Math.PI / 2)); + assertTrue(mc.shouldRotate90degrees(15 * Math.PI / 2)); + assertTrue(mc.shouldRotate90degrees(-Math.PI / 2)); + } + + @Test + public void testShouldRotate90degreesWithWarnings() { + ModelContructor mc = new ModelContructor(); + assertFalse(mc.shouldRotate90degrees(0.0 + 0.5)); + assertEquals(1, super.getWarnings().size()); + assertFalse(mc.shouldRotate90degrees(Math.PI + 0.5)); + assertEquals(2, super.getWarnings().size()); + assertFalse(mc.shouldRotate90degrees(15 * Math.PI + 0.5)); + assertEquals(3, super.getWarnings().size()); + assertFalse(mc.shouldRotate90degrees(-Math.PI + 0.5)); + assertEquals(4, super.getWarnings().size()); + assertTrue(mc.shouldRotate90degrees(Math.PI / 2 + 0.5)); + assertEquals(5, super.getWarnings().size()); + assertTrue(mc.shouldRotate90degrees(15 * Math.PI / 2 + 0.5)); + assertEquals(6, super.getWarnings().size()); + assertTrue(mc.shouldRotate90degrees(-Math.PI / 2 + 0.5)); + assertEquals(7, super.getWarnings().size()); + } + + @Test + public void testRotate90degrees() { + ModelContructor mc = new ModelContructor(); + Rectangle2D result = mc.rotate90degrees(new Rectangle2D.Double(10, 20, 30, 40)); + assertEquals(5, result.getX(), Configuration.EPSILON); + assertEquals(25, result.getY(), Configuration.EPSILON); + assertEquals(40, result.getWidth(), Configuration.EPSILON); + assertEquals(30, result.getHeight(), Configuration.EPSILON); + } + } diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReactionLayoutFinderTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReactionLayoutFinderTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0dc4747db50c4a46497978b09be33d9c4053c452 --- /dev/null +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReactionLayoutFinderTest.java @@ -0,0 +1,270 @@ +package lcsb.mapviewer.wikipathway.XML; + +import static org.junit.Assert.*; + +import java.awt.geom.Line2D; +import java.awt.geom.Point2D; +import java.util.Arrays; +import java.util.Map; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.Before; +import org.junit.Test; + +import lcsb.mapviewer.common.Configuration; +import lcsb.mapviewer.common.exception.InvalidArgumentException; +import lcsb.mapviewer.common.geometry.LineTransformation; +import lcsb.mapviewer.model.graphics.PolylineData; +import lcsb.mapviewer.model.map.reaction.*; +import lcsb.mapviewer.wikipathway.WikipathwaysTestFunctions; +import lcsb.mapviewer.wikipathway.model.Edge; +import lcsb.mapviewer.wikipathway.model.Interaction; + +public class ReactionLayoutFinderTest extends WikipathwaysTestFunctions { + + Logger logger = LogManager.getLogger(); + + LineTransformation lt = new LineTransformation(); + + ReactionLayoutFinder finder; + + @Before + public void setUp() { + finder = new ReactionLayoutFinder(); + } + + @Test + public void testNodePointsInteractionWithoutAnything() { + Interaction interaction = new Interaction(createEdge("id", new Point2D.Double(0, 0), new Point2D.Double(100, 0))); + Map<Class<?>, Point2D> result = finder.getNodeStartPoints(interaction); + validatePointsResult(interaction, result); + } + + @Test + public void testNodePointsInteractionWithAdditionalReactant() { + Interaction interaction = new Interaction(createEdge("id", new Point2D.Double(0, 0), new Point2D.Double(100, 0))); + + interaction.addReactant(createEdge("react1", new Point2D.Double(10, 0), new Point2D.Double(200, 200))); + + Map<Class<?>, Point2D> result = finder.getNodeStartPoints(interaction); + validatePointsResult(interaction, result); + assertEquals(0, result.get(Reactant.class).distance(new Point2D.Double(10, 0)), Configuration.EPSILON); + } + + @Test + public void testNodePointsInteractionWithShiftedReactant() { + Interaction interaction = new Interaction(createEdge("id", new Point2D.Double(0, 0), new Point2D.Double(100, 0))); + + interaction.addReactant(createEdge("react1", new Point2D.Double(60, 0), new Point2D.Double(200, 200))); + + Map<Class<?>, Point2D> result = finder.getNodeStartPoints(interaction); + validatePointsResult(interaction, result); + assertEquals(0, result.get(Reactant.class).distance(new Point2D.Double(60, 0)), Configuration.EPSILON); + } + + @Test + public void testNodePointsInteractionWithAdditionalProduct() { + Interaction interaction = new Interaction(createEdge("id", new Point2D.Double(0, 0), new Point2D.Double(100, 0))); + + interaction.addProduct(createEdge("prod", new Point2D.Double(80, 0), new Point2D.Double(200, 200))); + + Map<Class<?>, Point2D> result = finder.getNodeStartPoints(interaction); + validatePointsResult(interaction, result); + assertEquals(0, result.get(Product.class).distance(new Point2D.Double(80, 0)), Configuration.EPSILON); + } + + @Test + public void testNodePointsInteractionWithAdditionalModifier() { + Interaction interaction = new Interaction(createEdge("id", new Point2D.Double(0, 0), new Point2D.Double(100, 0))); + + interaction.addModifier(createEdge("modifier", new Point2D.Double(80, 0), new Point2D.Double(200, 200))); + + Map<Class<?>, Point2D> result = finder.getNodeStartPoints(interaction); + validatePointsResult(interaction, result); + assertEquals(0, result.get(Modifier.class).distance(new Point2D.Double(80, 0)), Configuration.EPSILON); + } + + @Test + public void testNodePointsInteractionWithMultiNodes() { + Interaction interaction = new Interaction(createEdge("id", new Point2D.Double(0, 0), new Point2D.Double(100, 0))); + + interaction.addReactant(createEdge("react1", new Point2D.Double(10, 0), new Point2D.Double(200, 200))); + interaction.addReactant(createEdge("react2", new Point2D.Double(20, 0), new Point2D.Double(200, 200))); + interaction.addReactant(createEdge("react3", new Point2D.Double(30, 0), new Point2D.Double(200, 200))); + interaction.addModifier(createEdge("modifier", new Point2D.Double(40, 0), new Point2D.Double(200, 200))); + interaction.addProduct(createEdge("prod1", new Point2D.Double(50, 0), new Point2D.Double(200, 200))); + interaction.addProduct(createEdge("prod2", new Point2D.Double(60, 0), new Point2D.Double(200, 200))); + interaction.addProduct(createEdge("prod3", new Point2D.Double(70, 0), new Point2D.Double(200, 200))); + + Map<Class<?>, Point2D> result = finder.getNodeStartPoints(interaction); + validatePointsResult(interaction, result); + assertEquals(0, result.get(Modifier.class).distance(new Point2D.Double(40, 0)), Configuration.EPSILON); + } + + @Test + public void testNodePointsInteractionWithMultiModifiers() { + Interaction interaction = new Interaction(createEdge("id", new Point2D.Double(0, 0), new Point2D.Double(100, 0))); + + interaction.addReactant(createEdge("react1", new Point2D.Double(10, 0), new Point2D.Double(200, 200))); + interaction.addReactant(createEdge("react2", new Point2D.Double(20, 0), new Point2D.Double(200, 200))); + interaction.addReactant(createEdge("react3", new Point2D.Double(30, 0), new Point2D.Double(200, 200))); + interaction.addModifier(createEdge("modifier", new Point2D.Double(40, 0), new Point2D.Double(200, 200))); + interaction.addProduct(createEdge("prod1", new Point2D.Double(50, 0), new Point2D.Double(200, 200))); + interaction.addModifier(createEdge("modifier2", new Point2D.Double(60, 0), new Point2D.Double(200, 200))); + interaction.addProduct(createEdge("prod3", new Point2D.Double(70, 0), new Point2D.Double(200, 200))); + + Map<Class<?>, Point2D> result = finder.getNodeStartPoints(interaction); + validatePointsResult(interaction, result); + assertEquals(0, result.get(Modifier.class).distance(new Point2D.Double(40, 0)), Configuration.EPSILON); + } + + @Test + public void testNodePointsInteractionWithMultiModifiers2() { + Interaction interaction = new Interaction(createEdge("id", new Point2D.Double(0, 0), new Point2D.Double(100, 0))); + + interaction.addReactant(createEdge("react1", new Point2D.Double(10, 0), new Point2D.Double(200, 200))); + interaction.addModifier(createEdge("modifier2", new Point2D.Double(20, 0), new Point2D.Double(200, 200))); + interaction.addReactant(createEdge("react3", new Point2D.Double(30, 0), new Point2D.Double(200, 200))); + interaction.addModifier(createEdge("modifier", new Point2D.Double(40, 0), new Point2D.Double(200, 200))); + interaction.addProduct(createEdge("prod1", new Point2D.Double(50, 0), new Point2D.Double(200, 200))); + interaction.addProduct(createEdge("prod3", new Point2D.Double(70, 0), new Point2D.Double(200, 200))); + + Map<Class<?>, Point2D> result = finder.getNodeStartPoints(interaction); + validatePointsResult(interaction, result); + assertEquals(0, result.get(Modifier.class).distance(new Point2D.Double(40, 0)), Configuration.EPSILON); + } + + private Edge createEdge(String id, Point2D p1, Point2D p2) { + Edge modifierEdge = new Edge(id); + modifierEdge.setLine(new PolylineData(p1, p2)); + return modifierEdge; + } + + private void validatePointsResult(Interaction interaction, Map<Class<?>, Point2D> result) { + PolylineData pd = interaction.getLine(); + Point2D reactantPoint = result.get(Reactant.class); + Point2D productPoint = result.get(Product.class); + Point2D modifierPoint = result.get(Modifier.class); + assertNotNull(reactantPoint); + assertNotNull(productPoint); + assertNotNull(modifierPoint); + +// logger.debug(reactantPoint); +// logger.debug(modifierPoint); +// logger.debug(productPoint); +// + assertEquals(0, distanceFromLine(pd, reactantPoint), Configuration.EPSILON); + assertEquals(0, distanceFromLine(pd, productPoint), Configuration.EPSILON); + assertEquals(0, distanceFromLine(pd, modifierPoint), Configuration.EPSILON); + + assertTrue( + finder.distanceFromPolylineStart(pd, reactantPoint) < finder.distanceFromPolylineStart(pd, modifierPoint)); + assertTrue( + finder.distanceFromPolylineStart(pd, modifierPoint) < finder.distanceFromPolylineStart(pd, productPoint)); + } + + private double distanceFromLine(PolylineData pd, Point2D point) { + double distance = Double.MAX_VALUE; + for (Line2D line : pd.getLines()) { + distance = Math.min(distance, lt.distBetweenPointAndLineSegment(line, point)); + } + return distance; + } + + @Test + public void testDistanceFromPolylineStartSimple() { + PolylineData line = new PolylineData(new Point2D.Double(10, 20), new Point2D.Double(40, 60)); + assertEquals(0, finder.distanceFromPolylineStart(line, new Point2D.Double(10, 20)), Configuration.EPSILON); + assertEquals(50, finder.distanceFromPolylineStart(line, new Point2D.Double(40, 60)), Configuration.EPSILON); + assertEquals(25, finder.distanceFromPolylineStart(line, new Point2D.Double(25, 40)), Configuration.EPSILON); + } + + @Test(expected = InvalidArgumentException.class) + public void testDistanceFromPolylineStartInvalid() { + PolylineData line = new PolylineData(new Point2D.Double(10, 20), new Point2D.Double(40, 60)); + finder.distanceFromPolylineStart(line, new Point2D.Double(1, 2)); + } + + @Test + public void testDistanceFromPolylineStartComplex() { + PolylineData line = new PolylineData(new Point2D.Double(10, 20), new Point2D.Double(40, 60)); + line.addPoint(new Point2D.Double(60, 60)); + assertEquals(50, finder.distanceFromPolylineStart(line, new Point2D.Double(40, 60)), Configuration.EPSILON); + assertEquals(60, finder.distanceFromPolylineStart(line, new Point2D.Double(50, 60)), Configuration.EPSILON); + assertEquals(70, finder.distanceFromPolylineStart(line, new Point2D.Double(60, 60)), Configuration.EPSILON); + } + + @Test + public void testNodeLinesInteractionWithoutAnything() { + Interaction interaction = new Interaction(createEdge("id", new Point2D.Double(0, 0), new Point2D.Double(100, 0))); + Map<Class<?>, PolylineData> result = finder.getNodeLines(interaction); + validateLinesResult(interaction, result); + } + + @Test + public void testNodeLinesInteractionWithTwoReactants() { + Edge edge = new Edge("id"); + PolylineData line = new PolylineData(Arrays.asList( + new Point2D.Double(0, 0), + new Point2D.Double(100, 0), + new Point2D.Double(100, 100) + )); + edge.setLine(line); + Interaction interaction = new Interaction(edge); + interaction.addReactant(createEdge("reactant", new Point2D.Double(200, 0), new Point2D.Double(100, 0))); + + Map<Class<?>, PolylineData> result = finder.getNodeLines(interaction); + validateLinesResult(interaction, result); + } + + @Test + public void testNodeLinesInteractionWithTwoProducts() { + Edge edge = new Edge("id"); + PolylineData line = new PolylineData(Arrays.asList( + new Point2D.Double(0, 0), + new Point2D.Double(100, 0), + new Point2D.Double(100, 100) + )); + edge.setLine(line); + Interaction interaction = new Interaction(edge); + interaction.addProduct(createEdge("product", new Point2D.Double(200, 0), new Point2D.Double(100, 0))); + + Map<Class<?>, PolylineData> result = finder.getNodeLines(interaction); + validateLinesResult(interaction, result); + } + + private void validateLinesResult(Interaction interaction, Map<Class<?>, PolylineData> result) { + PolylineData pd = interaction.getLine(); + PolylineData reactantLine = result.get(Reactant.class); + PolylineData inputOperatorLine = result.get(AndOperator.class); + PolylineData outputOperatorLine = result.get(SplitOperator.class); + PolylineData productLine = result.get(Product.class); + PolylineData modifierLine = result.get(Modifier.class); + +// logger.debug(reactantLine); +// logger.debug(inputOperatorLine); +// logger.debug(modifierLine); +// logger.debug(outputOperatorLine); +// logger.debug(productLine); +// + assertNotNull(reactantLine); + assertTrue(reactantLine.length() > Configuration.EPSILON); + assertNotNull(productLine); + assertTrue(productLine.length() > Configuration.EPSILON); + assertNotNull(modifierLine); + assertTrue("Modifier line length must be > 0", modifierLine.length() > Configuration.EPSILON); + assertNotNull(inputOperatorLine); + assertTrue(inputOperatorLine.length() > Configuration.EPSILON); + assertNotNull(outputOperatorLine); + assertTrue(outputOperatorLine.length() > Configuration.EPSILON); + + assertEquals(0, pd.getBeginPoint().distance(reactantLine.getBeginPoint()), Configuration.EPSILON); + assertEquals(0, reactantLine.getEndPoint().distance(inputOperatorLine.getBeginPoint()), Configuration.EPSILON); + assertEquals(0, inputOperatorLine.getEndPoint().distance(modifierLine.getBeginPoint()), Configuration.EPSILON); + assertEquals(0, modifierLine.getEndPoint().distance(outputOperatorLine.getBeginPoint()), Configuration.EPSILON); + assertEquals(0, outputOperatorLine.getEndPoint().distance(productLine.getBeginPoint()), Configuration.EPSILON); + assertEquals(0, productLine.getEndPoint().distance(pd.getEndPoint()), Configuration.EPSILON); + } + +} diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/model/biopax/AllBiopaxTests.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/model/biopax/AllBiopaxTests.java index 7962c204a2a79b43529de5715793376f586d0bbd..cd54c21984a90a08bd8510fa2ec07391b753ebcd 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/model/biopax/AllBiopaxTests.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/model/biopax/AllBiopaxTests.java @@ -5,7 +5,9 @@ import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) -@SuiteClasses({ BiopaxDataTest.class, BiopaxOpenControlledVocabularyTest.class, BiopaxPublicationTest.class }) +@SuiteClasses({ BiopaxDataTest.class, + BiopaxOpenControlledVocabularyTest.class, + BiopaxPublicationTest.class }) public class AllBiopaxTests { } diff --git a/pathvisio/testFiles/elements/label_href.xml b/pathvisio/testFiles/elements/label_href.xml new file mode 100644 index 0000000000000000000000000000000000000000..4c10b05272a1122e596dda5bcd160cf51ae6e839 --- /dev/null +++ b/pathvisio/testFiles/elements/label_href.xml @@ -0,0 +1,3 @@ +<Label + TextLabel="Phosphoribosylpyrophosphate synthetase 1 defects" + GraphId="cfbda" Href="http://omim.org/311850"></Label> diff --git a/pathvisio/testFiles/reactions/inhibition_with_problematic_line.gpml b/pathvisio/testFiles/reactions/inhibition_with_problematic_line.gpml new file mode 100644 index 0000000000000000000000000000000000000000..955ba3e923f02d522af4e58c83fe1bf427176470 --- /dev/null +++ b/pathvisio/testFiles/reactions/inhibition_with_problematic_line.gpml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Pathway xmlns="http://pathvisio.org/GPML/2013a" Name="MAPK Signaling Pathway" Organism="Homo sapiens" License="CC BY 2.0"> + <Graphics BoardWidth="1824.945655991181" BoardHeight="1510.0" /> + <DataNode TextLabel="PPP5C" GraphId="e19" Type="GeneProduct" GroupRef="cd419"> + <Attribute Key="org.pathvisio.model.BackpageHead" Value="PPP5C | protein phosphatase 5 catalytic subuni..." /> + <Graphics CenterX="541.9543147208124" CenterY="1108.7648054145516" Width="40.0" Height="20.0" ZOrder="32932" FontSize="10" Valign="Middle" /> + <Xref Database="Entrez Gene" ID="5536" /> + </DataNode> + <DataNode TextLabel="MAP3K5" GraphId="d1a" Type="GeneProduct"> + <Attribute Key="org.pathvisio.model.BackpageHead" Value="MAP3K5 | mitogen-activated protein kinase kinas..." /> + <Graphics CenterX="590.5104765583576" CenterY="1082.6835871404394" Width="60.0" Height="20.0" ZOrder="33214" FontSize="10" Valign="Middle" /> + <Xref Database="Entrez Gene" ID="4217" /> + </DataNode> + <DataNode TextLabel="PPP5D1" GraphId="c908a" Type="GeneProduct" GroupRef="cd419"> + <Attribute Key="org.pathvisio.model.BackpageHead" Value="PPP5C | protein phosphatase 5 catalytic subuni..." /> + <Graphics CenterX="541.9543147208121" CenterY="1128.764805414554" Width="40.0" Height="20.0" ZOrder="33227" FontSize="10" Valign="Middle" /> + <Xref Database="Ensembl" ID="ENSG00000230510" /> + </DataNode> + <Interaction GraphId="eff08"> + <Graphics ConnectorType="Elbow" ZOrder="12348" LineThickness="1.0" Color="ff0000"> + <Point X="569.9543147208124" Y="1118.764805414553" GraphRef="efe70" RelX="1.0" RelY="0.0" /> + <Point X="590.5104765583576" Y="1092.6835871404394" GraphRef="d1a" RelX="0.0" RelY="1.0" ArrowHead="mim-inhibition" /> + </Graphics> + <Xref Database="" ID="" /> + </Interaction> + <Group GroupId="cd419" GraphId="efe70" Style="Group" /> +</Pathway> \ No newline at end of file diff --git a/pathvisio/testFiles/small/compartment_from_shape.gpml b/pathvisio/testFiles/small/compartment_from_shape.gpml new file mode 100644 index 0000000000000000000000000000000000000000..3f146f8843d3d12fe22645f294b93e123fd5b8ba --- /dev/null +++ b/pathvisio/testFiles/small/compartment_from_shape.gpml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Pathway xmlns="http://pathvisio.org/GPML/2013a" Name="ACE Inhibitor Pathway" Organism="Homo sapiens"> + <Label TextLabel="Zona glomerulosa of the adrenal gland" GraphId="a49c5"> + <Graphics CenterX="400.0" CenterY="585.5" Width="184.0" Height="35.0" ZOrder="28672" FillColor="ffffff" FontWeight="Bold" FontSize="14" Valign="Middle" Color="999999"/> + </Label> + <Label TextLabel="EDHF" GraphId="b2aa3"> + <Graphics CenterX="808.0" CenterY="475.0" Width="42.0" Height="20.0" ZOrder="28672" FillColor="ffffff" FontWeight="Bold" FontSize="10" Valign="Middle"/> + </Label> + <Label TextLabel="Blood vessels" GraphId="d3e2b"> + <Graphics CenterX="749.0" CenterY="579.5" Width="184.0" Height="35.0" ZOrder="28672" FillColor="ffffff" FontWeight="Bold" FontSize="14" Valign="Middle" Color="999999"/> + </Label> + <Label TextLabel="Mesangial cells around blood vessels in the kidneys" GraphId="e166c"> + <Graphics CenterX="139.0" CenterY="583.5" Width="222.0" Height="35.0" ZOrder="28672" FillColor="ffffff" FontWeight="Bold" FontSize="14" Valign="Middle" Color="999999"/> + </Label> + <Shape GraphId="c2049"> + <Attribute Key="org.pathvisio.DoubleLineProperty" Value="Double"/> + <Graphics CenterX="748.0" CenterY="502.5" Width="232.0" Height="235.0" ZOrder="16384" FontSize="10" Valign="Middle" ShapeType="RoundedRectangle" LineThickness="3.0" Color="c0c0c0" Rotation="0.0"/> + </Shape> + <Shape GraphId="d5695"> + <Attribute Key="org.pathvisio.DoubleLineProperty" Value="Double"/> + <Graphics CenterX="450.0" CenterY="503.5" Width="344.0" Height="235.0" ZOrder="16384" FontSize="10" Valign="Middle" ShapeType="RoundedRectangle" LineThickness="3.0" Color="c0c0c0" Rotation="0.0"/> + </Shape> + <Shape GraphId="f975e"> + <Attribute Key="org.pathvisio.DoubleLineProperty" Value="Double"/> + <Graphics CenterX="140.0" CenterY="504.0" Width="254.0" Height="232.0" ZOrder="16384" FontSize="10" Valign="Middle" ShapeType="RoundedRectangle" LineThickness="3.0" Color="c0c0c0" Rotation="0.0"/> + </Shape> +</Pathway> \ No newline at end of file diff --git a/pathvisio/testFiles/small/compartment_without_name_and_with_complex_with_name.gpml b/pathvisio/testFiles/small/compartment_without_name_and_with_complex_with_name.gpml new file mode 100644 index 0000000000000000000000000000000000000000..b83e297d1dca930fa18ccd305046073f4eb72417 --- /dev/null +++ b/pathvisio/testFiles/small/compartment_without_name_and_with_complex_with_name.gpml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Pathway xmlns="http://pathvisio.org/GPML/2013a" Name="MAPK Signaling Pathway" Organism="Homo sapiens" License="CC BY 2.0"> + <DataNode TextLabel="Apoptosis" GraphId="d8cd7" Type="Pathway" GroupRef="bbb58"> + <Graphics CenterX="1411.756345177664" CenterY="989.730964467005" Width="80.0" Height="20.0" ZOrder="32991" FontWeight="Bold" FontSize="12" Valign="Middle" ShapeType="None" Color="14961e" /> + <Xref Database="WikiPathways" ID="WP254" /> + </DataNode> + <Label TextLabel="Proliferation, differentiation,
inflammation" GraphId="e66" GroupRef="bbb58"> + <Graphics CenterX="1408.4230118443306" CenterY="969.230964467005" Width="138.66666666666666" Height="29.0" ZOrder="28688" FillColor="ffffff" FontWeight="Bold" FontSize="10" Valign="Middle" /> + </Label> + <Group GroupId="bbb58" GraphId="b33da" Style="Group" /> + <Shape GraphId="a3e41"> + <Attribute Key="org.pathvisio.CellularComponentProperty" Value="Cell" /> + <Attribute Key="org.pathvisio.DoubleLineProperty" Value="Double" /> + <Graphics CenterX="861.0" CenterY="778.0" Width="1382.0" Height="1404.0" ZOrder="16384" FontSize="12" Valign="Middle" ShapeType="RoundedRectangle" LineThickness="3.0" Color="c0c0c0" Rotation="0.0" /> + </Shape> +</Pathway> \ No newline at end of file diff --git a/pathvisio/testFiles/small/element_with_comment.gpml b/pathvisio/testFiles/small/element_with_comment.gpml new file mode 100644 index 0000000000000000000000000000000000000000..741131f2686c2c3ef5968d28f4dd5c20d78f08ef --- /dev/null +++ b/pathvisio/testFiles/small/element_with_comment.gpml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Pathway xmlns="http://pathvisio.org/GPML/2013a" Name="Cholesterol Biosynthesis Pathway" Last-Modified="2/22/2013" Organism="Homo sapiens"> + <Graphics BoardWidth="709.6540434669985" BoardHeight="679.0097543709028" /> + <DataNode TextLabel="NSDHL" GraphId="a12" Type="GeneProduct"> + <Comment Source="GenMAPP remarks">NAD(P) dependent steroid dehydrogenase-like</Comment> + <Attribute Key="org.pathvisio.model.BackpageHead" Value="NSDHL | NAD(P) dependent steroid dehydrogenase-..." /> + <Graphics CenterX="646.3207101336652" CenterY="261.70514694126564" Width="66.66666666666667" Height="20.0" ZOrder="32768" FontSize="10" Valign="Middle" /> + <Xref Database="Entrez Gene" ID="50814" /> + </DataNode> +</Pathway> \ No newline at end of file diff --git a/pathvisio/testFiles/small/model_annotation.gpml b/pathvisio/testFiles/small/model_annotation.gpml new file mode 100644 index 0000000000000000000000000000000000000000..7195854a170005a14d59b4b68696299fac86a818 --- /dev/null +++ b/pathvisio/testFiles/small/model_annotation.gpml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Pathway xmlns="http://pathvisio.org/GPML/2013a" Name="Purine metabolism" Version="20161102" Organism="Homo sapiens"> + <BiopaxRef>de6</BiopaxRef> + <Graphics BoardWidth="2357.1066152108338" BoardHeight="1006.1828435291823"/> + <Biopax> + <bp:openControlledVocabulary xmlns:bp="http://www.biopax.org/release/biopax-level3.owl#"> + <bp:TERM xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:datatype="http://www.w3.org/2001/XMLSchema#string">classic metabolic pathway</bp:TERM> + <bp:ID xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:datatype="http://www.w3.org/2001/XMLSchema#string">PW:0000002</bp:ID> + <bp:Ontology xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Pathway Ontology</bp:Ontology> + </bp:openControlledVocabulary> + <bp:PublicationXref xmlns:bp="http://www.biopax.org/release/biopax-level3.owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:id="de6"> + <bp:ID rdf:datatype="http://www.w3.org/2001/XMLSchema#string">12235098</bp:ID> + <bp:DB rdf:datatype="http://www.w3.org/2001/XMLSchema#string">PubMed</bp:DB> + <bp:TITLE rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Malformation syndromes due to inborn errors of cholesterol synthesis.</bp:TITLE> + <bp:SOURCE rdf:datatype="http://www.w3.org/2001/XMLSchema#string">J Clin Invest</bp:SOURCE> + <bp:YEAR rdf:datatype="http://www.w3.org/2001/XMLSchema#string">2002</bp:YEAR> + <bp:AUTHORS rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Porter FD</bp:AUTHORS> + </bp:PublicationXref> + </Biopax> +</Pathway> \ No newline at end of file diff --git a/pathvisio/testFiles/small/model_invalid_annotation.gpml b/pathvisio/testFiles/small/model_invalid_annotation.gpml new file mode 100644 index 0000000000000000000000000000000000000000..ae791f773a8a1446dfa7f4fefcb90cdfe6872026 --- /dev/null +++ b/pathvisio/testFiles/small/model_invalid_annotation.gpml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Pathway xmlns="http://pathvisio.org/GPML/2013a" Name="Purine metabolism" Version="20161102" Organism="Homo sapiens"> + <BiopaxRef>de6</BiopaxRef> + <BiopaxRef>unknown</BiopaxRef> + <Graphics BoardWidth="2357.1066152108338" BoardHeight="1006.1828435291823"/> +</Pathway> \ No newline at end of file diff --git a/pathvisio/testFiles/small/molecule_with_color.gpml b/pathvisio/testFiles/small/molecule_with_color.gpml new file mode 100644 index 0000000000000000000000000000000000000000..fd6e1c9eee9083c1019e38f486682b271dbb03f3 --- /dev/null +++ b/pathvisio/testFiles/small/molecule_with_color.gpml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Pathway xmlns="http://pathvisio.org/GPML/2013a" Name="ACE Inhibitor Pathway" Organism="Homo sapiens"> + <DataNode TextLabel="ACE Inhibitor" GraphId="d9620" Type="Metabolite"> + <Graphics CenterX="467.5" CenterY="40.66666666666666" Width="91.0" Height="20.0" ZOrder="32768" FontSize="10" Valign="Middle" Color="cc0000"/> + <Xref Database="ChEBI" ID="CHEBI:35457"/> + </DataNode> +</Pathway> \ No newline at end of file diff --git a/pathvisio/testFiles/small/node_with_missing_group.gpml b/pathvisio/testFiles/small/node_with_missing_group.gpml new file mode 100644 index 0000000000000000000000000000000000000000..1617b316ad6e60deb49d78277ce42885808038dc --- /dev/null +++ b/pathvisio/testFiles/small/node_with_missing_group.gpml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Pathway xmlns="http://pathvisio.org/GPML/2013a" Name="Purine metabolism" Version="20161102" Organism="Homo sapiens"> + <DataNode TextLabel="AO" GraphId="a7af3" Type="Protein" GroupRef="d0eb9"> + <Graphics CenterX="1772.9349290844132" CenterY="61.849749175651525" Width="46.16009280742433" Height="25.0" ZOrder="32768" FontSize="12" Valign="Middle"/> + </DataNode> +</Pathway> \ No newline at end of file diff --git a/pathvisio/testFiles/small/reaction_with_label_as_side_product.gpml b/pathvisio/testFiles/small/reaction_with_label_as_side_product.gpml new file mode 100644 index 0000000000000000000000000000000000000000..0022c589e9292a4efea8d64a9f7e071238fa41e9 --- /dev/null +++ b/pathvisio/testFiles/small/reaction_with_label_as_side_product.gpml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Pathway xmlns="http://pathvisio.org/GPML/2013a" Name="Purine metabolism" Version="20161102" Organism="Homo sapiens"> + <Graphics BoardWidth="2357.1066152108338" BoardHeight="1006.1828435291823"/> + <DataNode TextLabel="Hypoxanthine" GraphId="ce7d3" Type="Metabolite"> + <Graphics CenterX="825.4195292898956" CenterY="771.2721891544751" Width="90.0" Height="25.0" ZOrder="32768" FontSize="12" Valign="Middle" LineThickness="2.0" Color="ff6666"/> + <Xref Database="ChEBI" ID="CHEBI:17368"/> + </DataNode> + <DataNode TextLabel="2'-deoxyinosine" GraphId="dc77e" Type="Metabolite"> + <Graphics CenterX="158.50507786644994" CenterY="873.9515387851391" Width="123.41614420062683" Height="25.0" ZOrder="32769" FontSize="12" Valign="Middle" LineThickness="2.0" Color="ff6666"/> + <Xref Database="ChEBI" ID="CHEBI:28997"/> + </DataNode> + <DataNode TextLabel="PNP" GraphId="e42f7" Type="Protein"> + <Graphics CenterX="311.24362390084195" CenterY="868.6948483311019" Width="43.60542582228957" Height="25.0" ZOrder="32774" FontSize="12" Valign="Middle"/> + <Xref Database="Uniprot-TrEMBL" ID="P00491"/> + </DataNode> + <Interaction GraphId="id6f2bfa37"> + <Graphics ConnectorType="Elbow" ZOrder="12288" LineThickness="1.0"> + <Point X="189.35911391660665" Y="886.4515387851391" GraphRef="dc77e" RelX="0.5" RelY="1.0"/> + <Point X="802.9195292898956" Y="783.7721891544751" GraphRef="ce7d3" RelX="-0.5" RelY="1.0" ArrowHead="mim-conversion"/> + <Anchor Position="0.18744319428080264" Shape="None" GraphId="b5668"/> + </Graphics> + <Xref Database="Rhea" ID="27751"/> + </Interaction> + + <Interaction GraphId="id63eeb6f"> + <Graphics ZOrder="12288" LineThickness="1.0"> + <Point X="311.24362390084195" Y="881.1948483311019" GraphRef="e42f7" RelX="0.0" RelY="1.0"/> + <Point X="311.11111111111114" Y="906.4515387851391" GraphRef="b5668" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis"/> + </Graphics> + <Xref Database="" ID=""/> + </Interaction> + + <GraphicalLine GraphId="e8aae"> + <Graphics ConnectorType="Elbow" ZOrder="12288" LineStyle="Broken" LineThickness="1.0"> + <Point X="311.11111111111114" Y="906.4515387851391" GraphRef="b5668" RelX="0.0" RelY="0.0"/> + <Point X="337.42384957454703" Y="892.9824561403509"/> + <Point X="363.736588037983" Y="789.0918747157914" GraphRef="cd255" RelX="0.5" RelY="1.0" ArrowHead="Arrow"/> + </Graphics> + </GraphicalLine> + + <Label TextLabel="Purine nucleoside phosphorylase deficiency" GraphId="cd255" Href="https://omim.org/entry/613179"> + <Comment>DISEASE</Comment> + <Graphics CenterX="332.03769301035845" CenterY="765.6464158267954" Width="126.79558011049801" Height="46.890917777992016" ZOrder="32906" FillColor="ffcccc" FontSize="12" Valign="Middle" ShapeType="RoundedRectangle" Color="0000ff"/> + </Label> + <InfoBox CenterX="0.0" CenterY="0.0"/> + +</Pathway> \ No newline at end of file diff --git a/pathvisio/testFiles/small/reversible_reaction.gpml b/pathvisio/testFiles/small/reversible_reaction.gpml new file mode 100644 index 0000000000000000000000000000000000000000..67ae2b86d2f00e2ee9afcefc148453565aaef852 --- /dev/null +++ b/pathvisio/testFiles/small/reversible_reaction.gpml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Pathway xmlns="http://pathvisio.org/GPML/2013a" Name="Cholesterol Biosynthesis Pathway" Last-Modified="2/22/2013" Organism="Homo sapiens"> + <Graphics BoardWidth="709.6540434669985" BoardHeight="679.0097543709028" /> + <DataNode TextLabel="IDI1" GraphId="c3b" Type="GeneProduct"> + <Attribute Key="org.pathvisio.model.BackpageHead" Value="IDI1 | isopentenyl-diphosphate delta isomerase" /> + <Graphics CenterX="263.62037134806815" CenterY="533.9075111234577" Width="66.66666666666667" Height="20.0" ZOrder="32768" FontSize="10" Valign="Middle" /> + <Xref Database="Entrez Gene" ID="3422" /> + </DataNode> + <DataNode TextLabel="isopentenyl pyrophosphate" GraphId="db29a" Type="Metabolite"> + <Graphics CenterX="370.0" CenterY="496.9845153753351" Width="141.71445929526124" Height="20.0" ZOrder="32768" FontSize="10" Valign="Middle" Color="0000ff" /> + <Xref Database="CAS" ID="358-71-4" /> + </DataNode> + <DataNode TextLabel="Dimethylallyl pyrophosphate" GraphId="fce72" Type="Metabolite"> + <Graphics CenterX="151.27502573612358" CenterY="496.9845153753352" Width="151.88176471647557" Height="20.0" ZOrder="32768" FontSize="10" Valign="Middle" Color="0000ff" /> + <Xref Database="CAS" ID="358-72-5" /> + </DataNode> + <Interaction GraphId="e5d42"> + <Graphics ZOrder="12288" LineThickness="1.0"> + <Point X="227.21590809436137" Y="496.9845153753352" GraphRef="fce72" RelX="1.0" RelY="0.0" ArrowHead="Arrow" /> + <Point X="299.1427703523694" Y="496.9845153753351" GraphRef="db29a" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> + <Anchor Position="0.504761824415362" Shape="None" GraphId="fd8da" /> + </Graphics> + <Xref Database="" ID="" /> + </Interaction> + <Interaction GraphId="id6b5f2131"> + <Graphics ZOrder="12288" LineThickness="1.0"> + <Point X="263.62037134806815" Y="523.9075111234577" GraphRef="c3b" RelX="0.0" RelY="-1.0" /> + <Point X="263.5218423121859" Y="496.98451537533515" GraphRef="fd8da" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> + </Graphics> + <Xref Database="" ID="" /> + </Interaction> +</Pathway> \ No newline at end of file diff --git a/pathvisio/testFiles/wikipathways/gstp.gpml b/pathvisio/testFiles/wikipathways/gstp.gpml deleted file mode 100644 index 304c78148cd059bee594c4320d2d8f33bdf6439f..0000000000000000000000000000000000000000 --- a/pathvisio/testFiles/wikipathways/gstp.gpml +++ /dev/null @@ -1,2629 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<Pathway xmlns="http://pathvisio.org/GPML/2013a" Name="Generated"> - <Graphics BoardWidth="10030.0" BoardHeight="6030.0" /> - <DataNode TextLabel="GSTP1" GraphId="sa312" Type="Rna"> - <Comment></Comment> - <Graphics CenterX="1161.0" CenterY="973.0" Width="90.0" Height="25.0" ZOrder="32883" FillColor="66ff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="electrophile-SG" GraphId="sa326" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="4601.5" CenterY="2106.5" Width="109.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="pyruvate" GraphId="sa374" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1492.0" CenterY="2471.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GLRX2" GraphId="sa397" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1381.0" CenterY="1994.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PSMA5" GraphId="sa404" Type="Protein" GroupRef="csa14"> - <Comment></Comment> - <Graphics CenterX="1127.0" CenterY="1130.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GCLC" GraphId="sa257" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1470.518796992481" CenterY="1315.6447368421052" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="glucose" GraphId="sa373" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="3606.0" CenterY="2472.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="CAPN1" GraphId="sa379" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="480.0" CenterY="1298.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GSTP1" GraphId="sa394" Type="Protein" GroupRef="csa12"> - <Comment></Comment> - <Graphics CenterX="343.66666666666674" CenterY="1558.5" Width="80.0" Height="40.0" ZOrder="32883" FillColor="00ccff" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="Paraquat-SG" GraphId="sa295" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="2189.5882352941176" CenterY="2037.6176470588236" Width="90.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MTPT" GraphId="sa274" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="3966.0" CenterY="1524.0882352941176" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="pubchem.compound" ID="1388" /> - </DataNode> - <DataNode TextLabel="ROS" GraphId="sa396" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="792.0" CenterY="1714.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:26523" /> - </DataNode> - <DataNode TextLabel="GGT1" GraphId="sa307" Type="GeneProduct"> - <Comment></Comment> - <Graphics CenterX="983.0" CenterY="918.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ffff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PRDX1" GraphId="sa281" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1480.0" CenterY="1770.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="CDK5R1" GraphId="sa386" Type="Protein" GroupRef="csa11"> - <Comment></Comment> - <Graphics CenterX="177.090909090909" CenterY="1376.9870129870126" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MAPK3K5" GraphId="sa413" Type="Protein" GroupRef="csa20"> - <Comment></Comment> - <Graphics CenterX="246.0" CenterY="1803.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="glutathione" GraphId="sa238" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="3348.0" CenterY="1013.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16856" /> - </DataNode> - <DataNode TextLabel="PARK7" GraphId="sa358" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="395.52941176470586" CenterY="2121.9411764705883" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MAPK8" GraphId="sa277" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="696.0" CenterY="1602.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="NFE2L2" GraphId="sa316" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="659.5454545454545" CenterY="791.181818181818" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PRDX2" GraphId="sa383" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="911.1428571428573" CenterY="1223.1428571428573" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="SLC6A3" GraphId="sa264" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1862.0" CenterY="1662.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MPP-SG" GraphId="sa271" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="2193.9411764705883" CenterY="1786.0882352941178" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GSH Depletion" GraphId="sa403" Type="Pathway"> - <Comment></Comment> - <Graphics CenterX="1107.5" CenterY="1247.5" Width="125.0" Height="35.0" ZOrder="32883" FillColor="cc99ff" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="glutathione" GraphId="sa412" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1064.0" CenterY="2300.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16856" /> - </DataNode> - <DataNode TextLabel="MPP+" GraphId="sa398" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="834.0" CenterY="1655.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="pubchem.compound" ID="39484" /> - </DataNode> - <DataNode TextLabel="GGT1" GraphId="sa310" Type="Rna"> - <Comment></Comment> - <Graphics CenterX="1161.0" CenterY="918.0" Width="90.0" Height="25.0" ZOrder="32883" FillColor="66ff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="CDK5R1 (p25)" GraphId="sa392" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="639.6666666666667" CenterY="1320.5" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ffcccc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PRDX6" GraphId="sa407" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1480.0" CenterY="1820.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="SLC7A11" GraphId="sa336" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="4495.666666666667" CenterY="963.6666666666667" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GCLM" GraphId="sa258" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1564.0902255639094" CenterY="1316.2796574770261" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="ROS/RNS" GraphId="sa322" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="574.5454545454545" CenterY="1017.681818181818" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:62764" /> - </DataNode> - <DataNode TextLabel="L-cysteine" GraphId="sa250" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="2286.7142857142862" CenterY="1296.5" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:17561" /> - </DataNode> - <DataNode TextLabel="generic protein" GraphId="sa287" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1210.0" CenterY="1614.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PRKAB1" GraphId="sa408" Type="Protein" GroupRef="csa17"> - <Comment></Comment> - <Graphics CenterX="1302.0" CenterY="2350.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="ANPEP" GraphId="sa247" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1856.0" CenterY="1227.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="UPS" GraphId="sa345"> - <Comment></Comment> - <Graphics CenterX="674.0" CenterY="1072.0" Width="30.0" Height="30.0" ZOrder="32883" FillColor="ffcccc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="pubmed" ID="18990698" /> - </DataNode> - <DataNode TextLabel="glutathione" GraphId="sa406" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1294.0" CenterY="1000.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16856" /> - </DataNode> - <DataNode TextLabel="PRKAB2" GraphId="sa409" Type="Protein" GroupRef="csa17"> - <Comment></Comment> - <Graphics CenterX="1304.0" CenterY="2394.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GSH/GSSG ratio" GraphId="sa401" Type="Pathway"> - <Comment></Comment> - <Graphics CenterX="1136.0" CenterY="1312.0" Width="126.0" Height="38.0" ZOrder="32883" FillColor="cc99ff" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="generic protein" GraphId="sa289" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1211.625" CenterY="1862.375" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="generic protein" GraphId="sa284" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="2190.875" CenterY="1882.375" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="glucose" GraphId="sa372" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="4608.0" CenterY="2468.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="ABCB1" GraphId="sa241" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="2380.0" CenterY="951.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="Paraquat" GraphId="sa292" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="834.0" CenterY="2034.0" Width="80.0" Height="30.0" ZOrder="32883" FillColor="ff00ff" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:34905" /> - </DataNode> - <DataNode TextLabel="electrophile-SG" GraphId="sa297" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1167.5" CenterY="2114.0" Width="109.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="SLC1A1" GraphId="sa309" Type="Rna"> - <Comment></Comment> - <Graphics CenterX="1161.0" CenterY="865.0" Width="90.0" Height="25.0" ZOrder="32883" FillColor="66ff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="KEAP1" GraphId="sa300" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="540.0" CenterY="836.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MAPK8" GraphId="sa278" Type="Protein" GroupRef="csa3"> - <Comment></Comment> - <Graphics CenterX="680.875" CenterY="1730.3750000000002" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PSMA5" GraphId="sa405" Type="Protein" GroupRef="csa15"> - <Comment></Comment> - <Graphics CenterX="1362.5" CenterY="1069.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GSS" GraphId="sa236" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="3428.0" CenterY="950.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MAOB" GraphId="sa276" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="3870.0" CenterY="1468.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MAP3K5" GraphId="sa361" Type="Protein" GroupRef="csa9"> - <Comment></Comment> - <Graphics CenterX="682.5294117647059" CenterY="2161.9411764705883" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="glutathione disulfide" GraphId="sa286" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1211.5" CenterY="1929.5" Width="85.0" Height="40.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:17858" /> - </DataNode> - <DataNode TextLabel="GSS" GraphId="sa308" Type="Rna"> - <Comment></Comment> - <Graphics CenterX="1161.0" CenterY="817.0" Width="90.0" Height="25.0" ZOrder="32883" FillColor="66ff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GSTP1" GraphId="sa352" Type="Protein" GroupRef="csa7"> - <Comment></Comment> - <Graphics CenterX="1001.0" CenterY="1768.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="00ccff" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="glutathione" GraphId="sa419" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1479.0" CenterY="966.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16856" /> - </DataNode> - <DataNode TextLabel="MPP-SG" GraphId="sa270" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1640.0" CenterY="1788.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="lactate" GraphId="sa366" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="2536.0" CenterY="2471.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="cystine" GraphId="sa229" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="4232.857142857143" CenterY="888.134920634921" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16283" /> - </DataNode> - <DataNode TextLabel="electrophile-SG" GraphId="sa325" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="3600.5" CenterY="2110.5" Width="109.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GSR" GraphId="sa400" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1125.0" CenterY="1467.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="L-glutamic acid" GraphId="sa227" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="4249.857142857143" CenterY="1014.134920634921" Width="102.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16015" /> - </DataNode> - <DataNode TextLabel="yGluCys" GraphId="sa256" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1437.375939849624" CenterY="1383.2796574770261" Width="70.0" Height="40.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:17515" /> - </DataNode> - <DataNode TextLabel="MPP+" GraphId="sa275" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="3771.0" CenterY="1528.0882352941176" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="pubchem.compound" ID="39484" /> - </DataNode> - <DataNode TextLabel="Paraquat-SG" GraphId="sa294" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1161.0" CenterY="2035.0" Width="90.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MPP+" GraphId="sa265" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="2322.75" CenterY="1528.75" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="pubchem.compound" ID="39484" /> - </DataNode> - <DataNode TextLabel="GLRX" GraphId="sa346" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1410.0" CenterY="1946.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="DAXX" GraphId="sa362" Type="Protein" GroupRef="csa9"> - <Comment></Comment> - <Graphics CenterX="679.5294117647059" CenterY="2113.9411764705883" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="lactate" GraphId="sa367" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1683.0" CenterY="2470.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="SLC3A2" GraphId="sa338" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="4104.0" CenterY="821.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GSTP1" GraphId="sa266" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="914.0" CenterY="1544.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="00ccff" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="TRAF2" GraphId="sa353" Type="Protein" GroupRef="csa7"> - <Comment></Comment> - <Graphics CenterX="1001.0" CenterY="1720.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PARK7" GraphId="sa314" Type="Protein" GroupRef="csa5"> - <Comment></Comment> - <Graphics CenterX="341.5454545454545" CenterY="1093.181818181818" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="L-cysteine" GraphId="sa376" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="3907.0" CenterY="962.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:17561" /> - </DataNode> - <DataNode TextLabel="glutathione" GraphId="sa254" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1204.018796992481" CenterY="1380.6447368421052" Width="83.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16856" /> - </DataNode> - <DataNode TextLabel="L-glutamic acid" GraphId="sa226" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="3905.357142857143" CenterY="1052.634920634921" Width="97.0" Height="28.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16015" /> - </DataNode> - <DataNode TextLabel="GCLM" GraphId="sa234" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="3789.5714285714284" CenterY="946.634920634921" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MTPT" GraphId="sa272" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="4620.0" CenterY="1522.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GCLC" GraphId="sa235" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="3691.0" CenterY="947.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="ROS/RNS" GraphId="sa321" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="429.5454545454545" CenterY="986.681818181818" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:62764" /> - </DataNode> - <DataNode TextLabel="MPP-SG" GraphId="sa330" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="4595.0" CenterY="1785.5" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="Apotosis" GraphId="sa335" Type="Pathway"> - <Comment></Comment> - <Graphics CenterX="446.0" CenterY="1799.0" Width="80.0" Height="30.0" ZOrder="32883" FillColor="cc99ff" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.go" ID="GO:0006915" /> - </DataNode> - <DataNode TextLabel="glutathione" GraphId="sa267" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1533.4411764705883" CenterY="1645.0882352941178" Width="89.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16856" /> - </DataNode> - <DataNode TextLabel="GLUT?" GraphId="sa369" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="2391.0" CenterY="2535.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="Proliferation" GraphId="sa377" Type="Pathway"> - <Comment></Comment> - <Graphics CenterX="543.0" CenterY="1829.0" Width="80.0" Height="30.0" ZOrder="32883" FillColor="cc99ff" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.go" ID="GO:0014009" /> - </DataNode> - <DataNode TextLabel="yGluCys" GraphId="sa228" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="3589.857142857143" CenterY="1013.134920634921" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:17515" /> - </DataNode> - <DataNode TextLabel="SLC7A11" GraphId="sa225" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="4099.0" CenterY="970.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="glutathione" GraphId="sa420" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1642.0" CenterY="869.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16856" /> - </DataNode> - <DataNode TextLabel="glycine" GraphId="sa259" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1329.518796992481" CenterY="1427.6447368421052" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:15428" /> - </DataNode> - <DataNode TextLabel="PRKAB1" GraphId="sa411" Type="Protein" GroupRef="csa19"> - <Comment></Comment> - <Graphics CenterX="928.25" CenterY="2343.5" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GGT1" GraphId="sa242" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="2388.0" CenterY="1089.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="cystine" GraphId="sa224" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="4021.0" CenterY="911.5" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16283" /> - </DataNode> - <DataNode TextLabel="L-glutamic acid" GraphId="sa230" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="4012.357142857143" CenterY="1027.134920634921" Width="99.0" Height="29.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16015" /> - </DataNode> - <DataNode TextLabel="glutathione disulfide" GraphId="sa399" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1037.0" CenterY="1390.5" Width="78.0" Height="44.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:17858" /> - </DataNode> - <DataNode TextLabel="L-cysteine" GraphId="sa260" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1705.518796992481" CenterY="1297.1447368421052" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:17561" /> - </DataNode> - <DataNode TextLabel="E1/E2 domain " GraphId="sa402" Type="Protein" GroupRef="csa13"> - <Comment></Comment> - <Graphics CenterX="1385.5" CenterY="1210.0" Width="95.0" Height="48.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="glycine" GraphId="sa239" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="3507.0" CenterY="1090.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:15428" /> - </DataNode> - <DataNode TextLabel="GSS" GraphId="sa306" Type="GeneProduct"> - <Comment></Comment> - <Graphics CenterX="983.0" CenterY="818.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ffff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="CDK5R1" GraphId="sa389" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="216.66666666666674" CenterY="1501.5" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MPP+" GraphId="sa395" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="377.66666666666674" CenterY="1294.3333333333335" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="pubchem.compound" ID="39484" /> - </DataNode> - <DataNode TextLabel="Paraquat-SG" GraphId="sa324" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="4596.0" CenterY="2031.5" Width="90.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="generic proteine" GraphId="sa327" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="3594.0" CenterY="1881.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="CDK5" GraphId="sa393" Type="Protein" GroupRef="csa12"> - <Comment></Comment> - <Graphics CenterX="345.66666666666674" CenterY="1509.5" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MPP+" GraphId="sa263" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1642.0" CenterY="1528.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="pubchem.compound" ID="39484" /> - </DataNode> - <DataNode TextLabel="ABCB1" GraphId="sa348" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="4099.0" CenterY="2202.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="JUN" GraphId="sa334" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="550.0" CenterY="1708.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="CDK5" GraphId="sa387" Type="Protein" GroupRef="csa11"> - <Comment></Comment> - <Graphics CenterX="178.090909090909" CenterY="1327.9870129870126" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="ROS/RNS" GraphId="sa288" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1241.0" CenterY="1508.5" Width="86.0" Height="38.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:62764" /> - </DataNode> - <DataNode TextLabel="KEAP1" GraphId="sa303" Type="Protein" GroupRef="csa4"> - <Comment></Comment> - <Graphics CenterX="216.5454545454545" CenterY="851.181818181818" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="JUN" GraphId="sa332" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="552.0" CenterY="1581.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PRDX2" GraphId="sa382" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="636.0" CenterY="1223.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MRP5" GraphId="sa291" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="4100.0" CenterY="2067.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GSTP1" GraphId="sa279" Type="Protein" GroupRef="csa3"> - <Comment></Comment> - <Graphics CenterX="679.875" CenterY="1778.3750000000002" Width="80.0" Height="40.0" ZOrder="32883" FillColor="00ccff" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PARK7" GraphId="sa302" Type="Protein" GroupRef="csa4"> - <Comment></Comment> - <Graphics CenterX="216.5454545454545" CenterY="803.181818181818" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MPP-SG" GraphId="sa329" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="3607.0" CenterY="1789.5" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="UPS" GraphId="sa340"> - <Comment></Comment> - <Graphics CenterX="1528.0" CenterY="1606.0" Width="30.0" Height="30.0" ZOrder="32883" FillColor="ffcccc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="pubmed" ID="18990698" /> - </DataNode> - <DataNode TextLabel="TRAF2" GraphId="sa354" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="823.1176470588234" CenterY="1812.7058823529412" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="cystine" GraphId="sa251" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="4397.9473684210525" CenterY="888.6954887218044" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16283" /> - </DataNode> - <DataNode TextLabel="CDK5" GraphId="sa385" Type="Protein" GroupRef="csa10"> - <Comment></Comment> - <Graphics CenterX="772.1428571428573" CenterY="1328.1428571428573" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GSH Depletion" GraphId="sa421" Type="Pathway"> - <Comment></Comment> - <Graphics CenterX="1658.3571428571431" CenterY="1960.2142857142858" Width="125.0" Height="35.0" ZOrder="32883" FillColor="cc99ff" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="SLC7A5" GraphId="sa337" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="4309.0" CenterY="961.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="CysGly" GraphId="sa244" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="2286.0" CenterY="1157.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:4047" /> - </DataNode> - <DataNode TextLabel="DAXX" GraphId="sa356" Type="Protein" GroupRef="csa8"> - <Comment></Comment> - <Graphics CenterX="277.0" CenterY="2062.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="generic protein" GraphId="sa283" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1413.0" CenterY="1883.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="TXN" GraphId="sa317" Type="GeneProduct"> - <Comment></Comment> - <Graphics CenterX="983.0" CenterY="1022.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ffff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="glutathione" GraphId="sa351" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="965.25" CenterY="2215.5" Width="95.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16856" /> - </DataNode> - <DataNode TextLabel="TXN" GraphId="sa414" Type="Protein" GroupRef="csa20"> - <Comment></Comment> - <Graphics CenterX="247.0" CenterY="1757.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MAP3K5" GraphId="sa355" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="733.0" CenterY="1951.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="ROS" GraphId="sa360" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="402.0" CenterY="1927.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:26523" /> - </DataNode> - <DataNode TextLabel="PARK7" GraphId="sa319" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="518.5454545454545" CenterY="912.181818181818" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="DAXX" GraphId="sa313" Type="Protein" GroupRef="csa5"> - <Comment></Comment> - <Graphics CenterX="341.0" CenterY="1141.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GLUT?" GraphId="sa370" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1859.0454545454545" CenterY="2540.727272727273" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="DAXX" GraphId="sa315" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="227.5454545454545" CenterY="982.181818181818" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GSTP1" GraphId="sa220" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1155.7777777777774" CenterY="1711.0" Width="86.0" Height="46.0" ZOrder="32883" FillColor="00ccff" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PARK7" GraphId="sa320" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="674.5454545454545" CenterY="911.181818181818" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="L-glutamic acid" GraphId="sa261" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="1717.875939849624" CenterY="1377.2796574770261" Width="101.0" Height="24.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16015" /> - </DataNode> - <DataNode TextLabel="SLC1A1" GraphId="sa304" Type="GeneProduct"> - <Comment></Comment> - <Graphics CenterX="983.0" CenterY="866.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ffff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="CDK5R1 (p25)" GraphId="sa384" Type="Protein" GroupRef="csa10"> - <Comment></Comment> - <Graphics CenterX="773.1428571428573" CenterY="1380.1428571428573" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ffcccc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="generic proteine" GraphId="sa328" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="4598.0" CenterY="1880.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="electrophile-SG" GraphId="sa298" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="2198.970588235294" CenterY="2114.735294117647" Width="109.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="SLC1A1" GraphId="sa253" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1863.0" CenterY="1393.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="TRX" GraphId="sa415" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="663.0" CenterY="1885.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PARK7" GraphId="sa301" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="343.0" CenterY="912.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="Paraquat-SG" GraphId="sa323" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="3599.0" CenterY="2039.5" Width="90.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="GSTP1" GraphId="sa311" Type="GeneProduct"> - <Comment></Comment> - <Graphics CenterX="983.0" CenterY="971.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ffff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="MRP1" GraphId="sa290" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="4097.0" CenterY="1945.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="NFE2L2" GraphId="sa299" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="842.0" CenterY="839.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:45454" /> - </DataNode> - <DataNode TextLabel="cystine" GraphId="sa252" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="4591.9473684210525" CenterY="887.6954887218044" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16283" /> - </DataNode> - <DataNode TextLabel="GSS" GraphId="sa255" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1284.518796992481" CenterY="1317.6447368421052" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="electrophile" GraphId="sa296" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="833.0" CenterY="2118.0" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="SLC25A10" GraphId="sa417" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1763.0" CenterY="976.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="TXN" GraphId="sa318" Type="Rna"> - <Comment></Comment> - <Graphics CenterX="1161.0" CenterY="1022.0" Width="90.0" Height="25.0" ZOrder="32883" FillColor="66ff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="TRX" GraphId="sa347" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1294.0" CenterY="1981.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="glutathione" GraphId="sa293" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="962.0882352941176" CenterY="2074.6176470588234" Width="89.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16856" /> - </DataNode> - <DataNode TextLabel="electrophile" GraphId="sa350" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="832.75" CenterY="2167.5" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="CDK5" GraphId="sa390" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="473.66666666666674" CenterY="1427.5" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PARK7" GraphId="sa357" Type="Protein" GroupRef="csa8"> - <Comment></Comment> - <Graphics CenterX="277.0" CenterY="2017.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="glutathione" GraphId="sa240" Type="Metabolite"> - <Comment></Comment> - <Graphics CenterX="2284.1428571428573" CenterY="1014.5" Width="70.0" Height="25.0" ZOrder="32883" FillColor="ccff66" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.chebi" ID="CHEBI:16856" /> - </DataNode> - <DataNode TextLabel="generic protein" GraphId="sa282" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1412.0" CenterY="1615.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="PRKAB2" GraphId="sa410" Type="Protein" GroupRef="csa19"> - <Comment></Comment> - <Graphics CenterX="928.25" CenterY="2388.5" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="Apotosis" GraphId="sa363" Type="Pathway"> - <Comment></Comment> - <Graphics CenterX="682.5294117647059" CenterY="2294.9411764705883" Width="80.0" Height="30.0" ZOrder="32883" FillColor="cc99ff" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="obo.go" ID="GO:0006915" /> - </DataNode> - <DataNode TextLabel="GLUT1" GraphId="sa371" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="4102.0" CenterY="2554.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="DAXX" GraphId="sa359" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="494.52941176470586" CenterY="2050.9411764705883" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="SLC25A11" GraphId="sa418" Type="Protein"> - <Comment></Comment> - <Graphics CenterX="1760.0" CenterY="920.0" Width="80.0" Height="40.0" ZOrder="32883" FillColor="ccffcc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="UPS" GraphId="sa331"> - <Comment></Comment> - <Graphics CenterX="1046.0" CenterY="1536.0" Width="30.0" Height="30.0" ZOrder="32883" FillColor="ffcccc" FontSize="10" Valign="Middle" Color="0000ff" /> - <Xref Database="pubmed" ID="18990698" /> - </DataNode> - <DataNode TextLabel="MRP/ABCC" GraphId="csa6" Type="Complex"> - <Graphics CenterX="1874.0" CenterY="2275.5" Width="84.0" Height="79.0" ZOrder="32883" FillColor="ffffcc" FontSize="10" Valign="Middle" LineStyle="Broken" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <DataNode TextLabel="Complex I" GraphId="csa2" Type="Complex"> - <Graphics CenterX="1640.5" CenterY="1053.5" Width="73.0" Height="51.0" ZOrder="32883" FillColor="ffffcc" FontSize="10" Valign="Middle" LineStyle="Broken" Color="0000ff" /> - <Xref Database="" ID="" /> - </DataNode> - <Interaction GraphId="re7"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3313.0" Y="1013.0" GraphRef="sa238" RelX="-1.0" RelY="0.0" /> - <Point X="2319.1428571428573" Y="1014.5" GraphRef="sa240" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5050559555858475" Shape="None" GraphId="id10001" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10002"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2380.0" Y="971.0" GraphRef="sa241" RelX="0.0" RelY="1.0" /> - <Point X="2811.0465309984656" Y="1013.7575839333788" GraphRef="id10001" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re74"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="682.0" Y="2189.9411764705883" GraphRef="csa9" RelX="0.019607843137255443" RelY="1.0" /> - <Point X="682.5294117647059" Y="2279.9411764705883" GraphRef="sa363" RelX="0.0" RelY="-1.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re30"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1250.0" Y="1614.0" GraphRef="sa287" RelX="1.0" RelY="0.0" /> - <Point X="1372.0" Y="1615.0" GraphRef="sa282" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5016767317349492" Shape="None" GraphId="id10003" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10004"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1257.4553875916988" Y="1526.0537111177146" GraphRef="sa288" RelX="0.38268343236508856" RelY="0.9238795325112924" /> - <Point X="1311.2045612716638" Y="1614.501676731735" GraphRef="id10003" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re18"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1675.0" Y="1788.0" GraphRef="sa270" RelX="1.0" RelY="0.0" /> - <Point X="2158.9411764705883" Y="1786.0882352941178" GraphRef="sa271" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.4897772316848099" Shape="None" GraphId="id10005" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10006"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1853.0" Y="2236.0" GraphRef="csa6" RelX="-0.5" RelY="-1.0" /> - <Point X="1912.0233697100548" Y="1787.0636611747202" GraphRef="id10005" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re61"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="510.0" Y="1728.0" GraphRef="sa334" RelX="-1.0" RelY="1.0" /> - <Point X="459.33333333333337" Y="1784.0" GraphRef="sa335" RelX="0.33333333333333426" RelY="-1.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re32"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1373.0" Y="1883.0" GraphRef="sa283" RelX="-1.0" RelY="0.0" /> - <Point X="1312.5" Y="1882.9999999999998" /> - <Point X="1251.625" Y="1862.375" GraphRef="sa289" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.4848763796637738" Shape="None" GraphId="id10007" /> - <Anchor Position="0.7306040243855229" Shape="None" GraphId="id10009" /> - <Anchor Position="0.770214860629146" Shape="None" GraphId="id10011" /> - <Anchor Position="0.7306040243855229" Shape="None" GraphId="id10013" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10008"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1312.5" Y="1882.9999999999998" GraphRef="id10007" RelX="0.0" RelY="0.0" /> - <Point X="1250.7648801317296" Y="1921.8463313526981" GraphRef="sa286" RelX="0.923879532511284" RelY="-0.38268343236509283" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10010"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1390.0" Y="1926.0" GraphRef="sa346" RelX="-0.5" RelY="-1.0" /> - <Point X="1342.75" Y="1878.0" /> - <Point X="1283.4610086163923" Y="1873.1613273546297" GraphRef="id10009" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10012"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1294.0" Y="1961.0" GraphRef="sa347" RelX="0.0" RelY="-1.0" /> - <Point X="1337.75" Y="1878.0" /> - <Point X="1278.7799775761991" Y="1871.5753517455294" GraphRef="id10011" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10014"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1361.0" Y="1974.0" GraphRef="sa397" RelX="-0.5" RelY="-1.0" /> - <Point X="1342.75" Y="1888.0" /> - <Point X="1283.4610086163923" Y="1873.1613273546297" GraphRef="id10013" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re16"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2287.75" Y="1528.75" GraphRef="sa265" RelX="-1.0" RelY="0.0" /> - <Point X="1677.0" Y="1528.0" GraphRef="sa263" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5000670167400771" Shape="None" GraphId="id10015" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10016"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1862.0" Y="1642.0" GraphRef="sa264" RelX="0.0" RelY="-1.0" /> - <Point X="1982.3340695259978" Y="1528.374949737445" GraphRef="id10015" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re25"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="874.0" Y="1554.0" GraphRef="sa266" RelX="-1.0" RelY="0.5" /> - <Point X="679.0" Y="1706.0" GraphRef="csa3" RelX="-0.028350515463917526" RelY="-0.9302884615384659" ArrowHead="mim-conversion" /> - <Anchor Position="0.32034208514337853" Shape="None" GraphId="id10017" /> - <Anchor Position="0.6465231978103948" Shape="None" GraphId="id10019" /> - <Anchor Position="0.6277490587052114" Shape="None" GraphId="id10021" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10018"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="736.0" Y="1602.0" GraphRef="sa277" RelX="1.0" RelY="0.0" /> - <Point X="811.0000000000011" Y="1601.999999999999" GraphRef="id10017" RelX="-0.5332933970400973" RelY="-0.691996941794514" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10020"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="767.2512626584709" Y="1705.1611652351683" GraphRef="sa396" RelX="-0.7071067811865467" RelY="-0.7071067811865396" /> - <Point X="747.927976426973" Y="1652.27152606718" GraphRef="id10019" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10022"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="799.0" Y="1655.0" GraphRef="sa398" RelX="-1.0" RelY="0.0" /> - <Point X="751.5889335524838" Y="1649.4178569231922" GraphRef="id10021" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re33"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="962.0882352941176" Y="2062.1176470588234" GraphRef="sa293" RelX="0.0" RelY="-1.0" /> - <Point X="963.29411764706" Y="2034.9999999999998" /> - <Point X="1116.0" Y="2035.0" GraphRef="sa294" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.15092797451923595" Shape="None" GraphId="id10023" /> - <Anchor Position="0.5763732892771269" Shape="None" GraphId="id10025" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10024"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="874.0" Y="2034.0" GraphRef="sa292" RelX="1.0" RelY="0.0" /> - <Point X="963.29411764706" Y="2034.9999999999998" GraphRef="id10023" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10026"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1112.7777777777774" Y="1728.0" GraphRef="sa220" RelX="-1.0" RelY="0.7391304347826086" /> - <Point X="1039.81059708971" Y="2035.0" GraphRef="id10025" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re111"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1503.7487373415292" Y="957.1611652351681" GraphRef="sa419" RelX="0.70710678118655" RelY="-0.7071067811865487" /> - <Point X="1628.6060798672218" Y="880.548494156391" GraphRef="sa420" RelX="-0.38268343236509283" RelY="0.9238795325112824" ArrowHead="mim-conversion" /> - <Anchor Position="0.5352218520083318" Shape="None" GraphId="id10027" /> - <Anchor Position="0.46711631261061937" Shape="None" GraphId="id10029" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10028"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1720.0" Y="920.0" GraphRef="sa418" RelX="-1.0" RelY="0.0" /> - <Point X="1570.575115444969" Y="916.1563895330798" GraphRef="id10027" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10030"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1723.0" Y="986.0" GraphRef="sa417" RelX="-1.0" RelY="0.5" /> - <Point X="1562.0716387844918" Y="921.3741368215996" GraphRef="id10029" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re11"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1673.183013354586" Y="1301.9282797466687" GraphRef="sa260" RelX="-0.9238795325112863" RelY="0.38268343236508373" /> - <Point X="1600.3759398496256" Y="1376.9282797466683" /> - <Point X="1469.711723487519" Y="1375.6259888297243" GraphRef="sa256" RelX="0.9238795325112863" RelY="-0.38268343236509283" ArrowHead="mim-conversion" /> - <Anchor Position="0.444421583023901" Shape="None" GraphId="id10031" /> - <Anchor Position="0.7442241803576288" Shape="None" GraphId="id10033" /> - <Anchor Position="0.7018314200851412" Shape="None" GraphId="id10035" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10032"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1667.375939849624" Y="1377.2796574770261" GraphRef="sa261" RelX="-1.0" RelY="0.0" /> - <Point X="1600.3759398496256" Y="1376.9282797466683" GraphRef="id10031" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10034"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1564.0902255639094" Y="1336.2796574770261" GraphRef="sa258" RelX="0.0" RelY="1.0" /> - <Point X="1529.8665927494467" Y="1376.2255343061436" GraphRef="id10033" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10036"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1470.518796992481" Y="1335.6447368421052" GraphRef="sa257" RelX="0.0" RelY="1.0" /> - <Point X="1539.8367727117643" Y="1376.3249040889864" GraphRef="id10035" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re49"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="558.5454545454545" Y="912.181818181818" GraphRef="sa319" RelX="1.0" RelY="0.0" /> - <Point X="634.5454545454545" Y="911.181818181818" GraphRef="sa320" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5043089386732678" Shape="None" GraphId="id10037" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10038"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="574.5454545454545" Y="1005.181818181818" GraphRef="sa322" RelX="0.0" RelY="-1.0" /> - <Point X="596.8729338846229" Y="911.6775092431448" GraphRef="id10037" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re14"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1655.3939201327782" Y="1516.4515058436089" GraphRef="sa263" RelX="0.38268343236509283" RelY="-0.9238795325112915" /> - <Point X="1840.3729394972438" Y="1414.4486383657968" GraphRef="sa253" RelX="-0.5656765125689048" RelY="1.0724319182898399" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re60"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="552.0" Y="1601.0" GraphRef="sa332" RelX="0.0" RelY="1.0" /> - <Point X="550.0" Y="1688.0" GraphRef="sa334" RelX="0.0" RelY="-1.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5032903750693" Shape="None" GraphId="id10039" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10040"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="656.0" Y="1602.0" GraphRef="sa277" RelX="-1.0" RelY="0.0" /> - <Point X="550.9934192498614" Y="1644.786262631029" GraphRef="id10039" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re47"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1018.0" Y="1022.0" GraphRef="sa317" RelX="1.0" RelY="0.0" /> - <Point X="1127.25" Y="1022.0" /> - <Point X="1116.0" Y="1022.0" GraphRef="sa318" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.4139108142497064" Shape="None" GraphId="id10041" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10042"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="882.0" Y="839.0" GraphRef="sa299" RelX="1.0" RelY="0.0" /> - <Point X="1067.8762531170896" Y="1022.0" GraphRef="id10041" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re118"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2148.619153713429" Y="2109.9517512130833" GraphRef="sa298" RelX="-0.923879532511285" RelY="-0.38268343236508373" /> - <Point X="1720.8571428571431" Y="1960.2142857142858" GraphRef="sa421" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re36"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="868.0" Y="2118.0" GraphRef="sa296" RelX="1.0" RelY="0.0" /> - <Point X="1113.0" Y="2114.0" GraphRef="sa297" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.39228588314475404" Shape="None" GraphId="id10043" /> - <Anchor Position="0.6958861494762144" Shape="None" GraphId="id10045" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10044"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="962.0882352941176" Y="2087.1176470588234" GraphRef="sa293" RelX="0.0" RelY="1.0" /> - <Point X="964.1176480343661" Y="2118.9999999999995" GraphRef="id10043" RelX="0.007606663901356114" RelY="2.569143532578437" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10046"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1132.7777777777774" Y="1728.0" GraphRef="sa220" RelX="-0.5348837209302325" RelY="0.7391304347826086" /> - <Point X="1038.4921066216725" Y="2115.216455402095" GraphRef="id10045" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re6"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3507.0" Y="1077.5" GraphRef="sa239" RelX="0.0" RelY="-1.0" /> - <Point X="3507.2510629899216" Y="1015.0000000000006" /> - <Point X="3383.0" Y="1013.0" GraphRef="sa238" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.334643071358157" Shape="None" GraphId="id10047" /> - <Anchor Position="0.6950883255682911" Shape="None" GraphId="id10049" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10048"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3554.857142857143" Y="1013.134920634921" GraphRef="sa228" RelX="-1.0" RelY="0.0" /> - <Point X="3507.2510629899216" Y="1015.0000000000006" GraphRef="id10047" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10050"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3428.0" Y="970.0" GraphRef="sa236" RelX="0.0" RelY="1.0" /> - <Point X="3439.9402647440834" Y="1013.9165356556945" GraphRef="id10049" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re52"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2234.5882352941176" Y="2037.6176470588236" GraphRef="sa295" RelX="1.0" RelY="1.818989403545873E-14" /> - <Point X="3554.0" Y="2039.5" GraphRef="sa323" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re67"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="674.5454545454545" Y="931.181818181818" GraphRef="sa320" RelX="0.0" RelY="1.0" /> - <Point X="674.0" Y="1064.0" GraphRef="sa345" RelX="0.0" RelY="-0.5333333333333333" ArrowHead="mim-conversion" /> - <Anchor Position="0.4638848789151732" Shape="None" GraphId="id10051" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10052"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="609.5454545454545" Y="1017.681818181818" GraphRef="sa322" RelX="1.0" RelY="0.0" /> - <Point X="674.2924264296826" Y="992.7941643722788" GraphRef="id10051" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re12"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1329.518796992481" Y="1415.1447368421052" GraphRef="sa259" RelX="0.0" RelY="-1.0" /> - <Point X="1331.7698599824007" Y="1381.6447368421057" /> - <Point X="1245.518796992481" Y="1380.6447368421052" GraphRef="sa254" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.28018753123878637" Shape="None" GraphId="id10053" /> - <Anchor Position="0.6839802643266089" Shape="None" GraphId="id10055" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10054"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1402.375939849624" Y="1383.2796574770261" GraphRef="sa256" RelX="-1.0" RelY="0.0" /> - <Point X="1331.7698599824007" Y="1381.6447368421057" GraphRef="id10053" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10056"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1284.518796992481" Y="1337.6447368421052" GraphRef="sa255" RelX="0.0" RelY="1.0" /> - <Point X="1283.3856571964066" Y="1381.0837674915983" GraphRef="id10055" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re9"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2286.0" Y="1169.5" GraphRef="sa244" RelX="0.0" RelY="1.0" /> - <Point X="2286.7142857142862" Y="1284.0" GraphRef="sa250" RelX="0.0" RelY="-1.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5019032084930475" Shape="None" GraphId="id10057" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10058"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1896.0" Y="1227.0" GraphRef="sa247" RelX="1.0" RelY="0.0" /> - <Point X="2286.358502291781" Y="1226.967917372454" GraphRef="id10057" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re70"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="914.0" Y="1564.0" GraphRef="sa266" RelX="0.0" RelY="1.0" /> - <Point X="853.117647058824" Y="1736.0000000000011" /> - <Point X="949.0" Y="1755.0" GraphRef="csa7" RelX="-1.0833333333333333" RelY="0.21153846153846154" ArrowHead="mim-conversion" /> - <Anchor Position="0.6511586820802163" Shape="None" GraphId="id10059" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10060"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="823.1176470588234" Y="1792.7058823529412" GraphRef="sa354" RelX="0.0" RelY="-1.0" /> - <Point X="853.117647058824" Y="1736.0000000000011" GraphRef="id10059" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re94"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="226.090909090909" Y="1404.9870129870126" GraphRef="csa11" RelX="1.0" RelY="1.0" /> - <Point X="229.0" Y="1430.0" /> - <Point X="351.49999999999903" Y="1428.5000000000005" /> - <Point X="236.66666666666674" Y="1481.5" GraphRef="sa389" RelX="0.5" RelY="-1.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5386932968881721" Shape="None" GraphId="id10061" /> - <Anchor Position="0.7810401491546461" Shape="None" GraphId="id10063" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10062"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="351.49999999999903" Y="1428.5000000000005" GraphRef="id10061" RelX="0.0" RelY="0.0" /> - <Point X="433.66666666666674" Y="1427.5" GraphRef="sa390" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10064"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="874.0" Y="1534.0" GraphRef="sa266" RelX="-1.0" RelY="-0.5" /> - <Point X="295.31084509871926" Y="1434.1884052979444" /> - <Point X="291.1724637191019" Y="1456.3434782834915" GraphRef="id10063" RelX="5.6843418860808015E-14" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re72"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="329.0" Y="2049.5" GraphRef="csa8" RelX="1.0833333333333333" RelY="0.19801980198019803" /> - <Point X="395.7647058823537" Y="2051.0000000000005" /> - <Point X="395.52941176470586" Y="2101.9411764705883" GraphRef="sa358" RelX="0.0" RelY="-1.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5672757118741708" Shape="None" GraphId="id10065" /> - <Anchor Position="0.854075895477922" Shape="None" GraphId="id10067" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10066"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="395.7647058823537" Y="2051.0000000000005" GraphRef="id10065" RelX="0.0" RelY="0.0" /> - <Point X="454.52941176470586" Y="2050.9411764705883" GraphRef="sa359" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10068"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="402.0" Y="1939.5" GraphRef="sa360" RelX="0.0" RelY="1.0" /> - <Point X="362.4946594023683" Y="2045.2512614332438" /> - <Point X="395.6087580929783" Y="2084.7626963996704" GraphRef="id10067" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re29"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1453.0" Y="1883.0" GraphRef="sa283" RelX="1.0" RelY="0.0" /> - <Point X="2150.875" Y="1882.375" GraphRef="sa284" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5072152078448142" Shape="None" GraphId="id10069" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10070"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1832.0" Y="2236.0" GraphRef="csa6" RelX="-1.0" RelY="-1.0" /> - <Point X="1806.9728131746997" Y="1882.682990495097" GraphRef="id10069" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re76"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3571.0" Y="2472.0" GraphRef="sa373" RelX="-1.0" RelY="0.0" /> - <Point X="2571.0" Y="2471.0" GraphRef="sa366" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re116"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2157.768430140723" Y="2028.778812293992" GraphRef="sa295" RelX="-0.7071067811865457" RelY="-0.7071067811865278" /> - <Point X="1720.8571428571431" Y="1960.2142857142858" GraphRef="sa421" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re41"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1018.0" Y="818.0" GraphRef="sa306" RelX="1.0" RelY="0.0" /> - <Point X="1127.25" Y="817.0" /> - <Point X="1116.0" Y="817.0" GraphRef="sa308" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.4552161914560297" Shape="None" GraphId="id10071" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10072"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="882.0" Y="839.0" GraphRef="sa299" RelX="1.0" RelY="0.0" /> - <Point X="1072.8533365493356" Y="817.4979099629352" GraphRef="id10071" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re89"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="500.0" Y="836.0" GraphRef="sa300" RelX="-1.0" RelY="0.0" /> - <Point X="269.0" Y="836.0" GraphRef="csa4" RelX="1.0928030303030312" RelY="0.16958041958042275" ArrowHead="mim-conversion" /> - <Anchor Position="0.42621107329991975" Shape="None" GraphId="id10073" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10074"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="478.5454545454545" Y="892.181818181818" GraphRef="sa319" RelX="-1.0" RelY="-1.0" /> - <Point X="401.5454545454545" Y="835.7954545454543" GraphRef="id10073" RelX="2.124777359995278E-4" RelY="-0.20454545454572326" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re43"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1018.0" Y="918.0" GraphRef="sa307" RelX="1.0" RelY="0.0" /> - <Point X="1127.25" Y="918.0" /> - <Point X="1116.0" Y="918.0" GraphRef="sa310" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.45521456962895257" Shape="None" GraphId="id10075" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10076"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="882.0" Y="839.0" GraphRef="sa299" RelX="1.0" RelY="0.0" /> - <Point X="1072.8533556402888" Y="918.0" GraphRef="id10075" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re45"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="659.5454545454545" Y="811.181818181818" GraphRef="sa316" RelX="0.0" RelY="1.0" /> - <Point X="802.0" Y="839.0" GraphRef="sa299" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.44070193610908515" Shape="None" GraphId="id10077" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10078"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="580.0" Y="836.0" GraphRef="sa300" RelX="1.0" RelY="0.0" /> - <Point X="722.3254485348124" Y="823.4413447681254" GraphRef="id10077" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re48"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="383.0" Y="912.0" GraphRef="sa301" RelX="1.0" RelY="0.0" /> - <Point X="478.5454545454545" Y="912.181818181818" GraphRef="sa319" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5027310767145677" Shape="None" GraphId="id10079" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10080"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="429.5454545454545" Y="974.181818181818" GraphRef="sa321" RelX="0.0" RelY="-1.0" /> - <Point X="431.03366923881913" Y="912.0914056503117" GraphRef="id10079" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re83"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="550.0" Y="1728.0" GraphRef="sa334" RelX="0.0" RelY="1.0" /> - <Point X="543.0" Y="1814.0" GraphRef="sa377" RelX="0.0" RelY="-1.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re26"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1516.4117637303418" Y="1656.636729450509" GraphRef="sa267" RelX="-0.3826834323650892" RelY="0.9238795325112915" /> - <Point X="1411.9999999999989" Y="1738.999999999999" /> - <Point X="1413.0" Y="1863.0" GraphRef="sa283" RelX="0.0" RelY="-1.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5174770778879245" Shape="None" GraphId="id10081" /> - <Anchor Position="0.7595217557199425" Shape="None" GraphId="id10083" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10082"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1412.0" Y="1635.0" GraphRef="sa282" RelX="0.0" RelY="1.0" /> - <Point X="1411.9999999999989" Y="1738.999999999999" GraphRef="id10081" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10084"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1192.7777777777774" Y="1728.0" GraphRef="sa220" RelX="0.8604651162790697" RelY="0.7391304347826086" /> - <Point X="1412.5016231700915" Y="1801.2012730914341" GraphRef="id10083" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re96"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1165.6777963932625" Y="1375.8611939375417" GraphRef="sa254" RelX="-0.9238795325112875" RelY="-0.38268343236508373" /> - <Point X="1064.5771644662752" Y="1374.943650813896" GraphRef="sa399" RelX="0.7071067811865445" RelY="-0.7071067811865429" ArrowHead="mim-conversion" /> - <Anchor Position="0.45325234280346416" Shape="None" GraphId="id10085" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10086"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1210.5944084089786" Y="1495.0649711574556" GraphRef="sa288" RelX="-0.7071067811865454" RelY="-0.7071067811865472" /> - <Point X="1119.8536981134448" Y="1375.445315367126" GraphRef="id10085" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re57"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3642.0" Y="1789.5" GraphRef="sa329" RelX="1.0" RelY="0.0" /> - <Point X="4560.0" Y="1785.5" GraphRef="sa330" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5000296642599328" Shape="None" GraphId="id10087" /> - <Anchor Position="0.5054759160131082" Shape="None" GraphId="id10089" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10088"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4077.0" Y="1925.0" GraphRef="sa290" RelX="-0.5" RelY="-1.0" /> - <Point X="4101.027231790618" Y="1787.4998813429602" GraphRef="id10087" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10090"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4120.0" Y="2047.0" GraphRef="sa291" RelX="0.5" RelY="-1.0" /> - <Point X="4106.026890900033" Y="1787.4780963359476" GraphRef="id10089" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re62"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4362.9473684210525" Y="888.6954887218044" GraphRef="sa251" RelX="-1.0" RelY="0.0" /> - <Point X="4267.857142857143" Y="888.134920634921" GraphRef="sa229" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5027571310036102" Shape="None" GraphId="id10091" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10092"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4309.0" Y="941.0" GraphRef="sa337" RelX="0.0" RelY="-1.0" /> - <Point X="4315.140079430055" Y="888.4136591187107" GraphRef="id10091" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re69"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="965.25" Y="2203.0" GraphRef="sa351" RelX="0.0" RelY="-1.0" /> - <Point X="965.7500000000002" Y="2162.716457095436" /> - <Point X="1128.9626804253332" Y="2122.838834764832" GraphRef="sa297" RelX="-0.7071067811865459" RelY="0.7071067811865578" ArrowHead="mim-conversion" /> - <Anchor Position="0.19340652263911287" Shape="None" GraphId="id10093" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10094"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="865.085783637895" Y="2162.7164570954365" GraphRef="sa350" RelX="0.9238795325112863" RelY="-0.38268343236508373" /> - <Point X="965.7500000000002" Y="2162.716457095436" GraphRef="id10093" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re77"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2501.0" Y="2471.0" GraphRef="sa366" RelX="-1.0" RelY="0.0" /> - <Point X="1718.0" Y="2470.0" GraphRef="sa367" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.4936556120027011" Shape="None" GraphId="id10095" /> - <Anchor Position="0.5064259520679214" Shape="None" GraphId="id10097" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10096"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2391.0" Y="2515.0" GraphRef="sa369" RelX="0.0" RelY="-1.0" /> - <Point X="2114.467655801885" Y="2470.506344387997" GraphRef="id10095" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10098"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1859.0454545454545" Y="2520.727272727273" GraphRef="sa370" RelX="0.0" RelY="-1.0" /> - <Point X="2104.4684795308176" Y="2470.4935740479323" GraphRef="id10097" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re46"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="343.0" Y="932.0" GraphRef="sa301" RelX="0.0" RelY="1.0" /> - <Point X="341.5454545454545" Y="1073.181818181818" GraphRef="sa314" RelX="0.0" RelY="-1.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.35428427451600913" Shape="None" GraphId="id10099" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10100"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="267.5454545454545" Y="982.181818181818" GraphRef="sa315" RelX="1.0" RelY="0.0" /> - <Point X="341.5454545454549" Y="982.0000000000001" GraphRef="id10099" RelX="-0.9392228734308787" RelY="-0.01849802939636902" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re93"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="473.66666666666674" Y="1447.5" GraphRef="sa390" RelX="0.0" RelY="1.0" /> - <Point X="474.8333333333337" Y="1545.499999999999" /> - <Point X="395.0" Y="1545.0" GraphRef="csa12" RelX="1.02721088435374" RelY="0.20952380952380953" ArrowHead="mim-conversion" /> - <Anchor Position="0.5510904655041811" Shape="None" GraphId="id10101" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10102"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="874.0" Y="1544.0" GraphRef="sa266" RelX="-1.0" RelY="0.0" /> - <Point X="474.8333333333337" Y="1545.499999999999" GraphRef="id10101" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re117"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2169.192439129059" Y="1794.9270700589495" GraphRef="sa271" RelX="-0.70710678118655" RelY="0.7071067811865396" /> - <Point X="1720.8571428571431" Y="1960.2142857142858" GraphRef="sa421" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re112"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="343.0" Y="892.0" GraphRef="sa301" RelX="0.0" RelY="-1.0" /> - <Point X="342.9999999999998" Y="807.9999999999998" /> - <Point X="269.0" Y="836.0" GraphRef="csa4" RelX="1.0928030303030312" RelY="0.16958041958042275" ArrowHead="mim-conversion" /> - <Anchor Position="0.5149578021728225" Shape="None" GraphId="id10103" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10104"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="500.0" Y="826.0" GraphRef="sa300" RelX="-1.0" RelY="-0.5" /> - <Point X="342.9999999999998" Y="807.9999999999998" GraphRef="id10103" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re53"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2253.470588235294" Y="2114.735294117647" GraphRef="sa298" RelX="1.0" RelY="0.0" /> - <Point X="3550.148565478135" Y="2115.2835429045635" GraphRef="sa325" RelX="-0.923879532511285" RelY="0.38268343236508373" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re82"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3874.664216362105" Y="966.7835429045637" GraphRef="sa376" RelX="-0.9238795325112863" RelY="0.38268343236509283" /> - <Point X="3859.0000000000014" Y="1013.1349206349213" /> - <Point X="3624.857142857143" Y="1013.134920634921" GraphRef="sa228" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.17284326154952862" Shape="None" GraphId="id10105" /> - <Anchor Position="0.5867986539829333" Shape="None" GraphId="id10107" /> - <Anchor Position="0.6044467301692145" Shape="None" GraphId="id10109" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10106"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3856.857142857143" Y="1052.634920634921" GraphRef="sa226" RelX="-1.0" RelY="0.0" /> - <Point X="3859.0000000000014" Y="1013.1349206349213" GraphRef="id10105" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10108"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3769.5714285714284" Y="966.634920634921" GraphRef="sa234" RelX="-0.5" RelY="1.0" /> - <Point X="3741.8218476517277" Y="1013.1349206349211" GraphRef="id10107" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10110"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3691.0" Y="967.0" GraphRef="sa235" RelX="0.0" RelY="1.0" /> - <Point X="3736.826215277298" Y="1013.1349206349211" GraphRef="id10109" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re37"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1222.0" Y="2114.0" GraphRef="sa297" RelX="1.0" RelY="0.0" /> - <Point X="2144.470588235294" Y="2114.735294117647" GraphRef="sa298" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5000293779791283" Shape="None" GraphId="id10111" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10112"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1832.0" Y="2275.5" GraphRef="csa6" RelX="-1.0" RelY="0.0" /> - <Point X="1683.2623944393347" Y="2114.3676686602785" GraphRef="id10111" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re44"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1018.0" Y="971.0" GraphRef="sa311" RelX="1.0" RelY="0.0" /> - <Point X="1127.25" Y="973.0" /> - <Point X="1116.0" Y="973.0" GraphRef="sa312" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.4552210558302262" Shape="None" GraphId="id10113" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10114"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="882.0" Y="839.0" GraphRef="sa299" RelX="1.0" RelY="0.0" /> - <Point X="1072.853279295624" Y="972.0041790260068" GraphRef="id10113" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re54"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3644.0" Y="2039.5" GraphRef="sa323" RelX="1.0" RelY="0.0" /> - <Point X="4554.425421036992" Y="2036.2835429045635" GraphRef="sa324" RelX="-0.9238795325112935" RelY="0.38268343236508373" ArrowHead="mim-conversion" /> - <Anchor Position="0.5000301600973204" Shape="None" GraphId="id10115" /> - <Anchor Position="0.5000301600973204" Shape="None" GraphId="id10117" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10116"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4097.0" Y="1965.0" GraphRef="sa290" RelX="0.0" RelY="1.0" /> - <Point X="4099.240169037797" Y="2037.8916744436228" GraphRef="id10115" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10118"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4080.0" Y="2047.0" GraphRef="sa291" RelX="-0.5" RelY="-1.0" /> - <Point X="4099.240169037797" Y="2037.8916744436228" GraphRef="id10117" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re65"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1452.0" Y="1615.0" GraphRef="sa282" RelX="1.0" RelY="0.0" /> - <Point X="1520.0" Y="1606.0" GraphRef="sa340" RelX="-0.5333333333333333" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.505285559145076" Shape="None" GraphId="id10119" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10120"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1284.0" Y="1508.5" GraphRef="sa288" RelX="1.0" RelY="0.0" /> - <Point X="1486.3594180218652" Y="1610.4524299676943" GraphRef="id10119" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re109"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="295.0" Y="1791.0" GraphRef="csa20" RelX="1.0" RelY="0.21568627450980393" /> - <Point X="568.0000000000011" Y="1900.9999999999998" /> - <Point X="623.0" Y="1885.0" GraphRef="sa415" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.8370912953426023" Shape="None" GraphId="id10121" /> - <Anchor Position="0.43292979652708147" Shape="None" GraphId="id10123" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10122"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="568.0000000000011" Y="1900.9999999999998" GraphRef="id10121" RelX="0.0" RelY="0.0" /> - <Point X="693.0" Y="1951.0" GraphRef="sa355" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10124"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="415.39392013277813" Y="1915.4515058436089" GraphRef="sa360" RelX="0.38268343236508956" RelY="-0.9238795325112915" /> - <Point X="435.0644358956985" Y="1850.6101617757013" GraphRef="id10123" RelX="-1.126656532901336" RelY="2.719978013262107" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re58"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1152.7777777777774" Y="1688.0" GraphRef="sa220" RelX="-0.06976744186046512" RelY="-1.0" /> - <Point X="1046.0" Y="1544.0" GraphRef="sa331" RelX="0.0" RelY="0.5333333333333333" ArrowHead="mim-conversion" /> - <Anchor Position="0.5007773033778923" Shape="None" GraphId="id10125" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10126"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1224.5446124083012" Y="1526.0537111177146" GraphRef="sa288" RelX="-0.38268343236508856" RelY="0.9238795325112924" /> - <Point X="1099.3058901615382" Y="1615.8880683135835" GraphRef="id10125" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re71"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="803.1176470588234" Y="1832.7058823529412" GraphRef="sa354" RelX="-0.5" RelY="1.0" /> - <Point X="753.0" Y="1931.0" GraphRef="sa355" RelX="0.5" RelY="-1.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re51"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2230.875" Y="1882.375" GraphRef="sa284" RelX="1.0" RelY="0.0" /> - <Point X="3554.0" Y="1881.0" GraphRef="sa327" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re50"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2226.2769601084833" Y="1790.8717781986813" GraphRef="sa271" RelX="0.9238795325112863" RelY="0.38268343236508373" /> - <Point X="3572.0" Y="1789.5" GraphRef="sa329" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re38"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="954.0" Y="1564.0" GraphRef="sa266" RelX="1.0" RelY="1.0" /> - <Point X="1112.7777777777774" Y="1708.0" GraphRef="sa220" RelX="-1.0" RelY="-0.13043478260869565" ArrowHead="mim-conversion" /> - <Anchor Position="0.5005438167379873" Shape="None" GraphId="id10127" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10128"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1201.2731801020147" Y="1515.7709852149367" GraphRef="sa288" RelX="-0.923879532511285" RelY="0.382683432365088" /> - <Point X="1033.4752349020646" Y="1636.0783096102703" GraphRef="id10127" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re90"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="229.0" Y="1364.5" GraphRef="csa11" RelX="1.0599812558575463" RelY="0.2288188002473795" /> - <Point X="722.0" Y="1364.5" GraphRef="csa10" RelX="-1.0441826215022132" RelY="0.1917989417989382" ArrowHead="mim-conversion" /> - <Anchor Position="0.5001028493391495" Shape="None" GraphId="id10129" /> - <Anchor Position="0.5001028493391495" Shape="None" GraphId="id10131" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10130"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="480.0" Y="1318.0" GraphRef="sa379" RelX="0.0" RelY="1.0" /> - <Point X="475.5507047242007" Y="1364.5" GraphRef="id10129" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10132"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="391.0605867994449" Y="1305.8818274897246" GraphRef="sa395" RelX="0.38268343236508956" RelY="0.9238795325112915" /> - <Point X="475.5507047242007" Y="1364.5" GraphRef="id10131" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re22"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3736.0" Y="1528.0882352941176" GraphRef="sa275" RelX="-1.0" RelY="0.0" /> - <Point X="2357.75" Y="1528.75" GraphRef="sa265" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re42"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1018.0" Y="866.0" GraphRef="sa304" RelX="1.0" RelY="0.0" /> - <Point X="1127.25" Y="865.0" /> - <Point X="1116.0" Y="865.0" GraphRef="sa309" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.4552161914560297" Shape="None" GraphId="id10133" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10134"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="882.0" Y="839.0" GraphRef="sa299" RelX="1.0" RelY="0.0" /> - <Point X="1072.8533365493356" Y="865.4979099629352" GraphRef="id10133" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re3"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4061.857142857143" Y="1027.134920634921" GraphRef="sa230" RelX="1.0" RelY="0.0" /> - <Point X="4198.857142857143" Y="1014.134920634921" GraphRef="sa227" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.501318359088464" Shape="None" GraphId="id10135" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10136"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4099.0" Y="990.0" GraphRef="sa225" RelX="0.0" RelY="1.0" /> - <Point X="4130.537758052263" Y="1020.617781966771" GraphRef="id10135" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re23"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1642.0" Y="1515.5" GraphRef="sa263" RelX="0.0" RelY="-1.0" /> - <Point X="1640.5103092174797" Y="1081.9999822866203" GraphRef="csa2" RelX="2.824443145135313E-4" RelY="1.1176463641811865" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re104"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1159.5833333333335" Y="1238.75" GraphRef="sa403" RelX="0.8333333333333358" RelY="-0.5" /> - <Point X="1330.0" Y="1221.3239488045826" GraphRef="csa13" RelX="-1.0" RelY="0.35387340014320756" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re55"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3655.0" Y="2110.5" GraphRef="sa325" RelX="1.0" RelY="0.0" /> - <Point X="4547.0" Y="2106.5" GraphRef="sa326" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5000314186790644" Shape="None" GraphId="id10137" /> - <Anchor Position="0.5000314186790634" Shape="None" GraphId="id10139" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10138"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4137.0" Y="1965.0" GraphRef="sa290" RelX="1.0" RelY="1.0" /> - <Point X="4101.0280254617255" Y="2108.4998743252836" GraphRef="id10137" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10140"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4080.0" Y="2087.0" GraphRef="sa291" RelX="-0.5" RelY="1.0" /> - <Point X="4101.028025461725" Y="2108.4998743252836" GraphRef="id10139" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re103"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1178.0" Y="1293.0" GraphRef="sa401" RelX="0.6666666666666666" RelY="-1.0" /> - <Point X="1320.0544162131757" Y="1265.568802386421" /> - <Point X="1330.0" Y="1242.0" GraphRef="csa13" RelX="-1.0" RelY="1.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re107"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1280.6060798672218" Y="1011.548494156391" GraphRef="sa406" RelX="-0.38268343236509283" RelY="0.9238795325112824" /> - <Point X="1249.0" Y="1130.4999999999995" /> - <Point X="1315.5" Y="1113.5" /> - <Point X="1315.5" Y="1097.0" GraphRef="csa15" RelX="-0.9791666666666666" RelY="1.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.591107444389808" Shape="None" GraphId="id10141" /> - <Anchor Position="0.7416216900937317" Shape="None" GraphId="id10143" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10142"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1174.0" Y="1150.0" GraphRef="csa14" RelX="0.9791666666666666" RelY="0.7142857142857143" /> - <Point X="1249.0" Y="1130.4999999999995" GraphRef="id10141" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10144"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1149.1666666666667" Y="1230.0" GraphRef="sa403" RelX="0.6666666666666679" RelY="-1.0" /> - <Point X="1279.3632462598441" Y="1122.7379671215433" GraphRef="id10143" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re108"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1064.0" Y="2312.5" GraphRef="sa412" RelX="0.0" RelY="1.0" /> - <Point X="1063.999999999999" Y="2391.7499999999995" /> - <Point X="1240.0" Y="2391.0" GraphRef="csa16" RelX="-1.105263157894737" RelY="0.3275862068965517" ArrowHead="mim-conversion" /> - <Anchor Position="0.3104779778840939" Shape="None" GraphId="id10145" /> - <Anchor Position="0.6557950274240998" Shape="None" GraphId="id10147" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10146"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="984.25" Y="2392.0" GraphRef="csa18" RelX="1.0" RelY="0.4444444444444444" /> - <Point X="1063.999999999999" Y="2391.7499999999995" GraphRef="id10145" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10148"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1152.7777777777774" Y="1728.0" GraphRef="sa220" RelX="-0.06976744186046512" RelY="0.7391304347826086" /> - <Point X="1152.1419284224464" Y="2391.3743951913816" GraphRef="id10147" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re13"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2251.7142857142862" Y="1296.5" GraphRef="sa250" RelX="-1.0" RelY="0.0" /> - <Point X="1740.518796992481" Y="1297.1447368421052" GraphRef="sa260" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5000956585405854" Shape="None" GraphId="id10149" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10150"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1863.0" Y="1373.0" GraphRef="sa253" RelX="0.0" RelY="-1.0" /> - <Point X="1996.0676411389786" Y="1296.822430095638" GraphRef="id10149" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re86"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="676.0" Y="1223.0" GraphRef="sa382" RelX="1.0" RelY="0.0" /> - <Point X="871.1428571428573" Y="1223.1428571428573" GraphRef="sa383" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5006560691603318" Shape="None" GraphId="id10151" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10152"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="772.5" Y="1299.0" GraphRef="csa10" RelX="-0.002945508100151294" RelY="-1.0211640211640247" /> - <Point X="773.6994557818591" Y="1223.0715222955944" GraphRef="id10151" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re19"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1577.9411764705883" Y="1645.0882352941178" GraphRef="sa267" RelX="1.0" RelY="0.0" /> - <Point X="1641.0000000000016" Y="1644.7835429045645" /> - <Point X="1640.0" Y="1775.5" GraphRef="sa270" RelX="0.0" RelY="-1.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.32541857332371066" Shape="None" GraphId="id10153" /> - <Anchor Position="0.6636947816911754" Shape="None" GraphId="id10155" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10154"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1642.0" Y="1540.5" GraphRef="sa263" RelX="0.0" RelY="1.0" /> - <Point X="1641.0000000000016" Y="1644.7835429045645" GraphRef="id10153" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10156"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1192.7777777777774" Y="1708.0" GraphRef="sa220" RelX="0.8604651162790697" RelY="-0.13043478260869565" /> - <Point X="1640.498539101449" Y="1710.3327349351528" GraphRef="id10155" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re1"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4197.857142857143" Y="888.134920634921" GraphRef="sa229" RelX="-1.0" RelY="0.0" /> - <Point X="4053.335783637895" Y="906.7164570954363" GraphRef="sa224" RelX="0.9238795325112863" RelY="-0.38268343236509283" ArrowHead="mim-conversion" /> - <Anchor Position="0.535415229350107" Shape="None" GraphId="id10157" /> - <Anchor Position="0.5011761015746136" Shape="None" GraphId="id10159" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10158"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4099.0" Y="950.0" GraphRef="sa225" RelX="0.0" RelY="-1.0" /> - <Point X="4120.47820616478" Y="898.0837582406051" GraphRef="id10157" RelX="0.0" RelY="-1.1368683772161603E-13" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10160"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4104.0" Y="841.0" GraphRef="sa338" RelX="0.0" RelY="1.0" /> - <Point X="4125.426491449376" Y="897.4475426394687" GraphRef="id10159" RelX="0.0" RelY="1.1368683772161603E-13" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re92"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="724.1428571428573" Y="1408.1428571428573" GraphRef="csa10" RelX="-1.0" RelY="1.0" /> - <Point X="722.0" Y="1430.0" /> - <Point X="641.0000000003549" Y="1429.03124999992" /> - <Point X="639.6666666666667" Y="1340.5" GraphRef="sa392" RelX="0.0" RelY="1.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.537665163177522" Shape="None" GraphId="id10161" /> - <Anchor Position="0.7507640041001563" Shape="None" GraphId="id10163" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10162"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="641.0000000003549" Y="1429.03124999992" GraphRef="id10161" RelX="0.0" RelY="0.0" /> - <Point X="513.6666666666667" Y="1427.5" GraphRef="sa390" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10164"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="874.0" Y="1524.0" GraphRef="sa266" RelX="-1.0" RelY="-1.0" /> - <Point X="681.4402048938089" Y="1434.5152674417006" /> - <Point X="640.3854415346221" Y="1388.225528133759" GraphRef="id10163" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re63"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4556.9473684210525" Y="887.6954887218044" GraphRef="sa252" RelX="-1.0" RelY="0.0" /> - <Point X="4432.9473684210525" Y="888.6954887218044" GraphRef="sa251" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5016231700922162" Shape="None" GraphId="id10165" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10166"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4495.666666666667" Y="943.6666666666667" GraphRef="sa336" RelX="0.0" RelY="-1.0" /> - <Point X="4494.746095329618" Y="888.1971118918966" GraphRef="id10165" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re113"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1204.018796992481" Y="1368.1447368421052" GraphRef="sa254" RelX="0.0" RelY="-1.0" /> - <Point X="1157.0" Y="1331.0" GraphRef="sa401" RelX="0.3333333333333333" RelY="1.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re8"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2284.1428571428573" Y="1027.0" GraphRef="sa240" RelX="0.0" RelY="1.0" /> - <Point X="2286.0" Y="1144.5" GraphRef="sa244" RelX="0.0" RelY="-1.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5018070564112698" Shape="None" GraphId="id10167" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10168"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2348.0" Y="1089.0" GraphRef="sa242" RelX="-1.0" RelY="0.0" /> - <Point X="2285.0747845333353" Y="1085.9623291283242" GraphRef="id10167" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re115"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="2150.875" Y="1892.375" GraphRef="sa284" RelX="-1.0" RelY="0.5" /> - <Point X="1720.8571428571431" Y="1960.2142857142858" GraphRef="sa421" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re97"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1076.0" Y="1390.5" GraphRef="sa399" RelX="1.0" RelY="0.0" /> - <Point X="1174.6738655732393" Y="1389.483571606937" GraphRef="sa254" RelX="-0.7071067811865464" RelY="0.7071067811865396" ArrowHead="mim-conversion" /> - <Anchor Position="0.502560819195487" Shape="None" GraphId="id10169" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10170"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1125.0" Y="1447.0" GraphRef="sa400" RelX="0.0" RelY="-1.0" /> - <Point X="1125.5896187156725" Y="1389.9891829141286" GraphRef="id10169" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re56"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3634.0" Y="1881.0" GraphRef="sa327" RelX="1.0" RelY="0.0" /> - <Point X="4558.0" Y="1880.0" GraphRef="sa328" RelX="-1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.4946183488907516" Shape="None" GraphId="id10171" /> - <Anchor Position="0.5054402195550952" Shape="None" GraphId="id10173" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10172"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4097.0" Y="1925.0" GraphRef="sa290" RelX="0.0" RelY="-1.0" /> - <Point X="4091.0273543750545" Y="1880.5053816511092" GraphRef="id10171" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10174"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4140.0" Y="2047.0" GraphRef="sa291" RelX="1.0" RelY="-1.0" /> - <Point X="4101.026762868908" Y="1880.494559780445" GraphRef="id10173" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re73"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="534.5294117647059" Y="2050.9411764705883" GraphRef="sa359" RelX="1.0" RelY="0.0" /> - <Point X="625.4999999999995" Y="2010.9999999999995" /> - <Point X="657.0" Y="2090.0" GraphRef="csa9" RelX="-0.4854426619132496" RelY="-0.9219457013574671" ArrowHead="mim-conversion" /> - <Anchor Position="0.538785324003741" Shape="None" GraphId="id10175" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10176"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="713.0" Y="1971.0" GraphRef="sa355" RelX="-0.5" RelY="1.0" /> - <Point X="625.4999999999995" Y="2010.9999999999995" GraphRef="id10175" RelX="0.0" RelY="0.0" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re20"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4585.0" Y="1522.0" GraphRef="sa272" RelX="-1.0" RelY="0.0" /> - <Point X="4001.0" Y="1524.0882352941176" GraphRef="sa274" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re78"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1648.0" Y="2470.0" GraphRef="sa367" RelX="-1.0" RelY="0.0" /> - <Point X="1527.0" Y="2471.0" GraphRef="sa374" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re95"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1271.4055915910214" Y="1495.0649711574556" GraphRef="sa288" RelX="0.7071067811865454" RelY="-0.7071067811865472" /> - <Point X="1820.0326610054308" Y="1413.4414739984513" GraphRef="sa253" RelX="-1.0741834748642305" RelY="1.0220736999225664" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re35"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1206.0" Y="2035.0" GraphRef="sa294" RelX="1.0" RelY="0.0" /> - <Point X="2144.5882352941176" Y="2037.6176470588236" GraphRef="sa295" RelX="-1.0" RelY="1.818989403545873E-14" ArrowHead="mim-conversion" /> - <Anchor Position="0.5000283774975058" Shape="None" GraphId="id10177" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10178"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1832.0" Y="2255.75" GraphRef="csa6" RelX="-1.0" RelY="-0.5" /> - <Point X="1675.3207524323648" Y="2036.3088978116848" GraphRef="id10177" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re75"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4573.0" Y="2468.0" GraphRef="sa372" RelX="-1.0" RelY="0.0" /> - <Point X="3641.0" Y="2472.0" GraphRef="sa373" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5053932317543401" Shape="None" GraphId="id10179" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10180"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="4102.0" Y="2534.0" GraphRef="sa371" RelX="0.0" RelY="-1.0" /> - <Point X="4101.973508004955" Y="2470.0215729270176" GraphRef="id10179" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re21"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3933.664216362105" Y="1528.871778198681" GraphRef="sa274" RelX="-0.9238795325112863" RelY="0.38268343236508373" /> - <Point X="3806.0" Y="1528.0882352941176" GraphRef="sa275" RelX="1.0" RelY="0.0" ArrowHead="mim-conversion" /> - <Anchor Position="0.5015315129136176" Shape="None" GraphId="id10181" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="id10182"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3870.0" Y="1488.0" GraphRef="sa276" RelX="0.0" RelY="1.0" /> - <Point X="3869.636588785087" Y="1528.4788067403226" GraphRef="id10181" RelX="0.0" RelY="0.0" ArrowHead="mim-catalysis" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re81"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="3986.0" Y="911.5" GraphRef="sa224" RelX="-1.0" RelY="0.0" /> - <Point X="3931.7487373415292" Y="953.1611652351681" GraphRef="sa376" RelX="0.70710678118655" RelY="-0.7071067811865487" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Interaction GraphId="re114"> - <Attribute Key="org.pathvisio.core.ds" Value="" /> - <Attribute Key="org.pathvisio.core.id" Value="" /> - <Graphics ConnectorType="Segmented" ZOrder="32827" LineThickness="1.0"> - <Point X="1051.9246538622385" Y="1370.1746502847518" GraphRef="sa399" RelX="0.3826834323650905" RelY="-0.9238795325112815" /> - <Point X="1112.4515219713892" Y="1332.5828012312631" GraphRef="sa401" RelX="-0.373785365533505" RelY="1.0833053279612184" ArrowHead="mim-conversion" /> - </Graphics> - <Xref Database="" ID="" /> - </Interaction> - <Shape TextLabel="nucleus" GraphId="ca7"> - <Comment>GSTP1;TXN;GSS;SLC1A1;GGT1;TXN;GSTP1;SLC1A1;GSS;GGT1;NFE2L2;</Comment> - <Attribute Key="org.pathvisio.CellularComponentProperty" Value="Cell" /> - <Attribute Key="org.pathvisio.DoubleLineProperty" Value="Double" /> - <Graphics CenterX="998.0" CenterY="921.0" Width="490.0" Height="304.0" ZOrder="16384" FontSize="20" Valign="Bottom" ShapeType="Rectangle" LineThickness="3.0" Color="ffcc66" Rotation="0.0" /> - </Shape> - <Shape TextLabel="Astrocyte" GraphId="ca3"> - <Comment>GLUT?;ABCB1;yGluCys;SLC7A11;glucose;GGT1;cystine;GSS;L-glutamic acid;glycine;MAOB;MTPT;generic -proteine;Paraquat-SG;MRP1;ABCB1;glutathione;lactate;electrophile-SG;MRP5;MPP+;MPP-SG;SLC3A2;L-cysteine;L-glutamic acid;GLUT1;GCLM;GCLC;</Comment> - <Attribute Key="org.pathvisio.CellularComponentProperty" Value="Cell" /> - <Attribute Key="org.pathvisio.DoubleLineProperty" Value="Double" /> - <Graphics CenterX="3239.0" CenterY="1722.0" Width="1732.0" Height="1936.0" ZOrder="16384" FontSize="20" Valign="Bottom" ShapeType="Rectangle" LineThickness="3.0" Color="ffcc66" Rotation="0.0" /> - </Shape> - <Shape TextLabel="Mitochondria" GraphId="ca8"> - <Comment>SLC25A10;Complex I;glutathione;SLC25A11;</Comment> - <Attribute Key="org.pathvisio.CellularComponentProperty" Value="Cell" /> - <Attribute Key="org.pathvisio.DoubleLineProperty" Value="Double" /> - <Graphics CenterX="1662.5" CenterY="923.0" Width="201.0" Height="276.0" ZOrder="16384" FontSize="20" Valign="Bottom" ShapeType="Rectangle" LineThickness="3.0" Color="ffcc66" Rotation="0.0" /> - </Shape> - <Shape TextLabel="endothelial cell" GraphId="ca6"> - <Comment>cystine;SLC7A11;SLC7A5;</Comment> - <Attribute Key="org.pathvisio.CellularComponentProperty" Value="Cell" /> - <Attribute Key="org.pathvisio.DoubleLineProperty" Value="Double" /> - <Graphics CenterX="4400.0" CenterY="1689.0" Width="200.0" Height="1900.0" ZOrder="16384" FontSize="20" Valign="Bottom" ShapeType="Rectangle" LineThickness="3.0" Color="ffcc66" Rotation="0.0" /> - </Shape> - <Shape TextLabel="blood vessel" GraphId="ca5"> - <Comment></Comment> - <Attribute Key="org.pathvisio.CellularComponentProperty" Value="Cell" /> - <Attribute Key="org.pathvisio.DoubleLineProperty" Value="Double" /> - <Graphics CenterX="7414.0" CenterY="3000.0" Width="5172.0" Height="6000.0" ZOrder="16384" FontSize="20" Valign="Bottom" ShapeType="Rectangle" LineThickness="3.0" Color="ffcc66" Rotation="0.0" /> - </Shape> - <Shape TextLabel="blood vessel" GraphId="ca4"> - <Comment>glutathione;generic -protein;cystine;electrophile-SG;L-glutamic acid;CysGly;MPP-SG;Paraquat-SG;L-cysteine;MPP+;</Comment> - <Attribute Key="org.pathvisio.CellularComponentProperty" Value="Cell" /> - <Attribute Key="org.pathvisio.DoubleLineProperty" Value="Double" /> - <Graphics CenterX="2260.5" CenterY="3000.0" Width="4521.0" Height="6000.0" ZOrder="16384" FontSize="20" Valign="Bottom" ShapeType="Rectangle" LineThickness="3.0" Color="ffcc66" Rotation="0.0" /> - </Shape> - <Shape TextLabel="Neuron" GraphId="ca1"> - <Comment>Apotosis;glutathione;pyruvate;GLRX2;Proliferation;glycine;GCLC;TRAF2-GSTP1;Thioredoxin-ASK1;CAPN1;MRP/ABCC;glutathione - disulfide;L-cysteine;CDK5R1;MPP+;ROS;PRDX1;MPP+;PARK-DAXX;PARK7-DAXX;JUN;ROS/RNS;PARK7;JUN;PRDX2;MAPK8;NFE2L2;PRDX2;SLC6A3;GSH Depletion;glutathione;MPP+;UPS;TRAF2;PARK7-KEAP1;CDK5R1 (p25);PRDX6;GSH Depletion;GCLM;ROS/RNS;generic -protein;generic -protein;GSTP1-CDK5;glutathione;ANPEP;UPS;MAP3K5;glutathione;ASK1-DAXX;ROS;GSH/GSSG ratio;generic -protein;PARK7;Paraquat;electrophile-SG;GLUT?;20S core;DAXX;GSTP1;JNK-GSTP1;PARK7;L-glutamic acid;KEAP1;SLC1A1;TRX;PARK7;AMPK;glutathione - disulfide;CDK5-p25;glutathione;MPP-SG;GSS;electrophile;GSR;CDK5-p35;yGluCys;TRX;glutathione;Paraquat-SG;electrophile;CDK5;AMPK;GLRX;lactate;20S core;generic - protein;E1/E2;GSTP1;glutathione;Apotosis;DAXX;ROS/RNS;UPS;</Comment> - <Attribute Key="org.pathvisio.CellularComponentProperty" Value="Cell" /> - <Attribute Key="org.pathvisio.DoubleLineProperty" Value="Double" /> - <Graphics CenterX="983.0" CenterY="1712.0" Width="1772.0" Height="1924.0" ZOrder="16384" FontSize="20" Valign="Bottom" ShapeType="Rectangle" LineThickness="3.0" Color="ffcc66" Rotation="0.0" /> - </Shape> - <Group GroupId="csa7" GraphId="csa7" /> - <Group GroupId="csa8" GraphId="csa8" /> - <Group GroupId="csa5" GraphId="csa5" /> - <Group GroupId="csa9" GraphId="csa9" /> - <Group GroupId="csa15" GraphId="csa15" /> - <Group GroupId="csa11" GraphId="csa11" /> - <Group GroupId="csa16" GraphId="csa16" /> - <Group GroupId="csa20" GraphId="csa20" /> - <Group GroupId="csa4" GraphId="csa4" /> - <Group GroupId="csa12" GraphId="csa12" /> - <Group GroupId="csa3" GraphId="csa3" /> - <Group GroupId="csa19" GraphId="csa19" GroupRef="csa18" /> - <Group GroupId="csa18" GraphId="csa18" /> - <Group GroupId="csa10" GraphId="csa10" /> - <Group GroupId="csa14" GraphId="csa14" /> - <Group GroupId="csa13" GraphId="csa13" /> - <Group GroupId="csa17" GraphId="csa17" GroupRef="csa16" /> - <InfoBox CenterX="0.0" CenterY="0.0" /> -</Pathway> - diff --git a/persist/src/main/java/lcsb/mapviewer/persist/ApplicationContextLoader.java b/persist/src/main/java/lcsb/mapviewer/persist/ApplicationContextLoader.java index c480231a2a77c021ca268509c0bdb5e46e287170..63bc73e8f3ce796d7c4d51b2da4b82761f0d4b52 100644 --- a/persist/src/main/java/lcsb/mapviewer/persist/ApplicationContextLoader.java +++ b/persist/src/main/java/lcsb/mapviewer/persist/ApplicationContextLoader.java @@ -28,7 +28,7 @@ public final class ApplicationContextLoader { private static ConfigurableApplicationContext applicationContext; /** - * Default constructor. Prevents instatiation. + * Default constructor. Prevents instantiation. */ private ApplicationContextLoader() { diff --git a/persist/src/main/resources/db/migration/15.0.0/V15.0.0.20191022__font_color_is_obligatory.sql b/persist/src/main/resources/db/migration/15.0.0/V15.0.0.20191022__font_color_is_obligatory.sql new file mode 100644 index 0000000000000000000000000000000000000000..f79af3ae4ab07ba4f51a8a444c0b9a607997a08b --- /dev/null +++ b/persist/src/main/resources/db/migration/15.0.0/V15.0.0.20191022__font_color_is_obligatory.sql @@ -0,0 +1,2 @@ +update element_table set font_color = E'\\xaced00057372000e6a6176612e6177742e436f6c6f7201a51783108f337502000546000666616c70686149000576616c75654c0002637374001b4c6a6176612f6177742f636f6c6f722f436f6c6f7253706163653b5b00096672676276616c75657400025b465b00066676616c756571007e0002787000000000ff000000707070' where font_color is null; +ALTER TABLE element_table ALTER COLUMN font_color SET NOT NULL; diff --git a/rest-api/pom.xml b/rest-api/pom.xml index f9d2e9f26b3547b7aabcd49ff87948df258faba7..3560c6db610553db2ed7985bf285cac908ae3b84 100644 --- a/rest-api/pom.xml +++ b/rest-api/pom.xml @@ -26,6 +26,12 @@ <version>1.0</version> </dependency> + <dependency> + <groupId>lcsb.mapviewer</groupId> + <artifactId>pathvisio</artifactId> + <version>1.0</version> + </dependency> + <dependency> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java index bc9c4366ab4c056f74a422392e16135c94007e6c..5ab4674620e75aa3225032ac375ad9e410ba9b4f 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java @@ -23,9 +23,6 @@ import lcsb.mapviewer.annotation.services.*; import lcsb.mapviewer.common.comparator.StringComparator; import lcsb.mapviewer.common.exception.*; import lcsb.mapviewer.converter.Converter; -import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser; -import lcsb.mapviewer.converter.model.sbgnml.SbgnmlXmlConverter; -import lcsb.mapviewer.converter.model.sbml.SbmlParser; import lcsb.mapviewer.model.map.*; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.reaction.Reaction; @@ -60,6 +57,9 @@ public abstract class BaseRestImpl { @Autowired private PubmedParser pubmedParser; + @Autowired + private List<Converter> modelConverters; + private ElementMatcher elementMatcher = new ElementMatcher(); private Transformer mathMlTransformer; @@ -161,7 +161,7 @@ public abstract class BaseRestImpl { * @param modelId * list of model identifiers separated by "," or '*' when all models * should be returned - * @throws QueryException + * @throws QueryException */ protected List<Model> getModels(String projectId, String modelId) throws QueryException { Model model = modelService.getLastModelByProjectId(projectId); @@ -318,11 +318,7 @@ public abstract class BaseRestImpl { } protected List<Converter> getModelConverters() { - List<Converter> result = new ArrayList<>(); - result.add(new CellDesignerXmlParser()); - result.add(new SbgnmlXmlConverter()); - result.add(new SbmlParser()); - return result; + return modelConverters; } protected String getFirstValue(List<Object> list) { diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/SpringRestApiConfig.java b/rest-api/src/main/java/lcsb/mapviewer/api/SpringRestApiConfig.java index 28365629698bf7a2625b0cefd7899d2d3cde31cb..57b92597b0c411165ef847f29e13de0a0f0856fa 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/SpringRestApiConfig.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/SpringRestApiConfig.java @@ -8,7 +8,7 @@ import lcsb.mapviewer.services.SpringServiceConfig; @Configuration @EnableWebMvc @Import({ SpringServiceConfig.class }) -@ComponentScan(basePackages = { "lcsb.mapviewer.api" }) +@ComponentScan(basePackages = { "lcsb.mapviewer" }) public class SpringRestApiConfig { } diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/BaseRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/BaseRestImplTest.java index 77e415ea34e49fd29215be138e0ad97e0e2fc4ba..84d9f956a0b7e8aa72e65fbc4de242593ce407b0 100644 --- a/rest-api/src/test/java/lcsb/mapviewer/api/BaseRestImplTest.java +++ b/rest-api/src/test/java/lcsb/mapviewer/api/BaseRestImplTest.java @@ -15,16 +15,21 @@ import org.springframework.beans.factory.annotation.Autowired; import lcsb.mapviewer.annotation.services.MiriamConnector; import lcsb.mapviewer.annotation.services.PubmedParser; import lcsb.mapviewer.annotation.services.annotators.ElementAnnotator; +import lcsb.mapviewer.api.projects.ProjectRestImpl; +import lcsb.mapviewer.converter.Converter; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.MiriamType; import lcsb.mapviewer.model.user.annotator.AnnotatorData; public class BaseRestImplTest extends RestTestFunctions { - Logger logger = LogManager.getLogger(BaseRestImplTest.class); + Logger logger = LogManager.getLogger(); @Autowired MiriamConnector mc; + @Autowired + ProjectRestImpl restImpl; + @Autowired PubmedParser pubmedParser; @@ -107,4 +112,11 @@ public class BaseRestImplTest extends RestTestFunctions { Integer x = controller.parseInteger(null); assertNull(x); } + + @Test + public void testGetConverters() throws Exception { + List<Converter> list = restImpl.getModelConverters(); + assertTrue(list.size() > 0); + } + }