Merge branch 'spike/JAL-1950_hmmer3client' into features/mchmmer_merge_JAL-1950
authorJim Procter <jprocter@issues.jalview.org>
Thu, 31 May 2018 12:48:14 +0000 (13:48 +0100)
committerJim Procter <jprocter@issues.jalview.org>
Thu, 31 May 2018 12:48:14 +0000 (13:48 +0100)
 Conflicts:
src/jalview/gui/AlignViewport.java

1  2 
src/jalview/datamodel/AlignmentAnnotation.java
src/jalview/gui/AlignViewport.java

@@@ -94,6 -94,76 +94,6 @@@ public class AlignmentAnnotatio
    private long invalidrnastruc = -2;
  
    /**
 -   * Updates the _rnasecstr field Determines the positions that base pair and
 -   * the positions of helices based on secondary structure from a Stockholm file
 -   * 
 -   * @param rnaAnnotation
 -   */
 -  private void _updateRnaSecStr(CharSequence rnaAnnotation)
 -  {
 -    try
 -    {
 -      _rnasecstr = Rna.getHelixMap(rnaAnnotation);
 -      invalidrnastruc = -1;
 -    } catch (WUSSParseException px)
 -    {
 -      // DEBUG System.out.println(px);
 -      invalidrnastruc = px.getProblemPos();
 -    }
 -    if (invalidrnastruc > -1)
 -    {
 -      return;
 -    }
 -
 -    if (_rnasecstr != null && _rnasecstr.length > 0)
 -    {
 -      // show all the RNA secondary structure annotation symbols.
 -      isrna = true;
 -      showAllColLabels = true;
 -      scaleColLabel = true;
 -      _markRnaHelices();
 -    }
 -    // System.out.println("featuregroup " + _rnasecstr[0].getFeatureGroup());
 -
 -  }
 -
 -  private void _markRnaHelices()
 -  {
 -    int mxval = 0;
 -    // Figure out number of helices
 -    // Length of rnasecstr is the number of pairs of positions that base pair
 -    // with each other in the secondary structure
 -    for (int x = 0; x < _rnasecstr.length; x++)
 -    {
 -
 -      /*
 -       * System.out.println(this.annotation._rnasecstr[x] + " Begin" +
 -       * this.annotation._rnasecstr[x].getBegin());
 -       */
 -      // System.out.println(this.annotation._rnasecstr[x].getFeatureGroup());
 -      int val = 0;
 -      try
 -      {
 -        val = Integer.valueOf(_rnasecstr[x].getFeatureGroup());
 -        if (mxval < val)
 -        {
 -          mxval = val;
 -        }
 -      } catch (NumberFormatException q)
 -      {
 -      }
 -      ;
 -
 -      annotations[_rnasecstr[x].getBegin()].value = val;
 -      annotations[_rnasecstr[x].getEnd()].value = val;
 -
 -      // annotations[_rnasecstr[x].getBegin()].displayCharacter = "" + val;
 -      // annotations[_rnasecstr[x].getEnd()].displayCharacter = "" + val;
 -    }
 -    setScore(mxval);
 -  }
 -
 -  /**
     * map of positions in the associated annotation
     */
    private Map<Integer, Annotation> sequenceMapping;
    }
  
    /**
 +   * Copy constructor creates a new independent annotation row with the same
 +   * associated sequenceRef
 +   * 
 +   * @param annotation
 +   */
 +  public AlignmentAnnotation(AlignmentAnnotation annotation)
 +  {
 +    setAnnotationId();
 +    this.label = new String(annotation.label);
 +    if (annotation.description != null)
 +    {
 +      this.description = new String(annotation.description);
 +    }
 +    this.graphMin = annotation.graphMin;
 +    this.graphMax = annotation.graphMax;
 +    this.graph = annotation.graph;
 +    this.graphHeight = annotation.graphHeight;
 +    this.graphGroup = annotation.graphGroup;
 +    this.groupRef = annotation.groupRef;
 +    this.editable = annotation.editable;
 +    this.autoCalculated = annotation.autoCalculated;
 +    this.hasIcons = annotation.hasIcons;
 +    this.hasText = annotation.hasText;
 +    this.height = annotation.height;
 +    this.label = annotation.label;
 +    this.padGaps = annotation.padGaps;
 +    this.visible = annotation.visible;
 +    this.centreColLabels = annotation.centreColLabels;
 +    this.scaleColLabel = annotation.scaleColLabel;
 +    this.showAllColLabels = annotation.showAllColLabels;
 +    this.calcId = annotation.calcId;
 +    if (annotation.properties != null)
 +    {
 +      properties = new HashMap<>();
 +      for (Map.Entry<String, String> val : annotation.properties.entrySet())
 +      {
 +        properties.put(val.getKey(), val.getValue());
 +      }
 +    }
 +    if (this.hasScore = annotation.hasScore)
 +    {
 +      this.score = annotation.score;
 +    }
 +    if (annotation.threshold != null)
 +    {
 +      threshold = new GraphLine(annotation.threshold);
 +    }
 +    Annotation[] ann = annotation.annotations;
 +    if (annotation.annotations != null)
 +    {
 +      this.annotations = new Annotation[ann.length];
 +      for (int i = 0; i < ann.length; i++)
 +      {
 +        if (ann[i] != null)
 +        {
 +          annotations[i] = new Annotation(ann[i]);
 +          if (_linecolour != null)
 +          {
 +            _linecolour = annotations[i].colour;
 +          }
 +        }
 +      }
 +    }
 +    if (annotation.sequenceRef != null)
 +    {
 +      this.sequenceRef = annotation.sequenceRef;
 +      if (annotation.sequenceMapping != null)
 +      {
 +        Integer p = null;
 +        sequenceMapping = new HashMap<>();
 +        Iterator<Integer> pos = annotation.sequenceMapping.keySet()
 +                .iterator();
 +        while (pos.hasNext())
 +        {
 +          // could optimise this!
 +          p = pos.next();
 +          Annotation a = annotation.sequenceMapping.get(p);
 +          if (a == null)
 +          {
 +            continue;
 +          }
 +          if (ann != null)
 +          {
 +            for (int i = 0; i < ann.length; i++)
 +            {
 +              if (ann[i] == a)
 +              {
 +                sequenceMapping.put(p, annotations[i]);
 +              }
 +            }
 +          }
 +        }
 +      }
 +      else
 +      {
 +        this.sequenceMapping = null;
 +      }
 +    }
 +    // TODO: check if we need to do this: JAL-952
 +    // if (this.isrna=annotation.isrna)
 +    {
 +      // _rnasecstr=new SequenceFeature[annotation._rnasecstr];
 +    }
 +    validateRangeAndDisplay(); // construct hashcodes, etc.
 +  }
 +
 +  /**
 +   * copy constructor with edit based on the hidden columns marked in colSel
 +   * 
 +   * @param alignmentAnnotation
 +   * @param colSel
 +   */
 +  public AlignmentAnnotation(AlignmentAnnotation alignmentAnnotation,
 +          HiddenColumns hidden)
 +  {
 +    this(alignmentAnnotation);
 +    if (annotations == null)
 +    {
 +      return;
 +    }
 +    makeVisibleAnnotation(hidden);
 +  }
 +
 +  /**
 +   * Creates a new AlignmentAnnotation object.
 +   * 
 +   * @param label
 +   *          DOCUMENT ME!
 +   * @param description
 +   *          DOCUMENT ME!
 +   * @param annotations
 +   *          DOCUMENT ME!
 +   * @param min
 +   *          DOCUMENT ME!
 +   * @param max
 +   *          DOCUMENT ME!
 +   * @param winLength
 +   *          DOCUMENT ME!
 +   */
 +  public AlignmentAnnotation(String label, String description,
 +          Annotation[] annotations, float min, float max, int graphType)
 +  {
 +    setAnnotationId();
 +    // graphs are not editable
 +    editable = graphType == 0;
 +
 +    this.label = label;
 +    this.description = description;
 +    this.annotations = annotations;
 +    graph = graphType;
 +    graphMin = min;
 +    graphMax = max;
 +    validateRangeAndDisplay();
 +  }
 +
 +  /**
 +   * Score only annotation
 +   * 
 +   * @param label
 +   * @param description
 +   * @param score
 +   */
 +  public AlignmentAnnotation(String label, String description, double score)
 +  {
 +    this(label, description, null);
 +    setScore(score);
 +  }
 +
 +  /**
 +   * Updates the _rnasecstr field Determines the positions that base pair and
 +   * the positions of helices based on secondary structure from a Stockholm file
 +   * 
 +   * @param rnaAnnotation
 +   */
 +  private void _updateRnaSecStr(CharSequence rnaAnnotation)
 +  {
 +    try
 +    {
 +      _rnasecstr = Rna.getHelixMap(rnaAnnotation);
 +      invalidrnastruc = -1;
 +    } catch (WUSSParseException px)
 +    {
 +      // DEBUG System.out.println(px);
 +      invalidrnastruc = px.getProblemPos();
 +    }
 +    if (invalidrnastruc > -1)
 +    {
 +      return;
 +    }
 +
 +    if (_rnasecstr != null && _rnasecstr.length > 0)
 +    {
 +      // show all the RNA secondary structure annotation symbols.
 +      isrna = true;
 +      showAllColLabels = true;
 +      scaleColLabel = true;
 +      _markRnaHelices();
 +    }
 +    // System.out.println("featuregroup " + _rnasecstr[0].getFeatureGroup());
 +
 +  }
 +
 +  private void _markRnaHelices()
 +  {
 +    int mxval = 0;
 +    // Figure out number of helices
 +    // Length of rnasecstr is the number of pairs of positions that base pair
 +    // with each other in the secondary structure
 +    for (int x = 0; x < _rnasecstr.length; x++)
 +    {
 +
 +      /*
 +       * System.out.println(this.annotation._rnasecstr[x] + " Begin" +
 +       * this.annotation._rnasecstr[x].getBegin());
 +       */
 +      // System.out.println(this.annotation._rnasecstr[x].getFeatureGroup());
 +      int val = 0;
 +      try
 +      {
 +        val = Integer.valueOf(_rnasecstr[x].getFeatureGroup());
 +        if (mxval < val)
 +        {
 +          mxval = val;
 +        }
 +      } catch (NumberFormatException q)
 +      {
 +      }
 +      ;
 +
 +      annotations[_rnasecstr[x].getBegin()].value = val;
 +      annotations[_rnasecstr[x].getEnd()].value = val;
 +
 +      // annotations[_rnasecstr[x].getBegin()].displayCharacter = "" + val;
 +      // annotations[_rnasecstr[x].getEnd()].displayCharacter = "" + val;
 +    }
 +    setScore(mxval);
 +  }
 +
 +  /**
     * Checks if annotation labels represent secondary structures
     * 
     */
    }
  
    /**
 -   * Creates a new AlignmentAnnotation object.
 -   * 
 -   * @param label
 -   *          DOCUMENT ME!
 -   * @param description
 -   *          DOCUMENT ME!
 -   * @param annotations
 -   *          DOCUMENT ME!
 -   * @param min
 -   *          DOCUMENT ME!
 -   * @param max
 -   *          DOCUMENT ME!
 -   * @param winLength
 -   *          DOCUMENT ME!
 -   */
 -  public AlignmentAnnotation(String label, String description,
 -          Annotation[] annotations, float min, float max, int graphType)
 -  {
 -    setAnnotationId();
 -    // graphs are not editable
 -    editable = graphType == 0;
 -
 -    this.label = label;
 -    this.description = description;
 -    this.annotations = annotations;
 -    graph = graphType;
 -    graphMin = min;
 -    graphMax = max;
 -    validateRangeAndDisplay();
 -  }
 -
 -  /**
     * checks graphMin and graphMax, secondary structure symbols, sets graphType
     * appropriately, sets null labels to the empty string if appropriate.
     */
    }
  
    /**
 -   * Copy constructor creates a new independent annotation row with the same
 -   * associated sequenceRef
 -   * 
 -   * @param annotation
 -   */
 -  public AlignmentAnnotation(AlignmentAnnotation annotation)
 -  {
 -    setAnnotationId();
 -    this.label = new String(annotation.label);
 -    if (annotation.description != null)
 -    {
 -      this.description = new String(annotation.description);
 -    }
 -    this.graphMin = annotation.graphMin;
 -    this.graphMax = annotation.graphMax;
 -    this.graph = annotation.graph;
 -    this.graphHeight = annotation.graphHeight;
 -    this.graphGroup = annotation.graphGroup;
 -    this.groupRef = annotation.groupRef;
 -    this.editable = annotation.editable;
 -    this.autoCalculated = annotation.autoCalculated;
 -    this.hasIcons = annotation.hasIcons;
 -    this.hasText = annotation.hasText;
 -    this.height = annotation.height;
 -    this.label = annotation.label;
 -    this.padGaps = annotation.padGaps;
 -    this.visible = annotation.visible;
 -    this.centreColLabels = annotation.centreColLabels;
 -    this.scaleColLabel = annotation.scaleColLabel;
 -    this.showAllColLabels = annotation.showAllColLabels;
 -    this.calcId = annotation.calcId;
 -    if (annotation.properties != null)
 -    {
 -      properties = new HashMap<>();
 -      for (Map.Entry<String, String> val : annotation.properties.entrySet())
 -      {
 -        properties.put(val.getKey(), val.getValue());
 -      }
 -    }
 -    if (this.hasScore = annotation.hasScore)
 -    {
 -      this.score = annotation.score;
 -    }
 -    if (annotation.threshold != null)
 -    {
 -      threshold = new GraphLine(annotation.threshold);
 -    }
 -    Annotation[] ann = annotation.annotations;
 -    if (annotation.annotations != null)
 -    {
 -      this.annotations = new Annotation[ann.length];
 -      for (int i = 0; i < ann.length; i++)
 -      {
 -        if (ann[i] != null)
 -        {
 -          annotations[i] = new Annotation(ann[i]);
 -          if (_linecolour != null)
 -          {
 -            _linecolour = annotations[i].colour;
 -          }
 -        }
 -      }
 -    }
 -    if (annotation.sequenceRef != null)
 -    {
 -      this.sequenceRef = annotation.sequenceRef;
 -      if (annotation.sequenceMapping != null)
 -      {
 -        Integer p = null;
 -        sequenceMapping = new HashMap<>();
 -        Iterator<Integer> pos = annotation.sequenceMapping.keySet()
 -                .iterator();
 -        while (pos.hasNext())
 -        {
 -          // could optimise this!
 -          p = pos.next();
 -          Annotation a = annotation.sequenceMapping.get(p);
 -          if (a == null)
 -          {
 -            continue;
 -          }
 -          if (ann != null)
 -          {
 -            for (int i = 0; i < ann.length; i++)
 -            {
 -              if (ann[i] == a)
 -              {
 -                sequenceMapping.put(p, annotations[i]);
 -              }
 -            }
 -          }
 -        }
 -      }
 -      else
 -      {
 -        this.sequenceMapping = null;
 -      }
 -    }
 -    // TODO: check if we need to do this: JAL-952
 -    // if (this.isrna=annotation.isrna)
 -    {
 -      // _rnasecstr=new SequenceFeature[annotation._rnasecstr];
 -    }
 -    validateRangeAndDisplay(); // construct hashcodes, etc.
 -  }
 -
 -  /**
     * clip the annotation to the columns given by startRes and endRes (inclusive)
     * and prune any existing sequenceMapping to just those columns.
     * 
     * @param seqRef
     * @param startRes
     * @param alreadyMapped
+    *          - annotation are at aligned columns
     */
    public void createSequenceMapping(SequenceI seqRef, int startRes,
            boolean alreadyMapped)
      return hasScore || !Double.isNaN(score);
    }
  
 -  /**
 -   * Score only annotation
 -   * 
 -   * @param label
 -   * @param description
 -   * @param score
 -   */
 -  public AlignmentAnnotation(String label, String description, double score)
 -  {
 -    this(label, description, null);
 -    setScore(score);
 -  }
 -
 -  /**
 -   * copy constructor with edit based on the hidden columns marked in colSel
 -   * 
 -   * @param alignmentAnnotation
 -   * @param colSel
 -   */
 -  public AlignmentAnnotation(AlignmentAnnotation alignmentAnnotation,
 -          HiddenColumns hidden)
 -  {
 -    this(alignmentAnnotation);
 -    if (annotations == null)
 -    {
 -      return;
 -    }
 -    makeVisibleAnnotation(hidden);
 -  }
 -
    public void setPadGaps(boolean padgaps, char gapchar)
    {
      this.padGaps = padgaps;
    /**
     * machine readable ID string indicating what generated this annotation
     */
 -  protected String calcId = "";
 +  private String calcId = "";
  
    /**
     * properties associated with the calcId
            Iterable<AlignmentAnnotation> list, SequenceI seq, String calcId,
            String label)
    {
 -
 -    ArrayList<AlignmentAnnotation> aa = new ArrayList<>();
 +    List<AlignmentAnnotation> aa = new ArrayList<>();
      for (AlignmentAnnotation ann : list)
      {
        if ((calcId == null || (ann.getCalcId() != null
    public static Iterable<AlignmentAnnotation> findAnnotation(
            List<AlignmentAnnotation> list, String calcId)
    {
 -
      List<AlignmentAnnotation> aa = new ArrayList<>();
      if (calcId == null)
      {
@@@ -92,12 -92,6 +92,12 @@@ public class AlignViewport extends Alig
  
    private AnnotationColumnChooser annotationColumnSelectionState;
  
 +  boolean validCharWidth;
 +
 +  public boolean followSelection = true;
 +
 +  private Hashtable<String, AutoCalcSetting> calcIdParams = new Hashtable<>();
 +
    /**
     * Creates a new AlignViewport object.
     * 
  
      setFont(new Font(fontName, style, Integer.parseInt(fontSize)), true);
  
 +    AlignmentI al = getAlignment();
-     al.setGapCharacter(Cache.getDefault("GAP_SYMBOL", "-").charAt(0));
++
+     if (Cache.getDefault("NORMALISE_GAPS", true))
+     {
 -      alignment.setGapCharacter(Cache.getDefault("GAP_SYMBOL", "-").charAt(
 -              0));
++      al.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)
 +    if (consensusProfiles == null && !isDataset)
      {
 -      if (!alignment.isNucleotide())
 +      if (!al.isNucleotide())
        {
          showConservation = Cache.getDefault("SHOW_CONSERVATION", true);
          showQuality = Cache.getDefault("SHOW_QUALITY", true);
        showSequenceLogo = Cache.getDefault("SHOW_CONSENSUS_LOGO", false);
        normaliseSequenceLogo = Cache.getDefault("NORMALISE_CONSENSUS_LOGO",
                false);
 +      // for now, use consensus options for Information till it gets its own
 +      setShowHMMSequenceLogo(showSequenceLogo);
 +      setNormaliseHMMSequenceLogo(normaliseSequenceLogo);
 +      setShowInformationHistogram(showConsensusHistogram);
        showGroupConsensus = Cache.getDefault("SHOW_GROUP_CONSENSUS", false);
        showConsensus = Cache.getDefault("SHOW_IDENTITY", true);
  
        showOccupancy = Cache.getDefault(Preferences.SHOW_OCCUPANCY, true);
      }
      initAutoAnnotation();
 -    String colourProperty = alignment.isNucleotide()
 +    // initInformation();
 +
 +    String colourProperty = al.isNucleotide()
              ? Preferences.DEFAULT_COLOUR_NUC
              : Preferences.DEFAULT_COLOUR_PROT;
      String schemeName = Cache.getProperty(colourProperty);
                ResidueColourScheme.NONE);
      }
      ColourSchemeI colourScheme = ColourSchemeProperty
 -            .getColourScheme(alignment, schemeName);
 +            .getColourScheme(al, schemeName);
      residueShading = new ResidueShader(colourScheme);
  
      if (colourScheme instanceof UserColourScheme)
  
      if (residueShading != null)
      {
 -      residueShading.setConsensus(hconsensus);
 +      residueShading.setConsensus(consensusProfiles);
      }
    }
  
 -  boolean validCharWidth;
 -
    /**
     * {@inheritDoc}
     */
      /*
       * replace mappings on our alignment
       */
 -    if (alignment != null && align != null)
 +    if (getAlignment() != null && align != null)
      {
 -      alignment.setCodonFrames(align.getCodonFrames());
 +      getAlignment().setCodonFrames(align.getCodonFrames());
      }
    }
  
    }
  
    /**
 -   * returns the visible column regions of the alignment
 +   * Returns an iterator over the visible column regions of the alignment
     * 
     * @param selectedRegionOnly
     *          true to just return the contigs intersecting with the selected
      }
      else
      {
 -      end = alignment.getWidth();
 +      end = getAlignment().getWidth();
      }
 -    return (alignment.getHiddenColumns().getVisContigsIterator(start, end,
 -            false));
 +
 +    return getAlignment().getHiddenColumns().getVisContigsIterator(start,
 +            end, false);
    }
  
    /**
      return false;
    }
  
 -  public boolean followSelection = true;
 -
    /**
     * @return true if view selection should always follow the selections
     *         broadcast by other selection sources
              .getStructureSelectionManager(Desktop.instance);
    }
  
 -  @Override
 -  public boolean isNormaliseSequenceLogo()
 -  {
 -    return normaliseSequenceLogo;
 -  }
 -
 -  public void setNormaliseSequenceLogo(boolean state)
 -  {
 -    normaliseSequenceLogo = state;
 -  }
 -
    /**
     * 
     * @return true if alignment characters should be displayed
      return validCharWidth;
    }
  
 -  private Hashtable<String, AutoCalcSetting> calcIdParams = new Hashtable<>();
 -
    public AutoCalcSetting getCalcIdSettingsFor(String calcId)
    {
      return calcIdParams.get(calcId);
      }
      fr.setTransparency(featureSettings.getTransparency());
    }
 +
  }