JAL-2349 allow PAE or other contact matrices to hold a coordinate mapping allowing...
[jalview.git] / test / jalview / datamodel / PAEContactMatrixTest.java
1 package jalview.datamodel;
2
3 import static org.testng.Assert.*;
4
5 import org.testng.Assert;
6 import org.testng.annotations.BeforeClass;
7 import org.testng.annotations.Test;
8
9 import jalview.gui.JvOptionPane;
10 import jalview.util.MapList;
11 import jalview.ws.datamodel.MappableContactMatrixI;
12 import jalview.ws.datamodel.alphafold.PAEContactMatrix;
13
14 public class PAEContactMatrixTest
15 {
16   @BeforeClass(alwaysRun = true)
17   public void setUpJvOptionPane()
18   {
19     JvOptionPane.setInteractiveMode(false);
20     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
21   }
22
23   static float[][] PAEdata = {
24       {1.0f,2.0f,3.0f,4.0f,5.0f},
25       {2.0f,1.0f,2.0f,3.0f,4.0f},
26       {3.0f,2.0f,1.0f,2.0f,3.0f},
27       {4.0f,3.0f,2.0f,1.0f,2.0f},
28       {5.0f,4.0f,3.0f,2.0f,1.0f}};
29   
30   /**
31    * test associations for a PAE matrix
32    */
33   @Test(groups = { "Functional" })
34   public void testSeqAssociatedPAEMatrix()
35   {
36     Sequence seq = new Sequence("Seq","ASDQE");
37     AlignmentAnnotation aa = seq.addContactList(new PAEContactMatrix(seq, PAEdata));
38     assertNotNull(seq.getContactListFor(aa, 0));
39     assertEquals(seq.getContactListFor(aa, 0).getContactAt(0),1.0);
40     assertNotNull(seq.getContactListFor(aa, 1));
41     assertEquals(seq.getContactListFor(aa, 1).getContactAt(1),1.0);
42     assertNotNull(seq.getContactListFor(aa, 2));
43     assertEquals(seq.getContactListFor(aa, 2).getContactAt(2),1.0);
44     assertNotNull(seq.getContactListFor(aa, 3));
45     assertEquals(seq.getContactListFor(aa, 3).getContactAt(3),1.0);
46     assertNotNull(seq.getContactListFor(aa, 4));
47     assertEquals(seq.getContactListFor(aa, 4).getContactAt(4),1.0);
48     
49     assertNotNull(seq.getContactListFor(aa, seq.getEnd()-1));
50     assertNull(seq.getContactListFor(aa, seq.getEnd()));
51     
52     ContactListI cm = seq.getContactListFor(aa, seq.getStart());
53     assertEquals(cm.getContactAt(seq.getStart()),1d);
54     verifyPAEmatrix(seq, aa, 0,0,4);
55     
56     // Now associated with sequence not starting at 1
57     seq = new Sequence("Seq/5-9","ASDQE");
58     ContactMatrixI paematrix = new PAEContactMatrix(seq, PAEdata);
59     aa = seq.addContactList(paematrix);
60     cm = seq.getContactListFor(aa, 0);
61     assertEquals(cm.getContactAt(0),1d);
62     verifyPAEmatrix(seq, aa, 0, 0, 4);
63     
64     // remap - test the MappableContactMatrix.liftOver method
65     SequenceI newseq = new Sequence("Seq","ASDQEASDQEASDQE");
66     Mapping sqmap = new Mapping(seq, new MapList(new int[] {5,8,10,10},new int[] { 5,9}, 1, 1));
67     assertTrue(paematrix instanceof MappableContactMatrixI);
68     
69     MappableContactMatrixI remapped = ((MappableContactMatrixI)paematrix).liftOver(newseq, sqmap);
70     assertTrue(remapped instanceof PAEContactMatrix);
71     
72     AlignmentAnnotation newaa = newseq.addContactList(remapped);
73     assertNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(1)));
74     assertNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(4)));
75     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(5)));
76     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(6)));
77     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(7)));
78     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(8)));
79     // no mapping for position 9
80     assertNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(9)));
81     // last column
82     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(10)));
83
84     // remap2 - test with original matrix map from 1-5 remapped to 5-9
85     
86     seq = new Sequence("Seq/1-5","ASDQE");
87     paematrix = new PAEContactMatrix(seq, PAEdata);
88     assertTrue(paematrix instanceof MappableContactMatrixI);
89     aa = seq.addContactList(paematrix);
90     
91     newseq = new Sequence("Seq","ASDQEASDQEASDQE");
92     sqmap = new Mapping(seq, new MapList(new int[] {5,9},new int[] { 1,5}, 1, 1));
93     
94     remapped = ((MappableContactMatrixI)paematrix).liftOver(newseq, sqmap);
95     assertTrue(remapped instanceof PAEContactMatrix);
96     
97     
98     newaa = newseq.addContactList(remapped);
99     verify_mapping(newseq, newaa);
100
101     // remap3 - remap2 but mapping sense in liftover is reversed
102     
103     seq = new Sequence("Seq/1-5","ASDQE");
104     paematrix = new PAEContactMatrix(seq, PAEdata);
105     assertTrue(paematrix instanceof MappableContactMatrixI);
106     aa = seq.addContactList(paematrix);
107     
108     newseq = new Sequence("Seq","ASDQEASDQEASDQE");
109     sqmap = new Mapping(newseq, new MapList(new int[] { 1,5},new int[] {5,9},1, 1));
110     
111     remapped = ((MappableContactMatrixI)paematrix).liftOver(newseq, sqmap);
112     assertTrue(remapped instanceof PAEContactMatrix);
113     
114     
115     newaa = newseq.addContactList(remapped);
116     verify_mapping(newseq, newaa);
117     
118   }
119   /**
120    * checks that the PAE matrix is located at positions 1-9 in newseq, and columns are not truncated.
121    * @param newseq
122    * @param newaa
123    */
124   private void verify_mapping(SequenceI newseq, AlignmentAnnotation newaa)
125   {
126   assertNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(1)));
127     assertNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(4)));
128     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(5)));
129     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(6)));
130     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(7)));
131     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(8)));
132     assertNotNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(9)));
133     // last column should be null this time
134     assertNull(newseq.getContactListFor(newaa, -1+newseq.findIndex(10)));
135     
136     verifyPAEmatrix(newseq, newaa, 4, 4, 8);
137     
138
139   }
140
141   private void verifyPAEmatrix(SequenceI seq, AlignmentAnnotation aa, int topl, int rowl, int rowr)
142   {
143     for (int f=rowl;f<=rowr;f++) {
144       ContactListI clist = seq.getContactListFor(aa, f);
145       assertNotNull(clist,"No ContactListI for position "+(f));
146       assertEquals(clist.getContactAt(0), (double) f-topl+1,"for column "+f+" relative to "+topl);
147       assertEquals(clist.getContactAt(f-topl),1d, "for column and row "+f+" relative to "+topl);
148     }    
149   }
150
151 }