/*
* Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Copyright (C) 2007 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
*/
package jalview.datamodel;
-import jalview.analysis.*;
-
-import jalview.util.*;
-
import java.util.*;
+import jalview.analysis.*;
+
/** Data structure to hold and manipulate a multiple sequence alignment
*/
-public class Alignment implements AlignmentI
+public class Alignment
+ implements AlignmentI
{
- protected Alignment dataset;
- protected Vector sequences;
- protected Vector groups = new Vector();
- protected char gapCharacter = '-';
- protected int type = NUCLEOTIDE;
- public static final int PROTEIN = 0;
- public static final int NUCLEOTIDE = 1;
+ protected Alignment dataset;
+ protected Vector sequences;
+ protected Vector groups = new Vector();
+ protected char gapCharacter = '-';
+ protected int type = NUCLEOTIDE;
+ public static final int PROTEIN = 0;
+ public static final int NUCLEOTIDE = 1;
- /** DOCUMENT ME!! */
- public AlignmentAnnotation[] annotations;
+ /** DOCUMENT ME!! */
+ public AlignmentAnnotation[] annotations;
- HiddenSequences hiddenSequences = new HiddenSequences(this);
+ HiddenSequences hiddenSequences = new HiddenSequences(this);
- private void initAlignment(SequenceI[] seqs) {
- int i=0;
+ public Hashtable alignmentProperties;
- if( jalview.util.Comparison.isNucleotide(seqs))
- type = NUCLEOTIDE;
- else
- type = PROTEIN;
-
- sequences = new Vector();
-
- for (i = 0; i < seqs.length; i++)
- {
- sequences.addElement(seqs[i]);
- }
+ private void initAlignment(SequenceI[] seqs)
+ {
+ int i = 0;
- }
- /** Make an alignment from an array of Sequences.
- *
- * @param sequences
- */
- public Alignment(SequenceI[] seqs)
+ if (jalview.util.Comparison.isNucleotide(seqs))
{
- initAlignment(seqs);
- }
- /**
- * Make a new alignment from an array of SeqCigars
- * @param seqs SeqCigar[]
- */
- public Alignment(SeqCigar[] alseqs) {
- SequenceI[] seqs = SeqCigar.createAlignmentSequences(alseqs, gapCharacter, new ColumnSelection(), null);
- initAlignment(seqs);
+ type = NUCLEOTIDE;
}
- /**
- * Make a new alignment from an CigarArray
- * JBPNote - can only do this when compactAlignment does not contain hidden regions.
- * JBPNote - must also check that compactAlignment resolves to a set of SeqCigars - or construct them appropriately.
- * @param compactAlignment CigarArray
- */
- public static AlignmentI createAlignment(CigarArray compactAlignment) {
- throw new Error("Alignment(CigarArray) not yet implemented");
- // this(compactAlignment.refCigars);
- }
-
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
- public Vector getSequences()
+ else
{
- return sequences;
+ type = PROTEIN;
}
- public SequenceI [] getSequencesArray()
+ sequences = new Vector();
+
+ for (i = 0; i < seqs.length; i++)
{
- SequenceI [] reply = new SequenceI[sequences.size()];
- for(int i=0; i<sequences.size(); i++)
- {
- reply[i] = (SequenceI)sequences.elementAt(i);
- }
- return reply;
+ sequences.addElement(seqs[i]);
}
- /**
- * DOCUMENT ME!
- *
- * @param i DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
- public SequenceI getSequenceAt(int i)
- {
- if (i < sequences.size())
- {
- return (SequenceI) sequences.elementAt(i);
- }
+ }
- return null;
- }
+ /** Make an alignment from an array of Sequences.
+ *
+ * @param sequences
+ */
+ public Alignment(SequenceI[] seqs)
+ {
+ initAlignment(seqs);
+ }
- /** Adds a sequence to the alignment. Recalculates maxLength and size.
- *
- * @param snew
- */
- public void addSequence(SequenceI snew)
- {
- if(dataset!=null)
- {
- if(snew.getDatasetSequence()!=null)
- {
- System.out.println(snew.getName());
- getDataset().addSequence(snew.getDatasetSequence());
- }
- else
- {
- Sequence ds = new Sequence(snew.getName(),
- AlignSeq.extractGaps("-. ",
- snew.getSequence()),
- snew.getStart(),
- snew.getEnd());
-
- snew.setDatasetSequence(ds);
- getDataset().addSequence(ds);
- }
- }
- sequences.addElement(snew);
+ /**
+ * Make a new alignment from an array of SeqCigars
+ * @param seqs SeqCigar[]
+ */
+ public Alignment(SeqCigar[] alseqs)
+ {
+ SequenceI[] seqs = SeqCigar.createAlignmentSequences(alseqs, gapCharacter,
+ new ColumnSelection(), null);
+ initAlignment(seqs);
+ }
- hiddenSequences.adjustHeightSequenceAdded();
- }
+ /**
+ * Make a new alignment from an CigarArray
+ * JBPNote - can only do this when compactAlignment does not contain hidden regions.
+ * JBPNote - must also check that compactAlignment resolves to a set of SeqCigars - or construct them appropriately.
+ * @param compactAlignment CigarArray
+ */
+ public static AlignmentI createAlignment(CigarArray compactAlignment)
+ {
+ throw new Error("Alignment(CigarArray) not yet implemented");
+ // this(compactAlignment.refCigars);
+ }
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ public Vector getSequences()
+ {
+ return sequences;
+ }
- /** Adds a sequence to the alignment. Recalculates maxLength and size.
- *
- * @param snew
- */
- public void setSequenceAt(int i, SequenceI snew)
+ public SequenceI[] getSequencesArray()
+ {
+ SequenceI[] reply = new SequenceI[sequences.size()];
+ for (int i = 0; i < sequences.size(); i++)
{
- SequenceI oldseq = getSequenceAt(i);
- deleteSequence(oldseq);
+ reply[i] = (SequenceI) sequences.elementAt(i);
+ }
+ return reply;
+ }
- sequences.setElementAt(snew, i);
+ /**
+ * DOCUMENT ME!
+ *
+ * @param i DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ public SequenceI getSequenceAt(int i)
+ {
+ if (i < sequences.size())
+ {
+ return (SequenceI) sequences.elementAt(i);
}
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
- public Vector getGroups()
+ return null;
+ }
+
+ /** Adds a sequence to the alignment. Recalculates maxLength and size.
+ *
+ * @param snew
+ */
+ public void addSequence(SequenceI snew)
+ {
+ if (dataset != null)
{
- return groups;
+ // maintain dataset integrity
+ if (snew.getDatasetSequence() != null)
+ {
+ getDataset().addSequence(snew.getDatasetSequence());
+ }
+ else
+ {
+ // derive new sequence
+ SequenceI adding = snew.deriveSequence();
+ getDataset().addSequence(adding.getDatasetSequence());
+ snew = adding;
+ }
}
- /** Takes out columns consisting entirely of gaps (-,.," ")
- */
- public void removeGaps() {
- removeGaps((ShiftList)null);
+ if (sequences==null) {
+ initAlignment(new SequenceI[] { snew });
+ } else {
+ sequences.addElement(snew);
}
- /**
- * remove gaps in alignment - recording any frame shifts in shiftrecord
- * intended to be passed to ColumnSelection.compensateForEdits(shiftrecord)
- * @param shiftrecord
- */
- public void removeGaps(ShiftList shiftrecord) {
- SequenceI[] seqs = getVisibleAndRepresentedSeqs();
- int j, jSize = seqs.length;
+ if (hiddenSequences!=null)
+ hiddenSequences.adjustHeightSequenceAdded();
+ }
- int width = 0;
- for (int i = 0; i < jSize; i++)
- {
- if (seqs[i].getLength() > width)
- {
- width = seqs[i].getLength();
- }
- }
+ /** Adds a sequence to the alignment. Recalculates maxLength and size.
+ *
+ * @param snew
+ */
+ public void setSequenceAt(int i, SequenceI snew)
+ {
+ SequenceI oldseq = getSequenceAt(i);
+ deleteSequence(oldseq);
- int startCol = -1, endCol = -1;
- boolean delete = true;
- for (int i = 0; i < width; i++)
- {
- delete = true;
-
- for (j = 0; j < jSize; j++)
- {
- if (seqs[j].getLength() > i)
- {
- if (!jalview.util.Comparison.isGap(seqs[j].getCharAt(i)))
- {
- if(delete)
- endCol = i;
-
- delete = false;
- break;
- }
- }
- }
-
- if(delete && startCol==-1)
- {
- startCol = i;
- }
-
-
- if (!delete && startCol > -1)
- {
- deleteColumns(seqs, startCol, endCol);
- if (shiftrecord!=null) {
- shiftrecord.addShift(startCol, 1+endCol-startCol);
- }
- width -= (endCol - startCol);
- i -= (endCol - startCol);
- startCol = -1;
- endCol = -1;
- }
- }
+ sequences.setElementAt(snew, i);
+ }
- if (delete && startCol > -1)
- {
- deleteColumns(seqs, startCol, endCol);
- if (shiftrecord!=null) {
- shiftrecord.addShift(startCol, 1+endCol-startCol);
- }
- }
- }
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ public Vector getGroups()
+ {
+ return groups;
+ }
- /** Removes a range of columns (start to end inclusive).
- *
- * @param seqs Sequences to remove columns from
- * @param start Start column in the alignment
- * @param end End column in the alignment
- */
- public void deleteColumns(SequenceI [] seqs, int start, int end)
- {
- for(int i=0; i<seqs.length; i++)
- seqs[i].deleteChars(start, end);
- }
+ public void finalize()
+ {
+ if(getDataset()!=null)
+ getDataset().finalize();
+
+ dataset = null;
+ sequences = null;
+ groups = null;
+ annotations = null;
+ hiddenSequences = null;
+ }
- /**
- * DOCUMENT ME!
- *
- * @param i DOCUMENT ME!
- */
- public void trimLeft(int i)
+ /**
+ * DOCUMENT ME!
+ *
+ * @param s DOCUMENT ME!
+ */
+ public void deleteSequence(SequenceI s)
+ {
+ deleteSequence(findIndex(s));
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param i DOCUMENT ME!
+ */
+ public void deleteSequence(int i)
+ {
+ if (i > -1 && i < getHeight())
{
- SequenceI[] seqs = getVisibleAndRepresentedSeqs();
- int j, jSize = seqs.length;
- for (j = 0; j < jSize; j++)
- {
- int newstart = seqs[j].findPosition(i);
-
- if(i>seqs[j].getLength())
- {
- sequences.removeElement(seqs[j]);
- j--;
- jSize--;
- }
- else
- {
- seqs[j].setStart(newstart);
- seqs[j].setSequence(seqs[j].getSequence().substring(i));
- }
- }
+ sequences.removeElementAt(i);
+ hiddenSequences.adjustHeightSequenceDeleted(i);
}
+ }
- /**
- * DOCUMENT ME!
- *
- * @param i DOCUMENT ME!
- */
- public void trimRight(int i)
+ /** */
+ public SequenceGroup findGroup(SequenceI s)
+ {
+ for (int i = 0; i < this.groups.size(); i++)
{
- SequenceI[] seqs = getVisibleAndRepresentedSeqs();
- int j, jSize = seqs.length;
- for (j = 0; j < jSize; j++)
- {
- int newend = seqs[j].findPosition(i);
+ SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
- seqs[j].setEnd(newend);
- if(seqs[j].getLength()>i)
- seqs[j].setSequence(seqs[j].getSequence().substring(0, i + 1));
- }
+ if (sg.getSequences(null).contains(s))
+ {
+ return sg;
+ }
}
- /**
- * DOCUMENT ME!
- *
- * @param s DOCUMENT ME!
- */
- public void deleteSequence(SequenceI s)
- {
- deleteSequence(findIndex(s));
- }
+ return null;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param s DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ public SequenceGroup[] findAllGroups(SequenceI s)
+ {
+ Vector temp = new Vector();
- /**
- * DOCUMENT ME!
- *
- * @param i DOCUMENT ME!
- */
- public void deleteSequence(int i)
+ int gSize = groups.size();
+ for (int i = 0; i < gSize; i++)
{
- sequences.removeElementAt(i);
- hiddenSequences.adjustHeightSequenceDeleted(i);
+ SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
+ if (sg == null || sg.getSequences(null) == null)
+ {
+ this.deleteGroup(sg);
+ gSize--;
+ continue;
+ }
+
+ if (sg.getSequences(null).contains(s))
+ {
+ temp.addElement(sg);
+ }
}
+ SequenceGroup[] ret = new SequenceGroup[temp.size()];
- /** */
- public SequenceGroup findGroup(SequenceI s)
+ for (int i = 0; i < temp.size(); i++)
{
- for (int i = 0; i < this.groups.size(); i++)
- {
- SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
-
- if (sg.getSequences(false).contains(s))
- {
- return sg;
- }
- }
-
- return null;
+ ret[i] = (SequenceGroup) temp.elementAt(i);
}
- /**
- * DOCUMENT ME!
- *
- * @param s DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
- public SequenceGroup[] findAllGroups(SequenceI s)
- {
- Vector temp = new Vector();
+ return ret;
+ }
- int gSize = groups.size();
- for (int i = 0; i < gSize; i++)
+ /** */
+ public void addGroup(SequenceGroup sg)
+ {
+ if (!groups.contains(sg))
+ {
+ if (hiddenSequences.getSize() > 0)
+ {
+ int i, iSize = sg.getSize();
+ for (i = 0; i < iSize; i++)
{
- SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
- if(sg==null || sg.getSequences(false)==null)
- {
- this.deleteGroup(sg);
- gSize--;
- continue;
- }
-
- if (sg.getSequences(false).contains(s))
- {
- temp.addElement(sg);
- }
+ if (!sequences.contains(sg.getSequenceAt(i)))
+ {
+ sg.deleteSequence(sg.getSequenceAt(i), false);
+ iSize--;
+ i--;
+ }
}
- SequenceGroup[] ret = new SequenceGroup[temp.size()];
-
- for (int i = 0; i < temp.size(); i++)
+ if (sg.getSize() < 1)
{
- ret[i] = (SequenceGroup) temp.elementAt(i);
+ return;
}
+ }
- return ret;
+ groups.addElement(sg);
}
+ }
+ /**
+ * DOCUMENT ME!
+ */
+ public void deleteAllGroups()
+ {
+ groups.removeAllElements();
+ }
-
- /** */
- public void addGroup(SequenceGroup sg)
+ /** */
+ public void deleteGroup(SequenceGroup g)
+ {
+ if (groups.contains(g))
{
- if (!groups.contains(sg))
- {
- groups.addElement(sg);
- }
+ groups.removeElement(g);
}
+ }
- /**
- * DOCUMENT ME!
- */
- public void deleteAllGroups()
- {
- groups.removeAllElements();
+ /** */
+ public SequenceI findName(String name)
+ {
+ int i = 0;
- int i = 0;
+ while (i < sequences.size())
+ {
+ if (getSequenceAt(i).getName().equals(name))
+ {
+ return getSequenceAt(i);
+ }
- while (i < sequences.size())
- {
- SequenceI s = getSequenceAt(i);
- s.setColor(java.awt.Color.white);
- i++;
- }
+ i++;
}
- /** */
- public void deleteGroup(SequenceGroup g)
+ return null;
+ }
+
+ public SequenceI[] findSequenceMatch(String name)
+ {
+ Vector matches = new Vector();
+ int i = 0;
+
+ while (i < sequences.size())
{
- if (groups.contains(g))
- {
- groups.removeElement(g);
- }
+ if (getSequenceAt(i).getName().equals(name))
+ {
+ matches.addElement(getSequenceAt(i));
+ }
+ i++;
}
- /** */
- public SequenceI findName(String name)
+ SequenceI[] result = new SequenceI[matches.size()];
+ for (i = 0; i < result.length; i++)
{
- int i = 0;
+ result[i] = (SequenceI) matches.elementAt(i);
+ }
- while (i < sequences.size())
- {
- if (getSequenceAt(i).getName().equals(name))
- {
- return getSequenceAt(i);
- }
+ return result;
- i++;
- }
+ }
- return null;
- }
+ /** */
+ public int findIndex(SequenceI s)
+ {
+ int i = 0;
- public SequenceI [] findSequenceMatch(String name)
+ while (i < sequences.size())
{
- Vector matches = new Vector();
- int i = 0;
-
- while (i < sequences.size())
+ if (s == getSequenceAt(i))
{
- if (getSequenceAt(i).getName().equals(name))
- {
- matches.addElement(getSequenceAt(i));
- }
- i++;
+ return i;
}
- SequenceI [] result = new SequenceI[matches.size()];
- for(i=0; i<result.length; i++)
- result[i] = (SequenceI)matches.elementAt(i);
-
- return result;
-
+ i++;
}
+ return -1;
+ }
- /** */
- public int findIndex(SequenceI s)
- {
- int i = 0;
-
- while (i < sequences.size())
- {
- if (s == getSequenceAt(i))
- {
- return i;
- }
-
- i++;
- }
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ public int getHeight()
+ {
+ return sequences.size();
+ }
- return -1;
- }
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ public int getWidth()
+ {
+ int maxLength = -1;
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
- public int getHeight()
+ for (int i = 0; i < sequences.size(); i++)
{
- return sequences.size();
+ if (getSequenceAt(i).getLength() > maxLength)
+ {
+ maxLength = getSequenceAt(i).getLength();
+ }
}
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
- public int getWidth()
- {
- int maxLength = -1;
-
- for (int i = 0; i < sequences.size(); i++)
- {
- if (getSequenceAt(i).getLength() > maxLength)
- {
- maxLength = getSequenceAt(i).getLength();
- }
- }
+ return maxLength;
+ }
- return maxLength;
- }
+ /**
+ * DOCUMENT ME!
+ *
+ * @param gc DOCUMENT ME!
+ */
+ public void setGapCharacter(char gc)
+ {
+ gapCharacter = gc;
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
- public int getMaxIdLength()
+ for (int i = 0; i < sequences.size(); i++)
{
- int max = 0;
- int i = 0;
-
- while (i < sequences.size())
- {
- SequenceI seq = getSequenceAt(i);
- String tmp = seq.getName() + "/" + seq.getStart() + "-" +
- seq.getEnd();
-
- if (tmp.length() > max)
- {
- max = tmp.length();
- }
-
- i++;
- }
-
- return max;
+ Sequence seq = (Sequence) sequences.elementAt(i);
+ seq.setSequence(seq.getSequenceAsString()
+ .replace('.', gc)
+ .replace('-', gc)
+ .replace(' ', gc)
+ );
}
+ }
- /**
- * DOCUMENT ME!
- *
- * @param gc DOCUMENT ME!
- */
- public void setGapCharacter(char gc)
- {
- gapCharacter = gc;
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ public char getGapCharacter()
+ {
+ return gapCharacter;
+ }
- for (int i = 0; i < sequences.size(); i++)
- {
- Sequence seq = (Sequence) sequences.elementAt(i);
- seq.setSequence( seq.getSequence().replace('.', gc) );
- seq.setSequence( seq.getSequence().replace('-', gc) );
- seq.setSequence( seq.getSequence().replace(' ', gc) );
- }
- }
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ public boolean isAligned()
+ {
+ int width = getWidth();
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
- public char getGapCharacter()
+ for (int i = 0; i < sequences.size(); i++)
{
- return gapCharacter;
+ if (getSequenceAt(i).getLength() != width)
+ {
+ return false;
+ }
}
+ return true;
+ }
+ /* (non-Javadoc)
+ * @see jalview.datamodel.AlignmentI#deleteAnnotation(jalview.datamodel.AlignmentAnnotation)
+ */
+ public boolean deleteAnnotation(AlignmentAnnotation aa)
+ {
+ int aSize = 1;
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
- public boolean isAligned()
+ if (annotations != null)
{
- int width = getWidth();
-
- for (int i = 0; i < sequences.size(); i++)
- {
- if (getSequenceAt(i).getLength() != width)
- {
- return false;
- }
- }
-
- return true;
+ aSize = annotations.length;
}
- /**
- * DOCUMENT ME!
- *
- * @param aa DOCUMENT ME!
- */
- public void deleteAnnotation(AlignmentAnnotation aa)
+ if (aSize < 1)
{
- int aSize = 1;
-
- if (annotations != null)
- {
- aSize = annotations.length;
- }
-
- AlignmentAnnotation[] temp = new AlignmentAnnotation[aSize - 1];
-
- int tIndex = 0;
-
- for (int i = 0; i < aSize; i++)
- {
- if (annotations[i] == aa)
- {
- continue;
- }
-
- temp[tIndex] = annotations[i];
- tIndex++;
- }
-
- annotations = temp;
+ return false;
}
+ AlignmentAnnotation[] temp = new AlignmentAnnotation[aSize - 1];
+
+ boolean swap=false;
+ int tIndex = 0;
- public void adjustSequenceAnnotations()
+ for (int i = 0; tIndex<temp.length && i < aSize; i++)
{
- if(annotations!=null)
+ if (annotations[i] == aa)
{
- for (int a = 0; a < annotations.length; a++)
- {
- if (annotations[a].sequenceRef != null)
- {
- annotations[a].adjustForAlignment();
- }
- }
+ swap=true;
+ continue;
}
+
+ temp[tIndex] = annotations[i];
+ tIndex++;
}
- /**
- * DOCUMENT ME!
- *
- * @param aa DOCUMENT ME!
- */
- public void addAnnotation(AlignmentAnnotation aa)
+ if (swap)
{
- int aSize = 1;
- if (annotations != null)
- {
- aSize = annotations.length + 1;
- }
+ annotations = temp;
+ if(aa.sequenceRef!=null)
+ aa.sequenceRef.removeAlignmentAnnotation(aa);
+ }
+ return swap;
+ }
- AlignmentAnnotation[] temp = new AlignmentAnnotation[aSize];
+ /**
+ * DOCUMENT ME!
+ *
+ * @param aa DOCUMENT ME!
+ */
+ public void addAnnotation(AlignmentAnnotation aa)
+ {
+ int aSize = 1;
+ if (annotations != null)
+ {
+ aSize = annotations.length + 1;
+ }
- temp[aSize-1] = aa;
+ AlignmentAnnotation[] temp = new AlignmentAnnotation[aSize];
- int i = 0;
+ temp[aSize - 1] = aa;
- if (aSize > 1)
- {
- for (i = 0; i < (aSize-1); i++)
- {
- temp[i] = annotations[i];
- }
- }
+ int i = 0;
- annotations = temp;
+ if (aSize > 1)
+ {
+ for (i = 0; i < (aSize - 1); i++)
+ {
+ temp[i] = annotations[i];
+ }
}
- public void setAnnotationIndex(AlignmentAnnotation aa, int index)
+ annotations = temp;
+ }
+
+ public void setAnnotationIndex(AlignmentAnnotation aa, int index)
+ {
+ if (aa == null || annotations == null || annotations.length - 1 < index)
{
- if(aa==null || annotations==null || annotations.length-1<index)
- return;
+ return;
+ }
- int aSize = annotations.length;
- AlignmentAnnotation[] temp = new AlignmentAnnotation[aSize];
+ int aSize = annotations.length;
+ AlignmentAnnotation[] temp = new AlignmentAnnotation[aSize];
- temp[index] = aa;
+ temp[index] = aa;
- for (int i = 0; i < aSize; i++)
+ for (int i = 0; i < aSize; i++)
+ {
+ if (i == index)
{
- if(i==index)
- continue;
-
- if(i<index)
- temp[i] = annotations[i];
- else
- temp[i] = annotations[i-1];
+ continue;
}
- annotations = temp;
+ if (i < index)
+ {
+ temp[i] = annotations[i];
+ }
+ else
+ {
+ temp[i] = annotations[i - 1];
+ }
}
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
- public AlignmentAnnotation[] getAlignmentAnnotation()
+ annotations = temp;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ public AlignmentAnnotation[] getAlignmentAnnotation()
+ {
+ return annotations;
+ }
+
+ public void setNucleotide(boolean b)
+ {
+ if (b)
{
- return annotations;
+ type = NUCLEOTIDE;
}
-
- public void setNucleotide(boolean b)
+ else
{
- if(b)
- type = NUCLEOTIDE;
- else
- type = PROTEIN;
+ type = PROTEIN;
}
+ }
- public boolean isNucleotide()
+ public boolean isNucleotide()
+ {
+ if (type == NUCLEOTIDE)
{
- if(type==NUCLEOTIDE)
- return true;
- else
- return false;
+ return true;
}
-
- public void setDataset(Alignment data)
+ else
{
- if(dataset==null && data==null)
+ return false;
+ }
+ }
+
+ public void setDataset(Alignment data)
+ {
+ if (dataset == null && data == null)
+ {
+ // Create a new dataset for this alignment.
+ // Can only be done once, if dataset is not null
+ // This will not be performed
+ Sequence[] seqs = new Sequence[getHeight()];
+ SequenceI currentSeq;
+ for (int i = 0; i < getHeight(); i++)
{
- // Create a new dataset for this alignment.
- // Can only be done once, if dataset is not null
- // This will not be performed
- Sequence[] seqs = new Sequence[getHeight()];
- for (int i = 0; i < getHeight(); i++)
+ currentSeq = getSequenceAt(i);
+ if (currentSeq.getDatasetSequence() != null)
{
- if(getSequenceAt(i).getDatasetSequence()!=null)
- {
- seqs[i] = (Sequence)getSequenceAt(i).getDatasetSequence();
- }
- else
- {
- seqs[i] = new Sequence(getSequenceAt(i).getName(),
- AlignSeq.extractGaps(
- jalview.util.Comparison.GapChars,
- getSequenceAt(i).getSequence()
- ),
- getSequenceAt(i).getStart(),
- getSequenceAt(i).getEnd());
- seqs[i].sequenceFeatures = getSequenceAt(i).getSequenceFeatures();
- getSequenceAt(i).setSequenceFeatures(null);
- getSequenceAt(i).setDatasetSequence(seqs[i]);
- }
+ seqs[i] = (Sequence) currentSeq.getDatasetSequence();
+ }
+ else
+ {
+ seqs[i] = new Sequence(currentSeq.getName(),
+ AlignSeq.extractGaps(
+ jalview.util.Comparison.GapChars,
+ currentSeq.getSequenceAsString()
+ ),
+ currentSeq.getStart(),
+ currentSeq.getEnd());
+ seqs[i].sequenceFeatures = currentSeq.getSequenceFeatures();
+ seqs[i].setDescription(currentSeq.getDescription());
+ getSequenceAt(i).setSequenceFeatures(null);
+ getSequenceAt(i).setDatasetSequence(seqs[i]);
}
-
- dataset = new Alignment(seqs);
- }
- else if(dataset==null && data!=null)
- {
- dataset = data;
}
- }
- public Alignment getDataset()
+ dataset = new Alignment(seqs);
+ }
+ else if (dataset == null && data != null)
{
- return dataset;
+ dataset = data;
}
+ }
- public boolean padGaps() {
- boolean modified=false;
-
- //Remove excess gaps from the end of alignment
- int maxLength = -1;
+ public Alignment getDataset()
+ {
+ return dataset;
+ }
- SequenceI current;
- for (int i = 0; i < sequences.size(); i++)
- {
- current = getSequenceAt(i);
- for (int j = current.getLength(); j > maxLength; j--)
- {
- if (j > maxLength && !jalview.util.Comparison.isGap(
- current.getCharAt(j)))
- {
- maxLength = j;
- break;
- }
- }
- }
+ public boolean padGaps()
+ {
+ boolean modified = false;
- maxLength++;
+ //Remove excess gaps from the end of alignment
+ int maxLength = -1;
- for (int i = 0; i < sequences.size();
- i++)
+ SequenceI current;
+ for (int i = 0; i < sequences.size(); i++)
+ {
+ current = getSequenceAt(i);
+ for (int j = current.getLength(); j > maxLength; j--)
{
- current = getSequenceAt(i);
-
- if (current.getLength() < maxLength)
+ if (j > maxLength && !jalview.util.Comparison.isGap(
+ current.getCharAt(j)))
{
- current.insertCharAt(maxLength - 1, gapCharacter);
- modified=true;
- }
- else if(current.getLength() > maxLength)
- {
- current.deleteChars(maxLength, current.getLength());
+ maxLength = j;
+ break;
}
}
- return modified;
}
- public HiddenSequences getHiddenSequences()
- {
- return hiddenSequences;
- }
- SequenceI [] getVisibleAndRepresentedSeqs()
+ maxLength++;
+
+ int cLength;
+ for (int i = 0; i < sequences.size();
+ i++)
{
- if(hiddenSequences==null || hiddenSequences.getSize()<1)
- return getSequencesArray();
+ current = getSequenceAt(i);
+ cLength = current.getLength();
- Vector seqs = new Vector();
- SequenceI seq;
- SequenceGroup hidden;
- for (int i = 0; i < sequences.size(); i++)
+ if (cLength < maxLength)
{
- seq = (SequenceI) sequences.elementAt(i);
- seqs.addElement(seq);
- hidden = seq.getHiddenSequences();
- if(hidden!=null)
- {
- for(int j=0; j<hidden.getSize(false); j++)
- {
- seqs.addElement(hidden.getSequenceAt(j));
- }
- }
+ current.insertCharAt(cLength,
+ maxLength - cLength, gapCharacter);
+ modified = true;
+ }
+ else if (current.getLength() > maxLength)
+ {
+ current.deleteChars(maxLength, current.getLength());
}
- SequenceI [] result = new SequenceI[seqs.size()];
- for(int i=0; i<seqs.size(); i++)
- result[i] = (SequenceI)seqs.elementAt(i);
-
- return result;
-
}
+ return modified;
+ }
+
+ public HiddenSequences getHiddenSequences()
+ {
+ return hiddenSequences;
+ }
public CigarArray getCompactAlignment()
{
SeqCigar alseqs[] = new SeqCigar[sequences.size()];
- for (int i=0; i<sequences.size(); i++) {
- alseqs[i] = new SeqCigar((SequenceI) sequences.elementAt(i));
+ for (int i = 0; i < sequences.size(); i++)
+ {
+ alseqs[i] = new SeqCigar( (SequenceI) sequences.elementAt(i));
}
CigarArray cal = new CigarArray(alseqs);
cal.addOperation(CigarArray.M, getWidth());
return cal;
}
+ public void setProperty(Object key, Object value)
+ {
+ if(alignmentProperties==null)
+ alignmentProperties = new Hashtable();
+
+ alignmentProperties.put(key,value);
+ }
+
+ public Object getProperty(Object key)
+ {
+ if(alignmentProperties!=null)
+ return alignmentProperties.get(key);
+ else
+ return null;
+ }
+
+ public Hashtable getProperties()
+ {
+ return alignmentProperties;
+ }
+
}