X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FColumnSelection.java;h=3c2d1664bba6c5adbcfd622cfe09d74d9d91d46f;hb=beb2fee66dde629e3bbb7febb38d0116e1a64df2;hp=6d620b4a9cff66a9602fa900aace1809e983296d;hpb=f4766a7bbcfae845fc95923b01fa14ff83d589ff;p=jalview.git diff --git a/src/jalview/datamodel/ColumnSelection.java b/src/jalview/datamodel/ColumnSelection.java index 6d620b4..4a38ec0 100644 --- a/src/jalview/datamodel/ColumnSelection.java +++ b/src/jalview/datamodel/ColumnSelection.java @@ -20,13 +20,14 @@ */ package jalview.datamodel; -import jalview.viewmodel.annotationfilter.AnnotationFilterParameter; -import jalview.viewmodel.annotationfilter.AnnotationFilterParameter.SearchableAnnotationField; - import java.util.ArrayList; import java.util.BitSet; import java.util.Collections; import java.util.List; +import java.util.regex.PatternSyntaxException; + +import jalview.viewmodel.annotationfilter.AnnotationFilterParameter; +import jalview.viewmodel.annotationfilter.AnnotationFilterParameter.SearchableAnnotationField; /** * Data class holding the selected columns and hidden column ranges for a view. @@ -59,7 +60,7 @@ public class ColumnSelection */ IntList() { - order = new ArrayList(); + order = new ArrayList<>(); _uorder = Collections.unmodifiableList(order); selected = new BitSet(); } @@ -105,7 +106,7 @@ public class ColumnSelection void remove(int col) { - Integer colInt = new Integer(col); + Integer colInt = Integer.valueOf(col); if (selected.get(col)) { @@ -203,7 +204,7 @@ public class ColumnSelection // clear shifted bits and update List of selected columns selected.clear(temp); mask.set(temp - change); - order.set(i, new Integer(temp - change)); + order.set(i, Integer.valueOf(temp - change)); } } // lastly update the bitfield all at once @@ -230,7 +231,7 @@ public class ColumnSelection */ List getRanges() { - List rlist = new ArrayList(); + List rlist = new ArrayList<>(); if (selected.isEmpty()) { return rlist; @@ -263,7 +264,7 @@ public class ColumnSelection } } - IntList selection = new IntList(); + private IntList selection = new IntList(); /** * Add a column to the selection @@ -277,6 +278,27 @@ public class ColumnSelection } /** + * add a series of start,end (inclusive) ranges to the column selection + * + * @param rng + * [start_0, end_0, start_1, end_1, ... ] + * @param baseOne + * - when true, ranges are base 1 and will be mapped to base 0 + */ + public void addRangeOfElements(int[] rng, boolean baseOne) + { + int base = baseOne ? -1 : 0; + for (int c = 0; c < rng.length; c += 2) + { + for (int p = rng[c]; p <= rng[c + 1]; p++) + { + selection.add(base + p); + } + } + + } + + /** * clears column selection */ public void clear() @@ -308,7 +330,7 @@ public class ColumnSelection Integer colInt; for (int i = start; i < end; i++) { - colInt = new Integer(i); + colInt = Integer.valueOf(i); if (selection.contains(colInt)) { selection.remove(colInt); @@ -353,6 +375,22 @@ public class ColumnSelection } /** + * + */ + public boolean intersects(int from, int to) + { + // TODO: do this in a more efficient bitwise way + for (int f = from; f <= to; f++) + { + if (selection.isSelected(f)) + { + return true; + } + } + return false; + } + + /** * Answers true if no columns are selected, else false */ public boolean isEmpty() @@ -533,92 +571,150 @@ public class ColumnSelection return (selection != null && selection.size() > 0); } - public boolean filterAnnotations(Annotation[] annotations, + /** + * Selects columns where the given annotation matches the provided filter + * condition(s). Any existing column selections are first cleared. Answers the + * number of columns added. + * + * @param annotations + * @param filterParams + * @return + */ + public int filterAnnotations(AlignmentAnnotation ann_row, AnnotationFilterParameter filterParams) { + Annotation[] annotations = ann_row.annotations; // JBPNote - this method needs to be refactored to become independent of // viewmodel package this.clear(); - int count = 0; - do + + if (ann_row.graph == AlignmentAnnotation.CONTACT_MAP && (filterParams + .getThresholdType() == AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD + || filterParams + .getThresholdType() == AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD)) { - if (annotations[count] != null) + float tVal = filterParams.getThresholdValue(); + if (ann_row.sequenceRef != null) { + // TODO - get ContactList from AlignmentView for non-seq-ref associatd + for (int column = 0; column < annotations.length; column++) + { + if (ann_row.annotations[column] == null) + { + continue; + } + + int cpos = ann_row.sequenceRef.findPosition(column) - 1; + ContactListI clist = ann_row.sequenceRef + .getContactListFor(ann_row, cpos); + for (int row = column + 8, rowEnd = clist + .getContactHeight(); row < rowEnd; row++) + { + if (filterParams + .getThresholdType() == AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD + ? (clist.getContactAt(row) > tVal) + : (clist.getContactAt(row) < tVal)) + { + addElement(column); + break; + // int column_forrowpos = ann_row.sequenceRef.findIndex(row + 1); + // addElement(column_forrowpos); + } + } + } + } + return selection.size(); + } - boolean itemMatched = false; + int addedCount = 0; + int column = 0; + do + { + Annotation ann = annotations[column]; + if (ann != null) + { + float value = ann.value; + boolean matched = false; + /* + * filter may have multiple conditions - + * these are or'd until a match is found + */ if (filterParams .getThresholdType() == AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD - && annotations[count].value >= filterParams - .getThresholdValue()) + && value > filterParams.getThresholdValue()) { - itemMatched = true; + matched = true; } - if (filterParams + + if (!matched && filterParams .getThresholdType() == AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD - && annotations[count].value <= filterParams - .getThresholdValue()) + && value < filterParams.getThresholdValue()) { - itemMatched = true; + matched = true; } - if (filterParams.isFilterAlphaHelix() - && annotations[count].secondaryStructure == 'H') + if (!matched && filterParams.isFilterAlphaHelix() + && ann.secondaryStructure == 'H') { - itemMatched = true; + matched = true; } - if (filterParams.isFilterBetaSheet() - && annotations[count].secondaryStructure == 'E') + if (!matched && filterParams.isFilterBetaSheet() + && ann.secondaryStructure == 'E') { - itemMatched = true; + matched = true; } - if (filterParams.isFilterTurn() - && annotations[count].secondaryStructure == 'S') + if (!matched && filterParams.isFilterTurn() + && ann.secondaryStructure == 'S') { - itemMatched = true; + matched = true; } String regexSearchString = filterParams.getRegexString(); - if (regexSearchString != null - && !filterParams.getRegexSearchFields().isEmpty()) + if (!matched && regexSearchString != null) { List fields = filterParams .getRegexSearchFields(); - try + for (SearchableAnnotationField field : fields) { - if (fields.contains(SearchableAnnotationField.DISPLAY_STRING) - && annotations[count].displayCharacter - .matches(regexSearchString)) + String compareTo = field == SearchableAnnotationField.DISPLAY_STRING + ? ann.displayCharacter // match 'Label' + : ann.description; // and/or 'Description' + if (compareTo != null) { - itemMatched = true; - } - } catch (java.util.regex.PatternSyntaxException pse) - { - if (annotations[count].displayCharacter - .equals(regexSearchString)) - { - itemMatched = true; + try + { + if (compareTo.matches(regexSearchString)) + { + matched = true; + } + } catch (PatternSyntaxException pse) + { + if (compareTo.equals(regexSearchString)) + { + matched = true; + } + } + if (matched) + { + break; + } } } - if (fields.contains(SearchableAnnotationField.DESCRIPTION) - && annotations[count].description != null - && annotations[count].description - .matches(regexSearchString)) - { - itemMatched = true; - } } - if (itemMatched) + if (matched) { - this.addElement(count); + this.addElement(column); + addedCount++; } } - count++; - } while (count < annotations.length); - return false; + column++; + } while (column < annotations.length); + + return addedCount; } /**