From b2d54d33d6313efd9da96bd7586dfaa7a0d7a182 Mon Sep 17 00:00:00 2001
From: jprocter
Date: Tue, 22 Aug 2006 08:34:04 +0000
Subject: [PATCH] hidden region recovery in JPred and new hidden region
pruning function
---
src/jalview/datamodel/ColumnSelection.java | 1181 ++++++++++++++++------------
src/jalview/util/ShiftList.java | 248 +++---
src/jalview/ws/JPredClient.java | 4 +-
3 files changed, 792 insertions(+), 641 deletions(-)
diff --git a/src/jalview/datamodel/ColumnSelection.java b/src/jalview/datamodel/ColumnSelection.java
index 39d7a8d..bd06ca3 100644
--- a/src/jalview/datamodel/ColumnSelection.java
+++ b/src/jalview/datamodel/ColumnSelection.java
@@ -1,510 +1,671 @@
-/*
- * Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2006 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
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * 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.
- *
- * 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
- */
-package jalview.datamodel;
-
-import jalview.util.ShiftList;
-
-import java.util.*;
-
-/**
- * NOTE: Columns are zero based.
- */
-public class ColumnSelection
-{
- Vector selected = new Vector();
-
- //Vector of int [] {startCol, endCol}
- Vector hiddenColumns;
-
- /**
- * Add a column to the selection
- *
- * @param col index of column
- */
- public void addElement(int col)
- {
- Integer column = new Integer(col);
- if (!selected.contains(column))
- {
- selected.addElement(column);
- }
- }
-
- /**
- * clears column selection
- */
- public void clear()
- {
- selected.removeAllElements();
- }
-
- /**
- * removes col from selection
- *
- * @param col index of column to be removed
- */
- public void removeElement(int col)
- {
- Integer colInt = new Integer(col);
-
- if (selected.contains(colInt))
- {
- selected.removeElement(colInt);
- }
- }
-
- /**
- * removes a range of columns from the selection
- * @param start int - first column in range to be removed
- * @param end int - last col
- */
- public void removeElements(int start, int end)
- {
- Integer colInt;
- for(int i=start; i max)
- {
- max = columnAt(i);
- }
- }
-
- return max;
- }
-
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
- public int getMin()
- {
- int min = 1000000000;
-
- for (int i = 0; i < selected.size(); i++)
- {
- if (columnAt(i) < min)
- {
- min = columnAt(i);
- }
- }
-
- return min;
- }
-
-
- /**
- * propagate shift in alignment columns to column selection
- *
- * @param start beginning of edit
- * @param change shift in edit (-ve or +ve number of columns)
- */
- public void compensateForEdit(int start, int change)
- {
- for (int i = 0; i < size(); i++)
- {
- int temp = columnAt(i);
-
- if (temp >= start)
- {
- selected.setElementAt(new Integer(temp - change), i);
- }
- }
-
- if(hiddenColumns!=null)
- {
- for(int i=0; i start)
- {
- region[0] -= change;
- region[1] -= change;
- }
- if(region[0]<0)
- region[0] = 0;
- if(region[1] <0)
- region[1] = 0;
- }
- }
- }
- public ShiftList compensateForEdits(ShiftList shiftrecord) {
- if (shiftrecord!=null) {
- Vector shifts = shiftrecord.shifts;
- if (shifts!=null && shifts.size()>0) {
- for (int i=0,j=shifts.size(); i= region[0])
- {
- result += region[1] - region[0] + 1;
- }
- }
- }
- return result;
- }
-
- /**
- * Use this method to find out where a visible column is in the alignment
- * when hidden columns exist
- * @param hiddenColumn int
- * @return int
- */
- public int findColumnPosition(int hiddenColumn)
- {
- int result = hiddenColumn;
- if (hiddenColumns != null)
- {
- int index = 0;
- int gaps = 0;
- do
- {
- int[] region = (int[]) hiddenColumns.elementAt(index);
- if (hiddenColumn > region[1])
- {
- result -= region[1]+1-region[0];
- }
- index++;
- }
- while (index < hiddenColumns.size());
-
- result -= gaps;
- }
-
- return result;
- }
-
- /**
- * Use this method to determine where the next hiddenRegion starts
- */
- public int findHiddenRegionPosition(int hiddenRegion)
- {
- int result = 0;
- if (hiddenColumns != null)
- {
- int index = 0;
- int gaps = 0;
- do
- {
- int[] region = (int[]) hiddenColumns.elementAt(index);
- if(hiddenRegion==0)
- {
- return region[0];
- }
-
- gaps += region[1] +1 - region[0];
- result = region[1] +1;
- index++;
- }
- while(index < hiddenRegion+1);
-
- result -= gaps;
- }
-
- return result;
- }
-
- /**
- * THis method returns the rightmost limit of a
- * region of an alignment with hidden columns.
- * In otherwords, the next hidden column.
- * @param index int
- */
- public int getHiddenBoundaryRight(int alPos)
- {
- if (hiddenColumns != null)
- {
- int index = 0;
- do
- {
- int[] region = (int[]) hiddenColumns.elementAt(index);
- if(alPos < region[0])
- return region[0];
-
- index++;
- }
- while(index < hiddenColumns.size());
- }
-
- return alPos;
-
- }
- /**
- * THis method returns the rightmost limit of a
- * region of an alignment with hidden columns.
- * In otherwords, the next hidden column.
- * @param index int
- */
- public int getHiddenBoundaryLeft(int alPos)
- {
- if (hiddenColumns != null)
- {
- int index = hiddenColumns.size()-1;
- do
- {
- int[] region = (int[]) hiddenColumns.elementAt(index);
- if(alPos > region[1])
- return region[1];
-
- index--;
- }
- while(index >-1);
- }
-
- return alPos;
-
- }
-
- public void hideSelectedColumns()
- {
- while (size() > 0)
- {
- int column = ( (Integer) getSelected().firstElement()).intValue();
- hideColumns(column);
- }
-
- }
-
- public void hideColumns(int start, int end)
- {
- if(hiddenColumns==null)
- hiddenColumns = new Vector();
-
- boolean added = false;
- boolean overlap = false;
-
- for (int i = 0; i < hiddenColumns.size(); i++)
- {
- int[] region = (int[]) hiddenColumns.elementAt(i);
- if ( start<=region[1] && end>=region[0])
- {
- hiddenColumns.removeElementAt(i);
- overlap = true;
- break;
- }
- else if (end < region[0] && start < region[0])
- {
- hiddenColumns.insertElementAt(new int[]
- {start, end}, i);
- added = true;
- break;
- }
- }
-
- if(overlap)
- {
- hideColumns(start, end);
- }
- else if (!added)
- hiddenColumns.addElement(new int[] {start, end});
-
- }
-
- /**
- * This method will find a range of selected columns
- * around the column specified
- * @param res int
- */
- public void hideColumns(int col)
- {
- // First find out range of columns to hide
- int min = col, max = col+1;
- while( contains(min) )
- { removeElement(min); min --; }
-
- while( contains(max) )
- { removeElement(max); max ++; }
-
- min++; max--;
-
- hideColumns(min, max);
- }
-
- public void revealAllHiddenColumns()
- {
- if(hiddenColumns!=null)
- {
- for (int i = 0; i < hiddenColumns.size(); i++)
- {
- int[] region = (int[]) hiddenColumns.elementAt(i);
- for (int j = region[0]; j < region[1]+1; j++)
- {
- addElement(j);
- }
- }
- }
-
- hiddenColumns = null;
- }
-
- public void revealHiddenColumns(int res)
- {
- for(int i=0; i= region[0] && column <= region[1])
- {
- return false;
- }
- }
- return true;
- }
- /**
- * Copy constructor
- * @param copy
- */
- public ColumnSelection(ColumnSelection copy) {
- if (copy!=null) {
- if (copy.selected!=null) {
- selected = new Vector();
- for (int i=0,j=copy.selected.size(); i max)
+ {
+ max = columnAt(i);
+ }
+ }
+
+ return max;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ public int getMin()
+ {
+ int min = 1000000000;
+
+ for (int i = 0; i < selected.size(); i++)
+ {
+ if (columnAt(i) < min)
+ {
+ min = columnAt(i);
+ }
+ }
+
+ return min;
+ }
+
+
+ /**
+ * propagate shift in alignment columns to column selection
+ *
+ * @param start beginning of edit
+ * @param left shift in edit (+ve for removal, or -ve for inserts)
+ */
+ public void compensateForEdit(int start, int change)
+ {
+ for (int i = 0; i < size(); i++)
+ {
+ int temp = columnAt(i);
+
+ if (temp >= start)
+ {
+ selected.setElementAt(new Integer(temp - change), i);
+ }
+ }
+
+ if(hiddenColumns!=null)
+ {
+ for(int i=0; i start)
+ {
+ region[0] -= change;
+ region[1] -= change;
+ }
+ if(region[0]<0)
+ region[0] = 0;
+ if(region[1] <0)
+ region[1] = 0;
+ }
+ }
+ }
+ /**
+ * propagate shift in alignment columns to column selection
+ * special version of compensateForEdit - allowing for edits within hidden regions
+ * @param start beginning of edit
+ * @param left shift in edit (+ve for removal, or -ve for inserts)
+ */
+ private void compensateForDelEdits(int start, int change)
+ {
+ for (int i = 0; i < size(); i++)
+ {
+ int temp = columnAt(i);
+
+ if (temp >= start)
+ {
+ selected.setElementAt(new Integer(temp - change), i);
+ }
+ }
+
+ if(hiddenColumns!=null)
+ {
+ for(int i=0; i= start)
+ {
+ region[0] -= change;
+ }
+ if (region[1]>= start) {
+ region[1] -=change;
+ }
+ if (region[1]0) {
+ int shifted=0;
+ for (int i=0,j=shifts.size(); i=sr[0];
+ if (!trailinghn) {
+ if (i=sr[0];
+ boolean leadinghc=hr[0]=c) { // sr[1] -ve means inseriton.
+ list.removeElementAt(--i);
+ j--;
+ } else {
+ if (s0) {
+ // delete any intervals intersecting.
+ if (hiddenColumns!=null) {
+ pruneIntervalVector(shifts, hiddenColumns);
+ if (hiddenColumns!=null && hiddenColumns.size()==0) {
+ hiddenColumns=null;
+ }
+ }
+ if (selected!=null && selected.size()>0) {
+ pruneColumnList(shifts, selected);
+ if (selected!=null && selected.size()==0)
+ selected=null;
+ }
+ // and shift the rest.
+ this.compensateForEdits(deletions);
+ }
+ }
+ }
+ /**
+ * This Method is used to return all the HiddenColumn regions
+ * less than the given index.
+ * @param end int
+ * @return Vector
+ */
+ public Vector getHiddenColumns()
+ {
+ return hiddenColumns;
+ }
+ /**
+ * Return absolute column index for a visible column index
+ * @param column int column index in alignment view
+ * @return alignment column index for column
+ */
+ public int adjustForHiddenColumns(int column)
+ {
+ int result = column;
+ if (hiddenColumns != null)
+ {
+ for (int i = 0; i < hiddenColumns.size(); i++)
+ {
+ int[] region = (int[]) hiddenColumns.elementAt(i);
+ if (result >= region[0])
+ {
+ result += region[1] - region[0] + 1;
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Use this method to find out where a visible column is in the alignment
+ * when hidden columns exist
+ * @param hiddenColumn int
+ * @return int
+ */
+ public int findColumnPosition(int hiddenColumn)
+ {
+ int result = hiddenColumn;
+ if (hiddenColumns != null)
+ {
+ int index = 0;
+ int gaps = 0;
+ do
+ {
+ int[] region = (int[]) hiddenColumns.elementAt(index);
+ if (hiddenColumn > region[1])
+ {
+ result -= region[1]+1-region[0];
+ }
+ index++;
+ }
+ while (index < hiddenColumns.size());
+
+ result -= gaps;
+ }
+
+ return result;
+ }
+
+ /**
+ * Use this method to determine where the next hiddenRegion starts
+ */
+ public int findHiddenRegionPosition(int hiddenRegion)
+ {
+ int result = 0;
+ if (hiddenColumns != null)
+ {
+ int index = 0;
+ int gaps = 0;
+ do
+ {
+ int[] region = (int[]) hiddenColumns.elementAt(index);
+ if(hiddenRegion==0)
+ {
+ return region[0];
+ }
+
+ gaps += region[1] +1 - region[0];
+ result = region[1] +1;
+ index++;
+ }
+ while(index < hiddenRegion+1);
+
+ result -= gaps;
+ }
+
+ return result;
+ }
+
+ /**
+ * THis method returns the rightmost limit of a
+ * region of an alignment with hidden columns.
+ * In otherwords, the next hidden column.
+ * @param index int
+ */
+ public int getHiddenBoundaryRight(int alPos)
+ {
+ if (hiddenColumns != null)
+ {
+ int index = 0;
+ do
+ {
+ int[] region = (int[]) hiddenColumns.elementAt(index);
+ if(alPos < region[0])
+ return region[0];
+
+ index++;
+ }
+ while(index < hiddenColumns.size());
+ }
+
+ return alPos;
+
+ }
+ /**
+ * THis method returns the rightmost limit of a
+ * region of an alignment with hidden columns.
+ * In otherwords, the next hidden column.
+ * @param index int
+ */
+ public int getHiddenBoundaryLeft(int alPos)
+ {
+ if (hiddenColumns != null)
+ {
+ int index = hiddenColumns.size()-1;
+ do
+ {
+ int[] region = (int[]) hiddenColumns.elementAt(index);
+ if(alPos > region[1])
+ return region[1];
+
+ index--;
+ }
+ while(index >-1);
+ }
+
+ return alPos;
+
+ }
+
+ public void hideSelectedColumns()
+ {
+ while (size() > 0)
+ {
+ int column = ( (Integer) getSelected().firstElement()).intValue();
+ hideColumns(column);
+ }
+
+ }
+
+ public void hideColumns(int start, int end)
+ {
+ if(hiddenColumns==null)
+ hiddenColumns = new Vector();
+
+ boolean added = false;
+ boolean overlap = false;
+
+ for (int i = 0; i < hiddenColumns.size(); i++)
+ {
+ int[] region = (int[]) hiddenColumns.elementAt(i);
+ if ( start<=region[1] && end>=region[0])
+ {
+ hiddenColumns.removeElementAt(i);
+ overlap = true;
+ break;
+ }
+ else if (end < region[0] && start < region[0])
+ {
+ hiddenColumns.insertElementAt(new int[]
+ {start, end}, i);
+ added = true;
+ break;
+ }
+ }
+
+ if(overlap)
+ {
+ hideColumns(start, end);
+ }
+ else if (!added)
+ hiddenColumns.addElement(new int[] {start, end});
+
+ }
+
+ /**
+ * This method will find a range of selected columns
+ * around the column specified
+ * @param res int
+ */
+ public void hideColumns(int col)
+ {
+ // First find out range of columns to hide
+ int min = col, max = col+1;
+ while( contains(min) )
+ { removeElement(min); min --; }
+
+ while( contains(max) )
+ { removeElement(max); max ++; }
+
+ min++; max--;
+
+ hideColumns(min, max);
+ }
+
+ public void revealAllHiddenColumns()
+ {
+ if(hiddenColumns!=null)
+ {
+ for (int i = 0; i < hiddenColumns.size(); i++)
+ {
+ int[] region = (int[]) hiddenColumns.elementAt(i);
+ for (int j = region[0]; j < region[1]+1; j++)
+ {
+ addElement(j);
+ }
+ }
+ }
+
+ hiddenColumns = null;
+ }
+
+ public void revealHiddenColumns(int res)
+ {
+ for(int i=0; i= region[0] && column <= region[1])
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+ /**
+ * Copy constructor
+ * @param copy
+ */
+ public ColumnSelection(ColumnSelection copy) {
+ if (copy!=null) {
+ if (copy.selected!=null) {
+ selected = new Vector();
+ for (int i=0,j=copy.selected.size(); iTitle: ShiftList
- *
- * Description:
- *
- * Copyright: Copyright (c) 2004
- *
- * Company: Dundee University
- *
- * @author not attributable
- * @version 1.0
- */
-public class ShiftList
-{
- public Vector shifts;
- public ShiftList()
- {
- shifts = new Vector();
- }
-
- /**
- * addShift
- * @param pos start position for shift (in original reference frame)
- * @param shift length of shift
- */
- public void addShift(int pos, int shift)
- {
- int sidx = 0;
- int[] rshift=null;
- while (sidx0) {
- shiftList=new ShiftList();
-
- for (int i=0,p=0; i0) {
+ shiftList=new ShiftList();
+ for (int i=0,p=0; i