JAL-2349 allow PAE or other contact matrices to hold a coordinate mapping allowing...
[jalview.git] / src / jalview / renderer / ContactGeometry.java
index 4aef1d8..2eb325c 100644 (file)
@@ -2,10 +2,23 @@ package jalview.renderer;
 
 import java.util.Iterator;
 
+import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.ContactListI;
-
+import jalview.datamodel.HiddenColumns;
+import jalview.renderer.ContactGeometry.contactInterval;
+
+/**
+ * encapsulate logic for mapping between positions in a ContactList and their
+ * rendered representation in a given number of pixels.
+ * 
+ * @author jprocter
+ *
+ */
 public class ContactGeometry
 {
+  
+  final ContactListI contacts;
+  
   final int pixels_step;
 
   final double contacts_per_pixel;
@@ -14,8 +27,9 @@ public class ContactGeometry
 
   final int graphHeight;
 
-  public ContactGeometry(ContactListI contacts, int graphHeight)
+  public ContactGeometry(final ContactListI contacts, int graphHeight)
   {
+    this.contacts=contacts;
     this.graphHeight = graphHeight;
     contact_height = contacts.getContactHeight();
     // fractional number of contacts covering each pixel
@@ -54,6 +68,47 @@ public class ContactGeometry
     public final int pStart;
 
     public final int pEnd;
+
+  }
+  /**
+   * 
+   * @param columnSelection
+   * @param ci
+   * @param visibleOnly - when true, only test intersection of visible columns given matrix range 
+   * @return true if the range on the matrix specified by ci intersects with selected columns in the ContactListI's reference frame.
+   */
+  
+  boolean intersects(contactInterval ci,ColumnSelection columnSelection, HiddenColumns hiddenColumns,  boolean visibleOnly) {
+    boolean rowsel = false;
+    final int[] mappedRange = contacts.getMappedPositionsFor(ci.cStart, ci.cEnd);
+    if (mappedRange==null)
+    {
+      return false;
+    }
+    boolean containsHidden=false;
+    if (visibleOnly && hiddenColumns!=null && hiddenColumns.hasHiddenColumns())
+    {
+      // TODO: turn into function on hiddenColumns and create test !!
+      Iterator<int[]> viscont = hiddenColumns
+              .getVisContigsIterator(mappedRange[0], mappedRange[1], false);
+      containsHidden = !viscont.hasNext();
+      if (!containsHidden)
+      {
+        for (int[] interval=viscont.next();viscont.hasNext();
+        rowsel |= columnSelection.intersects(interval[0],interval[1]))
+          ;
+      }
+    }
+    else
+    {
+      // if containsHidden is true mappedRange is not visible
+      if (containsHidden)
+      {
+        rowsel = columnSelection.intersects(mappedRange[0], mappedRange[1]);
+      }
+    }
+    return rowsel;
+
   }
 
   /**