add partial button fix to annotation and statistics output
[jalview.git] / src / jalview / gui / AlignFrame.java
index 4073e3e..cce4e67 100644 (file)
@@ -54,6 +54,7 @@ import jalview.datamodel.AlignmentOrder;
 import jalview.datamodel.AlignmentView;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.HiddenMarkovModel;
 import jalview.datamodel.HiddenSequences;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SeqCigar;
@@ -72,6 +73,7 @@ import jalview.io.FileFormats;
 import jalview.io.FileLoader;
 import jalview.io.FileParse;
 import jalview.io.FormatAdapter;
+import jalview.io.HMMFile;
 import jalview.io.HtmlSvgOutput;
 import jalview.io.IdentifyFile;
 import jalview.io.JPredFile;
@@ -85,7 +87,9 @@ import jalview.jbgui.GAlignFrame;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ColourSchemes;
 import jalview.schemes.ResidueColourScheme;
+import jalview.schemes.ResidueProperties;
 import jalview.schemes.TCoffeeColourScheme;
+import jalview.util.Comparison;
 import jalview.util.MessageManager;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.viewmodel.ViewportRanges;
@@ -121,7 +125,9 @@ import java.awt.event.MouseEvent;
 import java.awt.print.PageFormat;
 import java.awt.print.PrinterJob;
 import java.beans.PropertyChangeEvent;
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.PrintWriter;
 import java.net.URL;
@@ -129,8 +135,11 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Deque;
 import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Map;
+import java.util.Scanner;
 import java.util.Vector;
 
 import javax.swing.JCheckBoxMenuItem;
