JAL-2349 reusable contact map holder for SequenceI and AnnotatedCollectionI
authorJim Procter <j.procter@dundee.ac.uk>
Sat, 15 Oct 2022 12:00:00 +0000 (13:00 +0100)
committerJim Procter <j.procter@dundee.ac.uk>
Sat, 15 Oct 2022 12:00:00 +0000 (13:00 +0100)
src/jalview/datamodel/Alignment.java
src/jalview/datamodel/AlignmentI.java
src/jalview/datamodel/AnnotatedCollectionI.java
src/jalview/datamodel/ContactMapHolder.java [new file with mode: 0644]
src/jalview/datamodel/ContactMapHolderI.java [new file with mode: 0644]
src/jalview/datamodel/Sequence.java
src/jalview/datamodel/SequenceGroup.java
src/jalview/datamodel/SequenceI.java

index 0aa8424..e1c87a9 100755 (executable)
@@ -26,7 +26,6 @@ import java.util.BitSet;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
@@ -2034,52 +2033,35 @@ public class Alignment implements AlignmentI, AutoCloseable
     }
   }
 
-  Map<Object, ContactMatrixI> contactmaps = new HashMap<>();
+  ////
+  //// Contact Matrix Holder Boilerplate
+  ////
+  ContactMapHolder cmholder = new ContactMapHolder();
 
   @Override
   public Collection<ContactMatrixI> getContactMaps()
   {
-    if (contactmaps != null && contactmaps.size() > 0)
-    {
-      return contactmaps.values();
-    }
-    return Collections.EMPTY_LIST;
+    return cmholder.getContactMaps();
   }
 
   @Override
   public ContactListI getContactListFor(AlignmentAnnotation _aa, int column)
   {
-    ContactMatrixI cm = contactmaps.get(_aa.annotationId);
-    if (cm == null)
-    {
-      return null;
-    }
-    return cm.getContactList(column);
+    return cmholder.getContactListFor(_aa, column);
   }
 
   @Override
   public AlignmentAnnotation addContactList(ContactMatrixI cm)
   {
+    AlignmentAnnotation aa = cmholder.addContactList(cm);
+
     Annotation _aa[] = new Annotation[getWidth()];
     Annotation dummy = new Annotation(0.0f);
     for (int i = 0; i < _aa.length; _aa[i++] = dummy)
     {
       ;
     }
-    AlignmentAnnotation aa = new AlignmentAnnotation("Contact Matrix",
-            "Contact Matrix", _aa);
-    aa.graph = AlignmentAnnotation.CUSTOMRENDERER;
-    aa.graphMin = cm.getMin();
-    aa.graphMax = cm.getMax();
-    aa.editable = false;
-    // aa.autoCalculated = true;
-    contactmaps.put(aa.annotationId, cm);
-    // TODO: contact matrices could be intra or inter - more than one refseq
-    // possible!
-    if (cm.hasReferenceSeq())
-    {
-      aa.setSequenceRef(cm.getReferenceSeq());
-    }
+    aa.annotations = _aa;
     addAnnotation(aa);
     return aa;
   }
index 93a8c26..e99563b 100755 (executable)
@@ -20,7 +20,6 @@
  */
 package jalview.datamodel;
 
-import java.util.Collection;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
@@ -624,18 +623,4 @@ public interface AlignmentI extends AnnotatedCollectionI
    */
   public HiddenColumns propagateInsertions(SequenceI profileseq,
           AlignmentView input);
-
-  /**
-   * resolve a contact list instance (if any) associated with the annotation row
-   * and column position
-   * 
-   * @param _aa
-   * @param column
-   * @return
-   */
-  ContactListI getContactListFor(AlignmentAnnotation _aa, int column);
-
-  AlignmentAnnotation addContactList(ContactMatrixI cm);
-
-  Collection<ContactMatrixI> getContactMaps();
 }
