From ee5910a1d0ba890e309345e09df6f74285521477 Mon Sep 17 00:00:00 2001 From: tcarver <tjc> Date: Tue, 11 Mar 2014 15:04:12 +0000 Subject: [PATCH] refactor for read count and rpkm calculations --- .../components/alignment/BamUtils.java | 208 ++++++++-- .../artemis/components/alignment/BamView.java | 37 +- .../components/alignment/MappedReads.java | 359 ++++-------------- .../components/alignment/ReadCount.java | 40 ++ .../components/alignment/ReadCountDialog.java | 7 +- 5 files changed, 319 insertions(+), 332 deletions(-) create mode 100644 uk/ac/sanger/artemis/components/alignment/ReadCount.java diff --git a/uk/ac/sanger/artemis/components/alignment/BamUtils.java b/uk/ac/sanger/artemis/components/alignment/BamUtils.java index c064061f3..f66801196 100644 --- a/uk/ac/sanger/artemis/components/alignment/BamUtils.java +++ b/uk/ac/sanger/artemis/components/alignment/BamUtils.java @@ -28,12 +28,15 @@ import java.util.Hashtable; import java.util.List; import java.util.Vector; +import javax.swing.JProgressBar; + import net.sf.samtools.AlignmentBlock; import net.sf.samtools.SAMFileReader; import net.sf.samtools.SAMRecord; import net.sf.samtools.util.CloseableIterator; import uk.ac.sanger.artemis.Feature; import uk.ac.sanger.artemis.FeatureSegmentVector; +import uk.ac.sanger.artemis.FeatureVector; import uk.ac.sanger.artemis.io.Range; class BamUtils @@ -69,24 +72,21 @@ class BamUtils * @return */ protected static float[] getCount( + final BamView bamView, final int start, final int end, final String bam, - final String refName, - final Hashtable<String, SAMFileReader> samFileReaderHash, - final Vector<String> seqNames, - final HashMap<String, Integer> offsetLengths, - final boolean concatSequences, - final HashMap<String, Integer> seqLengths, - final SAMRecordPredicate samRecordFlagPredicate, - final SAMRecordMapQPredicate samRecordMapQPredicate, final boolean contained, final boolean useStrandTag) { + final Vector<String> seqNames = bamView.getSeqNames(); + final HashMap<String, Integer> offsetLengths = bamView.getOffsetLengths(); + final HashMap<String, Integer> seqLengths = bamView.getSeqLengths(); + int cnt[] = new int[2]; cnt[0] = 0; cnt[1] = 0; - if(concatSequences) + if(bamView.isConcatSequences()) { int len = 0; int lastLen = 1; @@ -108,8 +108,7 @@ class BamUtils if(thisEnd > thisLength) thisEnd = thisLength; - cnt = count(bam, samFileReaderHash, name, thisStart, thisEnd, - samRecordFlagPredicate, samRecordMapQPredicate, contained, true, useStrandTag); + cnt = count(bamView, bam, thisStart, thisEnd, contained, true, useStrandTag); } lastLen = len; @@ -117,8 +116,7 @@ class BamUtils } else { - cnt = count(bam, samFileReaderHash, refName, start, end, - samRecordFlagPredicate, samRecordMapQPredicate, contained, true, useStrandTag); + cnt = count(bamView, bam, start, end, contained, true, useStrandTag); } float cntf[] = new float[2]; @@ -127,17 +125,20 @@ class BamUtils return cntf; } - protected static int[] count(final String bam, - final Hashtable<String, SAMFileReader> samFileReaderHash, - final String refName, - final int start, - final int end, - final SAMRecordPredicate samRecordFlagPredicate, - final SAMRecordPredicate samRecordMapQPredicate, - final boolean contained, - final boolean byStrand, - final boolean useStrandTag) + protected static int[] count( + final BamView bamView, + final String bam, + final int start, + final int end, + final boolean contained, + final boolean byStrand, + final boolean useStrandTag) { + final String refName = (String) bamView.getCombo().getSelectedItem(); + final Hashtable<String, SAMFileReader> samFileReaderHash = bamView.getSamFileReaderHash(); + final SAMRecordPredicate samRecordFlagPredicate = bamView.getSamRecordFlagPredicate(); + final SAMRecordPredicate samRecordMapQPredicate = bamView.getSamRecordMapQPredicate(); + int cnt[] = new int[2]; cnt[0] = 0; cnt[1] = 0; @@ -164,29 +165,89 @@ class BamUtils it.close(); return cnt; } + + protected static int[] calc( + final BamView bamView, + final String refName, + final int sequenceLength, + final boolean useStrandTag, + final JProgressBar progressBar) + { + int mappedReads[] = new int[bamView.bamList.size()]; + int MAX_BASE_CHUNK = 2000 * 60; + boolean contained = false; + for (int i = 0; i < sequenceLength; i += MAX_BASE_CHUNK) + { + if(progressBar != null) + progressBar.setValue(i); + int sbegc = i; + int sendc = i + MAX_BASE_CHUNK - 1; + + for (int j = 0; j < bamView.bamList.size(); j++) + { + String bam = bamView.bamList.get(j); + if (bamView.isConcatSequences()) + { + int len = 0; + int lastLen = 1; + for (String name : bamView.getSeqNames()) + { + int thisLength = bamView.getSeqLengths().get(name); + len += thisLength; + + if ((lastLen >= sbegc && lastLen < sendc) + || (len >= sbegc && len < sendc) + || (sbegc >= lastLen && sbegc < len) + || (sendc >= lastLen && sendc < len)) + { + int offset = bamView.getOffsetLengths().get(name); + int thisStart = sbegc - offset; + if (thisStart < 1) + thisStart = 1; + int thisEnd = sendc - offset; + if (thisEnd > thisLength) + thisEnd = thisLength; + + mappedReads[j] += BamUtils.count(bamView, bam, thisStart, thisEnd, + contained, false, useStrandTag)[0]; + } + lastLen = len; + } + } + else + { + mappedReads[j] += BamUtils.count(bamView, bam, sbegc, sendc, + contained, false, useStrandTag)[0]; + } + } + } + return mappedReads; + } /** * Return the coverage for each base in a range for the forward and * reverse strand. + * @param bamView * @param bamFile - * @param samFileReaderHash - * @param refName * @param start * @param end - * @param samRecordFlagPredicate - * @param samRecordMapQPredicate + * @param concatShift + * @param cnt * @return */ - protected static int[][] countOverRange(final String bamFile, - final Hashtable<String, SAMFileReader> samFileReaderHash, - final String refName, - final int start, - final int end, - final int concatShift, - final int cnt[][], - final SAMRecordPredicate samRecordFlagPredicate, - final SAMRecordPredicate samRecordMapQPredicate) + protected static int[][] countOverRange( + final BamView bamView, + final String bamFile, + final int start, + final int end, + final int concatShift, + final int cnt[][]) { + final String refName = (String) bamView.getCombo().getSelectedItem(); + final Hashtable<String, SAMFileReader> samFileReaderHash = bamView.getSamFileReaderHash(); + final SAMRecordPredicate samRecordFlagPredicate = bamView.getSamRecordFlagPredicate(); + final SAMRecordPredicate samRecordMapQPredicate = bamView.getSamRecordMapQPredicate(); + SAMFileReader inputSam = samFileReaderHash.get(bamFile); final CloseableIterator<SAMRecord> it = inputSam.query(refName, start, end, false); @@ -226,5 +287,80 @@ class BamUtils it.close(); return cnt; } + + /** + * For a list of features calculate the read count for each + * @param bamView + * @param features + * @param contained + * @param useIntrons + * @param useStrandTag + * @param mappedReads + * @param progressBar + * @return + */ + protected static Hashtable<String, List<ReadCount>> calculateMappedReads( + final BamView bamView, + final FeatureVector features, + final boolean contained, + final boolean useIntrons, + final boolean useStrandTag, + final int mappedReads[], + final JProgressBar progressBar) + { + final Hashtable<String, List<ReadCount>> featureReadCount = + new Hashtable<String, List<ReadCount>>(); + for (int i = 0; i < features.size(); i++) + { + final Feature f = features.elementAt(i); + if(progressBar != null) + progressBar.setValue(i); + + int start = f.getRawFirstBase(); + int end = f.getRawLastBase(); + final float fLen = BamUtils.getFeatureLength(f); + List<ReadCount> sampleCounts = new Vector<ReadCount>(); + + for (int j = 0; j < bamView.bamList.size(); j++) + { + final String bam = bamView.bamList.get(j); + float cnt[] = new float[2]; + + cnt = BamUtils.getCount(bamView, start, end, bam, contained, useStrandTag); + if (!useIntrons && f.getSegments().size() > 1) + { + // remove reads contained by intron + for (int k = 0; k < f.getSegments().size()-1; k++) + { + int seg = k; + int nextSeg = k+1; + if(!f.isForwardFeature()) + { + seg = f.getSegments().size()-k-1; + nextSeg = seg-1; + } + + start = f.getSegments().elementAt(seg).getRawRange().getEnd(); + end = f.getSegments().elementAt(nextSeg).getRawRange().getStart(); + + float tmpcnt[] = new float[2]; + tmpcnt = BamUtils.getCount(bamView, start, end, bam, true, useStrandTag); + cnt[0] -= tmpcnt[0]; + cnt[1] -= tmpcnt[1]; + } + } + + if (mappedReads != null) + { + cnt[0] = (cnt[0] / (((float) mappedReads[j] / 1000000.f) * (fLen / 1000.f))); + cnt[1] = (cnt[1] / (((float) mappedReads[j] / 1000000.f) * (fLen / 1000.f))); + } + + sampleCounts.add( new ReadCount(cnt, f.isForwardFeature()) ); + } + featureReadCount.put(ReadCountDialog.getFeatureName(f), sampleCounts); + } + return featureReadCount; + } } diff --git a/uk/ac/sanger/artemis/components/alignment/BamView.java b/uk/ac/sanger/artemis/components/alignment/BamView.java index 8df3a9b15..602196b38 100644 --- a/uk/ac/sanger/artemis/components/alignment/BamView.java +++ b/uk/ac/sanger/artemis/components/alignment/BamView.java @@ -2582,9 +2582,7 @@ public class BamView extends JPanel return; //JOptionPane.showMessageDialog(null, yBox, "Read Count Option", JOptionPane.INFORMATION_MESSAGE); - new MappedReads(features, (String)combo.getSelectedItem(), samFileReaderHash, bamList, - seqNames, offsetLengths, concatSequences, seqLengths, - samRecordFlagPredicate, samRecordMapQPredicate, + new MappedReads(BamView.this, features, !overlap.isSelected(), spliced.isSelected(), colourByStrandTag.isSelected()); } }); @@ -2622,16 +2620,12 @@ public class BamView extends JPanel else if(bases != null) seqlen = bases.getLength(); - new MappedReads(features, (String)combo.getSelectedItem(), - samFileReaderHash, bamList, seqNames, offsetLengths, concatSequences, - seqLengths, seqlen, samRecordFlagPredicate, samRecordMapQPredicate, + new MappedReads(BamView.this, features, seqlen, !overlap.isSelected(), spliced.isSelected(), allRefSeqs.isSelected(), colourByStrandTag.isSelected()); - } + } }); - - - + final JMenuItem createFeatures = new JMenuItem("Create features from coverage peaks ..."); analyse.add(createFeatures); if(feature_display == null) @@ -3676,6 +3670,26 @@ public class BamView extends JPanel return combo; } + protected Hashtable<String, SAMFileReader> getSamFileReaderHash() + { + return samFileReaderHash; + } + + protected Vector<String> getSeqNames() + { + return seqNames; + } + + protected HashMap<String, Integer> getSeqLengths() + { + return seqLengths; + } + + protected HashMap<String, Integer> getOffsetLengths() + { + return offsetLengths; + } + private String getVersion() { final ClassLoader cl = this.getClass().getClassLoader(); @@ -4275,8 +4289,7 @@ public class BamView extends JPanel minBams.setValue(groupsFrame.getMaximumBamsInGroup()); } - new MappedReads((String)combo.getSelectedItem(),BamView.this, samFileReaderHash, - seqNames, offsetLengths, concatSequences, seqLengths, + new MappedReads(BamView.this, (useGroup.isSelected() ? groupsFrame : null), threshold.getValue(), minSize.getValue(), minBams.getValue(), cbOpposite.isSelected(), true); } diff --git a/uk/ac/sanger/artemis/components/alignment/MappedReads.java b/uk/ac/sanger/artemis/components/alignment/MappedReads.java index 7b13366f2..d47b5283c 100644 --- a/uk/ac/sanger/artemis/components/alignment/MappedReads.java +++ b/uk/ac/sanger/artemis/components/alignment/MappedReads.java @@ -9,7 +9,6 @@ import java.awt.event.ActionListener; import java.io.File; import java.text.DecimalFormat; import java.util.Enumeration; -import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.List; @@ -37,188 +36,93 @@ import uk.ac.sanger.artemis.sequence.MarkerRange; import uk.ac.sanger.artemis.util.OutOfRangeException; import uk.ac.sanger.artemis.util.ReadOnlyException; -import net.sf.samtools.SAMFileReader; - public class MappedReads { private JProgressBar progressBar; private JLabel progressTxt = new JLabel(); private FeatureVector features; - private String refName; - private Hashtable<String, SAMFileReader> samFileReaderHash; - private List<String> bamList; - private List<Short> hideBamList; - private Vector<String> seqNames; - private HashMap<String, Integer> offsetLengths; - private boolean concatSequences; - private HashMap<String, Integer> seqLengths; - private int sequenceLength; - private SAMRecordPredicate samRecordFlagPredicate; - private SAMRecordMapQPredicate samRecordMapQPredicate; + private BamView bamView; + private boolean contained; private boolean useIntrons; private boolean useStrandTag = false; - private JDialog dialog = new JDialog((JFrame)null, "Calculating", true);; - - private int mappedReads[]; + private JDialog dialog = new JDialog((JFrame)null, "Calculating", true); /** * Calculate the total number of mapped reads. - * @param refName - * @param samFileReaderHash - * @param bamList - * @param seqNames - * @param offsetLengths - * @param concatSequences - * @param seqLengths + * @param bamView + * @param features * @param sequenceLength + * @param contained + * @param useIntrons + * @param allRefSeqs + * @param useStrandTag */ public MappedReads( + final BamView bamView, final FeatureVector features, - final String refName, - final Hashtable<String, SAMFileReader> samFileReaderHash, - final List<String> bamList, - final Vector<String> seqNames, - final HashMap<String, Integer> offsetLengths, - final boolean concatSequences, - final HashMap<String, Integer> seqLengths, final int sequenceLength, - final SAMRecordPredicate samRecordFlagPredicate, - SAMRecordMapQPredicate samRecordMapQPredicate, final boolean contained, final boolean useIntrons, final boolean allRefSeqs, final boolean useStrandTag) { this.features = features; - this.refName = refName; - this.samFileReaderHash = samFileReaderHash; - this.bamList = bamList; - this.seqNames = seqNames; - this.offsetLengths = offsetLengths; - this.concatSequences = concatSequences; - this.seqLengths = seqLengths; - this.sequenceLength = sequenceLength; - this.samRecordFlagPredicate = samRecordFlagPredicate; - this.samRecordMapQPredicate = samRecordMapQPredicate; + this.bamView = bamView; this.contained = contained; this.useIntrons = useIntrons; this.useStrandTag = useStrandTag; - - progressBar = new JProgressBar(0, sequenceLength); - progressBar.setValue(0); - progressBar.setStringPainted(true); - JPanel panel = new JPanel(new BorderLayout()); - progressTxt.setText("Total number of mapped reads"); - panel.add(progressTxt, BorderLayout.NORTH); - panel.add(progressBar, BorderLayout.CENTER); - - dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - panel.setOpaque(true); - dialog.setContentPane(panel); - dialog.pack(); - centerDialog(); - - CalculateTotalMappedReads cmr = new CalculateTotalMappedReads(allRefSeqs); + showProgress(sequenceLength, "Total number of mapped reads"); + CalculateTotalMappedReads cmr = new CalculateTotalMappedReads(allRefSeqs, sequenceLength); cmr.start(); dialog.setVisible(true); } /** * Read count for selected features. + * @param bamView * @param features - * @param refName - * @param samFileReaderHash - * @param bamList - * @param seqNames - * @param offsetLengths - * @param concatSequences - * @param seqLengths - * @param samRecordFlagPredicate - * @param samRecordMapQPredicate * @param contained * @param useIntrons + * @param useStrandTag */ public MappedReads( + final BamView bamView, final FeatureVector features, - final String refName, - final Hashtable<String, SAMFileReader> samFileReaderHash, - final List<String> bamList, - final Vector<String> seqNames, - final HashMap<String, Integer> offsetLengths, - final boolean concatSequences, - final HashMap<String, Integer> seqLengths, - final SAMRecordPredicate samRecordFlagPredicate, - final SAMRecordMapQPredicate samRecordMapQPredicate, final boolean contained, final boolean useIntrons, final boolean useStrandTag) { + this.bamView = bamView; this.features = features; - this.refName = refName; - this.samFileReaderHash = samFileReaderHash; - this.bamList = bamList; - this.seqNames = seqNames; - this.offsetLengths = offsetLengths; - this.concatSequences = concatSequences; - this.seqLengths = seqLengths; - this.samRecordFlagPredicate = samRecordFlagPredicate; - this.samRecordMapQPredicate = samRecordMapQPredicate; + this.bamView = bamView; this.contained = contained; this.useIntrons = useIntrons; this.useStrandTag = useStrandTag; - - progressBar = new JProgressBar(0, features.size()); - progressBar.setValue(0); - progressBar.setStringPainted(true); - JPanel panel = new JPanel(new BorderLayout()); - progressTxt.setText("Number of mapped reads for "+features.size()+" features"); - panel.add(progressTxt, BorderLayout.NORTH); - panel.add(progressBar, BorderLayout.CENTER); - - panel.setOpaque(true); - dialog.setContentPane(panel); - dialog.pack(); - centerDialog(); - - CalculateMappedReads cmr = new CalculateMappedReads(); + showProgress(features.size(), "Number of mapped reads for "+features.size()+" features"); + CalculateMappedReads cmr = new CalculateMappedReads(null); cmr.start(); dialog.setVisible(true); } - - /** * Search for new features based on a threshold of read counts in the intergenic * and anti-sense regions of existing annotations. This should exclude rRNA and * tRNA regions. If two or more BAM files are loaded it should create features * based on the combined read peak span. - * @param refName * @param bamView - * @param samFileReaderHash - * @param bamList - * @param seqNames - * @param offsetLengths - * @param concatSequences - * @param seqLengths * @param groupsFrame * @param threshold * @param minSize * @param minBams - * @param readsOnOppositeStrand assume reads are on the opposite strand if true. + * @param readsOnOppositeStrand * @param contained */ public MappedReads( - final String refName, final BamView bamView, - final Hashtable<String, SAMFileReader> samFileReaderHash, - final Vector<String> seqNames, - final HashMap<String, Integer> offsetLengths, - final boolean concatSequences, - final HashMap<String, Integer> seqLengths, final GroupBamFrame groupsFrame, final int threshold, final int minSize, @@ -226,26 +130,26 @@ public class MappedReads final boolean readsOnOppositeStrand, final boolean contained) { - this.refName = refName; - this.samFileReaderHash = samFileReaderHash; - this.bamList = bamView.bamList; - this.hideBamList = bamView.hideBamList; - this.seqNames = seqNames; - this.offsetLengths = offsetLengths; - this.concatSequences = concatSequences; - this.seqLengths = seqLengths; - this.samRecordFlagPredicate = bamView.getSamRecordFlagPredicate(); - this.samRecordMapQPredicate = bamView.getSamRecordMapQPredicate(); - + this.bamView = bamView; this.contained = contained; final FeatureDisplay feature_display = bamView.getFeatureDisplay(); - progressBar = new JProgressBar(0, feature_display.getSequenceLength()); + showProgress(feature_display.getSequenceLength(), ""); + final CalculateNewFeatures cmr = new CalculateNewFeatures( + feature_display, (String) bamView.getCombo().getSelectedItem(), groupsFrame, + threshold, minSize, minBams, readsOnOppositeStrand); + cmr.start(); + dialog.setVisible(true); + } + + private void showProgress(int progressBarMax, String txt) + { + progressBar = new JProgressBar(0, progressBarMax); progressBar.setValue(0); progressBar.setStringPainted(true); JPanel panel = new JPanel(new BorderLayout()); - progressTxt.setText(""); + progressTxt.setText(txt); panel.add(progressTxt, BorderLayout.NORTH); panel.add(progressBar, BorderLayout.CENTER); @@ -254,11 +158,6 @@ public class MappedReads dialog.setContentPane(panel); dialog.pack(); centerDialog(); - - final CalculateNewFeatures cmr = new CalculateNewFeatures( - feature_display, refName, groupsFrame, threshold, minSize, minBams, readsOnOppositeStrand); - cmr.start(); - dialog.setVisible(true); } private void centerDialog() @@ -274,55 +173,18 @@ public class MappedReads class CalculateMappedReads extends SwingWorker { - Hashtable<String, List<ReadCount>> featureReadCount; + private Hashtable<String, List<ReadCount>> featureReadCount; + private int mappedReads[]; + + public CalculateMappedReads(final int mappedReads[]) + { + this.mappedReads = mappedReads; + } + public Object construct() { - featureReadCount = new Hashtable<String, List<ReadCount>>(); - for (int i = 0; i < features.size(); i++) - { - Feature f = features.elementAt(i); - progressBar.setValue(i); - - int start = f.getRawFirstBase(); - int end = f.getRawLastBase(); - float fLen = BamUtils.getFeatureLength(f); - List<ReadCount> sampleCounts = new Vector<ReadCount>(); - - for (int j = 0; j < bamList.size(); j++) - { - String bam = bamList.get(j); - float cnt[] = new float[2]; - - if (!useIntrons && f.getSegments().size() > 1) - { - for (int k = 0; k < f.getSegments().size(); k++) - { - start = f.getSegments().elementAt(k).getRawRange().getStart(); - end = f.getSegments().elementAt(k).getRawRange().getEnd(); - float tmpcnt[] = new float[2]; - tmpcnt = BamUtils.getCount(start, end, bam, refName, samFileReaderHash, - seqNames, offsetLengths, concatSequences, seqLengths, - samRecordFlagPredicate, samRecordMapQPredicate, contained, useStrandTag); - cnt[0] += tmpcnt[0]; - cnt[1] += tmpcnt[1]; - } - } - else - cnt = BamUtils.getCount(start, end, bam, refName, samFileReaderHash, seqNames, - offsetLengths, concatSequences, seqLengths, - samRecordFlagPredicate, samRecordMapQPredicate, contained, useStrandTag); - - if (mappedReads != null) - { - cnt[0] = (cnt[0] / (((float) mappedReads[j] / 1000000.f) * (fLen / 1000.f))); - cnt[1] = (cnt[1] / (((float) mappedReads[j] / 1000000.f) * (fLen / 1000.f))); - } - - sampleCounts.add( new ReadCount(cnt, f.isForwardFeature()) ); - } - - featureReadCount.put(ReadCountDialog.getFeatureName(f), sampleCounts); - } + featureReadCount = BamUtils.calculateMappedReads(bamView, features, + contained, useIntrons, useStrandTag, mappedReads, progressBar); return null; } @@ -341,9 +203,9 @@ public class MappedReads final StringBuilder titleToSave = new StringBuilder(); final StringBuilder body = new StringBuilder(); - for (int j = 0; j < bamList.size(); j++) + for (int j = 0; j < bamView.bamList.size(); j++) { - String bam = bamList.get(j); + String bam = bamView.bamList.get(j); hdr.append("#BAM: " + bam); if (mappedReads != null) { @@ -369,7 +231,7 @@ public class MappedReads } titleToSave.append("\t"); title.append("\t"); - for (String bam: bamList) + for (String bam: bamView.bamList) { String name = new File(bam).getName(); titleToSave.append(name+"\t"); @@ -409,7 +271,7 @@ public class MappedReads } title.append("\t"); titleToSave.append("\t"); - for (int j = 0; j < bamList.size(); j++) + for (int j = 0; j < bamView.bamList.size(); j++) { if(mappedReads != null) { @@ -481,88 +343,43 @@ public class MappedReads class CalculateTotalMappedReads extends SwingWorker { private boolean useAllRefSeqs; - CalculateTotalMappedReads(boolean useAllRefSeqs) + private int sequenceLength; + + CalculateTotalMappedReads(boolean useAllRefSeqs, final int sequenceLength) { this.useAllRefSeqs = useAllRefSeqs; + this.sequenceLength = sequenceLength; } public Object construct() { - mappedReads = new int[bamList.size()]; - if(concatSequences || !useAllRefSeqs) - calc(refName, sequenceLength); + int mappedReads[] = null; + if(bamView.isConcatSequences() || !useAllRefSeqs) + { + String refName = (String) bamView.getCombo().getSelectedItem(); + mappedReads = BamUtils.calc(bamView, refName, sequenceLength, + useStrandTag, progressBar); + } else { - for (String name : seqNames) + for (String name : bamView.getSeqNames()) { progressTxt.setText(name); - int thisLength = seqLengths.get(name); + int thisLength = bamView.getSeqLengths().get(name); progressBar.setValue(0); progressBar.setMaximum(thisLength); - calc(name, thisLength); + mappedReads = BamUtils.calc(bamView, name, thisLength, + useStrandTag, progressBar); } } progressBar.setValue(0); progressBar.setMaximum(features.size()); progressTxt.setText("RPKM values for "+features.size()+" features"); - CalculateMappedReads cmr = new CalculateMappedReads(); + CalculateMappedReads cmr = new CalculateMappedReads(mappedReads); cmr.start(); return null; } - - private void calc(final String refName, final int sequenceLength) - { - int MAX_BASE_CHUNK = 2000 * 60; - boolean contained = false; - for (int i = 0; i < sequenceLength; i += MAX_BASE_CHUNK) - { - progressBar.setValue(i); - int sbegc = i; - int sendc = i + MAX_BASE_CHUNK - 1; - - for (int j = 0; j < bamList.size(); j++) - { - String bam = bamList.get(j); - if (concatSequences) - { - int len = 0; - int lastLen = 1; - for (String name : seqNames) - { - int thisLength = seqLengths.get(name); - len += thisLength; - - if ((lastLen >= sbegc && lastLen < sendc) - || (len >= sbegc && len < sendc) - || (sbegc >= lastLen && sbegc < len) - || (sendc >= lastLen && sendc < len)) - { - int offset = offsetLengths.get(name); - int thisStart = sbegc - offset; - if (thisStart < 1) - thisStart = 1; - int thisEnd = sendc - offset; - if (thisEnd > thisLength) - thisEnd = thisLength; - - mappedReads[j] += BamUtils.count(bam, samFileReaderHash, name, - thisStart, thisEnd, samRecordFlagPredicate, - samRecordMapQPredicate, contained, false, useStrandTag)[0]; - - } - lastLen = len; - } - } - else - { - mappedReads[j] += BamUtils.count(bam, samFileReaderHash, refName, sbegc, - sendc, samRecordFlagPredicate, samRecordMapQPredicate, - contained, false, useStrandTag)[0]; - } - } - } - } } /** @@ -572,7 +389,6 @@ public class MappedReads { private EntryGroup entryGroup; private Bases bases; - private String refSeq; private int threshold; private int minSize; private int minBams; @@ -589,7 +405,7 @@ public class MappedReads { entryGroup = feature_display.getEntryGroup(); bases = feature_display.getBases(); - this.refSeq = refSeq; + this.groupsFrame = groupsFrame; this.threshold = threshold; this.minSize = minSize; @@ -620,14 +436,14 @@ public class MappedReads int revStart = -1; final List<MarkerObj> fwdMarkers = new Vector<MarkerObj>(); final List<MarkerObj> revMarkers = new Vector<MarkerObj>(); - for (short i = 0; i < bamList.size(); i++) + for (short i = 0; i < bamView.bamList.size(); i++) { - if(hideBamList.contains(i)) + if(bamView.hideBamList.contains(i)) continue; for(int j=beg; j<end; j+=MAX_BASE_CHUNK) { - progressBar.setValue((j + (i*end)) / bamList.size()); + progressBar.setValue((j + (i*end)) / bamView.bamList.size()); if(j > end) continue; int start = j; @@ -640,12 +456,12 @@ public class MappedReads for (int col = 0; col < 2; col++) cnt[row][col] = 0; - if (concatSequences) + if (bamView.isConcatSequences()) { - for (String name : seqNames) + for (String name : bamView.getSeqNames()) { - int len = seqLengths.get(name); - int offset = offsetLengths.get(name); + int len = bamView.getSeqLengths().get(name); + int offset = bamView.getOffsetLengths().get(name); if( (start >= offset && start <= offset+len) || (stop >= offset && start <= offset+len) ) @@ -662,17 +478,15 @@ public class MappedReads concatShift = offset-start; cnt = - BamUtils.countOverRange(bamList.get(i), samFileReaderHash, - name, thisStart, thisEnd, concatShift, cnt, - samRecordFlagPredicate, samRecordMapQPredicate); + BamUtils.countOverRange(bamView, bamView.bamList.get(i), + thisStart, thisEnd, concatShift, cnt); } } } else cnt = - BamUtils.countOverRange(bamList.get(i), samFileReaderHash, - refSeq, start, stop, 0, cnt, - samRecordFlagPredicate, samRecordMapQPredicate); + BamUtils.countOverRange(bamView, bamView.bamList.get(i), + start, stop, 0, cnt); for(int k=0; k<cnt.length; k++) { @@ -741,7 +555,7 @@ public class MappedReads Hashtable<String, Integer> groupCluster = new Hashtable<String, Integer>(); for(int j=0; j<bamIdxList.size(); j++) { - File f = new File(bamList.get(j)); + File f = new File(bamView.bamList.get(j)); String grp = groupsFrame.getGroupName( f.getName() ); if(groupCluster.containsKey(grp)) { @@ -894,23 +708,4 @@ public class MappedReads dialog.dispose(); } } - - class ReadCount - { - private float senseCnt = 0; - private float antiCnt = 0; - ReadCount(float[] cnt, boolean isFwd) - { - if(isFwd) - { - senseCnt = cnt[0]; - antiCnt = cnt[1]; - } - else - { - senseCnt = cnt[1]; - antiCnt = cnt[0]; - } - } - } } diff --git a/uk/ac/sanger/artemis/components/alignment/ReadCount.java b/uk/ac/sanger/artemis/components/alignment/ReadCount.java new file mode 100644 index 000000000..5d940ed3b --- /dev/null +++ b/uk/ac/sanger/artemis/components/alignment/ReadCount.java @@ -0,0 +1,40 @@ +/* + * This file is part of Artemis + * + * Copyright (C) 2014 Genome Research Limited + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ +package uk.ac.sanger.artemis.components.alignment; + +class ReadCount +{ + protected float senseCnt = 0; + protected float antiCnt = 0; + ReadCount(float[] cnt, boolean isFwd) + { + if(isFwd) + { + senseCnt = cnt[0]; + antiCnt = cnt[1]; + } + else + { + senseCnt = cnt[1]; + antiCnt = cnt[0]; + } + } +} \ No newline at end of file diff --git a/uk/ac/sanger/artemis/components/alignment/ReadCountDialog.java b/uk/ac/sanger/artemis/components/alignment/ReadCountDialog.java index 17861ff96..35b5bc879 100644 --- a/uk/ac/sanger/artemis/components/alignment/ReadCountDialog.java +++ b/uk/ac/sanger/artemis/components/alignment/ReadCountDialog.java @@ -138,11 +138,14 @@ import uk.ac.sanger.artemis.util.StringVector; if(qNames == null) { qNames = new StringVector(); - Object objs[] = systematicListSelectionPanel.getResultArray(); + Object objs[]; + if(systematicListSelectionPanel != null) + objs = systematicListSelectionPanel.getResultArray(); + else + objs = Options.getOptions().getSystematicQualifierNames().toArray(); for(Object o: objs) qNames.add((String)o); } - return pickName(f, qNames); } -- GitLab