Merge pull request #12 from broadinstitute/md_exact_fast_path_GSA-726
Fast path for biallelic variants in IndependentAllelesDiploidExactAFCalc
This commit is contained in:
commit
bd0349e570
|
|
@ -113,12 +113,14 @@ public abstract class AFCalc implements Cloneable {
|
||||||
/**
|
/**
|
||||||
* Compute the probability of the alleles segregating given the genotype likelihoods of the samples in vc
|
* Compute the probability of the alleles segregating given the genotype likelihoods of the samples in vc
|
||||||
*
|
*
|
||||||
* @param vc the VariantContext holding the alleles and sample information
|
* @param vc the VariantContext holding the alleles and sample information. The VariantContext
|
||||||
|
* must have at least 1 alternative allele
|
||||||
* @param log10AlleleFrequencyPriors a prior vector nSamples x 2 in length indicating the Pr(AF = i)
|
* @param log10AlleleFrequencyPriors a prior vector nSamples x 2 in length indicating the Pr(AF = i)
|
||||||
* @return result (for programming convenience)
|
* @return result (for programming convenience)
|
||||||
*/
|
*/
|
||||||
public AFCalcResult getLog10PNonRef(final VariantContext vc, final double[] log10AlleleFrequencyPriors) {
|
public AFCalcResult getLog10PNonRef(final VariantContext vc, final double[] log10AlleleFrequencyPriors) {
|
||||||
if ( vc == null ) throw new IllegalArgumentException("VariantContext cannot be null");
|
if ( vc == null ) throw new IllegalArgumentException("VariantContext cannot be null");
|
||||||
|
if ( vc.getNAlleles() == 1 ) throw new IllegalArgumentException("VariantContext has only a single reference allele, but getLog10PNonRef requires at least one at all " + vc);
|
||||||
if ( log10AlleleFrequencyPriors == null ) throw new IllegalArgumentException("priors vector cannot be null");
|
if ( log10AlleleFrequencyPriors == null ) throw new IllegalArgumentException("priors vector cannot be null");
|
||||||
if ( stateTracker == null ) throw new IllegalArgumentException("Results object cannot be null");
|
if ( stateTracker == null ) throw new IllegalArgumentException("Results object cannot be null");
|
||||||
|
|
||||||
|
|
@ -170,18 +172,19 @@ public abstract class AFCalc implements Cloneable {
|
||||||
* @param vc the initial VC provided by the caller to this AFcalculation
|
* @param vc the initial VC provided by the caller to this AFcalculation
|
||||||
* @return a potentially simpler VC that's more tractable to genotype
|
* @return a potentially simpler VC that's more tractable to genotype
|
||||||
*/
|
*/
|
||||||
@Requires("vc != null")
|
@Requires({"vc != null", "vc.getNAlleles() > 1"})
|
||||||
@Ensures("result != null")
|
@Ensures("result != null")
|
||||||
protected abstract VariantContext reduceScope(final VariantContext vc);
|
protected abstract VariantContext reduceScope(final VariantContext vc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Actually carry out the log10PNonRef calculation on vc, storing results in results
|
* Actually carry out the log10PNonRef calculation on vc, storing results in results
|
||||||
*
|
*
|
||||||
* @param vc variant context with alleles and genotype likelihoods
|
* @param vc variant context with alleles and genotype likelihoods,
|
||||||
|
* must have at least one alt allele
|
||||||
* @param log10AlleleFrequencyPriors priors
|
* @param log10AlleleFrequencyPriors priors
|
||||||
* @return a AFCalcResult object describing the results of this calculation
|
* @return a AFCalcResult object describing the results of this calculation
|
||||||
*/
|
*/
|
||||||
@Requires({"vc != null", "log10AlleleFrequencyPriors != null"})
|
@Requires({"vc != null", "log10AlleleFrequencyPriors != null", "vc.getNAlleles() > 1"})
|
||||||
protected abstract AFCalcResult computeLog10PNonRef(final VariantContext vc,
|
protected abstract AFCalcResult computeLog10PNonRef(final VariantContext vc,
|
||||||
final double[] log10AlleleFrequencyPriors);
|
final double[] log10AlleleFrequencyPriors);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -156,16 +156,25 @@ import java.util.*;
|
||||||
public AFCalcResult computeLog10PNonRef(final VariantContext vc,
|
public AFCalcResult computeLog10PNonRef(final VariantContext vc,
|
||||||
final double[] log10AlleleFrequencyPriors) {
|
final double[] log10AlleleFrequencyPriors) {
|
||||||
final List<AFCalcResult> independentResultTrackers = computeAlleleIndependentExact(vc, log10AlleleFrequencyPriors);
|
final List<AFCalcResult> independentResultTrackers = computeAlleleIndependentExact(vc, log10AlleleFrequencyPriors);
|
||||||
final List<AFCalcResult> withMultiAllelicPriors = applyMultiAllelicPriors(independentResultTrackers);
|
|
||||||
return combineIndependentPNonRefs(vc, withMultiAllelicPriors);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if ( independentResultTrackers.size() == 0 )
|
||||||
|
throw new IllegalStateException("Independent alleles model returned an empty list of results at VC " + vc);
|
||||||
|
|
||||||
|
if ( independentResultTrackers.size() == 1 ) {
|
||||||
|
// fast path for the very common bi-allelic use case
|
||||||
|
return independentResultTrackers.get(0);
|
||||||
|
} else {
|
||||||
|
// we are a multi-allelic, so we need to actually combine the results
|
||||||
|
final List<AFCalcResult> withMultiAllelicPriors = applyMultiAllelicPriors(independentResultTrackers);
|
||||||
|
return combineIndependentPNonRefs(vc, withMultiAllelicPriors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the conditional exact AFCalcResult for each allele in vc independently, returning
|
* Compute the conditional exact AFCalcResult for each allele in vc independently, returning
|
||||||
* the result of each, in order of the alt alleles in VC
|
* the result of each, in order of the alt alleles in VC
|
||||||
*
|
*
|
||||||
* @param vc the VariantContext we want to analyze
|
* @param vc the VariantContext we want to analyze, with at least 1 alt allele
|
||||||
* @param log10AlleleFrequencyPriors the priors
|
* @param log10AlleleFrequencyPriors the priors
|
||||||
* @return a list of the AFCalcResults for each bi-allelic sub context of vc
|
* @return a list of the AFCalcResults for each bi-allelic sub context of vc
|
||||||
*/
|
*/
|
||||||
|
|
@ -208,13 +217,20 @@ import java.util.*;
|
||||||
@Ensures("result.size() == vc.getNAlleles() - 1")
|
@Ensures("result.size() == vc.getNAlleles() - 1")
|
||||||
protected final List<VariantContext> makeAlleleConditionalContexts(final VariantContext vc) {
|
protected final List<VariantContext> makeAlleleConditionalContexts(final VariantContext vc) {
|
||||||
final int nAltAlleles = vc.getNAlleles() - 1;
|
final int nAltAlleles = vc.getNAlleles() - 1;
|
||||||
final List<VariantContext> vcs = new LinkedList<VariantContext>();
|
|
||||||
|
|
||||||
for ( int altI = 0; altI < nAltAlleles; altI++ ) {
|
if ( nAltAlleles == 1 ) {
|
||||||
vcs.add(biallelicCombinedGLs(vc, altI + 1));
|
// fast path for bi-allelic case.
|
||||||
|
return Collections.singletonList(vc);
|
||||||
|
} else {
|
||||||
|
// go through the work of ripping up the VC into its biallelic components
|
||||||
|
final List<VariantContext> vcs = new LinkedList<VariantContext>();
|
||||||
|
|
||||||
|
for ( int altI = 0; altI < nAltAlleles; altI++ ) {
|
||||||
|
vcs.add(biallelicCombinedGLs(vc, altI + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
return vcs;
|
||||||
}
|
}
|
||||||
|
|
||||||
return vcs;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue