X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fdatamodel%2FAlignment.java;h=7c4b3c71c7693f8b717d72f9ce1e880a5013baac;hb=ec669c13867d001e07c9cef157c268afe03be9f3;hp=5a49540a68a562ff589c0d3d0cd4d72f2ec49211;hpb=6357db6c20614a666b7b446aeb3260c5379637eb;p=jalview.git
diff --git a/src/jalview/datamodel/Alignment.java b/src/jalview/datamodel/Alignment.java
index 5a49540..7c4b3c7 100755
--- a/src/jalview/datamodel/Alignment.java
+++ b/src/jalview/datamodel/Alignment.java
@@ -1,25 +1,33 @@
/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1)
+ * Copyright (C) 2014 The Jalview Authors
*
* This file is part of Jalview.
*
* 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.
- *
+ * 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 Jalview. If not, see .
+ * 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 jalview.util.MessageManager;
-import jalview.analysis.*;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
/**
* Data structure to hold and manipulate a multiple sequence alignment
@@ -44,7 +52,7 @@ public class Alignment implements AlignmentI
public static final int PROTEIN = 0;
public static final int NUCLEOTIDE = 1;
-
+
public boolean hasRNAStructure = false;
/** DOCUMENT ME!! */
@@ -111,7 +119,7 @@ public class Alignment implements AlignmentI
*/
public static AlignmentI createAlignment(CigarArray compactAlignment)
{
- throw new Error("Alignment(CigarArray) not yet implemented");
+ throw new Error(MessageManager.getString("error.alignment_cigararray_not_implemented"));
// this(compactAlignment.refCigars);
}
@@ -125,18 +133,23 @@ public class Alignment implements AlignmentI
{
return sequences;
}
+
@Override
public List getSequences(
Map hiddenReps)
{
- // TODO: in jalview 2.8 we don't do anything with hiddenreps - fix design to work on this.
+ // TODO: in jalview 2.8 we don't do anything with hiddenreps - fix design to
+ // work on this.
return sequences;
}
+ @Override
public SequenceI[] getSequencesArray()
{
if (sequences == null)
+ {
return null;
+ }
synchronized (sequences)
{
return sequences.toArray(new SequenceI[sequences.size()]);
@@ -151,6 +164,7 @@ public class Alignment implements AlignmentI
*
* @return DOCUMENT ME!
*/
+ @Override
public SequenceI getSequenceAt(int i)
{
synchronized (sequences)
@@ -168,6 +182,7 @@ public class Alignment implements AlignmentI
*
* @param snew
*/
+ @Override
public void addSequence(SequenceI snew)
{
if (dataset != null)
@@ -198,7 +213,9 @@ public class Alignment implements AlignmentI
}
}
if (hiddenSequences != null)
+ {
hiddenSequences.adjustHeightSequenceAdded();
+ }
}
/**
@@ -206,6 +223,7 @@ public class Alignment implements AlignmentI
*
* @param snew
*/
+ @Override
public void setSequenceAt(int i, SequenceI snew)
{
SequenceI oldseq = getSequenceAt(i);
@@ -221,15 +239,19 @@ public class Alignment implements AlignmentI
*
* @return DOCUMENT ME!
*/
- public Vector getGroups()
+ @Override
+ public List getGroups()
{
return groups;
}
+ @Override
public void finalize()
{
if (getDataset() != null)
+ {
getDataset().removeAlignmentRef();
+ }
dataset = null;
sequences = null;
@@ -256,6 +278,7 @@ public class Alignment implements AlignmentI
* @param s
* DOCUMENT ME!
*/
+ @Override
public void deleteSequence(SequenceI s)
{
deleteSequence(findIndex(s));
@@ -267,6 +290,7 @@ public class Alignment implements AlignmentI
* @param i
* DOCUMENT ME!
*/
+ @Override
public void deleteSequence(int i)
{
if (i > -1 && i < getHeight())
@@ -281,7 +305,7 @@ public class Alignment implements AlignmentI
/*
* (non-Javadoc)
- *
+ *
* @see jalview.datamodel.AlignmentI#findGroup(jalview.datamodel.SequenceI)
*/
@Override
@@ -302,14 +326,13 @@ public class Alignment implements AlignmentI
return null;
}
- /**
- * DOCUMENT ME!
- *
- * @param s
- * DOCUMENT ME!
+ /*
+ * (non-Javadoc)
*
- * @return DOCUMENT ME!
+ * @see
+ * jalview.datamodel.AlignmentI#findAllGroups(jalview.datamodel.SequenceI)
*/
+ @Override
public SequenceGroup[] findAllGroups(SequenceI s)
{
ArrayList temp = new ArrayList();
@@ -338,6 +361,7 @@ public class Alignment implements AlignmentI
}
/** */
+ @Override
public void addGroup(SequenceGroup sg)
{
synchronized (groups)
@@ -362,7 +386,7 @@ public class Alignment implements AlignmentI
return;
}
}
-
+ sg.setContext(this);
groups.add(sg);
}
}
@@ -428,6 +452,7 @@ public class Alignment implements AlignmentI
}
}
+ @Override
public void deleteAllGroups()
{
synchronized (groups)
@@ -436,11 +461,16 @@ public class Alignment implements AlignmentI
{
removeAnnotationForGroup(null);
}
+ for (SequenceGroup sg : groups)
+ {
+ sg.setContext(null);
+ }
groups.clear();
}
}
/** */
+ @Override
public void deleteGroup(SequenceGroup g)
{
synchronized (groups)
@@ -449,11 +479,13 @@ public class Alignment implements AlignmentI
{
removeAnnotationForGroup(g);
groups.remove(g);
+ g.setContext(null);
}
}
}
/** */
+ @Override
public SequenceI findName(String name)
{
return findName(name, false);
@@ -464,6 +496,7 @@ public class Alignment implements AlignmentI
*
* @see jalview.datamodel.AlignmentI#findName(java.lang.String, boolean)
*/
+ @Override
public SequenceI findName(String token, boolean b)
{
return findName(null, token, b);
@@ -475,6 +508,7 @@ public class Alignment implements AlignmentI
* @see jalview.datamodel.AlignmentI#findName(SequenceI, java.lang.String,
* boolean)
*/
+ @Override
public SequenceI findName(SequenceI startAfter, String token, boolean b)
{
@@ -515,6 +549,7 @@ public class Alignment implements AlignmentI
return null;
}
+ @Override
public SequenceI[] findSequenceMatch(String name)
{
Vector matches = new Vector();
@@ -544,6 +579,7 @@ public class Alignment implements AlignmentI
*
* @see jalview.datamodel.AlignmentI#findIndex(jalview.datamodel.SequenceI)
*/
+ @Override
public int findIndex(SequenceI s)
{
int i = 0;
@@ -567,6 +603,7 @@ public class Alignment implements AlignmentI
* @see
* jalview.datamodel.AlignmentI#findIndex(jalview.datamodel.SearchResults)
*/
+ @Override
public int findIndex(SearchResults results)
{
int i = 0;
@@ -587,6 +624,7 @@ public class Alignment implements AlignmentI
*
* @return DOCUMENT ME!
*/
+ @Override
public int getHeight()
{
return sequences.size();
@@ -597,6 +635,7 @@ public class Alignment implements AlignmentI
*
* @return DOCUMENT ME!
*/
+ @Override
public int getWidth()
{
int maxLength = -1;
@@ -618,6 +657,7 @@ public class Alignment implements AlignmentI
* @param gc
* DOCUMENT ME!
*/
+ @Override
public void setGapCharacter(char gc)
{
gapCharacter = gc;
@@ -636,6 +676,7 @@ public class Alignment implements AlignmentI
*
* @return DOCUMENT ME!
*/
+ @Override
public char getGapCharacter()
{
return gapCharacter;
@@ -646,6 +687,7 @@ public class Alignment implements AlignmentI
*
* @see jalview.datamodel.AlignmentI#isAligned()
*/
+ @Override
public boolean isAligned()
{
return isAligned(false);
@@ -656,6 +698,7 @@ public class Alignment implements AlignmentI
*
* @see jalview.datamodel.AlignmentI#isAligned(boolean)
*/
+ @Override
public boolean isAligned(boolean includeHidden)
{
int width = getWidth();
@@ -683,11 +726,13 @@ public class Alignment implements AlignmentI
* @seejalview.datamodel.AlignmentI#deleteAnnotation(jalview.datamodel.
* AlignmentAnnotation)
*/
+ @Override
public boolean deleteAnnotation(AlignmentAnnotation aa)
{
return deleteAnnotation(aa, true);
}
-
+
+ @Override
public boolean deleteAnnotation(AlignmentAnnotation aa, boolean unhook)
{
int aSize = 1;
@@ -715,13 +760,16 @@ public class Alignment implements AlignmentI
continue;
}
if (tIndex < temp.length)
+ {
temp[tIndex++] = annotations[i];
+ }
}
if (swap)
{
annotations = temp;
- if (unhook) {
+ if (unhook)
+ {
unhookAnnotation(aa);
}
}
@@ -752,6 +800,7 @@ public class Alignment implements AlignmentI
* @seejalview.datamodel.AlignmentI#addAnnotation(jalview.datamodel.
* AlignmentAnnotation)
*/
+ @Override
public void addAnnotation(AlignmentAnnotation aa)
{
addAnnotation(aa, -1);
@@ -763,12 +812,14 @@ public class Alignment implements AlignmentI
* @seejalview.datamodel.AlignmentI#addAnnotation(jalview.datamodel.
* AlignmentAnnotation, int)
*/
+ @Override
public void addAnnotation(AlignmentAnnotation aa, int pos)
{
- if(aa.getRNAStruc()!= null){
- hasRNAStructure=true;
+ if (aa.getRNAStruc() != null)
+ {
+ hasRNAStructure = true;
}
-
+
int aSize = 1;
if (annotations != null)
{
@@ -804,6 +855,7 @@ public class Alignment implements AlignmentI
annotations = temp;
}
+ @Override
public void setAnnotationIndex(AlignmentAnnotation aa, int index)
{
if (aa == null || annotations == null || annotations.length - 1 < index)
@@ -845,6 +897,7 @@ public class Alignment implements AlignmentI
return annotations;
}
+ @Override
public void setNucleotide(boolean b)
{
if (b)
@@ -857,6 +910,7 @@ public class Alignment implements AlignmentI
}
}
+ @Override
public boolean isNucleotide()
{
if (type == NUCLEOTIDE)
@@ -868,12 +922,15 @@ public class Alignment implements AlignmentI
return false;
}
}
-
- public boolean hasRNAStructure(){
- //TODO can it happen that structure is removed from alignment?
+
+ @Override
+ public boolean hasRNAStructure()
+ {
+ // TODO can it happen that structure is removed from alignment?
return hasRNAStructure;
}
+ @Override
public void setDataset(Alignment data)
{
if (dataset == null && data == null)
@@ -888,7 +945,7 @@ public class Alignment implements AlignmentI
currentSeq = getSequenceAt(i);
if (currentSeq.getDatasetSequence() != null)
{
- seqs[i] = (Sequence) currentSeq.getDatasetSequence();
+ seqs[i] = currentSeq.getDatasetSequence();
}
else
{
@@ -901,6 +958,27 @@ public class Alignment implements AlignmentI
else if (dataset == null && data != null)
{
dataset = data;
+ for (int i = 0; i < getHeight(); i++)
+ {
+ SequenceI currentSeq = getSequenceAt(i);
+ SequenceI dsq = currentSeq.getDatasetSequence();
+ if (dsq == null)
+ {
+ dsq = currentSeq.createDatasetSequence();
+ dataset.addSequence(dsq);
+ }
+ else
+ {
+ while (dsq.getDatasetSequence() != null)
+ {
+ dsq = dsq.getDatasetSequence();
+ }
+ if (dataset.findIndex(dsq) == -1)
+ {
+ dataset.addSequence(dsq);
+ }
+ }
+ }
}
dataset.addAlignmentRef();
}
@@ -918,11 +996,13 @@ public class Alignment implements AlignmentI
alignmentRefs++;
}
+ @Override
public Alignment getDataset()
{
return dataset;
}
+ @Override
public boolean padGaps()
{
boolean modified = false;
@@ -974,6 +1054,7 @@ public class Alignment implements AlignmentI
* true if alignment padded to right, false to justify to left
* @return true if alignment was changed
*/
+ @Override
public boolean justify(boolean right)
{
boolean modified = false;
@@ -1071,11 +1152,13 @@ public class Alignment implements AlignmentI
return modified;
}
+ @Override
public HiddenSequences getHiddenSequences()
{
return hiddenSequences;
}
+ @Override
public CigarArray getCompactAlignment()
{
synchronized (sequences)
@@ -1096,19 +1179,27 @@ public class Alignment implements AlignmentI
public void setProperty(Object key, Object value)
{
if (alignmentProperties == null)
+ {
alignmentProperties = new Hashtable();
+ }
alignmentProperties.put(key, value);
}
+ @Override
public Object getProperty(Object key)
{
if (alignmentProperties != null)
+ {
return alignmentProperties.get(key);
+ }
else
+ {
return null;
+ }
}
+ @Override
public Hashtable getProperties()
{
return alignmentProperties;
@@ -1123,10 +1214,13 @@ public class Alignment implements AlignmentI
* jalview.datamodel.AlignmentI#addCodonFrame(jalview.datamodel.AlignedCodonFrame
* )
*/
+ @Override
public void addCodonFrame(AlignedCodonFrame codons)
{
if (codons == null)
+ {
return;
+ }
if (codonFrameList == null)
{
codonFrameList = new AlignedCodonFrame[]
@@ -1144,6 +1238,7 @@ public class Alignment implements AlignmentI
*
* @see jalview.datamodel.AlignmentI#getCodonFrame(int)
*/
+ @Override
public AlignedCodonFrame getCodonFrame(int index)
{
return codonFrameList[index];
@@ -1155,18 +1250,25 @@ public class Alignment implements AlignmentI
* @see
* jalview.datamodel.AlignmentI#getCodonFrame(jalview.datamodel.SequenceI)
*/
+ @Override
public AlignedCodonFrame[] getCodonFrame(SequenceI seq)
{
if (seq == null || codonFrameList == null)
+ {
return null;
+ }
Vector cframes = new Vector();
for (int f = 0; f < codonFrameList.length; f++)
{
if (codonFrameList[f].involvesSequence(seq))
+ {
cframes.addElement(codonFrameList[f]);
+ }
}
if (cframes.size() == 0)
+ {
return null;
+ }
AlignedCodonFrame[] cfr = new AlignedCodonFrame[cframes.size()];
cframes.copyInto(cfr);
return cfr;
@@ -1177,6 +1279,7 @@ public class Alignment implements AlignmentI
*
* @see jalview.datamodel.AlignmentI#getCodonFrames()
*/
+ @Override
public AlignedCodonFrame[] getCodonFrames()
{
return codonFrameList;
@@ -1188,10 +1291,13 @@ public class Alignment implements AlignmentI
* @seejalview.datamodel.AlignmentI#removeCodonFrame(jalview.datamodel.
* AlignedCodonFrame)
*/
+ @Override
public boolean removeCodonFrame(AlignedCodonFrame codons)
{
if (codons == null || codonFrameList == null)
+ {
return false;
+ }
boolean removed = false;
int i = 0, iSize = codonFrameList.length;
while (i < iSize)
@@ -1214,6 +1320,7 @@ public class Alignment implements AlignmentI
return removed;
}
+ @Override
public void append(AlignmentI toappend)
{
if (toappend == this)
@@ -1263,7 +1370,7 @@ public class Alignment implements AlignmentI
List sg = toappend.getGroups();
if (sg != null)
{
- for (SequenceGroup _sg:sg)
+ for (SequenceGroup _sg : sg)
{
addGroup(_sg);
}
@@ -1333,23 +1440,28 @@ public class Alignment implements AlignmentI
}
@Override
- public AlignmentAnnotation findOrCreateAnnotation(String name, boolean autoCalc,
- SequenceI seqRef, SequenceGroup groupRef)
+ public AlignmentAnnotation findOrCreateAnnotation(String name,
+ String calcId, boolean autoCalc, SequenceI seqRef,
+ SequenceGroup groupRef)
{
- for (AlignmentAnnotation annot :
- getAlignmentAnnotation())
+ assert (name != null);
+ if (annotations != null)
{
- if (annot.autoCalculated == autoCalc
- && annot.getCalcId().equals(name)
- && annot.sequenceRef == seqRef && annot.groupRef == groupRef)
+ for (AlignmentAnnotation annot : getAlignmentAnnotation())
{
- return annot;
+ if (annot.autoCalculated == autoCalc && (name.equals(annot.label))
+ && (calcId == null || annot.getCalcId().equals(calcId))
+ && annot.sequenceRef == seqRef
+ && annot.groupRef == groupRef)
+ {
+ return annot;
+ }
}
}
AlignmentAnnotation annot = new AlignmentAnnotation(name, name,
new Annotation[1], 0f, 0f, AlignmentAnnotation.BAR_GRAPH);
annot.hasText = false;
- annot.setCalcId(new String(name));
+ annot.setCalcId(new String(calcId));
annot.autoCalculated = autoCalc;
if (seqRef != null)
{
@@ -1364,10 +1476,12 @@ public class Alignment implements AlignmentI
@Override
public Iterable findAnnotation(String calcId)
{
- ArrayList aa=new ArrayList();
- for (AlignmentAnnotation a:getAlignmentAnnotation())
+ ArrayList aa = new ArrayList();
+ for (AlignmentAnnotation a : getAlignmentAnnotation())
{
- if (a.getCalcId()==calcId || (a.getCalcId()!=null && calcId!=null && a.getCalcId().equals(calcId)))
+ if (a.getCalcId() == calcId
+ || (a.getCalcId() != null && calcId != null && a.getCalcId()
+ .equals(calcId)))
{
aa.add(a);
}
@@ -1375,6 +1489,27 @@ public class Alignment implements AlignmentI
return aa;
}
+ /**
+ * Returns an iterable collection of any annotations that match on given
+ * sequence ref, calcId and label (ignoring null values).
+ */
+ @Override
+ public Iterable findAnnotations(SequenceI seq,
+ String calcId, String label)
+ {
+ ArrayList aa = new ArrayList();
+ for (AlignmentAnnotation ann : getAlignmentAnnotation())
+ {
+ if (ann.getCalcId() != null && ann.getCalcId().equals(calcId)
+ && ann.sequenceRef != null && ann.sequenceRef == seq
+ && ann.label != null && ann.label.equals(label))
+ {
+ aa.add(ann);
+ }
+ }
+ return aa;
+ }
+
@Override
public void moveSelectedSequencesByOne(SequenceGroup sg,
Map map, boolean up)
@@ -1426,4 +1561,37 @@ public class Alignment implements AlignmentI
}
}
+ @Override
+ public void validateAnnotation(AlignmentAnnotation alignmentAnnotation)
+ {
+ alignmentAnnotation.validateRangeAndDisplay();
+ if (isNucleotide() && alignmentAnnotation.isValidStruc())
+ {
+ hasRNAStructure = true;
+ }
+ }
+
+ @Override
+ public int getEndRes()
+ {
+ return getWidth() - 1;
+ }
+
+ @Override
+ public int getStartRes()
+ {
+ return 0;
+ }
+
+ /*
+ * In the case of AlignmentI - returns the dataset for the alignment, if set
+ * (non-Javadoc)
+ *
+ * @see jalview.datamodel.AnnotatedCollectionI#getContext()
+ */
+ @Override
+ public AnnotatedCollectionI getContext()
+ {
+ return dataset;
+ }
}