From 75809100c6d26990fe92cd9edaad3bee4b807d06 Mon Sep 17 00:00:00 2001 From: rpoplin Date: Wed, 6 Jan 2010 16:45:16 +0000 Subject: [PATCH] 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 --- .../walkers/recalibration/RecalDatum.java | 66 +------------------ .../recalibration/RecalDatumOptimized.java | 20 +++--- 2 files changed, 11 insertions(+), 75 deletions(-) diff --git a/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDatum.java b/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDatum.java index 98b357f63..7de53aeb6 100755 --- a/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDatum.java +++ b/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDatum.java @@ -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 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() ); - } } diff --git a/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDatumOptimized.java b/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDatumOptimized.java index c12ca0339..0807fef8b 100755 --- a/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDatumOptimized.java +++ b/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDatumOptimized.java @@ -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) ); } }