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