@@ -152,6 +161,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         IProgressIndicator, AlignViewControllerGuiI, ColourChangeListener
 {
 
+  Map<String, Float> distribution = new HashMap<>(); // temporary
+
   public static final int DEFAULT_WIDTH = 700;
 
   public static final int DEFAULT_HEIGHT = 500;
@@ -167,7 +178,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   public AlignViewControllerI avc;
 
-  List<AlignmentPanel> alignPanels = new ArrayList<AlignmentPanel>();
+  List<AlignmentPanel> alignPanels = new ArrayList<>();
 
   /**
    * Last format used to load or save alignments in this window
@@ -179,6 +190,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   String fileName = null;
 
+
   /**
    * Creates a new AlignFrame object with specific width and height.
    * 
@@ -396,8 +408,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     addKeyListener();
 
-    final List<AlignmentPanel> selviews = new ArrayList<AlignmentPanel>();
-    final List<AlignmentPanel> origview = new ArrayList<AlignmentPanel>();
+    final List<AlignmentPanel> selviews = new ArrayList<>();
+    final List<AlignmentPanel> origview = new ArrayList<>();
     final String menuLabel = MessageManager
             .getString("label.copy_format_from");
     ViewSelectionMenu vsel = new ViewSelectionMenu(menuLabel,
@@ -410,7 +422,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 origview.clear();
                 origview.add(alignPanel);
                 // make an array of all alignment panels except for this one
-                List<AlignmentPanel> aps = new ArrayList<AlignmentPanel>(
+                List<AlignmentPanel> aps = new ArrayList<>(
                         Arrays.asList(Desktop.getAlignmentPanels(null)));
                 aps.remove(AlignFrame.this.alignPanel);
                 return aps.toArray(new AlignmentPanel[aps.size()]);
@@ -691,23 +703,21 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         case KeyEvent.VK_PAGE_UP:
           if (viewport.getWrapAlignment())
           {
-            alignPanel.scrollUp(true);
+            vpRanges.scrollUp(true);
           }
           else
           {
-            alignPanel.setScrollValues(vpRanges.getStartRes(),
-                    2 * vpRanges.getStartSeq() - vpRanges.getEndSeq());
+            vpRanges.pageUp();
           }
           break;
         case KeyEvent.VK_PAGE_DOWN:
           if (viewport.getWrapAlignment())
           {
-            alignPanel.scrollUp(false);
+            vpRanges.scrollUp(false);
           }
           else
           {
-            alignPanel.setScrollValues(vpRanges.getStartRes(),
-                    vpRanges.getEndSeq());
+            vpRanges.pageDown();
           }
           break;
         }
@@ -920,6 +930,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     showConsensusHistogram.setSelected(av.isShowConsensusHistogram());
     showSequenceLogo.setSelected(av.isShowSequenceLogo());
     normaliseSequenceLogo.setSelected(av.isNormaliseSequenceLogo());
+    showInformationHistogram.setSelected(av.isShowInformationHistogram());
+    showHMMSequenceLogo.setSelected(av.isShowHMMSequenceLogo());
+    normaliseHMMSequenceLogo.setSelected(av.isNormaliseHMMSequenceLogo());
 
     ColourMenuHelper.setColourSelected(colourMenu,
             av.getGlobalColourScheme());
@@ -1734,7 +1747,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   synchronized void slideSequences(boolean right, int size)
   {
-    List<SequenceI> sg = new ArrayList<SequenceI>();
+    List<SequenceI> sg = new ArrayList<>();
     if (viewport.cursorMode)
     {
       sg.add(viewport.getAlignment().getSequenceAt(
@@ -1753,7 +1766,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       return;
     }
 
-    List<SequenceI> invertGroup = new ArrayList<SequenceI>();
+    List<SequenceI> invertGroup = new ArrayList<>();
 
     for (SequenceI seq : viewport.getAlignment().getSequences())
     {
@@ -1886,7 +1899,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     ArrayList<int[]> hiddenColumns = null;
     if (viewport.hasHiddenColumns())
     {
-      hiddenColumns = new ArrayList<int[]>();
+      hiddenColumns = new ArrayList<>();
       int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport
               .getSelectionGroup().getEndRes();
       for (int[] region : viewport.getAlignment().getHiddenColumns()
@@ -1996,7 +2009,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       }
 
       int alwidth = 0;
-      ArrayList<Integer> newGraphGroups = new ArrayList<Integer>();
+      ArrayList<Integer> newGraphGroups = new ArrayList<>();
       int fgroup = -1;
 
       if (newAlignment)
@@ -2828,7 +2841,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   protected List<String> getExistingViewNames(List<Component> comps)
   {
-    List<String> existingNames = new ArrayList<String>();
+    List<String> existingNames = new ArrayList<>();
     for (Component comp : comps)
     {
       if (comp instanceof AlignmentPanel)
@@ -3280,7 +3293,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     frame.setContentPane(overview);
     Desktop.addInternalFrame(frame, MessageManager.formatMessage(
             "label.overview_params", new Object[] { this.getTitle() }),
-            frame.getWidth(), frame.getHeight());
+            true, frame.getWidth(), frame.getHeight(), true, true);
     frame.pack();
     frame.setLayer(JLayeredPane.PALETTE_LAYER);
     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
@@ -3762,7 +3775,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     List<Component> comps = PaintRefresher.components.get(viewport
             .getSequenceSetId());
-    List<TreePanel> treePanels = new ArrayList<TreePanel>();
+    List<TreePanel> treePanels = new ArrayList<>();
     for (Component comp : comps)
     {
       if (comp instanceof TreePanel)
@@ -4022,7 +4035,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       @Override
       public void run()
       {
-        final List<JMenuItem> legacyItems = new ArrayList<JMenuItem>();
+        final List<JMenuItem> legacyItems = new ArrayList<>();
         try
         {
           // System.err.println("Building ws menu again "
@@ -4037,7 +4050,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           // TODO: group services by location as well as function and/or
           // introduce
           // object broker mechanism.
-          final Vector<JMenu> wsmenu = new Vector<JMenu>();
+          final Vector<JMenu> wsmenu = new Vector<>();
           final IProgressIndicator af = me;
 
           /*
@@ -4405,8 +4418,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     // Java's Transferable for native dnd
     evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
     Transferable t = evt.getTransferable();
-    List<String> files = new ArrayList<String>();
-    List<DataSourceType> protocols = new ArrayList<DataSourceType>();
+    List<String> files = new ArrayList<>();
+    List<DataSourceType> protocols = new ArrayList<>();
 
     try
     {
@@ -4426,8 +4439,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         /**
          * Object[] { String,SequenceI}
          */
-        ArrayList<Object[]> filesmatched = new ArrayList<Object[]>();
-        ArrayList<String> filesnotmatched = new ArrayList<String>();
+        ArrayList<Object[]> filesmatched = new ArrayList<>();
+        ArrayList<String> filesnotmatched = new ArrayList<>();
         for (int i = 0; i < files.size(); i++)
         {
           String file = files.get(i).toString();
@@ -4651,6 +4664,160 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                             "label.successfully_loaded_matrix",
                             sm.getMatrixName()));
           }
