Wrapped clipping op information

The clipping op extra information being kept by this walker was specific to the walker, not to the read clipper. Created a wrapper ReadClipperWithData class that keeps the extra information and leaves the ReadClipper slim.

(this is a quick commit to unbreak the build, performing integration tests and will make further commits if necessary)
This commit is contained in:
Mauricio Carneiro 2011-08-14 15:44:48 -04:00
parent 8a51732049
commit 6ae3f9e322
1 changed files with 50 additions and 26 deletions

View File

@ -54,7 +54,7 @@ import java.util.regex.Pattern;
* with poor quality scores, that match particular sequences, or that were generated by particular machine cycles. * with poor quality scores, that match particular sequences, or that were generated by particular machine cycles.
*/ */
@Requires({DataSource.READS}) @Requires({DataSource.READS})
public class ClipReadsWalker extends ReadWalker<ReadClipper, ClipReadsWalker.ClippingData> { public class ClipReadsWalker extends ReadWalker<ClipReadsWalker.ReadClipperWithData, ClipReadsWalker.ClippingData> {
@Output @Output
PrintStream out; PrintStream out;
@ -99,6 +99,22 @@ public class ClipReadsWalker extends ReadWalker<ReadClipper, ClipReadsWalker.Cli
*/ */
List<Pair<Integer, Integer>> cyclesToClip = null; List<Pair<Integer, Integer>> cyclesToClip = null;
public class ReadClipperWithData extends ReadClipper {
private ClippingData data;
public ReadClipperWithData(SAMRecord read) {
super(read);
}
public ClippingData getData() {
return data;
}
public void setData(ClippingData data) {
this.data = data;
}
}
/** /**
* The initialize function. * The initialize function.
*/ */
@ -180,12 +196,12 @@ public class ClipReadsWalker extends ReadWalker<ReadClipper, ClipReadsWalker.Cli
* @param read the read itself, as a SAMRecord * @param read the read itself, as a SAMRecord
* @return the ReadClipper object describing what should be done to clip this read * @return the ReadClipper object describing what should be done to clip this read
*/ */
public ReadClipper map(ReferenceContext ref, SAMRecord read, ReadMetaDataTracker metaDataTracker) { public ReadClipperWithData map(ReferenceContext ref, SAMRecord read, ReadMetaDataTracker metaDataTracker) {
if ( onlyDoRead == null || read.getReadName().equals(onlyDoRead) ) { if ( onlyDoRead == null || read.getReadName().equals(onlyDoRead) ) {
if ( clippingRepresentation == ClippingRepresentation.HARDCLIP_BASES ) { if ( clippingRepresentation == ClippingRepresentation.HARDCLIP_BASES ) {
read = ReadUtils.replaceSoftClipsWithMatches(read); read = ReadUtils.replaceSoftClipsWithMatches(read);
} }
ReadClipper clipper = new ReadClipper(read); ReadClipperWithData clipper = new ReadClipperWithData(read);
// //
// run all three clipping modules // run all three clipping modules
@ -205,7 +221,7 @@ public class ClipReadsWalker extends ReadWalker<ReadClipper, ClipReadsWalker.Cli
* *
* @param clipper * @param clipper
*/ */
private void clipSequences(ReadClipper clipper) { private void clipSequences(ReadClipperWithData clipper) {
if (sequencesToClip != null) { // don't bother if we don't have any sequences to clip if (sequencesToClip != null) { // don't bother if we don't have any sequences to clip
SAMRecord read = clipper.getRead(); SAMRecord read = clipper.getRead();
@ -223,8 +239,12 @@ public class ClipReadsWalker extends ReadWalker<ReadClipper, ClipReadsWalker.Cli
if (found) { if (found) {
int start = match.start(); int start = match.start();
int stop = match.end() - 1; int stop = match.end() - 1;
ClippingOp op = new ClippingOp(ClippingOp.ClippingType.MATCHES_CLIP_SEQ, start, stop, stc.seq); //ClippingOp op = new ClippingOp(ClippingOp.ClippingType.MATCHES_CLIP_SEQ, start, stop, stc.seq);
ClippingOp op = new ClippingOp(start, stop);
clipper.addOp(op); clipper.addOp(op);
ClippingData data = new ClippingData(sequencesToClip);
data.incSeqClippedBases(stc.seq, op.getLength());
clipper.setData(data);
} }
} }
} }
@ -252,7 +272,7 @@ public class ClipReadsWalker extends ReadWalker<ReadClipper, ClipReadsWalker.Cli
* *
* @param clipper * @param clipper
*/ */
private void clipCycles(ReadClipper clipper) { private void clipCycles(ReadClipperWithData clipper) {
if (cyclesToClip != null) { if (cyclesToClip != null) {
SAMRecord read = clipper.getRead(); SAMRecord read = clipper.getRead();
@ -270,8 +290,12 @@ public class ClipReadsWalker extends ReadWalker<ReadClipper, ClipReadsWalker.Cli
int start = startStop.first; int start = startStop.first;
int stop = startStop.second; int stop = startStop.second;
ClippingOp op = new ClippingOp(ClippingOp.ClippingType.WITHIN_CLIP_RANGE, start, stop, null); //ClippingOp op = new ClippingOp(ClippingOp.ClippingType.WITHIN_CLIP_RANGE, start, stop, null);
ClippingOp op = new ClippingOp(start, stop);
clipper.addOp(op); clipper.addOp(op);
ClippingData data = new ClippingData(sequencesToClip);
data.incNRangeClippedBases(op.getLength());
clipper.setData(data);
} }
} }
} }
@ -291,7 +315,7 @@ public class ClipReadsWalker extends ReadWalker<ReadClipper, ClipReadsWalker.Cli
* *
* @param clipper * @param clipper
*/ */
private void clipBadQualityScores(ReadClipper clipper) { private void clipBadQualityScores(ReadClipperWithData clipper) {
SAMRecord read = clipper.getRead(); SAMRecord read = clipper.getRead();
int readLen = read.getReadBases().length; int readLen = read.getReadBases().length;
byte[] quals = read.getBaseQualities(); byte[] quals = read.getBaseQualities();
@ -311,7 +335,12 @@ public class ClipReadsWalker extends ReadWalker<ReadClipper, ClipReadsWalker.Cli
if (clipPoint != -1) { if (clipPoint != -1) {
int start = read.getReadNegativeStrandFlag() ? 0 : clipPoint; int start = read.getReadNegativeStrandFlag() ? 0 : clipPoint;
int stop = read.getReadNegativeStrandFlag() ? clipPoint : readLen - 1; int stop = read.getReadNegativeStrandFlag() ? clipPoint : readLen - 1;
clipper.addOp(new ClippingOp(ClippingOp.ClippingType.LOW_Q_SCORES, start, stop, null)); //clipper.addOp(new ClippingOp(ClippingOp.ClippingType.LOW_Q_SCORES, start, stop, null));
ClippingOp op = new ClippingOp(start, stop);
clipper.addOp(op);
ClippingData data = new ClippingData(sequencesToClip);
data.incNQClippedBases(op.getLength());
clipper.setData(data);
} }
} }
@ -325,7 +354,7 @@ public class ClipReadsWalker extends ReadWalker<ReadClipper, ClipReadsWalker.Cli
return new ClippingData(sequencesToClip); return new ClippingData(sequencesToClip);
} }
public ClippingData reduce(ReadClipper clipper, ClippingData data) { public ClippingData reduce(ReadClipperWithData clipper, ClippingData data) {
if ( clipper == null ) if ( clipper == null )
return data; return data;
@ -340,23 +369,8 @@ public class ClipReadsWalker extends ReadWalker<ReadClipper, ClipReadsWalker.Cli
data.nTotalBases += clipper.getRead().getReadLength(); data.nTotalBases += clipper.getRead().getReadLength();
if (clipper.wasClipped()) { if (clipper.wasClipped()) {
data.nClippedReads++; data.nClippedReads++;
for (ClippingOp op : clipper.getOps()) {
switch (op.type) {
case LOW_Q_SCORES:
data.incNQClippedBases(op.getLength());
break;
case WITHIN_CLIP_RANGE:
data.incNRangeClippedBases(op.getLength());
break;
case MATCHES_CLIP_SEQ:
data.incSeqClippedBases((String) op.extraInfo, op.getLength());
break;
default:
throw new IllegalStateException("Unexpected Clipping operator type " + op);
} }
} data.addData(clipper.getData());
}
return data; return data;
} }
@ -417,6 +431,16 @@ public class ClipReadsWalker extends ReadWalker<ReadClipper, ClipReadsWalker.Cli
seqClipCounts.put(seq, seqClipCounts.get(seq) + n); seqClipCounts.put(seq, seqClipCounts.get(seq) + n);
} }
public void addData (ClippingData data) {
nTotalReads += data.nTotalReads;
nTotalBases += data.nTotalBases;
nClippedReads += data.nClippedReads;
nClippedBases += data.nClippedBases;
nQClippedBases += data.nQClippedBases;
nRangeClippedBases += data.nRangeClippedBases;
nSeqClippedBases += data.nSeqClippedBases;
}
public String toString() { public String toString() {
StringBuilder s = new StringBuilder(); StringBuilder s = new StringBuilder();