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 junit.extensions.PA;
16 import org.testng.annotations.Test;
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 PA.setValue(AlignmentSorter.class, "sortByFeatureCriteria", null);
36 AlignmentSorter.sortByFeature(null, null, 0, al.getWidth(), al,
37 AlignmentSorter.FEATURE_SCORE);
38 assertSame(al.getSequenceAt(0), seq1);
39 assertSame(al.getSequenceAt(1), seq2);
40 assertSame(al.getSequenceAt(2), seq3);
41 assertSame(al.getSequenceAt(3), seq4);
44 * add score and non-score features
45 * seq1 Cath(2.0) Pfam(4.0) average 3.0
46 * seq2 Cath(2.5) Metal(NaN) average 2.5
47 * seq3 KD(-4), KD(3.0) average -0.5
48 * seq4 Helix(NaN) - should sort as if largest score
50 seq1.addSequenceFeature(
51 new SequenceFeature("Cath", "", 2, 3, 2.0f, "g1"));
52 seq1.addSequenceFeature(
53 new SequenceFeature("Pfam", "", 4, 5, 4.0f, "g2"));
54 seq2.addSequenceFeature(
55 new SequenceFeature("Cath", "", 2, 3, 2.5f, "g3"));
56 seq2.addSequenceFeature(
57 new SequenceFeature("Metal", "", 2, 3, Float.NaN, "g4"));
58 seq3.addSequenceFeature(new SequenceFeature("kD", "", 2, 3, -4f, "g5"));
59 seq3.addSequenceFeature(
60 new SequenceFeature("kD", "", 5, 6, 3.0f, "g6"));
61 seq4.addSequenceFeature(
62 new SequenceFeature("Helix", "", 2, 3, Float.NaN, "g7"));
65 * sort by ascending score, no filter on feature type or group
66 * NB sort order for the same feature set (none) gets toggled, so descending
68 PA.setValue(AlignmentSorter.class, "sortByFeatureAscending", true);
69 AlignmentSorter.sortByFeature(null, null, 0, al.getWidth(), al,
70 AlignmentSorter.FEATURE_SCORE);
71 assertSame(al.getSequenceAt(3), seq3); // -0.5
72 assertSame(al.getSequenceAt(2), seq2); // 2.5
73 assertSame(al.getSequenceAt(1), seq1); // 3.0
74 assertSame(al.getSequenceAt(0), seq4); // maximum 'score'
77 * repeat sort toggles order - now ascending
79 AlignmentSorter.sortByFeature(null, null, 0, al.getWidth(), al,
80 AlignmentSorter.FEATURE_SCORE);
81 assertSame(al.getSequenceAt(0), seq3); // -0.5
82 assertSame(al.getSequenceAt(1), seq2); // 2.5
83 assertSame(al.getSequenceAt(2), seq1); // 3.0
84 assertSame(al.getSequenceAt(3), seq4);
87 * specify features, excluding Pfam
88 * seq1 average is now 2.0
89 * next sort is ascending (not toggled) as for a different feature set
91 List<String> types = Arrays.asList(new String[] { "Cath", "kD" });
92 AlignmentSorter.sortByFeature(types, null, 0, al.getWidth(), al,
93 AlignmentSorter.FEATURE_SCORE);
94 assertSame(al.getSequenceAt(0), seq3); // -0.5
95 assertSame(al.getSequenceAt(1), seq1); // 2.0
96 assertSame(al.getSequenceAt(2), seq2); // 2.5
97 assertSame(al.getSequenceAt(3), seq4);
100 * specify groups, excluding g5 (kD -4 score)
101 * seq3 average is now 3.0
102 * next sort is ascending (not toggled) as for a different group spec
104 List<String> groups = Arrays
106 { "g1", "g2", "g3", "g6" });
107 AlignmentSorter.sortByFeature(types, groups, 0, al.getWidth(), al,
108 AlignmentSorter.FEATURE_SCORE);
109 assertSame(al.getSequenceAt(0), seq1); // 2.0
110 assertSame(al.getSequenceAt(1), seq2); // 2.5
111 assertSame(al.getSequenceAt(2), seq3); // 3.0
112 assertSame(al.getSequenceAt(3), seq4);
115 * limit to columns 0-4, excluding 2nd feature of seq1 and seq3
116 * seq1 is now 2.0, seq3 is now -4
118 // fails because seq1.findPosition(4) returns 4
119 // although residue 4 is in column 5! - JAL-2544
120 AlignmentSorter.sortByFeature(null, null, 0, 4, al,
121 AlignmentSorter.FEATURE_SCORE);
122 assertSame(al.getSequenceAt(0), seq3); // -4
123 assertSame(al.getSequenceAt(1), seq1); // 2.0
124 assertSame(al.getSequenceAt(2), seq2); // 2.5
125 assertSame(al.getSequenceAt(3), seq4);
128 @Test(groups = "Functional")
129 public void testSortByFeature_density()