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:
rpoplin 2010-01-06 16:45:16 +00:00
parent dfe160ff77
commit 75809100c6
2 changed files with 11 additions and 75 deletions

View File

@ -1,10 +1,7 @@
package org.broadinstitute.sting.gatk.walkers.recalibration;
import org.broadinstitute.sting.utils.BaseUtils;
import org.broadinstitute.sting.utils.QualityUtils;
import java.util.*;
/*
* 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.
*/
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 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
//
//---------------------------------------------------------------------------------------------------------------
public RecalDatum() {
numObservations = 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 ) {
double sumErrors = this.calcExpectedErrors() + other.calcExpectedErrors();
final double sumErrors = this.calcExpectedErrors() + other.calcExpectedErrors();
this.increment( other.numObservations, other.numMismatches );
this.estimatedQReported = -10 * Math.log10(sumErrors / (double)this.numObservations);
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
//
//---------------------------------------------------------------------------------------------------------------
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 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
//
//---------------------------------------------------------------------------------------------------------------
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() {
return estimatedQReported;
}
@ -165,8 +109,4 @@ public class RecalDatum {
private double qualToErrorProb( final double qual ) {
return Math.pow(10.0, qual / -10.0);
}
public String toString() {
return String.format( "RecalDatum: %d,%d,%d", numObservations, numMismatches, (int)empiricalQualByte() );
}
}

View File

@ -41,14 +41,15 @@ import java.util.*;
public class RecalDatumOptimized {
private long numObservations; // number of bases seen in total
private long numMismatches; // number of bases seen that didn't match the reference
protected long numObservations; // number of bases seen in total
protected long numMismatches; // number of bases seen that didn't match the reference
//---------------------------------------------------------------------------------------------------------------
//
// constructors
//
//---------------------------------------------------------------------------------------------------------------
public RecalDatumOptimized() {
numObservations = 0L;
numMismatches = 0L;
@ -70,7 +71,6 @@ public class RecalDatumOptimized {
//
//---------------------------------------------------------------------------------------------------------------
public final void increment( final long incObservations, final long incMismatches ) {
numObservations += incObservations;
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() {
return numObservations;
}
@ -133,7 +126,10 @@ public class RecalDatumOptimized {
return numMismatches;
}
public String toString() {
return String.format( "RecalDatum: %d,%d,%d", numObservations, numMismatches, (int)empiricalQualByte() );
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) );
}
}