JAL-3253 code tidies and tweaks to Desktop
[jalview.git] / test / jalview / analysis / AlignmentSorterTest.java
1 package jalview.analysis;
2
3 import static org.testng.Assert.assertSame;
4
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;
10
11 import java.util.Arrays;
12 import java.util.List;
13
14 import org.testng.annotations.Test;
15
16 import junit.extensions.PA;
17
18 public class AlignmentSorterTest
19 {
20   @Test(groups = "Functional")
21   public void testSortByFeature_score()
22   {
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);
29     al.setDataset(null);
30
31     /*
32      * sort with no score features does nothing
33      */
34     AlignmentSorter sorter = (AlignmentSorter) PA
35             .invokeMethod(AlignmentSorter.class, "getInstance()",
36                     new Object[] {});
37     PA.setValue(sorter, "sortByFeatureCriteria", null);
38
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);
45
46     /*
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
52      */
53     seq1.addSequenceFeature(new SequenceFeature("Cath", "", 2, 3, 2.0f,
54             "g1"));
55     seq1.addSequenceFeature(new SequenceFeature("Pfam", "", 4, 5, 4.0f,
56             "g2"));
57     seq2.addSequenceFeature(new SequenceFeature("Cath", "", 2, 3, 2.5f,
58             "g3"));
59     seq2.addSequenceFeature(new SequenceFeature("Metal", "", 2, 3,
60             Float.NaN, "g4"));
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,
64             Float.NaN, "g7"));
65
66     /*
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
69      */
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'
77
78     /*
79      * repeat sort toggles order - now ascending
80      */
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);
87
88     /*
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
92      */
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);
100
101     /*
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
105      */
106     List<String> groups = Arrays.asList(new String[] { "g1", "g2", "g3",
107         "g6" });
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);
114
115     /*
116      * limit to columns 0-4, excluding 2nd feature of seq1 and seq3
117      * seq1 is now 2.0, seq3 is now -4
118      */
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);
127   }
128
129   @Test(groups = "Functional")
130   public void testSortByFeature_density()
131   {
132     // TODO
133   }
134 }