JAL-4134 JAL-2349 test & fixed implementation(ish) for getMappedPositionsFor(seq...
[jalview.git] / src / jalview / ws / datamodel / alphafold / MappableContactMatrix.java
index 9a01738..0e617d7 100644 (file)
@@ -193,21 +193,9 @@ public abstract class MappableContactMatrix<T extends MappableContactMatrix<T>>
     {
       throw new Error("Unimplemented when no local sequence given.");
     }
-    // return a ContactListI for column
-    // column is index into localFrame
-    // 1. map column to corresponding column in matrix
-
-    final int _lcolumn = localFrame.findPosition(from);
-    final int _rcolumn = (from == to) ? _lcolumn
-            : localFrame.findPosition(to);
-    if (toSeq == null)
-    {
-      // no mapping
-      return new int[] { _lcolumn, _rcolumn };
-    }
-
     SequenceI lf = localFrame, uf = refSeq;
 
+    // check that localFrame is derived from refSeq
     // just look for dataset sequences and check they are the same.
     // in future we could use DBRefMappings/whatever.
     while (lf.getDatasetSequence() != null
@@ -229,26 +217,45 @@ public abstract class MappableContactMatrix<T extends MappableContactMatrix<T>>
               + "' is not mappable for the given localFrame sequence. ("
               + localFrame.getName() + ")");
     }
+    
+    // now look up from-to matrix columns in toSeq frame
+    
+    if (toSeq == null)
+    {
+      // no mapping - so we assume 1:1
+      return new int[] { from, to };
+    }
+    // from-to are matrix columns
+    // first locate on reference sequence
 
-    int[] mappedPositions = toSeq.locateInFrom(_lcolumn, _rcolumn);
-    // TODO - trim to localFrame ?
-    // if (mappedPositions!=null) {
-    // int s=-1,e=-1;
-    // for (int p=0;p<mappedPositions.length;p++)
-    // {
-    // if (s==-1 && mappedPositions[p]>=localFrame.getStart())
-    // {
-    // s=p; // remember first position within local frame
-    // }
-    // if (e==-1 || mappedPositions[p]<=localFrame.getEnd())
-    // {
-    // // update end pointer
-    // e=p;
-    // // compute local map
-    // mappedPositions[p] = localFrame.findIndex(mappedPositions[p]);
-    // }
-    // }
-    // }
+    int[] mappedPositions = toSeq.locateInFrom(from, to);
+    if (mappedPositions==null)
+    {
+      return null;
+    }
+    
+    // and now map to localFrame
+    // from-to columns on the associated sequence should be
+    // i. restricted to positions in localFrame
+    // ii. 
+
+//    int s = -1, e = -1;
+//    for (int p = 0; p < mappedPositions.length; p++)
+//    {
+//      if (s == -1 && mappedPositions[p] >= localFrame.getStart())
+//      {
+//        s = p; // remember first position within local frame
+//      }
+//      if (e == -1 || mappedPositions[p] <= localFrame.getEnd())
+//      {
+//        // update end pointer
+//        e = p;
+//        // compute local map
+//        mappedPositions[p] = localFrame.findIndex(mappedPositions[p]);
+//      }
+//    }
+//    int[] _trimmed = new int[e - s + 1];
+//    return _trimmed;
     return mappedPositions;
   }