X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FSequenceFeature.java;h=f17bd3349604541fd923c9da101bf16e77abea80;hb=bab4b08733a9543bdce5c0b9d1c32ca7d18ad9e3;hp=4df57ef5fd2588ff7d5810a1e635d568255eb7b2;hpb=ce4840757da155836d19edb70821fce6d2258d88;p=jalview.git diff --git a/src/jalview/datamodel/SequenceFeature.java b/src/jalview/datamodel/SequenceFeature.java index 4df57ef..f17bd33 100755 --- a/src/jalview/datamodel/SequenceFeature.java +++ b/src/jalview/datamodel/SequenceFeature.java @@ -22,6 +22,7 @@ package jalview.datamodel; import jalview.datamodel.features.FeatureLocationI; +import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -58,9 +59,9 @@ public class SequenceFeature implements FeatureLocationI private static final String ATTRIBUTES = "ATTRIBUTES"; /* - * type, begin, end, featureGroup are final to ensure that - * the integrity of SequenceFeatures data store can't be - * broken by direct update of these fields + * type, begin, end, featureGroup, score and contactFeature are final + * to ensure that the integrity of SequenceFeatures data store + * can't be broken by direct update of these fields */ public final String type; @@ -70,7 +71,9 @@ public class SequenceFeature implements FeatureLocationI public final String featureGroup; - public float score; + public final float score; + + private final boolean contactFeature; public String description; @@ -91,7 +94,8 @@ public class SequenceFeature implements FeatureLocationI */ public SequenceFeature(SequenceFeature cpy) { - this(cpy, cpy.getBegin(), cpy.getEnd(), cpy.getFeatureGroup()); + this(cpy, cpy.getBegin(), cpy.getEnd(), cpy.getFeatureGroup(), cpy + .getScore()); } /** @@ -106,12 +110,7 @@ public class SequenceFeature implements FeatureLocationI public SequenceFeature(String theType, String theDesc, int theBegin, int theEnd, String group) { - this.type = theType; - this.description = theDesc; - this.begin = theBegin; - this.end = theEnd; - this.featureGroup = group; - this.score = NO_SCORE; + this(theType, theDesc, theBegin, theEnd, NO_SCORE, group); } /** @@ -127,28 +126,39 @@ public class SequenceFeature implements FeatureLocationI public SequenceFeature(String theType, String theDesc, int theBegin, int theEnd, float theScore, String group) { - this(theType, theDesc, theBegin, theEnd, group); + this.type = theType; + this.description = theDesc; + this.begin = theBegin; + this.end = theEnd; + this.featureGroup = group; this.score = theScore; + + /* + * for now, only "Disulfide/disulphide bond" is treated as a contact feature + */ + this.contactFeature = "disulfide bond".equalsIgnoreCase(type) + || "disulphide bond".equalsIgnoreCase(type); } /** - * A copy constructor that allows the begin and end positions and group to be - * modified + * A copy constructor that allows the value of final fields to be 'modified' * * @param sf + * @param newType * @param newBegin * @param newEnd * @param newGroup + * @param newScore */ - public SequenceFeature(SequenceFeature sf, int newBegin, int newEnd, - String newGroup) + public SequenceFeature(SequenceFeature sf, String newType, int newBegin, + int newEnd, String newGroup, float newScore) { - this(sf.getType(), newBegin, newEnd, newGroup); - score = sf.score; - description = sf.description; + this(newType, sf.getDescription(), newBegin, newEnd, newScore, + newGroup); + if (sf.otherDetails != null) { - otherDetails = new HashMap(); + otherDetails = new HashMap<>(); for (Entry entry : sf.otherDetails.entrySet()) { otherDetails.put(entry.getKey(), entry.getValue()); @@ -156,7 +166,7 @@ public class SequenceFeature implements FeatureLocationI } if (sf.links != null && sf.links.size() > 0) { - links = new Vector(); + links = new Vector<>(); for (int i = 0, iSize = sf.links.size(); i < iSize; i++) { links.addElement(sf.links.elementAt(i)); @@ -165,20 +175,18 @@ public class SequenceFeature implements FeatureLocationI } /** - * Constructor that sets the final fields type, begin, end, group + * A copy constructor that allows the value of final fields to be 'modified' * - * @param theType - * @param theBegin - * @param theEnd - * @param theGroup + * @param sf + * @param newBegin + * @param newEnd + * @param newGroup + * @param newScore */ - private SequenceFeature(String theType, int theBegin, int theEnd, - String theGroup) + public SequenceFeature(SequenceFeature sf, int newBegin, int newEnd, + String newGroup, float newScore) { - type = theType; - begin = theBegin; - end = theEnd; - featureGroup = theGroup; + this(sf, sf.getType(), newBegin, newEnd, newGroup, newScore); } /** @@ -226,8 +234,8 @@ public class SequenceFeature implements FeatureLocationI return false; } - if (!(type + description + featureGroup + getPhase()).equals(sf.type - + sf.description + sf.featureGroup + sf.getPhase())) + if (!(type + description + featureGroup + getPhase()).equals( + sf.type + sf.description + sf.featureGroup + sf.getPhase())) { return false; } @@ -325,7 +333,7 @@ public class SequenceFeature implements FeatureLocationI { if (links == null) { - links = new Vector(); + links = new Vector<>(); } if (!links.contains(labelLink)) @@ -339,11 +347,6 @@ public class SequenceFeature implements FeatureLocationI return score; } - public void setScore(float value) - { - score = value; - } - /** * Used for getting values which are not in the basic set. eg STRAND, PHASE * for GFF file @@ -392,7 +395,7 @@ public class SequenceFeature implements FeatureLocationI { if (otherDetails == null) { - otherDetails = new HashMap(); + otherDetails = new HashMap<>(); } otherDetails.put(key, value); @@ -521,13 +524,7 @@ public class SequenceFeature implements FeatureLocationI @Override public boolean isContactFeature() { - // TODO abstract one day to a FeatureType class - if ("disulfide bond".equalsIgnoreCase(type) - || "disulphide bond".equalsIgnoreCase(type)) - { - return true; - } - return false; + return contactFeature; } /** @@ -540,3 +537,21 @@ public class SequenceFeature implements FeatureLocationI return begin == 0 && end == 0; } } + +class SFSortByEnd implements Comparator +{ + @Override + public int compare(SequenceFeature a, SequenceFeature b) + { + return a.getEnd() - b.getEnd(); + } +} + +class SFSortByBegin implements Comparator +{ + @Override + public int compare(SequenceFeature a, SequenceFeature b) + { + return a.getBegin() - b.getBegin(); + } +}