JAL-2629 add basic parameter adjustment to hmmsearch/align
[jalview.git] / src / jalview / gui / PopupMenu.java
index e75798c..97ce501 100644 (file)
@@ -33,13 +33,13 @@ import jalview.datamodel.AlignmentI;
 import jalview.datamodel.Annotation;
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.HiddenColumns;
-import jalview.datamodel.HiddenMarkovModel;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.gui.ColourMenuHelper.ColourChangeListener;
+import jalview.hmmer.HMMAlignThread;
 import jalview.hmmer.HMMBuildThread;
 import jalview.io.FileFormatI;
 import jalview.io.FileFormats;
@@ -59,6 +59,7 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.BitSet;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Hashtable;
@@ -231,6 +232,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
      */
     final List<SequenceI> selectedSequence = (seq == null
             ? Collections.<SequenceI> emptyList() : Arrays.asList(seq));
+
     buildAnnotationTypesMenus(seqShowAnnotationsMenu,
             seqHideAnnotationsMenu, selectedSequence);
     configureReferenceAnnotationsMenu(seqAddReferenceAnnotations,
@@ -294,9 +296,8 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
                */
               menuItem = new JMenuItem();
               menuItem.setText(MessageManager.formatMessage(
-                      "label.2d_rna_structure_line",
-                      new Object[]
-              { aa.label }));
+                      "label.2d_rna_structure_line", new Object[]
+                      { aa.label }));
               menuItem.addActionListener(new ActionListener()
               {
                 @Override
@@ -323,9 +324,8 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
               // TODO: make rnastrucF a bit more nice
               menuItem = new JMenuItem();
               menuItem.setText(MessageManager.formatMessage(
-                      "label.2d_rna_sequence_name",
-                      new Object[]
-              { seq.getName() }));
+                      "label.2d_rna_sequence_name", new Object[]
+                      { seq.getName() }));
               menuItem.addActionListener(new ActionListener()
               {
                 @Override
@@ -371,14 +371,26 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
           }
         });
         add(selectHMM);
