Use inheritance so that shared code isn't duplicated between the RecalDatums
git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@2523 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
parent
dfe160ff77
commit
75809100c6
|
|
@ -1,10 +1,7 @@
|
||||||
package org.broadinstitute.sting.gatk.walkers.recalibration;
|
package org.broadinstitute.sting.gatk.walkers.recalibration;
|
||||||
|
|
||||||
import org.broadinstitute.sting.utils.BaseUtils;
|
|
||||||
import org.broadinstitute.sting.utils.QualityUtils;
|
import org.broadinstitute.sting.utils.QualityUtils;
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2009 The Broad Institute
|
* Copyright (c) 2009 The Broad Institute
|
||||||
*
|
*
|
||||||
|
|
@ -38,10 +35,8 @@ import java.util.*;
|
||||||
* An individual piece of recalibration data. Each bin counts up the number of observations and the number of reference mismatches seen for that combination of covariates.
|
* An individual piece of recalibration data. Each bin counts up the number of observations and the number of reference mismatches seen for that combination of covariates.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class RecalDatum {
|
public class RecalDatum extends RecalDatumOptimized {
|
||||||
|
|
||||||
private long numObservations; // number of bases seen in total
|
|
||||||
private long numMismatches; // number of bases seen that didn't match the reference
|
|
||||||
private double estimatedQReported; // estimated reported quality score based on combined data's individual q-reporteds and number of observations
|
private double estimatedQReported; // estimated reported quality score based on combined data's individual q-reporteds and number of observations
|
||||||
private double empiricalQuality; // the empirical quality for datums that have been collapsed together (by read group and reported quality, for example)
|
private double empiricalQuality; // the empirical quality for datums that have been collapsed together (by read group and reported quality, for example)
|
||||||
|
|
||||||
|
|
@ -50,6 +45,7 @@ public class RecalDatum {
|
||||||
// constructors
|
// constructors
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
public RecalDatum() {
|
public RecalDatum() {
|
||||||
numObservations = 0L;
|
numObservations = 0L;
|
||||||
numMismatches = 0L;
|
numMismatches = 0L;
|
||||||
|
|
@ -77,79 +73,27 @@ public class RecalDatum {
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
public final void increment( final long incObservations, final long incMismatches ) {
|
|
||||||
numObservations += incObservations;
|
|
||||||
numMismatches += incMismatches;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void increment( final RecalDatum other ) {
|
|
||||||
increment( other.numObservations, other.numMismatches );
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void combine( final RecalDatum other ) {
|
public final void combine( final RecalDatum other ) {
|
||||||
double sumErrors = this.calcExpectedErrors() + other.calcExpectedErrors();
|
final double sumErrors = this.calcExpectedErrors() + other.calcExpectedErrors();
|
||||||
this.increment( other.numObservations, other.numMismatches );
|
this.increment( other.numObservations, other.numMismatches );
|
||||||
this.estimatedQReported = -10 * Math.log10(sumErrors / (double)this.numObservations);
|
this.estimatedQReported = -10 * Math.log10(sumErrors / (double)this.numObservations);
|
||||||
if( this.estimatedQReported > QualityUtils.MAX_REASONABLE_Q_SCORE ) { this.estimatedQReported = QualityUtils.MAX_REASONABLE_Q_SCORE; }
|
if( this.estimatedQReported > QualityUtils.MAX_REASONABLE_Q_SCORE ) { this.estimatedQReported = QualityUtils.MAX_REASONABLE_Q_SCORE; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void increment( final List<RecalDatum> data ) {
|
|
||||||
for ( RecalDatum other : data ) {
|
|
||||||
this.increment( other );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void increment( final char curBase, final char refBase ) {
|
|
||||||
increment( 1, BaseUtils.simpleBaseToBaseIndex(curBase) == BaseUtils.simpleBaseToBaseIndex(refBase) ? 0 : 1 ); // increment takes num observations, then num mismatches
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// methods to derive empirical quality score
|
// methods to derive empirical quality score
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
public final double empiricalQualDouble( final int smoothing ) {
|
|
||||||
final double doubleMismatches = (double) ( numMismatches + smoothing );
|
|
||||||
final double doubleObservations = (double) ( numObservations + smoothing );
|
|
||||||
double empiricalQual = -10 * Math.log10(doubleMismatches / doubleObservations);
|
|
||||||
if (empiricalQual > QualityUtils.MAX_REASONABLE_Q_SCORE) { empiricalQual = QualityUtils.MAX_REASONABLE_Q_SCORE; }
|
|
||||||
return empiricalQual;
|
|
||||||
}
|
|
||||||
public final double empiricalQualDouble() { return empiricalQualDouble( 0 ); } // 'default' behavior is to use smoothing value of zero
|
|
||||||
|
|
||||||
public final void calcCombinedEmpiricalQuality(final int smoothing){ this.empiricalQuality = empiricalQualDouble(smoothing); }
|
public final void calcCombinedEmpiricalQuality(final int smoothing){ this.empiricalQuality = empiricalQualDouble(smoothing); }
|
||||||
|
|
||||||
|
|
||||||
public final byte empiricalQualByte( final int smoothing ) {
|
|
||||||
final double doubleMismatches = (double) ( numMismatches + smoothing );
|
|
||||||
final double doubleObservations = (double) ( numObservations + smoothing );
|
|
||||||
return QualityUtils.probToQual( 1.0 - doubleMismatches / doubleObservations );
|
|
||||||
}
|
|
||||||
public final byte empiricalQualByte() { return empiricalQualByte( 0 ); } // 'default' behavior is to use smoothing value of zero
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// misc. methods
|
// misc. methods
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
public final String outputToCSV( ) {
|
|
||||||
return String.format( "%d,%d,%d", numObservations, numMismatches, (int)empiricalQualByte() );
|
|
||||||
}
|
|
||||||
public final String outputToCSV( final int smoothing ) {
|
|
||||||
return String.format( "%d,%d,%d", numObservations, numMismatches, (int)empiricalQualByte( smoothing ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
public final long getNumObservations() {
|
|
||||||
return numObservations;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final long getNumMismatches() {
|
|
||||||
return numMismatches;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final double getEstimatedQReported() {
|
public final double getEstimatedQReported() {
|
||||||
return estimatedQReported;
|
return estimatedQReported;
|
||||||
}
|
}
|
||||||
|
|
@ -165,8 +109,4 @@ public class RecalDatum {
|
||||||
private double qualToErrorProb( final double qual ) {
|
private double qualToErrorProb( final double qual ) {
|
||||||
return Math.pow(10.0, qual / -10.0);
|
return Math.pow(10.0, qual / -10.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString() {
|
|
||||||
return String.format( "RecalDatum: %d,%d,%d", numObservations, numMismatches, (int)empiricalQualByte() );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,14 +41,15 @@ import java.util.*;
|
||||||
|
|
||||||
public class RecalDatumOptimized {
|
public class RecalDatumOptimized {
|
||||||
|
|
||||||
private long numObservations; // number of bases seen in total
|
protected long numObservations; // number of bases seen in total
|
||||||
private long numMismatches; // number of bases seen that didn't match the reference
|
protected long numMismatches; // number of bases seen that didn't match the reference
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// constructors
|
// constructors
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
public RecalDatumOptimized() {
|
public RecalDatumOptimized() {
|
||||||
numObservations = 0L;
|
numObservations = 0L;
|
||||||
numMismatches = 0L;
|
numMismatches = 0L;
|
||||||
|
|
@ -70,7 +71,6 @@ public class RecalDatumOptimized {
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
public final void increment( final long incObservations, final long incMismatches ) {
|
public final void increment( final long incObservations, final long incMismatches ) {
|
||||||
numObservations += incObservations;
|
numObservations += incObservations;
|
||||||
numMismatches += incMismatches;
|
numMismatches += incMismatches;
|
||||||
|
|
@ -118,13 +118,6 @@ public class RecalDatumOptimized {
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
public final String outputToCSV( ) {
|
|
||||||
return String.format( "%d,%d,%d", numObservations, numMismatches, (int)empiricalQualByte() );
|
|
||||||
}
|
|
||||||
public final String outputToCSV( final int smoothing ) {
|
|
||||||
return String.format( "%d,%d,%d", numObservations, numMismatches, (int)empiricalQualByte( smoothing ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
public final long getNumObservations() {
|
public final long getNumObservations() {
|
||||||
return numObservations;
|
return numObservations;
|
||||||
}
|
}
|
||||||
|
|
@ -133,7 +126,10 @@ public class RecalDatumOptimized {
|
||||||
return numMismatches;
|
return numMismatches;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString() {
|
public final String outputToCSV( ) {
|
||||||
return String.format( "RecalDatum: %d,%d,%d", numObservations, numMismatches, (int)empiricalQualByte() );
|
return String.format( "%d,%d,%d", numObservations, numMismatches, (int)empiricalQualByte() );
|
||||||
|
}
|
||||||
|
public final String outputToCSV( final int smoothing ) {
|
||||||
|
return String.format( "%d,%d,%d", numObservations, numMismatches, (int)empiricalQualByte(smoothing) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue