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