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(); + } + } + } + } }