X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fworkers%2FColumnCounterSetWorker.java;h=74695fe2bd494f63ce4d866f3f16b02ee2a8691d;hb=106a3890f956e2aa7780b2985f4326655912a558;hp=cf6a229ba91c677fb60277ef0cc62f06f05ec29e;hpb=d0b6486ecb5c6572b823f9fd8676a603a4d493e9;p=jalview.git diff --git a/src/jalview/workers/ColumnCounterSetWorker.java b/src/jalview/workers/ColumnCounterSetWorker.java index cf6a229..74695fe 100644 --- a/src/jalview/workers/ColumnCounterSetWorker.java +++ b/src/jalview/workers/ColumnCounterSetWorker.java @@ -57,7 +57,7 @@ class ColumnCounterSetWorker extends AlignCalcWorker AlignmentViewPanel panel, FeatureSetCounterI counter) { super(viewport, panel); - ourAnnots = new ArrayList(); + ourAnnots = new ArrayList<>(); this.counter = counter; calcMan.registerWorker(this); } @@ -69,6 +69,7 @@ class ColumnCounterSetWorker extends AlignCalcWorker @Override public void run() { + boolean annotationAdded = false; try { calcMan.notifyStart(this); @@ -93,7 +94,7 @@ class ColumnCounterSetWorker extends AlignCalcWorker { try { - computeAnnotations(); + annotationAdded = computeAnnotations(); } catch (IndexOutOfBoundsException x) { // probable race condition. just finish and return without any fuss. @@ -111,8 +112,11 @@ class ColumnCounterSetWorker extends AlignCalcWorker if (ap != null) { - ap.adjustAnnotationHeight(); - ap.paintAlignment(true); + if (annotationAdded) + { + ap.adjustAnnotationHeight(); + } + ap.paintAlignment(true, true); } } @@ -120,8 +124,10 @@ class ColumnCounterSetWorker extends AlignCalcWorker /** * Scan each column of the alignment to calculate a count by feature type. Set * the count as the value of the alignment annotation for that feature type. + * + * @return */ - void computeAnnotations() + boolean computeAnnotations() { FeatureRenderer fr = new FeatureRenderer(alignViewport); // TODO use the commented out code once JAL-2075 is fixed @@ -140,6 +146,12 @@ class ColumnCounterSetWorker extends AlignCalcWorker { max[crow] = 0; } + + int[] minC = counter.getMinColour(); + int[] maxC = counter.getMaxColour(); + Color minColour = new Color(minC[0], minC[1], minC[2]); + Color maxColour = new Color(maxC[0], maxC[1], maxC[2]); + for (int col = 0; col < width; col++) { int[] count = counts[col]; @@ -164,43 +176,51 @@ class ColumnCounterSetWorker extends AlignCalcWorker max[crow] = Math.max(count[crow], max[crow]); } } + + boolean annotationAdded = false; + for (int anrow = 0; anrow < rows; anrow++) { Annotation[] anns = new Annotation[width]; + long rmax = 0; /* - * add non-zero counts as annotations + * add counts as annotations. zeros are needed since select-by-annotation ignores empty annotation positions */ for (int i = 0; i < counts.length; i++) { int count = counts[i][anrow]; - if (count > 0) - { - Color color = ColorUtils.getGraduatedColour(count, 0, Color.cyan, - max[anrow], Color.blue); - String str = String.valueOf(count); - anns[i] = new Annotation(str, str, '0', count, color); - } + + Color color = ColorUtils.getGraduatedColour(count, 0, minColour, + max[anrow], maxColour); + String str = String.valueOf(count); + anns[i] = new Annotation(str, str, '0', count, color); + rmax = Math.max(count, rmax); } /* * construct or update the annotation */ - AlignmentAnnotation ann = alignViewport.getAlignment() - .findOrCreateAnnotation(counter.getNames()[anrow], - counter.getDescriptions()[anrow], false, null, - null); - ann.description = counter.getDescriptions()[anrow]; + String description = counter.getDescriptions()[anrow]; + if (!alignment.findAnnotation(description).iterator().hasNext()) + { + annotationAdded = true; + } + AlignmentAnnotation ann = alignment.findOrCreateAnnotation( + counter.getNames()[anrow], description, false, null, null); + ann.description = description; ann.showAllColLabels = true; ann.scaleColLabel = true; ann.graph = AlignmentAnnotation.BAR_GRAPH; ann.annotations = anns; - setGraphMinMax(ann, anns); + ann.graphMin = 0f; // minimum always zero count + ann.graphMax = rmax; // maximum count from loop over feature columns ann.validateRangeAndDisplay(); if (!ourAnnots.contains(ann)) { ourAnnots.add(ann); } } + return annotationAdded; } /** @@ -209,6 +229,7 @@ class ColumnCounterSetWorker extends AlignCalcWorker * * @param alignment * @param col + * (0..) * @param row * @param fr */ @@ -229,14 +250,12 @@ class ColumnCounterSetWorker extends AlignCalcWorker { return null; } - int pos = seq.findPosition(col); /* * compute a count for any displayed features at residue */ - // NB have to adjust pos if using AlignmentView.getVisibleAlignment // see JAL-2075 - List features = fr.findFeaturesAtRes(seq, pos); + List features = fr.findFeaturesAtColumn(seq, col + 1); int[] count = this.counter.count(String.valueOf(res), features); return count; }