index 2963fd5..17c29ef 100644 (file)
@@ -20,7 +20,8 @@
  */
 package jalview.datamodel;
 
-public interface AnnotatedCollectionI extends SequenceCollectionI
+public interface AnnotatedCollectionI
+        extends SequenceCollectionI, ContactMapHolderI
 {
 
   /**
diff --git a/src/jalview/datamodel/ContactMapHolder.java b/src/jalview/datamodel/ContactMapHolder.java
new file mode 100644 (file)
index 0000000..5ef2b2a
--- /dev/null
@@ -0,0 +1,53 @@
+package jalview.datamodel;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ContactMapHolder implements ContactMapHolderI
+{
+
+  Map<Object, ContactMatrixI> contactmaps = new HashMap<>();
+
+  @Override
+  public Collection<ContactMatrixI> getContactMaps()
+  {
+    if (contactmaps != null && contactmaps.size() > 0)
+    {
+      return contactmaps.values();
+    }
+    return Collections.EMPTY_LIST;
+  }
+
+  @Override
+  public ContactListI getContactListFor(AlignmentAnnotation _aa, int column)
+  {
+    ContactMatrixI cm = contactmaps.get(_aa.annotationId);
+    if (cm == null)
+    {
+      return null;
+    }
+    return cm.getContactList(column);
+  }
+
+  @Override
+  public AlignmentAnnotation addContactList(ContactMatrixI cm)
+  {
+    AlignmentAnnotation aa = new AlignmentAnnotation("Contact Matrix",
+            "Contact Matrix", new Annotation[0]);
+    aa.graph = AlignmentAnnotation.CUSTOMRENDERER;
+    aa.graphMin = cm.getMin();
+    aa.graphMax = cm.getMax();
+    aa.editable = false;
+    // aa.autoCalculated = true;
+    contactmaps.put(aa.annotationId, cm);
+    // TODO: contact matrices could be intra or inter - more than one refseq
+    // possible!
+    if (cm.hasReferenceSeq())
+    {
+      aa.setSequenceRef(cm.getReferenceSeq());
+    }
+    return aa;
+  }
+}
diff --git a/src/jalview/datamodel/ContactMapHolderI.java b/src/jalview/datamodel/ContactMapHolderI.java
new file mode 100644 (file)
index 0000000..624a03e
--- /dev/null
@@ -0,0 +1,21 @@
+package jalview.datamodel;
+
+import java.util.Collection;
+
+public interface ContactMapHolderI
+{
+  /**
+   * resolve a contact list instance (if any) associated with the annotation row
+   * and column position
+   * 
+   * @param _aa
+   * @param column
+   * @return
+   */
+  ContactListI getContactListFor(AlignmentAnnotation _aa, int column);
+
+  AlignmentAnnotation addContactList(ContactMatrixI cm);
+
+  Collection<ContactMatrixI> getContactMaps();
+
+}
index f8e70b1..d62be17 100755 (executable)
  */
 package jalview.datamodel;
 
-import jalview.analysis.AlignSeq;
-import jalview.datamodel.features.SequenceFeatures;
-import jalview.datamodel.features.SequenceFeaturesI;
-import jalview.util.Comparison;
-import jalview.util.DBRefUtils;
-import jalview.util.MapList;
-import jalview.util.StringUtils;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.BitSet;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.Iterator;
@@ -39,6 +32,13 @@ import java.util.ListIterator;
 import java.util.Vector;
 
 import fr.orsay.lri.varna.models.rna.RNA;
