Minor fixes to splitting multi-allelic records (as regards printing indel alleles correctly); minor code refactoring; adding integration tests to cover +/- splitting multi-allelics.

This commit is contained in:
Eric Banks 2012-02-13 15:09:53 -05:00
parent 14981bed10
commit 0920a1921e
2 changed files with 45 additions and 7 deletions

View File

@ -194,7 +194,9 @@ public class VariantsToTable extends RodWalker<Integer, Integer> {
for ( String field : fields ) {
if ( getters.containsKey(field) ) {
if ( splitMultiAllelic && field.equals("ALT") ) { // we need to special case the ALT field when splitting out multi-allelic records
addFieldValue(splitAltAlleles(vc), records);
} else if ( getters.containsKey(field) ) {
addFieldValue(getters.get(field).get(vc), records);
} else if ( vc.hasAttribute(field) ) {
addFieldValue(vc.getAttribute(field, null), records);
@ -271,9 +273,7 @@ public class VariantsToTable extends RodWalker<Integer, Integer> {
getters.put("REF", new Getter() {
public String get(VariantContext vc) {
StringBuilder x = new StringBuilder();
if ( vc.hasReferenceBaseForIndel() && !vc.isSNP() )
x.append((char)vc.getReferenceBaseForIndel().byteValue());
x.append(vc.getReference().getDisplayString());
x.append(getAlleleDisplayString(vc, vc.getReference()));
return x.toString();
}
});
@ -285,9 +285,7 @@ public class VariantsToTable extends RodWalker<Integer, Integer> {
for ( int i = 0; i < n; i++ ) {
if ( i != 0 ) x.append(",");
if ( vc.hasReferenceBaseForIndel() && !vc.isSNP() )
x.append((char)vc.getReferenceBaseForIndel().byteValue());
x.append(vc.getAlternateAllele(i).getDisplayString());
x.append(getAlleleDisplayString(vc, vc.getAlternateAllele(i)));
}
return x.toString();
}
@ -325,5 +323,23 @@ public class VariantsToTable extends RodWalker<Integer, Integer> {
return String.format("%.2f", -10 * vc.getGenotype(0).getLog10PError());
}});
}
private static String getAlleleDisplayString(VariantContext vc, Allele allele) {
StringBuilder sb = new StringBuilder();
if ( vc.hasReferenceBaseForIndel() && !vc.isSNP() )
sb.append((char)vc.getReferenceBaseForIndel().byteValue());
sb.append(allele.getDisplayString());
return sb.toString();
}
private static Object splitAltAlleles(VariantContext vc) {
final int numAltAlleles = vc.getAlternateAlleles().size();
if ( numAltAlleles == 1 )
return getAlleleDisplayString(vc, vc.getAlternateAllele(0));
final List<String> alleles = new ArrayList<String>(numAltAlleles);
for ( Allele allele : vc.getAlternateAlleles() )
alleles.add(getAlleleDisplayString(vc, allele));
return alleles;
}
}

View File

@ -39,6 +39,14 @@ public class VariantsToTableIntegrationTest extends WalkerTest {
" -L chr1 -o %s" + moreArgs;
}
private String variantsToTableMultiAllelicCmd(String moreArgs) {
return "-R " + b37KGReference +
" --variant " + validationDataLocation + "/multiallelic.vcf" +
" -T VariantsToTable" +
" -F CHROM -F POS -F ID -F REF -F ALT -F QUAL -F MULTI-ALLELIC -F AC -F AF" +
" -o %s" + moreArgs;
}
@Test(enabled = true)
public void testComplexVariantsToTable() {
WalkerTestSpec spec = new WalkerTestSpec(variantsToTableCmd(" -AMD"),
@ -51,4 +59,18 @@ public class VariantsToTableIntegrationTest extends WalkerTest {
WalkerTestSpec spec = new WalkerTestSpec(variantsToTableCmd(""), 1, UserException.class);
executeTest("testComplexVariantsToTable-FAIL", spec);
}
@Test(enabled = true)
public void testMultiAllelicOneRecord() {
WalkerTestSpec spec = new WalkerTestSpec(variantsToTableMultiAllelicCmd(""),
Arrays.asList("13dd36c08be6c800f23988e6000d963e"));
executeTest("testMultiAllelicOneRecord", spec).getFirst();
}
@Test(enabled = true)
public void testMultiAllelicSplitRecords() {
WalkerTestSpec spec = new WalkerTestSpec(variantsToTableMultiAllelicCmd(" -SMA"),
Arrays.asList("17a0fc80409d2fc00ad2bbb94b3a346b"));
executeTest("testMultiAllelicSplitRecords", spec).getFirst();
}
}