X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fdatamodel%2FPAEContactMatrixTest.java;fp=test%2Fjalview%2Fdatamodel%2FPAEContactMatrixTest.java;h=67edb37da53fef7cf3511f07fe8d5fe488b36752;hb=5652c334235561d2b533a292969e2fb8566d8dac;hp=0000000000000000000000000000000000000000;hpb=65ed1da9a1710a9ce132c7edfce54955dc1ddf99;p=jalview.git diff --git a/test/jalview/datamodel/PAEContactMatrixTest.java b/test/jalview/datamodel/PAEContactMatrixTest.java new file mode 100644 index 0000000..67edb37 --- /dev/null +++ b/test/jalview/datamodel/PAEContactMatrixTest.java @@ -0,0 +1,246 @@ +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, 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()); + + + } +}