1 package jalview.analysis;
3 import static org.testng.Assert.assertSame;
5 import jalview.datamodel.Alignment;
6 import jalview.datamodel.AlignmentI;
7 import jalview.datamodel.Sequence;
8 import jalview.datamodel.SequenceFeature;
9 import jalview.datamodel.SequenceI;
11 import java.util.Arrays;
12 import java.util.List;
14 import org.testng.annotations.Test;
16 import junit.extensions.PA;
18 public class AlignmentSorterTest
20 @Test(groups = "Functional")
21 public void testSortByFeature_score()
23 SequenceI seq1 = new Sequence("Seq1", "ABC--D-EFGHIJ");
24 SequenceI seq2 = new Sequence("Seq2", "ABCDEFGHIJ");
25 SequenceI seq3 = new Sequence("Seq3", "ABCDE-FGHIJ");
26 SequenceI seq4 = new Sequence("Seq4", "ABCDEFGHIJ");
27 SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 };
28 AlignmentI al = new Alignment(seqs);
32 * sort with no score features does nothing
34 AlignmentSorter sorter = (AlignmentSorter) PA
35 .invokeMethod(AlignmentSorter.class, "getInstance()",
37 PA.setValue(sorter, "sortByFeatureCriteria", null);
39 AlignmentSorter.sortByFeature(null, null, 0, al.getWidth(), al,
40 AlignmentSorter.FEATURE_SCORE);
41 assertSame(al.getSequenceAt(0), seq1);
42 assertSame(al.getSequenceAt(1), seq2);
43 assertSame(al.getSequenceAt(2), seq3);
44 assertSame(al.getSequenceAt(3), seq4);
47 * add score and non-score features
48 * seq1 Cath(2.0) Pfam(4.0) average 3.0
49 * seq2 Cath(2.5) Metal(NaN) average 2.5
50 * seq3 KD(-4), KD(3.0) average -0.5
51 * seq4 Helix(NaN) - should sort as if largest score
53 seq1.addSequenceFeature(new SequenceFeature("Cath", "", 2, 3, 2.0f,
55 seq1.addSequenceFeature(new SequenceFeature("Pfam", "", 4, 5, 4.0f,
57 seq2.addSequenceFeature(new SequenceFeature("Cath", "", 2, 3, 2.5f,
59 seq2.addSequenceFeature(new SequenceFeature("Metal", "", 2, 3,
61 seq3.addSequenceFeature(new SequenceFeature("kD", "", 2, 3, -4f, "g5"));
62 seq3.addSequenceFeature(new SequenceFeature("kD", "", 5, 6, 3.0f, "g6"));
63 seq4.addSequenceFeature(new SequenceFeature("Helix", "", 2, 3,
67 * sort by ascending score, no filter on feature type or group
68 * NB sort order for the same feature set (none) gets toggled, so descending
70 PA.setValue(sorter, "sortByFeatureAscending", true);
71 AlignmentSorter.sortByFeature(null, null, 0, al.getWidth(), al,
72 AlignmentSorter.FEATURE_SCORE);
73 assertSame(al.getSequenceAt(3), seq3); // -0.5
74 assertSame(al.getSequenceAt(2), seq2); // 2.5
75 assertSame(al.getSequenceAt(1), seq1); // 3.0
76 assertSame(al.getSequenceAt(0), seq4); // maximum 'score'
79 * repeat sort toggles order - now ascending
81 AlignmentSorter.sortByFeature(null, null, 0, al.getWidth(), al,
82 AlignmentSorter.FEATURE_SCORE);
83 assertSame(al.getSequenceAt(0), seq3); // -0.5
84 assertSame(al.getSequenceAt(1), seq2); // 2.5
85 assertSame(al.getSequenceAt(2), seq1); // 3.0
86 assertSame(al.getSequenceAt(3), seq4);
89 * specify features, excluding Pfam
90 * seq1 average is now 2.0
91 * next sort is ascending (not toggled) as for a different feature set
93 List<String> types = Arrays.asList(new String[] { "Cath", "kD" });
94 AlignmentSorter.sortByFeature(types, null, 0, al.getWidth(), al,
95 AlignmentSorter.FEATURE_SCORE);
96 assertSame(al.getSequenceAt(0), seq3); // -0.5
97 assertSame(al.getSequenceAt(1), seq1); // 2.0
98 assertSame(al.getSequenceAt(2), seq2); // 2.5
99 assertSame(al.getSequenceAt(3), seq4);
102 * specify groups, excluding g5 (kD -4 score)
103 * seq3 average is now 3.0
104 * next sort is ascending (not toggled) as for a different group spec
106 List<String> groups = Arrays.asList(new String[] { "g1", "g2", "g3",
108 AlignmentSorter.sortByFeature(types, groups, 0, al.getWidth(), al,
109 AlignmentSorter.FEATURE_SCORE);
110 assertSame(al.getSequenceAt(0), seq1); // 2.0
111 assertSame(al.getSequenceAt(1), seq2); // 2.5
112 assertSame(al.getSequenceAt(2), seq3); // 3.0
113 assertSame(al.getSequenceAt(3), seq4);
116 * limit to columns 0-4, excluding 2nd feature of seq1 and seq3
117 * seq1 is now 2.0, seq3 is now -4
119 // fails because seq1.findPosition(4) returns 4
120 // although residue 4 is in column 5! - JAL-2544
121 AlignmentSorter.sortByFeature(null, null, 0, 4, al,
122 AlignmentSorter.FEATURE_SCORE);
123 assertSame(al.getSequenceAt(0), seq3); // -4
124 assertSame(al.getSequenceAt(1), seq1); // 2.0
125 assertSame(al.getSequenceAt(2), seq2); // 2.5
126 assertSame(al.getSequenceAt(3), seq4);
129 @Test(groups = "Functional")
130 public void testSortByFeature_density()