merge from 2_4_Release branch
[jalview.git] / src / org / biojava / dasobert / feature / FeatureTrackConverter.java
index d7dee86..4818e10 100644 (file)
@@ -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;
+  }
 
 }