import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
-import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.RenderingHints;
+import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.geom.CubicCurve2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
+import java.awt.geom.Path2D;
import java.awt.geom.QuadCurve2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
+import java.util.Map.Entry;
import java.util.Set;
+import java.util.SortedMap;
import java.util.SortedSet;
+import java.util.TreeMap;
import javax.swing.BorderFactory;
import javax.swing.JApplet;
public final class TreePanel extends JPanel implements ActionListener, MouseWheelListener, Printable {
+ private static final BasicStroke STROKE_2 = new BasicStroke( 2f );
+ private static final BasicStroke STROKE_1 = new BasicStroke( 1f );
+ private static final BasicStroke STROKE_075 = new BasicStroke( 0.75f );
+ private static final BasicStroke STROKE_05 = new BasicStroke( 0.5f );
+ private static final BasicStroke STROKE_025 = new BasicStroke( 0.25f );
+ private static final BasicStroke STROKE_01 = new BasicStroke( 0.1f );
+ private static final BasicStroke STROKE_005 = new BasicStroke( 0.05f );
private static final float PI = ( float ) ( Math.PI );
private static final double TWO_PI = 2 * Math.PI;
private static final float ONEHALF_PI = ( float ) ( 1.5 * Math.PI );
private final static NumberFormat FORMATTER_CONFIDENCE;
private final static NumberFormat FORMATTER_BRANCH_LENGTH;
private final static int WIGGLE = 2;
- private final static int LIMIT_FOR_HQ_RENDERING = 1000;
+ private final static int LIMIT_FOR_HQ_RENDERING = 2000;
private final static int CONFIDENCE_LEFT_MARGIN = 4;
private final RenderingHints _rendering_hints = new RenderingHints( RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_DEFAULT );
private float _last_drag_point_y = 0;
private ControlPanel _control_panel = null;
private int _external_node_index = 0;
- private final Polygon _polygon = new Polygon();
+ private final Path2D.Float _polygon = new Path2D.Float();
private final StringBuilder _sb = new StringBuilder();
private JColorChooser _color_chooser = null;
private double _scale_distance = 0.0;
}
final Color calculateTaxonomyBasedColor( final Taxonomy tax ) {
- String species = tax.getTaxonomyCode();
- if ( ForesterUtil.isEmpty( species ) ) {
- species = tax.getScientificName();
- if ( ForesterUtil.isEmpty( species ) ) {
- species = tax.getCommonName();
- }
- }
- if ( ForesterUtil.isEmpty( species ) ) {
+ if ( ForesterUtil.isEmpty( tax.getTaxonomyCode() ) && ForesterUtil.isEmpty( tax.getScientificName() ) ) {
return getTreeColorSet().getTaxonomyColor();
}
- // Look in species hash
- Color c = getControlPanel().getSpeciesColors().get( species );
+ Color c = null;
+ if ( !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) {
+ c = getControlPanel().getSpeciesColors().get( tax.getTaxonomyCode() );
+ }
+ if ( ( c == null ) && !ForesterUtil.isEmpty( tax.getScientificName() ) ) {
+ c = getControlPanel().getSpeciesColors().get( tax.getScientificName() );
+ }
if ( c == null ) {
- c = AptxUtil.calculateColorFromString( species );
- getControlPanel().getSpeciesColors().put( species, c );
+ if ( !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) {
+ c = AptxUtil.calculateColorFromString( tax.getTaxonomyCode() );
+ getControlPanel().getSpeciesColors().put( tax.getTaxonomyCode(), c );
+ }
+ else {
+ c = AptxUtil.calculateColorFromString( tax.getScientificName() );
+ getControlPanel().getSpeciesColors().put( tax.getScientificName(), c );
+ }
}
return c;
}
g.fillRect( graphics_file_x, graphics_file_y, graphics_file_width, graphics_file_height );
}
}
- g.setStroke( new BasicStroke( 1 ) );
+ setupStroke( g );
}
else {
g.setStroke( new BasicStroke( getOptions().getPrintLineWidth() ) );
}
}
if ( getMainPanel().getOptions().isAntialiasScreen() ) {
- if ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR )
- && !getMainPanel().getOptions().isShowDefaultNodeShapesInternal()
- && !getMainPanel().getOptions().isShowDefaultNodeShapesExternal()
- && ( ( getControlPanel() != null ) && !getControlPanel().isShowDomainArchitectures() ) ) {
- _rendering_hints.put( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF );
- }
- else {
- _rendering_hints.put( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
- }
- try {
- _rendering_hints.put( RenderingHints.KEY_TEXT_ANTIALIASING,
- RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB );
- }
- catch ( final Throwable e ) {
- _rendering_hints.put( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON );
- }
+ _rendering_hints.put( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
+ // try {
+ _rendering_hints.put( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB );
+ // }
+ // catch ( final Throwable e ) {
+ // _rendering_hints.put( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON );
+ //}
}
else {
_rendering_hints.put( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF );
boolean first = true;
for( final Annotation a : ann ) {
if ( !first ) {
- sb.append( "|" );
+ sb.append( "+" );
}
else {
first = false;
return Blast.isContainsQueryForBlast( node );
}
+ final private String isCanOpenSeqWeb( final PhylogenyNode node ) {
+ String v = ForesterUtil.extractUniProtKbProteinSeqIdentifier( node );
+ if ( ForesterUtil.isEmpty( v ) ) {
+ v = ForesterUtil.extractGenbankAccessor( node );
+ }
+ if ( ForesterUtil.isEmpty( v ) ) {
+ v = ForesterUtil.extractRefSeqAccessorAccessor( node );
+ }
+ if ( ForesterUtil.isEmpty( v ) ) {
+ v = ForesterUtil.extractGInumber( node );
+ }
+ return v;
+ }
+
final private boolean isCanOpenTaxWeb( final PhylogenyNode node ) {
if ( node.getNodeData().isHasTaxonomy()
&& ( ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getScientificName() ) )
return "Scientific Names";
case TAXONOMY_CODE:
return "Taxonomy Codes";
+ case TAXONOMY_COMM0N_NAME:
+ return "Taxonomy Common Names";
case UNKNOWN:
return "User Selected Data";
default:
}
}
- final private String isCanOpenSeqWeb( final PhylogenyNode node ) {
- String v = ForesterUtil.extractUniProtKbProteinSeqIdentifier( node );
- if ( ForesterUtil.isEmpty( v ) ) {
- v = ForesterUtil.extractGenbankAccessor( node );
- }
- if ( ForesterUtil.isEmpty( v ) ) {
- v = ForesterUtil.extractRefSeqAccessorAccessor( node );
- }
- if ( ForesterUtil.isEmpty( v ) ) {
- v = ForesterUtil.extractGInumber( node );
- }
- return v;
- }
-
final private void openSeqWeb( final PhylogenyNode node ) {
if ( ForesterUtil.isEmpty( isCanOpenSeqWeb( node ) ) ) {
cannotOpenBrowserWarningMessage( "sequence" );
else {
d = ( Math.log10( d ) * _y_distance ) / 2.5;
}
- final int box_size = getOptions().getDefaultNodeShapeSize();
+ final int box_size = getOptions().getDefaultNodeShapeSize() + 1;
if ( d < box_size ) {
d = box_size;
}
+ final float xx = node.getXcoord() - ( 2 * box_size );
+ final float xxx = xx > node.getParent().getXcoord() + 1 ? xx : node.getParent().getXcoord() + 1;
_polygon.reset();
- _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() - box_size ),
- ForesterUtil.roundToInt( node.getYcoord() ) );
- _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() + box_size ),
- ForesterUtil.roundToInt( node.getYcoord() - d ) );
- _polygon.addPoint( ForesterUtil.roundToInt( node.getXcoord() + box_size ),
- ForesterUtil.roundToInt( node.getYcoord() + d ) );
+ _polygon.moveTo( xxx, node.getYcoord() );
+ _polygon.lineTo( node.getXcoord() + 1, node.getYcoord() - d );
+ _polygon.lineTo( node.getXcoord() + 1, node.getYcoord() + d );
+ _polygon.closePath();
if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) {
g.setColor( c );
- g.fillPolygon( _polygon );
+ g.fill( _polygon );
}
else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.NONE ) {
g.setColor( getBackground() );
- g.fillPolygon( _polygon );
+ g.fill( _polygon );
g.setColor( c );
- g.drawPolygon( _polygon );
+ g.draw( _polygon );
}
else if ( getOptions().getDefaultNodeFill() == NodeFill.GRADIENT ) {
- g.setPaint( new GradientPaint( node.getXcoord() - box_size, node.getYcoord(), getBackground(), ( node
- .getXcoord() + box_size ), ( float ) ( node.getYcoord() - d ), c, false ) );
+ g.setPaint( new GradientPaint( xxx, node.getYcoord(), getBackground(), node.getXcoord(), ( float ) ( node
+ .getYcoord() - d ), c, false ) );
g.fill( _polygon );
g.setPaint( c );
g.draw( _polygon );
if ( !getControlPanel().isShowInternalData() && !node.isExternal() && !node.isCollapse() ) {
return;
}
+ _sb.setLength( 0 );
int x = 0;
final int half_box_size = getOptions().getDefaultNodeShapeSize() / 2;
if ( getControlPanel().isShowTaxonomyImages()
else {
g.setColor( getTreeColorSet().getSequenceColor() );
}
- _sb.setLength( 0 );
if ( node.isCollapse() && ( ( !node.isRoot() && !node.getParent().isCollapse() ) || node.isRoot() ) ) {
- _sb.append( " [" );
- _sb.append( node.getAllExternalDescendants().size() );
- _sb.append( "]" );
+ if ( _sb.length() > 0 ) {
+ _sb.setLength( 0 );
+ _sb.append( "(" );
+ _sb.append( node.getAllExternalDescendants().size() );
+ _sb.append( ")" );
+ }
+ }
+ else {
+ _sb.setLength( 0 );
}
if ( getControlPanel().isShowNodeNames() && ( node.getName().length() > 0 ) ) {
if ( _sb.length() > 0 ) {
final private void paintNodeLite( final Graphics2D g, final PhylogenyNode node ) {
if ( node.isCollapse() ) {
- if ( ( !node.isRoot() && !node.getParent().isCollapse() ) || node.isRoot() ) {
+ if ( !node.isRoot() && !node.getParent().isCollapse() ) {
paintCollapsedNode( g, node, false, false, false );
}
return;
final boolean to_graphics_file ) {
final boolean is_in_found_nodes = isInFoundNodes( node ) || isInCurrentExternalNodes( node );
if ( node.isCollapse() ) {
- if ( ( !node.isRoot() && !node.getParent().isCollapse() ) || node.isRoot() ) {
+ if ( ( !node.isRoot() && !node.getParent().isCollapse() ) ) {
paintCollapsedNode( g, node, to_graphics_file, to_pdf, is_in_found_nodes );
}
return;
final float y = getVisibleRect().y + getOvYPosition() + ( getOvMaxHeight() / y_ratio );
g.setColor( getTreeColorSet().getFoundColor() );
getOvRectangle().setRect( x, y, width, height );
+ final Stroke s = g.getStroke();
+ g.setStroke( STROKE_1 );
if ( ( width < 6 ) && ( height < 6 ) ) {
drawRectFilled( x, y, 6, 6, g );
getOvVirtualRectangle().setRect( x, y, 6, 6 );
}
getOvVirtualRectangle().setRect( x, y, width, height );
}
+ g.setStroke( s );
}
final private void paintPhylogenyLite( final Graphics2D g ) {
.setXSecondary( ( float ) ( getVisibleRect().x + getOvXPosition() + ( MOVE / ( getVisibleRect().width / getOvRectangle()
.getWidth() ) ) ) );
_phylogeny.getRoot().setYSecondary( ( getVisibleRect().y + getOvYStart() ) );
+ final Stroke s = g.getStroke();
+ g.setStroke( STROKE_05 );
for( final PhylogenyNode element : _nodes_in_preorder ) {
paintNodeLite( g, element );
}
+ g.setStroke( s );
paintOvRectangle( g );
}
else {
g.setColor( getTreeColorSet().getBranchLengthColor() );
}
+ final Stroke s = g.getStroke();
+ g.setStroke( STROKE_1 );
drawLine( x1, y1, x1, y2, g );
drawLine( x2, y1, x2, y2, g );
drawLine( x1, y3, x2, y3, g );
if ( getScaleLabel() != null ) {
g.drawString( getScaleLabel(), ( x1 + 2 ), y3 - 2 );
}
+ g.setStroke( s );
}
final private int paintTaxonomy( final Graphics2D g,
_scale_label = scale_label;
}
+ private final void setupStroke( final Graphics2D g ) {
+ if ( getYdistance() < 0.001 ) {
+ g.setStroke( STROKE_005 );
+ }
+ else if ( getYdistance() < 0.01 ) {
+ g.setStroke( STROKE_01 );
+ }
+ else if ( getYdistance() < 0.5 ) {
+ g.setStroke( STROKE_025 );
+ }
+ else if ( getYdistance() < 1 ) {
+ g.setStroke( STROKE_05 );
+ }
+ else if ( getYdistance() < 2 ) {
+ g.setStroke( STROKE_075 );
+ }
+ else if ( getYdistance() < 20 ) {
+ g.setStroke( STROKE_1 );
+ }
+ else {
+ g.setStroke( STROKE_2 );
+ }
+ }
+
final private void setUpUrtFactor() {
final int d = getVisibleRect().width < getVisibleRect().height ? getVisibleRect().width
: getVisibleRect().height;
final StringBuilder sb = new StringBuilder();
if ( n.getNodeData().isHasSequence()
&& !ForesterUtil.isEmpty( n.getNodeData().getSequence().getMolecularSequence() ) ) {
+ final StringBuilder ann = new StringBuilder();
+ if ( !ForesterUtil.isEmpty( n.getName() ) ) {
+ ann.append( n.getName() );
+ ann.append( "|" );
+ }
+ if ( !ForesterUtil.isEmpty( n.getNodeData().getSequence().getSymbol() ) ) {
+ ann.append( "SYM=" );
+ ann.append( n.getNodeData().getSequence().getSymbol() );
+ ann.append( "|" );
+ }
if ( !ForesterUtil.isEmpty( n.getNodeData().getSequence().getName() ) ) {
- sb.append( SequenceWriter.toFasta( n.getNodeData().getSequence().getName(), n.getNodeData()
- .getSequence().getMolecularSequence(), 60 ) );
+ ann.append( "NAME=" );
+ ann.append( n.getNodeData().getSequence().getName() );
+ ann.append( "|" );
}
- else {
- sb.append( SequenceWriter.toFasta( n.getName(), n.getNodeData().getSequence()
- .getMolecularSequence(), 60 ) );
+ if ( n.getNodeData().getSequence().getAccession() != null ) {
+ ann.append( "ACC=" );
+ ann.append( n.getNodeData().getSequence().getAccession().asText() );
+ ann.append( "|" );
}
+ if ( n.getNodeData().isHasTaxonomy() ) {
+ if ( !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getTaxonomyCode() ) ) {
+ ann.append( "TAXID=" );
+ ann.append( n.getNodeData().getTaxonomy().getTaxonomyCode() );
+ ann.append( "|" );
+ }
+ if ( !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getScientificName() ) ) {
+ ann.append( "SN=" );
+ ann.append( n.getNodeData().getTaxonomy().getScientificName() );
+ ann.append( "|" );
+ }
+ }
+ String ann_str = ann.toString().trim();
+ if ( ann_str.endsWith( "|" ) ) {
+ ann_str = ann_str.substring( 0, ann_str.length() - 1 );
+ }
+ sb.append( SequenceWriter.toFasta( ann_str, n.getNodeData().getSequence()
+ .getMolecularSequence(), 60 ) );
data.add( sb.toString() );
}
break;
data.add( n.getNodeData().getTaxonomy().getScientificName() );
}
break;
+ case TAXONOMY_COMM0N_NAME:
+ if ( n.getNodeData().isHasTaxonomy()
+ && !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getCommonName() ) ) {
+ data.add( n.getNodeData().getTaxonomy().getCommonName() );
+ }
+ break;
case TAXONOMY_CODE:
if ( n.getNodeData().isHasTaxonomy()
&& !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getTaxonomyCode() ) ) {
+ getOptions().getExtDescNodeDataToReturn() );
}
} // for loop
+ final StringBuilder sb = new StringBuilder();
+ final int size = makeSB( data, getOptions(), sb );
if ( ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.CONSOLE )
|| ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.BUFFER_ONLY ) ) {
- final StringBuilder sb = new StringBuilder();
- for( final String d : data ) {
- if ( !ForesterUtil.isEmpty( d ) ) {
- if ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.CONSOLE ) {
- System.out.println( d );
- }
- sb.append( d );
- sb.append( ForesterUtil.LINE_SEPARATOR );
- }
+ if ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.CONSOLE ) {
+ System.out.println( sb );
}
if ( sb.length() < 1 ) {
clearCurrentExternalNodesDataBuffer();
}
}
else if ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.WINODW ) {
- final StringBuilder sb = new StringBuilder();
- for( final String d : data ) {
- if ( !ForesterUtil.isEmpty( d ) ) {
- sb.append( d );
- sb.append( ForesterUtil.LINE_SEPARATOR );
- }
- }
if ( sb.length() < 1 ) {
AptxUtil.showInformationMessage( this,
"No Appropriate Data (" + obtainTitleForExtDescNodeData() + ")",
}
else {
setCurrentExternalNodesDataBuffer( sb );
- final String title = "External Descendants "
- + ( getOptions().getExtDescNodeDataToReturn() == NODE_DATA.UNKNOWN ? "Data"
- : obtainTitleForExtDescNodeData() ) + " (" + data.size() + "/"
- + node.getNumberOfExternalNodes() + ") For Node " + node;
+ final String title = ( getOptions().getExtDescNodeDataToReturn() == NODE_DATA.UNKNOWN ? "Data"
+ : obtainTitleForExtDescNodeData() )
+ + " for "
+ + data.size()
+ + "/"
+ + node.getNumberOfExternalNodes()
+ + " external descendats of node "
+ + node
+ + ", unique entries: " + size;
final String s = sb.toString().trim();
if ( getMainPanel().getMainFrame() == null ) {
// Must be "E" applet version.
}
}
+ private int makeSB( final List<String> data, final Options optz, final StringBuilder sb ) {
+ final SortedMap<String, Integer> map = new TreeMap<String, Integer>();
+ if ( ( optz.getExtDescNodeDataToReturn() != NODE_DATA.SEQUENCE_MOL_SEQ )
+ && ( optz.getExtDescNodeDataToReturn() != NODE_DATA.SEQUENCE_MOL_SEQ_FASTA ) ) {
+ for( final String d : data ) {
+ if ( !ForesterUtil.isEmpty( d ) ) {
+ if ( map.containsKey( d ) ) {
+ map.put( d, map.get( d ) + 1 );
+ }
+ else {
+ map.put( d, 1 );
+ }
+ }
+ }
+ }
+ int size = 0;
+ if ( ( optz.getExtDescNodeDataToReturn() != NODE_DATA.SEQUENCE_MOL_SEQ )
+ && ( optz.getExtDescNodeDataToReturn() != NODE_DATA.SEQUENCE_MOL_SEQ_FASTA ) ) {
+ for( final Entry<String, Integer> e : map.entrySet() ) {
+ final String v = e.getKey();
+ final Object c = e.getValue();
+ sb.append( v );
+ sb.append( "\t" );
+ sb.append( c );
+ sb.append( ForesterUtil.LINE_SEPARATOR );
+ }
+ size = map.size();
+ }
+ else {
+ for( final String d : data ) {
+ if ( !ForesterUtil.isEmpty( d ) ) {
+ sb.append( d );
+ sb.append( ForesterUtil.LINE_SEPARATOR );
+ }
+ }
+ size = data.size();
+ }
+ return size;
+ }
+
final private void showNodeDataPopup( final MouseEvent e, final PhylogenyNode node ) {
try {
if ( ( node.getName().length() > 0 )