ReducedRead optimization: single pass likelihood calculation
-- Low level add() now takes a nObs argument and rather than += likelihood now does += nObs * likelihood
This commit is contained in:
parent
afd0b5b383
commit
86afe878a7
|
|
@ -276,13 +276,11 @@ public class DiploidSNPGenotypeLikelihoods implements Cloneable {
|
||||||
if ( elt.isReducedRead() ) {
|
if ( elt.isReducedRead() ) {
|
||||||
// reduced read representation
|
// reduced read representation
|
||||||
byte qual = elt.getReducedQual();
|
byte qual = elt.getReducedQual();
|
||||||
for ( int i = 0; i < elt.getReducedCount(); i++ ) {
|
add(obsBase, qual, (byte)0, (byte)0, elt.getReducedCount()); // fast calculation of n identical likelihoods
|
||||||
add(obsBase, qual, (byte)0, (byte)0);
|
return elt.getReducedCount(); // we added nObs bases here
|
||||||
}
|
|
||||||
return elt.getQual();
|
|
||||||
} else {
|
} else {
|
||||||
byte qual = qualToUse(elt, ignoreBadBases, capBaseQualsAtMappingQual, minBaseQual);
|
byte qual = qualToUse(elt, ignoreBadBases, capBaseQualsAtMappingQual, minBaseQual);
|
||||||
return qual > 0 ? add(obsBase, qual, (byte)0, (byte)0) : 0;
|
return qual > 0 ? add(obsBase, qual, (byte)0, (byte)0, 1) : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -309,9 +307,11 @@ public class DiploidSNPGenotypeLikelihoods implements Cloneable {
|
||||||
* @param qual1
|
* @param qual1
|
||||||
* @param obsBase2
|
* @param obsBase2
|
||||||
* @param qual2 can be 0, indicating no second base was observed for this fragment
|
* @param qual2 can be 0, indicating no second base was observed for this fragment
|
||||||
|
* @param nObs The number of times this quad of values was seen. Generally 1, but reduced reads
|
||||||
|
* can have nObs > 1 for synthetic reads
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private int add(byte obsBase1, byte qual1, byte obsBase2, byte qual2) {
|
private int add(byte obsBase1, byte qual1, byte obsBase2, byte qual2, int nObs) {
|
||||||
// TODO-- Right now we assume that there are at most 2 reads per fragment. This assumption is fine
|
// TODO-- Right now we assume that there are at most 2 reads per fragment. This assumption is fine
|
||||||
// TODO-- given the current state of next-gen sequencing, but may need to be fixed in the future.
|
// TODO-- given the current state of next-gen sequencing, but may need to be fixed in the future.
|
||||||
// TODO-- However, when that happens, we'll need to be a lot smarter about the caching we do here.
|
// TODO-- However, when that happens, we'll need to be a lot smarter about the caching we do here.
|
||||||
|
|
@ -332,19 +332,17 @@ public class DiploidSNPGenotypeLikelihoods implements Cloneable {
|
||||||
|
|
||||||
for ( DiploidGenotype g : DiploidGenotype.values() ) {
|
for ( DiploidGenotype g : DiploidGenotype.values() ) {
|
||||||
double likelihood = likelihoods[g.ordinal()];
|
double likelihood = likelihoods[g.ordinal()];
|
||||||
|
log10Likelihoods[g.ordinal()] += likelihood * nObs;
|
||||||
//if ( VERBOSE ) {
|
log10Posteriors[g.ordinal()] += likelihood * nObs;
|
||||||
// System.out.printf(" L(%c | G=%s, Q=%d, S=%s) = %f / %f%n",
|
|
||||||
// observedBase, g, qualityScore, pow(10,likelihood) * 100, likelihood);
|
|
||||||
//}
|
|
||||||
|
|
||||||
log10Likelihoods[g.ordinal()] += likelihood;
|
|
||||||
log10Posteriors[g.ordinal()] += likelihood;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int add(byte obsBase1, byte qual1, byte obsBase2, byte qual2) {
|
||||||
|
return add(obsBase1, qual1, obsBase2, qual2, 1);
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Dealing with the cache routines
|
// Dealing with the cache routines
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue