JAL-3725 restrict mapped virtual feature location to mapped region
[jalview.git] / src / jalview / datamodel / MappedFeatures.java
index 520ff92..57c8c37 100644 (file)
@@ -1,3 +1,23 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.datamodel;
 
 import java.util.HashSet;
@@ -29,21 +49,16 @@ public class MappedFeatures
   /*
    * the sequence the mapped features are on
    */
-  private final SequenceI linkedSeq;
+  private final SequenceI featureSequence;
 
   /*
    * the mapping between sequences;
-   * NB this could be in either sense
+   * NB this could be in either sense (from or to featureSequence)
    */
   private final Mapping mapping;
 
   /*
-   * if true, mapping is from the linked sequence, else to the linked sequence
-   */
-  private boolean mappingIsFromLinkedSequence;
-
-  /*
-   * features on linkedSeq that overlap the mapped positions
+   * features on featureSequence that overlap the mapped positions
    */
   public final List<SequenceFeature> features;
 
@@ -70,22 +85,23 @@ public class MappedFeatures
    * Constructor
    * 
    * @param theMapping
-   * @param from
-   *                      the sequence mapped from (e.g. CDS)
+   *          sequence mapping (which may be either to, or from, the sequence
+   *          holding the linked features)
+   * @param featureSeq
+   *          the sequence hosting the virtual features
    * @param pos
-   *                      the residue position in the sequence mapped to
+   *          the residue position in the sequence mapped to
    * @param res
-   *                      the residue character at position pos
+   *          the residue character at position pos
    * @param theFeatures
-   *                      list of mapped features found in the 'from' sequence at
-   *                      the mapped position(s)
+   *          list of mapped features found in the 'featureSeq' sequence at the
+   *          mapped position(s)
    */
-  public MappedFeatures(Mapping theMapping, SequenceI from, int pos,
+  public MappedFeatures(Mapping theMapping, SequenceI featureSeq, int pos,
           char res, List<SequenceFeature> theFeatures)
   {
     mapping = theMapping;
-    linkedSeq = from;
-    mappingIsFromLinkedSequence = mapping.to != linkedSeq;
+    featureSequence = featureSeq;
     toPosition = pos;
     toResidue = res;
     features = theFeatures;
@@ -101,13 +117,13 @@ public class MappedFeatures
     {
       codonPos = codonPositions;
       baseCodon = new char[3];
-      int cdsStart = linkedSeq.getStart();
+      int cdsStart = featureSequence.getStart();
       baseCodon[0] = Character
-              .toUpperCase(linkedSeq.getCharAt(codonPos[0] - cdsStart));
+              .toUpperCase(featureSequence.getCharAt(codonPos[0] - cdsStart));
       baseCodon[1] = Character
-              .toUpperCase(linkedSeq.getCharAt(codonPos[1] - cdsStart));
+              .toUpperCase(featureSequence.getCharAt(codonPos[1] - cdsStart));
       baseCodon[2] = Character
-              .toUpperCase(linkedSeq.getCharAt(codonPos[2] - cdsStart));
+              .toUpperCase(featureSequence.getCharAt(codonPos[2] - cdsStart));
     }
     else
     {
@@ -255,7 +271,7 @@ public class MappedFeatures
    */
   public String getLinkedSequenceName()
   {
-    return linkedSeq == null ? null : linkedSeq.getName();
+    return featureSequence == null ? null : featureSequence.getName();
   }
 
   /**
@@ -278,16 +294,22 @@ public class MappedFeatures
   public int[] getMappedPositions(int begin, int end)
   {
     MapList map = mapping.getMap();
-    return mappingIsFromLinkedSequence ? map.locateInTo(begin, end)
-            : map.locateInFrom(begin, end);
+    return mapping.to == featureSequence ? map.getOverlapsInFrom(begin, end)
+            : map.getOverlapsInTo(begin, end);
   }
 
+  /**
+   * Answers true if the linked features are on coding sequence, false if on
+   * peptide
+   * 
+   * @return
+   */
   public boolean isFromCds()
   {
     if (mapping.getMap().getFromRatio() == 3)
     {
-      return mappingIsFromLinkedSequence;
+      return mapping.to != featureSequence;
     }
-    return !mappingIsFromLinkedSequence;
+    return mapping.to == featureSequence;
   }
 }