X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FSequenceFeature.java;h=719cf5277d59beecd98f99c095327ff3a7a77de2;hb=6323f1a33650360f131f25cf2797e5600ceee49f;hp=8146400f27e362ff963250d618a97156fcf04b4f;hpb=b6e08d03ffec50725f18b77c174c94e5e49647e7;p=jalview.git diff --git a/src/jalview/datamodel/SequenceFeature.java b/src/jalview/datamodel/SequenceFeature.java index 8146400..719cf52 100755 --- a/src/jalview/datamodel/SequenceFeature.java +++ b/src/jalview/datamodel/SequenceFeature.java @@ -20,6 +20,8 @@ */ package jalview.datamodel; +import jalview.datamodel.features.FeatureLocationI; + import java.util.HashMap; import java.util.Map; import java.util.Vector; @@ -30,7 +32,7 @@ import java.util.Vector; * @author $author$ * @version $Revision$ */ -public class SequenceFeature +public class SequenceFeature implements FeatureLocationI { private static final String STATUS = "status"; @@ -39,6 +41,13 @@ public class SequenceFeature // private key for Phase designed not to conflict with real GFF data private static final String PHASE = "!Phase"; + // private key for ENA location designed not to conflict with real GFF data + private static final String LOCATION = "!Location"; + + /* + * ATTRIBUTES is reserved for the GFF 'column 9' data, formatted as + * name1=value1;name2=value2,value3;...etc + */ private static final String ATTRIBUTES = "ATTRIBUTES"; public int begin; @@ -51,6 +60,10 @@ public class SequenceFeature public String description; + /* + * a map of key-value pairs; may be populated from GFF 'column 9' data, + * other data sources (e.g. GenBank file), or programmatically + */ public Map otherDetails; public Vector links; @@ -111,26 +124,75 @@ public class SequenceFeature } } + /** + * Constructor including a Status value + * + * @param type + * @param desc + * @param status + * @param begin + * @param end + * @param featureGroup + */ public SequenceFeature(String type, String desc, String status, int begin, int end, String featureGroup) { + this(type, desc, begin, end, featureGroup); + setStatus(status); + } + + /** + * Constructor + * + * @param type + * @param desc + * @param begin + * @param end + * @param featureGroup + */ + SequenceFeature(String type, String desc, int begin, int end, + String featureGroup) + { this.type = type; this.description = desc; - setValue(STATUS, status); this.begin = begin; this.end = end; this.featureGroup = featureGroup; } + /** + * Constructor including a score value + * + * @param type + * @param desc + * @param begin + * @param end + * @param score + * @param featureGroup + */ public SequenceFeature(String type, String desc, int begin, int end, float score, String featureGroup) { - this.type = type; - this.description = desc; - this.begin = begin; - this.end = end; + this(type, desc, begin, end, featureGroup); this.score = score; - this.featureGroup = featureGroup; + } + + /** + * A copy constructor that allows the begin and end positions and group to be + * modified + * + * @param sf + * @param newBegin + * @param newEnd + * @param newGroup + */ + public SequenceFeature(SequenceFeature sf, int newBegin, int newEnd, + String newGroup) + { + this(sf); + begin = newBegin; + end = newEnd; + featureGroup = newGroup; } /** @@ -166,7 +228,9 @@ public class SequenceFeature } SequenceFeature sf = (SequenceFeature) o; - if (begin != sf.begin || end != sf.end || score != sf.score) + boolean sameScore = Float.isNaN(score) ? Float.isNaN(sf.score) + : score == sf.score; + if (begin != sf.begin || end != sf.end || !sameScore) { return false; } @@ -224,6 +288,7 @@ public class SequenceFeature * * @return DOCUMENT ME! */ + @Override public int getBegin() { return begin; @@ -239,6 +304,7 @@ public class SequenceFeature * * @return DOCUMENT ME! */ + @Override public int getEnd() { return end; @@ -296,7 +362,10 @@ public class SequenceFeature links = new Vector(); } - links.insertElementAt(labelLink, 0); + if (!links.contains(labelLink)) + { + links.insertElementAt(labelLink, 0); + } } public float getScore() @@ -423,6 +492,12 @@ public class SequenceFeature return strand; } + /** + * Set the value of strand + * + * @param strand + * should be "+" for forward, or "-" for reverse + */ public void setStrand(String strand) { setValue(STRAND, strand); @@ -439,6 +514,26 @@ public class SequenceFeature } /** + * Sets the 'raw' ENA format location specifier e.g. join(12..45,89..121) + * + * @param loc + */ + public void setEnaLocation(String loc) + { + setValue(LOCATION, loc); + } + + /** + * Gets the 'raw' ENA format location specifier e.g. join(12..45,89..121) + * + * @param loc + */ + public String getEnaLocation() + { + return (String) getValue(LOCATION); + } + + /** * Readable representation, for debug only, not guaranteed not to change * between versions */ @@ -462,4 +557,31 @@ public class SequenceFeature return s.hashCode() + getBegin() + getEnd() + (int) getScore() + getStrand(); } + + /** + * Answers true if the feature's start/end values represent two related + * positions, rather than ends of a range. Such features may be visualised or + * reported differently to features on a range. + */ + @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; + } + + /** + * Answers true if the sequence has zero start and end position + * + * @return + */ + public boolean isNonPositional() + { + return begin == 0 && end == 0; + } }