X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Forg%2Fbiojava%2Fdasobert%2Ffeature%2FFeatureTrackConverter.java;h=4818e10c971b8dc2c8b07f31d92986c97c134b29;hb=506d60f0e188723ddc91c26824b41ac7034df3fe;hp=d7dee86316125b90d3d9b87f7fadef71a4b7ad04;hpb=60f2d6c034560415fd0139c8bc7df0c19cae1186;p=jalview.git diff --git a/src/org/biojava/dasobert/feature/FeatureTrackConverter.java b/src/org/biojava/dasobert/feature/FeatureTrackConverter.java index d7dee86..4818e10 100644 --- a/src/org/biojava/dasobert/feature/FeatureTrackConverter.java +++ b/src/org/biojava/dasobert/feature/FeatureTrackConverter.java @@ -29,462 +29,498 @@ import java.util.Iterator; import java.util.List; import java.util.Map; - - -/** converts the features from their "raw" representation as a Map - * into a Feature class +/** + * converts the features from their "raw" representation as a Map into a Feature + * class + * * @author Andreas Prlic - * + * */ -public class FeatureTrackConverter { - - public static final Color HELIX_COLOR = new Color(255,51,51); - public static final Color STRAND_COLOR = new Color(255,204,51); - public static final Color TURN_COLOR = new Color(204,204,204); - +public class FeatureTrackConverter +{ - // some annotation types, for which there is a special treatment - public static final String DISULFID_TYPE = "DISULFID"; - public static final String SECSTRUC_TYPE = "SECSTRUC"; - public static final String METAL_TYPE = "METAL"; - public static final String MSD_SITE_TYPE = "MSD_SITE"; + public static final Color HELIX_COLOR = new Color(255, 51, 51); - String type; - public static final String TYPE_HISTOGRAM = "histogram"; - public static final String TYPE_DEFAULT = "default"; + public static final Color STRAND_COLOR = new Color(255, 204, 51); + public static final Color TURN_COLOR = new Color(204, 204, 204); - // rotate between these colors - public static final Color[] entColors = new Color []{ - new Color(51,51,255), // blue - new Color(102,255,255), // cyan - new Color(153,255,153), // green - new Color(153,255,153), // green - new Color(255,153,153), // pink - new Color(255,51,51), // red - new Color(255,51,255) // pink - }; - - public static final String[] txtColors = new String[] { - "blue", - "pink", - "green", - "yellow", - "red", - "cyan", - "pink"}; + // some annotation types, for which there is a special treatment + public static final String DISULFID_TYPE = "DISULFID"; - Map[] stylesheet; + public static final String SECSTRUC_TYPE = "SECSTRUC"; - boolean isHistogram = false; + public static final String METAL_TYPE = "METAL"; + public static final String MSD_SITE_TYPE = "MSD_SITE"; - public FeatureTrackConverter(){ - type = TYPE_DEFAULT; - stylesheet = new Map[0]; - } - - public FeatureTrackConverter(Map[] stylesheet){ - - if (stylesheet == null) - stylesheet = new Map[0]; - - this.stylesheet = stylesheet; - - } - - - public FeatureTrackConverter(Map[] stylesheet, boolean isHistogram){ - this(stylesheet); - this.isHistogram = isHistogram; - if ( isHistogram) - type = TYPE_HISTOGRAM; - } - public String getType() { - return type; - } + String type; - public void setType(String type) { - if ( type.equals(TYPE_HISTOGRAM)) - isHistogram = true; - this.type = type; - } + public static final String TYPE_HISTOGRAM = "histogram"; - public boolean isHistogram() { - return isHistogram; - } - - - public void setHistogram(boolean isHistogram) { - this.isHistogram = isHistogram; - } - - - - - - public FeatureTrack[] convertMap2Features(Map[] mapfeatures){ - List features = new ArrayList(); - - boolean first = true ; - boolean secstruc = false ; - boolean isGroup = false; - - FeatureTrack feat = null ; - Segment segment = null ; - - int featuresCounter = 0; - String prevGroup = null; - - for (int i = 0 ; i< mapfeatures.length;i++) { - - Map currentFeatureMap = mapfeatures[i]; - String type = (String) currentFeatureMap.get("TYPE") ; - - - - String group = (String) currentFeatureMap.get("GROUP"); - if ( group != null){ - if ( prevGroup != null) { - if ( group.equals(prevGroup)){ - feat.setName(group); - isGroup = true; - } else { - isGroup = false; - } - } else { - isGroup = false; - } - } else { - isGroup = false; - } - - // we are skipping literature references for the moment - // TODO: add a display to spice for non-positional features - // - if ( type.equals("reference") || type.equals("GOA")){ - continue ; - } - - if (! first) - { - // if not first feature - - if ( (! secstruc ) && (! isGroup) ) { - - // if not secondary structure and not in a group ... - features = testAddFeatures(features,feat); - - - } else if ( ! - ( - type.equals("HELIX") || - type.equals("STRAND") || - type.equals("TURN") - ) - ) - { - // end of secondary structure - secstruc = false ; - if ( feat != null && (! isGroup)) { - features = testAddFeatures(features,feat); - } - - } - } // end of not first - - first = false ; - if ( (! secstruc) && (! isGroup)) { - featuresCounter +=1; - feat = getNewFeat(currentFeatureMap); - } - - - - - if (type.equals("STRAND")){ - secstruc = true ; - currentFeatureMap.put("colorTxt","yellow"); - feat.setName("SECSTRUC"); - feat.setType("SECSTRUC"); - } - - else if (type.equals("HELIX")) { - secstruc = true ; - currentFeatureMap.put("colorTxt","red"); - feat.setName("SECSTRUC"); - feat.setType("SECSTRUC"); - } - - else if (type.equals("TURN")) { - secstruc = true ; - currentFeatureMap.put("colorTxt","white"); - - feat.setName("SECSTRUC"); - feat.setType("SECSTRUC"); - } - else { - secstruc = false ; - currentFeatureMap.put("colorTxt",txtColors[featuresCounter%txtColors.length]); - if ( ! isGroup) { - try { - feat.setName(type); - - } catch ( NullPointerException e) { - //e.printStackTrace(); - feat.setName("null"); - } - } - } - - segment = getNewSegment(currentFeatureMap); - - feat.addSegment(segment); - prevGroup = group; - } - - if ( feat != null) - features =testAddFeatures(features,feat); - - - return (FeatureTrack[]) features.toArray(new FeatureTrack[features.size()]); - } - - /** test if this features is added as a new feature to the features list, - * or if it is joint with an already existing one... - * - * @param features - * @param newFeature - * @return a List of FeatureTrack objects - */ - protected List testAddFeatures(List features,FeatureTrack newFeature){ - - //System.out.println("testing " + newFeature + " " + newFeature.getScore()); - Iterator iter = features.iterator(); - - - if ( isHistogramFeatureType(newFeature)) { - - // return histogram type features - type = TYPE_HISTOGRAM; - - Segment seg = getHistogramSegmentFromFeature(newFeature); - - while (iter.hasNext()){ - FeatureTrack knownFeature = (FeatureTrack) iter.next() ; - String knownType = knownFeature.getType(); - - //System.out.println("found histogram style " + feat); - // set type of this DAS source to being HISTOGRAM style - - - if ( knownType.equals(newFeature.getType())){ - // convert the feature into a HistogramSegment and add to the already known feature - - knownFeature.addSegment(seg); - // we can return now - return features; - } - - - } - // we could not link this to any existing feature - // convert it to a new HistogramFeature - HistogramFeature hfeat = new HistogramFeature(); - - hfeat.setLink(newFeature.getLink()); - hfeat.setMethod(newFeature.getMethod()); - hfeat.setName(newFeature.getName()); - hfeat.setNote(newFeature.getNote()); - hfeat.setScore("0"); - hfeat.setSource(newFeature.getSource()); - hfeat.addSegment(seg); - hfeat.setType(newFeature.getType()); - - newFeature = hfeat; - features.add(newFeature); - return features; - } - - - - while (iter.hasNext()){ - FeatureTrack knownFeature = (FeatureTrack) iter.next() ; - // this only compares method source and type ... - boolean sameFeat = false; - if ( knownFeature.equals(newFeature)) - sameFeat = true; - - if ( ( knownFeature.getSource().equals(newFeature.getSource() )) && - ( knownFeature.getMethod().equals(newFeature.getMethod())) && - ( knownFeature.getNote().equals(newFeature.getNote())) && - isSecondaryStructureFeat(knownFeature) && - isSecondaryStructureFeat(newFeature)) - sameFeat =true; - - if ( sameFeat) { - - // seems to be of same type, method and source, so check if the segments can be joined - - List tmpsegs = knownFeature.getSegments(); - Iterator segiter = tmpsegs.iterator(); - List newsegs = newFeature.getSegments(); - Iterator newsegsiter = newsegs.iterator(); - boolean overlap = false; - while (newsegsiter.hasNext()){ - Segment newseg = (Segment)newsegsiter.next(); - - - while (segiter.hasNext()){ - Segment tmpseg = (Segment) segiter.next(); - - if ( tmpseg.overlaps(newseg)) - overlap = true; - } - } - - if ( ! overlap){ - // add all new segments to old features... - newsegsiter = newsegs.iterator(); - while (newsegsiter.hasNext()){ - Segment newseg = (Segment)newsegsiter.next(); - knownFeature.addSegment(newseg); - } - - return features; - } - } - - } - - // if we get here, the features could not be joint with any other one, so there is always some overlap - // add to the list of known features - features.add(newFeature); - return features; - } - - private FeatureTrack getNewFeat(Map currentFeatureMap) { - FeatureTrack feat = new FeatureTrackImpl(); - //logger.finest(currentFeatureMap); - //System.out.println("DrawableDasSource " + currentFeatureMap); - feat.setSource((String)currentFeatureMap.get("dassource")); - feat.setName( (String)currentFeatureMap.get("NAME")); - feat.setType( (String)currentFeatureMap.get("TYPE")); - feat.setLink( (String)currentFeatureMap.get("LINK")); - feat.setNote( (String)currentFeatureMap.get("NOTE")); - - String typeID = (String) currentFeatureMap.get("TYPE_ID"); - String typeCategory = (String) currentFeatureMap.get("TYPE_CATEGORY"); - feat.setTypeID(typeID); - feat.setTypeCategory(typeCategory); - - String method = (String)currentFeatureMap.get("METHOD"); - if ( method == null) { method = "";} - feat.setMethod(method); - feat.setScore( (String)currentFeatureMap.get("SCORE")); - return feat ; - } - - private Segment getNewSegment(Map featureMap) { - Segment s = new SegmentImpl(); - String sstart = (String)featureMap.get("START") ; - String send = (String)featureMap.get("END") ; - int start = Integer.parseInt(sstart) ; - int end = Integer.parseInt(send) ; - s.setStart(start); - s.setEnd(end); - s.setName((String)featureMap.get("TYPE")); - s.setTxtColor((String)featureMap.get("colorTxt")); - s.setColor((Color)featureMap.get("color")); - s.setNote((String) featureMap.get("NOTE")); - return s ; - - } - - private boolean isSecondaryStructureFeat(FeatureTrack feat){ - String type = feat.getType(); - if ( - type.equals("HELIX") || - type.equals("STRAND") || - type.equals("TURN") - ) return true; - return false; - } - - private boolean isHistogramFeatureType(FeatureTrack feat){ - String ftype = feat.getType(); - - Map[] style = stylesheet; - - //System.out.println("is HistogramFeature type " + ftype + " " + style ); - - - // todo : move this info into a config file... - - if ( ftype.equals("hydrophobicity")){ - return true; - } - if ( getType().equals(TYPE_HISTOGRAM) ) - return true; - - - - if (style != null ) { - - for ( int i =0; i< style.length ; i++){ - Map m = style[i]; - - // make sure the stylesheet is for this feature type - String styleType = (String) m.get("type"); - if ( styleType != null) { - if ( ! styleType.equals(ftype)){ - continue; - } - } else { - continue; - } - - String type = (String) m.get("style"); - if ( type != null) { - //System.out.println("stylesheet type " + type); - if ( type.equals("gradient") || ( type.equals("lineplot")) || ( type.equals("histogram"))){ - - return true; - } - } - } - } - - return false; - } - - - private HistogramSegment getHistogramSegmentFromFeature(FeatureTrack feat){ - HistogramSegment s = new HistogramSegment(); - - double score = 0.0; - - try { - score = Double.parseDouble(feat.getScore()); - - } catch (Exception e){ - //e.printStackTrace(); - } - s.setScore(score); - List segments = feat.getSegments(); - if (segments.size() > 0){ - Segment seg = (Segment) segments.get(0); - s.setName(seg.getName()); - s.setStart(seg.getStart()); - s.setEnd(seg.getEnd()); - s.setNote(seg.getNote()); - s.setColor(seg.getColor()); - s.setTxtColor(seg.getTxtColor()); - } - - - return s; - } + public static final String TYPE_DEFAULT = "default"; + // rotate between these colors + public static final Color[] entColors = new Color[] + { new Color(51, 51, 255), // blue + new Color(102, 255, 255), // cyan + new Color(153, 255, 153), // green + new Color(153, 255, 153), // green + new Color(255, 153, 153), // pink + new Color(255, 51, 51), // red + new Color(255, 51, 255) // pink + }; + + public static final String[] txtColors = new String[] + { "blue", "pink", "green", "yellow", "red", "cyan", "pink" }; + + Map[] stylesheet; + + boolean isHistogram = false; + + public FeatureTrackConverter() + { + type = TYPE_DEFAULT; + stylesheet = new Map[0]; + } + + public FeatureTrackConverter(Map[] stylesheet) + { + + if (stylesheet == null) + stylesheet = new Map[0]; + + this.stylesheet = stylesheet; + + } + + public FeatureTrackConverter(Map[] stylesheet, boolean isHistogram) + { + this(stylesheet); + this.isHistogram = isHistogram; + if (isHistogram) + type = TYPE_HISTOGRAM; + } + + public String getType() + { + return type; + } + + public void setType(String type) + { + if (type.equals(TYPE_HISTOGRAM)) + isHistogram = true; + this.type = type; + } + + public boolean isHistogram() + { + return isHistogram; + } + + public void setHistogram(boolean isHistogram) + { + this.isHistogram = isHistogram; + } + + public FeatureTrack[] convertMap2Features(Map[] mapfeatures) + { + List features = new ArrayList(); + + boolean first = true; + boolean secstruc = false; + boolean isGroup = false; + + FeatureTrack feat = null; + Segment segment = null; + + int featuresCounter = 0; + String prevGroup = null; + + for (int i = 0; i < mapfeatures.length; i++) + { + + Map currentFeatureMap = mapfeatures[i]; + String type = (String) currentFeatureMap.get("TYPE"); + + String group = (String) currentFeatureMap.get("GROUP"); + if (group != null) + { + if (prevGroup != null) + { + if (group.equals(prevGroup)) + { + feat.setName(group); + isGroup = true; + } + else + { + isGroup = false; + } + } + else + { + isGroup = false; + } + } + else + { + isGroup = false; + } + + // we are skipping literature references for the moment + // TODO: add a display to spice for non-positional features + // + if (type.equals("reference") || type.equals("GOA")) + { + continue; + } + + if (!first) + { + // if not first feature + + if ((!secstruc) && (!isGroup)) + { + + // if not secondary structure and not in a group ... + features = testAddFeatures(features, feat); + + } + else if (!(type.equals("HELIX") || type.equals("STRAND") || type + .equals("TURN"))) + { + // end of secondary structure + secstruc = false; + if (feat != null && (!isGroup)) + { + features = testAddFeatures(features, feat); + } + + } + } // end of not first + + first = false; + if ((!secstruc) && (!isGroup)) + { + featuresCounter += 1; + feat = getNewFeat(currentFeatureMap); + } + + if (type.equals("STRAND")) + { + secstruc = true; + currentFeatureMap.put("colorTxt", "yellow"); + feat.setName("SECSTRUC"); + feat.setType("SECSTRUC"); + } + + else if (type.equals("HELIX")) + { + secstruc = true; + currentFeatureMap.put("colorTxt", "red"); + feat.setName("SECSTRUC"); + feat.setType("SECSTRUC"); + } + + else if (type.equals("TURN")) + { + secstruc = true; + currentFeatureMap.put("colorTxt", "white"); + + feat.setName("SECSTRUC"); + feat.setType("SECSTRUC"); + } + else + { + secstruc = false; + currentFeatureMap.put("colorTxt", txtColors[featuresCounter + % txtColors.length]); + if (!isGroup) + { + try + { + feat.setName(type); + + } catch (NullPointerException e) + { + // e.printStackTrace(); + feat.setName("null"); + } + } + } + + segment = getNewSegment(currentFeatureMap); + + feat.addSegment(segment); + prevGroup = group; + } + + if (feat != null) + features = testAddFeatures(features, feat); + + return (FeatureTrack[]) features.toArray(new FeatureTrack[features + .size()]); + } + + /** + * test if this features is added as a new feature to the features list, or if + * it is joint with an already existing one... + * + * @param features + * @param newFeature + * @return a List of FeatureTrack objects + */ + protected List testAddFeatures(List features, FeatureTrack newFeature) + { + + // System.out.println("testing " + newFeature + " " + + // newFeature.getScore()); + Iterator iter = features.iterator(); + + if (isHistogramFeatureType(newFeature)) + { + + // return histogram type features + type = TYPE_HISTOGRAM; + + Segment seg = getHistogramSegmentFromFeature(newFeature); + + while (iter.hasNext()) + { + FeatureTrack knownFeature = (FeatureTrack) iter.next(); + String knownType = knownFeature.getType(); + + // System.out.println("found histogram style " + feat); + // set type of this DAS source to being HISTOGRAM style + + if (knownType.equals(newFeature.getType())) + { + // convert the feature into a HistogramSegment and add to the already + // known feature + + knownFeature.addSegment(seg); + // we can return now + return features; + } + + } + // we could not link this to any existing feature + // convert it to a new HistogramFeature + HistogramFeature hfeat = new HistogramFeature(); + + hfeat.setLink(newFeature.getLink()); + hfeat.setMethod(newFeature.getMethod()); + hfeat.setName(newFeature.getName()); + hfeat.setNote(newFeature.getNote()); + hfeat.setScore("0"); + hfeat.setSource(newFeature.getSource()); + hfeat.addSegment(seg); + hfeat.setType(newFeature.getType()); + + newFeature = hfeat; + features.add(newFeature); + return features; + } + + while (iter.hasNext()) + { + FeatureTrack knownFeature = (FeatureTrack) iter.next(); + // this only compares method source and type ... + boolean sameFeat = false; + if (knownFeature.equals(newFeature)) + sameFeat = true; + + if ((knownFeature.getSource().equals(newFeature.getSource())) + && (knownFeature.getMethod().equals(newFeature.getMethod())) + && (knownFeature.getNote().equals(newFeature.getNote())) + && isSecondaryStructureFeat(knownFeature) + && isSecondaryStructureFeat(newFeature)) + sameFeat = true; + + if (sameFeat) + { + + // seems to be of same type, method and source, so check if the segments + // can be joined + + List tmpsegs = knownFeature.getSegments(); + Iterator segiter = tmpsegs.iterator(); + List newsegs = newFeature.getSegments(); + Iterator newsegsiter = newsegs.iterator(); + boolean overlap = false; + while (newsegsiter.hasNext()) + { + Segment newseg = (Segment) newsegsiter.next(); + + while (segiter.hasNext()) + { + Segment tmpseg = (Segment) segiter.next(); + + if (tmpseg.overlaps(newseg)) + overlap = true; + } + } + + if (!overlap) + { + // add all new segments to old features... + newsegsiter = newsegs.iterator(); + while (newsegsiter.hasNext()) + { + Segment newseg = (Segment) newsegsiter.next(); + knownFeature.addSegment(newseg); + } + + return features; + } + } + + } + + // if we get here, the features could not be joint with any other one, so + // there is always some overlap + // add to the list of known features + features.add(newFeature); + return features; + } + + private FeatureTrack getNewFeat(Map currentFeatureMap) + { + FeatureTrack feat = new FeatureTrackImpl(); + // logger.finest(currentFeatureMap); + // System.out.println("DrawableDasSource " + currentFeatureMap); + feat.setSource((String) currentFeatureMap.get("dassource")); + feat.setName((String) currentFeatureMap.get("NAME")); + feat.setType((String) currentFeatureMap.get("TYPE")); + feat.setLink((String) currentFeatureMap.get("LINK")); + feat.setNote((String) currentFeatureMap.get("NOTE")); + + String typeID = (String) currentFeatureMap.get("TYPE_ID"); + String typeCategory = (String) currentFeatureMap.get("TYPE_CATEGORY"); + feat.setTypeID(typeID); + feat.setTypeCategory(typeCategory); + + String method = (String) currentFeatureMap.get("METHOD"); + if (method == null) + { + method = ""; + } + feat.setMethod(method); + feat.setScore((String) currentFeatureMap.get("SCORE")); + return feat; + } + + private Segment getNewSegment(Map featureMap) + { + Segment s = new SegmentImpl(); + String sstart = (String) featureMap.get("START"); + String send = (String) featureMap.get("END"); + int start = Integer.parseInt(sstart); + int end = Integer.parseInt(send); + s.setStart(start); + s.setEnd(end); + s.setName((String) featureMap.get("TYPE")); + s.setTxtColor((String) featureMap.get("colorTxt")); + s.setColor((Color) featureMap.get("color")); + s.setNote((String) featureMap.get("NOTE")); + return s; + + } + + private boolean isSecondaryStructureFeat(FeatureTrack feat) + { + String type = feat.getType(); + if (type.equals("HELIX") || type.equals("STRAND") + || type.equals("TURN")) + return true; + return false; + } + + private boolean isHistogramFeatureType(FeatureTrack feat) + { + String ftype = feat.getType(); + + Map[] style = stylesheet; + + // System.out.println("is HistogramFeature type " + ftype + " " + style ); + + // todo : move this info into a config file... + + if (ftype.equals("hydrophobicity")) + { + return true; + } + if (getType().equals(TYPE_HISTOGRAM)) + return true; + + if (style != null) + { + + for (int i = 0; i < style.length; i++) + { + Map m = style[i]; + + // make sure the stylesheet is for this feature type + String styleType = (String) m.get("type"); + if (styleType != null) + { + if (!styleType.equals(ftype)) + { + continue; + } + } + else + { + continue; + } + + String type = (String) m.get("style"); + if (type != null) + { + // System.out.println("stylesheet type " + type); + if (type.equals("gradient") || (type.equals("lineplot")) + || (type.equals("histogram"))) + { + + return true; + } + } + } + } + + return false; + } + + private HistogramSegment getHistogramSegmentFromFeature(FeatureTrack feat) + { + HistogramSegment s = new HistogramSegment(); + + double score = 0.0; + + try + { + score = Double.parseDouble(feat.getScore()); + + } catch (Exception e) + { + // e.printStackTrace(); + } + s.setScore(score); + List segments = feat.getSegments(); + if (segments.size() > 0) + { + Segment seg = (Segment) segments.get(0); + s.setName(seg.getName()); + s.setStart(seg.getStart()); + s.setEnd(seg.getEnd()); + s.setNote(seg.getNote()); + s.setColor(seg.getColor()); + s.setTxtColor(seg.getTxtColor()); + } + + return s; + } }