From 10ff929859f2ae9afd8f6e7361879096e44a919e Mon Sep 17 00:00:00 2001
From: tjc <tjc@ee4ac58c-ac51-4696-9907-e4b3aa274f04>
Date: Thu, 10 Mar 2011 12:39:23 +0000
Subject: [PATCH] fix for changing window size in coverage plots

git-svn-id: svn+ssh://svn.internal.sanger.ac.uk/repos/svn/pathsoft/artemis/trunk@15700 ee4ac58c-ac51-4696-9907-e4b3aa274f04
---
 .../artemis/components/alignment/BamView.java | 75 ++++++-------------
 .../components/alignment/CoveragePanel.java   | 51 ++++---------
 2 files changed, 37 insertions(+), 89 deletions(-)

diff --git a/uk/ac/sanger/artemis/components/alignment/BamView.java b/uk/ac/sanger/artemis/components/alignment/BamView.java
index 30817c4e7..024494706 100644
--- a/uk/ac/sanger/artemis/components/alignment/BamView.java
+++ b/uk/ac/sanger/artemis/components/alignment/BamView.java
@@ -66,6 +66,7 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Vector;
 
+import javax.swing.BorderFactory;
 import javax.swing.ButtonGroup;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
@@ -223,7 +224,6 @@ public class BamView extends JPanel
                  int nbasesInView)
   {
     super();
-    
     setBackground(Color.white);
     this.bamList = bamList;
     this.nbasesInView = nbasesInView;
@@ -442,7 +442,7 @@ public class BamView extends JPanel
             thisEnd = thisLength;
           
           //System.out.println("READ "+seqNames.get(i)+"  "+thisStart+".."+thisEnd);
-          iterateOverBam(inputSam, seqNames.get(i), thisStart, thisEnd, bamIndex, pixPerBase);
+          iterateOverBam(inputSam, seqNames.get(i), thisStart, thisEnd, bamIndex, pixPerBase, bam);
         }
         lastLen = len;
       }
@@ -450,7 +450,7 @@ public class BamView extends JPanel
     else
     {
       String refName = (String) combo.getSelectedItem();
-      iterateOverBam(inputSam, refName, start, end, bamIndex, pixPerBase);
+      iterateOverBam(inputSam, refName, start, end, bamIndex, pixPerBase, bam);
     }
     
     //inputSam.close();
@@ -468,7 +468,8 @@ public class BamView extends JPanel
    */
   private void iterateOverBam(final SAMFileReader inputSam, 
                               String refName, int start, int end,
-                              int bamIndex, float pixPerBase)
+                              int bamIndex, float pixPerBase,
+                              String bam)
   { 
     boolean multipleBAM = false;
     if(bamList.size() > 1)
@@ -478,6 +479,8 @@ public class BamView extends JPanel
     MemoryMXBean memory = ManagementFactory.getMemoryMXBean();
     int checkMemAfter = 8000;
     int cnt = 0;
+    int seqOffset = getSequenceOffset(refName);
+    int offset = seqOffset- getBaseAtStartOfView();
     
     while ( it.hasNext() )
     {
@@ -495,11 +498,14 @@ public class BamView extends JPanel
             if(multipleBAM)
               samRecord.setAttribute("FL", bamIndex);
             
-            if(isCoverageView(pixPerBase) || isCoverage)
-              coverageView.addRecord(samRecord);
+            if(isCoverageView(pixPerBase))
+              coverageView.addRecord(samRecord, offset, bam);
+            
+            if(isCoverage)
+              coveragePanel.addRecord(samRecord, offset, bam);
             
             if(isSNPplot)
-              snpPanel.addRecord(samRecord);
+              snpPanel.addRecord(samRecord, seqOffset);
             
             if(!isCoverageView(pixPerBase))
               readsInView.add(samRecord);
@@ -633,20 +639,20 @@ public class BamView extends JPanel
       if(end > seqLength)
         end = seqLength;
     }
-    
-    
+
     boolean changeToStackView = false;
     MemoryMXBean memory = ManagementFactory.getMemoryMXBean();
     if(laststart != start ||
        lastend   != end ||
-       coverageView.isRedraw())
+       CoveragePanel.isRedraw())
     {
-      if(isCoverageView(pixPerBase) || isCoverage)
+      if(isCoverageView(pixPerBase))
         coverageView.init(this, pixPerBase, start, end);
-      
+      if(isCoverage)
+        coveragePanel.init(this, pixPerBase, start, end);
       if(isSNPplot)
         snpPanel.init(this, pixPerBase, start, end);
-      
+
       synchronized (this)
       {
         try
@@ -705,11 +711,7 @@ public class BamView extends JPanel
         }
       }
     }
-    
-    //System.out.println(start+".."+end+" " +
-    //    "sequence length = "+getSequenceLength()+
-    //    " pixPerBase="+pixPerBase);
-       
+
     laststart = start;
     lastend   = end;
     
@@ -728,17 +730,9 @@ public class BamView extends JPanel
 	  else
 	    drawLineView(g2, seqLength, pixPerBase, start, end);
 	  if(isCoverage)
-	  {
-	    coveragePanel.setStartAndEnd(start, end);
-	    coveragePanel.setPixPerBase(pixPerBase);
 	    coveragePanel.repaint();
-	  }
 	  if(isSNPplot)
-	  {
-	    snpPanel.setStartAndEnd(start, end);
-	    snpPanel.setPixPerBase(pixPerBase);
 	    snpPanel.repaint();
-	  }
 	}
 
 	if(waitingFrame.isVisible())
@@ -2077,7 +2071,7 @@ public class BamView extends JPanel
     jspView = new JScrollPane(this, 
         JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
         JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
-
+    jspView.setViewportBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.gray));
     setDisplay(1, nbasesInView, null);
     mainPanel.setLayout(new BorderLayout());
 
@@ -2103,10 +2097,6 @@ public class BamView extends JPanel
         public void adjustmentValueChanged(AdjustmentEvent e)
         {
           repaint();
-          if(coveragePanel != null)
-            coveragePanel.repaint();
-          if(snpPanel != null)
-            snpPanel.repaint();
         }
       });
       bottomPanel.add(scrollBar, BorderLayout.SOUTH);
@@ -2448,7 +2438,7 @@ public class BamView extends JPanel
     //
     JMenu coverageMenu = new JMenu("Coverage Options");
     coverageView.init(this, 0.f, 0, 0);
-    coverageView.createMenus(coverageMenu, BamView.this);
+    coverageView.createMenus(coverageMenu);
     viewMenu.add(new JSeparator());
     viewMenu.add(coverageMenu);
   }
@@ -2783,11 +2773,6 @@ public class BamView extends JPanel
     return readsInView;
   }
   
-  protected Hashtable<String, int[]> getCoveragePlotData()
-  {
-    return coverageView.getPlotData();
-  }
-  
   protected int getBasesInView()
   {
     return nbasesInView;
@@ -2876,28 +2861,12 @@ public class BamView extends JPanel
       int width = feature_display.getMaxVisibleBases();
       setZoomLevel(width);
       repaint();
-      if(coveragePanel != null && coveragePanel.isVisible()) 
-      {
-        coveragePanel.setStartAndEnd(BamView.this.startBase, BamView.this.endBase);
-        coveragePanel.setPixPerBase(getPixPerBaseByWidth());
-        coveragePanel.repaint();
-      }
-      if(snpPanel != null && snpPanel.isVisible())
-      {
-        snpPanel.setStartAndEnd(BamView.this.startBase, BamView.this.endBase);
-        snpPanel.setPixPerBase(getPixPerBaseByWidth());
-        snpPanel.repaint();
-      }
     }
     else
     {
       setDisplay(event.getStart(), 
         event.getStart()+feature_display.getMaxVisibleBases(), event);
       repaint();
-      if(coveragePanel != null && coveragePanel.isVisible())
-        coveragePanel.repaint();
-      if(snpPanel != null && snpPanel.isVisible())
-        snpPanel.repaint();
     }
   }
   
diff --git a/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java b/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java
index 9e332d9e3..3a287fcf1 100644
--- a/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java
+++ b/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java
@@ -57,27 +57,24 @@ import net.sf.samtools.SAMRecord;
     private int combinedCoverage[];
 
     private int nBins;
-    private boolean redraw = false;
+    private static boolean redraw = false;
     private boolean setMaxBases = false;
     
     protected CoveragePanel(final BamView bamView)
     {
       this();
       this.bamView = bamView;
-      //initPopupMenu(this, popup);
-      createMenus(popup, this);
+      createMenus(popup);
       addMouseListener(new PopupListener());
     }
     
     protected CoveragePanel()
     {
       super();
-      setBackground(Color.white);
-      addMouseListener(new PopupListener());
       setMaxBases = true;
     }
     
