X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FColumnSelection.java;h=d0fc9277f5c5bbda923b5b7f0acc4d695c5f11de;hb=797df64fa2a0a30773d0f48f5494d4155e5a8be3;hp=6bba5d202ed6cdfc6b1cba45896346ab50ccb75c;hpb=2de8acfae59aced665e4c37ad0f7dcc2ed68818e;p=jalview.git
diff --git a/src/jalview/datamodel/ColumnSelection.java b/src/jalview/datamodel/ColumnSelection.java
index 6bba5d2..d0fc927 100644
--- a/src/jalview/datamodel/ColumnSelection.java
+++ b/src/jalview/datamodel/ColumnSelection.java
@@ -1,20 +1,19 @@
/*
- * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
- * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * 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
*
- * 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.
*
- * 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
+ * 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 .
*/
package jalview.datamodel;
@@ -36,7 +35,7 @@ public class ColumnSelection
* Add a column to the selection
*
* @param col
- * index of column
+ * index of column
*/
public void addElement(int col)
{
@@ -59,7 +58,7 @@ public class ColumnSelection
* removes col from selection
*
* @param col
- * index of column to be removed
+ * index of column to be removed
*/
public void removeElement(int col)
{
@@ -75,9 +74,9 @@ public class ColumnSelection
* removes a range of columns from the selection
*
* @param start
- * int - first column in range to be removed
+ * int - first column in range to be removed
* @param end
- * int - last col
+ * int - last col
*/
public void removeElements(int start, int end)
{
@@ -104,7 +103,7 @@ public class ColumnSelection
/**
*
* @param col
- * index to search for in column selection
+ * index to search for in column selection
*
* @return true if Integer(col) is in selection.
*/
@@ -117,7 +116,7 @@ public class ColumnSelection
* Column number at position i in selection
*
* @param i
- * index into selected columns
+ * index into selected columns
*
* @return column number in alignment
*/
@@ -180,9 +179,9 @@ public class ColumnSelection
* propagate shift in alignment columns to column selection
*
* @param start
- * beginning of edit
+ * beginning of edit
* @param left
- * shift in edit (+ve for removal, or -ve for inserts)
+ * shift in edit (+ve for removal, or -ve for inserts)
*/
public Vector compensateForEdit(int start, int change)
{
@@ -238,9 +237,9 @@ public class ColumnSelection
* compensateForEdit - allowing for edits within hidden regions
*
* @param start
- * beginning of edit
+ * beginning of edit
* @param left
- * shift in edit (+ve for removal, or -ve for inserts)
+ * shift in edit (+ve for removal, or -ve for inserts)
*/
private void compensateForDelEdits(int start, int change)
{
@@ -403,7 +402,7 @@ public class ColumnSelection
}
}
return pruned; // true if any interval was removed or modified by
- // operations.
+ // operations.
}
private boolean pruneColumnList(Vector deletion, Vector list)
@@ -476,7 +475,7 @@ public class ColumnSelection
* given index.
*
* @param end
- * int
+ * int
* @return Vector
*/
public Vector getHiddenColumns()
@@ -488,7 +487,7 @@ public class ColumnSelection
* Return absolute column index for a visible column index
*
* @param column
- * int column index in alignment view
+ * int column index in alignment view
* @return alignment column index for column
*/
public int adjustForHiddenColumns(int column)
@@ -509,11 +508,12 @@ public class ColumnSelection
}
/**
- * Use this method to find out where a visible column is in the alignment when
- * hidden columns exist
+ * Use this method to find out where a column will appear in the visible
+ * alignment when hidden columns exist. If the column is not visible, then the
+ * left-most visible column will always be returned.
*
* @param hiddenColumn
- * int
+ * int
* @return int
*/
public int findColumnPosition(int hiddenColumn)
@@ -522,21 +522,21 @@ public class ColumnSelection
if (hiddenColumns != null)
{
int index = 0;
- int gaps = 0;
+ int[] region;
do
{
- int[] region = (int[]) hiddenColumns.elementAt(index);
+ region = (int[]) hiddenColumns.elementAt(index++);
if (hiddenColumn > region[1])
{
result -= region[1] + 1 - region[0];
}
- index++;
- } while (index < hiddenColumns.size());
-
- result -= gaps;
+ } while ((hiddenColumn > region[1]) && (index < hiddenColumns.size()));
+ if (hiddenColumn > region[0] && hiddenColumn < region[1])
+ {
+ return region[0] + hiddenColumn - result;
+ }
}
-
- return result;
+ return result; // return the shifted position after removing hidden columns.
}
/**
@@ -573,7 +573,7 @@ public class ColumnSelection
* hidden columns. In otherwords, the next hidden column.
*
* @param index
- * int
+ * int
*/
public int getHiddenBoundaryRight(int alPos)
{
@@ -601,7 +601,7 @@ public class ColumnSelection
* hidden columns. In otherwords, the previous hidden column.
*
* @param index
- * int
+ * int
*/
public int getHiddenBoundaryLeft(int alPos)
{
@@ -679,7 +679,7 @@ public class ColumnSelection
* specified
*
* @param res
- * int
+ * int
*/
public void hideColumns(int col)
{
@@ -867,10 +867,11 @@ public class ColumnSelection
* return all visible segments between the given start and end boundaries
*
* @param start
- * (first column inclusive from 0)
+ * (first column inclusive from 0)
* @param end
- * (last column - not inclusive)
- * @return int[] {i_start, i_end, ..} where intervals lie in start<=i_start<=i_end blockStart)
{
annels.addElement(els = new Annotation[end - blockStart + 1]);
- if ((els.length+blockStart)<= alignmentAnnotation.annotations.length)
+ if ((els.length + blockStart) <= alignmentAnnotation.annotations.length)
{
// copy just the visible segment of the annotation row
System.arraycopy(alignmentAnnotation.annotations, blockStart,
@@ -1008,7 +1009,8 @@ public class ColumnSelection
{
// copy to the end of the annotation row
System.arraycopy(alignmentAnnotation.annotations, blockStart,
- els, 0, (alignmentAnnotation.annotations.length - blockStart));
+ els, 0,
+ (alignmentAnnotation.annotations.length - blockStart));
}
w += els.length;
}
@@ -1056,4 +1058,188 @@ public class ColumnSelection
}
}
}
+
+ /**
+ * add in any unselected columns from the given column selection, excluding
+ * any that are hidden.
+ *
+ * @param colsel
+ */
+ public void addElementsFrom(ColumnSelection colsel)
+ {
+ if (colsel != null && colsel.size() > 0)
+ {
+ Enumeration e = colsel.getSelected().elements();
+ while (e.hasMoreElements())
+ {
+ Object eo = e.nextElement();
+ if (hiddenColumns != null && isVisible(((Integer) eo).intValue()))
+ {
+ if (!selected.contains(eo))
+ {
+ selected.addElement(eo);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * set the selected columns the given column selection, excluding any columns
+ * that are hidden.
+ *
+ * @param colsel
+ */
+ public void setElementsFrom(ColumnSelection colsel)
+ {
+ selected = new Vector();
+ if (colsel.selected != null && colsel.selected.size() > 0)
+ {
+ if (hiddenColumns != null && hiddenColumns.size() > 0)
+ {
+ // only select visible columns in this columns selection
+ selected = new Vector();
+ addElementsFrom(colsel);
+ }
+ else
+ {
+ // add everything regardless
+ Enumeration en = colsel.selected.elements();
+ while (en.hasMoreElements())
+ {
+ selected.addElement(en.nextElement());
+ }
+ }
+ }
+ }
+
+ /**
+ * Add gaps into the sequences aligned to profileseq under the given
+ * AlignmentView
+ *
+ * @param profileseq
+ * @param al - alignment to have gaps inserted into it
+ * @param input - alignment view where sequence corresponding to profileseq is first entry
+ * @return new Column selection for new alignment view, with insertions into profileseq marked as hidden.
+ */
+ public static ColumnSelection propagateInsertions(SequenceI profileseq,
+ Alignment al, AlignmentView input)
+ {
+ int profsqpos=0;
+
+// return propagateInsertions(profileseq, al, )
+ char gc = al.getGapCharacter();
+ Object[] alandcolsel = input.getAlignmentAndColumnSelection(gc);
+ ColumnSelection nview = (ColumnSelection) alandcolsel[1];
+ SequenceI origseq = ((SequenceI[]) alandcolsel[0])[profsqpos];
+ nview.propagateInsertions(profileseq,
+ al, origseq);
+ return nview;
+ }
+ /**
+ *
+ * @param profileseq - sequence in al which corresponds to origseq
+ * @param al - alignment which is to have gaps inserted into it
+ * @param origseq - sequence corresponding to profileseq which defines gap map for modifying al
+ */
+ public void propagateInsertions(SequenceI profileseq, AlignmentI al, SequenceI origseq)
+ {
+ char gc = al.getGapCharacter();
+ // recover mapping between sequence's non-gap positions and positions
+ // mapping to view.
+ pruneDeletions(ShiftList
+ .parseMap(origseq
+ .gapMap()));
+ int[] viscontigs = getVisibleContigs(0, profileseq.getLength());
+ int spos = 0;
+ int offset = 0;
+ // input.pruneDeletions(ShiftList.parseMap(((SequenceI[])
+ // alandcolsel[0])[0].gapMap()))
+ // add profile to visible contigs
+ for (int v = 0; v < viscontigs.length; v += 2)
+ {
+ if (viscontigs[v] > spos)
+ {
+ StringBuffer sb = new StringBuffer();
+ for (int s = 0, ns = viscontigs[v] - spos; s < ns; s++)
+ {
+ sb.append(gc);
+ }
+ for (int s = 0, ns = al.getHeight(); s < ns; s++)
+ {
+ SequenceI sqobj = al.getSequenceAt(s);
+ if (sqobj != profileseq)
+ {
+ String sq = al.getSequenceAt(s).getSequenceAsString();
+ if (sq.length() <= spos + offset)
+ {
+ // pad sequence
+ int diff = spos + offset - sq.length() - 1;
+ if (diff > 0)
+ {
+ // pad gaps
+ sq = sq + sb;
+ while ((diff = spos + offset - sq.length() - 1) > 0)
+ {
+ //sq = sq
+ // + ((diff >= sb.length()) ? sb.toString() : sb
+ // .substring(0, diff));
+ if (diff>=sb.length()) {
+ sq+=sb.toString();
+ } else {
+ char[] buf = new char[diff];
+ sb.getChars(0, diff, buf, 0);
+ sq+=buf.toString();
+ }
+ }
+ }
+ sq += sb.toString();
+ }
+ else
+ {
+ al.getSequenceAt(s).setSequence(
+ sq.substring(0, spos + offset) + sb.toString()
+ + sq.substring(spos + offset));
+ }
+ }
+ }
+ // offset+=sb.length();
+ }
+ spos = viscontigs[v + 1] + 1;
+ }
+ if ((offset + spos) < profileseq.getLength())
+ {
+ // pad the final region with gaps.
+ StringBuffer sb = new StringBuffer();
+ for (int s = 0, ns = profileseq.getLength() - spos - offset; s < ns; s++)
+ {
+ sb.append(gc);
+ }
+ for (int s = 0, ns = al.getHeight(); s < ns; s++)
+ {
+ SequenceI sqobj = al.getSequenceAt(s);
+ if (sqobj==profileseq)
+ {
+ continue;
+ }
+ String sq = sqobj.getSequenceAsString();
+ // pad sequence
+ int diff = origseq.getLength() - sq.length();
+ while (diff > 0)
+ {
+ //sq = sq
+ // + ((diff >= sb.length()) ? sb.toString() : sb
+ // .substring(0, diff));
+ if (diff>=sb.length()) {
+ sq+=sb.toString();
+ } else {
+ char[] buf = new char[diff];
+ sb.getChars(0, diff, buf, 0);
+ sq+=buf.toString();
+ }
+ diff = origseq.getLength() - sq.length();
+ }
+ }
+ }
+ }
}