Adapted for the new version of MendelianViolation
This commit is contained in:
parent
1cb5e9e149
commit
20bffe0430
|
|
@ -12,10 +12,8 @@ import org.broadinstitute.sting.utils.MendelianViolation;
|
||||||
import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType;
|
import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType;
|
||||||
import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine;
|
import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine;
|
||||||
import org.broadinstitute.sting.utils.exceptions.UserException;
|
import org.broadinstitute.sting.utils.exceptions.UserException;
|
||||||
import org.broadinstitute.sting.utils.text.XReadLines;
|
|
||||||
import org.broadinstitute.sting.utils.variantcontext.VariantContext;
|
import org.broadinstitute.sting.utils.variantcontext.VariantContext;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -26,42 +24,33 @@ import java.util.*;
|
||||||
|
|
||||||
public class TransmissionDisequilibriumTest extends InfoFieldAnnotation implements ExperimentalAnnotation {
|
public class TransmissionDisequilibriumTest extends InfoFieldAnnotation implements ExperimentalAnnotation {
|
||||||
|
|
||||||
private Set<MendelianViolation> fullMVSet = null;
|
private Set<Sample> trios = null;
|
||||||
private final static int REF = 0;
|
private final static int REF = 0;
|
||||||
private final static int HET = 1;
|
private final static int HET = 1;
|
||||||
private final static int HOM = 2;
|
private final static int HOM = 2;
|
||||||
|
|
||||||
public Map<String, Object> annotate(RefMetaDataTracker tracker, AnnotatorCompatibleWalker walker, ReferenceContext ref, Map<String, AlignmentContext> stratifiedContexts, VariantContext vc) {
|
public Map<String, Object> annotate(RefMetaDataTracker tracker, AnnotatorCompatibleWalker walker, ReferenceContext ref, Map<String, AlignmentContext> stratifiedContexts, VariantContext vc) {
|
||||||
if ( fullMVSet == null ) {
|
if ( trios == null ) {
|
||||||
fullMVSet = new HashSet<MendelianViolation>();
|
|
||||||
|
|
||||||
if ( walker instanceof VariantAnnotator ) {
|
if ( walker instanceof VariantAnnotator ) {
|
||||||
final Map<String,Set<Sample>> families = ((VariantAnnotator) walker).getSampleDB().getFamilies();
|
trios = ((VariantAnnotator) walker).getSampleDB().getChildrenWithParents();
|
||||||
for( final Set<Sample> family : families.values() ) {
|
|
||||||
for( final Sample sample : family ) {
|
|
||||||
if( sample.getParents().size() == 2 && family.containsAll(sample.getParents()) ) { // only works with trios for now
|
|
||||||
fullMVSet.add( new MendelianViolation(sample, 0.0) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
throw new UserException("Transmission disequilibrium test annotation can only be used from the Variant Annotator and requires a valid ped file be passed in.");
|
throw new UserException("Transmission disequilibrium test annotation can only be used from the Variant Annotator and requires a valid ped file be passed in.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final Map<String,Object> toRet = new HashMap<String,Object>(1);
|
final Map<String,Object> toRet = new HashMap<String,Object>(1);
|
||||||
final HashSet<MendelianViolation> mvsToTest = new HashSet<MendelianViolation>();
|
final HashSet<Sample> triosToTest = new HashSet<Sample>();
|
||||||
|
|
||||||
for( final MendelianViolation mv : fullMVSet ) {
|
for( final Sample child : trios) {
|
||||||
final boolean hasAppropriateGenotypes = vc.hasGenotype(mv.getSampleChild()) && vc.getGenotype(mv.getSampleChild()).hasLikelihoods() &&
|
final boolean hasAppropriateGenotypes = vc.hasGenotype(child.getID()) && vc.getGenotype(child.getID()).hasLikelihoods() &&
|
||||||
vc.hasGenotype(mv.getSampleDad()) && vc.getGenotype(mv.getSampleDad()).hasLikelihoods() &&
|
vc.hasGenotype(child.getPaternalID()) && vc.getGenotype(child.getPaternalID()).hasLikelihoods() &&
|
||||||
vc.hasGenotype(mv.getSampleMom()) && vc.getGenotype(mv.getSampleMom()).hasLikelihoods();
|
vc.hasGenotype(child.getMaternalID()) && vc.getGenotype(child.getMaternalID()).hasLikelihoods();
|
||||||
if ( hasAppropriateGenotypes ) {
|
if ( hasAppropriateGenotypes ) {
|
||||||
mvsToTest.add(mv);
|
triosToTest.add(child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
toRet.put("TDT", calculateTDT( vc, mvsToTest ));
|
toRet.put("TDT", calculateTDT( vc, triosToTest ));
|
||||||
|
|
||||||
return toRet;
|
return toRet;
|
||||||
}
|
}
|
||||||
|
|
@ -72,27 +61,27 @@ public class TransmissionDisequilibriumTest extends InfoFieldAnnotation implemen
|
||||||
public List<VCFInfoHeaderLine> getDescriptions() { return Arrays.asList(new VCFInfoHeaderLine("TDT", 1, VCFHeaderLineType.Float, "Test statistic from Wittkowski transmission disequilibrium test.")); }
|
public List<VCFInfoHeaderLine> getDescriptions() { return Arrays.asList(new VCFInfoHeaderLine("TDT", 1, VCFHeaderLineType.Float, "Test statistic from Wittkowski transmission disequilibrium test.")); }
|
||||||
|
|
||||||
// Following derivation in http://en.wikipedia.org/wiki/Transmission_disequilibrium_test#A_modified_version_of_the_TDT
|
// Following derivation in http://en.wikipedia.org/wiki/Transmission_disequilibrium_test#A_modified_version_of_the_TDT
|
||||||
private double calculateTDT( final VariantContext vc, final Set<MendelianViolation> mvsToTest ) {
|
private double calculateTDT( final VariantContext vc, final Set<Sample> triosToTest ) {
|
||||||
|
|
||||||
final double nABGivenABandBB = calculateNChildren(vc, mvsToTest, HET, HET, HOM);
|
final double nABGivenABandBB = calculateNChildren(vc, triosToTest, HET, HET, HOM);
|
||||||
final double nBBGivenABandBB = calculateNChildren(vc, mvsToTest, HOM, HET, HOM);
|
final double nBBGivenABandBB = calculateNChildren(vc, triosToTest, HOM, HET, HOM);
|
||||||
final double nAAGivenABandAB = calculateNChildren(vc, mvsToTest, REF, HET, HET);
|
final double nAAGivenABandAB = calculateNChildren(vc, triosToTest, REF, HET, HET);
|
||||||
final double nBBGivenABandAB = calculateNChildren(vc, mvsToTest, HOM, HET, HET);
|
final double nBBGivenABandAB = calculateNChildren(vc, triosToTest, HOM, HET, HET);
|
||||||
final double nAAGivenAAandAB = calculateNChildren(vc, mvsToTest, REF, REF, HET);
|
final double nAAGivenAAandAB = calculateNChildren(vc, triosToTest, REF, REF, HET);
|
||||||
final double nABGivenAAandAB = calculateNChildren(vc, mvsToTest, HET, REF, HET);
|
final double nABGivenAAandAB = calculateNChildren(vc, triosToTest, HET, REF, HET);
|
||||||
|
|
||||||
final double numer = (nABGivenABandBB - nBBGivenABandBB) + 2.0 * (nAAGivenABandAB - nBBGivenABandAB) + (nAAGivenAAandAB - nABGivenAAandAB);
|
final double numer = (nABGivenABandBB - nBBGivenABandBB) + 2.0 * (nAAGivenABandAB - nBBGivenABandAB) + (nAAGivenAAandAB - nABGivenAAandAB);
|
||||||
final double denom = (nABGivenABandBB + nBBGivenABandBB) + 4.0 * (nAAGivenABandAB + nBBGivenABandAB) + (nAAGivenAAandAB + nABGivenAAandAB);
|
final double denom = (nABGivenABandBB + nBBGivenABandBB) + 4.0 * (nAAGivenABandAB + nBBGivenABandAB) + (nAAGivenAAandAB + nABGivenAAandAB);
|
||||||
return (numer * numer) / denom;
|
return (numer * numer) / denom;
|
||||||
}
|
}
|
||||||
|
|
||||||
private double calculateNChildren( final VariantContext vc, final Set<MendelianViolation> mvsToTest, final int childIdx, final int momIdx, final int dadIdx ) {
|
private double calculateNChildren( final VariantContext vc, final Set<Sample> triosToTest, final int childIdx, final int momIdx, final int dadIdx ) {
|
||||||
final double likelihoodVector[] = new double[mvsToTest.size() * 2];
|
final double likelihoodVector[] = new double[triosToTest.size() * 2];
|
||||||
int iii = 0;
|
int iii = 0;
|
||||||
for( final MendelianViolation mv : mvsToTest ) {
|
for( final Sample child : triosToTest ) {
|
||||||
final double[] momGL = vc.getGenotype(mv.getSampleMom()).getLikelihoods().getAsVector();
|
final double[] momGL = vc.getGenotype(child.getMaternalID()).getLikelihoods().getAsVector();
|
||||||
final double[] dadGL = vc.getGenotype(mv.getSampleDad()).getLikelihoods().getAsVector();
|
final double[] dadGL = vc.getGenotype(child.getPaternalID()).getLikelihoods().getAsVector();
|
||||||
final double[] childGL = vc.getGenotype(mv.getSampleChild()).getLikelihoods().getAsVector();
|
final double[] childGL = vc.getGenotype(child.getID()).getLikelihoods().getAsVector();
|
||||||
likelihoodVector[iii++] = momGL[momIdx] + dadGL[dadIdx] + childGL[childIdx];
|
likelihoodVector[iii++] = momGL[momIdx] + dadGL[dadIdx] + childGL[childIdx];
|
||||||
likelihoodVector[iii++] = momGL[dadIdx] + dadGL[momIdx] + childGL[childIdx];
|
likelihoodVector[iii++] = momGL[dadIdx] + dadGL[momIdx] + childGL[childIdx];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue