Formatting changes
[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         {\r
240             cs.setConsensus(AAFrequency.calculate(sequences, 0, getWidth()));\r
241         }\r
242 \r
243         if (cs instanceof ClustalxColourScheme)\r
244         {\r
245             ((ClustalxColourScheme) cs).resetClustalX(sequences, getWidth());\r
246         }\r
247 \r
248         if (cs instanceof ConservationColourScheme)\r
249         {\r
250             Conservation c = new Conservation(groupName,\r
251                     ResidueProperties.propHash, 3, sequences, 0, getWidth());\r
252             c.calculate();\r
253             c.verdict(false, 25);\r
254 \r
255             ConservationColourScheme ccs = (ConservationColourScheme) cs;\r
256             ccs.conserve = c;\r
257 \r
258             if (ccs.cs instanceof ClustalxColourScheme)\r
259             {\r
260                 ((ClustalxColourScheme) ccs.cs).resetClustalX(sequences,\r
261                     getWidth());\r
262             }\r
263         }\r
264     }\r
265 \r
266     /**\r
267      * DOCUMENT ME!\r
268      *\r
269      * @param s DOCUMENT ME!\r
270      * @param recalc DOCUMENT ME!\r
271      */\r
272     public void addOrRemove(SequenceI s, boolean recalc)\r
273     {\r
274         if (sequences.contains(s))\r
275         {\r
276             deleteSequence(s, recalc);\r
277         }\r
278         else\r
279         {\r
280             addSequence(s, recalc);\r
281         }\r
282     }\r
283 \r
284     /**\r
285      * DOCUMENT ME!\r
286      *\r
287      * @param s DOCUMENT ME!\r
288      * @param recalc DOCUMENT ME!\r
289      */\r
290     public void deleteSequence(SequenceI s, boolean recalc)\r
291     {\r
292         sequences.removeElement(s);\r
293 \r
294         if (recalc)\r
295         {\r
296             recalcConservation();\r
297         }\r
298     }\r
299 \r
300     /**\r
301      * DOCUMENT ME!\r
302      *\r
303      * @return DOCUMENT ME!\r
304      */\r
305     public int getStartRes()\r
306     {\r
307         return startRes;\r
308     }\r
309 \r
310     /**\r
311      * DOCUMENT ME!\r
312      *\r
313      * @return DOCUMENT ME!\r
314      */\r
315     public int getEndRes()\r
316     {\r
317         return endRes;\r
318     }\r
319 \r
320     /**\r
321      * DOCUMENT ME!\r
322      *\r
323      * @param i DOCUMENT ME!\r
324      */\r
325     public void setStartRes(int i)\r
326     {\r
327         startRes = i;\r
328     }\r
329 \r
330     /**\r
331      * DOCUMENT ME!\r
332      *\r
333      * @param i DOCUMENT ME!\r
334      */\r
335     public void setEndRes(int i)\r
336     {\r
337         endRes = i;\r
338     }\r
339 \r
340     /**\r
341      * DOCUMENT ME!\r
342      *\r
343      * @return DOCUMENT ME!\r
344      */\r
345     public int getSize()\r
346     {\r
347         return sequences.size();\r
348     }\r
349 \r
350     /**\r
351      * DOCUMENT ME!\r
352      *\r
353      * @param i DOCUMENT ME!\r
354      *\r
355      * @return DOCUMENT ME!\r
356      */\r
357     public SequenceI getSequenceAt(int i)\r
358     {\r
359         return (SequenceI) sequences.elementAt(i);\r
360     }\r
361 \r
362     /**\r
363      * DOCUMENT ME!\r
364      *\r
365      * @param state DOCUMENT ME!\r
366      */\r
367     public void setColourText(boolean state)\r
368     {\r
369         colourText = state;\r
370     }\r
371 \r
372     /**\r
373      * DOCUMENT ME!\r
374      *\r
375      * @return DOCUMENT ME!\r
376      */\r
377     public boolean getColourText()\r
378     {\r
379         return colourText;\r
380     }\r
381 \r
382     /**\r
383      * DOCUMENT ME!\r
384      *\r
385      * @param state DOCUMENT ME!\r
386      */\r
387     public void setDisplayText(boolean state)\r
388     {\r
389         displayText = state;\r
390     }\r
391 \r
392     /**\r
393      * DOCUMENT ME!\r
394      *\r
395      * @return DOCUMENT ME!\r
396      */\r
397     public boolean getDisplayText()\r
398     {\r
399         return displayText;\r
400     }\r
401 \r
402     /**\r
403      * DOCUMENT ME!\r
404      *\r
405      * @param state DOCUMENT ME!\r
406      */\r
407     public void setDisplayBoxes(boolean state)\r
408     {\r
409         displayBoxes = state;\r
410     }\r
411 \r
412     /**\r
413      * DOCUMENT ME!\r
414      *\r
415      * @return DOCUMENT ME!\r
416      */\r
417     public boolean getDisplayBoxes()\r
418     {\r
419         return displayBoxes;\r
420     }\r
421 \r
422     /**\r
423      * DOCUMENT ME!\r
424      *\r
425      * @return DOCUMENT ME!\r
426      */\r
427     public int getWidth()\r
428     {\r
429         // MC This needs to get reset when characters are inserted and deleted\r
430         if (sequences.size() > 0)\r
431         {\r
432             width = ((SequenceI) sequences.elementAt(0)).getLength();\r
433         }\r
434 \r
435         for (int i = 1; i < sequences.size(); i++)\r
436         {\r
437             SequenceI seq = (SequenceI) sequences.elementAt(i);\r
438 \r
439             if (seq.getLength() > width)\r
440             {\r
441                 width = seq.getLength();\r
442             }\r
443         }\r
444 \r
445         return width;\r
446     }\r
447 \r
448     /**\r
449      * DOCUMENT ME!\r
450      *\r
451      * @param c DOCUMENT ME!\r
452      */\r
453     public void setOutlineColour(Color c)\r
454     {\r
455         outlineColour = c;\r
456     }\r
457 \r
458     /**\r
459      * DOCUMENT ME!\r
460      *\r
461      * @return DOCUMENT ME!\r
462      */\r
463     public Color getOutlineColour()\r
464     {\r
465         return outlineColour;\r
466     }\r
467 \r
468     /**\r
469      *\r
470      * returns the sequences in the group ordered by the ordering given by al\r
471      *\r
472      * @param al Alignment\r
473      * @return SequenceI[]\r
474      */\r
475     public SequenceI[] getSequencesInOrder(AlignmentI al)\r
476     {\r
477         int sz = sequences.size();\r
478         java.util.Hashtable orderedSeqs = new java.util.Hashtable();\r
479         SequenceI[] seqs = new SequenceI[sz];\r
480 \r
481         for (int i = 0; i < sz; i++)\r
482         {\r
483             SequenceI seq = (SequenceI) sequences.elementAt(i);\r
484             int index = al.findIndex(seq);\r
485             orderedSeqs.put(index + "", seq);\r
486         }\r
487 \r
488         int index = 0;\r
489 \r
490         for (int i = 0; i < al.getHeight(); i++)\r
491         {\r
492             if (orderedSeqs.containsKey(i + ""))\r
493             {\r
494                 seqs[index++] = (SequenceI) orderedSeqs.get(i + "");\r
495             }\r
496         }\r
497 \r
498         return seqs;\r
499     }\r
500 }\r