VariantContextBuilder

-- New approach to making VariantContexts modeled on StringBuilder
-- No more modify routines -- use VariantContextBuilder
-- Renamed isPolymorphic to isPolymorphicInSamples.   Same for mono
-- getChromosomeCount -> getCalledChrCount
-- Walkers changed to use new VariantContext.  Some deprecated new VariantContext calls remain
-- VCFCodec now uses optimized cached information to create GenotypesContext.
This commit is contained in:
Mark DePristo 2011-11-18 12:39:10 -05:00
parent 7490dbb6eb
commit f54afc19b4
23 changed files with 149 additions and 192 deletions

View File

@ -47,7 +47,7 @@ import java.util.Map;
public class SampleList extends InfoFieldAnnotation { public class SampleList extends InfoFieldAnnotation {
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 ( vc.isMonomorphic() || !vc.hasGenotypes() ) if ( vc.isMonomorphicInSamples() || !vc.hasGenotypes() )
return null; return null;
StringBuffer samples = new StringBuffer(); StringBuffer samples = new StringBuffer();

View File

@ -260,7 +260,7 @@ public class ValidationAmplicons extends RodWalker<Integer,Integer> {
} }
} }
} else /* (mask != null && validate == null ) */ { } else /* (mask != null && validate == null ) */ {
if ( ! mask.isSNP() && ! mask.isFiltered() && ( ! filterMonomorphic || ! mask.isMonomorphic() )) { if ( ! mask.isSNP() && ! mask.isFiltered() && ( ! filterMonomorphic || ! mask.isMonomorphicInSamples() )) {
logger.warn("Mask Variant Context on the following warning line is not a SNP. Currently we can only mask out SNPs. This probe will not be designed."); logger.warn("Mask Variant Context on the following warning line is not a SNP. Currently we can only mask out SNPs. This probe will not be designed.");
logger.warn(String.format("%s:%d-%d\t%s\t%s",mask.getChr(),mask.getStart(),mask.getEnd(),mask.isSimpleInsertion() ? "INS" : "DEL", Utils.join(",",mask.getAlleles()))); logger.warn(String.format("%s:%d-%d\t%s\t%s",mask.getChr(),mask.getStart(),mask.getEnd(),mask.isSimpleInsertion() ? "INS" : "DEL", Utils.join(",",mask.getAlleles())));
sequenceInvalid = true; sequenceInvalid = true;
@ -281,7 +281,7 @@ public class ValidationAmplicons extends RodWalker<Integer,Integer> {
sequence.append('N'); sequence.append('N');
indelCounter--; indelCounter--;
rawSequence.append(Character.toUpperCase((char)ref.getBase())); rawSequence.append(Character.toUpperCase((char)ref.getBase()));
} else if ( ! mask.isFiltered() && ( ! filterMonomorphic || ! mask.isMonomorphic() )){ } else if ( ! mask.isFiltered() && ( ! filterMonomorphic || ! mask.isMonomorphicInSamples() )){
logger.debug("SNP in mask found at " + ref.getLocus().toString()); logger.debug("SNP in mask found at " + ref.getLocus().toString());
if ( lowerCaseSNPs ) { if ( lowerCaseSNPs ) {

View File

@ -72,7 +72,7 @@ public class CompOverlap extends VariantEvaluator implements StandardEval {
} }
public String update2(VariantContext eval, VariantContext comp, RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { public String update2(VariantContext eval, VariantContext comp, RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) {
boolean evalIsGood = eval != null && eval.isPolymorphic(); boolean evalIsGood = eval != null && eval.isPolymorphicInSamples();
boolean compIsGood = comp != null && comp.isNotFiltered(); boolean compIsGood = comp != null && comp.isNotFiltered();
if (evalIsGood) nEvalVariants++; // count the number of eval events if (evalIsGood) nEvalVariants++; // count the number of eval events

View File

@ -103,7 +103,7 @@ public class CountVariants extends VariantEvaluator implements StandardEval {
// So in order to maintain consistency with the previous implementation (and the intention of the original author), I've // So in order to maintain consistency with the previous implementation (and the intention of the original author), I've
// added in a proxy check for monomorphic status here. // added in a proxy check for monomorphic status here.
// Protect against case when vc only as no-calls too - can happen if we strafity by sample and sample as a single no-call. // Protect against case when vc only as no-calls too - can happen if we strafity by sample and sample as a single no-call.
if ( vc1.isMonomorphic() ) { if ( vc1.isMonomorphicInSamples() ) {
nRefLoci++; nRefLoci++;
} else { } else {
switch (vc1.getType()) { switch (vc1.getType()) {

View File

@ -30,7 +30,6 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker;
import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker;
import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis;
import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint;
import org.broadinstitute.sting.utils.exceptions.ReviewedStingException;
import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.exceptions.UserException;
import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.Genotype;
import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.variantcontext.VariantContext;
@ -103,7 +102,7 @@ public class G1KPhaseITable extends VariantEvaluator {
} }
public String update2(VariantContext eval, VariantContext comp, RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { public String update2(VariantContext eval, VariantContext comp, RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) {
if ( eval == null || eval.isMonomorphic() ) return null; if ( eval == null || eval.isMonomorphicInSamples() ) return null;
switch (eval.getType()) { switch (eval.getType()) {
case SNP: case SNP:

View File

@ -91,7 +91,7 @@ public class IndelLengthHistogram extends VariantEvaluator {
public String update1(VariantContext vc1, RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { public String update1(VariantContext vc1, RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) {
if ( vc1.isIndel() && vc1.isPolymorphic() ) { if ( vc1.isIndel() && vc1.isPolymorphicInSamples() ) {
if ( ! vc1.isBiallelic() ) { if ( ! vc1.isBiallelic() ) {
//veWalker.getLogger().warn("[IndelLengthHistogram] Non-biallelic indel at "+ref.getLocus()+" ignored."); //veWalker.getLogger().warn("[IndelLengthHistogram] Non-biallelic indel at "+ref.getLocus()+" ignored.");

View File

@ -8,11 +8,9 @@ import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis;
import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint;
import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType;
import org.broadinstitute.sting.utils.IndelUtils; import org.broadinstitute.sting.utils.IndelUtils;
import org.broadinstitute.sting.utils.variantcontext.Genotype;
import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.variantcontext.VariantContext;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
/* /*
* Copyright (c) 2010 The Broad Institute * Copyright (c) 2010 The Broad Institute
@ -270,7 +268,7 @@ public class IndelStatistics extends VariantEvaluator {
public String update1(VariantContext eval, RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { public String update1(VariantContext eval, RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) {
if (eval != null && eval.isPolymorphic()) { if (eval != null && eval.isPolymorphicInSamples()) {
if ( indelStats == null ) { if ( indelStats == null ) {
indelStats = new IndelStats(eval); indelStats = new IndelStats(eval);
} }

View File

@ -118,7 +118,7 @@ public class SimpleMetricsByAC extends VariantEvaluator implements StandardEval
int ac = -1; int ac = -1;
if ( eval.hasGenotypes() ) if ( eval.hasGenotypes() )
ac = eval.getChromosomeCount(eval.getAlternateAllele(0)); ac = eval.getCalledChrCount(eval.getAlternateAllele(0));
else if ( eval.hasAttribute("AC") ) { else if ( eval.hasAttribute("AC") ) {
ac = eval.getAttributeAsInt("AC", -1); ac = eval.getAttributeAsInt("AC", -1);
} }
@ -166,7 +166,7 @@ public class SimpleMetricsByAC extends VariantEvaluator implements StandardEval
} }
} }
if ( eval.isSNP() && eval.isBiallelic() && eval.isPolymorphic() && metrics != null ) { if ( eval.isSNP() && eval.isBiallelic() && eval.isPolymorphicInSamples() && metrics != null ) {
metrics.incrValue(eval); metrics.incrValue(eval);
} }
} }

View File

@ -37,7 +37,7 @@ public class ThetaVariantEvaluator extends VariantEvaluator {
} }
public String update1(VariantContext vc, RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { public String update1(VariantContext vc, RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) {
if (vc == null || !vc.isSNP() || !vc.hasGenotypes() || vc.isMonomorphic()) { if (vc == null || !vc.isSNP() || !vc.hasGenotypes() || vc.isMonomorphicInSamples()) {
return null; //no interesting sites return null; //no interesting sites
} }

View File

@ -40,7 +40,7 @@ public class TiTvVariantEvaluator extends VariantEvaluator implements StandardEv
} }
public void updateTiTv(VariantContext vc, boolean updateStandard) { public void updateTiTv(VariantContext vc, boolean updateStandard) {
if (vc != null && vc.isSNP() && vc.isBiallelic() && vc.isPolymorphic()) { if (vc != null && vc.isSNP() && vc.isBiallelic() && vc.isPolymorphicInSamples()) {
if (VariantContextUtils.isTransition(vc)) { if (VariantContextUtils.isTransition(vc)) {
if (updateStandard) nTiInComp++; if (updateStandard) nTiInComp++;
else nTi++; else nTi++;

View File

@ -11,7 +11,6 @@ import org.broadinstitute.sting.utils.variantcontext.Allele;
import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.variantcontext.VariantContext;
import java.util.Collection; import java.util.Collection;
import java.util.Set;
/** /**
* The Broad Institute * The Broad Institute
@ -118,8 +117,8 @@ public class ValidationReport extends VariantEvaluator implements StandardEval {
public SiteStatus calcSiteStatus(VariantContext vc) { public SiteStatus calcSiteStatus(VariantContext vc) {
if ( vc == null ) return SiteStatus.NO_CALL; if ( vc == null ) return SiteStatus.NO_CALL;
if ( vc.isFiltered() ) return SiteStatus.FILTERED; if ( vc.isFiltered() ) return SiteStatus.FILTERED;
if ( vc.isMonomorphic() ) return SiteStatus.MONO; if ( vc.isMonomorphicInSamples() ) return SiteStatus.MONO;
if ( vc.hasGenotypes() ) return SiteStatus.POLY; // must be polymorphic if isMonomorphic was false and there are genotypes if ( vc.hasGenotypes() ) return SiteStatus.POLY; // must be polymorphic if isMonomorphicInSamples was false and there are genotypes
if ( vc.hasAttribute(VCFConstants.ALLELE_COUNT_KEY) ) { if ( vc.hasAttribute(VCFConstants.ALLELE_COUNT_KEY) ) {
int ac = 0; int ac = 0;

View File

@ -232,14 +232,14 @@ public class VariantQualityScore extends VariantEvaluator {
public String update1(VariantContext eval, RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { public String update1(VariantContext eval, RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) {
final String interesting = null; final String interesting = null;
if( eval != null && eval.isSNP() && eval.isBiallelic() && eval.isPolymorphic() ) { //BUGBUG: only counting biallelic sites (revisit what to do with triallelic sites) if( eval != null && eval.isSNP() && eval.isBiallelic() && eval.isPolymorphicInSamples() ) { //BUGBUG: only counting biallelic sites (revisit what to do with triallelic sites)
if( titvStats == null ) { titvStats = new TiTvStats(); } if( titvStats == null ) { titvStats = new TiTvStats(); }
titvStats.incrValue(eval.getPhredScaledQual(), VariantContextUtils.isTransition(eval)); titvStats.incrValue(eval.getPhredScaledQual(), VariantContextUtils.isTransition(eval));
if( alleleCountStats == null ) { alleleCountStats = new AlleleCountStats(); } if( alleleCountStats == null ) { alleleCountStats = new AlleleCountStats(); }
int alternateAlleleCount = 0; int alternateAlleleCount = 0;
for (final Allele a : eval.getAlternateAlleles()) { for (final Allele a : eval.getAlternateAlleles()) {
alternateAlleleCount += eval.getChromosomeCount(a); alternateAlleleCount += eval.getCalledChrCount(a);
} }
alleleCountStats.incrValue(eval.getPhredScaledQual(), alternateAlleleCount); alleleCountStats.incrValue(eval.getPhredScaledQual(), alternateAlleleCount);
} }

View File

@ -47,7 +47,7 @@ public class AlleleCount extends VariantStratifier {
AC = eval.getAttributeAsInt("AC", 0); AC = eval.getAttributeAsInt("AC", 0);
} else if ( eval.isVariant() ) { } else if ( eval.isVariant() ) {
for (Allele allele : eval.getAlternateAlleles()) for (Allele allele : eval.getAlternateAlleles())
AC = Math.max(AC, eval.getChromosomeCount(allele)); AC = Math.max(AC, eval.getCalledChrCount(allele));
} else } else
// by default, the site is considered monomorphic // by default, the site is considered monomorphic
AC = 0; AC = 0;

View File

@ -26,7 +26,6 @@
package org.broadinstitute.sting.gatk.walkers.variantrecalibration; package org.broadinstitute.sting.gatk.walkers.variantrecalibration;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.broadinstitute.sting.commandline.RodBinding;
import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine;
import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker;
import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLoc;
@ -38,7 +37,6 @@ import org.broadinstitute.sting.utils.variantcontext.VariantContext;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
/** /**
@ -284,7 +282,7 @@ public class VariantDataManager {
private boolean isValidVariant( final VariantContext evalVC, final VariantContext trainVC, final boolean TRUST_ALL_POLYMORPHIC) { private boolean isValidVariant( final VariantContext evalVC, final VariantContext trainVC, final boolean TRUST_ALL_POLYMORPHIC) {
return trainVC != null && trainVC.isNotFiltered() && trainVC.isVariant() && return trainVC != null && trainVC.isNotFiltered() && trainVC.isVariant() &&
((evalVC.isSNP() && trainVC.isSNP()) || ((evalVC.isIndel()||evalVC.isMixed()) && (trainVC.isIndel()||trainVC.isMixed()))) && ((evalVC.isSNP() && trainVC.isSNP()) || ((evalVC.isIndel()||evalVC.isMixed()) && (trainVC.isIndel()||trainVC.isMixed()))) &&
(TRUST_ALL_POLYMORPHIC || !trainVC.hasGenotypes() || trainVC.isPolymorphic()); (TRUST_ALL_POLYMORPHIC || !trainVC.hasGenotypes() || trainVC.isPolymorphicInSamples());
} }
public void writeOutRecalibrationTable( final PrintStream RECAL_FILE ) { public void writeOutRecalibrationTable( final PrintStream RECAL_FILE ) {

View File

@ -488,7 +488,7 @@ public class SelectVariants extends RodWalker<Integer, Integer> {
if (outMVFile != null) if (outMVFile != null)
outMVFileStream.format("MV@%s:%d. REF=%s, ALT=%s, AC=%d, momID=%s, dadID=%s, childID=%s, momG=%s, momGL=%s, dadG=%s, dadGL=%s, " + outMVFileStream.format("MV@%s:%d. REF=%s, ALT=%s, AC=%d, momID=%s, dadID=%s, childID=%s, momG=%s, momGL=%s, dadG=%s, dadGL=%s, " +
"childG=%s childGL=%s\n",vc.getChr(), vc.getStart(), "childG=%s childGL=%s\n",vc.getChr(), vc.getStart(),
vc.getReference().getDisplayString(), vc.getAlternateAllele(0).getDisplayString(), vc.getChromosomeCount(vc.getAlternateAllele(0)), vc.getReference().getDisplayString(), vc.getAlternateAllele(0).getDisplayString(), vc.getCalledChrCount(vc.getAlternateAllele(0)),
mv.getSampleMom(), mv.getSampleDad(), mv.getSampleChild(), mv.getSampleMom(), mv.getSampleDad(), mv.getSampleChild(),
vc.getGenotype(mv.getSampleMom()).toBriefString(), vc.getGenotype(mv.getSampleMom()).getLikelihoods().getAsString(), vc.getGenotype(mv.getSampleMom()).toBriefString(), vc.getGenotype(mv.getSampleMom()).getLikelihoods().getAsString(),
vc.getGenotype(mv.getSampleDad()).toBriefString(), vc.getGenotype(mv.getSampleMom()).getLikelihoods().getAsString(), vc.getGenotype(mv.getSampleDad()).toBriefString(), vc.getGenotype(mv.getSampleMom()).getLikelihoods().getAsString(),
@ -520,7 +520,7 @@ public class SelectVariants extends RodWalker<Integer, Integer> {
continue; continue;
VariantContext sub = subsetRecord(vc, samples); VariantContext sub = subsetRecord(vc, samples);
if ( (sub.isPolymorphic() || !EXCLUDE_NON_VARIANTS) && (!sub.isFiltered() || !EXCLUDE_FILTERED) ) { if ( (sub.isPolymorphicInSamples() || !EXCLUDE_NON_VARIANTS) && (!sub.isFiltered() || !EXCLUDE_FILTERED) ) {
for ( VariantContextUtils.JexlVCMatchExp jexl : jexls ) { for ( VariantContextUtils.JexlVCMatchExp jexl : jexls ) {
if ( !VariantContextUtils.match(sub, jexl) ) { if ( !VariantContextUtils.match(sub, jexl) ) {
return 0; return 0;
@ -677,11 +677,11 @@ public class SelectVariants extends RodWalker<Integer, Integer> {
if (KEEP_ORIGINAL_CHR_COUNTS) { if (KEEP_ORIGINAL_CHR_COUNTS) {
if ( sub.hasAttribute(VCFConstants.ALLELE_COUNT_KEY) ) if ( sub.hasAttribute(VCFConstants.ALLELE_COUNT_KEY) )
builder.attribute("AC_Orig",sub.getAttribute(VCFConstants.ALLELE_COUNT_KEY)); builder.attribute("AC_Orig", sub.getAttribute(VCFConstants.ALLELE_COUNT_KEY));
if ( sub.hasAttribute(VCFConstants.ALLELE_FREQUENCY_KEY) ) if ( sub.hasAttribute(VCFConstants.ALLELE_FREQUENCY_KEY) )
builder.attribute("AF_Orig",sub.getAttribute(VCFConstants.ALLELE_FREQUENCY_KEY)); builder.attribute("AF_Orig", sub.getAttribute(VCFConstants.ALLELE_FREQUENCY_KEY));
if ( sub.hasAttribute(VCFConstants.ALLELE_NUMBER_KEY) ) if ( sub.hasAttribute(VCFConstants.ALLELE_NUMBER_KEY) )
builder.attribute("AN_Orig",sub.getAttribute(VCFConstants.ALLELE_NUMBER_KEY)); builder.attribute("AN_Orig", sub.getAttribute(VCFConstants.ALLELE_NUMBER_KEY));
} }
Map<String, Object> attributes = new HashMap<String, Object>(builder.make().getAttributes()); Map<String, Object> attributes = new HashMap<String, Object>(builder.make().getAttributes());

View File

@ -233,17 +233,17 @@ public class VariantValidationAssessor extends RodWalker<VariantContext,Integer>
numRecords++; numRecords++;
// add the info fields // add the info fields
builder.attribute("NoCallPct", String.format("%.1f", 100.0*noCallProp)); builder.attribute("NoCallPct", String.format("%.1f", 100.0 * noCallProp));
builder.attribute("HomRefPct", String.format("%.1f", 100.0*homRefProp)); builder.attribute("HomRefPct", String.format("%.1f", 100.0 * homRefProp));
builder.attribute("HomVarPct", String.format("%.1f", 100.0*homVarProp)); builder.attribute("HomVarPct", String.format("%.1f", 100.0 * homVarProp));
builder.attribute("HetPct", String.format("%.1f", 100.0*hetProp)); builder.attribute("HetPct", String.format("%.1f", 100.0 * hetProp));
builder.attribute("HW", String.format("%.2f", hwScore)); builder.attribute("HW", String.format("%.2f", hwScore));
Collection<Allele> altAlleles = vContext.getAlternateAlleles(); Collection<Allele> altAlleles = vContext.getAlternateAlleles();
int altAlleleCount = altAlleles.size() == 0 ? 0 : vContext.getChromosomeCount(altAlleles.iterator().next()); int altAlleleCount = altAlleles.size() == 0 ? 0 : vContext.getCalledChrCount(altAlleles.iterator().next());
if ( !isViolation && altAlleleCount > 0 ) if ( !isViolation && altAlleleCount > 0 )
numTrueVariants++; numTrueVariants++;
builder.attribute(VCFConstants.ALLELE_COUNT_KEY, String.format("%d", altAlleleCount)); builder.attribute(VCFConstants.ALLELE_COUNT_KEY, String.format("%d", altAlleleCount));
builder.attribute(VCFConstants.ALLELE_NUMBER_KEY, String.format("%d", vContext.getChromosomeCount())); builder.attribute(VCFConstants.ALLELE_NUMBER_KEY, String.format("%d", vContext.getCalledChrCount()));
return builder.make(); return builder.make();
} }

View File

@ -98,7 +98,7 @@ public abstract class AbstractVCFCodec implements FeatureCodec, NameAwareCodec,
headerStrings.add(line); headerStrings.add(line);
Set<VCFHeaderLine> metaData = new TreeSet<VCFHeaderLine>(); Set<VCFHeaderLine> metaData = new TreeSet<VCFHeaderLine>();
Set<String> auxTags = new LinkedHashSet<String>(); Set<String> sampleNames = new LinkedHashSet<String>();
// iterate over all the passed in strings // iterate over all the passed in strings
for ( String str : headerStrings ) { for ( String str : headerStrings ) {
if ( !str.startsWith(VCFHeader.METADATA_INDICATOR) ) { if ( !str.startsWith(VCFHeader.METADATA_INDICATOR) ) {
@ -126,9 +126,9 @@ public abstract class AbstractVCFCodec implements FeatureCodec, NameAwareCodec,
} }
while ( arrayIndex < strings.length ) while ( arrayIndex < strings.length )
auxTags.add(strings[arrayIndex++]); sampleNames.add(strings[arrayIndex++]);
if ( sawFormatTag && auxTags.size() == 0 ) if ( sawFormatTag && sampleNames.size() == 0 )
throw new UserException.MalformedVCFHeader("The FORMAT field was provided but there is no genotype/sample data"); throw new UserException.MalformedVCFHeader("The FORMAT field was provided but there is no genotype/sample data");
} else { } else {
@ -152,7 +152,8 @@ public abstract class AbstractVCFCodec implements FeatureCodec, NameAwareCodec,
} }
} }
header = new VCFHeader(metaData, auxTags); header = new VCFHeader(metaData, sampleNames);
header.buildVCFReaderMaps(new ArrayList<String>(sampleNames));
return header; return header;
} }

View File

@ -151,7 +151,7 @@ public class VCFCodec extends AbstractVCFCodec {
int nParts = ParsingUtils.split(str, genotypeParts, VCFConstants.FIELD_SEPARATOR_CHAR); int nParts = ParsingUtils.split(str, genotypeParts, VCFConstants.FIELD_SEPARATOR_CHAR);
GenotypesContext genotypes = GenotypesContext.create(nParts); ArrayList<Genotype> genotypes = new ArrayList<Genotype>(nParts);
// get the format keys // get the format keys
int nGTKeys = ParsingUtils.split(genotypeParts[0], genotypeKeyArray, VCFConstants.GENOTYPE_FIELD_SEPARATOR_CHAR); int nGTKeys = ParsingUtils.split(genotypeParts[0], genotypeKeyArray, VCFConstants.GENOTYPE_FIELD_SEPARATOR_CHAR);
@ -215,7 +215,7 @@ public class VCFCodec extends AbstractVCFCodec {
} }
} }
return genotypes; return GenotypesContext.create(genotypes, header.sampleNameToOffset, header.sampleNamesInOrder);
} }
@Override @Override

View File

@ -2,6 +2,7 @@ package org.broadinstitute.sting.utils.codecs.vcf;
import org.broad.tribble.util.ParsingUtils; import org.broad.tribble.util.ParsingUtils;
import org.broadinstitute.sting.utils.variantcontext.Genotype;
import java.util.*; import java.util.*;
@ -38,6 +39,10 @@ public class VCFHeader {
// were the input samples sorted originally (or are we sorting them)? // were the input samples sorted originally (or are we sorting them)?
private boolean samplesWereAlreadySorted = true; private boolean samplesWereAlreadySorted = true;
// cache for efficient conversion of VCF -> VariantContext
protected ArrayList<String> sampleNamesInOrder = null;
protected HashMap<String, Integer> sampleNameToOffset = null;
/** /**
* create a VCF header, given a list of meta data and auxillary tags * create a VCF header, given a list of meta data and auxillary tags
@ -69,6 +74,27 @@ public class VCFHeader {
samplesWereAlreadySorted = ParsingUtils.isSorted(genotypeSampleNames); samplesWereAlreadySorted = ParsingUtils.isSorted(genotypeSampleNames);
} }
/**
* Tell this VCF header to use pre-calculated sample name ordering and the
* sample name -> offset map. This assumes that all VariantContext created
* using this header (i.e., read by the VCFCodec) will have genotypes
* occurring in the same order
*
*/
protected void buildVCFReaderMaps(List<String> genotypeSampleNamesInAppearenceOrder) {
sampleNamesInOrder = new ArrayList<String>(genotypeSampleNamesInAppearenceOrder.size());
sampleNameToOffset = new HashMap<String, Integer>(genotypeSampleNamesInAppearenceOrder.size());
int i = 0;
for ( final String name : genotypeSampleNamesInAppearenceOrder ) {
sampleNamesInOrder.add(name);
sampleNameToOffset.put(name, i++);
}
Collections.sort(sampleNamesInOrder);
}
/** /**
* Adds a header line to the header metadata. * Adds a header line to the header metadata.
* *

View File

@ -85,6 +85,12 @@ public class GenotypesContext implements List<Genotype> {
return new GenotypesContext(nGenotypes, false); return new GenotypesContext(nGenotypes, false);
} }
public static final GenotypesContext create(final ArrayList<Genotype> genotypes,
final Map<String, Integer> sampleNameToOffset,
final List<String> sampleNamesInOrder) {
return new GenotypesContext(genotypes, sampleNameToOffset, sampleNamesInOrder, false);
}
public static final GenotypesContext create(final ArrayList<Genotype> genotypes) { public static final GenotypesContext create(final ArrayList<Genotype> genotypes) {
return genotypes == null ? NO_GENOTYPES : new GenotypesContext(genotypes, false); return genotypes == null ? NO_GENOTYPES : new GenotypesContext(genotypes, false);
} }
@ -101,6 +107,8 @@ public class GenotypesContext implements List<Genotype> {
return toCopy == null ? NO_GENOTYPES : create(new ArrayList<Genotype>(toCopy)); return toCopy == null ? NO_GENOTYPES : create(new ArrayList<Genotype>(toCopy));
} }
// public static final GenotypeMap create(final Collection<Genotype> genotypes) { // public static final GenotypeMap create(final Collection<Genotype> genotypes) {
// if ( genotypes == null ) // if ( genotypes == null )
// return null; // todo -- really should return an empty map // return null; // todo -- really should return an empty map

View File

@ -131,17 +131,17 @@ import java.util.*;
* *
* <pre> * <pre>
* vc.hasGenotypes() * vc.hasGenotypes()
* vc.isMonomorphic() * vc.isMonomorphicInSamples()
* vc.isPolymorphic() * vc.isPolymorphicInSamples()
* vc.getSamples().size() * vc.getSamples().size()
* *
* vc.getGenotypes() * vc.getGenotypes()
* vc.getGenotypes().get("g1") * vc.getGenotypes().get("g1")
* vc.hasGenotype("g1") * vc.hasGenotype("g1")
* *
* vc.getChromosomeCount() * vc.getCalledChrCount()
* vc.getChromosomeCount(Aref) * vc.getCalledChrCount(Aref)
* vc.getChromosomeCount(T) * vc.getCalledChrCount(T)
* </pre> * </pre>
* *
* === NO_CALL alleles === * === NO_CALL alleles ===
@ -374,72 +374,17 @@ public class VariantContext implements Feature { // to enable tribble intergrati
// //
// --------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------
// /**
// * Returns a context identical to this (i.e., filter, qual are all the same) but containing only the Genotype
// * genotype and alleles in genotype. This is the right way to test if a single genotype is actually
// * variant or not.
// *
// * @param genotype genotype
// * @return vc subcontext
// * @deprecated replaced by {@link #subContextFromSample(String)}
// */
// public VariantContext subContextFromGenotypes(Genotype genotype) {
// return subContextFromGenotypes(Arrays.asList(genotype));
// }
//
//
// /**
// * Returns a context identical to this (i.e., filter, qual are all the same) but containing only the Genotypes
// * genotypes and alleles in these genotypes. This is the right way to test if a single genotype is actually
// * variant or not.
// *
// * @param genotypes genotypes
// * @return vc subcontext
// * @deprecated replaced by {@link #subContextFromSamples(java.util.Collection)}
// */
// public VariantContext subContextFromGenotypes(Collection<Genotype> genotypes) {
// return subContextFromGenotypes(genotypes, allelesOfGenotypes(genotypes)) ;
// }
//
// /**
// * Returns a context identical to this (i.e., filter, qual are all the same) but containing only the Genotypes
// * genotypes. Also, the resulting variant context will contain the alleles provided, not only those found in genotypes
// *
// * @param genotypes genotypes
// * @param alleles the set of allele segregating alleles at this site. Must include those in genotypes, but may be more
// * @return vc subcontext
// * @deprecated replaced by {@link #subContextFromSamples(java.util.Collection, java.util.Collection)}
// */
// @Deprecated
// public VariantContext subContextFromGenotypes(Collection<Genotype> genotypes, Collection<Allele> alleles) {
// return new VariantContext(getSource(), contig, start, stop, alleles,
// GenotypeCollection.create(genotypes),
// getNegLog10PError(),
// filtersWereApplied() ? getFilters() : null,
// getAttributes(),
// getReferenceBaseForIndel());
// }
public VariantContext subContextFromSamples(Set<String> sampleNames, Collection<Allele> alleles) { public VariantContext subContextFromSamples(Set<String> sampleNames, Collection<Allele> alleles) {
loadGenotypes(); loadGenotypes();
GenotypesContext newGenotypes = genotypes.subsetToSamples(sampleNames); VariantContextBuilder builder = new VariantContextBuilder(this);
return new VariantContext(getSource(), getID(), contig, start, stop, alleles, return builder.genotypes(genotypes.subsetToSamples(sampleNames)).make();
newGenotypes,
getNegLog10PError(),
filtersWereApplied() ? getFilters() : null,
getAttributes(),
getReferenceBaseForIndel());
} }
public VariantContext subContextFromSamples(Set<String> sampleNames) { public VariantContext subContextFromSamples(Set<String> sampleNames) {
loadGenotypes(); loadGenotypes();
VariantContextBuilder builder = new VariantContextBuilder(this);
GenotypesContext newGenotypes = genotypes.subsetToSamples(sampleNames); GenotypesContext newGenotypes = genotypes.subsetToSamples(sampleNames);
return new VariantContext(getSource(), getID(), contig, start, stop, allelesOfGenotypes(newGenotypes), return builder.genotypes(newGenotypes).alleles(allelesOfGenotypes(newGenotypes)).make();
newGenotypes,
getNegLog10PError(),
filtersWereApplied() ? getFilters() : null,
getAttributes(),
getReferenceBaseForIndel());
} }
public VariantContext subContextFromSample(String sampleName) { public VariantContext subContextFromSample(String sampleName) {
@ -451,12 +396,12 @@ public class VariantContext implements Feature { // to enable tribble intergrati
* @param genotypes genotypes * @param genotypes genotypes
* @return allele set * @return allele set
*/ */
private Set<Allele> allelesOfGenotypes(Collection<Genotype> genotypes) { private final Set<Allele> allelesOfGenotypes(Collection<Genotype> genotypes) {
Set<Allele> alleles = new HashSet<Allele>(); final Set<Allele> alleles = new HashSet<Allele>();
boolean addedref = false; boolean addedref = false;
for ( Genotype g : genotypes ) { for ( final Genotype g : genotypes ) {
for ( Allele a : g.getAlleles() ) { for ( final Allele a : g.getAlleles() ) {
addedref = addedref || a.isReference(); addedref = addedref || a.isReference();
if ( a.isCalled() ) if ( a.isCalled() )
alleles.add(a); alleles.add(a);
@ -938,7 +883,7 @@ public class VariantContext implements Feature { // to enable tribble intergrati
* *
* @return chromosome count * @return chromosome count
*/ */
public int getChromosomeCount() { public int getCalledChrCount() {
int n = 0; int n = 0;
for ( final Genotype g : getGenotypes() ) { for ( final Genotype g : getGenotypes() ) {
@ -955,7 +900,7 @@ public class VariantContext implements Feature { // to enable tribble intergrati
* @param a allele * @param a allele
* @return chromosome count * @return chromosome count
*/ */
public int getChromosomeCount(Allele a) { public int getCalledChrCount(Allele a) {
int n = 0; int n = 0;
for ( final Genotype g : getGenotypes() ) { for ( final Genotype g : getGenotypes() ) {
@ -971,9 +916,9 @@ public class VariantContext implements Feature { // to enable tribble intergrati
* *
* @return true if it's monomorphic * @return true if it's monomorphic
*/ */
public boolean isMonomorphic() { public boolean isMonomorphicInSamples() {
if ( monomorphic == null ) if ( monomorphic == null )
monomorphic = ! isVariant() || (hasGenotypes() && getChromosomeCount(getReference()) == getChromosomeCount()); monomorphic = ! isVariant() || (hasGenotypes() && getCalledChrCount(getReference()) == getCalledChrCount());
return monomorphic; return monomorphic;
} }
@ -983,8 +928,8 @@ public class VariantContext implements Feature { // to enable tribble intergrati
* *
* @return true if it's polymorphic * @return true if it's polymorphic
*/ */
public boolean isPolymorphic() { public boolean isPolymorphicInSamples() {
return ! isMonomorphic(); return ! isMonomorphicInSamples();
} }
private void calculateGenotypeCounts() { private void calculateGenotypeCounts() {
@ -1119,19 +1064,28 @@ public class VariantContext implements Feature { // to enable tribble intergrati
} }
public void validateChromosomeCounts() { public void validateChromosomeCounts() {
Map<String, Object> observedAttrs = calculateChromosomeCounts();
// AN // AN
if ( hasAttribute(VCFConstants.ALLELE_NUMBER_KEY) ) { if ( hasAttribute(VCFConstants.ALLELE_NUMBER_KEY) ) {
int reportedAN = Integer.valueOf(getAttribute(VCFConstants.ALLELE_NUMBER_KEY).toString()); int reportedAN = Integer.valueOf(getAttribute(VCFConstants.ALLELE_NUMBER_KEY).toString());
int observedAN = (Integer)observedAttrs.get(VCFConstants.ALLELE_NUMBER_KEY); int observedAN = getCalledChrCount();
if ( reportedAN != observedAN ) if ( reportedAN != observedAN )
throw new TribbleException.InternalCodecException(String.format("the Allele Number (AN) tag is incorrect for the record at position %s:%d, %d vs. %d", getChr(), getStart(), reportedAN, observedAN)); throw new TribbleException.InternalCodecException(String.format("the Allele Number (AN) tag is incorrect for the record at position %s:%d, %d vs. %d", getChr(), getStart(), reportedAN, observedAN));
} }
// AC // AC
if ( hasAttribute(VCFConstants.ALLELE_COUNT_KEY) ) { if ( hasAttribute(VCFConstants.ALLELE_COUNT_KEY) ) {
List<Integer> observedACs = (List<Integer>)observedAttrs.get(VCFConstants.ALLELE_COUNT_KEY); ArrayList<Integer> observedACs = new ArrayList<Integer>();
// if there are alternate alleles, record the relevant tags
if ( getAlternateAlleles().size() > 0 ) {
for ( Allele allele : getAlternateAlleles() ) {
observedACs.add(getCalledChrCount(allele));
}
}
else { // otherwise, set them to 0
observedACs.add(0);
}
if ( getAttribute(VCFConstants.ALLELE_COUNT_KEY) instanceof List ) { if ( getAttribute(VCFConstants.ALLELE_COUNT_KEY) instanceof List ) {
Collections.sort(observedACs); Collections.sort(observedACs);
List reportedACs = (List)getAttribute(VCFConstants.ALLELE_COUNT_KEY); List reportedACs = (List)getAttribute(VCFConstants.ALLELE_COUNT_KEY);
@ -1152,31 +1106,6 @@ public class VariantContext implements Feature { // to enable tribble intergrati
} }
} }
private Map<String, Object> calculateChromosomeCounts() {
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put(VCFConstants.ALLELE_NUMBER_KEY, getChromosomeCount());
ArrayList<Double> alleleFreqs = new ArrayList<Double>();
ArrayList<Integer> alleleCounts = new ArrayList<Integer>();
// if there are alternate alleles, record the relevant tags
if ( getAlternateAlleles().size() > 0 ) {
for ( Allele allele : getAlternateAlleles() ) {
alleleCounts.add(getChromosomeCount(allele));
alleleFreqs.add((double)getChromosomeCount(allele) / (double)getChromosomeCount());
}
}
// otherwise, set them to 0
else {
alleleCounts.add(0);
alleleFreqs.add(0.0);
}
attributes.put(VCFConstants.ALLELE_COUNT_KEY, alleleCounts);
attributes.put(VCFConstants.ALLELE_FREQUENCY_KEY, alleleFreqs);
return attributes;
}
// --------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------
// //
// validation: the normal validation routines are called automatically upon creation of the VC // validation: the normal validation routines are called automatically upon creation of the VC
@ -1399,7 +1328,7 @@ public class VariantContext implements Feature { // to enable tribble intergrati
Allele best = null; Allele best = null;
int maxAC1 = 0; int maxAC1 = 0;
for (Allele a:this.getAlternateAlleles()) { for (Allele a:this.getAlternateAlleles()) {
int ac = this.getChromosomeCount(a); int ac = this.getCalledChrCount(a);
if (ac >=maxAC1) { if (ac >=maxAC1) {
maxAC1 = ac; maxAC1 = ac;
best = a; best = a;

View File

@ -63,7 +63,7 @@ public class VariantContextUtils {
*/ */
public static void calculateChromosomeCounts(VariantContext vc, Map<String, Object> attributes, boolean removeStaleValues) { public static void calculateChromosomeCounts(VariantContext vc, Map<String, Object> attributes, boolean removeStaleValues) {
// if everyone is a no-call, remove the old attributes if requested // if everyone is a no-call, remove the old attributes if requested
if ( vc.getChromosomeCount() == 0 && removeStaleValues ) { if ( vc.getCalledChrCount() == 0 && removeStaleValues ) {
if ( attributes.containsKey(VCFConstants.ALLELE_COUNT_KEY) ) if ( attributes.containsKey(VCFConstants.ALLELE_COUNT_KEY) )
attributes.remove(VCFConstants.ALLELE_COUNT_KEY); attributes.remove(VCFConstants.ALLELE_COUNT_KEY);
if ( attributes.containsKey(VCFConstants.ALLELE_FREQUENCY_KEY) ) if ( attributes.containsKey(VCFConstants.ALLELE_FREQUENCY_KEY) )
@ -74,15 +74,15 @@ public class VariantContextUtils {
} }
if ( vc.hasGenotypes() ) { if ( vc.hasGenotypes() ) {
attributes.put(VCFConstants.ALLELE_NUMBER_KEY, vc.getChromosomeCount()); attributes.put(VCFConstants.ALLELE_NUMBER_KEY, vc.getCalledChrCount());
// if there are alternate alleles, record the relevant tags // if there are alternate alleles, record the relevant tags
if ( vc.getAlternateAlleles().size() > 0 ) { if ( vc.getAlternateAlleles().size() > 0 ) {
ArrayList<String> alleleFreqs = new ArrayList<String>(); ArrayList<String> alleleFreqs = new ArrayList<String>();
ArrayList<Integer> alleleCounts = new ArrayList<Integer>(); ArrayList<Integer> alleleCounts = new ArrayList<Integer>();
double totalChromosomes = (double)vc.getChromosomeCount(); double totalChromosomes = (double)vc.getCalledChrCount();
for ( Allele allele : vc.getAlternateAlleles() ) { for ( Allele allele : vc.getAlternateAlleles() ) {
int altChromosomes = vc.getChromosomeCount(allele); int altChromosomes = vc.getCalledChrCount(allele);
alleleCounts.add(altChromosomes); alleleCounts.add(altChromosomes);
String freq = String.format(makePrecisionFormatStringFromDenominatorValue(totalChromosomes), ((double)altChromosomes / totalChromosomes)); String freq = String.format(makePrecisionFormatStringFromDenominatorValue(totalChromosomes), ((double)altChromosomes / totalChromosomes));
alleleFreqs.add(freq); alleleFreqs.add(freq);
@ -320,7 +320,7 @@ public class VariantContextUtils {
} }
public static double computeHardyWeinbergPvalue(VariantContext vc) { public static double computeHardyWeinbergPvalue(VariantContext vc) {
if ( vc.getChromosomeCount() == 0 ) if ( vc.getCalledChrCount() == 0 )
return 0.0; return 0.0;
return HardyWeinbergCalculation.hwCalculate(vc.getHomRefCount(), vc.getHetCount(), vc.getHomVarCount()); return HardyWeinbergCalculation.hwCalculate(vc.getHomRefCount(), vc.getHetCount(), vc.getHomVarCount());
} }

View File

@ -12,7 +12,6 @@ import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import org.testng.Assert; import org.testng.Assert;
import java.lang.reflect.Array;
import java.util.*; import java.util.*;
@ -260,12 +259,12 @@ public class VariantContextUnitTest extends BaseTest {
Assert.assertTrue(vc.isSNP()); Assert.assertTrue(vc.isSNP());
Assert.assertEquals(vc.getNAlleles(), 2); Assert.assertEquals(vc.getNAlleles(), 2);
Assert.assertTrue(vc.hasGenotypes()); Assert.assertTrue(vc.hasGenotypes());
Assert.assertFalse(vc.isMonomorphic()); Assert.assertFalse(vc.isMonomorphicInSamples());
Assert.assertTrue(vc.isPolymorphic()); Assert.assertTrue(vc.isPolymorphicInSamples());
Assert.assertEquals(vc.getGenotype("foo"), g); Assert.assertEquals(vc.getGenotype("foo"), g);
Assert.assertEquals(vc.getChromosomeCount(), 1); // we only have 1 called chromosomes, we exclude the NO_CALL one isn't called Assert.assertEquals(vc.getCalledChrCount(), 1); // we only have 1 called chromosomes, we exclude the NO_CALL one isn't called
Assert.assertEquals(vc.getChromosomeCount(Aref), 0); Assert.assertEquals(vc.getCalledChrCount(Aref), 0);
Assert.assertEquals(vc.getChromosomeCount(C), 1); Assert.assertEquals(vc.getCalledChrCount(C), 1);
Assert.assertFalse(vc.getGenotype("foo").isHet()); Assert.assertFalse(vc.getGenotype("foo").isHet());
Assert.assertFalse(vc.getGenotype("foo").isHom()); Assert.assertFalse(vc.getGenotype("foo").isHom());
Assert.assertFalse(vc.getGenotype("foo").isNoCall()); Assert.assertFalse(vc.getGenotype("foo").isNoCall());
@ -332,8 +331,8 @@ public class VariantContextUnitTest extends BaseTest {
.genotypes(g1, g2, g3).make(); .genotypes(g1, g2, g3).make();
Assert.assertTrue(vc.hasGenotypes()); Assert.assertTrue(vc.hasGenotypes());
Assert.assertFalse(vc.isMonomorphic()); Assert.assertFalse(vc.isMonomorphicInSamples());
Assert.assertTrue(vc.isPolymorphic()); Assert.assertTrue(vc.isPolymorphicInSamples());
Assert.assertEquals(vc.getSampleNames().size(), 3); Assert.assertEquals(vc.getSampleNames().size(), 3);
Assert.assertEquals(vc.getGenotypes().size(), 3); Assert.assertEquals(vc.getGenotypes().size(), 3);
@ -352,9 +351,9 @@ public class VariantContextUnitTest extends BaseTest {
Assert.assertFalse(vc.hasGenotype("at")); Assert.assertFalse(vc.hasGenotype("at"));
Assert.assertFalse(vc.hasGenotype("tt")); Assert.assertFalse(vc.hasGenotype("tt"));
Assert.assertEquals(vc.getChromosomeCount(), 6); Assert.assertEquals(vc.getCalledChrCount(), 6);
Assert.assertEquals(vc.getChromosomeCount(Aref), 3); Assert.assertEquals(vc.getCalledChrCount(Aref), 3);
Assert.assertEquals(vc.getChromosomeCount(T), 3); Assert.assertEquals(vc.getCalledChrCount(T), 3);
} }
@Test @Test
@ -372,17 +371,17 @@ public class VariantContextUnitTest extends BaseTest {
.genotypes(g1, g2, g3, g4, g5, g6).make(); .genotypes(g1, g2, g3, g4, g5, g6).make();
Assert.assertTrue(vc.hasGenotypes()); Assert.assertTrue(vc.hasGenotypes());
Assert.assertFalse(vc.isMonomorphic()); Assert.assertFalse(vc.isMonomorphicInSamples());
Assert.assertTrue(vc.isPolymorphic()); Assert.assertTrue(vc.isPolymorphicInSamples());
Assert.assertEquals(vc.getGenotypes().size(), 6); Assert.assertEquals(vc.getGenotypes().size(), 6);
Assert.assertEquals(3, vc.getGenotypes(Arrays.asList("AA", "Td", "dd")).size()); Assert.assertEquals(3, vc.getGenotypes(Arrays.asList("AA", "Td", "dd")).size());
Assert.assertEquals(10, vc.getChromosomeCount()); Assert.assertEquals(10, vc.getCalledChrCount());
Assert.assertEquals(3, vc.getChromosomeCount(Aref)); Assert.assertEquals(3, vc.getCalledChrCount(Aref));
Assert.assertEquals(4, vc.getChromosomeCount(T)); Assert.assertEquals(4, vc.getCalledChrCount(T));
Assert.assertEquals(3, vc.getChromosomeCount(del)); Assert.assertEquals(3, vc.getCalledChrCount(del));
Assert.assertEquals(2, vc.getChromosomeCount(Allele.NO_CALL)); Assert.assertEquals(2, vc.getCalledChrCount(Allele.NO_CALL));
} }
@Test @Test
@ -398,14 +397,14 @@ public class VariantContextUnitTest extends BaseTest {
.genotypes(g1, g2, g3).make(); .genotypes(g1, g2, g3).make();
Assert.assertTrue(vc.hasGenotypes()); Assert.assertTrue(vc.hasGenotypes());
Assert.assertTrue(vc.isMonomorphic()); Assert.assertTrue(vc.isMonomorphicInSamples());
Assert.assertFalse(vc.isPolymorphic()); Assert.assertFalse(vc.isPolymorphicInSamples());
Assert.assertEquals(vc.getGenotypes().size(), 3); Assert.assertEquals(vc.getGenotypes().size(), 3);
Assert.assertEquals(4, vc.getChromosomeCount()); Assert.assertEquals(4, vc.getCalledChrCount());
Assert.assertEquals(4, vc.getChromosomeCount(Aref)); Assert.assertEquals(4, vc.getCalledChrCount(Aref));
Assert.assertEquals(0, vc.getChromosomeCount(T)); Assert.assertEquals(0, vc.getCalledChrCount(T));
Assert.assertEquals(2, vc.getChromosomeCount(Allele.NO_CALL)); Assert.assertEquals(2, vc.getCalledChrCount(Allele.NO_CALL));
} }
} }
@ -452,12 +451,12 @@ public class VariantContextUnitTest extends BaseTest {
VariantContext vc14 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g1.getSampleName(), g4.getSampleName()))); VariantContext vc14 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g1.getSampleName(), g4.getSampleName())));
VariantContext vc5 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g5.getSampleName()))); VariantContext vc5 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g5.getSampleName())));
Assert.assertTrue(vc12.isPolymorphic()); Assert.assertTrue(vc12.isPolymorphicInSamples());
Assert.assertTrue(vc23.isPolymorphic()); Assert.assertTrue(vc23.isPolymorphicInSamples());
Assert.assertTrue(vc1.isMonomorphic()); Assert.assertTrue(vc1.isMonomorphicInSamples());
Assert.assertTrue(vc4.isMonomorphic()); Assert.assertTrue(vc4.isMonomorphicInSamples());
Assert.assertTrue(vc14.isMonomorphic()); Assert.assertTrue(vc14.isMonomorphicInSamples());
Assert.assertTrue(vc5.isPolymorphic()); Assert.assertTrue(vc5.isPolymorphicInSamples());
Assert.assertTrue(vc12.isSNP()); Assert.assertTrue(vc12.isSNP());
Assert.assertTrue(vc12.isVariant()); Assert.assertTrue(vc12.isVariant());
@ -484,12 +483,12 @@ public class VariantContextUnitTest extends BaseTest {
Assert.assertTrue(vc5.isVariant()); Assert.assertTrue(vc5.isVariant());
Assert.assertTrue(vc5.isBiallelic()); Assert.assertTrue(vc5.isBiallelic());
Assert.assertEquals(3, vc12.getChromosomeCount(Aref)); Assert.assertEquals(3, vc12.getCalledChrCount(Aref));
Assert.assertEquals(1, vc23.getChromosomeCount(Aref)); Assert.assertEquals(1, vc23.getCalledChrCount(Aref));
Assert.assertEquals(2, vc1.getChromosomeCount(Aref)); Assert.assertEquals(2, vc1.getCalledChrCount(Aref));
Assert.assertEquals(0, vc4.getChromosomeCount(Aref)); Assert.assertEquals(0, vc4.getCalledChrCount(Aref));
Assert.assertEquals(2, vc14.getChromosomeCount(Aref)); Assert.assertEquals(2, vc14.getCalledChrCount(Aref));
Assert.assertEquals(0, vc5.getChromosomeCount(Aref)); Assert.assertEquals(0, vc5.getCalledChrCount(Aref));
} }
public void testGetGenotypeMethods() { public void testGetGenotypeMethods() {
@ -827,14 +826,14 @@ public class VariantContextUnitTest extends BaseTest {
VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, T)).genotypes(gc).make(); VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, T)).genotypes(gc).make();
Assert.assertEquals(vc.getNSamples(), nSamples); Assert.assertEquals(vc.getNSamples(), nSamples);
if ( nSamples > 0 ) { if ( nSamples > 0 ) {
Assert.assertEquals(vc.isPolymorphic(), nT > 0); Assert.assertEquals(vc.isPolymorphicInSamples(), nT > 0);
Assert.assertEquals(vc.isMonomorphic(), nT == 0); Assert.assertEquals(vc.isMonomorphicInSamples(), nT == 0);
} }
Assert.assertEquals(vc.getChromosomeCount(), nA + nT); Assert.assertEquals(vc.getCalledChrCount(), nA + nT);
Assert.assertEquals(vc.getChromosomeCount(Allele.NO_CALL), nNoCallAlleles); Assert.assertEquals(vc.getCalledChrCount(Allele.NO_CALL), nNoCallAlleles);
Assert.assertEquals(vc.getChromosomeCount(Aref), nA); Assert.assertEquals(vc.getCalledChrCount(Aref), nA);
Assert.assertEquals(vc.getChromosomeCount(T), nT); Assert.assertEquals(vc.getCalledChrCount(T), nT);
Assert.assertEquals(vc.getNoCallCount(), nNoCall); Assert.assertEquals(vc.getNoCallCount(), nNoCall);
Assert.assertEquals(vc.getHomRefCount(), nHomRef); Assert.assertEquals(vc.getHomRefCount(), nHomRef);