--- /dev/null
+package jalview.datamodel;
+
+import static org.testng.Assert.*;
+
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import jalview.analysis.AlignmentUtils;
+import jalview.analysis.SeqsetUtils;
+import jalview.gui.JvOptionPane;
+import jalview.util.MapList;
+import jalview.ws.datamodel.MappableContactMatrixI;
+import jalview.ws.datamodel.alphafold.PAEContactMatrix;
+
+public class PAEContactMatrixTest
+{
+ @BeforeClass(alwaysRun = true)
+ public void setUpJvOptionPane()
+ {
+ JvOptionPane.setInteractiveMode(false);
+ JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
+ }
+
+ static float[][] PAEdata = { { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f },
+ { 2.0f, 1.0f, 2.0f, 3.0f, 4.0f },
+ { 3.0f, 2.0f, 1.0f, 2.0f, 3.0f },
+ { 4.0f, 3.0f, 2.0f, 1.0f, 2.0f },
+ { 5.0f, 4.0f, 3.0f, 2.0f, 1.0f } };
+
+ /**
+ * test associations for a PAE matrix
+ */
+ @Test(groups = { "Functional" })
+ public void testSeqAssociatedPAEMatrix()
+ {
+ Sequence seq = new Sequence("Seq", "ASDQE");
+ AlignmentAnnotation aa = seq
+ .addContactList(new PAEContactMatrix(seq, PAEdata));
+ assertNotNull(seq.getContactListFor(aa, 0));
+ assertEquals(seq.getContactListFor(aa, 0).getContactAt(0), 1.0);
+ assertNotNull(seq.getContactListFor(aa, 1));
+ assertEquals(seq.getContactListFor(aa, 1).getContactAt(1), 1.0);
+ assertNotNull(seq.getContactListFor(aa, 2));
+ assertEquals(seq.getContactListFor(aa, 2).getContactAt(2), 1.0);
+ assertNotNull(seq.getContactListFor(aa, 3));
+ assertEquals(seq.getContactListFor(aa, 3).getContactAt(3), 1.0);
+ assertNotNull(seq.getContactListFor(aa, 4));
+ assertEquals(seq.getContactListFor(aa, 4).getContactAt(4), 1.0);
+
+ assertNotNull(seq.getContactListFor(aa, seq.getEnd() - 1));
+ assertNull(seq.getContactListFor(aa, seq.getEnd()));
+
+ ContactListI cm = seq.getContactListFor(aa, seq.getStart());
+ assertEquals(cm.getContactAt(seq.getStart()), 1d);
+ verifyPAEmatrix(seq, aa, 0, 0, 4);
+
+ // Now associated with sequence not starting at 1
+ seq = new Sequence("Seq/5-9", "ASDQE");
+ ContactMatrixI paematrix = new PAEContactMatrix(seq, PAEdata);
+ aa = seq.addContactList(paematrix);
+ assertNotNull(aa);
+ // individual annotation elements need to be distinct for Matrix associated
+ // rows
+ Annotation ae5 = aa.getAnnotationForPosition(5);
+ Annotation ae6 = aa.getAnnotationForPosition(6);
+ assertNotNull(ae5);
+ assertNotNull(ae6);
+ assertTrue(ae5 != ae6);
+
+ cm = seq.getContactListFor(aa, 0);
+ assertEquals(cm.getContactAt(0), 1d);
+ verifyPAEmatrix(seq, aa, 0, 0, 4);
+
+ // test clustering
+ paematrix.setGroupSet(GroupSet.makeGroups(paematrix, false,0.1f, false));
+
+ // remap - test the MappableContactMatrix.liftOver method
+ SequenceI newseq = new Sequence("Seq", "ASDQEASDQEASDQE");
+ Mapping sqmap = new Mapping(seq,
+ new MapList(new int[]
+ { 5, 8, 10, 10 }, new int[] { 5, 9 }, 1, 1));
+ assertTrue(paematrix instanceof MappableContactMatrixI);
+
+ MappableContactMatrixI remapped = ((MappableContactMatrixI) paematrix)
+ .liftOver(newseq, sqmap);
+ assertTrue(remapped instanceof PAEContactMatrix);
+
+ AlignmentAnnotation newaa = newseq.addContactList(remapped);
+ assertNull(newseq.getContactListFor(newaa, -1 + newseq.findIndex(1)));
+ assertNull(newseq.getContactListFor(newaa, -1 + newseq.findIndex(4)));
+ assertNotNull(
+ newseq.getContactListFor(newaa, -1 + newseq.findIndex(5)));
+ assertNotNull(
+ newseq.getContactListFor(newaa, -1 + newseq.findIndex(6)));
+ assertNotNull(
+ newseq.getContactListFor(newaa, -1 + newseq.findIndex(7)));
+ assertNotNull(
+ newseq.getContactListFor(newaa, -1 + newseq.findIndex(8)));
+ // no mapping for position 9
+ assertNull(newseq.getContactListFor(newaa, -1 + newseq.findIndex(9)));
+ // last column
+ assertNotNull(
+ newseq.getContactListFor(newaa, -1 + newseq.findIndex(10)));
+
+ // verify MappedPositions includes discontinuity
+ int[] mappedCl = newseq.getContactListFor(newaa, 5)
+ .getMappedPositionsFor(0, 4);
+ assertEquals(4, mappedCl.length,
+ "getMappedPositionsFor doesn't support discontinuous mappings to contactList");
+
+ // make it harder.
+
+ SequenceI alseq = newseq.getSubSequence(6, 10);
+ alseq.insertCharAt(2, 2, '-');
+ AlignmentI alForSeq = new Alignment(new SequenceI[] { alseq });
+ newaa = AlignmentUtils.addReferenceAnnotationTo(alForSeq, alseq, newaa,
+ null);
+ ContactListI alcl = alForSeq.getContactListFor(newaa, 1);
+ assertNotNull(alcl);
+ mappedCl = alcl.getMappedPositionsFor(0, 4);
+ assertNotNull(mappedCl);
+ assertEquals(4, mappedCl.length,
+ "getMappedPositionsFor doesn't support discontinuous mappings to contactList");
+
+ // remap2 - test with original matrix map from 1-5 remapped to 5-9
+
+ seq = new Sequence("Seq/1-5", "ASDQE");
+ paematrix = new PAEContactMatrix(seq, PAEdata);
+ assertTrue(paematrix instanceof MappableContactMatrixI);
+ aa = seq.addContactList(paematrix);
+
+ newseq = new Sequence("Seq", "ASDQEASDQEASDQE");
+ sqmap = new Mapping(seq,
+ new MapList(new int[]
+ { 5, 9 }, new int[] { 1, 5 }, 1, 1));
+
+ remapped = ((MappableContactMatrixI) paematrix).liftOver(newseq, sqmap);
+ assertTrue(remapped instanceof PAEContactMatrix);
+
+ newaa = newseq.addContactList(remapped);
+ verify_mapping(newseq, newaa);
+
+ // remap3 - remap2 but mapping sense in liftover is reversed
+
+ seq = new Sequence("Seq/1-5", "ASDQE");
+ paematrix = new PAEContactMatrix(seq, PAEdata);
+ assertTrue(paematrix instanceof MappableContactMatrixI);
+ aa = seq.addContactList(paematrix);
+
+ newseq = new Sequence("Seq", "ASDQEASDQEASDQE");
+ sqmap = new Mapping(newseq,
+ new MapList(new int[]
+ { 1, 5 }, new int[] { 5, 9 }, 1, 1));
+
+ remapped = ((MappableContactMatrixI) paematrix).liftOver(newseq, sqmap);
+ assertTrue(remapped instanceof PAEContactMatrix);
+
+ newaa = newseq.addContactList(remapped);
+ verify_mapping(newseq, newaa);
+ }
+
+ /**
+ * checks that the PAE matrix is located at positions 1-9 in newseq, and
+ * columns are not truncated.
+ *
+ * @param newseq
+ * @param newaa
+ */
+ private void verify_mapping(SequenceI newseq, AlignmentAnnotation newaa)
+ {
+ assertNull(newseq.getContactListFor(newaa, -1 + newseq.findIndex(1)));
+ assertNull(newseq.getContactListFor(newaa, -1 + newseq.findIndex(4)));
+ assertNotNull(
+ newseq.getContactListFor(newaa, -1 + newseq.findIndex(5)));
+ assertNotNull(
+ newseq.getContactListFor(newaa, -1 + newseq.findIndex(6)));
+ assertNotNull(
+ newseq.getContactListFor(newaa, -1 + newseq.findIndex(7)));
+ assertNotNull(
+ newseq.getContactListFor(newaa, -1 + newseq.findIndex(8)));
+ assertNotNull(
+ newseq.getContactListFor(newaa, -1 + newseq.findIndex(9)));
+ // last column should be null this time
+ assertNull(newseq.getContactListFor(newaa, -1 + newseq.findIndex(10)));
+
+ verifyPAEmatrix(newseq, newaa, 4, 4, 8);
+ }
+
+ private void verifyPAEmatrix(SequenceI seq, AlignmentAnnotation aa,
+ int topl, int rowl, int rowr)
+ {
+ int[] mappedCl;
+ for (int f = rowl; f <= rowr; f++)
+ {
+ ContactListI clist = seq.getContactListFor(aa, f);
+ assertNotNull(clist, "No ContactListI for position " + (f));
+ assertEquals(clist.getContactAt(0), (double) f - topl + 1,
+ "for column " + f + " relative to " + topl);
+ mappedCl = clist.getMappedPositionsFor(0, 0);
+ assertNotNull(mappedCl);
+ assertEquals(mappedCl[0], mappedCl[1]);
+ assertEquals(mappedCl[0], seq.findIndex(seq.getStart() + topl));
+ assertEquals(clist.getContactAt(f - topl), 1d,
+ "for column and row " + f + " relative to " + topl);
+ }
+ }
+
+ /**
+ * check mapping and resolution methods work
+ */
+ @Test(groups= {"Functional"})
+ public void testMappableContactMatrix() {
+ SequenceI newseq = new Sequence("Seq", "ASDQEASDQEASDQE");
+ MapList map = new MapList(new int[]
+ { 5, 9 }, new int[] { 1, 5 }, 1, 1);
+ AlignmentAnnotation aa = newseq
+ .addContactList(new PAEContactMatrix(newseq,map, PAEdata,null));
+ ContactListI clist = newseq.getContactListFor(aa, 4);
+ assertNotNull(clist);
+ clist = newseq.getContactListFor(aa, 3);
+ assertNull(clist);
+
+ ContactMatrixI cm = newseq.getContactMatrixFor(aa);
+ MappableContactMatrixI mcm = (MappableContactMatrixI) cm;
+ int[] pos = mcm.getMappedPositionsFor(newseq, 0);
+ assertNull(pos);
+
+ pos = mcm.getMappedPositionsFor(newseq, 1);
+ assertNotNull(pos);
+ assertEquals(pos[0],4+newseq.getStart());
+
+ pos = mcm.getMappedPositionsFor(newseq, 6); // after end of matrix
+ assertNull(pos);
+ pos = mcm.getMappedPositionsFor(newseq, 5); // at end of matrix
+ assertNotNull(pos);
+ assertEquals(pos[0],8+newseq.getStart());
+ SequenceI alseq = newseq.deriveSequence();
+ alseq.insertCharAt(5,'-');
+ pos = mcm.getMappedPositionsFor(alseq, 5); // at end of matrix
+ assertNotNull(pos);
+ assertEquals(pos[0],8+newseq.getStart());
+
+
+ }
+}