+ realignWithMafft();
+ msa_prop = new MsaProperties( _msa, id, _calculate_shannon_entropy );
+ msa_props.add( msa_prop );
+ printMsaProperties( msa_prop );
+ System.out.print( "(realigned)" );
+ System.out.println();
+ }
+ else if ( isPrintMsaStats( i ) ) {
+ removeGapColumns();
+ msa_prop = new MsaProperties( _msa, id, _calculate_shannon_entropy );
+ msa_props.add( msa_prop );
+ printMsaProperties( msa_prop );
+ System.out.println();
+ }
+ ++i;
+ }
+
+ if ( _phylogentic_inference ) {
+ decorateTree( phy, msa_props, true );
+ displayTree( phy );
+ }
+ return msa_props;
+ }
+
+ private final static void addSeqs2Tree( final Msa msa, final Phylogeny phy ) {
+ for( int i = 0; i < msa.getNumberOfSequences(); ++i ) {
+ final MolecularSequence seq = msa.getSequence( i );
+ final String seq_name = seq.getIdentifier();
+ final PhylogenyNode n = phy.getNode( seq_name );
+ if ( !n.getNodeData().isHasSequence() ) {
+ n.getNodeData().addSequence( new org.forester.phylogeny.data.Sequence() );
+ }
+ else {
+ throw new IllegalArgumentException( "this should not have happened" );
+ }
+ n.getNodeData().getSequence().setMolecularSequence( seq.getMolecularSequenceAsString() );
+ n.getNodeData().getSequence().setMolecularSequenceAligned( true );
+ n.getNodeData().getSequence().setName( seq_name );
+ }
+ }
+
+ private final static void decorateTree( final Phylogeny phy,
+ final List<MsaProperties> msa_props,
+ final boolean chart_only ) {
+ final BasicDescriptiveStatistics length_stats = new BasicDescriptiveStatistics();
+ for( int i = 0; i < msa_props.size(); ++i ) {
+ final MsaProperties msa_prop = msa_props.get( i );
+ final String id = msa_prop.getRemovedSeq();
+ if ( !ForesterUtil.isEmpty( id ) ) {
+ length_stats.addValue( msa_prop.getLength() );
+ }
+ }
+ final double mean = length_stats.arithmeticMean();
+ final double min = length_stats.getMin();
+ final double max = length_stats.getMax();
+ final Color min_color = new Color( 0, 255, 0 );
+ final Color max_color = new Color( 255, 0, 0 );
+ final Color mean_color = new Color( 255, 255, 0 );
+ final PhylogenyNodeIterator it = phy.iteratorExternalForward();
+ if ( chart_only ) {
+ while ( it.hasNext() ) {
+ final NodeVisualData vis = new NodeVisualData();
+ vis.setFillType( NodeFill.SOLID );
+ vis.setShape( NodeShape.RECTANGLE );
+ vis.setNodeColor( min_color );
+ it.next().getNodeData().setNodeVisualData( vis );
+ }
+ }
+ for( int i = 0; i < msa_props.size(); ++i ) {
+ final MsaProperties msa_prop = msa_props.get( i );
+ final String id = msa_prop.getRemovedSeq();
+ if ( !ForesterUtil.isEmpty( id ) ) {
+ final PhylogenyNode n = phy.getNode( id );
+ n.setName( n.getName() + " [" + i + "]" );
+ if ( !chart_only ) {
+ final NodeVisualData vis = new NodeVisualData();
+ vis.setFillType( NodeFill.SOLID );
+ vis.setShape( NodeShape.RECTANGLE );
+ vis.setNodeColor( ForesterUtil.calcColor( msa_prop.getLength(), min, max, mean_color, max_color ) );
+ n.getNodeData().setNodeVisualData( vis );