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