X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FSequenceGroup.java;h=1df45a2b2ce02af19d24f98b363cbbbcae28f42a;hb=fb27f86492eb06fc39b0578e1c31de8b4c26491a;hp=561a43d68c859992896f772645bb076963b2604d;hpb=609e194252024a6c3d01d6fea1b12525d4a77c9b;p=jalview.git
diff --git a/src/jalview/datamodel/SequenceGroup.java b/src/jalview/datamodel/SequenceGroup.java
index 561a43d..1df45a2 100755
--- a/src/jalview/datamodel/SequenceGroup.java
+++ b/src/jalview/datamodel/SequenceGroup.java
@@ -1,24 +1,25 @@
/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
- * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+ * Copyright (C) 2014 The Jalview Authors
*
- * 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 file is part of Jalview.
*
- * 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.
+ * Jalview 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 3 of the License, or (at your option) any later version.
+ *
+ * Jalview 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
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see .
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.datamodel;
import java.util.*;
+import java.util.List;
import java.awt.*;
@@ -31,7 +32,7 @@ import jalview.schemes.*;
* @author $author$
* @version $Revision$
*/
-public class SequenceGroup
+public class SequenceGroup implements AnnotatedCollectionI
{
String groupName;
@@ -46,18 +47,27 @@ public class SequenceGroup
boolean displayText = true;
boolean colourText = false;
+
+ /**
+ * after Olivier's non-conserved only character display
+ */
+ boolean showNonconserved = false;
+
/**
* group members
*/
- private Vector sequences = new Vector();
+ private Vector sequences = new Vector();
+
/**
* representative sequence for this group (if any)
*/
private SequenceI seqrep = null;
+
int width = -1;
/**
- * Colourscheme applied to group if any */
+ * Colourscheme applied to group if any
+ */
public ColourSchemeI cs;
int startRes = 0;
@@ -75,6 +85,29 @@ public class SequenceGroup
public Color textColour2 = Color.white;
/**
+ * consensus calculation property
+ */
+ private boolean ignoreGapsInConsensus = true;
+
+ /**
+ * consensus calculation property
+ */
+ private boolean showSequenceLogo = false;
+
+ /**
+ * flag indicating if logo should be rendered normalised
+ */
+ private boolean normaliseSequenceLogo;
+
+ /**
+ * @return the includeAllConsSymbols
+ */
+ public boolean isShowSequenceLogo()
+ {
+ return showSequenceLogo;
+ }
+
+ /**
* Creates a new SequenceGroup object.
*/
public SequenceGroup()
@@ -92,9 +125,9 @@ public class SequenceGroup
* @param displayText
* @param colourText
* @param start
- * first column of group
+ * first column of group
* @param end
- * last column of group
+ * last column of group
*/
public SequenceGroup(Vector sequences, String groupName,
ColourSchemeI scheme, boolean displayBoxes, boolean displayText,
@@ -110,20 +143,24 @@ public class SequenceGroup
endRes = end;
recalcConservation();
}
+
/**
* copy constructor
+ *
* @param seqsel
*/
public SequenceGroup(SequenceGroup seqsel)
{
- if (seqsel!=null)
+ if (seqsel != null)
{
- sequences=new Vector();
- Enumeration sq = seqsel.sequences.elements();
- while (sq.hasMoreElements()) {
- sequences.addElement(sq.nextElement());
- };
- if (seqsel.groupName!=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);
}
@@ -132,8 +169,8 @@ public class SequenceGroup
colourText = seqsel.colourText;
startRes = seqsel.startRes;
endRes = seqsel.endRes;
- cs =seqsel.cs;
- if (seqsel.description!=null)
+ cs = seqsel.cs;
+ if (seqsel.description != null)
description = new String(seqsel.description);
hidecols = seqsel.hidecols;
hidereps = seqsel.hidereps;
@@ -144,9 +181,10 @@ public class SequenceGroup
textColour2 = seqsel.textColour2;
thresholdTextColour = seqsel.thresholdTextColour;
width = seqsel.width;
- if (seqsel.conserve!=null)
+ ignoreGapsInConsensus = seqsel.ignoreGapsInConsensus;
+ if (seqsel.conserve != null)
{
- recalcConservation(); // safer than
+ recalcConservation(); // safer than
// aaFrequency = (Vector) seqsel.aaFrequency.clone(); // ??
}
}
@@ -195,8 +233,8 @@ public class SequenceGroup
if (!found)
continue;
}
- AlignmentAnnotation newannot = new AlignmentAnnotation(seq
- .getAnnotation()[a]);
+ AlignmentAnnotation newannot = new AlignmentAnnotation(
+ seq.getAnnotation()[a]);
newannot.restrict(startRes, endRes);
newannot.setSequenceRef(seqs[ipos]);
newannot.adjustForAlignment();
@@ -224,7 +262,7 @@ public class SequenceGroup
* If sequence ends in gaps, the end residue can be correctly calculated here
*
* @param seq
- * SequenceI
+ * SequenceI
* @return int
*/
public int findEndRes(SequenceI seq)
@@ -249,7 +287,13 @@ public class SequenceGroup
return eres;
}
- public Vector getSequences(Hashtable hiddenReps)
+ public List getSequences()
+ {
+ return sequences;
+ }
+
+ public List getSequences(
+ Map hiddenReps)
{
if (hiddenReps == null)
{
@@ -258,17 +302,16 @@ public class SequenceGroup
else
{
Vector allSequences = new Vector();
- SequenceI seq, seq2;
+ SequenceI seq;
for (int i = 0; i < sequences.size(); i++)
{
seq = (SequenceI) sequences.elementAt(i);
allSequences.addElement(seq);
if (hiddenReps.containsKey(seq))
{
- SequenceGroup hsg = (SequenceGroup) hiddenReps.get(seq);
- for (int h = 0; h < hsg.getSize(); h++)
+ SequenceCollectionI hsg = hiddenReps.get(seq);
+ for (SequenceI seq2 : hsg.getSequences())
{
- seq2 = hsg.getSequenceAt(h);
if (seq2 != seq && !allSequences.contains(seq2))
{
allSequences.addElement(seq2);
@@ -281,27 +324,22 @@ public class SequenceGroup
}
}
- public SequenceI[] getSequencesAsArray(Hashtable hiddenReps)
+ public SequenceI[] getSequencesAsArray(
+ Map map)
{
- Vector tmp = getSequences(hiddenReps);
+ List tmp = getSequences(map);
if (tmp == null)
{
return null;
}
- SequenceI[] result = new SequenceI[tmp.size()];
- for (int i = 0; i < result.length; i++)
- {
- result[i] = (SequenceI) tmp.elementAt(i);
- }
-
- return result;
+ return tmp.toArray(new SequenceI[tmp.size()]);
}
/**
* DOCUMENT ME!
*
* @param col
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@@ -335,7 +373,7 @@ public class SequenceGroup
* DOCUMENT ME!
*
* @param col
- * DOCUMENT ME!
+ * DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@@ -374,11 +412,12 @@ public class SequenceGroup
* DOCUMENT ME!
*
* @param name
- * DOCUMENT ME!
+ * DOCUMENT ME!
*/
public void setName(String name)
{
groupName = name;
+ // TODO: URGENT: update dependent objects (annotation row)
}
public void setDescription(String desc)
@@ -400,7 +439,7 @@ public class SequenceGroup
* DOCUMENT ME!
*
* @param c
- * DOCUMENT ME!
+ * DOCUMENT ME!
*/
public void setConservation(Conservation c)
{
@@ -408,12 +447,14 @@ public class SequenceGroup
}
/**
- * Add s to this sequence group
+ * Add s to this sequence group. If aligment sequence is already contained in
+ * group, it will not be added again, but recalculation may happen if the flag
+ * is set.
*
* @param s
- * alignment sequence to be added
+ * alignment sequence to be added
* @param recalc
- * true means Group's conservation should be recalculated
+ * true means Group's conservation should be recalculated
*/
public void addSequence(SequenceI s, boolean recalc)
{
@@ -429,40 +470,73 @@ public class SequenceGroup
}
/**
- * calculate residue conservation for group
+ * Max Gaps Threshold (percent) for performing a conservation calculation
+ */
+ private int consPercGaps = 25;
+
+ /**
+ * @return Max Gaps Threshold for performing a conservation calculation
+ */
+ public int getConsPercGaps()
+ {
+ return consPercGaps;
+ }
+
+ /**
+ * set Max Gaps Threshold (percent) for performing a conservation calculation
+ * @param consPercGaps
+ */
+ public void setConsPercGaps(int consPercGaps)
+ {
+ this.consPercGaps = consPercGaps;
+ }
+
+ /**
+ * calculate residue conservation for group - but only if necessary.
*/
public void recalcConservation()
{
- if (cs == null)
+ if (cs == null && consensus == null && conservation == null)
{
return;
}
-
try
{
- cs.setConsensus(AAFrequency
- .calculate(sequences, startRes, endRes + 1));
-
- if (cs instanceof ClustalxColourScheme)
+ Hashtable cnsns[] = AAFrequency.calculate(sequences, startRes,
+ endRes + 1, showSequenceLogo);
+ if (consensus != null)
{
- ((ClustalxColourScheme) cs).resetClustalX(sequences, getWidth());
+ _updateConsensusRow(cnsns, sequences.size());
+ }
+ if (cs != null)
+ {
+ cs.setConsensus(cnsns);
}
- if (cs.conservationApplied())
+ if ((conservation != null)
+ || (cs != null && cs.conservationApplied()))
{
Conservation c = new Conservation(groupName,
ResidueProperties.propHash, 3, sequences, startRes,
endRes + 1);
c.calculate();
- c.verdict(false, 25);
-
- cs.setConservation(c);
-
- if (cs instanceof ClustalxColourScheme)
+ c.verdict(false, consPercGaps);
+ if (conservation != null)
+ {
+ _updateConservationRow(c);
+ }
+ if (cs != null)
{
- ((ClustalxColourScheme) cs).resetClustalX(sequences, getWidth());
+ if (cs.conservationApplied())
+ {
+ cs.setConservation(c);
+ }
}
}
+ if (cs != null)
+ {
+ cs.alignmentChanged(context!=null ? context : this, null);
+ }
} catch (java.lang.OutOfMemoryError err)
{
// TODO: catch OOM
@@ -471,13 +545,56 @@ public class SequenceGroup
}
+ private void _updateConservationRow(Conservation c)
+ {
+ if (conservation == null)
+ {
+ getConservation();
+ }
+ // update Labels
+ conservation.label = "Conservation for " + getName();
+ conservation.description = "Conservation for group " + getName()
+ + " less than " + consPercGaps + "% gaps";
+ // preserve width if already set
+ int aWidth = (conservation.annotations != null) ? (endRes < conservation.annotations.length ? conservation.annotations.length
+ : endRes + 1)
+ : endRes + 1;
+ conservation.annotations = null;
+ conservation.annotations = new Annotation[aWidth]; // should be alignment
+ // width
+ c.completeAnnotations(conservation, null, startRes, endRes + 1);
+ }
+
+ public Hashtable[] consensusData = null;
+
+ private void _updateConsensusRow(Hashtable[] cnsns, long nseq)
+ {
+ if (consensus == null)
+ {
+ getConsensus();
+ }
+ consensus.label = "Consensus for " + getName();
+ consensus.description = "Percent Identity";
+ consensusData = cnsns;
+ // preserve width if already set
+ int aWidth = (consensus.annotations != null) ? (endRes < consensus.annotations.length ? consensus.annotations.length
+ : endRes + 1)
+ : endRes + 1;
+ consensus.annotations = null;
+ consensus.annotations = new Annotation[aWidth]; // should be alignment width
+
+ AAFrequency.completeConsensus(consensus, cnsns, startRes, endRes + 1,
+ ignoreGapsInConsensus, showSequenceLogo, nseq); // TODO: setting container
+ // for
+ // ignoreGapsInConsensusCalculation);
+ }
+
/**
- * DOCUMENT ME!
- *
* @param s
- * DOCUMENT ME!
+ * sequence to either add or remove from group
* @param recalc
- * DOCUMENT ME!
+ * flag passed to delete/addSequence to indicate if group properties
+ * should be recalculated
*/
public void addOrRemove(SequenceI s, boolean recalc)
{
@@ -495,9 +612,9 @@ public class SequenceGroup
* DOCUMENT ME!
*
* @param s
- * DOCUMENT ME!
+ * DOCUMENT ME!
* @param recalc
- * DOCUMENT ME!
+ * DOCUMENT ME!
*/
public void deleteSequence(SequenceI s, boolean recalc)
{
@@ -510,9 +627,9 @@ public class SequenceGroup
}
/**
- * DOCUMENT ME!
*
- * @return DOCUMENT ME!
+ *
+ * @return the first column selected by this group. Runs from 0<=i= 0)
+ {
+ seqs[index] = dummy[index];
+ dummy[index] = null;
}
}
-
return seqs;
}
@@ -721,7 +870,7 @@ public class SequenceGroup
/**
* @param idColour
- * the idColour to set
+ * the idColour to set
*/
public void setIdColour(Color idColour)
{
@@ -737,14 +886,17 @@ public class SequenceGroup
}
/**
- * 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)
+ * 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
@@ -753,39 +905,48 @@ public class SequenceGroup
{
return seqrep != null;
}
+
/**
* visibility of rows or represented rows covered by group
*/
- private boolean hidereps=false;
+ private boolean hidereps = false;
+
/**
- * set visibility of sequences covered by (if no sequence representative is defined)
- * or represented by this group.
+ * 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
+ * @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;
+ 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
@@ -794,26 +955,312 @@ public class SequenceGroup
{
return hidecols;
}
+
/**
- * create a new sequence group from the intersection of this group
- * with an alignment Hashtable of hidden representatives
+ * 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)
+ * @param alignment
+ * (may not be null)
+ * @param map
+ * (may be null)
* @return new group containing sequences common to this group and alignment
*/
- public SequenceGroup intersect(AlignmentI alignment, Hashtable hashtable)
+ public SequenceGroup intersect(AlignmentI alignment,
+ Map map)
{
SequenceGroup sgroup = new SequenceGroup(this);
- Enumeration en = getSequences(hashtable).elements();
- while (en.hasMoreElements())
+ SequenceI[] insect = getSequencesInOrder(alignment);
+ sgroup.sequences = new Vector();
+ for (int s = 0; insect != null && s < insect.length; s++)
{
- SequenceI elem = (SequenceI) en.nextElement();
- if (alignment.getSequences().contains(elem))
+ if (map == null || map.containsKey(insect[s]))
{
- sgroup.addSequence(elem, false);
+ sgroup.sequences.addElement(insect[s]);
}
}
+ // Enumeration en =getSequences(hashtable).elements();
+ // while (en.hasMoreElements())
+ // {
+ // SequenceI elem = (SequenceI) en.nextElement();
+ // if (alignment.getSequences().contains(elem))
+ // {
+ // sgroup.addSequence(elem, false);
+ // }
+ // }
return sgroup;
}
+
+ /**
+ * @return the showUnconserved
+ */
+ public boolean getShowNonconserved()
+ {
+ return showNonconserved;
+ }
+
+ /**
+ * @param showNonconserved
+ * the showUnconserved to set
+ */
+ public void setShowNonconserved(boolean displayNonconserved)
+ {
+ this.showNonconserved = displayNonconserved;
+ }
+
+ AlignmentAnnotation consensus = null, conservation = null;
+
+ /**
+ * flag indicating if consensus histogram should be rendered
+ */
+ private boolean showConsensusHistogram;
+
+ /**
+ * set this alignmentAnnotation object as the one used to render consensus
+ * annotation
+ *
+ * @param aan
+ */
+ public void setConsensus(AlignmentAnnotation aan)
+ {
+ if (consensus == null)
+ {
+ consensus = aan;
+ }
+ }
+
+ /**
+ *
+ * @return automatically calculated consensus row
+ */
+ public AlignmentAnnotation getConsensus()
+ {
+ // TODO get or calculate and get consensus annotation row for this group
+ int aWidth = this.getWidth();
+ // pointer
+ // possibility
+ // here.
+ if (aWidth < 0)
+ {
+ return null;
+ }
+ if (consensus == null)
+ {
+ consensus = new AlignmentAnnotation("", "", new Annotation[1], 0f,
+ 100f, AlignmentAnnotation.BAR_GRAPH);
+ consensus.hasText = true;
+ consensus.autoCalculated = true;
+ consensus.groupRef = this;
+ consensus.label = "Consensus for " + getName();
+ consensus.description = "Percent Identity";
+ }
+ return consensus;
+ }
+
+ /**
+ * set this alignmentAnnotation object as the one used to render consensus
+ * annotation
+ *
+ * @param aan
+ */
+ public void setConservationRow(AlignmentAnnotation aan)
+ {
+ if (conservation == null)
+ {
+ conservation = aan;
+ }
+ }
+
+ /**
+ * get the conservation annotation row for this group
+ *
+ * @return autoCalculated annotation row
+ */
+ public AlignmentAnnotation getConservationRow()
+ {
+ if (conservation == null)
+ {
+ conservation = new AlignmentAnnotation("", "", new Annotation[1], 0f,
+ 11f, AlignmentAnnotation.BAR_GRAPH);
+ }
+
+ conservation.hasText = true;
+ conservation.autoCalculated = true;
+ conservation.groupRef = this;
+ conservation.label = "Conservation for " + getName();
+ conservation.description = "Conservation for group " + getName()
+ + " less than " + consPercGaps + "% gaps";
+ return conservation;
+ }
+
+ /**
+ *
+ * @return true if annotation rows have been instantiated for this group
+ */
+ public boolean hasAnnotationRows()
+ {
+ return consensus != null || conservation != null;
+ }
+
+ public SequenceI getConsensusSeq()
+ {
+ getConsensus();
+ StringBuffer seqs = new StringBuffer();
+ for (int i = 0; i < consensus.annotations.length; i++)
+ {
+ if (consensus.annotations[i] != null)
+ {
+ if (consensus.annotations[i].description.charAt(0) == '[')
+ {
+ seqs.append(consensus.annotations[i].description.charAt(1));
+ }
+ else
+ {
+ seqs.append(consensus.annotations[i].displayCharacter);
+ }
+ }
+ }
+
+ SequenceI sq = new Sequence("Group" + getName() + " Consensus",
+ seqs.toString());
+ sq.setDescription("Percentage Identity Consensus "
+ + ((ignoreGapsInConsensus) ? " without gaps" : ""));
+ return sq;
+ }
+
+ public void setIgnoreGapsConsensus(boolean state)
+ {
+ if (this.ignoreGapsInConsensus != state && consensus != null)
+ {
+ ignoreGapsInConsensus = state;
+ recalcConservation();
+ }
+ ignoreGapsInConsensus = state;
+ }
+
+ public boolean getIgnoreGapsConsensus()
+ {
+ return ignoreGapsInConsensus;
+ }
+
+ /**
+ * @param showSequenceLogo
+ * indicates if a sequence logo is shown for consensus annotation
+ */
+ public void setshowSequenceLogo(boolean showSequenceLogo)
+ {
+ // TODO: decouple calculation from settings update
+ if (this.showSequenceLogo != showSequenceLogo && consensus != null)
+ {
+ this.showSequenceLogo = showSequenceLogo;
+ recalcConservation();
+ }
+ this.showSequenceLogo = showSequenceLogo;
+ }
+
+ /**
+ *
+ * @param showConsHist
+ * flag indicating if the consensus histogram for this group should
+ * be rendered
+ */
+ public void setShowConsensusHistogram(boolean showConsHist)
+ {
+
+ if (showConsensusHistogram != showConsHist && consensus != null)
+ {
+ this.showConsensusHistogram = showConsHist;
+ recalcConservation();
+ }
+ this.showConsensusHistogram = showConsHist;
+ }
+
+ /**
+ * @return the showConsensusHistogram
+ */
+ public boolean isShowConsensusHistogram()
+ {
+ return showConsensusHistogram;
+ }
+
+ /**
+ * set flag indicating if logo should be normalised when rendered
+ *
+ * @param norm
+ */
+ public void setNormaliseSequenceLogo(boolean norm)
+ {
+ normaliseSequenceLogo = norm;
+ }
+
+ public boolean isNormaliseSequenceLogo()
+ {
+ return normaliseSequenceLogo;
+ }
+
+ @Override
+ /**
+ * returns a new array with all annotation involving this group
+ */
+ public AlignmentAnnotation[] getAlignmentAnnotation()
+ {
+ // TODO add in other methods like 'getAlignmentAnnotation(String label),
+ // etc'
+ ArrayList annot = new ArrayList();
+ for (SequenceI seq : (Vector) sequences)
+ {
+ for (AlignmentAnnotation al : seq.getAnnotation())
+ {
+ if (al.groupRef == this)
+ {
+ annot.add(al);
+ }
+ }
+ }
+ if (consensus != null)
+ {
+ annot.add(consensus);
+ }
+ if (conservation != null)
+ {
+ annot.add(conservation);
+ }
+ return annot.toArray(new AlignmentAnnotation[0]);
+ }
+
+ @Override
+ public Iterable findAnnotation(String calcId)
+ {
+ ArrayList aa = new ArrayList();
+ for (AlignmentAnnotation a : getAlignmentAnnotation())
+ {
+ if (a.getCalcId() == calcId)
+ {
+ aa.add(a);
+ }
+ }
+ return aa;
+ }
+
+ public void clear()
+ {
+ sequences.clear();
+ }
+ private AnnotatedCollectionI context;
+ /**
+ * set the alignment or group context for this group
+ * @param context
+ */
+ public void setContext(AnnotatedCollectionI context)
+ {
+ this.context = context;
+ }
+ /* (non-Javadoc)
+ * @see jalview.datamodel.AnnotatedCollectionI#getContext()
+ */
+ @Override
+ public AnnotatedCollectionI getContext()
+ {
+ return context;
+ }
}