X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fschemes%2FAnnotationColourGradient.java;h=7133f130fdb2a53f6db8e49bfd0c38d96013fee5;hb=e966ed9e5fb77a7e698344d4a581c3d7450eaf0e;hp=220d3ab84f3ddcf6846ac6869f0305ae5287cb42;hpb=136c0793b90b72b928c4d77dc109dd5c644e00d3;p=jalview.git diff --git a/src/jalview/schemes/AnnotationColourGradient.java b/src/jalview/schemes/AnnotationColourGradient.java index 220d3ab..7133f13 100755 --- a/src/jalview/schemes/AnnotationColourGradient.java +++ b/src/jalview/schemes/AnnotationColourGradient.java @@ -36,6 +36,16 @@ import java.util.Map; public class AnnotationColourGradient extends FollowerColourScheme { + /** + * map positional scores to transparency rather than colour + */ + boolean positionToTransparency = true; + + /** + * compute shade based on annotation row score + */ + boolean perLineScore = true; + public static final int NO_THRESHOLD = -1; public static final int BELOW_THRESHOLD = 0; @@ -93,6 +103,8 @@ public class AnnotationColourGradient extends FollowerColourScheme acg.predefinedColours = predefinedColours; acg.seqAssociated = seqAssociated; acg.noGradient = noGradient; + acg.positionToTransparency = positionToTransparency; + acg.perLineScore = perLineScore; return acg; } @@ -185,19 +197,22 @@ public class AnnotationColourGradient extends FollowerColourScheme } else { - seqannot = new IdentityHashMap(); + seqannot = new IdentityHashMap<>(); } // resolve the context containing all the annotation for the sequence - AnnotatedCollectionI alcontext = alignment instanceof AlignmentI ? alignment + AnnotatedCollectionI alcontext = alignment instanceof AlignmentI + ? alignment : alignment.getContext(); - boolean f = true, rna = false; + boolean f = true, sf = true, rna = false; + long plcount = 0, ancount = 0; for (AlignmentAnnotation alan : alcontext.findAnnotation(annotation .getCalcId())) { if (alan.sequenceRef != null - && (alan.label != null && annotation != null && alan.label - .equals(annotation.label))) + && (alan.label != null && annotation != null + && alan.label.equals(annotation.label))) { + ancount++; if (!rna && alan.isRNA()) { rna = true; @@ -212,8 +227,30 @@ public class AnnotationColourGradient extends FollowerColourScheme aamin = alan.graphMin; } f = false; + if (alan.score == alan.score) + { + if (sf || alan.score < plmin) + { + plmin = alan.score; + } + if (sf || alan.score > plmax) + { + plmax = alan.score; + } + sf = false; + plcount++; + } } } + if (plcount > 0 && plcount == ancount) + { + perLineScore = plcount == ancount; + aamax=plmax; + } + else + { + perLineScore = false; + } if (rna) { ColourSchemeProperty.initRnaHelicesShading(1 + (int) aamax); @@ -221,7 +258,15 @@ public class AnnotationColourGradient extends FollowerColourScheme } } - float aamin = 0f, aamax = 0f; + /** + * positional annotation max/min + */ + double aamin = 0.0, aamax = 0.0; + + /** + * per line score max/min + */ + double plmin = Double.NaN, plmax = Double.NaN; public AlignmentAnnotation getAnnotation() { @@ -252,8 +297,8 @@ public class AnnotationColourGradient extends FollowerColourScheme public Color getMaxColour() { - return new Color(redMin + redRange, greenMin + greenRange, blueMin - + blueRange); + return new Color(redMin + redRange, greenMin + greenRange, + blueMin + blueRange); } /** @@ -287,8 +332,9 @@ public class AnnotationColourGradient extends FollowerColourScheme /* * locate the annotation we are configured to colour by */ - AlignmentAnnotation ann = (seqAssociated && seqannot != null ? seqannot - .get(seq) : this.annotation); + AlignmentAnnotation ann = (seqAssociated && seqannot != null + ? seqannot.get(seq) + : this.annotation); /* * if gap or no annotation at position, no colour (White) @@ -316,8 +362,10 @@ public class AnnotationColourGradient extends FollowerColourScheme */ if (annotationThreshold != null) { - if ((aboveAnnotationThreshold == ABOVE_THRESHOLD && aj.value < annotationThreshold.value) - || (aboveAnnotationThreshold == BELOW_THRESHOLD && aj.value > annotationThreshold.value)) + if ((aboveAnnotationThreshold == ABOVE_THRESHOLD + && aj.value < annotationThreshold.value) + || (aboveAnnotationThreshold == BELOW_THRESHOLD + && aj.value > annotationThreshold.value)) { return Color.white; } @@ -354,8 +402,10 @@ public class AnnotationColourGradient extends FollowerColourScheme } else { - result = ann.annotations[j].secondaryStructure == 'H' ? AnnotationRenderer.HELIX_COLOUR - : ann.annotations[j].secondaryStructure == 'E' ? AnnotationRenderer.SHEET_COLOUR + result = ann.annotations[j].secondaryStructure == 'H' + ? AnnotationRenderer.HELIX_COLOUR + : ann.annotations[j].secondaryStructure == 'E' + ? AnnotationRenderer.SHEET_COLOUR : AnnotationRenderer.STEM_COLOUR; } } @@ -429,11 +479,25 @@ public class AnnotationColourGradient extends FollowerColourScheme } } - int dr = (int) (redRange * range + redMin); - int dg = (int) (greenRange * range + greenMin); - int db = (int) (blueRange * range + blueMin); - - return new Color(dr, dg, db); + // midtr sets the ceiling for bleaching out the shading + int trans = 0, midtr = 239; + if (perLineScore) + { + trans = (int) ((1f - range) * midtr); + range = (float) ((ann.score - plmin) / (plmax - aamin)); + } + int dr = (int) (redRange * range + redMin), + dg = (int) (greenRange * range + greenMin), + db = (int) (blueRange * range + blueMin); + if (ann.score == ann.score && positionToTransparency) + { + return new Color(Math.min(dr + trans, midtr), Math.min(dg + + trans, midtr), Math.min(db + trans, midtr)); + } + else + { + return new Color(dr, dg, db); + } } public boolean isPredefinedColours()