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