Structure listener
[jalview.git] / src / jalview / structure / StructureSelectionManager.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.structure;\r
20 \r
21 import java.io.*;\r
22 import java.util.*;\r
23 \r
24 import MCview.*;\r
25 import jalview.analysis.*;\r
26 import jalview.datamodel.*;\r
27 \r
28 public class StructureSelectionManager\r
29 {\r
30   static StructureSelectionManager instance;\r
31   StructureMapping[] mappings;\r
32   Hashtable mappingData = new Hashtable();\r
33 \r
34   public static StructureSelectionManager getStructureSelectionManager()\r
35   {\r
36     if (instance == null)\r
37     {\r
38       instance = new StructureSelectionManager();\r
39     }\r
40 \r
41     return instance;\r
42   }\r
43 \r
44   Vector listeners = new Vector();\r
45   public void addStructureViewerListener(Object svl)\r
46   {\r
47     if (!listeners.contains(svl))\r
48     {\r
49       listeners.addElement(svl);\r
50     }\r
51   }\r
52 \r
53   public String alreadyMappedToFile(String pdbid)\r
54   {\r
55     if (mappings != null)\r
56     {\r
57       for (int i = 0; i < mappings.length; i++)\r
58       {\r
59         if (mappings[i].getPdbId().equals(pdbid))\r
60         {\r
61           return mappings[i].pdbfile;\r
62         }\r
63       }\r
64     }\r
65     return null;\r
66   }\r
67 \r
68   /*\r
69      There will be better ways of doing this in the future, for now we'll use\r
70      the tried and tested MCview pdb mapping\r
71    */\r
72   public MCview.PDBfile setMapping(SequenceI[] sequence,\r
73                            String pdbFile,\r
74                            String protocol)\r
75   {\r
76     MCview.PDBfile pdb = null;\r
77     try\r
78     {\r
79       pdb = new MCview.PDBfile(pdbFile, protocol);\r
80     }\r
81     catch (Exception ex)\r
82     {\r
83       ex.printStackTrace();\r
84       return null;\r
85     }\r
86 \r
87     for (int s = 0; s < sequence.length; s++)\r
88     {\r
89       String targetChain = "";\r
90 \r
91       if (sequence[s].getName().indexOf("|") > -1)\r
92       {\r
93         targetChain = sequence[s].getName().substring(\r
94             sequence[s].getName().lastIndexOf("|") + 1);\r
95       }\r
96 \r
97       int max = -10;\r
98       AlignSeq maxAlignseq = null;\r
99       String maxChainId = " ";\r
100       PDBChain maxChain = null;\r
101 \r
102       for (int i = 0; i < pdb.chains.size(); i++)\r
103       {\r
104         AlignSeq as = new AlignSeq(sequence[s],\r
105                                    ( (PDBChain) pdb.chains.elementAt(i)).\r
106                                    sequence,\r
107                                    AlignSeq.PEP);\r
108         as.calcScoreMatrix();\r
109         as.traceAlignment();\r
110         PDBChain chain = ( (PDBChain) pdb.chains.elementAt(i));\r
111 \r
112         if (as.maxscore > max\r
113             || (as.maxscore == max && chain.id.equals(targetChain)))\r
114         {\r
115           maxChain = chain;\r
116           max = as.maxscore;\r
117           maxAlignseq = as;\r
118           maxChainId = chain.id;\r
119         }\r
120       }\r
121 \r
122       final StringBuffer mappingDetails = new StringBuffer();\r
123       mappingDetails.append("\n\nPDB Sequence is :\nSequence = " +\r
124                             maxChain.sequence.getSequenceAsString());\r
125       mappingDetails.append("\nNo of residues = " +\r
126                             maxChain.residues.\r
127                             size() +\r
128                             "\n\n");\r
129       PrintStream ps = new PrintStream(System.out)\r
130       {\r
131         public void print(String x)\r
132         {\r
133           mappingDetails.append(x);\r
134         }\r
135 \r
136         public void println()\r
137         {\r
138           mappingDetails.append("\n");\r
139         }\r
140       };\r
141 \r
142       maxAlignseq.printAlignment(ps);\r
143 \r
144       mappingDetails.append("\nPDB start/end " + maxAlignseq.seq2start + " " +\r
145                             maxAlignseq.seq2end);\r
146       mappingDetails.append("\nSEQ start/end "\r
147                             + (maxAlignseq.seq1start + sequence[s].getStart() - 1) +\r
148                             " "\r
149                             + (maxAlignseq.seq1end + sequence[s].getEnd() - 1));\r
150 \r
151       maxChain.makeExactMapping(maxAlignseq, sequence[s]);\r
152 \r
153     //  maxChain.transferRESNUMFeatures(sequence[s], null);\r
154 \r
155       int[][] mapping = new int[sequence[s].getEnd() + 2][2];\r
156       int resNum = -10000;\r
157       int index = 0;\r
158 \r
159 \r
160       do\r
161       {\r
162         Atom tmp = (Atom) maxChain.atoms.elementAt(index);\r
163         if (resNum != tmp.resNumber && tmp.alignmentMapping != -1)\r
164         {\r
165           resNum = tmp.resNumber;\r
166           mapping[tmp.alignmentMapping+1][0] = tmp.resNumber;\r
167           mapping[tmp.alignmentMapping+1][1] = tmp.atomIndex;\r
168         }\r
169 \r
170         index++;\r
171       }\r
172       while(index < maxChain.atoms.size());\r
173 \r
174       if (mappings == null)\r
175       {\r
176         mappings = new StructureMapping[1];\r
177       }\r
178       else\r
179       {\r
180         StructureMapping[] tmp = new StructureMapping[mappings.length + 1];\r
181         System.arraycopy(mappings, 0, tmp, 0, mappings.length);\r
182         mappings = tmp;\r
183       }\r
184 \r
185       if(protocol.equals(jalview.io.AppletFormatAdapter.PASTE))\r
186         pdbFile = "INLINE"+pdb.id;\r
187 \r
188       mappings[mappings.length - 1]\r
189           = new StructureMapping(sequence[s], pdbFile, pdb.id, maxChainId,\r
190                                  mapping, mappingDetails.toString());\r
191     }\r
192     /////////\r
193 \r
194     return pdb;\r
195   }\r
196 \r
197   public void removeStructureViewerListener(Object svl, String pdbfile)\r
198   {\r
199     listeners.removeElement(svl);\r
200 \r
201     boolean removeMapping = true;\r
202 \r
203     StructureListener sl;\r
204     for (int i = 0; i < listeners.size(); i++)\r
205     {\r
206       if (listeners.elementAt(i) instanceof StructureListener)\r
207       {\r
208         sl = (StructureListener) listeners.elementAt(i);\r
209         if (sl.getPdbFile().equals(pdbfile))\r
210         {\r
211           removeMapping = false;\r
212           break;\r
213         }\r
214       }\r
215     }\r
216 \r
217     if (removeMapping && mappings!=null)\r
218     {\r
219       Vector tmp = new Vector();\r
220       for (int i = 0; i < mappings.length; i++)\r
221       {\r
222         if (!mappings[i].pdbfile.equals(pdbfile))\r
223         {\r
224           tmp.addElement(mappings[i]);\r
225         }\r
226       }\r
227 \r
228       mappings = new StructureMapping[tmp.size()];\r
229       tmp.copyInto(mappings);\r
230     }\r
231   }\r
232 \r
233   public void mouseOverStructure(int pdbResNum, String chain, String pdbfile)\r
234   {\r
235     SequenceListener sl;\r
236     for (int i = 0; i < listeners.size(); i++)\r
237     {\r
238       if (listeners.elementAt(i) instanceof SequenceListener)\r
239       {\r
240         sl = (SequenceListener) listeners.elementAt(i);\r
241 \r
242         for (int j = 0; j < mappings.length; j++)\r
243         {\r
244           if (mappings[j].pdbfile.equals(pdbfile) &&\r
245               mappings[j].pdbchain.equals(chain))\r
246           {\r
247             sl.highlightSequence(mappings[j].sequence,\r
248                                  mappings[j].getSeqPos(pdbResNum));\r
249           }\r
250         }\r
251 \r
252         sl.highlightSequence(null, pdbResNum);\r
253       }\r
254     }\r
255   }\r
256 \r
257   public void mouseOverSequence(SequenceI seq, int index)\r
258   {\r
259     StructureListener sl;\r
260     int atomNo = 0;\r
261     for (int i = 0; i < listeners.size(); i++)\r
262     {\r
263       if (listeners.elementAt(i) instanceof StructureListener)\r
264       {\r
265         sl = (StructureListener) listeners.elementAt(i);\r
266 \r
267         for (int j = 0; j < mappings.length; j++)\r
268         {\r
269           if (mappings[j].sequence == seq)\r
270           {\r
271             atomNo = mappings[j].getAtomNum(index);\r
272 \r
273             if (atomNo > 0)\r
274             {\r
275               sl.highlightAtom(atomNo,\r
276                                mappings[j].getPDBResNum(index),\r
277                                mappings[j].pdbchain,\r
278                                mappings[j].pdbfile);\r
279             }\r
280           }\r
281         }\r
282       }\r
283     }\r
284   }\r
285 \r
286   public void structureSelectionChanged()\r
287   {\r
288     StructureListener svl;\r
289     for (int i = 0; i < listeners.size(); i++)\r
290     {\r
291       svl = (StructureListener) listeners.elementAt(i);\r
292     }\r
293   }\r
294 \r
295   public void sequenceSelectionChanged()\r
296   {\r
297     StructureListener svl;\r
298     for (int i = 0; i < listeners.size(); i++)\r
299     {\r
300       svl = (StructureListener) listeners.elementAt(i);\r
301     }\r
302   }\r
303 \r
304   public void sequenceColoursChanged(Object source)\r
305   {\r
306     StructureListener sl;\r
307     for (int i = 0; i < listeners.size(); i++)\r
308     {\r
309       if (listeners.elementAt(i) instanceof StructureListener)\r
310       {\r
311         sl = (StructureListener) listeners.elementAt(i);\r
312         sl.updateColours(source);\r
313       }\r
314     }\r
315   }\r
316 \r
317   public StructureMapping[] getMapping(String pdbfile)\r
318   {\r
319     Vector tmp = new Vector();\r
320     for (int i = 0; i < mappings.length; i++)\r
321     {\r
322       if (mappings[i].pdbfile.equals(pdbfile))\r
323       {\r
324         tmp.addElement(mappings[i]);\r
325       }\r
326     }\r
327 \r
328     StructureMapping[] ret = new StructureMapping[tmp.size()];\r
329     for (int i = 0; i < tmp.size(); i++)\r
330     {\r
331       ret[i] = (StructureMapping) tmp.elementAt(i);\r
332     }\r
333 \r
334     return ret;\r
335   }\r
336 \r
337   public String printMapping(String pdbfile)\r
338   {\r
339     StringBuffer sb = new StringBuffer();\r
340     for (int i = 0; i < mappings.length; i++)\r
341     {\r
342       if (mappings[i].pdbfile.equals(pdbfile))\r
343       {\r
344         sb.append(mappings[i].mappingDetails);\r
345       }\r
346     }\r
347 \r
348     return sb.toString();\r
349   }\r
350 }\r