// java -Xmx2048m -cp // ~/SOFTWARE_DEV/ECLIPSE_WORKSPACE/forester/java/forester.jar // org.forester.application.decorator2 // RRMa_ALL_plus_RRMa_ee3_50_hmmalign_05_40_fme_with_seqs_2.phylo.xml // nature12311-s3_cz_4.txt x package org.forester.application; import java.io.File; import org.forester.io.parsers.phyloxml.PhyloXmlParser; import org.forester.io.writers.PhylogenyWriter; import org.forester.phylogeny.Phylogeny; import org.forester.phylogeny.PhylogenyNode; import org.forester.phylogeny.data.Annotation; import org.forester.phylogeny.factories.ParserBasedPhylogenyFactory; import org.forester.phylogeny.factories.PhylogenyFactory; import org.forester.phylogeny.iterators.PhylogenyNodeIterator; import org.forester.util.BasicTable; import org.forester.util.BasicTableParser; import org.forester.util.CommandLineArguments; public class decorator2 { private static final int SEQ_COLUMN = 3; private static final int TARGET_COLUMN = 4; public static void main( final String args[] ) { File intree = null; File outtree = null; File intable = null; try { CommandLineArguments cla = null; cla = new CommandLineArguments( args ); intree = cla.getFile( 0 ); intable = cla.getFile( 1 ); outtree = cla.getFile( 2 ); if ( outtree.exists() ) { System.out.println( outtree + " already exists" ); System.exit( -1 ); } final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance(); final PhyloXmlParser xml_parser = new PhyloXmlParser(); final Phylogeny phy = factory.create( intree, xml_parser )[ 0 ]; final BasicTable t = BasicTableParser.parse( intable, '\t' ); System.out.println( t.toString() ); final PhylogenyNodeIterator it = phy.iteratorPostorder(); int i = 0; while ( it.hasNext() ) { final PhylogenyNode node = it.next(); if ( node.isExternal() ) { processNode( node, t ); } i++; } final PhylogenyWriter writer = new PhylogenyWriter(); writer.toPhyloXML( outtree, phy, 0 ); } catch ( final Exception e ) { System.out.println( e.getLocalizedMessage() ); e.printStackTrace(); System.exit( -1 ); } } private static void processNode( final PhylogenyNode node, BasicTable t ) throws Exception { String node_seq = node.getNodeData().getSequence().getMolecularSequence().toUpperCase(); boolean found = false; for( int col = 0; col < t.getNumberOfRows(); ++col ) { String table_seq = t.getValueAsString( SEQ_COLUMN, col ).toUpperCase(); if ( table_seq.contains( node_seq ) ) { if ( found ) { throw new Exception( "Sequence from node " + node + " is not unique: " + node_seq ); } found = true; Annotation annotation = new Annotation( "target:" + t.getValueAsString( TARGET_COLUMN, col ) ); node.getNodeData().getSequence().addAnnotation( annotation ); System.out.println( node + "->" + annotation ); } } // if ( !found ) { // throw new Exception( "Sequence from node " + node + " not found: " + node_seq ); // } } }