X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FSequenceAnnotationReport.java;h=1f92428ab9aaa1a63889d611611c5d26b1ab68fe;hb=14307f5cfcbc90c419c892434613a500ca550ecc;hp=6d819d39a88092a7f285d0e954e583bf82292db6;hpb=baa077bd19420018433d78927aad3ad139e47351;p=jalview.git diff --git a/src/jalview/io/SequenceAnnotationReport.java b/src/jalview/io/SequenceAnnotationReport.java index 6d819d3..1f92428 100644 --- a/src/jalview/io/SequenceAnnotationReport.java +++ b/src/jalview/io/SequenceAnnotationReport.java @@ -20,14 +20,15 @@ */ package jalview.io; +import jalview.api.FeatureColourI; import jalview.datamodel.DBRefEntry; import jalview.datamodel.DBRefSource; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; -import jalview.io.gff.GffConstants; import jalview.util.MessageManager; import jalview.util.StringUtils; import jalview.util.UrlLink; +import jalview.viewmodel.seqfeatures.FeatureRendererModel; import java.util.Arrays; import java.util.Collection; @@ -87,14 +88,14 @@ public class SequenceAnnotationReport { return 1; } - int comp = s1 == null ? -1 - : (s2 == null ? 1 : s1.compareToIgnoreCase(s2)); + int comp = s1 == null ? -1 : (s2 == null ? 1 : s1 + .compareToIgnoreCase(s2)); if (comp == 0) { String a1 = ref1.getAccessionId(); String a2 = ref2.getAccessionId(); - comp = a1 == null ? -1 - : (a2 == null ? 1 : a1.compareToIgnoreCase(a2)); + comp = a1 == null ? -1 : (a2 == null ? 1 : a1 + .compareToIgnoreCase(a2)); } return comp; } @@ -115,9 +116,9 @@ public class SequenceAnnotationReport } }; - public SequenceAnnotationReport(String linkImageURL) + public SequenceAnnotationReport(String linkURL) { - this.linkImageURL = linkImageURL; + this.linkImageURL = linkURL; } /** @@ -129,13 +130,13 @@ public class SequenceAnnotationReport * @param minmax */ public void appendFeatures(final StringBuilder sb, int rpos, - List features, Map minmax) + List features, FeatureRendererModel fr) { if (features != null) { for (SequenceFeature feature : features) { - appendFeature(sb, rpos, minmax, feature); + appendFeature(sb, rpos, fr, feature); } } } @@ -149,7 +150,7 @@ public class SequenceAnnotationReport * @param feature */ void appendFeature(final StringBuilder sb, int rpos, - Map minmax, SequenceFeature feature) + FeatureRendererModel fr, SequenceFeature feature) { if (feature.isContactFeature()) { @@ -162,60 +163,91 @@ public class SequenceAnnotationReport sb.append(feature.getType()).append(" ").append(feature.getBegin()) .append(":").append(feature.getEnd()); } + return; } - else + + if (sb.length() > 6) + { + sb.append("
"); + } + // TODO: remove this hack to display link only features + boolean linkOnly = feature.getValue("linkonly") != null; + if (!linkOnly) { - if (sb.length() > 6) + sb.append(feature.getType()).append(" "); + if (rpos != 0) { - sb.append("
"); + // we are marking a positional feature + sb.append(feature.begin); } - // TODO: remove this hack to display link only features - boolean linkOnly = feature.getValue("linkonly") != null; - if (!linkOnly) + if (feature.begin != feature.end) { - sb.append(feature.getType()).append(" "); - if (rpos != 0) - { - // we are marking a positional feature - sb.append(feature.begin); - } - if (feature.begin != feature.end) - { - sb.append(" ").append(feature.end); - } + sb.append(" ").append(feature.end); + } - String description = feature.getDescription(); - if (description != null && !description.equals(feature.getType())) - { - description = StringUtils.stripHtmlTags(description); - sb.append("; ").append(description); - } - // check score should be shown - if (!Float.isNaN(feature.getScore())) + String description = feature.getDescription(); + if (description != null && !description.equals(feature.getType())) + { + description = StringUtils.stripHtmlTags(description); + sb.append("; ").append(description); + } + + if (showScore(feature, fr)) + { + sb.append(" Score=").append(String.valueOf(feature.getScore())); + } + String status = (String) feature.getValue("status"); + if (status != null && status.length() > 0) + { + sb.append("; (").append(status).append(")"); + } + + /* + * add attribute value if coloured by attribute + */ + if (fr != null) + { + FeatureColourI fc = fr.getFeatureColours().get(feature.getType()); + if (fc != null && fc.isColourByAttribute()) { - float[][] rng = (minmax == null) ? null - : minmax.get(feature.getType()); - if (rng != null && rng[0] != null && rng[0][0] != rng[0][1]) + String attName = fc.getAttributeName(); + String attVal = feature.getValueAsString(attName); + if (attVal != null) { - sb.append(" Score=").append(String.valueOf(feature.getScore())); + sb.append("; ").append(attName).append("=").append(attVal); } } - String status = (String) feature.getValue("status"); - if (status != null && status.length() > 0) - { - sb.append("; (").append(status).append(")"); - } - String clinSig = (String) feature - .getValue(GffConstants.CLINICAL_SIGNIFICANCE); - if (clinSig != null) - { - sb.append("; ").append(clinSig); - } } } } /** + * Answers true if score should be shown, else false. Score is shown if it is + * not NaN, and the feature type has a non-trivial min-max score range + */ + boolean showScore(SequenceFeature feature, FeatureRendererModel fr) + { + if (Float.isNaN(feature.getScore())) + { + return false; + } + if (fr == null) + { + return true; + } + float[][] minMax = fr.getMinMax().get(feature.getType()); + + /* + * minMax[0] is the [min, max] score range for positional features + */ + if (minMax == null || minMax[0] == null || minMax[0][0] == minMax[0][1]) + { + return false; + } + return true; + } + + /** * Format and appends any hyperlinks for the sequence feature to the string * buffer * @@ -238,19 +270,20 @@ public class SequenceAnnotationReport { for (List urllink : createLinksFrom(null, urlstring)) { - sb.append("
" + sb.append("
" + (urllink.get(0).toLowerCase() - .equals(urllink.get(1).toLowerCase()) - ? urllink.get(0) - : (urllink.get(0) + ":" - + urllink.get(1))) - + "
"); + .equals(urllink.get(1).toLowerCase()) ? urllink + .get(0) : (urllink.get(0) + ":" + urllink + .get(1))) + "
"); } } catch (Exception x) { - System.err.println( - "problem when creating links from " + urlstring); + System.err.println("problem when creating links from " + + urlstring); x.printStackTrace(); } } @@ -283,10 +316,10 @@ public class SequenceAnnotationReport public void createSequenceAnnotationReport(final StringBuilder tip, SequenceI sequence, boolean showDbRefs, boolean showNpFeats, - Map minmax) + FeatureRendererModel fr) { createSequenceAnnotationReport(tip, sequence, showDbRefs, showNpFeats, - minmax, false); + fr, false); } /** @@ -301,13 +334,13 @@ public class SequenceAnnotationReport * whether to include database references for the sequence * @param showNpFeats * whether to include non-positional sequence features - * @param minmax + * @param fr * @param summary * @return */ int createSequenceAnnotationReport(final StringBuilder sb, SequenceI sequence, boolean showDbRefs, boolean showNpFeats, - Map minmax, boolean summary) + FeatureRendererModel fr, boolean summary) { String tmp; sb.append(""); @@ -324,7 +357,7 @@ public class SequenceAnnotationReport { ds = ds.getDatasetSequence(); } - + if (showDbRefs) { maxWidth = Math.max(maxWidth, appendDbRefs(sb, ds, summary)); @@ -339,7 +372,7 @@ public class SequenceAnnotationReport .getNonPositionalFeatures()) { int sz = -sb.length(); - appendFeature(sb, 0, minmax, sf); + appendFeature(sb, 0, fr, sf); sz += sb.length(); maxWidth = Math.max(maxWidth, sz); } @@ -428,8 +461,7 @@ public class SequenceAnnotationReport } if (moreSources) { - sb.append("
").append(source) - .append(COMMA).append(ELLIPSIS); + sb.append("
").append(source).append(COMMA).append(ELLIPSIS); } if (ellipsis) { @@ -443,10 +475,10 @@ public class SequenceAnnotationReport public void createTooltipAnnotationReport(final StringBuilder tip, SequenceI sequence, boolean showDbRefs, boolean showNpFeats, - Map minmax) + FeatureRendererModel fr) { - int maxWidth = createSequenceAnnotationReport(tip, sequence, showDbRefs, - showNpFeats, minmax, true); + int maxWidth = createSequenceAnnotationReport(tip, sequence, + showDbRefs, showNpFeats, fr, true); if (maxWidth > 60) {