Merge branch 'develop' into spike/JAL-1950_hmmer3client
authorJim Procter <jprocter@issues.jalview.org>
Thu, 31 May 2018 12:41:36 +0000 (13:41 +0100)
committerJim Procter <jprocter@issues.jalview.org>
Thu, 31 May 2018 12:41:36 +0000 (13:41 +0100)
1  2 
src/jalview/datamodel/AlignmentAnnotation.java
src/jalview/gui/AlignViewport.java

@@@ -24,6 -24,7 +24,7 @@@ import jalview.analysis.Rna
  import jalview.analysis.SecStrConsensus.SimpleBP;
  import jalview.analysis.WUSSParseException;
  
+ import java.util.ArrayList;
  import java.util.Collection;
  import java.util.Collections;
  import java.util.HashMap;
@@@ -241,19 -242,6 +242,6 @@@ public class AlignmentAnnotatio
  
    private boolean isrna;
  
-   /*
-    * (non-Javadoc)
-    * 
-    * @see java.lang.Object#finalize()
-    */
-   @Override
-   protected void finalize() throws Throwable
-   {
-     sequenceRef = null;
-     groupRef = null;
-     super.finalize();
-   }
    public static int getGraphValueFromString(String string)
    {
      if (string.equalsIgnoreCase("BAR_GRAPH"))
      this.calcId = annotation.calcId;
      if (annotation.properties != null)
      {
-       properties = new HashMap<String, String>();
+       properties = new HashMap<>();
        for (Map.Entry<String, String> val : annotation.properties.entrySet())
        {
          properties.put(val.getKey(), val.getValue());
        if (annotation.sequenceMapping != null)
        {
          Integer p = null;
-         sequenceMapping = new HashMap<Integer, Annotation>();
+         sequenceMapping = new HashMap<>();
          Iterator<Integer> pos = annotation.sequenceMapping.keySet()
                  .iterator();
          while (pos.hasNext())
        int epos = sequenceRef.findPosition(endRes);
        if (sequenceMapping != null)
        {
-         Map<Integer, Annotation> newmapping = new HashMap<Integer, Annotation>();
+         Map<Integer, Annotation> newmapping = new HashMap<>();
          Iterator<Integer> e = sequenceMapping.keySet().iterator();
          while (e.hasNext())
          {
     * @param seqRef
     * @param startRes
     * @param alreadyMapped
 +   *          - annotation are at aligned columns
     */
    public void createSequenceMapping(SequenceI seqRef, int startRes,
            boolean alreadyMapped)
      {
        return;
      }
-     sequenceMapping = new HashMap<Integer, Annotation>();
+     sequenceMapping = new HashMap<>();
  
      int seqPos;
  
      {
        return;
      }
-     hidden.makeVisibleAnnotation(this);
+     makeVisibleAnnotation(hidden);
    }
  
    public void setPadGaps(boolean padgaps, char gapchar)
    /**
     * properties associated with the calcId
     */
-   protected Map<String, String> properties = new HashMap<String, String>();
+   protected Map<String, String> properties = new HashMap<>();
  
    /**
     * base colour for line graphs. If null, will be set automatically by
              : false;
  
      // TODO build a better annotation element map and get rid of annotations[]
-     Map<Integer, Annotation> mapForsq = new HashMap<Integer, Annotation>();
+     Map<Integer, Annotation> mapForsq = new HashMap<>();
      if (sequenceMapping != null)
      {
        if (sp2sq != null)
      if (mapping != null)
      {
        Map<Integer, Annotation> old = sequenceMapping;
-       Map<Integer, Annotation> remap = new HashMap<Integer, Annotation>();
+       Map<Integer, Annotation> remap = new HashMap<>();
        int index = -1;
        for (int mp[] : mapping.values())
        {
    {
      if (properties == null)
      {
-       properties = new HashMap<String, String>();
+       properties = new HashMap<>();
      }
      properties.put(property, value);
    }
    {
      return graphMin < graphMax;
    }
+   /**
+    * delete any columns in alignmentAnnotation that are hidden (including
+    * sequence associated annotation).
+    * 
+    * @param hiddenColumns
+    *          the set of hidden columns
+    */
+   public void makeVisibleAnnotation(HiddenColumns hiddenColumns)
+   {
+     if (annotations != null)
+     {
+       makeVisibleAnnotation(0, annotations.length, hiddenColumns);
+     }
+   }
+   /**
+    * delete any columns in alignmentAnnotation that are hidden (including
+    * sequence associated annotation).
+    * 
+    * @param start
+    *          remove any annotation to the right of this column
+    * @param end
+    *          remove any annotation to the left of this column
+    * @param hiddenColumns
+    *          the set of hidden columns
+    */
+   public void makeVisibleAnnotation(int start, int end,
+           HiddenColumns hiddenColumns)
+   {
+     if (annotations != null)
+     {
+       if (hiddenColumns.hasHiddenColumns())
+       {
+         removeHiddenAnnotation(start, end, hiddenColumns);
+       }
+       else
+       {
+         restrict(start, end);
+       }
+     }
+   }
+   /**
+    * The actual implementation of deleting hidden annotation columns
+    * 
+    * @param start
+    *          remove any annotation to the right of this column
+    * @param end
+    *          remove any annotation to the left of this column
+    * @param hiddenColumns
+    *          the set of hidden columns
+    */
+   private void removeHiddenAnnotation(int start, int end,
+           HiddenColumns hiddenColumns)
+   {
+     // mangle the alignmentAnnotation annotation array
+     ArrayList<Annotation[]> annels = new ArrayList<>();
+     Annotation[] els = null;
+     int w = 0;
+     Iterator<int[]> blocks = hiddenColumns.getVisContigsIterator(start,
+             end + 1, false);
+     int copylength;
+     int annotationLength;
+     while (blocks.hasNext())
+     {
+       int[] block = blocks.next();
+       annotationLength = block[1] - block[0] + 1;
+       if (blocks.hasNext())
+       {
+         // copy just the visible segment of the annotation row
+         copylength = annotationLength;
+       }
+       else
+       {
+         if (annotationLength + block[0] <= annotations.length)
+         {
+           // copy just the visible segment of the annotation row
+           copylength = annotationLength;
+         }
+         else
+         {
+           // copy to the end of the annotation row
+           copylength = annotations.length - block[0];
+         }
+       }
+       els = new Annotation[annotationLength];
+       annels.add(els);
+       System.arraycopy(annotations, block[0], els, 0, copylength);
+       w += annotationLength;
+     }
+     if (w != 0)
+     {
+       annotations = new Annotation[w];
+       w = 0;
+       for (Annotation[] chnk : annels)
+       {
+         System.arraycopy(chnk, 0, annotations, w, chnk.length);
+         w += chnk.length;
+       }
+     }
+   }
+   public static Iterable<AlignmentAnnotation> findAnnotations(
+           Iterable<AlignmentAnnotation> list, SequenceI seq, String calcId,
+           String label)
+   {
+     ArrayList<AlignmentAnnotation> aa = new ArrayList<>();
+     for (AlignmentAnnotation ann : list)
+     {
+       if ((calcId == null || (ann.getCalcId() != null
+               && ann.getCalcId().equals(calcId)))
+               && (seq == null || (ann.sequenceRef != null
+                       && ann.sequenceRef == seq))
+               && (label == null
+                       || (ann.label != null && ann.label.equals(label))))
+       {
+         aa.add(ann);
+       }
+     }
+     return aa;
+   }
+   /**
+    * Answer true if any annotation matches the calcId passed in (if not null).
+    * 
+    * @param list
+    *          annotation to search
+    * @param calcId
+    * @return
+    */
+   public static boolean hasAnnotation(List<AlignmentAnnotation> list,
+           String calcId)
+   {
+     if (calcId != null && !"".equals(calcId))
+     {
+       for (AlignmentAnnotation a : list)
+       {
+         if (a.getCalcId() == calcId)
+         {
+           return true;
+         }
+       }
+     }
+     return false;
+   }
+   public static Iterable<AlignmentAnnotation> findAnnotation(
+           List<AlignmentAnnotation> list, String calcId)
+   {
+     List<AlignmentAnnotation> aa = new ArrayList<>();
+     if (calcId == null)
+     {
+       return aa;
+     }
+     for (AlignmentAnnotation a : list)
+     {
+       if (a.getCalcId() == calcId || (a.getCalcId() != null
+               && calcId != null && a.getCalcId().equals(calcId)))
+       {
+         aa.add(a);
+       }
+     }
+     return aa;
+   }
  }
@@@ -22,7 -22,6 +22,6 @@@ package jalview.gui
  
  import jalview.analysis.AlignmentUtils;
  import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
- import jalview.analysis.TreeModel;
  import jalview.api.AlignViewportI;
  import jalview.api.AlignmentViewPanel;
  import jalview.api.FeatureColourI;
@@@ -36,7 -35,6 +35,6 @@@ import jalview.datamodel.Alignment
  import jalview.datamodel.AlignmentI;
  import jalview.datamodel.ColumnSelection;
  import jalview.datamodel.HiddenColumns;
- import jalview.datamodel.PDBEntry;
  import jalview.datamodel.SearchResults;
  import jalview.datamodel.SearchResultsI;
  import jalview.datamodel.SequenceGroup;
@@@ -58,10 -56,9 +56,9 @@@ import java.awt.Dimension
  import java.awt.Font;
  import java.awt.FontMetrics;
  import java.awt.Rectangle;
- import java.util.ArrayList;
  import java.util.Hashtable;
+ import java.util.Iterator;
  import java.util.List;
- import java.util.Vector;
  
  import javax.swing.JInternalFrame;
  
@@@ -76,8 -73,6 +73,6 @@@ public class AlignViewport extends Alig
  {
    Font font;
  
-   TreeModel currentTree = null;
    boolean cursorMode = false;
  
    boolean antiAlias = false;
  
      setFont(new Font(fontName, style, Integer.parseInt(fontSize)), true);
  
 -    alignment
 -            .setGapCharacter(Cache.getDefault("GAP_SYMBOL", "-").charAt(0));
 -
 +    if (Cache.getDefault("NORMALISE_GAPS", true))
 +    {
 +      alignment.setGapCharacter(Cache.getDefault("GAP_SYMBOL", "-").charAt(
 +              0));
 +    }
      // We must set conservation and consensus before setting colour,
      // as Blosum and Clustal require this to be done
      if (hconsensus == null && !isDataset)
    }
  
    /**
-    * DOCUMENT ME!
-    * 
-    * @param tree
-    *          DOCUMENT ME!
-    */
-   public void setCurrentTree(TreeModel tree)
-   {
-     currentTree = tree;
-   }
-   /**
-    * DOCUMENT ME!
-    * 
-    * @return DOCUMENT ME!
-    */
-   public TreeModel getCurrentTree()
-   {
-     return currentTree;
-   }
-   /**
     * returns the visible column regions of the alignment
     * 
     * @param selectedRegionOnly
     *          area
     * @return
     */
-   public int[] getViewAsVisibleContigs(boolean selectedRegionOnly)
+   public Iterator<int[]> getViewAsVisibleContigs(boolean selectedRegionOnly)
    {
-     int[] viscontigs = null;
-     int start = 0, end = 0;
+     int start = 0;
+     int end = 0;
      if (selectedRegionOnly && selectionGroup != null)
      {
        start = selectionGroup.getStartRes();
      {
        end = alignment.getWidth();
      }
-     viscontigs = alignment.getHiddenColumns().getVisibleContigs(start, end);
-     return viscontigs;
+     return (alignment.getHiddenColumns().getVisContigsIterator(start, end,
+             false));
    }
  
    /**
              .getStructureSelectionManager(Desktop.instance);
    }
  
-   /**
-    * 
-    * @param pdbEntries
-    * @return an array of SequenceI arrays, one for each PDBEntry, listing which
-    *         sequences in the alignment hold a reference to it
-    */
-   public SequenceI[][] collateForPDB(PDBEntry[] pdbEntries)
-   {
-     List<SequenceI[]> seqvectors = new ArrayList<SequenceI[]>();
-     for (PDBEntry pdb : pdbEntries)
-     {
-       List<SequenceI> choosenSeqs = new ArrayList<SequenceI>();
-       for (SequenceI sq : alignment.getSequences())
-       {
-         Vector<PDBEntry> pdbRefEntries = sq.getDatasetSequence()
-                 .getAllPDBEntries();
-         if (pdbRefEntries == null)
-         {
-           continue;
-         }
-         for (PDBEntry pdbRefEntry : pdbRefEntries)
-         {
-           if (pdbRefEntry.getId().equals(pdb.getId()))
-           {
-             if (pdbRefEntry.getChainCode() != null
-                     && pdb.getChainCode() != null)
-             {
-               if (pdbRefEntry.getChainCode().equalsIgnoreCase(
-                       pdb.getChainCode()) && !choosenSeqs.contains(sq))
-               {
-                 choosenSeqs.add(sq);
-                 continue;
-               }
-             }
-             else
-             {
-               if (!choosenSeqs.contains(sq))
-               {
-                 choosenSeqs.add(sq);
-                 continue;
-               }
-             }
-           }
-         }
-       }
-       seqvectors
-               .add(choosenSeqs.toArray(new SequenceI[choosenSeqs.size()]));
-     }
-     return seqvectors.toArray(new SequenceI[seqvectors.size()][]);
-   }
    @Override
    public boolean isNormaliseSequenceLogo()
    {
      return validCharWidth;
    }
  
-   private Hashtable<String, AutoCalcSetting> calcIdParams = new Hashtable<String, AutoCalcSetting>();
+   private Hashtable<String, AutoCalcSetting> calcIdParams = new Hashtable<>();
  
    public AutoCalcSetting getCalcIdSettingsFor(String calcId)
    {
      }
      fr.setTransparency(featureSettings.getTransparency());
    }
  }