reset if clustalX colouring
[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.datamodel.*;\r
24 \r
25 import jalview.schemes.*;\r
26 \r
27 import java.awt.*;\r
28 \r
29 import java.util.Vector;\r
30 \r
31 public class SequenceGroup\r
32 {\r
33   String groupName;\r
34   Conservation conserve;\r
35   Vector aaFrequency;\r
36   boolean displayBoxes;\r
37   boolean displayText;\r
38   boolean colourText;\r
39   public Vector sequences = new Vector();\r
40   int width = -1;\r
41   public ColourSchemeI cs;\r
42   int startRes = 0;\r
43   int endRes = 0;\r
44   Color outlineColour = Color.black;\r
45 \r
46   public SequenceGroup()\r
47   {\r
48     groupName = "Group";\r
49     this.displayBoxes = true;\r
50     this.displayText = true;\r
51     this.colourText = false;\r
52     cs = null;\r
53   }\r
54 \r
55   public SequenceGroup(Vector sequences, String groupName, ColourSchemeI scheme,\r
56                        boolean displayBoxes, boolean displayText,\r
57                        boolean colourText,\r
58                        int start, int end)\r
59   {\r
60     this.sequences = sequences;\r
61     this.groupName = groupName;\r
62     this.displayBoxes = displayBoxes;\r
63     this.displayText = displayText;\r
64     this.colourText = colourText;\r
65     this.cs = scheme;\r
66     startRes = start;\r
67     endRes = end;\r
68     recalcConservation();\r
69   }\r
70 \r
71   public SequenceGroup(String groupName, ColourSchemeI scheme,\r
72                        boolean displayBoxes, boolean displayText,\r
73                        boolean colourText,\r
74                        int start, int end)\r
75   {\r
76     this.groupName = groupName;\r
77     this.displayBoxes = displayBoxes;\r
78     this.displayText = displayText;\r
79     this.colourText = colourText;\r
80     this.cs = scheme;\r
81     startRes = start;\r
82     endRes = end;\r
83   }\r
84 \r
85   public boolean adjustForRemoveLeft(int col)\r
86   {\r
87     // return value is true if the group still exists\r
88     if (startRes >= col)\r
89     {\r
90       startRes = startRes - col;\r
91     }\r
92 \r
93     if (endRes >= col)\r
94     {\r
95       endRes = endRes - col;\r
96 \r
97       if (startRes > endRes)\r
98       {\r
99         startRes = 0;\r
100       }\r
101     }\r
102     else\r
103     {\r
104       // must delete this group!!\r
105       return false;\r
106     }\r
107 \r
108     return true;\r
109   }\r
110 \r
111   public boolean adjustForRemoveRight(int col)\r
112   {\r
113     if (startRes > col)\r
114     {\r
115       // delete this group\r
116       return false;\r
117     }\r
118 \r
119     if (endRes >= col)\r
120     {\r
121       endRes = col;\r
122     }\r
123 \r
124     return true;\r
125   }\r
126 \r
127   public String getName()\r
128   {\r
129     return groupName;\r
130   }\r
131 \r
132   public void setName(String name)\r
133   {\r
134     groupName = name;\r
135   }\r
136 \r
137   public Conservation getConservation()\r
138   {\r
139     return conserve;\r
140   }\r
141 \r
142   public void setConservation(Conservation c)\r
143   {\r
144     conserve = c;\r
145   }\r
146 \r
147   public void addSequence(SequenceI s, boolean recalc)\r
148   {\r
149     if (!sequences.contains(s))\r
150       sequences.addElement(s);\r
151 \r
152     if(recalc)\r
153       recalcConservation();\r
154   }\r
155 \r
156 \r
157   public void recalcConservation()\r
158   {\r
159     System.out.println("sg recalc");\r
160     if (cs != null)\r
161     {\r
162       cs.setConsensus(AAFrequency.calculate(sequences, 0, getWidth()));\r
163     }\r
164 \r
165     if (cs instanceof ClustalxColourScheme)\r
166     {\r
167       ( (ClustalxColourScheme) cs).resetClustalX(sequences,getWidth());\r
168     }\r
169 \r
170 \r
171     if ( cs  instanceof ConservationColourScheme)\r
172     {\r
173       Conservation c = new Conservation(groupName,\r
174                                         ResidueProperties.propHash, 3, sequences,\r
175                                         0, getWidth());\r
176       c.calculate();\r
177       c.verdict(false, 25);\r
178 \r
179       ConservationColourScheme ccs = (ConservationColourScheme) cs;\r
180       ccs.conserve = c;\r
181       if (ccs.cs instanceof ClustalxColourScheme)\r
182       {\r
183         ( (ClustalxColourScheme) ccs.cs).resetClustalX(sequences, getWidth());\r
184       }\r
185 \r
186     }\r
187   }\r
188 \r
189   public void addOrRemove(SequenceI s, boolean recalc)\r
190   {\r
191     if (sequences.contains(s))\r
192     {\r
193       deleteSequence(s, recalc);\r
194     }\r
195     else\r
196     {\r
197       addSequence(s, recalc);\r
198     }\r
199   }\r
200 \r
201   public void deleteSequence(SequenceI s, boolean recalc)\r
202   {\r
203     sequences.removeElement(s);\r
204     if(recalc)\r
205       recalcConservation();\r
206   }\r
207 \r
208   public int getStartRes()\r
209   {\r
210     return startRes;\r
211   }\r
212 \r
213   public int getEndRes()\r
214   {\r
215     return endRes;\r
216   }\r
217 \r
218   public void setStartRes(int i)\r
219   {\r
220     startRes = i;\r
221   }\r
222 \r
223   public void setEndRes(int i)\r
224   {\r
225     endRes = i;\r
226   }\r
227 \r
228   public int getSize()\r
229   {\r
230     return sequences.size();\r
231   }\r
232 \r
233   public SequenceI getSequenceAt(int i)\r
234   {\r
235     return (SequenceI) sequences.elementAt(i);\r
236   }\r
237 \r
238   public void setColourText(boolean state)\r
239   {\r
240     colourText = state;\r
241   }\r
242 \r
243   public boolean getColourText()\r
244   {\r
245     return colourText;\r
246   }\r
247 \r
248   public void setDisplayText(boolean state)\r
249   {\r
250     displayText = state;\r
251   }\r
252 \r
253   public boolean getDisplayText()\r
254   {\r
255     return displayText;\r
256   }\r
257 \r
258   public void setDisplayBoxes(boolean state)\r
259   {\r
260     displayBoxes = state;\r
261   }\r
262 \r
263   public boolean getDisplayBoxes()\r
264   {\r
265     return displayBoxes;\r
266   }\r
267 \r
268   public int getWidth()\r
269   {\r
270     // MC This needs to get reset when characters are inserted and deleted\r
271     if (sequences.size() > 0)\r
272     {\r
273       width = ( (SequenceI) sequences.elementAt(0)).getLength();\r
274     }\r
275 \r
276     for (int i = 1; i < sequences.size(); i++)\r
277     {\r
278       SequenceI seq = (SequenceI) sequences.elementAt(i);\r
279 \r
280       if (seq.getLength() > width)\r
281       {\r
282         width = seq.getLength();\r
283       }\r
284     }\r
285 \r
286     return width;\r
287   }\r
288 \r
289   public void setOutlineColour(Color c)\r
290   {\r
291     outlineColour = c;\r
292   }\r
293 \r
294   public Color getOutlineColour()\r
295   {\r
296     return outlineColour;\r
297   }\r
298 \r
299   /**\r
300    *\r
301    * returns the sequences in the group ordered by the ordering given by al\r
302    *\r
303    * @param al Alignment\r
304    * @return SequenceI[]\r
305    */\r
306   public SequenceI[] getSequencesInOrder(Alignment al)\r
307   {\r
308     int sz;\r
309     java.util.Hashtable orderedSeqs = new java.util.Hashtable();\r
310     SequenceI[] seqs = new SequenceI[sz = sequences.size()];\r
311 \r
312     for (int i = 0; i < sz; i++)\r
313     {\r
314       SequenceI seq = (SequenceI) sequences.elementAt(i);\r
315       int index = al.findIndex(seq);\r
316       orderedSeqs.put(index + "", seq);\r
317     }\r
318 \r
319     int index = 0;\r
320 \r
321     for (int i = 0; i < sz; i++)\r
322     {\r
323       SequenceI seq = null;\r
324 \r
325       while (seq == null)\r
326       {\r
327         if (orderedSeqs.containsKey(index + ""))\r
328         {\r
329           seq = (SequenceI) orderedSeqs.get(index + "");\r
330           index++;\r
331 \r
332           break;\r
333         }\r
334         else\r
335         {\r
336           index++;\r
337         }\r
338       }\r
339 \r
340       seqs[index] = seq;\r
341     }\r
342 \r
343     return seqs;\r
344   }\r
345 }\r