--- /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.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);
+ cm = seq.getContactListFor(aa, 0);
+ assertEquals(cm.getContactAt(0),1d);
+ verifyPAEmatrix(seq, aa, 0, 0, 4);
+
+ // 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)));
+
+ // 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)
+ {
+ 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);
+ assertEquals(clist.getContactAt(f-topl),1d, "for column and row "+f+" relative to "+topl);
+ }
+ }
+
+}