JAL-4134 colour by annotation needs distinct annotation elements to hold colours
[jalview.git] / test / jalview / datamodel / PAEContactMatrixTest.java
1 package jalview.datamodel;
2
3 import static org.testng.Assert.*;
4
5 import org.testng.Assert;
6 import org.testng.annotations.BeforeClass;
7 import org.testng.annotations.Test;
8
9 import jalview.analysis.AlignmentUtils;
10 import jalview.analysis.SeqsetUtils;
11 import jalview.gui.JvOptionPane;
12 import jalview.util.MapList;
13 import jalview.ws.datamodel.MappableContactMatrixI;
14 import jalview.ws.datamodel.alphafold.PAEContactMatrix;
15
16 public class PAEContactMatrixTest
17 {
18   @BeforeClass(alwaysRun = true)
19   public void setUpJvOptionPane()
20   {
21     JvOptionPane.setInteractiveMode(false);
22     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
23   }
24
25   static float[][] PAEdata = {
26       {1.0f,2.0f,3.0f,4.0f,5.0f},
27       {2.0f,1.0f,2.0f,3.0f,4.0f},
28       {3.0f,2.0f,1.0f,2.0f,3.0f},
29       {4.0f,3.0f,2.0f,1.0f,2.0f},
30       {5.0f,4.0f,3.0f,2.0f,1.0f}};
31   
32   /**
33    * test associations for a PAE matrix
34    */
35   @Test(groups = { "Functional" })
36   public void testSeqAssociatedPAEMatrix()
37   {
38     Sequence seq = new Sequence("Seq","ASDQE");
39     AlignmentAnnotation aa = seq.addContactList(new PAEContactMatrix(seq, PAEdata));
40     assertNotNull(seq.getContactListFor(aa, 0));
41     assertEquals(seq.getContactListFor(aa, 0).getContactAt(0),1.0);
42     assertNotNull(seq.getContactListFor(aa, 1));
43     assertEquals(seq.getContactListFor(aa, 1).getContactAt(1),1.0);
44     assertNotNull(seq.getContactListFor(aa, 2));
45     assertEquals(seq.getContactListFor(aa, 2).getContactAt(2),1.0);
46     assertNotNull(seq.getContactListFor(aa, 3));
47     assertEquals(seq.getContactListFor(aa, 3).getContactAt(3),1.0);
48     assertNotNull(seq.getContactListFor(aa, 4));
49     assertEquals(seq.getContactListFor(aa, 4).getContactAt(4),1.0);
50     
51     assertNotNull(seq.getContactListFor(aa, seq.getEnd()-1));
52     assertNull(seq.getContactListFor(aa, seq.getEnd()));
53     
54     ContactListI cm = seq.getContactListFor(aa, seq.getStart());
55     assertEquals(cm.getContactAt(seq.getStart()),1d);
56     verifyPAEmatrix(seq, aa, 0,0,4);
57     
58     
59     // Now associated with sequence not starting at 1
60     seq = new Sequence("Seq/5-9","ASDQE");
61     ContactMatrixI paematrix = new PAEContactMatrix(seq, PAEdata);
62     aa = seq.addContactList(paematrix);
63     assertNotNull(aa);
64     // individual annotation elements need to be distinct for Matrix associated rows
65     Annotation ae5=aa.getAnnotationForPosition(5);
66     Annotation ae6=aa.getAnnotationForPosition(6);
67     assertNotNull(ae5);
68     assertNotNull(ae6);
69     assertTrue(ae5!=ae6);
70     
71     cm = seq.getContactListFor(aa, 0);
72     assertEquals(cm.getContactAt(0),1d);
73     verifyPAEmatrix(seq, aa, 0, 0, 4);
74
75     // test clustering
76     paematrix.setGroupSet(GroupSet.makeGroups(paematrix, 0.1f, false));
77     
78     // remap - test the MappableContactMatrix.liftOver method
79     SequenceI newseq = new Sequence("Seq","ASDQEASDQEASDQE");
80     Mapping sqmap = new Mapping(seq, new MapList(new int[] {5,8,10,10},new int[] { 5,9}, 1, 1));
81     assertTrue(paematrix instanceof MappableContactMatrixI);
82     
83     MappableContactMatrixI remapped = ((MappableContactMatrixI)paematrix).liftOver(newseq, sqmap);
84     assertTrue(remapped instanceof PAEContactMatrix);
85     
86     AlignmentAnnotation newaa = newseq.addContactList(remapped);
87     assertNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(1)));
88     assertNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(4)));
89     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(5)));
90     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(6)));
91     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(7)));
92     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(8)));
93     // no mapping for position 9
94     assertNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(9)));
95     // last column
96     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(10)));
97
98     // verify MappedPositions includes discontinuity
99     int[] mappedCl = newseq.getContactListFor(newaa, 5).getMappedPositionsFor(0, 4);
100     assertEquals(4,mappedCl.length,"getMappedPositionsFor doesn't support discontinuous mappings to contactList");
101     
102     // make it harder. 
103     
104     SequenceI alseq = newseq.getSubSequence(6, 10);
105     alseq.insertCharAt(2, 2, '-');
106     AlignmentI alForSeq=new Alignment(new SequenceI[] { alseq });
107     newaa = AlignmentUtils.addReferenceAnnotationTo(alForSeq, alseq, newaa, null);
108     ContactListI alcl = alForSeq.getContactListFor(newaa, 1);
109     assertNotNull(alcl);
110     mappedCl = alcl.getMappedPositionsFor(0, 4);
111     assertNotNull(mappedCl);
112     assertEquals(4,mappedCl.length,"getMappedPositionsFor doesn't support discontinuous mappings to contactList");
113     
114     // remap2 - test with original matrix map from 1-5 remapped to 5-9
115     
116     seq = new Sequence("Seq/1-5","ASDQE");
117     paematrix = new PAEContactMatrix(seq, PAEdata);
118     assertTrue(paematrix instanceof MappableContactMatrixI);
119     aa = seq.addContactList(paematrix);
120     
121     newseq = new Sequence("Seq","ASDQEASDQEASDQE");
122     sqmap = new Mapping(seq, new MapList(new int[] {5,9},new int[] { 1,5}, 1, 1));
123     
124     remapped = ((MappableContactMatrixI)paematrix).liftOver(newseq, sqmap);
125     assertTrue(remapped instanceof PAEContactMatrix);
126     
127     
128     newaa = newseq.addContactList(remapped);
129     verify_mapping(newseq, newaa);
130
131     // remap3 - remap2 but mapping sense in liftover is reversed
132     
133     seq = new Sequence("Seq/1-5","ASDQE");
134     paematrix = new PAEContactMatrix(seq, PAEdata);
135     assertTrue(paematrix instanceof MappableContactMatrixI);
136     aa = seq.addContactList(paematrix);
137     
138     newseq = new Sequence("Seq","ASDQEASDQEASDQE");
139     sqmap = new Mapping(newseq, new MapList(new int[] { 1,5},new int[] {5,9},1, 1));
140     
141     remapped = ((MappableContactMatrixI)paematrix).liftOver(newseq, sqmap);
142     assertTrue(remapped instanceof PAEContactMatrix);
143     
144     
145     newaa = newseq.addContactList(remapped);
146     verify_mapping(newseq, newaa);
147   }
148   /**
149    * checks that the PAE matrix is located at positions 1-9 in newseq, and columns are not truncated.
150    * @param newseq
151    * @param newaa
152    */
153   private void verify_mapping(SequenceI newseq, AlignmentAnnotation newaa)
154   {
155   assertNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(1)));
156     assertNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(4)));
157     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(5)));
158     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(6)));
159     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(7)));
160     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(8)));
161     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(9)));
162     // last column should be null this time
163     assertNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(10)));
164     
165     verifyPAEmatrix(newseq, newaa, 4, 4, 8);
166   }
167
168   private void verifyPAEmatrix(SequenceI seq, AlignmentAnnotation aa, int topl, int rowl, int rowr)
169   {
170     int[] mappedCl;
171     for (int f=rowl;f<=rowr;f++) {
172       ContactListI clist = seq.getContactListFor(aa, f);
173       assertNotNull(clist,"No ContactListI for position "+(f));
174       assertEquals(clist.getContactAt(0), (double) f-topl+1,"for column "+f+" relative to "+topl);
175       mappedCl = clist.getMappedPositionsFor(0, 0);
176       assertNotNull(mappedCl);
177       assertEquals(mappedCl[0],mappedCl[1]);
178       assertEquals(mappedCl[0],seq.findIndex(seq.getStart()+topl));
179       assertEquals(clist.getContactAt(f-topl),1d, "for column and row "+f+" relative to "+topl);
180     }    
181   }
182
183 }