JAL-2110 bug fixing and tidying for get cross-refs
[jalview.git] / src / jalview / datamodel / AlignedCodonFrame.java
index 5d00b6b..18aaecf 100644 (file)
@@ -60,14 +60,15 @@ public class AlignedCodonFrame
     }
 
     /**
-     * Returns a hashCode derived from the hashcodes of the mappings
+     * Returns a hashCode derived from the hashcodes of the mappings and fromSeq
      * 
      * @see SequenceToSequenceMapping#hashCode()
      */
     @Override
     public int hashCode()
     {
-      return mappings.hashCode();
+      return (fromSeq == null ? 0 : fromSeq.hashCode() * 31)
+              + mapping.hashCode();
     }
 
     /**
@@ -88,7 +89,12 @@ public class AlignedCodonFrame
       {
         return that.mapping == null;
       }
-      return this.mapping.equals(that.mapping);
+      // TODO: can simplify by asserting fromSeq is a dataset sequence
+      return (this.fromSeq == that.fromSeq || (this.fromSeq != null
+              && that.fromSeq != null
+              && this.fromSeq.getDatasetSequence() != null && this.fromSeq
+              .getDatasetSequence() == that.fromSeq
+              .getDatasetSequence())) && this.mapping.equals(that.mapping);
     }
 
     public SequenceI getFromSeq()
@@ -696,7 +702,7 @@ public class AlignedCodonFrame
   }
 
   /**
-   * Returns the first mapping found that is from 'fromSeq' to 'toSeq', or null
+   * Returns the first mapping found that is between 'fromSeq' and 'toSeq', or null
    * if none found
    * 
    * @param fromSeq
@@ -707,12 +713,17 @@ public class AlignedCodonFrame
    */
   public Mapping getMappingBetween(SequenceI fromSeq, SequenceI toSeq)
   {
+    SequenceI dssFrom = fromSeq.getDatasetSequence() == null ? fromSeq
+            : fromSeq.getDatasetSequence();
+    SequenceI dssTo = toSeq.getDatasetSequence() == null ? toSeq : toSeq
+            .getDatasetSequence();
+
     for (SequenceToSequenceMapping mapping : mappings)
     {
       SequenceI from = mapping.fromSeq;
       SequenceI to = mapping.mapping.to;
-      if ((from == fromSeq || from == fromSeq.getDatasetSequence())
-              && (to == toSeq || to == toSeq.getDatasetSequence()))
+      if ((from == dssFrom && to == dssTo)
+              || (from == dssTo && to == dssFrom))
       {
         return mapping.mapping;
       }