Binding with descriptors
[jalview.git] / src / jalview / datamodel / SequenceGroup.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 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.datamodel;\r
20 \r
21 import jalview.analysis.*;\r
22 \r
23 import jalview.schemes.*;\r
24 \r
25 import java.awt.*;\r
26 \r
27 import java.util.*;\r
28 \r
29 \r
30 /**\r
31  * DOCUMENT ME!\r
32  *\r
33  * @author $author$\r
34  * @version $Revision$\r
35  */\r
36 public class SequenceGroup\r
37 {\r
38     String groupName;\r
39     Conservation conserve;\r
40     Vector aaFrequency;\r
41     boolean displayBoxes;\r
42     boolean displayText;\r
43     boolean colourText;\r
44 \r
45     /** DOCUMENT ME!! */\r
46     public Vector sequences = new Vector();\r
47     int width = -1;\r
48 \r
49     /** DOCUMENT ME!! */\r
50     public ColourSchemeI cs;\r
51     int startRes = 0;\r
52     int endRes = 0;\r
53     Color outlineColour = Color.black;\r
54 \r
55     /**\r
56      * Creates a new SequenceGroup object.\r
57      */\r
58     public SequenceGroup()\r
59     {\r
60         groupName = "Group";\r
61         this.displayBoxes = true;\r
62         this.displayText = true;\r
63         this.colourText = false;\r
64         cs = null;\r
65     }\r
66 \r
67     /**\r
68      * Creates a new SequenceGroup object.\r
69      *\r
70      * @param sequences DOCUMENT ME!\r
71      * @param groupName DOCUMENT ME!\r
72      * @param scheme DOCUMENT ME!\r
73      * @param displayBoxes DOCUMENT ME!\r
74      * @param displayText DOCUMENT ME!\r
75      * @param colourText DOCUMENT ME!\r
76      * @param start DOCUMENT ME!\r
77      * @param end DOCUMENT ME!\r
78      */\r
79     public SequenceGroup(Vector sequences, String groupName,\r
80         ColourSchemeI scheme, boolean displayBoxes, boolean displayText,\r
81         boolean colourText, int start, int end)\r
82     {\r
83         this.sequences = sequences;\r
84         this.groupName = groupName;\r
85         this.displayBoxes = displayBoxes;\r
86         this.displayText = displayText;\r
87         this.colourText = colourText;\r
88         this.cs = scheme;\r
89         startRes = start;\r
90         endRes = end;\r
91         recalcConservation();\r
92     }\r
93 \r
94     /**\r
95      * Creates a new SequenceGroup object.\r
96      *\r
97      * @param groupName DOCUMENT ME!\r
98      * @param scheme DOCUMENT ME!\r
99      * @param displayBoxes DOCUMENT ME!\r
100      * @param displayText DOCUMENT ME!\r
101      * @param colourText DOCUMENT ME!\r
102      * @param start DOCUMENT ME!\r
103      * @param end DOCUMENT ME!\r
104      */\r
105     public SequenceGroup(String groupName, ColourSchemeI scheme,\r
106         boolean displayBoxes, boolean displayText, boolean colourText,\r
107         int start, int end)\r
108     {\r
109         this.groupName = groupName;\r
110         this.displayBoxes = displayBoxes;\r
111         this.displayText = displayText;\r
112         this.colourText = colourText;\r
113         this.cs = scheme;\r
114         startRes = start;\r
115         endRes = end;\r
116     }\r
117 \r
118     /**\r
119      * DOCUMENT ME!\r
120      *\r
121      * @param col DOCUMENT ME!\r
122      *\r
123      * @return DOCUMENT ME!\r
124      */\r
125     public boolean adjustForRemoveLeft(int col)\r
126     {\r
127         // return value is true if the group still exists\r
128         if (startRes >= col)\r
129         {\r
130             startRes = startRes - col;\r
131         }\r
132 \r
133         if (endRes >= col)\r
134         {\r
135             endRes = endRes - col;\r
136 \r
137             if (startRes > endRes)\r
138             {\r
139                 startRes = 0;\r
140             }\r
141         }\r
142         else\r
143         {\r
144             // must delete this group!!\r
145             return false;\r
146         }\r
147 \r
148         return true;\r
149     }\r
150 \r
151     /**\r
152      * DOCUMENT ME!\r
153      *\r
154      * @param col DOCUMENT ME!\r
155      *\r
156      * @return DOCUMENT ME!\r
157      */\r
158     public boolean adjustForRemoveRight(int col)\r
159     {\r
160         if (startRes > col)\r
161         {\r
162             // delete this group\r
163             return false;\r
164         }\r
165 \r
166         if (endRes >= col)\r
167         {\r
168             endRes = col;\r
169         }\r
170 \r
171         return true;\r
172     }\r
173 \r
174     /**\r
175      * DOCUMENT ME!\r
176      *\r
177      * @return DOCUMENT ME!\r
178      */\r
179     public String getName()\r
180     {\r
181         return groupName;\r
182     }\r
183 \r
184     /**\r
185      * DOCUMENT ME!\r
186      *\r
187      * @param name DOCUMENT ME!\r
188      */\r
189     public void setName(String name)\r
190     {\r
191         groupName = name;\r
192     }\r
193 \r
194     /**\r
195      * DOCUMENT ME!\r
196      *\r
197      * @return DOCUMENT ME!\r
198      */\r
199     public Conservation getConservation()\r
200     {\r
201         return conserve;\r
202     }\r
203 \r
204     /**\r
205      * DOCUMENT ME!\r
206      *\r
207      * @param c DOCUMENT ME!\r
208      */\r
209     public void setConservation(Conservation c)\r
210     {\r
211         conserve = c;\r
212     }\r
213 \r
214     /**\r
215      * DOCUMENT ME!\r
216      *\r
217      * @param s DOCUMENT ME!\r
218      * @param recalc DOCUMENT ME!\r
219      */\r
220     public void addSequence(SequenceI s, boolean recalc)\r
221     {\r
222         if (!sequences.contains(s))\r
223         {\r
224             sequences.addElement(s);\r
225         }\r
226 \r
227         if (recalc)\r
228         {\r
229             recalcConservation();\r
230         }\r
231     }\r
232 \r
233     /**\r
234      * DOCUMENT ME!\r
235      */\r
236     public void recalcConservation()\r
237     {\r
238         if(cs == null)\r
239           return;\r
240 \r
241         cs.setConsensus(AAFrequency.calculate(sequences, 0, getWidth()));\r
242 \r
243 \r
244         if (cs instanceof ClustalxColourScheme)\r
245         {\r
246             ((ClustalxColourScheme) cs).resetClustalX(sequences, getWidth());\r
247         }\r
248 \r
249 \r
250         if (cs.conservationApplied())\r
251         {\r
252             Conservation c = new Conservation(groupName,\r
253                     ResidueProperties.propHash, 3, sequences, 0, getWidth());\r
254             c.calculate();\r
255             c.verdict(false, 25);\r
256 \r
257 \r
258             cs.setConservation(c);\r
259 \r
260             if (cs instanceof ClustalxColourScheme)\r
261             {\r
262                 ((ClustalxColourScheme) cs).resetClustalX(sequences,\r
263                     getWidth());\r
264             }\r
265         }\r
266     }\r
267 \r
268     /**\r
269      * DOCUMENT ME!\r
270      *\r
271      * @param s DOCUMENT ME!\r
272      * @param recalc DOCUMENT ME!\r
273      */\r
274     public void addOrRemove(SequenceI s, boolean recalc)\r
275     {\r
276         if (sequences.contains(s))\r
277         {\r
278             deleteSequence(s, recalc);\r
279         }\r
280         else\r
281         {\r
282             addSequence(s, recalc);\r
283         }\r
284     }\r
285 \r
286     /**\r
287      * DOCUMENT ME!\r
288      *\r
289      * @param s DOCUMENT ME!\r
290      * @param recalc DOCUMENT ME!\r
291      */\r
292     public void deleteSequence(SequenceI s, boolean recalc)\r
293     {\r
294         sequences.removeElement(s);\r
295 \r
296         if (recalc)\r
297         {\r
298             recalcConservation();\r
299         }\r
300     }\r
301 \r
302     /**\r
303      * DOCUMENT ME!\r
304      *\r
305      * @return DOCUMENT ME!\r
306      */\r
307     public int getStartRes()\r
308     {\r
309         return startRes;\r
310     }\r
311 \r
312     /**\r
313      * DOCUMENT ME!\r
314      *\r
315      * @return DOCUMENT ME!\r
316      */\r
317     public int getEndRes()\r
318     {\r
319         return endRes;\r
320     }\r
321 \r
322     /**\r
323      * DOCUMENT ME!\r
324      *\r
325      * @param i DOCUMENT ME!\r
326      */\r
327     public void setStartRes(int i)\r
328     {\r
329         startRes = i;\r
330     }\r
331 \r
332     /**\r
333      * DOCUMENT ME!\r
334      *\r
335      * @param i DOCUMENT ME!\r
336      */\r
337     public void setEndRes(int i)\r
338     {\r
339         endRes = i;\r
340     }\r
341 \r
342     /**\r
343      * DOCUMENT ME!\r
344      *\r
345      * @return DOCUMENT ME!\r
346      */\r
347     public int getSize()\r
348     {\r
349         return sequences.size();\r
350     }\r
351 \r
352     /**\r
353      * DOCUMENT ME!\r
354      *\r
355      * @param i DOCUMENT ME!\r
356      *\r
357      * @return DOCUMENT ME!\r
358      */\r
359     public SequenceI getSequenceAt(int i)\r
360     {\r
361         return (SequenceI) sequences.elementAt(i);\r
362     }\r
363 \r
364     /**\r
365      * DOCUMENT ME!\r
366      *\r
367      * @param state DOCUMENT ME!\r
368      */\r
369     public void setColourText(boolean state)\r
370     {\r
371         colourText = state;\r
372     }\r
373 \r
374     /**\r
375      * DOCUMENT ME!\r
376      *\r
377      * @return DOCUMENT ME!\r
378      */\r
379     public boolean getColourText()\r
380     {\r
381         return colourText;\r
382     }\r
383 \r
384     /**\r
385      * DOCUMENT ME!\r
386      *\r
387      * @param state DOCUMENT ME!\r
388      */\r
389     public void setDisplayText(boolean state)\r
390     {\r
391         displayText = state;\r
392     }\r
393 \r
394     /**\r
395      * DOCUMENT ME!\r
396      *\r
397      * @return DOCUMENT ME!\r
398      */\r
399     public boolean getDisplayText()\r
400     {\r
401         return displayText;\r
402     }\r
403 \r
404     /**\r
405      * DOCUMENT ME!\r
406      *\r
407      * @param state DOCUMENT ME!\r
408      */\r
409     public void setDisplayBoxes(boolean state)\r
410     {\r
411         displayBoxes = state;\r
412     }\r
413 \r
414     /**\r
415      * DOCUMENT ME!\r
416      *\r
417      * @return DOCUMENT ME!\r
418      */\r
419     public boolean getDisplayBoxes()\r
420     {\r
421         return displayBoxes;\r
422     }\r
423 \r
424     /**\r
425      * DOCUMENT ME!\r
426      *\r
427      * @return DOCUMENT ME!\r
428      */\r
429     public int getWidth()\r
430     {\r
431         // MC This needs to get reset when characters are inserted and deleted\r
432         if (sequences.size() > 0)\r
433         {\r
434             width = ((SequenceI) sequences.elementAt(0)).getLength();\r
435         }\r
436 \r
437         for (int i = 1; i < sequences.size(); i++)\r
438         {\r
439             SequenceI seq = (SequenceI) sequences.elementAt(i);\r
440 \r
441             if (seq.getLength() > width)\r
442             {\r
443                 width = seq.getLength();\r
444             }\r
445         }\r
446 \r
447         return width;\r
448     }\r
449 \r
450     /**\r
451      * DOCUMENT ME!\r
452      *\r
453      * @param c DOCUMENT ME!\r
454      */\r
455     public void setOutlineColour(Color c)\r
456     {\r
457         outlineColour = c;\r
458     }\r
459 \r
460     /**\r
461      * DOCUMENT ME!\r
462      *\r
463      * @return DOCUMENT ME!\r
464      */\r
465     public Color getOutlineColour()\r
466     {\r
467         return outlineColour;\r
468     }\r
469 \r
470     /**\r
471      *\r
472      * returns the sequences in the group ordered by the ordering given by al\r
473      *\r
474      * @param al Alignment\r
475      * @return SequenceI[]\r
476      */\r
477     public SequenceI[] getSequencesInOrder(AlignmentI al)\r
478     {\r
479         int sz = sequences.size();\r
480         java.util.Hashtable orderedSeqs = new java.util.Hashtable();\r
481         SequenceI[] seqs = new SequenceI[sz];\r
482 \r
483         for (int i = 0; i < sz; i++)\r
484         {\r
485             SequenceI seq = (SequenceI) sequences.elementAt(i);\r
486             int index = al.findIndex(seq);\r
487             orderedSeqs.put(index + "", seq);\r
488         }\r
489 \r
490         int index = 0;\r
491 \r
492         for (int i = 0; i < al.getHeight(); i++)\r
493         {\r
494             if (orderedSeqs.containsKey(i + ""))\r
495             {\r
496                 seqs[index++] = (SequenceI) orderedSeqs.get(i + "");\r
497             }\r
498         }\r
499 \r
500         return seqs;\r
501     }\r
502 }\r