diff --git a/scripts/funcotator/testing/testFuncotator.sh b/scripts/funcotator/testing/testFuncotator.sh index 93b8c92899e..418974d6fb9 100755 --- a/scripts/funcotator/testing/testFuncotator.sh +++ b/scripts/funcotator/testing/testFuncotator.sh @@ -242,7 +242,7 @@ else --tests org.broadinstitute.hellbender.utils.codecs.gencode* \ --tests org.broadinstitute.hellbender.tools.copynumber.utils.annotatedinterval.SimpleAnnotatedIntervalWriterUnitTest* \ --tests org.broadinstitute.hellbender.tools.copynumber.utils.annotatedinterval.AnnotatedIntervalCollectionUnitTest* \ - --stacktrace + --stacktrace > >(tee -a FUNCOTATOR.unitTest.stdout.log) 2> >(tee -a FUNCOTATOR.unitTest.stderr.log >&2) r=$? fi diff --git a/src/main/java/org/broadinstitute/hellbender/tools/funcotator/FuncotatorUtils.java b/src/main/java/org/broadinstitute/hellbender/tools/funcotator/FuncotatorUtils.java index b1dfa9c812f..91884ac5be0 100644 --- a/src/main/java/org/broadinstitute/hellbender/tools/funcotator/FuncotatorUtils.java +++ b/src/main/java/org/broadinstitute/hellbender/tools/funcotator/FuncotatorUtils.java @@ -30,6 +30,7 @@ import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -2076,7 +2077,17 @@ public static String[] extractFuncotatorKeysFromHeaderDescription(final String f */ public static String sanitizeFuncotationFieldForVcf(final String individualFuncotationField) { Utils.nonNull(individualFuncotationField); - return StringUtils.replaceEach(individualFuncotationField, new String[]{",", ";", "=", "\t", "|", " ", "\n"}, new String[]{"_%2C_", "_%3B_", "_%3D_", "_%09_", "_%7C_", "_%20_", "_%0A_"}); + + // List of letters to encode: + final List badLetters = Arrays.asList(",", ";", "=", "\t", VcfOutputRenderer.HEADER_LISTED_FIELD_DELIMITER, " ", "\n", VcfOutputRenderer.ALL_TRANSCRIPT_DELIMITER); + + // Encoded version: + final List cleanLetters = badLetters.stream().map( + s -> "_%" + String.format("%02X", s.getBytes(StandardCharsets.US_ASCII)[0]) + "_") + .collect(Collectors.toList()); + + // Now replace them: + return StringUtils.replaceEach(individualFuncotationField, badLetters.toArray(new String[]{}), cleanLetters.toArray(new String[]{})); } /** diff --git a/src/test/java/org/broadinstitute/hellbender/tools/funcotator/FilterFuncotationsIntegrationTest.java b/src/test/java/org/broadinstitute/hellbender/tools/funcotator/FilterFuncotationsIntegrationTest.java index f539ec369f3..7b2b15b9579 100644 --- a/src/test/java/org/broadinstitute/hellbender/tools/funcotator/FilterFuncotationsIntegrationTest.java +++ b/src/test/java/org/broadinstitute/hellbender/tools/funcotator/FilterFuncotationsIntegrationTest.java @@ -16,11 +16,7 @@ import java.io.File; import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class FilterFuncotationsIntegrationTest extends CommandLineProgramTest { diff --git a/src/test/java/org/broadinstitute/hellbender/tools/funcotator/FuncotatorUtilsUnitTest.java b/src/test/java/org/broadinstitute/hellbender/tools/funcotator/FuncotatorUtilsUnitTest.java index 81af5c1820e..2a65370e7d9 100644 --- a/src/test/java/org/broadinstitute/hellbender/tools/funcotator/FuncotatorUtilsUnitTest.java +++ b/src/test/java/org/broadinstitute/hellbender/tools/funcotator/FuncotatorUtilsUnitTest.java @@ -2323,4 +2323,27 @@ public void testRenderSanitizedFuncotationForVcf(final Funcotation funcotation, final String guess = FuncotatorUtils.renderSanitizedFuncotationForVcf(funcotation, includedFields); Assert.assertEquals(guess, gt); } + + @DataProvider + public Object[][] provideForTestSanitizeFuncotationFieldForVcf() { + return new Object[][] { + { "", "" }, + { ",", "_%2C_" }, + { ";", "_%3B_" }, + { "=", "_%3D_" }, + { "\t", "_%09_" }, + { "|", "_%7C_" }, + { " ", "_%20_" }, + { "\n", "_%0A_" }, + { "#", "_%23_" }, + { ",;=\t| \n#", "_%2C__%3B__%3D__%09__%7C__%20__%0A__%23_" }, + { "ASDFJKL:", "ASDFJKL:" }, + { "ASDF;JKL:", "ASDF_%3B_JKL:" }, + }; + } + + @Test(dataProvider = "provideForTestSanitizeFuncotationFieldForVcf" ) + public void testSanitizeFuncotationFieldForVcf(final String input, final String expected) { + Assert.assertEquals( FuncotatorUtils.sanitizeFuncotationFieldForVcf(input), expected ); + } }