X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FColumnSelection.java;h=15bbffa1e8669610076b4d87363e14f55b33fef9;hb=17e77c3f2949a0729322b4a8d907f3f34b6a9914;hp=f1c6cc4a2f6ca38e3c4febc9811f021d602a1d24;hpb=c1a4229bd662c4299301ee8827b36096d015c075;p=jalview.git diff --git a/src/jalview/datamodel/ColumnSelection.java b/src/jalview/datamodel/ColumnSelection.java index f1c6cc4..15bbffa 100644 --- a/src/jalview/datamodel/ColumnSelection.java +++ b/src/jalview/datamodel/ColumnSelection.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2) - * Copyright (C) 2014 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9) + * Copyright (C) 2015 The Jalview Authors * * This file is part of Jalview. * @@ -21,9 +21,11 @@ package jalview.datamodel; import jalview.util.ShiftList; +import jalview.viewmodel.annotationfilter.AnnotationFilterParameter; +import jalview.viewmodel.annotationfilter.AnnotationFilterParameter.SearchableAnnotationField; import java.util.ArrayList; -import java.util.Enumeration; +import java.util.Collections; import java.util.List; import java.util.Vector; @@ -32,7 +34,7 @@ import java.util.Vector; */ public class ColumnSelection { - Vector selected = new Vector(); + Vector selected = new Vector(); // Vector of int [] {startCol, endCol} Vector hiddenColumns; @@ -61,7 +63,7 @@ public class ColumnSelection } /** - * removes col from selection + * Removes value 'col' from the selection (not the col'th item) * * @param col * index of column to be removed @@ -72,6 +74,8 @@ public class ColumnSelection if (selected.contains(colInt)) { + // if this ever changes to List.remove(), ensure Integer not int argument + // as List.remove(int i) removes the i'th item which is wrong selected.removeElement(colInt); } } @@ -101,7 +105,7 @@ public class ColumnSelection * * @return Vector containing selected columns as Integers */ - public Vector getSelected() + public Vector getSelected() { return selected; } @@ -128,7 +132,7 @@ public class ColumnSelection */ public int columnAt(int i) { - return ((Integer) selected.elementAt(i)).intValue(); + return selected.elementAt(i).intValue(); } /** @@ -198,6 +202,7 @@ public class ColumnSelection if (temp >= start) { + // if this ever changes to List.set(), swap parameter order!! selected.setElementAt(new Integer(temp - change), i); } } @@ -255,6 +260,7 @@ public class ColumnSelection if (temp >= start) { + // if this ever changes to List.set(), swap parameter order!! selected.setElementAt(new Integer(temp - change), i); } } @@ -300,13 +306,13 @@ public class ColumnSelection { if (shiftrecord != null) { - Vector shifts = shiftrecord.shifts; + final List shifts = shiftrecord.getShifts(); if (shifts != null && shifts.size() > 0) { int shifted = 0; for (int i = 0, j = shifts.size(); i < j; i++) { - int[] sh = (int[]) shifts.elementAt(i); + int[] sh = shifts.get(i); // compensateForEdit(shifted+sh[0], sh[1]); compensateForDelEdits(shifted + sh[0], sh[1]); shifted -= sh[1]; @@ -321,16 +327,17 @@ public class ColumnSelection * removes intersection of position,length ranges in deletions from the * start,end regions marked in intervals. * - * @param deletions + * @param shifts * @param intervals * @return */ - private boolean pruneIntervalVector(Vector deletions, Vector intervals) + private boolean pruneIntervalVector(final List shifts, + Vector intervals) { boolean pruned = false; - int i = 0, j = intervals.size() - 1, s = 0, t = deletions.size() - 1; - int hr[] = (int[]) intervals.elementAt(i); - int sr[] = (int[]) deletions.elementAt(s); + int i = 0, j = intervals.size() - 1, s = 0, t = shifts.size() - 1; + int hr[] = intervals.elementAt(i); + int sr[] = shifts.get(s); while (i <= j && s <= t) { boolean trailinghn = hr[1] >= sr[0]; @@ -338,7 +345,7 @@ public class ColumnSelection { if (i < j) { - hr = (int[]) intervals.elementAt(++i); + hr = intervals.elementAt(++i); } else { @@ -351,7 +358,7 @@ public class ColumnSelection { // leadinghc disjoint or not a deletion if (s < t) { - sr = (int[]) deletions.elementAt(++s); + sr = shifts.get(++s); } else { @@ -371,7 +378,7 @@ public class ColumnSelection j--; if (i <= j) { - hr = (int[]) intervals.elementAt(i); + hr = intervals.elementAt(i); } continue; } @@ -397,7 +404,7 @@ public class ColumnSelection // sr contained in hr if (s < t) { - sr = (int[]) deletions.elementAt(++s); + sr = shifts.get(++s); } else { @@ -411,15 +418,16 @@ public class ColumnSelection // operations. } - private boolean pruneColumnList(Vector deletion, Vector list) + private boolean pruneColumnList(final List shifts, + Vector list) { - int s = 0, t = deletion.size(); - int[] sr = (int[]) list.elementAt(s++); + int s = 0, t = shifts.size(); + int[] sr = shifts.get(s++); boolean pruned = false; int i = 0, j = list.size(); while (i < j && s <= t) { - int c = ((Integer) list.elementAt(i++)).intValue(); + int c = list.elementAt(i++).intValue(); if (sr[0] <= c) { if (sr[1] + sr[0] >= c) @@ -431,7 +439,7 @@ public class ColumnSelection { if (s < t) { - sr = (int[]) deletion.elementAt(s); + sr = shifts.get(s); } s++; } @@ -450,7 +458,7 @@ public class ColumnSelection { if (deletions != null) { - Vector shifts = deletions.shifts; + final List shifts = deletions.getShifts(); if (shifts != null && shifts.size() > 0) { // delete any intervals intersecting. @@ -477,16 +485,14 @@ public class ColumnSelection } /** - * This Method is used to return all the HiddenColumn regions less than the - * given index. + * This Method is used to return all the HiddenColumn regions * - * @param end - * int - * @return Vector + * @return empty list or List of hidden column intervals */ public List getHiddenColumns() { - return hiddenColumns; + return hiddenColumns == null ? Collections. emptyList() + : hiddenColumns; } /** @@ -634,7 +640,7 @@ public class ColumnSelection { while (size() > 0) { - int column = ((Integer) getSelected().firstElement()).intValue(); + int column = getSelected().firstElement().intValue(); hideColumns(column); } @@ -644,7 +650,7 @@ public class ColumnSelection { if (hiddenColumns == null) { - hiddenColumns = new Vector(); + hiddenColumns = new Vector(); } boolean added = false; @@ -661,8 +667,7 @@ public class ColumnSelection } else if (end < region[0] && start < region[0]) { - hiddenColumns.insertElementAt(new int[] - { start, end }, i); + hiddenColumns.insertElementAt(new int[] { start, end }, i); added = true; break; } @@ -674,8 +679,7 @@ public class ColumnSelection } else if (!added) { - hiddenColumns.addElement(new int[] - { start, end }); + hiddenColumns.addElement(new int[] { start, end }); } } @@ -780,7 +784,7 @@ public class ColumnSelection { if (copy.selected != null) { - selected = new Vector(); + selected = new Vector(); for (int i = 0, j = copy.selected.size(); i < j; i++) { selected.addElement(copy.selected.elementAt(i)); @@ -788,7 +792,7 @@ public class ColumnSelection } if (copy.hiddenColumns != null) { - hiddenColumns = new Vector(copy.hiddenColumns.size()); + hiddenColumns = new Vector(copy.hiddenColumns.size()); for (int i = 0, j = copy.hiddenColumns.size(); i < j; i++) { int[] rh, cp; @@ -885,7 +889,7 @@ public class ColumnSelection { if (hiddenColumns != null && hiddenColumns.size() > 0) { - Vector visiblecontigs = new Vector(); + List visiblecontigs = new ArrayList(); List regions = getHiddenColumns(); int vstart = start; @@ -904,32 +908,29 @@ public class ColumnSelection } if (hideStart > vstart) { - visiblecontigs.addElement(new int[] - { vstart, hideStart - 1 }); + visiblecontigs.add(new int[] { vstart, hideStart - 1 }); } vstart = hideEnd + 1; } if (vstart < end) { - visiblecontigs.addElement(new int[] - { vstart, end - 1 }); + visiblecontigs.add(new int[] { vstart, end - 1 }); } int[] vcontigs = new int[visiblecontigs.size() * 2]; for (int i = 0, j = visiblecontigs.size(); i < j; i++) { - int[] vc = (int[]) visiblecontigs.elementAt(i); - visiblecontigs.setElementAt(null, i); + int[] vc = visiblecontigs.get(i); + visiblecontigs.set(i, null); vcontigs[i * 2] = vc[0]; vcontigs[i * 2 + 1] = vc[1]; } - visiblecontigs.removeAllElements(); + visiblecontigs.clear(); return vcontigs; } else { - return new int[] - { start, end - 1 }; + return new int[] { start, end - 1 }; } } @@ -970,7 +971,7 @@ public class ColumnSelection if (hiddenColumns != null && hiddenColumns.size() > 0) { // then mangle the alignmentAnnotation annotation array - Vector annels = new Vector(); + Vector annels = new Vector(); Annotation[] els = null; List regions = getHiddenColumns(); int blockStart = start, blockEnd = end; @@ -1026,12 +1027,12 @@ public class ColumnSelection { return; } - Enumeration e = annels.elements(); + alignmentAnnotation.annotations = new Annotation[w]; w = 0; - while (e.hasMoreElements()) + + for (Annotation[] chnk : annels) { - Annotation[] chnk = (Annotation[]) e.nextElement(); System.arraycopy(chnk, 0, alignmentAnnotation.annotations, w, chnk.length); w += chnk.length; @@ -1079,15 +1080,13 @@ public class ColumnSelection { if (colsel != null && colsel.size() > 0) { - Enumeration e = colsel.getSelected().elements(); - while (e.hasMoreElements()) + for (Integer col : colsel.getSelected()) { - Object eo = e.nextElement(); - if (hiddenColumns != null && isVisible(((Integer) eo).intValue())) + if (hiddenColumns != null && isVisible(col.intValue())) { - if (!selected.contains(eo)) + if (!selected.contains(col)) { - selected.addElement(eo); + selected.addElement(col); } } } @@ -1102,22 +1101,20 @@ public class ColumnSelection */ public void setElementsFrom(ColumnSelection colsel) { - selected = new Vector(); + 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()) + for (Integer col : colsel.getSelected()) { - selected.addElement(en.nextElement()); + addElement(col); } } } @@ -1137,7 +1134,7 @@ public class ColumnSelection * profileseq marked as hidden. */ public static ColumnSelection propagateInsertions(SequenceI profileseq, - Alignment al, AlignmentView input) + AlignmentI al, AlignmentView input) { int profsqpos = 0; @@ -1285,6 +1282,15 @@ public class ColumnSelection } /** + * + * @return true if there are more than one set of columns hidden + */ + public boolean hasManyHiddenColumns() + { + return hiddenColumns != null && hiddenColumns.size() > 1; + } + + /** * mark the columns corresponding to gap characters as hidden in the column * selection * @@ -1298,4 +1304,89 @@ public class ColumnSelection hideColumns(r[0], r[1]); } } + + public boolean filterAnnotations(Annotation[] annotations, + AnnotationFilterParameter filterParams) + { + this.revealAllHiddenColumns(); + this.clear(); + int count = 0; + do + { + if (annotations[count] != null) + { + + boolean itemMatched = false; + + if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD + && annotations[count].value >= filterParams + .getThresholdValue()) + { + itemMatched = true; + } + if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD + && annotations[count].value <= filterParams + .getThresholdValue()) + { + itemMatched = true; + } + + if (filterParams.isFilterAlphaHelix() + && annotations[count].secondaryStructure == 'H') + { + itemMatched = true; + } + + if (filterParams.isFilterBetaSheet() + && annotations[count].secondaryStructure == 'E') + { + itemMatched = true; + } + + if (filterParams.isFilterTurn() + && annotations[count].secondaryStructure == 'S') + { + itemMatched = true; + } + + String regexSearchString = filterParams.getRegexString(); + if (regexSearchString != null + && !filterParams.getRegexSearchFields().isEmpty()) + { + List fields = filterParams + .getRegexSearchFields(); + try + { + if (fields.contains(SearchableAnnotationField.DISPLAY_STRING) + && annotations[count].displayCharacter + .matches(regexSearchString)) + { + itemMatched = true; + } + } catch (java.util.regex.PatternSyntaxException pse) + { + if (annotations[count].displayCharacter + .equals(regexSearchString)) + { + itemMatched = true; + } + } + if (fields.contains(SearchableAnnotationField.DESCRIPTION) + && annotations[count].description != null + && annotations[count].description + .matches(regexSearchString)) + { + itemMatched = true; + } + } + + if (itemMatched) + { + this.addElement(count); + } + } + count++; + } while (count < annotations.length); + return false; + } }