2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\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
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
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
19 package jalview.datamodel;
\r
25 import jalview.analysis.*;
\r
26 import jalview.schemes.*;
\r
32 * @version $Revision$
\r
34 public class SequenceGroup
\r
38 Conservation conserve;
\r
40 boolean displayBoxes = true;
\r
41 boolean displayText = true;
\r
42 boolean colourText = true;
\r
43 private Vector sequences = new Vector();
\r
46 /** DOCUMENT ME!! */
\r
47 public ColourSchemeI cs;
\r
50 Color outlineColour = Color.black;
\r
51 public int thresholdTextColour = 0;
\r
52 public Color textColour = Color.black;
\r
53 public Color textColour2 = Color.white;
\r
56 * Creates a new SequenceGroup object.
\r
58 public SequenceGroup()
\r
60 groupName = "JGroup:" + this.hashCode();
\r
64 * Creates a new SequenceGroup object.
\r
66 * @param sequences DOCUMENT ME!
\r
67 * @param groupName DOCUMENT ME!
\r
68 * @param scheme DOCUMENT ME!
\r
69 * @param displayBoxes DOCUMENT ME!
\r
70 * @param displayText DOCUMENT ME!
\r
71 * @param colourText DOCUMENT ME!
\r
72 * @param start DOCUMENT ME!
\r
73 * @param end DOCUMENT ME!
\r
75 public SequenceGroup(Vector sequences, String groupName,
\r
76 ColourSchemeI scheme, boolean displayBoxes,
\r
77 boolean displayText,
\r
78 boolean colourText, int start, int end)
\r
80 this.sequences = sequences;
\r
81 this.groupName = groupName;
\r
82 this.displayBoxes = displayBoxes;
\r
83 this.displayText = displayText;
\r
84 this.colourText = colourText;
\r
88 recalcConservation();
\r
91 public SequenceI[] getSelectionAsNewSequences(AlignmentI align)
\r
93 int iSize = sequences.size();
\r
94 SequenceI[] seqs = new SequenceI[iSize];
\r
95 SequenceI[] inorder = getSequencesInOrder(align);
\r
97 for (int i = 0; i < iSize; i++)
\r
99 SequenceI seq = inorder[i];
\r
101 seqs[i] = new Sequence(seq.getName(),
\r
102 seq.getSequence(startRes, endRes + 1),
\r
103 seq.findPosition(startRes),
\r
106 seqs[i].setDescription(seq.getDescription());
\r
107 seqs[i].setDBRef(seq.getDBRef());
\r
108 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
109 if (seq.getDatasetSequence() != null)
\r
111 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
114 if (seq.getAnnotation() != null)
\r
116 for (int a = 0; a < seq.getAnnotation().length; a++)
\r
118 seqs[i].addAlignmentAnnotation(seq.getAnnotation()[a]);
\r
128 * If sequence ends in gaps, the end residue can
\r
129 * be correctly calculated here
\r
130 * @param seq SequenceI
\r
133 public int findEndRes(SequenceI seq)
\r
138 for (int j = 0; j < endRes + 1 && j < seq.getLength(); j++)
\r
140 ch = seq.getCharAt(j);
\r
141 if (!jalview.util.Comparison.isGap( (ch)))
\r
149 eres += seq.getStart() - 1;
\r
155 public Vector getSequences(Hashtable hiddenReps)
\r
157 if (hiddenReps == null)
\r
163 Vector allSequences = new Vector();
\r
164 SequenceI seq, seq2;
\r
165 for (int i = 0; i < sequences.size(); i++)
\r
167 seq = (SequenceI) sequences.elementAt(i);
\r
168 allSequences.addElement(seq);
\r
169 if (hiddenReps.containsKey(seq))
\r
171 SequenceGroup hsg = (SequenceGroup) hiddenReps.get(seq);
\r
172 for (int h = 0; h < hsg.getSize(); h++)
\r
174 seq2 = hsg.getSequenceAt(h);
\r
176 && !allSequences.contains(seq2))
\r
178 allSequences.addElement(seq2);
\r
184 return allSequences;
\r
188 public SequenceI[] getSequencesAsArray(Hashtable hiddenReps)
\r
190 Vector tmp = getSequences(hiddenReps);
\r
195 SequenceI[] result = new SequenceI[tmp.size()];
\r
196 for (int i = 0; i < result.length; i++)
\r
198 result[i] = (SequenceI) tmp.elementAt(i);
\r
207 * @param col DOCUMENT ME!
\r
209 * @return DOCUMENT ME!
\r
211 public boolean adjustForRemoveLeft(int col)
\r
213 // return value is true if the group still exists
\r
214 if (startRes >= col)
\r
216 startRes = startRes - col;
\r
221 endRes = endRes - col;
\r
223 if (startRes > endRes)
\r
230 // must delete this group!!
\r
240 * @param col DOCUMENT ME!
\r
242 * @return DOCUMENT ME!
\r
244 public boolean adjustForRemoveRight(int col)
\r
246 if (startRes > col)
\r
248 // delete this group
\r
263 * @return DOCUMENT ME!
\r
265 public String getName()
\r
270 public String getDescription()
\r
272 return description;
\r
278 * @param name DOCUMENT ME!
\r
280 public void setName(String name)
\r
285 public void setDescription(String desc)
\r
287 description = desc;
\r
293 * @return DOCUMENT ME!
\r
295 public Conservation getConservation()
\r
303 * @param c DOCUMENT ME!
\r
305 public void setConservation(Conservation c)
\r
313 * @param s DOCUMENT ME!
\r
314 * @param recalc DOCUMENT ME!
\r
316 public void addSequence(SequenceI s, boolean recalc)
\r
318 if (s != null && !sequences.contains(s))
\r
320 sequences.addElement(s);
\r
325 recalcConservation();
\r
332 public void recalcConservation()
\r
341 cs.setConsensus(AAFrequency.calculate(sequences, startRes, endRes + 1));
\r
343 if (cs instanceof ClustalxColourScheme)
\r
345 ( (ClustalxColourScheme) cs).resetClustalX(sequences, getWidth());
\r
348 if (cs.conservationApplied())
\r
350 Conservation c = new Conservation(groupName,
\r
351 ResidueProperties.propHash, 3,
\r
353 startRes, endRes + 1);
\r
355 c.verdict(false, 25);
\r
357 cs.setConservation(c);
\r
359 if (cs instanceof ClustalxColourScheme)
\r
361 ( (ClustalxColourScheme) cs).resetClustalX(sequences,
\r
366 catch (java.lang.OutOfMemoryError err)
\r
368 System.out.println("Out of memory loading groups: " + err);
\r
376 * @param s DOCUMENT ME!
\r
377 * @param recalc DOCUMENT ME!
\r
379 public void addOrRemove(SequenceI s, boolean recalc)
\r
381 if (sequences.contains(s))
\r
383 deleteSequence(s, recalc);
\r
387 addSequence(s, recalc);
\r
394 * @param s DOCUMENT ME!
\r
395 * @param recalc DOCUMENT ME!
\r
397 public void deleteSequence(SequenceI s, boolean recalc)
\r
399 sequences.removeElement(s);
\r
403 recalcConservation();
\r
410 * @return DOCUMENT ME!
\r
412 public int getStartRes()
\r
420 * @return DOCUMENT ME!
\r
422 public int getEndRes()
\r
430 * @param i DOCUMENT ME!
\r
432 public void setStartRes(int i)
\r
440 * @param i DOCUMENT ME!
\r
442 public void setEndRes(int i)
\r
450 * @return DOCUMENT ME!
\r
452 public int getSize()
\r
454 return sequences.size();
\r
460 * @param i DOCUMENT ME!
\r
462 * @return DOCUMENT ME!
\r
464 public SequenceI getSequenceAt(int i)
\r
466 return (SequenceI) sequences.elementAt(i);
\r
472 * @param state DOCUMENT ME!
\r
474 public void setColourText(boolean state)
\r
476 colourText = state;
\r
482 * @return DOCUMENT ME!
\r
484 public boolean getColourText()
\r
492 * @param state DOCUMENT ME!
\r
494 public void setDisplayText(boolean state)
\r
496 displayText = state;
\r
502 * @return DOCUMENT ME!
\r
504 public boolean getDisplayText()
\r
506 return displayText;
\r
512 * @param state DOCUMENT ME!
\r
514 public void setDisplayBoxes(boolean state)
\r
516 displayBoxes = state;
\r
522 * @return DOCUMENT ME!
\r
524 public boolean getDisplayBoxes()
\r
526 return displayBoxes;
\r
532 * @return DOCUMENT ME!
\r
534 public int getWidth()
\r
536 // MC This needs to get reset when characters are inserted and deleted
\r
537 if (sequences.size() > 0)
\r
539 width = ( (SequenceI) sequences.elementAt(0)).getLength();
\r
542 for (int i = 1; i < sequences.size(); i++)
\r
544 SequenceI seq = (SequenceI) sequences.elementAt(i);
\r
546 if (seq.getLength() > width)
\r
548 width = seq.getLength();
\r
558 * @param c DOCUMENT ME!
\r
560 public void setOutlineColour(Color c)
\r
568 * @return DOCUMENT ME!
\r
570 public Color getOutlineColour()
\r
572 return outlineColour;
\r
577 * returns the sequences in the group ordered by the ordering given by al
\r
579 * @param al Alignment
\r
580 * @return SequenceI[]
\r
582 public SequenceI[] getSequencesInOrder(AlignmentI al)
\r
584 int sSize = sequences.size();
\r
585 int alHeight = al.getHeight();
\r
587 SequenceI[] seqs = new SequenceI[sSize];
\r
590 for (int i = 0; i < alHeight && index < sSize; i++)
\r
592 if (sequences.contains(al.getSequenceAt(i)))
\r
594 seqs[index++] = al.getSequenceAt(i);
\r