Fix for bug reported on forums: VariantsToTable does not handle lists and nested arrays correctly. Added an integration test to cover printing of PLs.

This commit is contained in:
Eric Banks 2012-10-07 00:01:27 -04:00
parent e7798ddd2a
commit 5d6aad67e2
2 changed files with 37 additions and 3 deletions

View File

@ -42,6 +42,7 @@ import org.broadinstitute.sting.utils.exceptions.UserException;
import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils;
import java.io.PrintStream;
import java.lang.reflect.Array;
import java.util.*;
/**
@ -334,12 +335,12 @@ public class VariantsToTable extends RodWalker<Integer, Integer> {
return records;
}
private static void addFieldValue(Object val, List<List<String>> result) {
private static void addFieldValue(final Object val, final List<List<String>> result) {
final int numResultRecords = result.size();
// if we're trying to create a single output record, add it
if ( numResultRecords == 1 ) {
result.get(0).add(val.toString());
result.get(0).add(prettyPrintObject(val));
}
// if this field is a list of the proper size, add the appropriate entry to each record
else if ( (val instanceof List) && ((List)val).size() == numResultRecords ) {
@ -355,6 +356,26 @@ public class VariantsToTable extends RodWalker<Integer, Integer> {
}
}
private static String prettyPrintObject(final Object val) {
if ( val instanceof List )
return prettyPrintObject(((List)val).toArray());
if ( !val.getClass().isArray() )
return val.toString();
final int length = Array.getLength(val);
if ( length == 0 )
return "";
final StringBuilder sb = new StringBuilder(prettyPrintObject(Array.get(val, 0)));
for ( int i = 1; i < length; i++ ) {
sb.append(",");
sb.append(prettyPrintObject(Array.get(val, i)));
}
return sb.toString();
}
public static List<List<String>> extractFields(VariantContext vc, List<String> fields, boolean allowMissingData) {
return extractFields(vc, fields, null, null, allowMissingData, false);
}

View File

@ -63,7 +63,7 @@ public class VariantsToTableIntegrationTest extends WalkerTest {
@Test(enabled = true)
public void testMultiAllelicOneRecord() {
WalkerTestSpec spec = new WalkerTestSpec(variantsToTableMultiAllelicCmd(""),
Arrays.asList("13dd36c08be6c800f23988e6000d963e"));
Arrays.asList("0ff49c08690f61a38614606a090f23ea"));
executeTest("testMultiAllelicOneRecord", spec);
}
@ -100,6 +100,19 @@ public class VariantsToTableIntegrationTest extends WalkerTest {
executeTest("testGenotypeFieldsWithInline", spec);
}
@Test(enabled = true)
public void testListFields() {
WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec(
"-R " + b36KGReference +
" --variant " + privateTestDir + "vcfexample.withMLE.vcf" +
" -T VariantsToTable" +
" -GF PL" +
" -o %s",
1,
Arrays.asList("1cb2737ab0eaee0a9ae25ab2e7ac3e7e"));
executeTest("testGenotypeFields", spec);
}
@Test(enabled = true)
public void testMoltenOutput() {
WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec(