diff --git a/uk/ac/sanger/artemis/components/alignment/BamView.java b/uk/ac/sanger/artemis/components/alignment/BamView.java index 2ef2f7b7534b3c51172ca2cfc641ad371bc5fc38..19a308179838740251d3c41cb113c4527fe9dbac 100644 --- a/uk/ac/sanger/artemis/components/alignment/BamView.java +++ b/uk/ac/sanger/artemis/components/alignment/BamView.java @@ -122,6 +122,7 @@ public class BamView extends JPanel private static final long serialVersionUID = 1L; private List<SAMRecord> readsInView; private Hashtable<String, Integer> seqLengths = new Hashtable<String, Integer>(); + private Hashtable<String, Integer> offsetLengths; private Vector<String> seqNames = new Vector<String>(); private String bam; @@ -477,16 +478,19 @@ public class BamView extends JPanel { if(!concatSequences) return 0; - int offset = 0; - for(int i=0; i<combo.getItemCount(); i++) - { - String thisSeqName = (String) combo.getItemAt(i); - if(refName.equals(thisSeqName)) - return offset; - - offset += seqLengths.get(combo.getItemAt(i)); + + if(offsetLengths == null) + { + offsetLengths = new Hashtable<String, Integer>(combo.getItemCount()); + int offset = 0; + for(int i=0; i<combo.getItemCount(); i++) + { + String thisSeqName = (String) combo.getItemAt(i); + offsetLengths.put(thisSeqName, offset); + offset += seqLengths.get(combo.getItemAt(i)); + } } - return offset; + return offsetLengths.get(refName); } /** @@ -517,11 +521,6 @@ public class BamView extends JPanel if(end > seqLength) end = seqLength; } - - - //System.out.println(start+".."+end+" " + - // "sequence length = "+getSequenceLength()+ - // " pixPerBase="+pixPerBase); boolean changeToStackView = false; MemoryMXBean memory = ManagementFactory.getMemoryMXBean(); @@ -529,42 +528,49 @@ public class BamView extends JPanel lastend != end) { setCursor(cbusy); - try + synchronized (this) { - float heapFractionUsedBefore = (float)((float)memory.getHeapMemoryUsage().getUsed()/(float)memory.getHeapMemoryUsage().getMax()); - //System.out.println("Heap memory used before "+heapFractionUsedBefore+"\n"); - - readFromBamPicard(start, end); + try + { + float heapFractionUsedBefore = (float) ((float) memory.getHeapMemoryUsage().getUsed() / + (float) memory.getHeapMemoryUsage().getMax()); + readFromBamPicard(start, end); + float heapFractionUsedAfter = (float) ((float) memory.getHeapMemoryUsage().getUsed() / + (float) memory.getHeapMemoryUsage().getMax()); + + // System.out.println("Heap Max : "+memory.getHeapMemoryUsage().getMax()); + // System.out.println("Heap Used : "+memory.getHeapMemoryUsage().getUsed()); + // System.out.println("Heap memory used "+heapFractionUsedAfter); + + if ((heapFractionUsedAfter - heapFractionUsedBefore) > 0.06 + && !isStackView && heapFractionUsedAfter > 0.8) + { + checkBoxStackView.setSelected(true); + isStackView = true; + changeToStackView = true; + } - float heapFractionUsedAfter = - (float)((float)memory.getHeapMemoryUsage().getUsed()/ - (float)memory.getHeapMemoryUsage().getMax()); - - //System.out.println("Heap Max : "+memory.getHeapMemoryUsage().getMax()); - //System.out.println("Heap Used : "+memory.getHeapMemoryUsage().getUsed()); - //System.out.println("Heap memory used "+heapFractionUsedAfter); + if ((!isStackView && !isStrandStackView) + || pixPerBase * 1.08f >= ALIGNMENT_PIX_PER_BASE) + { + Collections.sort(readsInView, new SAMRecordComparator()); + } - if((heapFractionUsedAfter-heapFractionUsedBefore) > 0.06 && !isStackView && - heapFractionUsedAfter > 0.8) + setCursor(cdone); + } + catch (OutOfMemoryError ome) { - checkBoxStackView.setSelected(true); - isStackView = true; - changeToStackView = true; + JOptionPane.showMessageDialog(this, "Out of Memory"); + readsInView.clear(); + return; } - - if((!isStackView && !isStrandStackView) || pixPerBase*1.08f >= ALIGNMENT_PIX_PER_BASE) - Collections.sort(readsInView, new SAMRecordComparator()); - - setCursor(cdone); - } - catch(OutOfMemoryError ome) - { - JOptionPane.showMessageDialog(this, "Out of Memory"); - readsInView.clear(); - return; } } + //System.out.println(start+".."+end+" " + + // "sequence length = "+getSequenceLength()+ + // " pixPerBase="+pixPerBase); + laststart = start; lastend = end; if(showBaseAlignment) @@ -674,33 +680,42 @@ public class BamView extends JPanel for(int i=0; i<readsInView.size(); i++) drawn[i] = false; - for(int i=0; i<readsInView.size(); i++) + Rectangle r = jspView.getViewport().getViewRect(); + int nreads = readsInView.size(); + + for(int i=0; i<nreads; i++) { if (!drawn[i]) { - SAMRecord thisRead = readsInView.get(i); ypos+=11; - - drawSequence(g2, thisRead, ypos, refSeq, refSeqStart); + + SAMRecord thisRead = readsInView.get(i); + if(ypos < r.getMaxY() || ypos > r.getMinY()) + drawSequence(g2, thisRead, ypos, refSeq, refSeqStart); drawn[i] = true; int thisEnd = thisRead.getAlignmentEnd(); if(thisEnd == 0) thisEnd = thisRead.getAlignmentStart()+thisRead.getReadLength(); - for(int j=i+1; j<readsInView.size(); j++) + for(int j=i+1; j<nreads; j++) { if (!drawn[j]) { SAMRecord nextRead = readsInView.get(j); - if(nextRead.getAlignmentStart() > thisEnd+1) + int nextStart = nextRead.getAlignmentStart(); + if(nextStart > thisEnd+1) { - drawSequence(g2, nextRead, ypos, refSeq, refSeqStart); + if(ypos < r.getMaxY() || ypos > r.getMinY()) + drawSequence(g2, nextRead, ypos, refSeq, refSeqStart); + drawn[j] = true; thisEnd = nextRead.getAlignmentEnd(); if(thisEnd == 0) - thisEnd = nextRead.getAlignmentStart()+nextRead.getReadLength(); + thisEnd = nextStart+nextRead.getReadLength(); } + else if(ypos > r.getMaxY() || ypos < r.getMinY()) + break; } } } @@ -813,7 +828,7 @@ public class BamView extends JPanel scaleHeight = 0; int baseAtStartOfView = getBaseAtStartOfView(); - Rectangle r = jspView.getViewport().getVisibleRect(); + Rectangle r = jspView.getViewport().getViewRect(); for(int i=0; i<readsInView.size(); i++) { @@ -826,7 +841,7 @@ public class BamView extends JPanel if(isSingle) { int ypos = (getHeight() - scaleHeight) - samRecord.getReadString().length(); - if(ypos > r.getMaxX() || ypos < r.getMinY()) + if(ypos > r.getMaxY() || ypos < r.getMinY()) continue; g2.setColor(Color.black); @@ -836,7 +851,7 @@ public class BamView extends JPanel } int ypos = (getHeight() - scaleHeight) - ( Math.abs(samRecord.getInferredInsertSize()) ); - if(ypos > r.getMaxX() || ypos < r.getMinY()) + if(ypos > r.getMaxY() || ypos < r.getMinY()) continue; if(i < readsInView.size()-1) @@ -922,7 +937,7 @@ public class BamView extends JPanel int lstEnd = 0; int baseAtStartOfView = getBaseAtStartOfView(); g2.setColor(Color.blue); - Rectangle r = jspView.getViewport().getVisibleRect(); + Rectangle r = jspView.getViewport().getViewRect(); for(int i=0; i<readsInView.size(); i++) { @@ -954,7 +969,7 @@ public class BamView extends JPanel lstStart = recordStart; lstEnd = recordEnd; - if(ypos > r.getMaxX() || ypos < r.getMinY()) + if(ypos > r.getMaxY() || ypos < r.getMinY()) continue; drawRead(g2, samRecord, pixPerBase, ypos, baseAtStartOfView); } @@ -1011,7 +1026,7 @@ public class BamView extends JPanel int lstEnd = 0; int baseAtStartOfView = getBaseAtStartOfView(); g2.setColor(Color.blue); - Rectangle r = jspView.getViewport().getVisibleRect(); + Rectangle r = jspView.getViewport().getViewRect(); for(int i=0; i<readsInView.size(); i++) { @@ -1045,7 +1060,7 @@ public class BamView extends JPanel lstStart = recordStart; lstEnd = recordEnd; - if(ypos > r.getMaxX() || ypos < r.getMinY()) + if(ypos > r.getMaxY() || ypos < r.getMinY()) continue; drawRead(g2, samRecord, pixPerBase, ypos, baseAtStartOfView); } @@ -1129,7 +1144,7 @@ public class BamView extends JPanel int ypos = getHeight() - scaleHeight - 3; int lastEnd = 0; int baseAtStartOfView = getBaseAtStartOfView(); - Rectangle r = jspView.getViewport().getVisibleRect(); + Rectangle r = jspView.getViewport().getViewRect(); for(int i=0; i<pairedReads.size(); i++) { @@ -1149,7 +1164,7 @@ public class BamView extends JPanel else ypos = ypos - 3; - if(ypos > r.getMaxX() || ypos < r.getMinY()) + if(ypos > r.getMaxY() || ypos < r.getMinY()) continue; g2.setStroke(originalStroke); @@ -2160,7 +2175,7 @@ public class BamView extends JPanel else { setDisplay(event.getStart(), - event.getStart()+feature_display.getMaxVisibleBases(), event); + event.getStart()+feature_display.getMaxVisibleBases(), event); repaint(); } return null; diff --git a/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java b/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java index 42875b732a0e50f6615b61f2e74bdb5d0e97cc93..497ea1df63d1d3e9edc0c81dcbedf50d5f070a38 100644 --- a/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java +++ b/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java @@ -80,7 +80,7 @@ import net.sf.samtools.SAMRecord; for(int j=0; j<length;j++) { int bin = - Math.round(((thisRead.getAlignmentStart()-start) + j + offset) / windowSize); + (int)(((thisRead.getAlignmentStart()-start) + j + offset) / windowSize); if(bin < 0 || bin > coverage.length-1) continue;