From 825120e331e7944f5f2498e72c58402f5fc6442a Mon Sep 17 00:00:00 2001 From: "cmzmasek@gmail.com" Date: Fri, 22 Aug 2014 20:25:45 +0000 Subject: [PATCH] in progress --- .../org/forester/archaeopteryx/ControlPanel.java | 2 +- .../src/org/forester/archaeopteryx/TreePanel.java | 10 +-- .../phylogeny/data/RenderableMsaSequence.java | 78 ++++++++++++-------- .../phylogeny/data/RenderableVector.java | 2 +- .../archaeopteryx/tools/PhylogeneticInferrer.java | 2 + .../org/forester/phylogeny/PhylogenyMethods.java | 19 +++++ 6 files changed, 74 insertions(+), 39 deletions(-) diff --git a/forester/java/src/org/forester/archaeopteryx/ControlPanel.java b/forester/java/src/org/forester/archaeopteryx/ControlPanel.java index d051dab..bafb79d 100644 --- a/forester/java/src/org/forester/archaeopteryx/ControlPanel.java +++ b/forester/java/src/org/forester/archaeopteryx/ControlPanel.java @@ -2458,6 +2458,6 @@ final class ControlPanel extends JPanel implements ActionListener { public boolean isShowMolSequences() { // TODO Auto-generated method stub - return false; + return true; } } diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index e8bbfea..3f6496b 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -660,7 +660,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee && ( node.getNodeData().getSequence().isMolecularSequenceAligned() ) && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) ) { // FIXME - sum += 100; + sum += RenderableMsaSequence.DEFAULT_WIDTH + 30; } if ( sum >= max_length ) { _longest_ext_node_info = max_length; @@ -4883,16 +4883,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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, diff --git a/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableMsaSequence.java b/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableMsaSequence.java index baa1284..c83a5da 100644 --- a/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableMsaSequence.java +++ b/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableMsaSequence.java @@ -32,31 +32,20 @@ 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; + final static int DEFAULT_HEIGHT = 12; + final public static int DEFAULT_WIDTH = 400; + private double _rendering_factor_width = 1.0; + private char _seq[]; + private final Rectangle2D _rectangle = new Rectangle2D.Float(); + private double _height = DEFAULT_HEIGHT; + private final float _width = DEFAULT_WIDTH; private static RenderableMsaSequence _instance = null; private RenderableMsaSequence() { @@ -65,7 +54,7 @@ public final class RenderableMsaSequence implements RenderablePhylogenyData { @Override public StringBuffer asSimpleText() { - return new StringBuffer( _seq ); + return new StringBuffer( _seq.toString() ); } @Override @@ -103,7 +92,7 @@ public final class RenderableMsaSequence implements RenderablePhylogenyData { } public int getTotalLength() { - return _seq.length(); + return _seq.length; } @Override @@ -117,10 +106,23 @@ public final class RenderableMsaSequence implements RenderablePhylogenyData { 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 - ); + final float y = y1; + final float start = x1 + 20; + final float width = _width / _seq.length; + for( int i = 0; i < _seq.length; ++i ) { + final char c = _seq[ i ]; + if ( width < 4 ) { + if ( c != '-' ) { + g.setColor( calculateColor( c ) ); + _rectangle.setFrame( start + ( i * width ), y - 0.5, width + 1, getRenderingHeight() ); + g.fill( _rectangle ); + } + } + else { + g.setColor( calculateColor( c ) ); + g.drawString( String.valueOf( c ), start + ( i * width ), y - 0.5f ); + } + } } @Override @@ -147,24 +149,38 @@ public final class RenderableMsaSequence implements RenderablePhylogenyData { throw new NoSuchMethodError(); } - private Color calculateColor( final double v ) { - return ForesterUtil.calcColor( v, _min, _max, _mean, _min_color, _max_color, _mean_color ); + private Color calculateColor( final char c ) { + if ( ( c == 'G' ) || ( c == 'A' ) || ( c == 'S' ) || ( c == 'T' ) ) { + return Color.ORANGE; + } + else if ( ( c == 'N' ) || ( c == 'Q' ) || ( c == 'H' ) ) { + return Color.MAGENTA; + } + else if ( ( c == 'D' ) || ( c == 'E' ) ) { + return Color.RED; + } + else if ( ( c == 'K' ) || ( c == 'R' ) ) { + return Color.BLUE; + } + else if ( c == '-' ) { + return Color.GRAY; + } + else { + return Color.GREEN; + } } private double getRenderingHeight() { return _height; } - public static RenderableMsaSequence createInstance( final String seq, - final Configuration configuration ) { + public static RenderableMsaSequence createInstance( final String seq, final Configuration configuration ) { if ( _instance == null ) { _instance = new RenderableMsaSequence(); } - _instance._seq = seq; + _instance._seq = seq.toCharArray(); if ( configuration != null ) { - } - return _instance; } } 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 5399cc6..4fd86bd 100644 --- a/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableVector.java +++ b/forester/java/src/org/forester/archaeopteryx/phylogeny/data/RenderableVector.java @@ -121,7 +121,7 @@ public final class RenderableVector implements RenderablePhylogenyData { final double width = ( double ) _width / _values.size(); for( int i = 0; i < _values.size(); ++i ) { g.setColor( calculateColor( _values.get( i ) ) ); - _rectangle.setFrame( start + ( i * width ), y - 0.5, width, getRenderingHeight() ); + _rectangle.setFrame( start + ( i * width ), y - 0.5, width + 1, getRenderingHeight() ); g.fill( _rectangle ); } } diff --git a/forester/java/src/org/forester/archaeopteryx/tools/PhylogeneticInferrer.java b/forester/java/src/org/forester/archaeopteryx/tools/PhylogeneticInferrer.java index f972745..57d9c3c 100644 --- a/forester/java/src/org/forester/archaeopteryx/tools/PhylogeneticInferrer.java +++ b/forester/java/src/org/forester/archaeopteryx/tools/PhylogeneticInferrer.java @@ -144,7 +144,9 @@ public class PhylogeneticInferrer extends RunnableProcess { } final NeighborJoiningF nj = NeighborJoiningF.createInstance( false, 5 ); final Phylogeny phy = nj.execute( m ); + PhylogenyMethods.addMolecularSeqsToTree( phy, msa ); PhylogenyMethods.extractFastaInformation( phy ); + return phy; } diff --git a/forester/java/src/org/forester/phylogeny/PhylogenyMethods.java b/forester/java/src/org/forester/phylogeny/PhylogenyMethods.java index 9e0c782..9426a96 100644 --- a/forester/java/src/org/forester/phylogeny/PhylogenyMethods.java +++ b/forester/java/src/org/forester/phylogeny/PhylogenyMethods.java @@ -46,6 +46,7 @@ import org.forester.io.parsers.PhylogenyParser; import org.forester.io.parsers.phyloxml.PhyloXmlDataFormatException; import org.forester.io.parsers.phyloxml.PhyloXmlUtil; import org.forester.io.parsers.util.PhylogenyParserException; +import org.forester.msa.Msa; import org.forester.phylogeny.data.Accession; import org.forester.phylogeny.data.Annotation; import org.forester.phylogeny.data.BranchColor; @@ -1810,4 +1811,22 @@ public class PhylogenyMethods { TAXONOMY_ID_UNIPROT_2, TAXONOMY_SCIENTIFIC_NAME; } + + public static void addMolecularSeqsToTree( final Phylogeny phy, final Msa msa ) { + for( int s = 0; s < msa.getNumberOfSequences(); ++s ) { + final org.forester.sequence.Sequence seq = msa.getSequence( s ); + final PhylogenyNode node = phy.getNode( seq.getIdentifier() ); + final org.forester.phylogeny.data.Sequence new_seq = new Sequence(); + new_seq.setMolecularSequenceAligned( true ); + new_seq.setMolecularSequence( seq.getMolecularSequenceAsString() ); + new_seq.setName( seq.getIdentifier() ); + try { + new_seq.setType( PhyloXmlUtil.SEQ_TYPE_PROTEIN ); + } + catch ( final PhyloXmlDataFormatException ignore ) { + // do nothing + } + node.getNodeData().addSequence( new_seq ); + } + } } -- 1.7.10.2