+import jalview.analysis.AlignSeq;
+import jalview.datamodel.features.SequenceFeatures;
+import jalview.datamodel.features.SequenceFeaturesI;
+import jalview.util.Comparison;
+import jalview.util.DBRefUtils;
+import jalview.util.MapList;
+import jalview.util.StringUtils;
 
 /**
  * 
@@ -2107,4 +2107,38 @@ public class Sequence extends ASequence implements SequenceI
     // otherwise, sequence was completely hidden
     return 0;
   }
+
+  ////
+  //// Contact Matrix Holder Boilerplate
+  ////
+  ContactMapHolder cmholder = new ContactMapHolder();
+
+  @Override
+  public Collection<ContactMatrixI> getContactMaps()
+  {
+    return cmholder.getContactMaps();
+  }
+
+  @Override
+  public ContactListI getContactListFor(AlignmentAnnotation _aa, int column)
+  {
+    return cmholder.getContactListFor(_aa, column);
+  }
+
+  @Override
+  public AlignmentAnnotation addContactList(ContactMatrixI cm)
+  {
+    AlignmentAnnotation aa = cmholder.addContactList(cm);
+
+    Annotation _aa[] = new Annotation[getLength()];
+    Annotation dummy = new Annotation(0.0f);
+    for (int i = 0; i < _aa.length; _aa[i++] = dummy)
+    {
+      ;
+    }
+    aa.annotations = _aa;
+    addAlignmentAnnotation(aa);
+    return aa;
+  }
+
 }
index 5e33229..6a0e64c 100755 (executable)
  */
 package jalview.datamodel;
 
-import jalview.analysis.AAFrequency;
-import jalview.analysis.Conservation;
-import jalview.renderer.ResidueShader;
-import jalview.renderer.ResidueShaderI;
-import jalview.schemes.ColourSchemeI;
-
 import java.awt.Color;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
+import jalview.analysis.AAFrequency;
+import jalview.analysis.Conservation;
+import jalview.renderer.ResidueShader;
+import jalview.renderer.ResidueShaderI;
+import jalview.schemes.ColourSchemeI;
+
 /**
  * Collects a set contiguous ranges on a set of sequences
  * 
@@ -1485,4 +1486,37 @@ public class SequenceGroup implements AnnotatedCollectionI
   {
     return (startRes <= apos && endRes >= apos) && sequences.contains(seq);
   }
+
+  ////
+  //// Contact Matrix Holder Boilerplate
+  ////
+  ContactMapHolder cmholder = new ContactMapHolder();
+
+  @Override
+  public Collection<ContactMatrixI> getContactMaps()
+  {
+    return cmholder.getContactMaps();
+  }
+
+  @Override
+  public ContactListI getContactListFor(AlignmentAnnotation _aa, int column)
+  {
+    return cmholder.getContactListFor(_aa, column);
+  }
+
+  @Override
+  public AlignmentAnnotation addContactList(ContactMatrixI cm)
+  {
+    AlignmentAnnotation aa = cmholder.addContactList(cm);
+
+    Annotation _aa[] = new Annotation[getWidth()];
+    Annotation dummy = new Annotation(0.0f);
+    for (int i = 0; i < _aa.length; _aa[i++] = dummy)
+    {
+      ;
+    }
+    aa.annotations = _aa;
+    // TODO passing annotations back to context to be added
+    return aa;
+  }
 }
index 2f365e6..34dbab7 100755 (executable)
  */
 package jalview.datamodel;
 
-import jalview.datamodel.Sequence.DBModList;
-import jalview.datamodel.features.SequenceFeaturesI;
-import jalview.util.MapList;
-import jalview.ws.params.InvalidArgumentException;
-
 import java.util.BitSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Vector;
 
 import fr.orsay.lri.varna.models.rna.RNA;
+import jalview.datamodel.Sequence.DBModList;
+import jalview.datamodel.features.SequenceFeaturesI;
+import jalview.util.MapList;
+import jalview.ws.params.InvalidArgumentException;
 
 /**
  * Methods for manipulating a sequence, its metadata and related annotation in
@@ -39,7 +38,7 @@ import fr.orsay.lri.varna.models.rna.RNA;
  * @author $author$
  * @version $Revision$
  */
-public interface SequenceI extends ASequenceI
+public interface SequenceI extends ASequenceI, ContactMapHolderI
 {
   /**
    * Set the display name for the sequence