From 5d6aad67e2c2565ad948a41aff2d6e07208ea2fd Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Sun, 7 Oct 2012 00:01:27 -0400 Subject: [PATCH] Fix for bug reported on forums: VariantsToTable does not handle lists and nested arrays correctly. Added an integration test to cover printing of PLs. --- .../walkers/variantutils/VariantsToTable.java | 25 +++++++++++++++++-- .../VariantsToTableIntegrationTest.java | 15 ++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java index b9577ca9b..dd5264a1b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java @@ -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 { return records; } - private static void addFieldValue(Object val, List> result) { + private static void addFieldValue(final Object val, final List> 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 { } } + 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> extractFields(VariantContext vc, List fields, boolean allowMissingData) { return extractFields(vc, fields, null, null, allowMissingData, false); } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java index 2ffcd02e2..8186ffc7d 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java @@ -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(