JAL-3187 (hacked up) show complement features on structure/Overview
[jalview.git] / src / jalview / viewmodel / seqfeatures / FeatureRendererModel.java
index 1f69776..821f7f4 100644 (file)
@@ -23,7 +23,12 @@ package jalview.viewmodel.seqfeatures;
 import jalview.api.AlignViewportI;
 import jalview.api.FeatureColourI;
 import jalview.api.FeaturesDisplayedI;
+import jalview.datamodel.AlignedCodonFrame;
 import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Mapping;
+import jalview.datamodel.SearchResultMatchI;
+import jalview.datamodel.SearchResults;
+import jalview.datamodel.SearchResultsI;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.datamodel.features.FeatureMatcherSetI;
@@ -983,7 +988,7 @@ public abstract class FeatureRendererModel
    * @param sequenceFeature
    * @return
    */
-  protected boolean featureGroupNotShown(final SequenceFeature sequenceFeature)
+  public boolean featureGroupNotShown(final SequenceFeature sequenceFeature)
   {
     return featureGroups != null
             && sequenceFeature.featureGroup != null
@@ -998,7 +1003,7 @@ public abstract class FeatureRendererModel
    */
   @Override
   public List<SequenceFeature> findFeaturesAtResidue(SequenceI sequence,
-          int resNo)
+          int fromResNo, int toResNo)
   {
     List<SequenceFeature> result = new ArrayList<>();
     if (!av.areFeaturesDisplayed() || getFeaturesDisplayed() == null)
@@ -1016,7 +1021,7 @@ public abstract class FeatureRendererModel
     String[] visibleTypes = visibleFeatures
             .toArray(new String[visibleFeatures.size()]);
     List<SequenceFeature> features = sequence.getFeatures().findFeatures(
-            resNo, resNo, visibleTypes);
+            fromResNo, toResNo, visibleTypes);
   
     for (SequenceFeature sf : features)
     {
@@ -1150,4 +1155,53 @@ public abstract class FeatureRendererModel
     return filter == null ? true : filter.matches(sf);
   }
 
+  /**
+   * Answers a (possibly empty) list of features in this alignment at a position
+   * (or range) which is mappable from the given sequence residue position in a
+   * mapped alignment.
+   * 
+   * @param sequence
+   * @param pos
+   * @return
+   */
+  public List<SequenceFeature> findComplementFeaturesAtResidue(SequenceI sequence, int pos)
+  {
+    SequenceI ds = sequence.getDatasetSequence();
+    List<SequenceFeature> result = new ArrayList<>();
+    List<AlignedCodonFrame> mappings = this.av.getAlignment()
+            .getCodonFrame(sequence);
+
+    /*
+     * todo: direct lookup of CDS for peptide and vice-versa; for now,
+     * have to search through an unordered list of mappings for a candidate
+     */
+    for (AlignedCodonFrame acf : mappings)
+    {
+      Mapping mapping = acf.getMappingForSequence(sequence, true);
+      if (mapping == null || mapping.getMap().getFromRatio() == mapping
+              .getMap().getToRatio())
+      {
+        continue; // we are only looking for 3:1 or 1:3 mappings
+      }
+      SearchResultsI sr = new SearchResults();
+      acf.markMappedRegion(ds, pos, sr);
+      for (SearchResultMatchI match : sr.getResults())
+      {
+        int fromRes = match.getStart();
+        int toRes = match.getEnd();
+        List<SequenceFeature> fs = findFeaturesAtResidue(
+                match.getSequence(), fromRes, toRes);
+        for (SequenceFeature sf : fs)
+        {
+          if (!result.contains(sf))
+          {
+            result.add(sf);
+          }
+        }
+      }
+    }
+    
+    return result;
+  }
+
 }