/*
- * Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
- *
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
+ * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
import jalview.schemes.*;
/**
- * DOCUMENT ME!
- *
+ * Collects a set contiguous ranges on a set of sequences
+ *
* @author $author$
* @version $Revision$
*/
public class SequenceGroup
{
String groupName;
+
String description;
+
Conservation conserve;
+
Vector aaFrequency;
+
boolean displayBoxes = true;
+
boolean displayText = true;
+
boolean colourText = false;
+ /**
+ * group members
+ */
private Vector sequences = new Vector();
+ /**
+ * representative sequence for this group (if any)
+ */
+ private SequenceI seqrep = null;
int width = -1;
- /** DOCUMENT ME!! */
+ /**
+ * Colourscheme applied to group if any */
public ColourSchemeI cs;
+
int startRes = 0;
+
int endRes = 0;
- Color outlineColour = Color.black;
+
+ public Color outlineColour = Color.black;
+
+ public Color idColour = null;
+
public int thresholdTextColour = 0;
+
public Color textColour = Color.black;
+
public Color textColour2 = Color.white;
/**
/**
* Creates a new SequenceGroup object.
- *
- * @param sequences DOCUMENT ME!
- * @param groupName DOCUMENT ME!
- * @param scheme DOCUMENT ME!
- * @param displayBoxes DOCUMENT ME!
- * @param displayText DOCUMENT ME!
- * @param colourText DOCUMENT ME!
- * @param start DOCUMENT ME!
- * @param end DOCUMENT ME!
+ *
+ * @param sequences
+ * @param groupName
+ * @param scheme
+ * @param displayBoxes
+ * @param displayText
+ * @param colourText
+ * @param start
+ * first column of group
+ * @param end
+ * last column of group
*/
public SequenceGroup(Vector sequences, String groupName,
- ColourSchemeI scheme, boolean displayBoxes,
- boolean displayText,
- boolean colourText, int start, int end)
+ ColourSchemeI scheme, boolean displayBoxes, boolean displayText,
+ boolean colourText, int start, int end)
{
this.sequences = sequences;
this.groupName = groupName;
endRes = end;
recalcConservation();
}
+ /**
+ * copy constructor
+ * @param seqsel
+ */
+ public SequenceGroup(SequenceGroup seqsel)
+ {
+ if (seqsel!=null)
+ {
+ sequences=new Vector();
+ Enumeration sq = seqsel.sequences.elements();
+ while (sq.hasMoreElements()) {
+ sequences.addElement(sq.nextElement());
+ };
+ if (seqsel.groupName!=null)
+ {
+ groupName = new String(seqsel.groupName);
+ }
+ displayBoxes = seqsel.displayBoxes;
+ displayText = seqsel.displayText;
+ colourText = seqsel.colourText;
+ startRes = seqsel.startRes;
+ endRes = seqsel.endRes;
+ cs =seqsel.cs;
+ if (seqsel.description!=null)
+ description = new String(seqsel.description);
+ hidecols = seqsel.hidecols;
+ hidereps = seqsel.hidereps;
+ idColour = seqsel.idColour;
+ outlineColour = seqsel.outlineColour;
+ seqrep = seqsel.seqrep;
+ textColour = seqsel.textColour;
+ textColour2 = seqsel.textColour2;
+ thresholdTextColour = seqsel.thresholdTextColour;
+ width = seqsel.width;
+ if (seqsel.conserve!=null)
+ {
+ recalcConservation(); // safer than
+ // aaFrequency = (Vector) seqsel.aaFrequency.clone(); // ??
+ }
+ }
+ }
public SequenceI[] getSelectionAsNewSequences(AlignmentI align)
{
int iSize = sequences.size();
SequenceI[] seqs = new SequenceI[iSize];
SequenceI[] inorder = getSequencesInOrder(align);
-
- for (int i = 0,ipos=0; i < inorder.length; i++)
+
+ for (int i = 0, ipos = 0; i < inorder.length; i++)
{
SequenceI seq = inorder[i];
- seqs[ipos] = seq.getSubSequence(startRes, endRes+1);
- if (seqs[ipos]!=null)
+ seqs[ipos] = seq.getSubSequence(startRes, endRes + 1);
+ if (seqs[ipos] != null)
{
seqs[ipos].setDescription(seq.getDescription());
seqs[ipos].setDBRef(seq.getDBRef());
if (seq.getAnnotation() != null)
{
+ AlignmentAnnotation[] alann = align.getAlignmentAnnotation();
+ // Only copy annotation that is either a score or referenced by the
+ // alignment's annotation vector
for (int a = 0; a < seq.getAnnotation().length; a++)
{
+ AlignmentAnnotation tocopy = seq.getAnnotation()[a];
+ if (alann != null)
+ {
+ boolean found = false;
+ for (int pos = 0; pos < alann.length; pos++)
+ {
+ if (alann[pos] == tocopy)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ continue;
+ }
AlignmentAnnotation newannot = new AlignmentAnnotation(seq
.getAnnotation()[a]);
newannot.restrict(startRes, endRes);
}
}
ipos++;
- } else {
+ }
+ else
+ {
iSize--;
}
}
- if (iSize!=inorder.length)
+ if (iSize != inorder.length)
{
SequenceI[] nseqs = new SequenceI[iSize];
System.arraycopy(seqs, 0, nseqs, 0, iSize);
}
/**
- * If sequence ends in gaps, the end residue can
- * be correctly calculated here
- * @param seq SequenceI
+ * If sequence ends in gaps, the end residue can be correctly calculated here
+ *
+ * @param seq
+ * SequenceI
* @return int
*/
public int findEndRes(SequenceI seq)
for (int j = 0; j < endRes + 1 && j < seq.getLength(); j++)
{
ch = seq.getCharAt(j);
- if (!jalview.util.Comparison.isGap( (ch)))
+ if (!jalview.util.Comparison.isGap((ch)))
{
eres++;
}
for (int h = 0; h < hsg.getSize(); h++)
{
seq2 = hsg.getSequenceAt(h);
- if (seq2 != seq
- && !allSequences.contains(seq2))
+ if (seq2 != seq && !allSequences.contains(seq2))
{
allSequences.addElement(seq2);
}
/**
* DOCUMENT ME!
- *
- * @param col DOCUMENT ME!
- *
+ *
+ * @param col
+ * DOCUMENT ME!
+ *
* @return DOCUMENT ME!
*/
public boolean adjustForRemoveLeft(int col)
/**
* DOCUMENT ME!
- *
- * @param col DOCUMENT ME!
- *
+ *
+ * @param col
+ * DOCUMENT ME!
+ *
* @return DOCUMENT ME!
*/
public boolean adjustForRemoveRight(int col)
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public String getName()
/**
* DOCUMENT ME!
- *
- * @param name DOCUMENT ME!
+ *
+ * @param name
+ * DOCUMENT ME!
*/
public void setName(String name)
{
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public Conservation getConservation()
/**
* DOCUMENT ME!
- *
- * @param c DOCUMENT ME!
+ *
+ * @param c
+ * DOCUMENT ME!
*/
public void setConservation(Conservation c)
{
}
/**
- * DOCUMENT ME!
- *
- * @param s DOCUMENT ME!
- * @param recalc DOCUMENT ME!
+ * Add s to this sequence group
+ *
+ * @param s
+ * alignment sequence to be added
+ * @param recalc
+ * true means Group's conservation should be recalculated
*/
public void addSequence(SequenceI s, boolean recalc)
{
}
/**
- * DOCUMENT ME!
+ * calculate residue conservation for group
*/
public void recalcConservation()
{
try
{
- cs.setConsensus(AAFrequency.calculate(sequences, startRes, endRes + 1));
+ cs.setConsensus(AAFrequency
+ .calculate(sequences, startRes, endRes + 1));
if (cs instanceof ClustalxColourScheme)
{
- ( (ClustalxColourScheme) cs).resetClustalX(sequences, getWidth());
+ ((ClustalxColourScheme) cs).resetClustalX(sequences, getWidth());
}
if (cs.conservationApplied())
{
Conservation c = new Conservation(groupName,
- ResidueProperties.propHash, 3,
- sequences,
- startRes, endRes + 1);
+ ResidueProperties.propHash, 3, sequences, startRes,
+ endRes + 1);
c.calculate();
c.verdict(false, 25);
if (cs instanceof ClustalxColourScheme)
{
- ( (ClustalxColourScheme) cs).resetClustalX(sequences,
- getWidth());
+ ((ClustalxColourScheme) cs).resetClustalX(sequences, getWidth());
}
}
- }
- catch (java.lang.OutOfMemoryError err)
+ } catch (java.lang.OutOfMemoryError err)
{
+ // TODO: catch OOM
System.out.println("Out of memory loading groups: " + err);
}
/**
* DOCUMENT ME!
- *
- * @param s DOCUMENT ME!
- * @param recalc DOCUMENT ME!
+ *
+ * @param s
+ * DOCUMENT ME!
+ * @param recalc
+ * DOCUMENT ME!
*/
public void addOrRemove(SequenceI s, boolean recalc)
{
/**
* DOCUMENT ME!
- *
- * @param s DOCUMENT ME!
- * @param recalc DOCUMENT ME!
+ *
+ * @param s
+ * DOCUMENT ME!
+ * @param recalc
+ * DOCUMENT ME!
*/
public void deleteSequence(SequenceI s, boolean recalc)
{
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public int getStartRes()
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public int getEndRes()
/**
* DOCUMENT ME!
- *
- * @param i DOCUMENT ME!
+ *
+ * @param i
+ * DOCUMENT ME!
*/
public void setStartRes(int i)
{
/**
* DOCUMENT ME!
- *
- * @param i DOCUMENT ME!
+ *
+ * @param i
+ * DOCUMENT ME!
*/
public void setEndRes(int i)
{
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public int getSize()
/**
* DOCUMENT ME!
- *
- * @param i DOCUMENT ME!
- *
+ *
+ * @param i
+ * DOCUMENT ME!
+ *
* @return DOCUMENT ME!
*/
public SequenceI getSequenceAt(int i)
/**
* DOCUMENT ME!
- *
- * @param state DOCUMENT ME!
+ *
+ * @param state
+ * DOCUMENT ME!
*/
public void setColourText(boolean state)
{
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public boolean getColourText()
/**
* DOCUMENT ME!
- *
- * @param state DOCUMENT ME!
+ *
+ * @param state
+ * DOCUMENT ME!
*/
public void setDisplayText(boolean state)
{
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public boolean getDisplayText()
/**
* DOCUMENT ME!
- *
- * @param state DOCUMENT ME!
+ *
+ * @param state
+ * DOCUMENT ME!
*/
public void setDisplayBoxes(boolean state)
{
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public boolean getDisplayBoxes()
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public int getWidth()
// MC This needs to get reset when characters are inserted and deleted
if (sequences.size() > 0)
{
- width = ( (SequenceI) sequences.elementAt(0)).getLength();
+ width = ((SequenceI) sequences.elementAt(0)).getLength();
}
for (int i = 1; i < sequences.size(); i++)
/**
* DOCUMENT ME!
- *
- * @param c DOCUMENT ME!
+ *
+ * @param c
+ * DOCUMENT ME!
*/
public void setOutlineColour(Color c)
{
/**
* DOCUMENT ME!
- *
+ *
* @return DOCUMENT ME!
*/
public Color getOutlineColour()
}
/**
- *
+ *
* returns the sequences in the group ordered by the ordering given by al
- *
- * @param al Alignment
+ *
+ * @param al
+ * Alignment
* @return SequenceI[]
*/
public SequenceI[] getSequencesInOrder(AlignmentI al)
return seqs;
}
+
+ /**
+ * @return the idColour
+ */
+ public Color getIdColour()
+ {
+ return idColour;
+ }
+
+ /**
+ * @param idColour
+ * the idColour to set
+ */
+ public void setIdColour(Color idColour)
+ {
+ this.idColour = idColour;
+ }
+
+ /**
+ * @return the representative sequence for this group
+ */
+ public SequenceI getSeqrep()
+ {
+ return seqrep;
+ }
+
+ /**
+ * set the representative sequence for this group.
+ * Note - this affects the interpretation of the Hidereps attribute.
+ * @param seqrep the seqrep to set (null means no sequence representative)
+ */
+ public void setSeqrep(SequenceI seqrep)
+ {
+ this.seqrep = seqrep;
+ }
+ /**
+ *
+ * @return true if group has a sequence representative
+ */
+ public boolean hasSeqrep()
+ {
+ return seqrep != null;
+ }
+ /**
+ * visibility of rows or represented rows covered by group
+ */
+ private boolean hidereps=false;
+ /**
+ * set visibility of sequences covered by (if no sequence representative is defined)
+ * or represented by this group.
+ * @param visibility
+ */
+ public void setHidereps(boolean visibility)
+ {
+ hidereps = visibility;
+ }
+ /**
+ *
+ * @return true if sequences represented (or covered) by this group should be hidden
+ */
+ public boolean isHidereps()
+ {
+ return hidereps;
+ }
+ /**
+ * visibility of columns intersecting this group
+ */
+ private boolean hidecols=false;
+ /**
+ * set intended visibility of columns covered by this group
+ * @param visibility
+ */
+ public void setHideCols(boolean visibility)
+ {
+ hidecols = visibility;
+ }
+ /**
+ *
+ * @return true if columns covered by group should be hidden
+ */
+ public boolean isHideCols()
+ {
+ return hidecols;
+ }
+ /**
+ * create a new sequence group from the intersection of this group
+ * with an alignment Hashtable of hidden representatives
+ *
+ * @param alignment (may not be null)
+ * @param hashtable (may be null)
+ * @return new group containing sequences common to this group and alignment
+ */
+ public SequenceGroup intersect(AlignmentI alignment, Hashtable hashtable)
+ {
+ SequenceGroup sgroup = new SequenceGroup(this);
+ Enumeration en = getSequences(hashtable).elements();
+ while (en.hasMoreElements())
+ {
+ SequenceI elem = (SequenceI) en.nextElement();
+ if (alignment.getSequences().contains(elem))
+ {
+ sgroup.addSequence(elem, false);
+ }
+ }
+ return sgroup;
+ }
}