JAL-2349 allow PAE or other contact matrices to hold a coordinate mapping allowing...
[jalview.git] / test / jalview / datamodel / PAEContactMatrixTest.java
diff --git a/test/jalview/datamodel/PAEContactMatrixTest.java b/test/jalview/datamodel/PAEContactMatrixTest.java
new file mode 100644 (file)
index 0000000..7426cba
--- /dev/null
@@ -0,0 +1,151 @@
+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);
+    }    
+  }
+
+}