From 4ca4ac162d7a3caa78a08c28213a0451968cd1ad Mon Sep 17 00:00:00 2001 From: "cmzmasek@gmail.com" Date: Thu, 21 Aug 2014 00:46:49 +0000 Subject: [PATCH] in progress --- .../org/forester/archaeopteryx/ControlPanel.java | 5 + .../src/org/forester/archaeopteryx/TreePanel.java | 56 +++++-- .../data/RenderableDomainArchitecture.java | 34 ++-- .../phylogeny/data/RenderableMsaSequence.java | 170 ++++++++++++++++++++ .../phylogeny/data/RenderablePhylogenyData.java | 4 +- .../phylogeny/data/RenderableVector.java | 6 +- .../forester/phylogeny/data/PhylogenyDataUtil.java | 6 +- 7 files changed, 244 insertions(+), 37 deletions(-) create mode 100644 forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableMsaSequence.java diff --git a/forester/java/src/org/forester/archaeopteryx/ControlPanel.java b/forester/java/src/org/forester/archaeopteryx/ControlPanel.java index 27c6b99..174ba35 100644 --- a/forester/java/src/org/forester/archaeopteryx/ControlPanel.java +++ b/forester/java/src/org/forester/archaeopteryx/ControlPanel.java @@ -2455,4 +2455,9 @@ final class ControlPanel extends JPanel implements ActionListener { CHANGE_NODE_FONT, COLOR_NODE_FONT; } + + public boolean isShowSequences() { + // TODO Auto-generated method stub + return true; + } } diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index e3585e6..324153c 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -98,6 +98,7 @@ import org.forester.archaeopteryx.Options.CLADOGRAM_TYPE; import org.forester.archaeopteryx.Options.NODE_LABEL_DIRECTION; import org.forester.archaeopteryx.Options.PHYLOGENY_GRAPHICS_TYPE; import org.forester.archaeopteryx.phylogeny.data.RenderableDomainArchitecture; +import org.forester.archaeopteryx.phylogeny.data.RenderableMsaSequence; import org.forester.archaeopteryx.phylogeny.data.RenderableVector; import org.forester.archaeopteryx.tools.Blast; import org.forester.archaeopteryx.tools.ImageLoader; @@ -1103,7 +1104,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } if ( getControlPanel().isShowDomainArchitectures() ) { - final double ds_factor_width = _domain_structure_width / _max_original_domain_structure_width; + final float ds_factor_width = ( float ) ( _domain_structure_width / _max_original_domain_structure_width ); for( final PhylogenyNode node : _phylogeny.getExternalNodes() ) { if ( node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { @@ -4803,17 +4804,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( getControlPanel().isDrawPhylogram() ) { if ( getOptions().isLineUpRendarableNodeData() ) { if ( getOptions().isRightLineUpDomains() ) { - rds.render( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) - + _length_of_longest_text - + ( ( _longest_domain - rds.getTotalLength() ) * rds - .getRenderingFactorWidth() ), - node.getYcoord() - ( h / 2 ), - g, - this, - to_pdf ); + rds.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + + _length_of_longest_text + ( ( _longest_domain - rds.getTotalLength() ) * rds + .getRenderingFactorWidth() ) ), node.getYcoord() - ( h / 2 ), g, this, to_pdf ); } else { - rds.render( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + _length_of_longest_text, + rds.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + _length_of_longest_text ), node.getYcoord() - ( h / 2 ), g, this, @@ -4856,10 +4852,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee domain_add = _domain_structure_width + 10; } if ( getControlPanel().isDrawPhylogram() ) { - rv.render( node.getXcoord() + x + domain_add, node.getYcoord() - 3, g, this, to_pdf ); + rv.render( ( float ) ( node.getXcoord() + x + domain_add ), node.getYcoord() - 3, g, this, to_pdf ); } else { - rv.render( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text + domain_add, + rv.render( ( float ) ( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text + domain_add ), node.getYcoord() - 3, g, this, @@ -4867,6 +4863,42 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } } + if ( getControlPanel().isShowSequences() && ( node.getNodeData().isHasSequence() ) + && ( node.getNodeData().getSequence().isMolecularSequenceAligned() ) + && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) ) { + final RenderableMsaSequence rs = RenderableMsaSequence.createInstance( node.getNodeData().getSequence() + .getMolecularSequence(), getConfiguration() ); + if ( rs != null ) { + + final int default_height = 7; + float y = getYdistance(); + if ( getControlPanel().isDynamicallyHideData() ) { + y = getTreeFontSet().getFontMetricsLarge().getHeight(); + } + final int h = y < default_height ? ForesterUtil.roundToInt( y ) : default_height; + rs.setRenderingHeight( h > 1 ? h : 2 ); + if ( getControlPanel().isDrawPhylogram() ) { + if ( getOptions().isLineUpRendarableNodeData() ) { + rs.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + _length_of_longest_text ), + node.getYcoord() - ( h / 2 ), + g, + this, + to_pdf ); + } + else { + rs.render( node.getXcoord() + x, node.getYcoord() - ( h / 2 ), g, this, to_pdf ); + } + } + else { + rs.render( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text, + node.getYcoord() - ( h / 2 ), + g, + this, + to_pdf ); + } + + } + } } final private int calcLengthOfLongestText() { diff --git a/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableDomainArchitecture.java b/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableDomainArchitecture.java index 05d5a5d..d70eb12 100644 --- a/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableDomainArchitecture.java +++ b/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableDomainArchitecture.java @@ -56,8 +56,8 @@ public final class RenderableDomainArchitecture extends DomainArchitecture imple private final DomainArchitecture _domain_structure; private int _e_value_threshold_exp = E_VALUE_THRESHOLD_EXP_DEFAULT; private final Rectangle2D _rectangle = new Rectangle2D.Float(); - private double _rendering_factor_width = 1.0; - private double _rendering_height = 0; + private float _rendering_factor_width = 1; + private float _rendering_height = 0; public RenderableDomainArchitecture( final DomainArchitecture domain_structure ) { _domain_structure = domain_structure; @@ -148,7 +148,7 @@ public final class RenderableDomainArchitecture extends DomainArchitecture imple return new Integer( _e_value_threshold_exp ); } - public double getRenderingFactorWidth() { + public float getRenderingFactorWidth() { return _rendering_factor_width; } @@ -169,14 +169,14 @@ public final class RenderableDomainArchitecture extends DomainArchitecture imple } @Override - public void render( final double x1, - final double y1, + public void render( final float x1, + final float y1, final Graphics2D g, final TreePanel tree_panel, final boolean to_pdf ) { - final double f = getRenderingFactorWidth(); - final double y = y1 + ( _rendering_height / 2 ); - final double start = x1 + 20.0; + final float f = getRenderingFactorWidth(); + final float y = y1 + ( _rendering_height / 2 ); + final float start = x1 + 20; final Stroke s = g.getStroke(); g.setStroke( STROKE_1 ); if ( !to_pdf ) { @@ -190,8 +190,8 @@ public final class RenderableDomainArchitecture extends DomainArchitecture imple for( int i = 0; i < _domain_structure.getDomains().size(); ++i ) { final ProteinDomain d = _domain_structure.getDomain( i ); if ( d.getConfidence() <= Math.pow( 10, _e_value_threshold_exp ) ) { - final double xa = start + ( d.getFrom() * f ); - final double xb = xa + ( d.getLength() * f ); + final float xa = start + ( d.getFrom() * f ); + final float xb = xa + ( d.getLength() * f ); if ( tree_panel.getMainPanel().getOptions().isShowDomainLabels() && ( tree_panel.getMainPanel().getTreeFontSet().getFontMetricsSmall().getHeight() > 4 ) ) { g.setFont( tree_panel.getMainPanel().getTreeFontSet().getSmallFont() ); @@ -201,9 +201,13 @@ public final class RenderableDomainArchitecture extends DomainArchitecture imple else { g.setColor( Constants.DOMAIN_LABEL_COLOR_FOR_PDF ); } - PhylogenyDataUtil.drawString( d.getName(), xa, y1 - + tree_panel.getMainPanel().getTreeFontSet().getFontMetricsSmall().getAscent() - + _rendering_height, g ); + g.drawString( d.getName(), + xa, + y1 + + tree_panel.getMainPanel().getTreeFontSet().getFontMetricsSmall().getAscent() + + _rendering_height ); + + } drawDomain( xa, y1, xb - xa, _rendering_height, d.getName(), g, to_pdf ); } @@ -216,12 +220,12 @@ public final class RenderableDomainArchitecture extends DomainArchitecture imple _e_value_threshold_exp = ( int ) e_value_threshold_exp; } - public void setRenderingFactorWidth( final double rendering_factor_width ) { + public void setRenderingFactorWidth( final float rendering_factor_width ) { _rendering_factor_width = rendering_factor_width; } @Override - public void setRenderingHeight( final double rendering_height ) { + public void setRenderingHeight( final float rendering_height ) { _rendering_height = rendering_height; } diff --git a/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableMsaSequence.java b/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableMsaSequence.java new file mode 100644 index 0000000..baa1284 --- /dev/null +++ b/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableMsaSequence.java @@ -0,0 +1,170 @@ +// $Id: +// $ +// FORESTER -- software libraries and applications +// for evolutionary biology research and applications. +// +// Copyright (C) 2008-2009 Christian M. Zmasek +// Copyright (C) 2008-2009 Burnham Institute for Medical Research +// All rights reserved +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +// +// Contact: phylosoft @ gmail . com +// WWW: https://sites.google.com/site/cmzmasek/home/software/forester + +package org.forester.archaeopteryx.phylogeny.data; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.geom.Rectangle2D; +import java.io.IOException; +import java.io.Writer; +import java.util.List; + +import org.forester.archaeopteryx.AptxUtil; +import org.forester.archaeopteryx.Configuration; +import org.forester.archaeopteryx.TreePanel; +import org.forester.phylogeny.data.PhylogenyData; +import org.forester.phylogeny.data.PhylogenyDataUtil; +import org.forester.util.DescriptiveStatistics; +import org.forester.util.ForesterUtil; + +public final class RenderableMsaSequence implements RenderablePhylogenyData { + + final static int VECTOR_DEFAULT_HEIGHT = 12; + public final static int VECTOR_DEFAULT_WIDTH = 120; + private double _rendering_factor_width = 1.0; + private String _seq; + private final Rectangle2D _rectangle = new Rectangle2D.Float(); + private double _height = VECTOR_DEFAULT_HEIGHT; + private double _min; + private double _max; + private double _mean; + private Color _min_color = Color.BLUE; + private Color _max_color = Color.YELLOW; + private Color _mean_color = Color.WHITE; + private int _width = VECTOR_DEFAULT_WIDTH; + private static RenderableMsaSequence _instance = null; + + private RenderableMsaSequence() { + _seq = null; + } + + @Override + public StringBuffer asSimpleText() { + return new StringBuffer( _seq ); + } + + @Override + public StringBuffer asText() { + return asSimpleText(); + } + + @Override + public Object clone() { + throw new NoSuchMethodError(); + } + + @Override + public PhylogenyData copy() { + throw new NoSuchMethodError(); + } + + @Override + public Dimension getOriginalSize() { + return new Dimension( getTotalLength(), ( int ) getRenderingHeight() ); + } + + @Override + public Object getParameter() { + return null; + } + + public double getRenderingFactorWidth() { + return _rendering_factor_width; + } + + @Override + public Dimension getRenderingSize() { + return getOriginalSize(); + } + + public int getTotalLength() { + return _seq.length(); + } + + @Override + public boolean isEqual( final PhylogenyData data ) { + throw new NoSuchMethodError(); + } + + @Override + public void render( final float x1, + final float y1, + final Graphics2D g, + final TreePanel tree_panel, + final boolean to_pdf ) { + final double y = y1; + final double start = x1 + 20.0; + g.drawString( _seq, x1, y1 + ); + } + + @Override + public void setParameter( final double parameter ) { + throw new NoSuchMethodError(); + } + + public void setRenderingFactorWidth( final double rendering_factor_width ) { + _rendering_factor_width = rendering_factor_width; + } + + @Override + public void setRenderingHeight( final float height ) { + _height = height; + } + + @Override + public StringBuffer toNHX() { + throw new NoSuchMethodError(); + } + + @Override + public void toPhyloXML( final Writer writer, final int level, final String indentation ) throws IOException { + throw new NoSuchMethodError(); + } + + private Color calculateColor( final double v ) { + return ForesterUtil.calcColor( v, _min, _max, _mean, _min_color, _max_color, _mean_color ); + } + + private double getRenderingHeight() { + return _height; + } + + public static RenderableMsaSequence createInstance( final String seq, + final Configuration configuration ) { + if ( _instance == null ) { + _instance = new RenderableMsaSequence(); + } + _instance._seq = seq; + if ( configuration != null ) { + + } + + return _instance; + } +} diff --git a/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderablePhylogenyData.java b/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderablePhylogenyData.java index 9536554..d610fd1 100644 --- a/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderablePhylogenyData.java +++ b/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderablePhylogenyData.java @@ -47,9 +47,9 @@ public interface RenderablePhylogenyData extends PhylogenyData { * @param g * the Graphics to render to */ - public void render( final double x, final double y, final Graphics2D g, final TreePanel tree_panel, boolean to_pdf ); + public void render( final float x, final float y, final Graphics2D g, final TreePanel tree_panel, boolean to_pdf ); public void setParameter( final double parameter ); - public void setRenderingHeight( final double rendering_height ); + public void setRenderingHeight( final float rendering_height ); } diff --git a/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableVector.java b/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableVector.java index b084491..5399cc6 100644 --- a/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableVector.java +++ b/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableVector.java @@ -111,8 +111,8 @@ public final class RenderableVector implements RenderablePhylogenyData { } @Override - public void render( final double x1, - final double y1, + public void render( final float x1, + final float y1, final Graphics2D g, final TreePanel tree_panel, final boolean to_pdf ) { @@ -136,7 +136,7 @@ public final class RenderableVector implements RenderablePhylogenyData { } @Override - public void setRenderingHeight( final double height ) { + public void setRenderingHeight( final float height ) { _height = height; } diff --git a/forester/java/src/org/forester/phylogeny/data/PhylogenyDataUtil.java b/forester/java/src/org/forester/phylogeny/data/PhylogenyDataUtil.java index 09707cd..5718086 100644 --- a/forester/java/src/org/forester/phylogeny/data/PhylogenyDataUtil.java +++ b/forester/java/src/org/forester/phylogeny/data/PhylogenyDataUtil.java @@ -371,11 +371,7 @@ public final class PhylogenyDataUtil { org.forester.util.ForesterUtil.roundToInt( y2 ) ); } - public static void drawString( final String str, final double x, final double y, final Graphics g ) { - g.drawString( str, - org.forester.util.ForesterUtil.roundToInt( x ), - org.forester.util.ForesterUtil.roundToInt( y ) ); - } + public static String replaceIllegalXmlCharacters( final String value ) { String v = value.replaceAll( "&", "&" ); -- 1.7.10.2