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