package jalview.analysis; import static org.testng.Assert.assertSame; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import java.util.Arrays; import java.util.List; import junit.extensions.PA; import org.testng.annotations.Test; public class AlignmentSorterTest { @Test(groups = "Functional") public void testSortByFeature_score() { SequenceI seq1 = new Sequence("Seq1", "ABC--D-EFGHIJ"); SequenceI seq2 = new Sequence("Seq2", "ABCDEFGHIJ"); SequenceI seq3 = new Sequence("Seq3", "ABCDE-FGHIJ"); SequenceI seq4 = new Sequence("Seq4", "ABCDEFGHIJ"); SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 }; AlignmentI al = new Alignment(seqs); al.setDataset(null); /* * sort with no score features does nothing */ PA.setValue(AlignmentSorter.getInstance(), "sortByFeatureCriteria", null); AlignmentSorter.sortByFeature(null, null, 0, al.getWidth(), al, AlignmentSorter.FEATURE_SCORE); assertSame(al.getSequenceAt(0), seq1); assertSame(al.getSequenceAt(1), seq2); assertSame(al.getSequenceAt(2), seq3); assertSame(al.getSequenceAt(3), seq4); /* * add score and non-score features * seq1 Cath(2.0) Pfam(4.0) average 3.0 * seq2 Cath(2.5) Metal(NaN) average 2.5 * seq3 KD(-4), KD(3.0) average -0.5 * seq4 Helix(NaN) - should sort as if largest score */ seq1.addSequenceFeature(new SequenceFeature("Cath", "", 2, 3, 2.0f, "g1")); seq1.addSequenceFeature(new SequenceFeature("Pfam", "", 4, 5, 4.0f, "g2")); seq2.addSequenceFeature(new SequenceFeature("Cath", "", 2, 3, 2.5f, "g3")); seq2.addSequenceFeature(new SequenceFeature("Metal", "", 2, 3, Float.NaN, "g4")); seq3.addSequenceFeature(new SequenceFeature("kD", "", 2, 3, -4f, "g5")); seq3.addSequenceFeature(new SequenceFeature("kD", "", 5, 6, 3.0f, "g6")); seq4.addSequenceFeature(new SequenceFeature("Helix", "", 2, 3, Float.NaN, "g7")); /* * sort by ascending score, no filter on feature type or group * NB sort order for the same feature set (none) gets toggled, so descending */ PA.setValue(AlignmentSorter.getInstance(), "sortByFeatureAscending", true); AlignmentSorter.sortByFeature(null, null, 0, al.getWidth(), al, AlignmentSorter.FEATURE_SCORE); assertSame(al.getSequenceAt(3), seq3); // -0.5 assertSame(al.getSequenceAt(2), seq2); // 2.5 assertSame(al.getSequenceAt(1), seq1); // 3.0 assertSame(al.getSequenceAt(0), seq4); // maximum 'score' /* * repeat sort toggles order - now ascending */ AlignmentSorter.sortByFeature(null, null, 0, al.getWidth(), al, AlignmentSorter.FEATURE_SCORE); assertSame(al.getSequenceAt(0), seq3); // -0.5 assertSame(al.getSequenceAt(1), seq2); // 2.5 assertSame(al.getSequenceAt(2), seq1); // 3.0 assertSame(al.getSequenceAt(3), seq4); /* * specify features, excluding Pfam * seq1 average is now 2.0 * next sort is ascending (not toggled) as for a different feature set */ List types = Arrays.asList(new String[] { "Cath", "kD" }); AlignmentSorter.sortByFeature(types, null, 0, al.getWidth(), al, AlignmentSorter.FEATURE_SCORE); assertSame(al.getSequenceAt(0), seq3); // -0.5 assertSame(al.getSequenceAt(1), seq1); // 2.0 assertSame(al.getSequenceAt(2), seq2); // 2.5 assertSame(al.getSequenceAt(3), seq4); /* * specify groups, excluding g5 (kD -4 score) * seq3 average is now 3.0 * next sort is ascending (not toggled) as for a different group spec */ List groups = Arrays.asList(new String[] { "g1", "g2", "g3", "g6" }); AlignmentSorter.sortByFeature(types, groups, 0, al.getWidth(), al, AlignmentSorter.FEATURE_SCORE); assertSame(al.getSequenceAt(0), seq1); // 2.0 assertSame(al.getSequenceAt(1), seq2); // 2.5 assertSame(al.getSequenceAt(2), seq3); // 3.0 assertSame(al.getSequenceAt(3), seq4); /* * limit to columns 0-4, excluding 2nd feature of seq1 and seq3 * seq1 is now 2.0, seq3 is now -4 */ // fails because seq1.findPosition(4) returns 4 // although residue 4 is in column 5! - JAL-2544 AlignmentSorter.sortByFeature(null, null, 0, 4, al, AlignmentSorter.FEATURE_SCORE); assertSame(al.getSequenceAt(0), seq3); // -4 assertSame(al.getSequenceAt(1), seq1); // 2.0 assertSame(al.getSequenceAt(2), seq2); // 2.5 assertSame(al.getSequenceAt(3), seq4); } @Test(groups = "Functional") public void testSortByFeature_density() { // TODO } }