X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FSequenceFeature.java;h=1f498b94abbd5eb688cad365c98a7af9c52eda96;hb=HEAD;hp=2dd9cf0d44442e12b3822fed20e61ee1b10f65fe;hpb=3b3c59cfa50e942d2fa5b367b7117cade9459ce7;p=jalview.git diff --git a/src/jalview/datamodel/SequenceFeature.java b/src/jalview/datamodel/SequenceFeature.java index 2dd9cf0..1f498b9 100755 --- a/src/jalview/datamodel/SequenceFeature.java +++ b/src/jalview/datamodel/SequenceFeature.java @@ -20,13 +20,6 @@ */ package jalview.datamodel; -import jalview.datamodel.features.FeatureAttributeType; -import jalview.datamodel.features.FeatureAttributes; -import jalview.datamodel.features.FeatureLocationI; -import jalview.datamodel.features.FeatureSourceI; -import jalview.datamodel.features.FeatureSources; -import jalview.util.StringUtils; - import java.util.Comparator; import java.util.LinkedHashMap; import java.util.Map; @@ -35,6 +28,13 @@ import java.util.SortedMap; import java.util.TreeMap; import java.util.Vector; +import jalview.datamodel.features.FeatureAttributeType; +import jalview.datamodel.features.FeatureAttributes; +import jalview.datamodel.features.FeatureLocationI; +import jalview.datamodel.features.FeatureSourceI; +import jalview.datamodel.features.FeatureSources; +import jalview.util.StringUtils; + /** * A class that models a single contiguous feature on a sequence. If flag * 'contactFeature' is true, the start and end positions are interpreted instead @@ -102,8 +102,8 @@ public class SequenceFeature implements FeatureLocationI */ public SequenceFeature(SequenceFeature cpy) { - this(cpy, cpy.getBegin(), cpy.getEnd(), cpy.getFeatureGroup(), cpy - .getScore()); + this(cpy, cpy.getBegin(), cpy.getEnd(), cpy.getFeatureGroup(), + cpy.getScore()); } /** @@ -377,10 +377,10 @@ public class SequenceFeature implements FeatureLocationI /** * Answers the value of the specified attribute as string, or null if no such - * value. If more than one attribute name is provided, tries to resolve as keys - * to nested maps. For example, if attribute "CSQ" holds a map of key-value - * pairs, then getValueAsString("CSQ", "Allele") returns the value of "Allele" - * in that map. + * value. If more than one attribute name is provided, tries to resolve as + * keys to nested maps. For example, if attribute "CSQ" holds a map of + * key-value pairs, then getValueAsString("CSQ", "Allele") returns the value + * of "Allele" in that map. * * @param key * @return @@ -586,13 +586,17 @@ public class SequenceFeature implements FeatureLocationI } /** - * Answers an html-formatted report of feature details + * Answers an html-formatted report of feature details. If parameter + * {@code mf} is not null, the feature is a virtual linked feature, and + * details included both the original location and the mapped location + * (CDS/peptide). * * @param seqName + * @param mf * * @return */ - public String getDetailsReport(String seqName) + public String getDetailsReport(String seqName, MappedFeatures mf) { FeatureSourceI metadata = FeatureSources.getInstance() .getSource(source); @@ -600,9 +604,24 @@ public class SequenceFeature implements FeatureLocationI StringBuilder sb = new StringBuilder(128); sb.append("
"); sb.append(""); - sb.append(String.format(ROW_DATA, "Location", seqName, - begin == end ? begin - : begin + (isContactFeature() ? ":" : "-") + end)); + String name = mf == null ? seqName : mf.getLinkedSequenceName(); + sb.append(String.format(ROW_DATA, "Location", name, begin == end ? begin + : begin + (isContactFeature() ? ":" : "-") + end)); + + String consequence = ""; + if (mf != null) + { + int[] localRange = mf.getMappedPositions(begin, end); + int from = localRange[0]; + int to = localRange[localRange.length - 1]; + String s = mf.isFromCds() ? "Peptide Location" : "Coding location"; + sb.append(String.format(ROW_DATA, s, seqName, from == to ? from + : from + (isContactFeature() ? ":" : "-") + to)); + if (mf.isFromCds()) + { + consequence = mf.findProteinVariants(this); + } + } sb.append(String.format(ROW_DATA, "Type", type, "")); String desc = StringUtils.stripHtmlTags(description); sb.append(String.format(ROW_DATA, "Description", desc, "")); @@ -615,6 +634,12 @@ public class SequenceFeature implements FeatureLocationI sb.append(String.format(ROW_DATA, "Group", featureGroup, "")); } + if (!consequence.isEmpty()) + { + sb.append(String.format(ROW_DATA, "Consequence", + "Translated by Jalview", consequence)); + } + if (otherDetails != null) { TreeMap ordered = new TreeMap<>( @@ -638,8 +663,8 @@ public class SequenceFeature implements FeatureLocationI sm.putAll(values); for (Entry e : sm.entrySet()) { - sb.append(String.format(ROW_DATA, key, e.getKey().toString(), e - .getValue().toString())); + sb.append(String.format(ROW_DATA, key, e.getKey().toString(), + e.getValue().toString())); } } else @@ -653,8 +678,8 @@ public class SequenceFeature implements FeatureLocationI String s = entry.getValue().toString(); if (isValueInteresting(key, s, metadata)) { - sb.append(String.format(ROW_DATA, key, attDesc == null ? "" - : attDesc, s)); + sb.append(String.format(ROW_DATA, key, + attDesc == null ? "" : attDesc, s)); } } } @@ -692,9 +717,8 @@ public class SequenceFeature implements FeatureLocationI } FeatureAttributeType attType = metadata.getAttributeType(key); - if (attType != null - && (attType == FeatureAttributeType.Float || attType - .equals(FeatureAttributeType.Integer))) + if (attType != null && (attType == FeatureAttributeType.Float + || attType.equals(FeatureAttributeType.Integer))) { try {