From d5e5d5090e98771049ff13e77708eacb2945d8aa Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Tue, 9 Jan 2018 16:15:28 +0100 Subject: [PATCH] export of reaction layout added --- .../model/sbml/SbmlReactionExporter.java | 25 +- .../model/sbml/SbmlExporterTest.java | 8 - .../graphics/PolylineDataComparator.java | 232 +++++++++--------- .../map/reaction/AbstractNodeComparator.java | 6 +- 4 files changed, 141 insertions(+), 130 deletions(-) diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionExporter.java index 82f63a0e25..f91be25fbd 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionExporter.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionExporter.java @@ -3,6 +3,7 @@ package lcsb.mapviewer.converter.model.sbml; import java.awt.geom.Line2D; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.apache.log4j.Logger; @@ -18,6 +19,7 @@ import org.sbml.jsbml.ext.layout.ReactionGlyph; import org.sbml.jsbml.ext.layout.SpeciesReferenceGlyph; import org.sbml.jsbml.ext.layout.SpeciesReferenceRole; +import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.model.map.InconsistentModelException; import lcsb.mapviewer.model.map.modifier.Inhibition; import lcsb.mapviewer.model.map.reaction.Modifier; @@ -41,12 +43,12 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb @Override public org.sbml.jsbml.Reaction createSbmlElement(Reaction reaction) throws InconsistentModelException { String reactionId = getReactionId(reaction); - logger.debug(reactionId); org.sbml.jsbml.Reaction result = super.sbmlElementByElementId.get(reactionId); if (result != null) { return result; } result = sbmlModel.createReaction(reactionId); + result.setReversible(reaction.isReversible()); for (Product product : reaction.getProducts()) { Species sbmlSymbol = speciesExporter.sbmlElementByElementId.get(product.getElement().getElementId()); SpeciesReference speciesReference = result.createProduct(sbmlSymbol); @@ -79,7 +81,6 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb if (separatorIndex > 0) { glyphId = glyphId.substring(separatorIndex + 2); } - logger.debug(glyphId); ReactionGlyph reactionGlyph; try { // handle case when input data cannot doesn't come from SBML parser and contains @@ -135,18 +136,24 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb private SpeciesReferenceGlyph createNodeGlyph(ReactionGlyph reactionGlyph, ReactionNode node) { SpeciesReferenceGlyph reactantGlyph = reactionGlyph.createSpeciesReferenceGlyph("node_" + getNextId()); reactantGlyph.setSpeciesGlyph(speciesExporter.sbmlGlyphByElementId.get(node.getElement().getElementId()).getId()); - reactantGlyph.setCurve(createCurve(node)); + reactantGlyph.setCurve(createCurve(node, node instanceof Reactant)); reactantGlyph.setSpeciesReference(speciesReferenceByReactionNode.get(node)); return reactantGlyph; } - private Curve createCurve(ReactionNode reactant) { + private Curve createCurve(ReactionNode reactant, boolean reverse) { Curve curve = new Curve(); - for (Line2D line : reactant.getLine().getLines()) { - LineSegment segment = new LineSegment(); - segment.setStart(new Point(line.getX1(), line.getY1())); - segment.setEnd(new Point(line.getX2(), line.getY2())); - curve.addCurveSegment(segment); + List<Line2D> lines = reactant.getLine().getLines(); + if (reverse) { + lines = reactant.getLine().reverse().getLines(); + } + for (Line2D line : lines) { + if (line.getP1().distance(line.getP2())>Configuration.EPSILON) { + LineSegment segment = new LineSegment(); + segment.setStart(new Point(line.getX1(), line.getY1())); + segment.setEnd(new Point(line.getX2(), line.getY2())); + curve.addCurveSegment(segment); + } } return curve; } diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java index cde6d4d78d..ade2723f7b 100644 --- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java @@ -231,14 +231,6 @@ public class SbmlExporterTest { Model model2 = converter.createModel(new ConverterParams().filename("tmp.xml")); model2.setName(null); - - for (Reaction r: model.getReactions()) { - logger.debug(r.getIdReaction()); - } - logger.debug("---"); - for (Reaction r: model2.getReactions()) { - logger.debug(r.getIdReaction()); - } assertNotNull(model2); ModelComparator comparator = new ModelComparator(1.0); diff --git a/model/src/main/java/lcsb/mapviewer/model/graphics/PolylineDataComparator.java b/model/src/main/java/lcsb/mapviewer/model/graphics/PolylineDataComparator.java index 2be249dcdc..d06b841c16 100644 --- a/model/src/main/java/lcsb/mapviewer/model/graphics/PolylineDataComparator.java +++ b/model/src/main/java/lcsb/mapviewer/model/graphics/PolylineDataComparator.java @@ -17,115 +17,127 @@ import lcsb.mapviewer.common.exception.NotImplementedException; * */ public class PolylineDataComparator implements Comparator<PolylineData> { - /** - * Default class logger. - */ - private Logger logger = Logger.getLogger(PolylineDataComparator.class); - - /** - * Epsilon value used for comparison of doubles. - */ - private double epsilon; - - /** - * Constructor that requires {@link #epsilon} parameter. - * - * @param epsilon - * {@link #epsilon} - */ - public PolylineDataComparator(double epsilon) { - this.epsilon = epsilon; - } - - /** - * Default constructor. - */ - public PolylineDataComparator() { - this(Configuration.EPSILON); - } - - @Override - public int compare(PolylineData arg0, PolylineData arg1) { - if (arg0 == null) { - if (arg1 == null) { - return 0; - } else { - return 1; - } - } else if (arg1 == null) { - return -1; - } - - if (arg0.getClass().equals(arg1.getClass())) { - if (arg0.getClass().equals(PolylineData.class)) { - return internalCompare(arg0, arg1); - } else { - throw new NotImplementedException("Don't know how to compare classes: " + arg0.getClass()); - } - } else { - return -1; - } - } - - /** - * This method compares only the fields that are defined in - * {@link PolylineData} class in inheritence tree. - * - * @param arg0 - * first object to compare - * @param arg1 - * second object to compare - * @return if all fields are qual then returns 0. If they are different then - * -1/1 is returned. - */ - private int internalCompare(PolylineData arg0, PolylineData arg1) { - IntegerComparator integerComparator = new IntegerComparator(); - DoubleComparator doubleComparator = new DoubleComparator(epsilon); - ArrowTypeDataComparator atdComparator = new ArrowTypeDataComparator(epsilon); - - if (integerComparator.compare(arg0.getPoints().size(), arg1.getPoints().size()) != 0) { - logger.debug("Lines have different size: " + arg0.getPoints().size() + ", " + arg1.getPoints().size()); - return integerComparator.compare(arg0.getPoints().size(), arg1.getPoints().size()); - } - // TODO this should be fixed - // for (int i = 0; i < arg0.getPoints().size(); i++) { - // if - // (doubleComparator.compare(arg0.getPoints().get(i).distanceSq(arg1.getPoints().get(i)), - // 0.0) != 0) { - // logger.debug("Lines have different points: " + arg0.getPoints().get(i) + - // ", " + arg1.getPoints().get(i)); - // return - // doubleComparator.compare(arg0.getPoints().get(i).distanceSq(arg1.getPoints().get(i)), - // 0.0); - // } - // } - - if (atdComparator.compare(arg0.getBeginAtd(), arg1.getBeginAtd()) != 0) { - logger.debug("Lines have different begin adt: " + arg0.getBeginAtd() + ", " + arg1.getBeginAtd()); - return atdComparator.compare(arg0.getBeginAtd(), arg1.getBeginAtd()); - } - - if (atdComparator.compare(arg0.getEndAtd(), arg1.getEndAtd()) != 0) { - logger.debug("Lines have different end adt: " + arg0.getEndAtd() + ", " + arg1.getEndAtd()); - return atdComparator.compare(arg0.getEndAtd(), arg1.getEndAtd()); - } - - if (doubleComparator.compare(arg0.getWidth(), arg1.getWidth()) != 0) { - logger.debug("Lines have different width: " + arg0.getWidth() + ", " + arg1.getWidth()); - return doubleComparator.compare(arg0.getWidth(), arg1.getWidth()); - } - - if (integerComparator.compare(arg0.getColor().getRGB(), arg1.getColor().getRGB()) != 0) { - logger.debug("Lines have different color: " + arg0.getColor() + ", " + arg1.getColor()); - return integerComparator.compare(arg0.getColor().getRGB(), arg1.getColor().getRGB()); - } - - if (arg0.getType().compareTo(arg1.getType()) != 0) { - logger.debug("Lines have different type: " + arg0.getType() + ", " + arg1.getType()); - return arg0.getType().compareTo(arg1.getType()); - } - - return 0; - } + /** + * Default class logger. + */ + private Logger logger = Logger.getLogger(PolylineDataComparator.class); + + /** + * Epsilon value used for comparison of doubles. + */ + private double epsilon; + + /** + * Constructor that requires {@link #epsilon} parameter. + * + * @param epsilon + * {@link #epsilon} + */ + public PolylineDataComparator(double epsilon) { + this.epsilon = epsilon; + } + + /** + * Default constructor. + */ + public PolylineDataComparator() { + this(Configuration.EPSILON); + } + + @Override + public int compare(PolylineData arg0, PolylineData arg1) { + if (arg0 == null) { + if (arg1 == null) { + return 0; + } else { + return 1; + } + } else if (arg1 == null) { + return -1; + } + + if (arg0.getClass().equals(arg1.getClass())) { + if (arg0.getClass().equals(PolylineData.class)) { + return internalCompare(arg0, arg1); + } else { + throw new NotImplementedException("Don't know how to compare classes: " + arg0.getClass()); + } + } else { + return -1; + } + } + + /** + * This method compares only the fields that are defined in {@link PolylineData} + * class in inheritance tree. + * + * @param arg0 + * first object to compare + * @param arg1 + * second object to compare + * @return if all fields are equal then returns 0. If they are different then + * -1/1 is returned. + */ + private int internalCompare(PolylineData arg0, PolylineData arg1) { + IntegerComparator integerComparator = new IntegerComparator(); + DoubleComparator doubleComparator = new DoubleComparator(epsilon); + ArrowTypeDataComparator atdComparator = new ArrowTypeDataComparator(epsilon); + + int different1=0; + int different2=0; + for (int i=1;i<arg0.getPoints().size();i++) { + if (arg0.getPoints().get(i).distance(arg0.getPoints().get(i-1))>Configuration.EPSILON) { + different1++; + } + } + for (int i=1;i<arg1.getPoints().size();i++) { + if (arg1.getPoints().get(i).distance(arg1.getPoints().get(i-1))>Configuration.EPSILON) { + different2++; + } + } + if (integerComparator.compare(different1, different2) != 0) { + logger.debug("Lines have different size: " + different1 + ", " + different2); + return integerComparator.compare(arg0.getPoints().size(), arg1.getPoints().size()); + } + // TODO this should be fixed + // for (int i = 0; i < arg0.getPoints().size(); i++) { + // if + // (doubleComparator.compare(arg0.getPoints().get(i).distanceSq(arg1.getPoints().get(i)), + // 0.0) != 0) { + // logger.debug("Lines have different points: " + arg0.getPoints().get(i) + + // ", " + arg1.getPoints().get(i)); + // return + // doubleComparator.compare(arg0.getPoints().get(i).distanceSq(arg1.getPoints().get(i)), + // 0.0); + // } + // } + + if (atdComparator.compare(arg0.getBeginAtd(), arg1.getBeginAtd()) != 0) { + logger.debug("Lines have different begin adt: " + arg0.getBeginAtd() + ", " + arg1.getBeginAtd()); + return atdComparator.compare(arg0.getBeginAtd(), arg1.getBeginAtd()); + } + + if (atdComparator.compare(arg0.getEndAtd(), arg1.getEndAtd()) != 0) { + logger.debug("Lines have different end adt: " + arg0.getEndAtd() + ", " + arg1.getEndAtd()); + return atdComparator.compare(arg0.getEndAtd(), arg1.getEndAtd()); + } + + if (doubleComparator.compare(arg0.getWidth(), arg1.getWidth()) != 0) { + logger.debug("Lines have different width: " + arg0.getWidth() + ", " + arg1.getWidth()); + return doubleComparator.compare(arg0.getWidth(), arg1.getWidth()); + } + + if (integerComparator.compare(arg0.getColor().getRGB(), arg1.getColor().getRGB()) != 0) { + logger.debug("Lines have different color: " + arg0.getColor() + ", " + arg1.getColor()); + return integerComparator.compare(arg0.getColor().getRGB(), arg1.getColor().getRGB()); + } + + if (arg0.getType().compareTo(arg1.getType()) != 0) { + logger.debug("Lines have different type: " + arg0.getType() + ", " + arg1.getType()); + return arg0.getType().compareTo(arg1.getType()); + } + + return 0; + } } diff --git a/model/src/main/java/lcsb/mapviewer/model/map/reaction/AbstractNodeComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/reaction/AbstractNodeComparator.java index 47b9fee26e..20305f8d3d 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/reaction/AbstractNodeComparator.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/reaction/AbstractNodeComparator.java @@ -58,7 +58,7 @@ public class AbstractNodeComparator implements Comparator<AbstractNode> { // now check class types if (arg0.getClass().equals(arg1.getClass())) { - // and call comparator of apropriate subclass + // and call comparator of appropriate subclass if (arg0 instanceof NodeOperator) { NodeOperatorComparator nodeOperatorComparator = new NodeOperatorComparator(epsilon); return nodeOperatorComparator.compare((NodeOperator) arg0, (NodeOperator) arg1); @@ -75,13 +75,13 @@ public class AbstractNodeComparator implements Comparator<AbstractNode> { /** * This method compares only the fields that are defined in AbstractNode class - * in inheritence tree. By the design it is called by subclass comparator. + * in inheritance tree. By the design it is called by subclass comparator. * * @param arg0 * first object to compare * @param arg1 * second object to compare - * @return if all fields are qual then returns 0. If they are different then + * @return if all fields are equal then returns 0. If they are different then * -1/1 is returned. */ protected int internalCompare(AbstractNode arg0, AbstractNode arg1) { -- GitLab