+          else if (FileFormat.HMMER3.equals(format))
+          {
+            HMMFile hmmFile = new HMMFile(new FileParse(file, sourceType)); // TODO
+                                                                            // need
+                                                                            // to
+                                                                            // follow
+                                                                            // standard
+                                                                            // pipeline
+            hmmFile.parse();
+            HiddenMarkovModel hmm = hmmFile.getHMM();
+            AlignmentAnnotation annotation = hmm.createAnnotation(
+                    getViewport().getAlignment().getWidth());
+            getViewport().getAlignment().addAnnotation(annotation);
+            annotation.setHMM(hmm);
+            isAnnotation = true;
+
+            BufferedReader input = new BufferedReader(new FileReader(
+                    "H:/Desktop/Distributions/BadAlignment-8.csv"));
+            String line = input.readLine();
+
+            while (!("".equals(line)) && line != null)
+            {
+              Scanner scanner = new Scanner(line);
+              if (scanner.hasNext())
+              {
+                scanner.useDelimiter(",");
+                String value = scanner.next();
+
+                distribution.put(value, scanner.nextFloat());
+                line = input.readLine();
+              }
+            }
+
+
+            AlignmentI alignment = getViewport().getAlignment();
+            Integer alpha = 0;
+            final int AMINO = 0;
+            final int DNA = 1;
+            if ("amino".equals(hmm.getAlphabetType()))
+            {
+              alpha = AMINO;
+            }
+            else if ("DNA".equals(hmm.getAlphabetType()))
+            {
+              alpha = DNA;
+            }
+            
+
+            int size = 0;
+
+            for (int l = 1; l < hmm.getLength() + 1; l++)
+            {
+              for (int n = 0; n < alignment.getHeight(); n++)
+              {
+
+                char character = alignment.getSequenceAt(n)
+                        .getCharAt(hmm.getNodeAlignmentColumn(l));
+                character = Character.toUpperCase(character);
+
+                boolean containedN;
+                boolean containedA;
+
+                containedN = ResidueProperties.nucleotideBackgroundFrequencies
+                        .containsKey(character);
+                containedA = ResidueProperties.aminoBackgroundFrequencies
+                        .containsKey(character);
+
+                if (!Comparison.isGap(character)
+                        && ((alpha == DNA && containedN)
+                                || (alpha == AMINO && containedA)))
+                {
+                  size++;
+                }
+
+              }
+            }
+            
+            for (int l = 1; l < hmm.getLength() + 1; l++)
+            {
+              for (int n = 0; n < alignment.getHeight(); n++)
+              {
+                Double prob;
+                char character;
+                character = alignment.getSequenceAt(n)
+                        .getCharAt(hmm.getNodeAlignmentColumn(l));
+                character = Character.toUpperCase(character);
+                boolean containedN;
+                boolean containedA;
+
+                containedN = ResidueProperties.nucleotideBackgroundFrequencies
+                        .containsKey(character);
+                containedA = ResidueProperties.aminoBackgroundFrequencies
+                        .containsKey(character);
+
+                if (!Comparison.isGap(character)
+                        && ((alpha == DNA && containedN)
+                                || (alpha == AMINO && containedA)))
+                {
+                  prob = hmm.getMatchEmissionProbability(
+                          hmm.getNodeAlignmentColumn(l), character);
+                  if (prob == 0d)
+                  {
+                    System.out.println("?");
+                  }
+
+                  double freq = 0;
+                  if (alpha == AMINO)
+                  {
+                    freq = ResidueProperties.aminoBackgroundFrequencies
+                            .get(character);
+                  }
+                  if (alpha == DNA)
+                  {
+                    freq = ResidueProperties.nucleotideBackgroundFrequencies
+                            .get(character);
+                  }
+                    Double doubleValue = Math.log(prob / freq);
+
+                      String value = String.format("%.1f", doubleValue);
+                      if ("-0.0".equals(value))
+                      {
+                        value = "0.0";
+                      }
+                        if (distribution.containsKey(value))
+                        {
+                        float prev = distribution.get(value);
+                        prev = prev + (10000f / size);
+                          distribution.put(value, prev);
+                        }
+                        else
+                        {
+                    distribution.put(value, 10000f / size);
+                        }
+
+
+                }
+            
+              }
+            }
+            
+            PrintWriter writer = new PrintWriter(
+                    new File(
+                            "H:/Desktop/Distributions/BadAlignment-8.csv"));
+            for (Map.Entry<String, Float> entry : distribution
+                    .entrySet())
+            {
+              writer.println(entry.getKey() + "," + entry.getValue());
+            
+            }
+            
+            writer.close();
+
+
+          }
           else if (FileFormat.Jnet.equals(format))
           {
             JPredFile predictions = new JPredFile(file, sourceType);
@@ -5269,6 +5436,30 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   }
 
   @Override
+  protected void showInformationHistogram_actionPerformed(ActionEvent e)
+  {
+    viewport.setShowInformationHistogram(
+            showInformationHistogram.getState());
+    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
+  }
+
+  @Override
+  protected void showHMMSequenceLogo_actionPerformed(ActionEvent e)
+  {
+    viewport.setShowHMMSequenceLogo(showHMMSequenceLogo.getState());
+    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
+  }
+
+  @Override
+  protected void normaliseHMMSequenceLogo_actionPerformed(ActionEvent e)
+  {
+    showHMMSequenceLogo.setState(true);
+    viewport.setShowHMMSequenceLogo(true);
+    viewport.setNormaliseHMMSequenceLogo(normaliseSequenceLogo.getState());
+    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
+  }
+
+  @Override
   protected void applyAutoAnnotationSettings_actionPerformed(ActionEvent e)
   {
     alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
@@ -5418,7 +5609,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       return;
     }
-    List<SequenceI> cdnaSeqs = new ArrayList<SequenceI>();
+    List<SequenceI> cdnaSeqs = new ArrayList<>();
     for (SequenceI aaSeq : alignment.getSequences())
     {
       for (AlignedCodonFrame acf : mappings)