diff --git a/src/main/java/org/molgenis/vcf/decisiontree/filter/VcfMetadata.java b/src/main/java/org/molgenis/vcf/decisiontree/filter/VcfMetadata.java index b9583a5..9b87610 100644 --- a/src/main/java/org/molgenis/vcf/decisiontree/filter/VcfMetadata.java +++ b/src/main/java/org/molgenis/vcf/decisiontree/filter/VcfMetadata.java @@ -217,7 +217,7 @@ private VCFCompoundHeaderLine getVcfCompoundHeaderLine(FieldType fieldType, Stri } public static boolean isSingleValueField(Field field) { - return field.getValueCount().getType() == Type.FIXED && field.getValueCount().getCount() == 1; + return field.getValueCount().getType() == Type.FIXED && field.getValueCount().getCount() <= 1; } public Map getSampleNameToOffset() { diff --git a/src/main/java/org/molgenis/vcf/decisiontree/filter/VcfRecord.java b/src/main/java/org/molgenis/vcf/decisiontree/filter/VcfRecord.java index a078dd8..d6e977e 100644 --- a/src/main/java/org/molgenis/vcf/decisiontree/filter/VcfRecord.java +++ b/src/main/java/org/molgenis/vcf/decisiontree/filter/VcfRecord.java @@ -353,7 +353,7 @@ private Object getInfoValue(Field field, Allele allele) { value = getInfoList(field); break; case FIXED: - value = valueCount.getCount() == 1 ? getInfo(field) : getInfoList(field); + value = valueCount.getCount() <= 1 ? getInfo(field) : getInfoList(field); break; default: throw new UnexpectedEnumException(valueCountType); diff --git a/src/test/java/org/molgenis/vcf/decisiontree/filter/VcfMetadataTest.java b/src/test/java/org/molgenis/vcf/decisiontree/filter/VcfMetadataTest.java index 50ebcf4..2ce3663 100644 --- a/src/test/java/org/molgenis/vcf/decisiontree/filter/VcfMetadataTest.java +++ b/src/test/java/org/molgenis/vcf/decisiontree/filter/VcfMetadataTest.java @@ -217,7 +217,7 @@ void getFieldInfoFlag() { VCFInfoHeaderLine vcfInfoHeaderLine = mock(VCFInfoHeaderLine.class); when(vcfInfoHeaderLine.getType()).thenReturn(VCFHeaderLineType.Flag); when(vcfInfoHeaderLine.getCountType()).thenReturn(VCFHeaderLineCount.INTEGER); - when(vcfInfoHeaderLine.getCount()).thenReturn(1); + when(vcfInfoHeaderLine.getCount()).thenReturn(0); when(vcfHeader.getInfoHeaderLine("my_field")).thenReturn(vcfInfoHeaderLine); String fieldId = "INFO/my_field"; assertEquals( @@ -225,7 +225,7 @@ void getFieldInfoFlag() { .id("my_field") .fieldType(FieldType.INFO) .valueType(ValueType.FLAG) - .valueCount(ValueCount.builder().type(Type.FIXED).count(1).build()) + .valueCount(ValueCount.builder().type(Type.FIXED).count(0).build()) .build(), vcfMetadata.getField(fieldId)); } diff --git a/src/test/java/org/molgenis/vcf/decisiontree/filter/VcfRecordTest.java b/src/test/java/org/molgenis/vcf/decisiontree/filter/VcfRecordTest.java index f0b723c..46a0dfd 100644 --- a/src/test/java/org/molgenis/vcf/decisiontree/filter/VcfRecordTest.java +++ b/src/test/java/org/molgenis/vcf/decisiontree/filter/VcfRecordTest.java @@ -3,10 +3,7 @@ import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.molgenis.vcf.utils.sample.model.Sex.MALE; @@ -259,6 +256,18 @@ void getValueInfoVariable() { assertEquals(asList(1, 2), vcfRecord.getValue(field, createAllele())); } + @Test + void getValueInfoFlag() { + FieldImpl field = + FieldImpl.builder() + .id("my_field") + .fieldType(FieldType.INFO) + .valueCount(ValueCount.builder().type(Type.FIXED).count(0).build()) + .valueType(ValueType.FLAG) + .build(); + Allele allele = createAllele(); + assertFalse((Boolean) vcfRecord.getValue(field, allele)); + } @Test void getValueInfoVariableFlag() { FieldImpl field = diff --git a/src/test/resources/example-classified.vcf b/src/test/resources/example-classified.vcf index c6bb12d..eaa282e 100644 --- a/src/test/resources/example-classified.vcf +++ b/src/test/resources/example-classified.vcf @@ -4,6 +4,7 @@ ##FORMAT= ##INFO= ##INFO= +##INFO= ##INFO= ##SnpEffCmd="SnpEff GRCh37.75 ../vip-decision-tree/src/CSQ/resources/test_annotated.vcf " ##SnpEffVersion="4.3t (build 2017-11-24 10:18), by Pablo Cingolani" @@ -45,5 +46,6 @@ 1 10042538 . C T . PASS CSQ=LP|T|missense_variant|MODERATE|NMNAT1|ENSG00000173614|Transcript|ENST00000377205|protein_coding|5/5||||763|619|207|R/W|Cgg/Tgg|rs142968179&CM127756|1||1||1|HGNC|17877|1|3.58e-05|0|2.891e-05|0|0|0|6.157e-05|0.0001629|0|pathogenic||1&1|26103963&22842229&22842230||0|0|0|0|LP,|T|NMD_transcript_variant|MODERATE|NMNAT1|ENSG00000173614|Transcript|ENST00000462686|nonsense_mediated_decay|5/6||||762|619|207|R/W|Cgg/Tgg|rs142968179&CM127756|1||1|||HGNC|17877|1|0.0001|0|0.0001|0|0|0|0.0001|0.0001629|0|pathogenic||1&1|26103963&22842229&22842230||0|0.43|0|0.41|LP 1 10042539 . C A,T . PASS CSQ=LP|A|missense_variant|MODERATE|NMNAT1|ENSG00000173614|Transcript|ENST00000377205|protein_coding|5/5||||763|619|207|R/W|Cgg/Tgg|rs142968179&CM127756|1||1||1|HGNC|17877|1|3.58e-05|0|2.891e-05|0|0|0|6.157e-05|0.0001629|0|pathogenic||1&1|26103963&22842229&22842230||0|0|0|0|LP,LB|T|missense_variant&NMD_transcript_variant|MODERATE|NMNAT1|ENSG00000173614|Transcript|ENST00000462686|nonsense_mediated_decay|5/6||||762|619|207|R/W|Cgg/Tgg|rs142968179&CM127756|2||2|||HGNC|17877|2|3.58e-05|0|2.891e-05|0|0|0|6.157e-05|0.0001629|0|pathogenic||1&1|26103963&22842229&22842230||0|0|0|0|LB 1 10042540 . C G . PASS CLINVAR=LP;CSQ=|||||||||||||||||||1||||||||||||||||||||||||||LP -1 10042541 . C G . PASS CSQ=|||||||||||||||||||1||||||||||||||||||||||||||VUS -1 10042542 . C G . . CSQ=|||||||||||||||||||1||||||||||||||||||||||||||VUS +1 10042541 . C G . PASS CSQ=|||||||||||||||||||1||||||||||||||||||||||||||LB +1 10042542 . C G . . CSQ=|||||||||||||||||||1||||||||||||||||||||||||||LB +1 10042543 . C G . PASS CSQ=|||||||||||||||||||1||||||||||||||||||||||||||LP;FLAG1 diff --git a/src/test/resources/example-classified_paths-labels.vcf b/src/test/resources/example-classified_paths-labels.vcf index 1ebc4ec..b085d05 100644 --- a/src/test/resources/example-classified_paths-labels.vcf +++ b/src/test/resources/example-classified_paths-labels.vcf @@ -4,6 +4,7 @@ ##FORMAT= ##INFO= ##INFO= +##INFO= ##INFO= ##SnpEffCmd="SnpEff GRCh37.75 ../vip-decision-tree/src/CSQ/resources/test_annotated.vcf " ##SnpEffVersion="4.3t (build 2017-11-24 10:18), by Pablo Cingolani" @@ -47,5 +48,6 @@ 1 10042538 . C T . PASS CSQ=LP|T|missense_variant|MODERATE|NMNAT1|ENSG00000173614|Transcript|ENST00000377205|protein_coding|5/5||||763|619|207|R/W|Cgg/Tgg|rs142968179&CM127756|1||1||1|HGNC|17877|1|3.58e-05|0|2.891e-05|0|0|0|6.157e-05|0.0001629|0|pathogenic||1&1|26103963&22842229&22842230||0|0|0|0|LP|filter&vkgl&exit_lp|,|T|NMD_transcript_variant|MODERATE|NMNAT1|ENSG00000173614|Transcript|ENST00000462686|nonsense_mediated_decay|5/6||||762|619|207|R/W|Cgg/Tgg|rs142968179&CM127756|1||1|||HGNC|17877|1|0.0001|0|0.0001|0|0|0|0.0001|0.0001629|0|pathogenic||1&1|26103963&22842229&22842230||0|0.43|0|0.41|LP|filter&vkgl&clinVar&gnomad&effect&spliceAI&exit_lp| 1 10042539 . C A,T . PASS CSQ=LP|A|missense_variant|MODERATE|NMNAT1|ENSG00000173614|Transcript|ENST00000377205|protein_coding|5/5||||763|619|207|R/W|Cgg/Tgg|rs142968179&CM127756|1||1||1|HGNC|17877|1|3.58e-05|0|2.891e-05|0|0|0|6.157e-05|0.0001629|0|pathogenic||1&1|26103963&22842229&22842230||0|0|0|0|LP|filter&vkgl&exit_lp|,LB|T|missense_variant&NMD_transcript_variant|MODERATE|NMNAT1|ENSG00000173614|Transcript|ENST00000462686|nonsense_mediated_decay|5/6||||762|619|207|R/W|Cgg/Tgg|rs142968179&CM127756|2||2|||HGNC|17877|2|3.58e-05|0|2.891e-05|0|0|0|6.157e-05|0.0001629|0|pathogenic||1&1|26103963&22842229&22842230||0|0|0|0|LB|filter&vkgl&exit_lb| 1 10042540 . C G . PASS CLINVAR=LP;CSQ=|||||||||||||||||||1||||||||||||||||||||||||||LP|filter&vkgl&clinVar&exit_lp| -1 10042541 . C G . PASS CSQ=|||||||||||||||||||1||||||||||||||||||||||||||VUS|filter&vkgl&clinVar&gnomad&effect&spliceAI&annotSV&impact&exit_vus| -1 10042542 . C G . . CSQ=|||||||||||||||||||1||||||||||||||||||||||||||VUS|filter&vkgl&clinVar&gnomad&effect&spliceAI&annotSV&impact&exit_vus| +1 10042541 . C G . PASS CSQ=|||||||||||||||||||1||||||||||||||||||||||||||LB|filter&vkgl&clinVar&gnomad&effect&spliceAI&annotSV&impact&flag&exit_lb| +1 10042542 . C G . . CSQ=|||||||||||||||||||1||||||||||||||||||||||||||LB|filter&vkgl&clinVar&gnomad&effect&spliceAI&annotSV&impact&flag&exit_lb| +1 10042543 . C G . PASS CSQ=|||||||||||||||||||1||||||||||||||||||||||||||LP|filter&vkgl&clinVar&gnomad&effect&spliceAI&annotSV&impact&flag&exit_lp|;FLAG1 diff --git a/src/test/resources/example.json b/src/test/resources/example.json index 7c118f6..1eafa6f 100644 --- a/src/test/resources/example.json +++ b/src/test/resources/example.json @@ -306,6 +306,24 @@ "nextNode": "exit_lp" } }, + "outcomeMissing": { + "nextNode": "flag" + } + }, + "flag": { + "type": "BOOL", + "description": "flag exists", + "query": { + "field": "INFO/FLAG1", + "operator": "==", + "value": true + }, + "outcomeTrue": { + "nextNode": "exit_lp" + }, + "outcomeFalse": { + "nextNode": "exit_lb" + }, "outcomeMissing": { "nextNode": "exit_vus" } diff --git a/src/test/resources/example.vcf b/src/test/resources/example.vcf index f5456bf..ebb4bde 100644 --- a/src/test/resources/example.vcf +++ b/src/test/resources/example.vcf @@ -27,6 +27,7 @@ ##FILTER= ##INFO= ##INFO= +##INFO= ##FORMAT= ##FORMAT= ##fileDate=20200320 @@ -44,3 +45,4 @@ 1 10042540 . C G . PASS CLINVAR=LP 1 10042541 . C G . PASS . 1 10042542 . C G . . . +1 10042543 . C G . PASS FLAG1