package au.com.acpfg.misc.biojava; import org.knime.core.data.*; import org.knime.core.data.def.DefaultRow; import org.knime.core.data.def.JoinedRow; import org.knime.core.data.def.StringCell; import org.knime.core.node.*; import org.biojava.bio.seq.*; import org.biojava.bio.symbol.*; public class AlternateTranslationProcessor implements BioJavaProcessorInterface { public TranslationTable[] m_tables; public String[] m_table_names; public AlternateTranslationProcessor() { // load translation tables m_tables = new TranslationTable[16]; m_table_names = new String[m_tables.length]; m_tables[0] = RNATools.getGeneticCode(TranslationTable.ALT_YEAST_NUC); m_table_names[0] = TranslationTable.ALT_YEAST_NUC; m_tables[1] = RNATools.getGeneticCode(TranslationTable.ASCID_MITO); m_table_names[1] = TranslationTable.ASCID_MITO; m_tables[2] = RNATools.getGeneticCode(TranslationTable.BACTERIAL); m_table_names[2] = TranslationTable.BACTERIAL; m_tables[3] = RNATools.getGeneticCode(TranslationTable.BLEPH_MNUC); m_table_names[3] = TranslationTable.BLEPH_MNUC; m_tables[4] = RNATools.getGeneticCode(TranslationTable.CHLORO_MITO); m_table_names[4] = TranslationTable.CHLORO_MITO; m_tables[5] = RNATools.getGeneticCode(TranslationTable.CILIATE_NUC); m_table_names[5] = TranslationTable.CILIATE_NUC; m_tables[6] = RNATools.getGeneticCode(TranslationTable.ECHIN_MITO); m_table_names[6] = TranslationTable.ECHIN_MITO; m_tables[7] = RNATools.getGeneticCode(TranslationTable.EUPL_NUC); m_table_names[7] = TranslationTable.EUPL_NUC; m_tables[8] = RNATools.getGeneticCode(TranslationTable.FWORM_MITO); m_table_names[8] = TranslationTable.FWORM_MITO; m_tables[9] = RNATools.getGeneticCode(TranslationTable.INVERT_MITO); m_table_names[9] = TranslationTable.INVERT_MITO; m_tables[10] = RNATools.getGeneticCode(TranslationTable.MOLD_MITO); m_table_names[10] = TranslationTable.MOLD_MITO; m_tables[11] = RNATools.getGeneticCode(TranslationTable.SCENE_MITO); m_table_names[11] = TranslationTable.SCENE_MITO; m_tables[12] = RNATools.getGeneticCode(TranslationTable.TREMA_MITO); m_table_names[12] = TranslationTable.TREMA_MITO; m_tables[13] = RNATools.getGeneticCode(TranslationTable.UNIVERSAL); m_table_names[13] = TranslationTable.UNIVERSAL; m_tables[14] = RNATools.getGeneticCode(TranslationTable.VERT_MITO); m_table_names[14] = TranslationTable.VERT_MITO; m_tables[15] = RNATools.getGeneticCode(TranslationTable.YEAST_MITO); m_table_names[15] = TranslationTable.YEAST_MITO; } public void execute(BioJavaProcessorNodeModel m, ExecutionContext exec, NodeLogger l, BufferedDataTable[] inData, BufferedDataContainer c) throws Exception { if (!m.areSequencesDNA()) { throw new Exception("This task only works on DNA sequences! (re-configure the node)"); } RowIterator it = inData[0].iterator(); while (it.hasNext()) { DataRow r = it.next(); String str = m.getSequence(r); if (str == null || str.length() < 1) continue; SymbolList dna = m.getSequenceAsSymbol(str); DataCell[] cells = new DataCell[m_tables.length]; for (int i=0; i<m_tables.length; i++) { // trim if not multiple of 3 if (dna.length() %3 != 0) { dna = dna.subList(1, dna.length() - (dna.length() % 3)); } SymbolList rna = DNATools.toRNA(dna); SymbolList syms = SymbolListViews.windowedSymbolList(rna, 3); SymbolList prot= SymbolListViews.translate(syms, m_tables[i]); cells[i] = new StringCell(prot.seqString()); } c.addRowToTable(new JoinedRow(r, new DefaultRow(r.getKey(), cells))); } } public DataTableSpec get_table_spec() { DataColumnSpec[] allColSpecs = new DataColumnSpec[m_tables.length]; for (int i=0; i<m_tables.length; i++) { allColSpecs[i] = new DataColumnSpecCreator("Translation "+m_table_names[i], StringCell.TYPE).createSpec(); } DataTableSpec outputSpec = new DataTableSpec(allColSpecs); return outputSpec; } @Override public boolean isMerged() { return true; } }