1 package jalview.datamodel;
3 import static org.testng.Assert.*;
5 import org.testng.Assert;
6 import org.testng.annotations.BeforeClass;
7 import org.testng.annotations.Test;
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;
16 public class PAEContactMatrixTest
18 @BeforeClass(alwaysRun = true)
19 public void setUpJvOptionPane()
21 JvOptionPane.setInteractiveMode(false);
22 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
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}};
33 * test associations for a PAE matrix
35 @Test(groups = { "Functional" })
36 public void testSeqAssociatedPAEMatrix()
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);
51 assertNotNull(seq.getContactListFor(aa, seq.getEnd()-1));
52 assertNull(seq.getContactListFor(aa, seq.getEnd()));
54 ContactListI cm = seq.getContactListFor(aa, seq.getStart());
55 assertEquals(cm.getContactAt(seq.getStart()),1d);
56 verifyPAEmatrix(seq, aa, 0,0,4);
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);
64 // individual annotation elements need to be distinct for Matrix associated rows
65 Annotation ae5=aa.getAnnotationForPosition(5);
66 Annotation ae6=aa.getAnnotationForPosition(6);
71 cm = seq.getContactListFor(aa, 0);
72 assertEquals(cm.getContactAt(0),1d);
73 verifyPAEmatrix(seq, aa, 0, 0, 4);
76 paematrix.setGroupSet(GroupSet.makeGroups(paematrix, 0.1f, false));
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);
83 MappableContactMatrixI remapped = ((MappableContactMatrixI)paematrix).liftOver(newseq, sqmap);
84 assertTrue(remapped instanceof PAEContactMatrix);
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)));
96 assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(10)));
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");
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);
110 mappedCl = alcl.getMappedPositionsFor(0, 4);
111 assertNotNull(mappedCl);
112 assertEquals(4,mappedCl.length,"getMappedPositionsFor doesn't support discontinuous mappings to contactList");
114 // remap2 - test with original matrix map from 1-5 remapped to 5-9
116 seq = new Sequence("Seq/1-5","ASDQE");
117 paematrix = new PAEContactMatrix(seq, PAEdata);
118 assertTrue(paematrix instanceof MappableContactMatrixI);
119 aa = seq.addContactList(paematrix);
121 newseq = new Sequence("Seq","ASDQEASDQEASDQE");
122 sqmap = new Mapping(seq, new MapList(new int[] {5,9},new int[] { 1,5}, 1, 1));
124 remapped = ((MappableContactMatrixI)paematrix).liftOver(newseq, sqmap);
125 assertTrue(remapped instanceof PAEContactMatrix);
128 newaa = newseq.addContactList(remapped);
129 verify_mapping(newseq, newaa);
131 // remap3 - remap2 but mapping sense in liftover is reversed
133 seq = new Sequence("Seq/1-5","ASDQE");
134 paematrix = new PAEContactMatrix(seq, PAEdata);
135 assertTrue(paematrix instanceof MappableContactMatrixI);
136 aa = seq.addContactList(paematrix);
138 newseq = new Sequence("Seq","ASDQEASDQEASDQE");
139 sqmap = new Mapping(newseq, new MapList(new int[] { 1,5},new int[] {5,9},1, 1));
141 remapped = ((MappableContactMatrixI)paematrix).liftOver(newseq, sqmap);
142 assertTrue(remapped instanceof PAEContactMatrix);
145 newaa = newseq.addContactList(remapped);
146 verify_mapping(newseq, newaa);
149 * checks that the PAE matrix is located at positions 1-9 in newseq, and columns are not truncated.
153 private void verify_mapping(SequenceI newseq, AlignmentAnnotation newaa)
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)));
165 verifyPAEmatrix(newseq, newaa, 4, 4, 8);
168 private void verifyPAEmatrix(SequenceI seq, AlignmentAnnotation aa, int topl, int rowl, int rowr)
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);