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, "lastSortByFeatureScore", null);
36 AlignmentSorter.sortByFeature((String) null, null, 0, al.getWidth(),
38 AlignmentSorter.FEATURE_SCORE);
39 assertSame(al.getSequenceAt(0), seq1);
40 assertSame(al.getSequenceAt(1), seq2);
41 assertSame(al.getSequenceAt(2), seq3);
42 assertSame(al.getSequenceAt(3), seq4);
45 * add score and non-score features
46 * seq1 Cath(2.0) Pfam(4.0) average 3.0
47 * seq2 Cath(2.5) Metal(NaN) average 2.5
48 * seq3 KD(-4), KD(3.0) average -0.5
49 * seq4 Helix(NaN) - should sort as if largest score
51 seq1.addSequenceFeature(new SequenceFeature("Cath", "", 2, 3, 2.0f,
53 seq1.addSequenceFeature(new SequenceFeature("Pfam", "", 4, 5, 4.0f,
55 seq2.addSequenceFeature(new SequenceFeature("Cath", "", 2, 3, 2.5f,
57 seq2.addSequenceFeature(new SequenceFeature("Metal", "", 2, 3,
59 seq3.addSequenceFeature(new SequenceFeature("kD", "", 2, 3, -4f, "g5"));
60 seq3.addSequenceFeature(new SequenceFeature("kD", "", 5, 6, 3.0f, "g6"));
61 seq4.addSequenceFeature(new SequenceFeature("Helix", "", 2, 3,
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, "sortByFeatureScoreAscending", true);
69 AlignmentSorter.sortByFeature((String) null, null, 0, al.getWidth(),
70 al, 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((String) null, null, 0, al.getWidth(),
80 al, 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.asList(new String[] { "g1", "g2", "g3",
106 AlignmentSorter.sortByFeature(types, groups, 0, al.getWidth(), al,
107 AlignmentSorter.FEATURE_SCORE);
108 assertSame(al.getSequenceAt(0), seq1); // 2.0
109 assertSame(al.getSequenceAt(1), seq2); // 2.5
110 assertSame(al.getSequenceAt(2), seq3); // 3.0
111 assertSame(al.getSequenceAt(3), seq4);
114 * limit to columns 0-4, excluding 2nd feature of seq1 and seq3
115 * seq1 is now 2.0, seq3 is now -4
117 // fails because seq1.findPosition(4) returns 4
118 // although residue 4 is in column 5! - JAL-2544
119 AlignmentSorter.sortByFeature((String) null, null, 0, 4, al,
120 AlignmentSorter.FEATURE_SCORE);
121 assertSame(al.getSequenceAt(0), seq3); // -4
122 assertSame(al.getSequenceAt(1), seq1); // 2.0
123 assertSame(al.getSequenceAt(2), seq2); // 2.5
124 assertSame(al.getSequenceAt(3), seq4);
127 @Test(groups = "Functional")
128 public void testSortByFeature_density()