+
+        JMenuItem hmmAlign = new JCheckBoxMenuItem();
+        hmmAlign.setText(MessageManager.getString("label.hmmalign"));
+        hmmAlign.addActionListener(new ActionListener()
+        {
+
+          @Override
+          public void actionPerformed(ActionEvent e)
+          {
+            hmmAlign_actionPerformed(e);
+          }
+        });
+        add(hmmAlign);
       }
 
       if (ap.av.getSelectionGroup() != null
               && ap.av.getSelectionGroup().getSize() > 1)
       {
-        menuItem = new JMenuItem(
-                MessageManager.formatMessage("label.represent_group_with",
-                        new Object[]
+        menuItem = new JMenuItem(MessageManager
+                .formatMessage("label.represent_group_with", new Object[]
                 { seq.getName() }));
         menuItem.addActionListener(new ActionListener()
         {
@@ -441,7 +453,8 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
 
     SequenceGroup sg = ap.av.getSelectionGroup();
     boolean isDefinedGroup = (sg != null)
-            ? ap.av.getAlignment().getGroups().contains(sg) : false;
+            ? ap.av.getAlignment().getGroups().contains(sg)
+            : false;
 
     if (sg != null && sg.getSize() > 0)
     {
@@ -612,7 +625,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
 
     final List<String> all = Arrays
             .asList(new String[]
-    { MessageManager.getString("label.all") });
+            { MessageManager.getString("label.all") });
     addAnnotationTypeToShowHide(showMenu, forSequences, "", all, true,
             true);
     addAnnotationTypeToShowHide(hideMenu, forSequences, "", all, true,
@@ -841,8 +854,10 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
         int type = urlLink.getGroupURLType() & 3;
         // first two bits ofurlLink type bitfield are sequenceids and sequences
         // TODO: FUTURE: ensure the groupURL menu structure can be generalised
-        addshowLink(linkMenus[type], label + (((type & 1) == 1)
-                ? ("(" + (usingNames ? "Names" : ltarget) + ")") : ""),
+        addshowLink(linkMenus[type],
+                label + (((type & 1) == 1)
+                        ? ("(" + (usingNames ? "Names" : ltarget) + ")")
+                        : ""),
                 urlLink, urlset);
         addMenu = true;
       }
@@ -888,7 +903,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
     JMenuItem item = new JMenuItem(label);
     item.setToolTipText(MessageManager.formatMessage("label.open_url_param",
             new Object[]
-    { url }));
+            { url }));
     item.addActionListener(new ActionListener()
     {
       @Override
@@ -925,11 +940,10 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
           final GroupUrlLink urlgenerator, final Object[] urlstub)
   {
     JMenuItem item = new JMenuItem(label);
-    item.setToolTipText(
-            MessageManager.formatMessage("label.open_url_seqs_param",
-                    new Object[]
+    item.setToolTipText(MessageManager
+            .formatMessage("label.open_url_seqs_param", new Object[]
             { urlgenerator.getUrl_prefix(),
-        urlgenerator.getNumberInvolved(urlstub) }));
+                urlgenerator.getNumberInvolved(urlstub) }));
     // TODO: put in info about what is being sent.
     item.addActionListener(new ActionListener()
     {
@@ -1280,8 +1294,15 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
 
   protected void selectHMM_actionPerformed(ActionEvent e)
   {
-    HiddenMarkovModel hmm = ap.av.getSequenceSelection()[0].getHMM();
-    ap.av.setSelectedHMM(hmm);
+    SequenceI hmm = ap.av.getSequenceSelection()[0];
+    ap.alignFrame.setSelectedHMMSequence(hmm);
+  }
+
+  protected void hmmAlign_actionPerformed(ActionEvent e)
+  {
+    ap.alignFrame.setSelectedHMMSequence(this.sequence);
+    new Thread(new HMMAlignThread(ap.alignFrame, true)).start();
+    ap.repaint();
   }
 
   /**
@@ -1494,24 +1515,59 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
 
   protected void hideInsertions_actionPerformed(ActionEvent actionEvent)
   {
-    if (sequence != null)
+
+    HiddenColumns hidden = new HiddenColumns();
+    BitSet inserts = new BitSet(), mask = new BitSet();
+
+    // set mask to preserve existing hidden columns outside selected group
+    if (ap.av.hasHiddenColumns())
+    {
+      ap.av.getAlignment().getHiddenColumns().markHiddenRegions(mask);
+    }
+
+    boolean markedPopup = false;
+    // mark inserts in current selection
+    if (ap.av.getSelectionGroup() != null)
     {
-      /* ColumnSelection cs = ap.av.getColumnSelection();
-       if (cs == null)
-       {
-         cs = new ColumnSelection();
-       }
-       cs.hideInsertionsFor(sequence);
-       ap.av.setColumnSelection(cs);*/
+      // mark just the columns in the selection group to be hidden
+      inserts.set(ap.av.getSelectionGroup().getStartRes(),
+              ap.av.getSelectionGroup().getEndRes() + 1);
 
-      HiddenColumns hidden = ap.av.getAlignment().getHiddenColumns();
-      if (hidden == null)
+      // and clear that part of the mask
+      mask.andNot(inserts);
+
+      // now clear columns without gaps
+      for (SequenceI sq : ap.av.getSelectionGroup().getSequences())
       {
-        hidden = new HiddenColumns();
+        if (sq == sequence)
+        {
+          markedPopup = true;
+        }
+        inserts.and(sq.getInsertionsAsBits());
       }
-      hidden.hideInsertionsFor(sequence);
-      ap.av.getAlignment().setHiddenColumns(hidden);
     }
+    else
+    {
+      // initially, mark all columns to be hidden
+      inserts.set(0, ap.av.getAlignment().getWidth());
+
+      // and clear out old hidden regions completely
+      mask.clear();
+    }
+
+    // now mark for sequence under popup if we haven't already done it
+    if (!markedPopup && sequence != null)
+    {
+      inserts.and(sequence.getInsertionsAsBits());
+    }
+
+    // finally, preserve hidden regions outside selection
+    inserts.or(mask);
+
+    // and set hidden columns accordingly
+    hidden.hideMarkedBits(inserts);
+
+    ap.av.getAlignment().setHiddenColumns(hidden);
     refresh();
   }
 
@@ -1531,28 +1587,27 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
     StringBuilder contents = new StringBuilder(128);
     for (SequenceI seq : sequences)
     {
-      contents.append("<p><h2>"
-              + MessageManager.formatMessage(
-                      "label.create_sequence_details_report_annotation_for",
-                      new Object[]
-                      { seq.getDisplayId(true) })
-              + "</h2></p><p>");
-      new SequenceAnnotationReport(null)
-              .createSequenceAnnotationReport(contents, seq, true, true,
-                      (ap.getSeqPanel().seqCanvas.fr != null)
-                              ? ap.getSeqPanel().seqCanvas.fr.getMinMax()
-                              : null);
+      contents.append("<p><h2>" + MessageManager.formatMessage(
+              "label.create_sequence_details_report_annotation_for",
+              new Object[]
+              { seq.getDisplayId(true) }) + "</h2></p><p>");
+      new SequenceAnnotationReport(null).createSequenceAnnotationReport(
+              contents, seq, true, true,
+              (ap.getSeqPanel().seqCanvas.fr != null)
+                      ? ap.getSeqPanel().seqCanvas.fr.getMinMax()
+                      : null);
       contents.append("</p>");
     }
     cap.setText("<html>" + contents.toString() + "</html>");
 
-    Desktop.addInternalFrame(cap, MessageManager.formatMessage(
-            "label.sequence_details_for",
-            (sequences.length == 1
-                    ? new Object[]
+    Desktop.addInternalFrame(cap,
+            MessageManager.formatMessage("label.sequence_details_for",
+                    (sequences.length == 1 ? new Object[]
                     { sequences[0].getDisplayId(true) }
-                    : new Object[]
-            { MessageManager.getString("label.selection") })), 500, 400);
+                            : new Object[]
+                            { MessageManager
+                                    .getString("label.selection") })),
+            500, 400);
 
   }
 
@@ -1726,8 +1781,8 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
             "       " + MessageManager.getString("label.sequence_name")
                     + " ",
             MessageManager.getString("label.sequence_description") + " ",
-            MessageManager
-                    .getString("label.edit_sequence_name_description"),
+            MessageManager.getString(
+                    "label.edit_sequence_name_description"),
             ap.alignFrame);
 
     if (!dialog.accept)
@@ -1912,9 +1967,8 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
   {
     CutAndPasteTransfer cap = new CutAndPasteTransfer();
     cap.setForInput(null);
-    Desktop.addInternalFrame(cap,
-            MessageManager.formatMessage("label.alignment_output_command",
-                    new Object[]
+    Desktop.addInternalFrame(cap, MessageManager
+            .formatMessage("label.alignment_output_command", new Object[]
             { e.getActionCommand() }), 600, 500);
 
     String[] omitHidden = null;
@@ -1957,11 +2011,17 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
       }
     }
 
-    if (ap.getSeqPanel().seqCanvas.getFeatureRenderer().amendFeatures(seqs,
-            features, true, ap))
+    /*
+     * an entirely gapped region will generate empty lists of sequence / features
+     */
+    if (!seqs.isEmpty())
     {
-      ap.alignFrame.setShowSeqFeatures(true);
-      ap.highlightSearchResults(null);
+      if (ap.getSeqPanel().seqCanvas.getFeatureRenderer()
+              .amendFeatures(seqs, features, true, ap))
+      {
+        ap.alignFrame.setShowSeqFeatures(true);
+        ap.highlightSearchResults(null);
+      }
     }
   }