From 982f08c1c5b7663076dd9332f5408b5a5cad3bcc Mon Sep 17 00:00:00 2001 From: Oliver Holmes Date: Tue, 11 Feb 2025 09:44:55 +1000 Subject: [PATCH] fix(qannotate): mIUN was not being applied appropriately to SNPs MIN is applied if 2 reads support the alt in the normal. MIUN is applied if 2 reads that failed the filter support the alt in the normal, but nothing was being applied if 1 passed filter read and 1 failed filter read supported the normal . This has now been addressed --- .../qimr/qannotate/modes/ConfidenceMode.java | 61 +++--- .../qannotate/modes/ConfidenceModeTest.java | 188 ++++++++++++++++-- 2 files changed, 204 insertions(+), 45 deletions(-) diff --git a/qannotate/src/au/edu/qimr/qannotate/modes/ConfidenceMode.java b/qannotate/src/au/edu/qimr/qannotate/modes/ConfidenceMode.java index 7348431c5..c75e02e60 100644 --- a/qannotate/src/au/edu/qimr/qannotate/modes/ConfidenceMode.java +++ b/qannotate/src/au/edu/qimr/qannotate/modes/ConfidenceMode.java @@ -8,13 +8,11 @@ import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; import org.qcmg.common.log.QLogger; import org.qcmg.common.log.QLoggerFactory; @@ -55,6 +53,8 @@ public class ConfidenceMode extends AbstractMode { public static final int sBiasAltPercentage = 5; public static final int sBiasCovPercentage = 5; + private static final int[] ZERO_ARRAY = {0, 0}; + @Deprecated // using values (both hard cutoff and percentage) from MIN for MIUN annotation public static final int MIUN_CUTOFF = 2; // based on existing values @@ -230,7 +230,7 @@ void addAnnotation() { /* * look for MIUN, but only if we don't already have MIN */ - checkMIUN(failedFilterStringBuilder, ffArr, i, alts, cov); + checkMIUN(failedFilterStringBuilder, ffArr, i, alts, cov, alleleDist); if (!failedFilterStringBuilder.toString().contains(VcfHeaderUtils.FILTER_COVERAGE) && cov < controlCovCutoffForSomaticCalls) { StringUtils.updateStringBuilder(failedFilterStringBuilder, VcfHeaderUtils.FILTER_COVERAGE, Constants.SEMI_COLON); @@ -243,7 +243,7 @@ void addAnnotation() { String gt = gtArray[i]; if ( ! StringUtils.isNullOrEmptyOrMissingData(gt) && ! "0/0".equals(gt)) { int index = gt.indexOf(Constants.SLASH); - int[] gts = new int[]{Integer.parseInt(gt.substring(0, index)), Integer.parseInt(gt.substring(index + 1))}; + int[] gts = new int[]{Integer.parseInt(gt, 0, index, 10), Integer.parseInt(gt, index + 1, gt.length(), 10)}; if (!alleleDist.isEmpty() && !isGATKCall) { checkStrandBias(alts, failedFilterStringBuilder, alleleDist, gts, sBiasCovPercentage, sBiasAltPercentage); @@ -304,12 +304,12 @@ void addAnnotation() { } } - private void checkMIUN(StringBuilder fSb, String[] ffArr, int i, String[] alts, int cov) { + private void checkMIUN(StringBuilder fSb, String[] ffArr, int i, String[] alts, int cov, Map alleleDist) { if (!fSb.toString().contains(VcfHeaderUtils.FILTER_MUTATION_IN_NORMAL)) { if (null != ffArr && ffArr.length > i) { String failedFilter = ffArr[i]; // using the same values as for the MIN annotation - checkMIUN(alts, cov, failedFilter, fSb, minCutoff, (float) minPercentage); + checkMIUN(alts, cov, failedFilter, fSb, minCutoff, (float) minPercentage, alleleDist); } } } @@ -385,7 +385,7 @@ public static void checkNNS(String nnsString, StringBuilder sb, int nnsCount) { public static void checkMIN(String[] alts, int coverage, Map alleleDist, StringBuilder sb, int minCutoff, float minPercentage) { if (null != alts && null != alleleDist) { for (String alt : alts) { - int altCov = Arrays.stream(alleleDist.getOrDefault(alt, new int[]{0, 0})).sum(); + int altCov = Arrays.stream(alleleDist.getOrDefault(alt, ZERO_ARRAY)).sum(); boolean min = VcfUtils.mutationInNormal(altCov, coverage, minPercentage, minCutoff); if (min) { StringUtils.updateStringBuilder(sb, VcfHeaderUtils.FILTER_MUTATION_IN_NORMAL, Constants.SEMI_COLON); @@ -407,25 +407,31 @@ public static void checkMIN(String[] alts, int coverage, Map alle * @param miunCutoff The minimum coverage cutoff for MIUN * @param miunPercentage The minimum percentage cutoff for MIUN */ - public static void checkMIUN(String[] alts, int coverage, String failedFilter, StringBuilder sb, int miunCutoff, float miunPercentage) { - if (null != alts && !StringUtils.isNullOrEmptyOrMissingData(failedFilter)) { + public static void checkMIUN(String[] alts, int coverage, String failedFilter, StringBuilder sb, int miunCutoff, float miunPercentage, Map alleleDist) { + if (alts == null || alts.length == 0 || StringUtils.isNullOrEmptyOrMissingData(failedFilter)) { + return; + } - int totalCoverage = coverage + getCoverageFromFailedFilterString(failedFilter); - float cutoffToUse = Math.max(miunCutoff, (miunPercentage / 100) * totalCoverage); + int totalCoverage = coverage + getCoverageFromFailedFilterString(failedFilter); + float cutoffToUse = Math.max(miunCutoff, (miunPercentage / 100) * totalCoverage); + for (String alt : alts) { + int altIndex = failedFilter.indexOf(alt); + if (altIndex > -1) { + /* + * bases are separated by colons + */ + int semiColonIndex = failedFilter.indexOf(Constants.SEMI_COLON, altIndex); + int failedFilterCount = Integer.parseInt(failedFilter, altIndex + alt.length(), semiColonIndex > -1 ? semiColonIndex : failedFilter.length(), 10); - for (String alt : alts) { - int altIndex = failedFilter.indexOf(alt); - if (altIndex > -1) { - /* - * bases are separated by colons - */ - int semiColonIndex = failedFilter.indexOf(Constants.SEMI_COLON, altIndex); - int failedFilterCount = Integer.parseInt(failedFilter.substring(altIndex + alt.length(), semiColonIndex > -1 ? semiColonIndex : failedFilter.length())); - if (failedFilterCount >= cutoffToUse) { - StringUtils.updateStringBuilder(sb, VcfHeaderUtils.FILTER_MUTATION_IN_UNFILTERED_NORMAL, Constants.SEMI_COLON); - break; - } + // Add coverage from alleleDist map + int[] passedFilterCoverage = null != alleleDist ? alleleDist.getOrDefault(alt, ZERO_ARRAY) : ZERO_ARRAY; + int passedFilterCoverageSum = passedFilterCoverage[0] + passedFilterCoverage[1]; + failedFilterCount += passedFilterCoverageSum; + + if (failedFilterCount >= cutoffToUse) { + StringUtils.updateStringBuilder(sb, VcfHeaderUtils.FILTER_MUTATION_IN_UNFILTERED_NORMAL, Constants.SEMI_COLON); + break; } } } @@ -451,8 +457,8 @@ public static int endsOfReads(String[] alts, String gt, Map oabsM Map eorMap = VcfUtils.getAllelicCoverageWithStrand(eor); for (String alt : alts) { if (gt.contains("" + i)) { - int[] altCov = oabsMap.getOrDefault(alt, new int[]{0, 0}); - int[] altCovEOR = eorMap.getOrDefault(alt, new int[]{0, 0}); + int[] altCov = oabsMap.getOrDefault(alt, ZERO_ARRAY); + int[] altCovEOR = eorMap.getOrDefault(alt, ZERO_ARRAY); int middleOfReadForwardStrand = altCov[0] - altCovEOR[0]; int middleOfReadReverseStrand = altCov[1] - altCovEOR[1]; int middleOfReadCount = middleOfReadForwardStrand + middleOfReadReverseStrand; @@ -545,7 +551,8 @@ public static int[] getFieldOfInts(String value) { } int cI = value.indexOf(Constants.COMMA); if (cI == -1) return new int[]{Integer.parseInt(value)}; - return new int[]{Integer.parseInt(value.substring(0, cI)), Integer.parseInt(value.substring(cI + 1))}; + return new int[]{Integer.parseInt(value, 0, cI, 10), Integer.parseInt(value, cI + 1, value.length(), 10)}; +// return new int[]{Integer.parseInt(value.substring(0, cI)), Integer.parseInt(value.substring(cI + 1))}; } /** @@ -566,7 +573,7 @@ public static int getCoverageFromFailedFilterString(String ff) { // could probably start this at 1.... for (int i = 0; i < ff.length(); ) { if (Character.isDigit(ff.charAt(i))) { - cov += Integer.parseInt(ff.substring(i, semiColonIndex > -1 ? semiColonIndex : ff.length())); + cov += Integer.parseInt(ff, i, semiColonIndex > -1 ? semiColonIndex : ff.length(), 10); if (semiColonIndex == -1) { break; } else { diff --git a/qannotate/test/au/edu/qimr/qannotate/modes/ConfidenceModeTest.java b/qannotate/test/au/edu/qimr/qannotate/modes/ConfidenceModeTest.java index 1ea3bc51c..cf7c0db4b 100644 --- a/qannotate/test/au/edu/qimr/qannotate/modes/ConfidenceModeTest.java +++ b/qannotate/test/au/edu/qimr/qannotate/modes/ConfidenceModeTest.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Map; -import org.junit.Assert; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.qcmg.common.util.ChrPositionUtils; @@ -109,7 +108,6 @@ public void testCheckNNS() { @Test public void testCheckStrandBiasWhenBothStrandsRepresented() { - ConfidenceMode subject = new ConfidenceMode(); Map alleleDist = new HashMap<>(); alleleDist.put("A", new int[]{10, 10}); @@ -252,48 +250,180 @@ public void minForCompoundSnps() { @Test public void checkMIUN() { StringBuilder sb = null; - ConfidenceMode.checkMIUN(null, 0, null, sb, -1, 3); + ConfidenceMode.checkMIUN(null, 0, null, sb, -1, 3, null); assertNull(sb); sb = new StringBuilder(); - ConfidenceMode.checkMIUN(new String[]{"A"}, 0, "", sb, -1, 3); + ConfidenceMode.checkMIUN(new String[]{"A"}, 0, "", sb, -1, 3, null); assertEquals("", sb.toString()); - ConfidenceMode.checkMIUN(new String[]{"A"}, 0, "C1", sb, 1, 3); + ConfidenceMode.checkMIUN(new String[]{"A"}, 0, "C1", sb, 1, 3, null); assertEquals("", sb.toString()); - ConfidenceMode.checkMIUN(new String[]{"A"}, 0, "C1;G2;T3", sb, 1, 3); + ConfidenceMode.checkMIUN(new String[]{"A"}, 0, "C1;G2;T3", sb, 1, 3, null); assertEquals("", sb.toString()); - ConfidenceMode.checkMIUN(new String[]{"A", "C"}, 0, "C1;G2;T3", sb, 2, 3); + ConfidenceMode.checkMIUN(new String[]{"A", "C"}, 0, "C1;G2;T3", sb, 2, 3, null); assertEquals("", sb.toString()); - ConfidenceMode.checkMIUN(new String[]{"A", "C", "G"}, 93, "C1;G2;T3", sb, 2, 3); + ConfidenceMode.checkMIUN(new String[]{"A", "C", "G"}, 93, "C1;G2;T3", sb, 2, 3, null); assertEquals("", sb.toString()); - ConfidenceMode.checkMIUN(new String[]{"A", "C", "G", "T"}, 93, "C1;G2;T3", sb, 2, 3); + ConfidenceMode.checkMIUN(new String[]{"A", "C", "G", "T"}, 93, "C1;G2;T3", sb, 2, 3, null); assertEquals("MIUN", sb.toString()); sb = new StringBuilder(); - ConfidenceMode.checkMIUN(new String[]{"A", "C", "G"}, 94, "C1;G2;T3", sb, 2, 3); + ConfidenceMode.checkMIUN(new String[]{"A", "C", "G"}, 94, "C1;G2;T3", sb, 2, 3, null); assertEquals("", sb.toString()); - ConfidenceMode.checkMIUN(new String[]{"A", "C", "T"}, 0, "C1;G2;T3", sb, 3, 3); + ConfidenceMode.checkMIUN(new String[]{"A", "C", "T"}, 0, "C1;G2;T3", sb, 3, 3, null); assertEquals("MIUN", sb.toString()); sb = new StringBuilder(); - ConfidenceMode.checkMIUN(new String[]{"A", "C", "T"}, 100, "C1;G2;T3", sb, 3, 3); + ConfidenceMode.checkMIUN(new String[]{"A", "C", "T"}, 100, "C1;G2;T3", sb, 3, 3, null); assertEquals("", sb.toString()); - ConfidenceMode.checkMIUN(new String[]{"C"}, 0, "C1;G2;T3", sb, 1, 3); + ConfidenceMode.checkMIUN(new String[]{"C"}, 0, "C1;G2;T3", sb, 1, 3, null); assertEquals("MIUN", sb.toString()); sb = new StringBuilder(); - ConfidenceMode.checkMIUN(new String[]{"G"}, 0, "C1;G2;T3", sb, 2, 3); + ConfidenceMode.checkMIUN(new String[]{"G"}, 0, "C1;G2;T3", sb, 2, 3, null); assertEquals("MIUN", sb.toString()); sb = new StringBuilder(); - ConfidenceMode.checkMIUN(new String[]{"T"}, 0, "C1;G2;T3", sb, 3, 3); + ConfidenceMode.checkMIUN(new String[]{"T"}, 0, "C1;G2;T3", sb, 3, 3, null); assertEquals("MIUN", sb.toString()); sb = new StringBuilder(); - ConfidenceMode.checkMIUN(new String[]{"T"}, 0, "C1;G2;T3", sb, 4, 3); + ConfidenceMode.checkMIUN(new String[]{"T"}, 0, "C1;G2;T3", sb, 4, 3, null); assertEquals("", sb.toString()); sb = new StringBuilder(); - ConfidenceMode.checkMIUN(new String[]{"A"}, 0, "A3;C8", sb, 2, 3); + ConfidenceMode.checkMIUN(new String[]{"A"}, 0, "A3;C8", sb, 2, 3, null); assertEquals("MIUN", sb.toString()); sb = new StringBuilder(); - ConfidenceMode.checkMIUN(new String[]{"A"}, 90, "A3;C8", sb, 2, 3); + ConfidenceMode.checkMIUN(new String[]{"A", "C"}, 0, "A3;C8", sb, 2, 3, null); + assertEquals("MIUN", sb.toString()); + sb = new StringBuilder(); + ConfidenceMode.checkMIUN(new String[]{"A"}, 90, "A3;C8", sb, 2, 3, null); + assertEquals("", sb.toString()); + +// + } + + @Test + public void testMIUNWithHelpFromUnfiltered() { + /* + add some tests with alt in the alleleDist + */ + StringBuilder sb = new StringBuilder(); + Map alleleDist = new HashMap<>(); + ConfidenceMode.checkMIUN(new String[]{"A"}, 10, "A1", sb, 2, 3, alleleDist); assertEquals("", sb.toString()); + + alleleDist.put("A", new int[]{1, 0}); + ConfidenceMode.checkMIUN(new String[]{"A"}, 10, "A1", sb, 2, 3, alleleDist); + assertEquals("MIUN", sb.toString()); + + alleleDist.put("A", new int[]{0, 1}); + sb = new StringBuilder(); + ConfidenceMode.checkMIUN(new String[]{"A"}, 10, "A1", sb, 2, 3, alleleDist); + assertEquals("MIUN", sb.toString()); + sb = new StringBuilder(); + ConfidenceMode.checkMIUN(new String[]{"A"}, 10, "C1", sb, 2, 3, alleleDist); + assertEquals("", sb.toString()); + + } + + @Test + public void testCheckMIUN_AllAllelesPassCutoff() { + StringBuilder sb = new StringBuilder(); + Map alleleDist = new HashMap<>(); + alleleDist.put("G", new int[]{2, 2}); // Sum 4 + alleleDist.put("T", new int[]{1, 1}); // Sum 2 + ConfidenceMode.checkMIUN(new String[]{"G", "T"}, 30, "G4;T4", sb, 5, 10, alleleDist); + assertTrue(sb.toString().contains("MIUN")); // Both "G" and "T" pass the cutoff, MIUN should be added + } + + @Test + public void testCheckMIUN_AltsNotInFailedFilter() { + StringBuilder sb = new StringBuilder(); + Map alleleDist = new HashMap<>(); + alleleDist.put("A", new int[]{1, 2}); + + ConfidenceMode.checkMIUN(new String[]{"C"}, 10, "T:3;G:5;", sb, 2, 10, alleleDist); + + assertEquals(0, sb.length()); // No matching alternative allele in `failedFilter`, no mutation added } + + @Test + public void testCheckMIUN_EmptyFailedFilterString() { + StringBuilder sb = new StringBuilder(); + Map alleleDist = new HashMap<>(); + alleleDist.put("G", new int[]{0, 0}); + + ConfidenceMode.checkMIUN(new String[]{"G"}, 20, "", sb, 5, 10, alleleDist); + + assertEquals(0, sb.length()); // Empty `failedFilter`, no mutation should be added + } + + @Test + public void testCheckMIUN_AltExceedsCutoff() { + StringBuilder sb = new StringBuilder(); + Map alleleDist = new HashMap<>(); + alleleDist.put("A", new int[]{3, 3}); // Sum = 6 + + ConfidenceMode.checkMIUN(new String[]{"A"}, 20, "A5", sb, 5, 10, alleleDist); + + assertTrue(sb.toString().contains("MIUN")); // Alt exceeds the calculated cutoff, "MIUN" should be added + } + + + @Test + public void testCheckMIUN_PercentageCutoff() { + StringBuilder sb = new StringBuilder(); + Map alleleDist = new HashMap<>(); + alleleDist.put("A", new int[]{0, 0}); // Sum = 0 + + // Total Coverage = 50 + 32 = 82 + // Percentage-based cutoff = 30% = 31.5 -> 32 + ConfidenceMode.checkMIUN(new String[]{"A"}, 50, "A32", sb, 10, 30, alleleDist); + + assertTrue(sb.toString().contains("MIUN")); // Failed filter count meets the percentage cutoff + } + @Test + public void testCheckMIUN_EmptyAlts() { + StringBuilder sb = new StringBuilder(); + ConfidenceMode.checkMIUN(new String[]{}, 10, "T:3;G:5;", sb, 5, 10, new HashMap<>()); + assertEquals(0, sb.length()); // No update should occur with empty `alts` array + } + + + @Test + public void testCheckMIUN_NullFailedFilter() { + StringBuilder sb = new StringBuilder(); + ConfidenceMode.checkMIUN(new String[]{"A"}, 10, null, sb, 2, 10, new HashMap<>()); + assertEquals(0, sb.length()); // Null `failedFilter` should result in no modification + } + + + @Test + public void testCheckMIUN_HandlesMultipleAlts() { + StringBuilder sb = new StringBuilder(); + Map alleleDist = new HashMap<>(); + alleleDist.put("T", new int[]{1, 1}); // Sum = 2 + alleleDist.put("A", new int[]{4, 2}); // Sum = 6 + + // Total Coverage = 50 + 10 = 60 + // Hard cutoff = max(5, (10% of 60)) = max(5, 6) = 6 + ConfidenceMode.checkMIUN(new String[]{"T", "A"}, 50, "T3;A4", sb, 5, 10, alleleDist); + + assertTrue(sb.toString().contains("MIUN")); // "A" exceeds the cutoff, so MIUN is added + } + + + + @Test + public void testCheckMIUN_HardCutoff() { + StringBuilder sb = new StringBuilder(); + Map alleleDist = new HashMap<>(); + alleleDist.put("T", new int[]{1, 1}); // Sum = 2 + + // Total Coverage = 50 + 6 = 56 + // Hard cutoff = max(10, (20% of 56)) = max(10, 11.2) = 11 + ConfidenceMode.checkMIUN(new String[]{"T"}, 50, "T9", sb, 10, 20, alleleDist); + + assertEquals(0, sb.length()); // Failed filter count + alleleDist below the hard cutoff + } + + @Test public void testHOM() { StringBuilder sb = null; @@ -661,6 +791,28 @@ public void newCoverageCutoffs() { assertEquals("PASS", vcf.getSampleFormatRecord(4).getField(VcfHeaderUtils.FORMAT_FILTER)); } + @Test + public void realLifeMIUN2() { + // chr1 16651203 rs79306135 G A . . FLANK=GTAAAACTGGA;BaseQRankSum=0.325;ClippingRankSum=0.000;DP=58;ExcessHet=3.0103;FS=4.683;MQ=55.10;MQRankSum=-6.669;QD=4.63;ReadPosRankSum=-0.352;SOR=1.425;IN=1,2;DB;VLD;HOM=3,TATATGTAAAgCTGGATTAAT;EFF=downstream_gene_variant(MODIFIER||914|||MST1P2|unprocessed_pseudogene|NON_CODING|ENST00000457982||1),intergenic_region(MODIFIER||||||||||1) GT:AD:CCC:CCM:DP:EOR:FF:FT:GQ:INF:NNS:OABS:QL 0/0:21,1:Reference:13:22:.:A1;C1:PASS:.:.:.:A0[0]1[41];G9[40.11]12[39.08]:. 0/1:43,14:Somatic:13:57:A0[]1[];G0[]1[]:A10;G2:PASS:.:SOMATIC:13:A6[40.33]8[37.12];G21[35.67]22[38.91]:. + // ./.:.:.:3:.:.:.:PASS:.:NCIG:.:.:. 0/1:45,12:.:3:57:.:.:PASS:99:SOMATIC:.:.:263.77 + VcfRecord vcf = VcfUtils.createVcfRecord(ChrPositionUtils.getChrPosition("chr1", 16651203, 16651203), "rs79306135", "G", "A"); + vcf.setInfo("FLANK=GTAAAACTGGA;BaseQRankSum=0.325;ClippingRankSum=0.000;DP=58;ExcessHet=3.0103;FS=4.683;MQ=55.10;MQRankSum=-6.669;QD=4.63;ReadPosRankSum=-0.352;SOR=1.425;IN=1,2;DB;VLD;HOM=3,TATATGTAAAgCTGGATTAAT;EFF=downstream_gene_variant(MODIFIER||914|||MST1P2|unprocessed_pseudogene|NON_CODING|ENST00000457982||1),intergenic_region(MODIFIER||||||||||1)"); + vcf.setFormatFields(java.util.Arrays.asList( + "GT:AD:CCC:CCM:DP:EOR:FF:FT:GQ:INF:NNS:OABS:QL", + "0/0:21,1:Reference:13:22:.:A1;C1:.:.:.:.:A0[0]1[41];G9[40.11]12[39.08]:.", + "0/1:43,14:Somatic:13:57:A0[]1[];G0[]1[]:A10;G2:.:.:SOMATIC:13:A6[40.33]8[37.12];G21[35.67]22[38.91]:.", + "./.:.:.:3:.:.:.:.:.:NCIG:.:.:.", + "0/1:45,12:.:3:57:.:.:.:99:SOMATIC:.:.:263.77")); + ConfidenceMode cm = new ConfidenceMode(TWO_SAMPLE_TWO_CALLER_META); + cm.positionRecordMap.put(vcf.getChrPosition(), List.of(vcf)); + cm.addAnnotation(); + vcf = cm.positionRecordMap.get(vcf.getChrPosition()).getFirst(); + assertEquals("MIUN", vcf.getSampleFormatRecord(1).getField(VcfHeaderUtils.FORMAT_FILTER)); + assertEquals("PASS", vcf.getSampleFormatRecord(2).getField(VcfHeaderUtils.FORMAT_FILTER)); + assertEquals("PASS", vcf.getSampleFormatRecord(3).getField(VcfHeaderUtils.FORMAT_FILTER)); + assertEquals("PASS", vcf.getSampleFormatRecord(4).getField(VcfHeaderUtils.FORMAT_FILTER)); + } + @Test public void realLifeFail3() { //GL000224.1 34563 . C T . . FLANK=TCTTTTTTTAA;BaseQRankSum=4.387;ClippingRankSum=-0.431;DP=512;FS=0.000;MQ=59.99;MQRankSum=-1.755;QD=2.17;ReadPosRankSum=1.855;SOR=0.676;IN=1,2;HOM=7,GCAATTCTTTtTTTAATGATC;EFF=upstream_gene_variant(MODIFIER||3648|||AL591856.4|miRNA|NON_CODING|ENST00000581903||1),intergenic_region(MODIFIER||||||||||1) GT:AD:CCC:CCM:DP:FT:GQ:INF:MR:NNS:OABS 0/0:.:Reference:13:240:PASS:.:.:.:.:C117[38.72]123[39.17] 0/1:.:Somatic:13:516:.:.:SOMATIC:64:60:C226[39.34]226[39.23];T33[40.76]31[40.16] 0/0:.:Reference:13:240:PASS:.:.:.:.:C117[38.72]123[39.17] 0/1:450,62:Somatic:13:512:.:99:SOMATIC:64:60:C226[39.34]226[39.23];T33[40.76]31[40.16]