-    protected void createMenus(JComponent menu, final JPanel panel)
+    protected void createMenus(JComponent menu)
     {
       JMenuItem configure = new JMenuItem("Configure Line(s)...");
       configure.addActionListener(new ActionListener()
@@ -100,7 +97,7 @@ import net.sf.samtools.SAMRecord;
         public void actionPerformed(ActionEvent e)
         {
           defineOpts();
-          panel.repaint();
+          bamView.repaint();
         }
       });
       menu.add(optMenu);
@@ -113,8 +110,7 @@ import net.sf.samtools.SAMRecord;
     {
       super.paintComponent(g);
       Graphics2D g2 = (Graphics2D)g;
-      List<SAMRecord> readsInView = bamView.getReadsInView();
-      if(readsInView == null)
+      if(plots == null)
         return;
       drawPlot(g2);
       drawMax(g2);
@@ -126,7 +122,6 @@ import net.sf.samtools.SAMRecord;
       setPixPerBase(pixPerBase);
       setStartAndEnd(start, end);
       init();
-      redraw = false;
     }
     
     private void init()
@@ -157,9 +152,7 @@ import net.sf.samtools.SAMRecord;
 
     private void drawPlot(Graphics2D g2)
     {
-      init();
       max = 0;
-      plots = bamView.getCoveragePlotData();
       Enumeration<String> plotEum = plots.keys();
       while(plotEum.hasMoreElements())
       {
@@ -169,45 +162,36 @@ import net.sf.samtools.SAMRecord;
           if(max < thisPlot[i])
             max = thisPlot[i];
       }
-
       draw(g2, getWidth(), getHeight());
     }
     
-    protected void addRecord(SAMRecord thisRead)
+    protected void addRecord(SAMRecord thisRead, int offset, String fileName)
     {
-      int offset = bamView.getSequenceOffset(thisRead.getReferenceName());
-      offset = offset - bamView.getBaseAtStartOfView();
-
-      String fileName;
-      if(bamView.bamList.size() > 1)
-        fileName = bamView.bamList.get((Integer) thisRead.getAttribute("FL"));
-      else
-        fileName = bamView.bamList.get(0);
       int coverage[] = plots.get(fileName);
-      
       if(coverage == null)
       {
         coverage = new int[nBins];
         for(int k=0; k<coverage.length; k++)
           coverage[k] = 0;
         plots.put(fileName, coverage);
-      }         
-      
+      }
+
       List<AlignmentBlock> blocks = thisRead.getAlignmentBlocks();
       for(int j=0; j<blocks.size(); j++)
       {
         AlignmentBlock block = blocks.get(j);
+        int refStart = block.getReferenceStart();
         for(int k=0; k<block.getLength(); k++)
         {
-          int pos = block.getReferenceStart() + k + offset;
+          int pos = refStart + k + offset;
           int bin = pos/windowSize;
           if(bin < 0 || bin > nBins-1)
             continue;
-          
+
           coverage[bin]+=1;
           if(coverage[bin] > max)
             max = coverage[bin];
-          
+
           if(includeCombined)
           {
             combinedCoverage[bin]+=1;
@@ -228,7 +212,7 @@ import net.sf.samtools.SAMRecord;
       }
       else
         lines = getLineAttributes(size);
-      
+
       Enumeration<String> plotEum = plots.keys();
       while(plotEum.hasMoreElements())
       {
@@ -242,7 +226,6 @@ import net.sf.samtools.SAMRecord;
           index = bamView.bamList.indexOf(fileName);
         
         g2.setColor(lines[index].getLineColour());
-        
         if(lines[index].getPlotType() == LineAttributes.PLOT_TYPES[0])
         {
           g2.setStroke(lines[index].getStroke());
@@ -298,7 +281,7 @@ import net.sf.samtools.SAMRecord;
     /**
      * @return the redraw
      */
-    protected boolean isRedraw()
+    protected static boolean isRedraw()
     {
       if(redraw)
       {
@@ -378,9 +361,5 @@ import net.sf.samtools.SAMRecord;
         return;
       }
     }
-    
-    protected Hashtable<String, int[]> getPlotData()
-    {
-      return plots;
-    }
+
   }
\ No newline at end of file
-- 
GitLab