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; 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() );
}
} }

View File

@ -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) );
} }
} }