From e9e3653e90eaf4767459e2f36cf25c3c4b7905d7 Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Wed, 19 Jul 2023 17:43:27 +0100 Subject: [PATCH 01/17] Fix for INV pathogenicity score regression --- .../JannovarStructuralVariantAnnotator.java | 16 +++---- .../core/model/VariantEvaluation.java | 5 ++ ...annovarStructuralVariantAnnotatorTest.java | 47 +++++++++++++++++++ .../core/model/VariantEvaluationTest.java | 41 ++++++++-------- 4 files changed, 81 insertions(+), 28 deletions(-) diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/genome/JannovarStructuralVariantAnnotator.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/genome/JannovarStructuralVariantAnnotator.java index 231144e2f..9fbf7283b 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/genome/JannovarStructuralVariantAnnotator.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/genome/JannovarStructuralVariantAnnotator.java @@ -26,16 +26,12 @@ import de.charite.compbio.jannovar.data.JannovarData; import de.charite.compbio.jannovar.reference.GenomeInterval; import de.charite.compbio.jannovar.reference.SVGenomeVariant; -import de.charite.compbio.jannovar.reference.Strand; import de.charite.compbio.jannovar.reference.TranscriptModel; import org.monarchinitiative.exomiser.core.model.ChromosomalRegionIndex; import org.monarchinitiative.exomiser.core.model.RegulatoryFeature; import org.monarchinitiative.exomiser.core.model.TranscriptAnnotation; import org.monarchinitiative.exomiser.core.model.VariantAnnotation; -import org.monarchinitiative.svart.CoordinateSystem; -import org.monarchinitiative.svart.GenomicRegion; import org.monarchinitiative.svart.Variant; -import org.monarchinitiative.svart.VariantType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -113,6 +109,8 @@ private VariantAnnotation toStructuralVariantAnnotation(Variant variant, List CODING_SEQUENCE_VARIANT // This is a downstream, non-coding insertion so is probably uninteresting // [INSERTION, DOWNSTREAM_GENE_VARIANT, STRUCTURAL_VARIANT, CODING_TRANSCRIPT_VARIANT] -> DOWNSTREAM_GENE_VARIANT + // This is an inversion overlapping a coding transcript. Note that CODING_TRANSCRIPT_VARIANT is a MODIFIER impact + // [INVERSION, STRUCTURAL_VARIANT, CODING_TRANSCRIPT_VARIANT] -> CODING_TRANSCRIPT_VARIANT // TODO: This would be an ideal place to calculate a variantEffectScore (instead of in the VariantEffectPathogenicityScore) // based on the SvAnna scoring system https://genomemedicine.biomedcentral.com/articles/10.1186/s13073-022-01046-6/tables/1 VariantEffect highestImpactEffect = getHighestImpactEffect(highestImpactAnnotation); @@ -131,10 +129,12 @@ private VariantEffect getHighestImpactEffect(@Nullable SVAnnotation highestImpac } private static VariantEffect filterEffects(Set variantEffects) { - return variantEffects.stream() - .filter(vaEff -> !(vaEff == INSERTION || vaEff == INVERSION || vaEff == STRUCTURAL_VARIANT)) - .findFirst() - .orElse(DEFAULT_EFFECT); + for (VariantEffect varEff : variantEffects) { + if (!(varEff == INSERTION || varEff == INVERSION || varEff == STRUCTURAL_VARIANT)) { + return varEff; + } + } + return DEFAULT_EFFECT; } private List buildSvTranscriptAnnotations(List svAnnotations) { diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/VariantEvaluation.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/VariantEvaluation.java index 528549fb3..6b01e32a4 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/VariantEvaluation.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/VariantEvaluation.java @@ -376,6 +376,7 @@ public float getPathogenicityScore() { float predictedScore = pathogenicityData.getScore(); float variantEffectScore = VariantEffectPathogenicityScore.getPathogenicityScoreOf(variantEffect); if (this.isSymbolic()) { + System.out.println(variantEffect + ": " + variantEffectScore); // SvAnna scoring https://genomemedicine.biomedcentral.com/articles/10.1186/s13073-022-01046-6/tables/1 // | element contains v // class | v contains t | v overlaps t | Coding or splice | UTR | Intronic | Promoter @@ -395,6 +396,10 @@ public float getPathogenicityScore() { variantEffectScore = this.variantType().baseType() == VariantType.INS ? 0.2f : 0.8f; } else if (variantEffect.isSplicing()) { variantEffectScore = this.variantType().baseType() == VariantType.INS ? 0.9f : 1.0f; + } else if (variantEffect == VariantEffect.CODING_TRANSCRIPT_VARIANT) { + // TODO: the INV variant effect annotation needs better resolution for potential overlapping regions. + // Currently it is too basic and misses annotations such as START_LOSS or any of the splicing categories. + variantEffectScore = variantType().baseType() == VariantType.INV ? VariantEffectPathogenicityScore.INVERSION_SCORE : variantEffectScore; } // do not apply any scoring to INV as Jannovar uses this as a blanket annotation for any overlap of the // transcript, even if it only occurs in an intron or UTR, so we can't give this an outright score of 1. diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/JannovarStructuralVariantAnnotatorTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/JannovarStructuralVariantAnnotatorTest.java index fcbd22f9c..aaf2ec5f5 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/JannovarStructuralVariantAnnotatorTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/JannovarStructuralVariantAnnotatorTest.java @@ -28,6 +28,7 @@ import org.monarchinitiative.exomiser.core.genome.jannovar.JannovarDataSourceLoader; import org.monarchinitiative.exomiser.core.model.ChromosomalRegionIndex; import org.monarchinitiative.exomiser.core.model.VariantAnnotation; +import org.monarchinitiative.exomiser.core.model.VariantEvaluation; import org.monarchinitiative.svart.*; import org.monarchinitiative.svart.util.VariantTrimmer; @@ -115,6 +116,52 @@ public void exonicDeletion() { assertThat(variantAnnotation.getVariantEffect(), equalTo(VariantEffect.START_LOST)); } + @Test + public void wholeGeneInversion() { + // FGFR2 10:123237848-123357972 + Variant variant = variant(chr10, 123237800, 123358000, "T", "", 0); + List annotations = instance.annotate(variant); + System.out.println(annotations); + + assertThat(annotations.size(), equalTo(1)); + VariantAnnotation variantAnnotation = annotations.get(0); + assertThat(variantAnnotation.hasTranscriptAnnotations(), is(true)); + assertThat(variantAnnotation.getGeneId(), equalTo("2263")); + assertThat(variantAnnotation.getGeneSymbol(), equalTo("FGFR2")); + + assertThat(variantAnnotation.getVariantEffect(), equalTo(VariantEffect.CODING_TRANSCRIPT_VARIANT)); + } + + @Test + public void singleExonInversion() { + // FGFR2 10:123237848-123357972 + Variant variant = variant(chr10, 123357475, 123357972, "T", "", 0); + List annotations = instance.annotate(variant); + + assertThat(annotations.size(), equalTo(1)); + VariantAnnotation variantAnnotation = annotations.get(0); + assertThat(variantAnnotation.hasTranscriptAnnotations(), is(true)); + assertThat(variantAnnotation.getGeneId(), equalTo("2263")); + assertThat(variantAnnotation.getGeneSymbol(), equalTo("FGFR2")); + // this is an EXON_LOSS + assertThat(variantAnnotation.getVariantEffect(), equalTo(VariantEffect.CODING_TRANSCRIPT_VARIANT)); + } + + @Test + public void upstreamGeneInversion() { + // FGFR2 10:123237848-123357972 + Variant variant = variant(chr10, 123358000, 123359000, "T", "", 0); + List annotations = instance.annotate(variant); + + assertThat(annotations.size(), equalTo(1)); + VariantAnnotation variantAnnotation = annotations.get(0); + assertThat(variantAnnotation.hasTranscriptAnnotations(), is(true)); + assertThat(variantAnnotation.getGeneId(), equalTo("2263")); + assertThat(variantAnnotation.getGeneSymbol(), equalTo("FGFR2")); + + assertThat(variantAnnotation.getVariantEffect(), equalTo(VariantEffect.UPSTREAM_GENE_VARIANT)); + } + @Test void testBnd() { VariantContextConverter variantContextConverter = VariantContextConverter.of(GenomeAssembly.HG19.genomicAssembly(), VariantTrimmer.leftShiftingTrimmer(VariantTrimmer.retainingCommonBase())); diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/model/VariantEvaluationTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/model/VariantEvaluationTest.java index c373a8739..f3a518fbc 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/model/VariantEvaluationTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/model/VariantEvaluationTest.java @@ -449,20 +449,29 @@ public void testGetPathogenicityScoreMissensePredictedScoreLessThanDefault() { assertThat(instance.getPathogenicityScore(), equalTo(expected)); } + @Test + public void testGetFailedFilterTypes() { + Set expectedFilters = EnumSet.of(FAIL_FREQUENCY_RESULT.getFilterType()); + + instance.addFilterResult(FAIL_FREQUENCY_RESULT); + assertThat(instance.getFailedFilterTypes(), equalTo(expectedFilters)); + } + @ParameterizedTest @CsvSource({ - ", CODING_SEQUENCE_VARIANT, 0.2", - ", CODING_SEQUENCE_VARIANT, 0.2", - ", CODING_SEQUENCE_VARIANT, 0.8", // should be unreachable in production code - ", CODING_SEQUENCE_VARIANT, 0.8", - ", CODING_SEQUENCE_VARIANT, 0.8", - ", CODING_SEQUENCE_VARIANT, 0.8", - ", SPLICE_REGION_VARIANT, 0.9", - ", SPLICE_REGION_VARIANT, 0.9", - ", SPLICE_REGION_VARIANT, 1.0", // should be unreachable in production code - ", SPLICE_REGION_VARIANT, 1.0", - ", SPLICE_REGION_VARIANT, 1.0", - ", SPLICE_REGION_VARIANT, 1.0", + ", CODING_SEQUENCE_VARIANT, 0.2", + ", CODING_SEQUENCE_VARIANT, 0.2", + ", CODING_SEQUENCE_VARIANT, 0.8", // should be unreachable in production code + ", CODING_TRANSCRIPT_VARIANT, 0.6", + ", CODING_SEQUENCE_VARIANT, 0.8", + ", CODING_SEQUENCE_VARIANT, 0.8", + ", CODING_SEQUENCE_VARIANT, 0.8", + ", SPLICE_REGION_VARIANT, 0.9", + ", SPLICE_REGION_VARIANT, 0.9", + ", SPLICE_REGION_VARIANT, 1.0", // should be unreachable in production code + ", SPLICE_REGION_VARIANT, 1.0", + ", SPLICE_REGION_VARIANT, 1.0", + ", SPLICE_REGION_VARIANT, 1.0", }) void testSymbolicInsertionScores(String alt, VariantEffect variantEffect, float expected) { VariantEvaluation sv = newBuilder(2, 1, 1, "C", alt, alt.startsWith(" expectedFilters = EnumSet.of(FAIL_FREQUENCY_RESULT.getFilterType()); - - instance.addFilterResult(FAIL_FREQUENCY_RESULT); - assertThat(instance.getFailedFilterTypes(), equalTo(expectedFilters)); - } - @Test public void testGetFailedFilterTypesDontContainPassedFilterTypes() { Set expectedFilters = EnumSet.of(FAIL_FREQUENCY_RESULT.getFilterType()); From 37c5f7b951b8b0aca566f56b4d1bfad5265395de Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Mon, 21 Aug 2023 20:03:50 +0100 Subject: [PATCH 02/17] Change for #351, #373, #379 - update exomiser-phenotype-data to take annotations from phenotype.hpoa Update application.properties and ResourceConfigurationProperties to remove unused fields. Update DiseaseInheritanceCacheReader and DiseasePhenotypeReader to parse phenotype.hpoa file Update DiseaseResourceConfig to use hpoa resource --- .../config/DiseaseResourceConfig.java | 12 +- .../ResourceConfigurationProperties.java | 30 +- .../DiseaseInheritanceCacheReader.java | 20 +- .../disease/DiseasePhenotypeReader.java | 21 +- .../src/main/resources/application.properties | 19 +- .../DiseaseInheritanceCacheReaderTest.java | 11 +- .../disease/DiseasePhenotypeReaderTest.java | 6 +- .../OrphanetDiseaseGeneFactoryTest.java | 8 +- .../test/resources/data/phenotype_test.hpoa | 377 ++++++++++++++++++ 9 files changed, 431 insertions(+), 73 deletions(-) create mode 100644 exomiser-data-phenotype/src/test/resources/data/phenotype_test.hpoa diff --git a/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/config/DiseaseResourceConfig.java b/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/config/DiseaseResourceConfig.java index 0973c166f..28fdcda49 100644 --- a/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/config/DiseaseResourceConfig.java +++ b/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/config/DiseaseResourceConfig.java @@ -55,12 +55,10 @@ public DiseaseResourceConfig(ResourceConfigurationProperties resourceProperties, @Bean public DiseaseProcessingGroup diseaseProcessingGroup() { - Resource phenotypeAnnotationsResource = resourceBuilder.buildResource(resourceProperties.getPhenotypeAnnotations()); -// TODO: replace phenotype_annotations with hpo_annotations -// Resource hpoAnnotationsResource = resourceBuilder.buildResource(resourceProperties.getHpoAnnotations()); + Resource hpoAnnotationsResource = resourceBuilder.buildResource(resourceProperties.getHpoAnnotations()); OutputLineWriter diseasePhenotypeWriter = new OutputLineWriter<>(processPath.resolve("diseaseHp.pg")); - DiseasePhenotypeStep diseasePhenotypeStep = DiseasePhenotypeStep.create(phenotypeAnnotationsResource, diseasePhenotypeWriter); + DiseasePhenotypeStep diseasePhenotypeStep = DiseasePhenotypeStep.create(hpoAnnotationsResource, diseasePhenotypeWriter); // Resource geneMap2Resource = resourceBuilder.buildResource(resourceProperties.getGenemap2()); @@ -70,7 +68,7 @@ public DiseaseProcessingGroup diseaseProcessingGroup() { Resource product9Resource = resourceBuilder.buildResource(resourceProperties.getOrphaProduct9Ages()); OutputLineWriter diseaseGeneWriter = new OutputLineWriter<>(processPath.resolve("disease.pg")); - DiseaseGeneStep diseaseGeneStep = DiseaseGeneStep.create(phenotypeAnnotationsResource, geneMap2Resource, mimToGeneResource, product1Resource, product6Resource, product9Resource, diseaseGeneWriter); + DiseaseGeneStep diseaseGeneStep = DiseaseGeneStep.create(hpoAnnotationsResource, geneMap2Resource, mimToGeneResource, product1Resource, product6Resource, product9Resource, diseaseGeneWriter); // Output files for HPO annotations QC - open a ticket with these using the md file as the ticket body OutputLineWriter missingInHpoMoiWriter = new OutputLineWriter<>(processPath.resolve("missing_moi_hpo.md")); @@ -78,7 +76,7 @@ public DiseaseProcessingGroup diseaseProcessingGroup() { OutputLineWriter mismatchedMoiWriter = new OutputLineWriter<>(processPath.resolve("mismatched_moi.md")); DiseaseGeneMoiComparisonStep diseaseGeneMoiComparisonStep = DiseaseGeneMoiComparisonStep.create( - phenotypeAnnotationsResource, + hpoAnnotationsResource, geneMap2Resource, missingInHpoMoiWriter, missingInOmimMoiWriter, @@ -90,7 +88,7 @@ public DiseaseProcessingGroup diseaseProcessingGroup() { OutputLineWriter entrezGeneSymbolWriter = new OutputLineWriter<>(processPath.resolve("entrez2sym.pg")); EntrezIdGeneSymbolStep entrezIdGeneSymbolStep = EntrezIdGeneSymbolStep.create(hgncResource, entrezGeneSymbolWriter); - List diseaseResources = List.of(phenotypeAnnotationsResource, geneMap2Resource, mimToGeneResource, product1Resource, product6Resource, product9Resource, hgncResource); + List diseaseResources = List.of(hpoAnnotationsResource, geneMap2Resource, mimToGeneResource, product1Resource, product6Resource, product9Resource, hgncResource); return new DiseaseProcessingGroup(diseaseResources, diseasePhenotypeStep, diseaseGeneStep, diseaseGeneMoiComparisonStep, entrezIdGeneSymbolStep); } diff --git a/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/config/ResourceConfigurationProperties.java b/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/config/ResourceConfigurationProperties.java index c5e6bcdbe..5b22c472b 100644 --- a/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/config/ResourceConfigurationProperties.java +++ b/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/config/ResourceConfigurationProperties.java @@ -34,16 +34,10 @@ public class ResourceConfigurationProperties { private ResourceProperties mim2gene = ResourceProperties.ofRemote("https://omim.org/static/omim/data/", "mim2gene.txt"); @NestedConfigurationProperty - private ResourceProperties genemap2 = ResourceProperties.ofRemote("https://data.omim.org/downloads/x-9019zsQCqFYgYfIMar4g/", "genemap2.txt"); + private ResourceProperties genemap2 = ResourceProperties.ofRemote("https://data.omim.org/downloads/nLKYV3qGSpe-HOV8OfliKA/", "genemap2.txt"); @NestedConfigurationProperty - private ResourceProperties phenotypeAnnotations = ResourceProperties.ofRemote("http://compbio.charite.de/jenkins/job/hpo.annotations/lastStableBuild/artifact/misc/", "phenotype_annotation.tab"); - - @NestedConfigurationProperty - private ResourceProperties hpoAnnotations = ResourceProperties.ofRemote("http://compbio.charite.de/jenkins/job/hpo.annotations.current/lastSuccessfulBuild/artifact/current/", "phenotype.hpoa"); - - @NestedConfigurationProperty - private ResourceProperties genesToPhenotype = ResourceProperties.ofRemote("http://compbio.charite.de/jenkins/job/hpo.annotations/lastStableBuild/artifact/util/annotation/", "genes_to_phenotype.txt"); + private ResourceProperties hpoAnnotations = ResourceProperties.ofRemote("https://purl.obolibrary.org/obo/hp/hpoa/", "phenotype.hpoa"); @NestedConfigurationProperty private ResourceProperties orphaProduct1 = ResourceProperties.ofRemote("http://www.orphadata.org/data/xml/", "en_product1.xml"); @@ -64,7 +58,7 @@ public class ResourceConfigurationProperties { private ResourceProperties mgiGenePheno = ResourceProperties.ofRemote("http://www.informatics.jax.org/downloads/reports/", "MGI_GenePheno.rpt"); @NestedConfigurationProperty - private ResourceProperties impcAllGenotypePhenotype = ResourceProperties.ofRemote("ftp://ftp.ebi.ac.uk/pub/databases/impc/latest/csv/", "ALL_genotype_phenotype.csv.gz"); + private ResourceProperties impcAllGenotypePhenotype = ResourceProperties.ofRemote("http://ftp.ebi.ac.uk/pub/databases/impc/all-data-releases/latest/results/", "genotype-phenotype-assertions-ALL.csv.gz"); @NestedConfigurationProperty private ResourceProperties mgiMouseHumanOrthologs = ResourceProperties.ofRemote("http://www.informatics.jax.org/downloads/reports/", "HOM_MouseHumanSequence.rpt"); @@ -87,7 +81,7 @@ public class ResourceConfigurationProperties { * The HPO */ @NestedConfigurationProperty - private ResourceProperties hp = ResourceProperties.ofRemote("https://raw.githubusercontent.com/obophenotype/human-phenotype-ontology/master/", "hp.obo"); + private ResourceProperties hp = ResourceProperties.ofRemote("https://purl.obolibrary.org/obo/hp/", "hp.obo"); @NestedConfigurationProperty private ResourceProperties mp = ResourceProperties.ofRemote("https://github.com/obophenotype/mammalian-phenotype-ontology/releases/download/current/", "mp.obo"); @@ -121,14 +115,6 @@ public void setGenemap2(ResourceProperties genemap2) { this.genemap2 = genemap2; } - public ResourceProperties getPhenotypeAnnotations() { - return phenotypeAnnotations; - } - - public void setPhenotypeAnnotations(ResourceProperties phenotypeAnnotations) { - this.phenotypeAnnotations = phenotypeAnnotations; - } - public ResourceProperties getHpoAnnotations() { return hpoAnnotations; } @@ -137,14 +123,6 @@ public void setHpoAnnotations(ResourceProperties hpoAnnotations) { this.hpoAnnotations = hpoAnnotations; } - public ResourceProperties getGenesToPhenotype() { - return genesToPhenotype; - } - - public void setGenesToPhenotype(ResourceProperties genesToPhenotype) { - this.genesToPhenotype = genesToPhenotype; - } - public ResourceProperties getOrphaProduct1() { return orphaProduct1; } diff --git a/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseaseInheritanceCacheReader.java b/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseaseInheritanceCacheReader.java index 30821cb70..bd5f57572 100644 --- a/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseaseInheritanceCacheReader.java +++ b/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseaseInheritanceCacheReader.java @@ -68,37 +68,37 @@ public class DiseaseInheritanceCacheReader implements ResourceReader read() { - Path phenotypeAnnotationsPath = phenotypeAnnotationsResource.getResourcePath(); + Path phenotypeAnnotationsPath = hpoAnnotationsResource.getResourcePath(); logger.info("Reading resource {} ", phenotypeAnnotationsPath); //initialise this here to avoid the ability to get false negatives if //getInheritanceMode is called before the cache is initialised. //In which case a nullPointer will be thrown. - try (BufferedReader br = phenotypeAnnotationsResource.newBufferedReader()) { + try (BufferedReader br = hpoAnnotationsResource.newBufferedReader()) { // we're going to map each disease to all it's inheritance mode // from the HPO annotations in the file and store them in this intermediate map ListMultimap intermediateInheritanceMap = ArrayListMultimap.create(); //so let's parse... for (String line; (line = br.readLine()) != null; ) { - // #disease-db disease-identifier disease-name negation HPO-ID reference evidence-code onset frequencyHPO modifier sub-ontology alt-names curators frequencyRaw sex - if (line.startsWith("#")) { + // database_id disease_name qualifier hpo_id reference evidence onset frequency sex modifier aspect biocuration + if (line.startsWith("#") || line.startsWith("database_id")) { // comment line continue; } String[] fields = line.split("\t"); - if (fields[1].equals("OMIM") || fields[3].equals("NOT")) { + if (fields[2].equals("NOT")) { continue; } - String currentDiseaseId = fields[0] + ":" + fields[1].replace(" ", ""); - InheritanceMode currentInheritance = hpoInheritanceCodes.getOrDefault(fields[4], InheritanceMode.UNKNOWN); + String currentDiseaseId = fields[0];// + ":" + fields[1].replace(" ", ""); + InheritanceMode currentInheritance = hpoInheritanceCodes.getOrDefault(fields[3], InheritanceMode.UNKNOWN); // only add the known inheritance mode if (currentInheritance != InheritanceMode.UNKNOWN) { logger.debug("Adding {} {}", currentDiseaseId, currentInheritance); diff --git a/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseasePhenotypeReader.java b/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseasePhenotypeReader.java index a9a745b64..60787de6c 100644 --- a/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseasePhenotypeReader.java +++ b/exomiser-data-phenotype/src/main/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseasePhenotypeReader.java @@ -39,23 +39,26 @@ public class DiseasePhenotypeReader implements ResourceReader read() { Map> disease2PhenotypeMap = new LinkedHashMap<>(); - try (BufferedReader reader = hpoPhenotypeAnnotationsResource.newBufferedReader()) { + try (BufferedReader reader = hpoAnnotationsResource.newBufferedReader()) { String line; - // skip header - line = reader.readLine(); while ((line = reader.readLine()) != null) { + if (line.startsWith("#") || line.startsWith("database_id")) { + // comment line + // database_id disease_name qualifier hpo_id reference evidence onset frequency sex modifier aspect biocuration + continue; + } String[] fields = line.split("\\t"); - String diseaseId = fields[0] + ":" + fields[1]; - String hpId = fields[4]; + String diseaseId = fields[0]; + String hpId = fields[3]; if (disease2PhenotypeMap.containsKey(diseaseId)) { disease2PhenotypeMap.get(diseaseId).add(hpId); } else { @@ -65,7 +68,7 @@ public List read() { } } } catch (IOException ex) { - logger.error("Error reading file: {}", hpoPhenotypeAnnotationsResource.getResourcePath(), ex); + logger.error("Error reading file: {}", hpoAnnotationsResource.getResourcePath(), ex); } return disease2PhenotypeMap.entrySet() diff --git a/exomiser-data-phenotype/src/main/resources/application.properties b/exomiser-data-phenotype/src/main/resources/application.properties index 0ed0c9759..ff60d418e 100644 --- a/exomiser-data-phenotype/src/main/resources/application.properties +++ b/exomiser-data-phenotype/src/main/resources/application.properties @@ -71,22 +71,23 @@ spring.h2.console.enabled=true # OMIM phenotype.resource.mim2gene.url=https://omim.org/static/omim/data/ phenotype.resource.mim2gene.remote-file=mim2gene.txt -phenotype.resource.genemap2.url=https://data.omim.org/downloads/x-9019zsQCqFYgYfIMar4g/ +phenotype.resource.genemap2.url=https://data.omim.org/downloads/nLKYV3qGSpe-HOV8OfliKA/ phenotype.resource.genemap2.remote-file=genemap2.txt # HPO annotations -phenotype.resource.phenotype-annotations.url=http://compbio.charite.de/jenkins/job/hpo.annotations/lastStableBuild/artifact/misc/ -phenotype.resource.phenotype-annotations.remote-file=phenotype_annotation.tab +#phenotype.resource.phenotype-annotations.url=http://compbio.charite.de/jenkins/job/hpo.annotations/lastStableBuild/artifact/misc/ +#phenotype.resource.phenotype-annotations.remote-file=phenotype_annotation.tab # https://hpo.jax.org/app/download/annotation # new purls are: -# http://purl.obolibrary.org/obo/hp.obo -# http://purl.obolibrary.org/obo/hp/hpoa/phenotype.hpoa +# https://purl.obolibrary.org/obo/hp.obo +# https://purl.obolibrary.org/obo/hp/hpoa/phenotype.hpoa # phenotype.hpoa file is replacing the phenotype_annotation.tab file -phenotype.resource.hpo-annotations.url=http://compbio.charite.de/jenkins/job/hpo.annotations.current/lastSuccessfulBuild/artifact/current/ +phenotype.resource.hpo-annotations.url=https://purl.obolibrary.org/obo/hp/hpoa/ phenotype.resource.hpo-annotations.remote-file=phenotype.hpoa # Orphanet # The source of these is probably the http://www.orphadata.org/data/xml/en_product4.xml file -phenotype.resource.genes-to-phenotype.url=http://compbio.charite.de/jenkins/job/hpo.annotations/lastStableBuild/artifact/util/annotation/ -phenotype.resource.genes-to-phenotype.remote-file=genes_to_phenotype.txt +#phenotype.resource.genes-to-phenotype.url=http://compbio.charite.de/jenkins/job/hpo.annotations/lastStableBuild/artifact/util/annotation/ +#phenotype.resource.genes-to-phenotype.remote-file=genes_to_phenotype.txt + phenotype.resource.orpha-product1.url=http://www.orphadata.org/data/xml/ phenotype.resource.orpha-product1.remote-file=en_product1.xml @@ -136,7 +137,7 @@ phenotype.resource.zfin-fish-human-orthologs.remote-file=human_orthos.txt ## ONTOLOGIES # HP -phenotype.resource.hp.url=https://raw.githubusercontent.com/obophenotype/human-phenotype-ontology/master/ +phenotype.resource.hp.url=https://purl.obolibrary.org/obo/hp/ phenotype.resource.hp.remote-file=hp.obo # MP diff --git a/exomiser-data-phenotype/src/test/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseaseInheritanceCacheReaderTest.java b/exomiser-data-phenotype/src/test/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseaseInheritanceCacheReaderTest.java index a0ecd7043..22fa42b0c 100644 --- a/exomiser-data-phenotype/src/test/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseaseInheritanceCacheReaderTest.java +++ b/exomiser-data-phenotype/src/test/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseaseInheritanceCacheReaderTest.java @@ -45,7 +45,7 @@ public class DiseaseInheritanceCacheReaderTest { private final Map result; public DiseaseInheritanceCacheReaderTest() { - Resource testResource = Resource.of("src/test/resources/data/phenotype_annotation_test.tab"); + Resource testResource = Resource.of("src/test/resources/data/phenotype_test.hpoa"); DiseaseInheritanceCacheReader instance = new DiseaseInheritanceCacheReader(testResource); result = instance.read(); } @@ -63,7 +63,12 @@ public void testGetInheritanceCodeUnknownOrphanet() { */ @Test public void testGetInheritanceCodeBoth() { - assertThat(result.get("OMIM:100300"), equalTo(InheritanceMode.AUTOSOMAL_DOMINANT_AND_RECESSIVE)); + assertThat(result.get("OMIM:614669"), equalTo(InheritanceMode.AUTOSOMAL_DOMINANT_AND_RECESSIVE)); + } + + @Test + void testsXlinkedDominant() { + assertThat(result.get("OMIM:301050"), equalTo(InheritanceMode.X_DOMINANT)); } /** @@ -105,8 +110,6 @@ public void testIsEmptyFalse() { @Test void testDuplicatedNumericalIdentifier() { - assertThat(result.get("OMIM:100050"), equalTo(InheritanceMode.X_LINKED)); - assertThat(result.get("ORPHA:100050"), is(nullValue())); assertThat(result.get("OMIM:230800"), equalTo(InheritanceMode.AUTOSOMAL_RECESSIVE)); assertThat(result.get("ORPHA:230800"), is(nullValue())); } diff --git a/exomiser-data-phenotype/src/test/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseasePhenotypeReaderTest.java b/exomiser-data-phenotype/src/test/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseasePhenotypeReaderTest.java index 85a6c7e5a..22f37daaf 100644 --- a/exomiser-data-phenotype/src/test/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseasePhenotypeReaderTest.java +++ b/exomiser-data-phenotype/src/test/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/DiseasePhenotypeReaderTest.java @@ -38,18 +38,20 @@ class DiseasePhenotypeReaderTest { @Test void read() { - Resource phenotypeAnnotationResource = Resource.of("src/test/resources/data/phenotype_annotation_test.tab"); + Resource phenotypeAnnotationResource = Resource.of("src/test/resources/data/phenotype_test.hpoa"); DiseasePhenotypeReader instance = new DiseasePhenotypeReader(phenotypeAnnotationResource); List output = instance.read(); - DiseasePhenotype first = new DiseasePhenotype("DECIPHER:1", Set.of("HP:0001249", "HP:0001250", "HP:0001252", "HP:0001518")); + DiseasePhenotype first = new DiseasePhenotype("DECIPHER:1", Set.of("HP:0001249", "HP:0001250", "HP:0001252", "HP:0001518", "HP:0000252")); DiseasePhenotype last = new DiseasePhenotype("ORPHA:230800", Set.of("HP:0000508", "HP:0000651", + "HP:0001324", "HP:0002015", "HP:0002019", "HP:0002094", "HP:0002747", + "HP:0003470", "HP:0006597", "HP:0006824", "HP:0011499", diff --git a/exomiser-data-phenotype/src/test/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/OrphanetDiseaseGeneFactoryTest.java b/exomiser-data-phenotype/src/test/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/OrphanetDiseaseGeneFactoryTest.java index a8c705119..102275e60 100644 --- a/exomiser-data-phenotype/src/test/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/OrphanetDiseaseGeneFactoryTest.java +++ b/exomiser-data-phenotype/src/test/java/org/monarchinitiative/exomiser/data/phenotype/processors/readers/disease/OrphanetDiseaseGeneFactoryTest.java @@ -404,17 +404,13 @@ private Resource resource(Path fileDirectory, String filename) { @Test @Disabled("Integration test") void integrationTest() { - Path inDir = Paths.get("C:/Users/hhx640/Downloads/"); + Path inDir = Paths.get("/home/hhx640/Downloads/"); ReleaseFileSystem releaseFileSystem = new ReleaseFileSystem(inDir, "test"); ResourceBuilder resourceBuilder = new ResourceBuilder(releaseFileSystem); - // - ResourceConfigurationProperties resourceConfig = new ResourceConfigurationProperties(); - // parse all the ORPHANET data - resourceConfig.getPhenotypeAnnotations(); // OMIM resources - DiseaseInheritanceCacheReader diseaseInheritanceCacheReader = new DiseaseInheritanceCacheReader(resource(inDir, "phenotype_annotation.tab")); + DiseaseInheritanceCacheReader diseaseInheritanceCacheReader = new DiseaseInheritanceCacheReader(resource(inDir, "phenotype.hpoa")); OmimGeneMap2Reader omimGeneMap2Reader = new OmimGeneMap2Reader(diseaseInheritanceCacheReader, resource(inDir, "genemap2.txt")); diff --git a/exomiser-data-phenotype/src/test/resources/data/phenotype_test.hpoa b/exomiser-data-phenotype/src/test/resources/data/phenotype_test.hpoa new file mode 100644 index 000000000..2e2f31a62 --- /dev/null +++ b/exomiser-data-phenotype/src/test/resources/data/phenotype_test.hpoa @@ -0,0 +1,377 @@ +#description: "HPO annotations for rare diseases [8180: OMIM; 47: DECIPHER; 4242 ORPHANET]" +#version: 2023-07-21 +#tracker: https://github.com/obophenotype/human-phenotype-ontology/issues +#hpo-version: http://purl.obolibrary.org/obo/hp/releases/2023-07-21/hp.json +database_id disease_name qualifier hpo_id reference evidence onset frequency sex modifier aspect biocuration +DECIPHER:1 Wolf-Hirschhorn syndrome HP:0000252 DECIPHER:1 IEA PHPO:skoehler[2013-05-29] +DECIPHER:1 Wolf-Hirschhorn syndrome HP:0001250 DECIPHER:1 IEA PHPO:skoehler[2013-05-29] +DECIPHER:1 Wolf-Hirschhorn syndrome HP:0001518 DECIPHER:1 IEA PHPO:skoehler[2013-05-29] +DECIPHER:1 Wolf-Hirschhorn syndrome HP:0001252 DECIPHER:1 IEA PHPO:skoehler[2013-05-29] +DECIPHER:1 Wolf-Hirschhorn syndrome HP:0001249 DECIPHER:1 IEA PHPO:skoehler[2013-05-29] +OMIM:100100 Prune belly syndrome HP:0001562 OMIM:100100 IEA P HPO:iea[2009-02-17] +OMIM:100100 Prune belly syndrome HP:0001374 OMIM:100100 IEA P HPO:iea[2009-02-17] +OMIM:100100 Prune belly syndrome HP:0002023 OMIM:100100 IEA P HPO:iea[2009-02-17] +OMIM:100100 Prune belly syndrome HP:0010957 PMID:22077972 PCS 5/5 P HPO:skoehler[2012-10-09];HPO:probinson[2023-02-21] +OMIM:100100 Prune belly syndrome HP:0001762 OMIM:100100 IEA P HPO:iea[2009-02-17] +OMIM:100100 Prune belly syndrome HP:0000072 OMIM:100100 IEA P HPO:iea[2009-02-17] +OMIM:100100 Prune belly syndrome HP:0030211 PMID:22077972 PCS 6/6 P HPO:probinson[2023-02-21] +OMIM:100100 Prune belly syndrome HP:0005199 OMIM:100100 IEA P HPO:iea[2009-02-17] +OMIM:100100 Prune belly syndrome HP:0004392 PMID:22077972 PCS 2/5 P HPO:skoehler[2012-10-09];HPO:probinson[2023-02-21] +OMIM:100100 Prune belly syndrome HP:0000767 OMIM:100100 IEA P HPO:skoehler[2012-10-09] +OMIM:100100 Prune belly syndrome HP:0000217 PMID:22077972 PCS 6/6 P HPO:skoehler[2012-10-09];HPO:probinson[2023-02-21] +OMIM:100100 Prune belly syndrome HP:0000007 PMID:22077972 PCS I HPO:skoehler[2012-10-09];HPO:probinson[2023-02-21] +OMIM:100100 Prune belly syndrome HP:0000768 OMIM:100100 IEA P HPO:skoehler[2012-10-09] +OMIM:100100 Prune belly syndrome HP:0001643 OMIM:100100 IEA P HPO:iea[2009-02-17] +OMIM:100100 Prune belly syndrome HP:0000028 OMIM:100100 IEA P HPO:iea[2009-02-17] +OMIM:100100 Prune belly syndrome HP:0000126 OMIM:100100 IEA P HPO:iea[2009-02-17] +OMIM:100200 Abducens palsy HP:0000486 OMIM:100200 IEA P HPO:iea[2009-02-17] +OMIM:100200 Abducens palsy HP:0006897 OMIM:100200 IEA P HPO:iea[2009-02-17] +OMIM:100200 Abducens palsy HP:0000006 OMIM:100200 IEA I HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001650 PMID:9823488 PCS P HPO:probinson[2017-06-16] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001792 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001770 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001596 OMIM:100300 TAS P HPO:probinson[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001156 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001250 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001252 OMIM:100300 IEA P HPO:skoehler[2010-06-18] +OMIM:100300 Adams-Oliver syndrome 1 HP:0030011 OMIM:100300 TAS P HPO:probinson[2017-06-16] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001290 OMIM:100300 TAS P HPO:skoehler[2017-07-13] +OMIM:100300 Adams-Oliver syndrome 1 HP:0004383 PMID:9823488 PCS P HPO:probinson[2017-06-16] +OMIM:100300 Adams-Oliver syndrome 1 HP:0002084 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001629 OMIM:100300 IEA HP:0003577 P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0002539 OMIM:100300 IEA P HPO:skoehler[2010-06-18] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001647 PMID:9823488 PCS P HPO:probinson[2017-06-16] +OMIM:100300 Adams-Oliver syndrome 1 HP:0006970 OMIM:100300 IEA P HPO:skoehler[2010-06-20] +OMIM:100300 Adams-Oliver syndrome 1 HP:0002119 OMIM:100300 IEA P HPO:skoehler[2010-06-18] +OMIM:100300 Adams-Oliver syndrome 1 HP:0007589 OMIM:100300 IEA HP:0003577 P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001302 OMIM:100300 IEA P HPO:skoehler[2010-06-18] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001642 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0002558 OMIM:100300 TAS 20/20 P HPO:probinson[2017-06-16];HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001249 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0004415 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0000175 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0000252 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001762 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0002079 OMIM:100300 IEA P HPO:skoehler[2010-06-18] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001362 OMIM:100300 TAS HP:0003577 P HPO:probinson[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001263 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0002092 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0007590 PMID:1424238 PCS P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0000965 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0000822 OMIM:100300 IEA P HPO:skoehler[2018-10-08] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001636 PMID:9823488 PCS P HPO:probinson[2017-06-16] +OMIM:100300 Adams-Oliver syndrome 1 HP:0000568 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0000565 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0001631 OMIM:100300 IEA HP:0003577 P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0000204 OMIM:100300 IEA P HPO:iea[2009-02-17] +OMIM:100300 Adams-Oliver syndrome 1 HP:0002126 OMIM:100300 IEA P HPO:skoehler[2010-06-18] +OMIM:100300 Adams-Oliver syndrome 1 HP:0000006 PMID:9823488 PCS I HPO:iea[2009-02-17] +OMIM:100600 Acanthosis nigricans HP:0000956 OMIM:100600 IEA P HPO:iea[2009-02-17] +OMIM:100600 Acanthosis nigricans HP:0000006 OMIM:100600 IEA I HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001410 PMID:12910490 PCS 2/2 P HPO:iea[2009-02-17];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0002188 PMID:12910490 PCS 1/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0000365 OMIM:124000 TAS HP:0040283 P HPO:skoehler[2013-05-03] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0003355 PMID:12910490 PCS 1/2 P HPO:iea[2009-02-17];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001970 OMIM:124000 TAS P HPO:skoehler[2013-05-03] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0003231 PMID:12910490 PCS 1/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001250 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0003155 PMID:12910490 PCS 1/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001252 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001251 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001290 OMIM:124000 TAS P HPO:skoehler[2017-07-13] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0003074 PMID:12910490 PCS 1/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0000518 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0000716 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0000712 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001405 PMID:12910490 PCS 2/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001324 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0000510 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001249 OMIM:124000 IEA P HPO:skoehler[2010-06-18] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0006558 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0003546 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0002353 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0003200 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0003201 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0011924 PMID:12910490 PCS 2/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001263 PMID:12910490 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0002151 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0030948 PMID:12910490 PCS 1/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0000007 PMID:12910490 PCS I HPO:iea[2009-02-17];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0030151 OMIM:124000 TAS P HPO:skoehler[2015-01-04] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001257 OMIM:124000 TAS P HPO:skoehler[2013-05-03] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001414 PMID:12910490 PCS 2/2 P HPO:iea[2009-02-17];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0006789 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001397 PMID:12910490 PCS 1/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001396 PMID:12910490 PCS 1/2 P HPO:iea[2009-02-17];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0003577 PMID:12910490 PCS 2/2 C HPO:probinson[2022-11-09];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001272 PMID:12910490 PCS 1/2 P HPO:iea[2009-02-17];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0032653 PMID:12910490 PCS 2/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001508 PMID:12910490 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0000738 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001427 OMIM:124000 IEA I HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001988 PMID:12910490 PCS 2/2 P HPO:probinson[2022-11-09];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0008872 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001943 PMID:12910490 PCS 2/2 P HPO:iea[2009-02-17];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0003648 PMID:12910490 PCS 1/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0002910 PMID:12910490 PCS 2/2 P HPO:iea[2009-02-17];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001942 PMID:12910490 PCS 2/2 P HPO:iea[2009-02-17];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001347 OMIM:124000 TAS P HPO:skoehler[2013-05-03] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0003128 PMID:12910490 PCS 2/2 P HPO:iea[2009-02-17];HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0008936 PMID:12910490 PCS 1/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0002059 OMIM:124000 TAS P HPO:skoehler[2012-10-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0002299 OMIM:124000 TAS P HPO:skoehler[2012-10-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0002171 PMID:12910490 PCS 1/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0001639 OMIM:124000 IEA P HPO:iea[2009-02-17] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0000508 PMID:12910490 PCS 1/2 P HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0003811 PMID:12910490 PCS 1/2 C HPO:probinson[2022-11-09] +OMIM:124000 Mitochondrial complex III deficiency, nuclear type 1 HP:0004900 PMID:12910490 PCS 1/2 P HPO:probinson[2022-11-09] +ORPHA:36237 Bullous impetigo HP:0003095 ORPHA:36237 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:36237 Bullous impetigo HP:0005406 ORPHA:36237 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:36237 Bullous impetigo HP:0008066 ORPHA:36237 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:36237 Bullous impetigo HP:0010783 ORPHA:36237 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:36237 Bullous impetigo HP:0100763 ORPHA:36237 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:36237 Bullous impetigo HP:0100806 ORPHA:36237 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:36237 Bullous impetigo HP:0100820 ORPHA:36237 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:36237 Bullous impetigo HP:0200039 ORPHA:36237 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0000365 PMID:1531167 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0001252 PMID:1531167 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0001251 PMID:1531167 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0002240 PMID:1531167 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0000580 PMID:1531167 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0003593 PMID:1531167 PCS 2/2 C HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0100651 PMID:1531167 PCS 1/1 P HPO:skoehler[2012-10-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0000939 PMID:1531167 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0001508 PMID:1531167 PCS 2/2 P HPO:probinson[2012-03-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0000618 PMID:1531167 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0001944 PMID:1531167 PCS 2/2 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0001427 PMID:1531167 PCS I HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0000114 PMID:1531167 PCS 2/2 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0000597 PMID:1531167 PCS P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0002014 PMID:1531167 PCS 2/2 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0000550 PMID:1531167 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0002376 PMID:1531167 PCS 1/1 P HPO:probinson[2012-03-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0002013 PMID:1531167 PCS 1/2 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0011421 PMID:1531167 PCS 1/2 C HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0003819 PMID:1531167 PCS 1/2 C HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0000508 PMID:1531167 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0002748 PMID:1531167 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0007511 PMID:1531167 PCS 2/2 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0000103 PMID:1531167 PCS 2/2 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:560000 Renal tubulopathy, diabetes mellitus, and cerebellar ataxia HP:0001336 PMID:1531167 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2022-09-25] +OMIM:305400 Aarskog-Scott syndrome HP:0001256 PMID:20082460 PCS HP:0040284 P HP:probinson[2018-09-23];HP:probinson[2019-01-03] +OMIM:305400 Aarskog-Scott syndrome HP:0001773 OMIM:305400 TAS P HPO:probinson[2013-04-08] +OMIM:305400 Aarskog-Scott syndrome HP:0000486 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0003311 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0004322 PMID:20082460 PCS 11/11 P HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0003196 PMID:20082460 PCS 11/11 P HPO:iea[2009-02-17];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0032277 PMID:8076412 PCS 3/5 P HP:probinson[2019-02-12] +OMIM:305400 Aarskog-Scott syndrome HP:0000316 PMID:20082460;PMID:34189097 PCS 11/12 P HPO:probinson[2021-07-05];HPO:iea[2009-02-17];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0000954 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0009466 OMIM:305400 IEA P HPO:iea[2009-02-17];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0001769 OMIM:305400 TAS P HPO:probinson[2013-04-08] +OMIM:305400 Aarskog-Scott syndrome HP:0001169 PMID:20082460 PCS 11/11 P HPO:probinson[2013-04-07];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0001763 PMID:34189097 PCS 1/1 P HPO:probinson[2021-07-05] +OMIM:305400 Aarskog-Scott syndrome HP:0000311 PMID:34189097 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2021-07-05] +OMIM:305400 Aarskog-Scott syndrome HP:0009748 OMIM:305400 IEA P HPO:iea[2009-02-17];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0003502 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0000175 OMIM:305400 IEA HP:0003577 P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0000494 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0001187 PMID:34189097 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2021-07-05] +OMIM:305400 Aarskog-Scott syndrome HP:0001388 PMID:34189097 PCS 1/1 P HPO:probinson[2021-07-05] +OMIM:305400 Aarskog-Scott syndrome HP:0011969 PMID:34189097 PCS 1/1 P HPO:probinson[2021-07-05] +OMIM:305400 Aarskog-Scott syndrome HP:0001263 PMID:20082460 PCS 5/11 P HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0012774 OMIM:305400 TAS P HPO:skoehler[2014-04-13] +OMIM:305400 Aarskog-Scott syndrome HP:0001419 OMIM:305400 IEA I HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0000327 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0000767 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0003318 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0008689 PMID:34189097 PCS 1/1 P HPO:probinson[2021-07-05] +OMIM:305400 Aarskog-Scott syndrome HP:0000289 OMIM:305400 IEA 11/11 P HPO:iea[2009-02-17];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0000204 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0000049 PMID:20082460;PMID:34189097 PCS HP:0003577 11/12 P HPO:probinson[2021-07-05];HPO:iea[2009-02-17];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0000463 PMID:20082460 PCS 11/11 P HPO:iea[2009-02-17];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0001156 PMID:34189097 PCS 1/1 P HPO:iea[2009-02-17];HPO:probinson[2021-07-05] +OMIM:305400 Aarskog-Scott syndrome NOT HP:0000144 OMIM:305400 TAS P HPO:skoehler[2014-11-27] +OMIM:305400 Aarskog-Scott syndrome HP:0000540 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0000023 OMIM:305400 IEA 11/11 P HPO:iea[2009-02-17];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0001508 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0008232 PMID:34189097 PCS 1/1 P HPO:probinson[2021-07-05] +OMIM:305400 Aarskog-Scott syndrome HP:0030084 OMIM:305400 TAS P HPO:skoehler[2014-09-21];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0001544 PMID:8076412 PCS 2/5 P HPO:iea[2009-02-17];HP:probinson[2019-02-12] +OMIM:305400 Aarskog-Scott syndrome HP:0002650 OMIM:305400 IEA P HPO:iea[2009-02-17];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0004279 PMID:20082460 PCS 11/11 P HPO:probinson[2013-04-07];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0000431 PMID:34189097 IEA 1/1 P HPO:iea[2009-02-17];HPO:probinson[2021-07-05] +OMIM:305400 Aarskog-Scott syndrome HP:0002055 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0000470 OMIM:305400 TAS 11/11 P HPO:probinson[2009-02-17];HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0040171 PMID:34189097 PCS 1/1 P HPO:probinson[2021-07-05] +OMIM:305400 Aarskog-Scott syndrome HP:0000508 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0000668 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0000349 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0000029 PMID:34189097 PCS 1/1 P HPO:probinson[2021-07-05] +OMIM:305400 Aarskog-Scott syndrome HP:0000823 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0009237 PMID:20082460 PCS 8/11 P HP:probinson[2018-09-23] +OMIM:305400 Aarskog-Scott syndrome HP:0001159 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0007018 OMIM:305400 IEA P HPO:iea[2009-02-17] +OMIM:305400 Aarskog-Scott syndrome HP:0000028 OMIM:305400 IEA HP:0003577 P HPO:iea[2009-02-17] +ORPHA:915 Aarskog-Scott syndrome HP:0000049 ORPHA:915 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000232 ORPHA:915 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000316 ORPHA:915 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0001169 ORPHA:915 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0001537 ORPHA:915 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0001769 ORPHA:915 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0001773 ORPHA:915 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0004279 ORPHA:915 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0004322 ORPHA:915 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0100490 ORPHA:915 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0200055 ORPHA:915 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000023 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000028 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000337 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000343 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000368 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000431 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000463 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000494 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000508 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000974 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0004209 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0005692 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0006101 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0008572 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0009890 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0100543 ORPHA:915 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000164 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000175 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000202 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000204 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000286 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000311 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000327 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000470 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000485 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000486 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000684 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000708 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000767 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0000954 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0001635 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0001763 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0001883 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0002816 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0003319 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0005640 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0007018 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:915 Aarskog-Scott syndrome HP:0030680 ORPHA:915 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0000282 ORPHA:100050 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0001025 ORPHA:100050 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0001939 ORPHA:100050 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0002027 ORPHA:100050 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0003401 ORPHA:100050 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0005225 ORPHA:100050 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0007514 ORPHA:100050 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0011971 ORPHA:100050 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0012027 ORPHA:100050 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0012252 ORPHA:100050 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0025349 ORPHA:100050 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0040315 ORPHA:100050 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0002013 ORPHA:100050 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0002014 ORPHA:100050 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0002015 ORPHA:100050 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0002018 ORPHA:100050 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0002094 ORPHA:100050 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0100755 ORPHA:100050 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0000172 ORPHA:100050 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0001609 ORPHA:100050 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0002098 ORPHA:100050 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0002615 ORPHA:100050 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0005348 ORPHA:100050 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0005483 ORPHA:100050 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0011855 ORPHA:100050 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +ORPHA:100050 Hereditary angioedema type 1 HP:0100736 ORPHA:100050 TAS HP:0040283 P ORPHA:orphadata[2023-07-21] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000365 PMID:16114046 PCS 4/19 P HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000160 PMID:16114046 PCS 14/27 P HPO:skoehler[2012-11-18];HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0025267 OMIM:614669 TAS P HPO:skoehler[2017-07-13] +OMIM:614669 Auriculocondylar syndrome 2 HP:0001252 PMID:16114046 PCS 2/11 P HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000162 PMID:16114046 PCS 5/11 P HPO:skoehler[2012-11-18];HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0009088 OMIM:614669 TAS P HPO:skoehler[2012-10-17] +OMIM:614669 Auriculocondylar syndrome 2 HP:0011342 PMID:16114046 PCS 3/13 P HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000678 OMIM:614669 TAS P HPO:skoehler[2012-10-17] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000256 PMID:16114046 PCS 3/12 P HPO:skoehler[2012-11-18];HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000311 PMID:16114046 PCS P HPO:skoehler[2012-10-17];HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000358 PMID:16114046 PCS 2/20 P HPO:skoehler[2012-10-17];HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0008537 OMIM:614669 TAS P HPO:skoehler[2012-10-17] +OMIM:614669 Auriculocondylar syndrome 2 HP:0008559 OMIM:614669 TAS P HPO:skoehler[2012-10-17] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000175 OMIM:614669 TAS P HPO:skoehler[2012-10-17] +OMIM:614669 Auriculocondylar syndrome 2 HP:0007627 OMIM:614669 TAS P HPO:skoehler[2012-10-17] +OMIM:614669 Auriculocondylar syndrome 2 HP:0007628 OMIM:614669 TAS P HPO:skoehler[2012-10-17] +OMIM:614669 Auriculocondylar syndrome 2 HP:0004453 PMID:16114046 PCS P HPO:skoehler[2012-10-17];HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0002098 PMID:16114046 PCS 8/22 P HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0011968 PMID:16114046 PCS 4/19 P HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000171 PMID:16114046 PCS 2/11 P HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0012478 PMID:16114046 PCS 1/20 P HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000508 PMID:16114046 PCS 3/11 P HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000007 OMIM:614669 TAS I HPO:skoehler[2013-10-06] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000689 OMIM:614669 TAS P HPO:skoehler[2012-10-17] +OMIM:614669 Auriculocondylar syndrome 2 HP:0003778 OMIM:614669 TAS P HPO:skoehler[2012-10-17] +OMIM:614669 Auriculocondylar syndrome 2 HP:0002104 OMIM:614669 TAS P HPO:skoehler[2012-10-17] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000006 OMIM:614669 TAS I HPO:skoehler[2012-10-17] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000369 PMID:16114046 PCS 2/20 P HPO:skoehler[2012-10-17];HPO:probinson[2023-01-30] +OMIM:614669 Auriculocondylar syndrome 2 HP:0000347 PMID:16114046 PCS 22/31 P HPO:skoehler[2012-10-17];HPO:probinson[2023-01-30] +OMIM:301050 Alport syndrome, X-linked HP:0003774 OMIM:301050 TAS P HPO:skoehler[2012-11-26] +OMIM:301050 Alport syndrome, X-linked HP:0003676 OMIM:301050 TAS C HPO:skoehler[2012-10-17] +OMIM:301050 Alport syndrome, X-linked HP:0000123 OMIM:301050 IEA P HPO:skoehler[2010-06-20] +OMIM:301050 Alport syndrome, X-linked HP:0000100 OMIM:301050 TAS P HPO:skoehler[2012-10-17] +OMIM:301050 Alport syndrome, X-linked HP:0000083 OMIM:301050 IEA P HPO:iea[2009-02-17] +OMIM:301050 Alport syndrome, X-linked HP:0001142 OMIM:301050 IEA P HPO:iea[2009-02-17] +OMIM:301050 Alport syndrome, X-linked HP:0030034 OMIM:301050 TAS P HPO:skoehler[2014-09-21] +OMIM:301050 Alport syndrome, X-linked HP:0011501 OMIM:301050 TAS P HPO:skoehler[2012-10-17] +OMIM:301050 Alport syndrome, X-linked HP:0000093 OMIM:301050 IEA P HPO:iea[2009-02-17] +OMIM:301050 Alport syndrome, X-linked HP:0000829 OMIM:301050 IEA P HPO:iea[2009-02-17] +OMIM:301050 Alport syndrome, X-linked HP:0008064 OMIM:301050 IEA P HPO:iea[2009-02-17] +OMIM:301050 Alport syndrome, X-linked HP:0000407 OMIM:301050 IEA P HPO:iea[2009-02-17] +OMIM:301050 Alport syndrome, X-linked HP:0002907 OMIM:301050 IEA P HPO:iea[2009-02-17] +OMIM:301050 Alport syndrome, X-linked HP:0000519 OMIM:301050 IEA P HPO:iea[2009-02-17] +OMIM:301050 Alport syndrome, X-linked HP:0000822 OMIM:301050 IEA P HPO:iea[2009-02-17] +OMIM:301050 Alport syndrome, X-linked HP:0001417 OMIM:301050 IEA I HPO:iea[2009-02-17] +OMIM:301050 Alport syndrome, X-linked HP:0001423 OMIM:301050 TAS I HPO:skoehler[2013-05-29] +OMIM:301050 Alport syndrome, X-linked HP:0001873 OMIM:301050 IEA P HPO:iea[2009-02-17] +OMIM:301050 Alport syndrome, X-linked HP:0200020 OMIM:301050 TAS P HPO:skoehler[2012-10-17] +OMIM:301050 Alport syndrome, X-linked HP:0000545 OMIM:301050 TAS P HPO:skoehler[2012-10-17] +OMIM:301050 Alport syndrome, X-linked HP:0006756 OMIM:301050 IEA P HPO:iea[2009-02-17] +OMIM:301050 Alport syndrome, X-linked HP:0004722 OMIM:301050 TAS P HPO:skoehler[2015-12-30] +OMIM:230800 Gaucher disease, type I HP:0002113 OMIM:230800 TAS HP:0040283 P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0001650 PMID:34072542 PCS 1/69 P HPO:probinson[2021-07-01] +OMIM:230800 Gaucher disease, type I HP:0002653 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0001971 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0002240 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0010885 OMIM:230800 TAS P HPO:skoehler[2012-10-17] +OMIM:230800 Gaucher disease, type I HP:0002094 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0002092 PMID:34072542 PCS 9/69 P HPO:iea[2009-02-17];HPO:probinson[2021-07-01] +OMIM:230800 Gaucher disease, type I HP:0001903 OMIM:230800 TAS P HPO:skoehler[2012-10-17] +OMIM:230800 Gaucher disease, type I HP:0000822 OMIM:230800 IEA P HPO:skoehler[2018-10-08] +OMIM:230800 Gaucher disease, type I HP:0006530 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0000007 PMID:3353383 PCS I HPO:iea[2009-02-17];HPO:probinson[2021-07-01] +OMIM:230800 Gaucher disease, type I HP:0000953 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0007401 OMIM:230800 TAS P HPO:skoehler[2015-07-26] +OMIM:230800 Gaucher disease, type I HP:0006775 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0002953 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0000421 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0002756 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0001873 OMIM:230800 TAS P HPO:skoehler[2012-10-17] +OMIM:230800 Gaucher disease, type I HP:0001653 PMID:34072542 PCS 33/69 P HPO:probinson[2021-07-01] +OMIM:230800 Gaucher disease, type I HP:0001876 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0001744 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0000478 OMIM:230800 IEA P HPO:iea[2009-02-17] +OMIM:230800 Gaucher disease, type I HP:0004975 OMIM:230800 IEA P HPO:iea[2009-02-17] +ORPHA:230800 Toxin-mediated infectious botulism HP:0000508 ORPHA:230800 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:230800 Toxin-mediated infectious botulism HP:0000651 ORPHA:230800 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:230800 Toxin-mediated infectious botulism HP:0001324 ORPHA:230800 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:230800 Toxin-mediated infectious botulism HP:0002015 ORPHA:230800 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:230800 Toxin-mediated infectious botulism HP:0002019 ORPHA:230800 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:230800 Toxin-mediated infectious botulism HP:0002094 ORPHA:230800 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:230800 Toxin-mediated infectious botulism HP:0002747 ORPHA:230800 TAS HP:0040282 P ORPHA:orphadata[2023-07-21] +ORPHA:230800 Toxin-mediated infectious botulism HP:0003470 ORPHA:230800 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:230800 Toxin-mediated infectious botulism HP:0006597 ORPHA:230800 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:230800 Toxin-mediated infectious botulism HP:0006824 ORPHA:230800 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:230800 Toxin-mediated infectious botulism HP:0011499 ORPHA:230800 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] +ORPHA:230800 Toxin-mediated infectious botulism HP:0100021 ORPHA:230800 TAS HP:0040281 P ORPHA:orphadata[2023-07-21] \ No newline at end of file From 2cda8f513f0d0c5e5496165fb4452aa45f9ed325 Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Wed, 6 Sep 2023 18:40:31 +0100 Subject: [PATCH 03/17] Change for issue #502 - downgrade PM2 - PM2_Supporting for variants lacking frequency information. Update Acgs2020Classifier and Acmg2015Classifier to allow for PVS1 and PM2_Supporting are sufficient to trigger LIKELY_PATHOGENIC Change for issue #514 update AcmgEvidence to fit a Bayesian points-based system Add new Acmg2020PointsBasedClassifier to classify AcmgEvidence based on points --- .../core/analysis/util/PvalueGeneScorer.java | 15 +- .../analysis/util/RawScoreGeneScorer.java | 2 +- .../util/acmg/Acgs2020Classifier.java | 3 + .../util/acmg/Acmg2015Classifier.java | 2 +- .../util/acmg/Acmg2015EvidenceAssigner.java | 32 ++- .../acmg/Acmg2020PointsBasedClassifier.java | 58 ++++++ .../core/analysis/util/acmg/AcmgEvidence.java | 61 ++++++ .../util/acmg/Acgs2020ClassifierTest.java | 3 +- .../util/acmg/Acmg2015ClassifierTest.java | 3 +- .../acmg/Acmg2015EvidenceAssignerTest.java | 7 +- .../Acmg2020PointsBasedClassifierTest.java | 189 ++++++++++++++++++ .../acmg/AcmgAssignmentCalculatorTest.java | 5 +- .../analysis/util/acmg/AcmgEvidenceTest.java | 45 +++++ 13 files changed, 390 insertions(+), 35 deletions(-) create mode 100644 exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifier.java create mode 100644 exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifierTest.java diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/PvalueGeneScorer.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/PvalueGeneScorer.java index e0e1866ca..1db2d0e50 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/PvalueGeneScorer.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/PvalueGeneScorer.java @@ -44,7 +44,7 @@ public PvalueGeneScorer(String probandId, Pedigree.Individual.Sex probandSex, In this.genePriorityScoreCalculator = new GenePriorityScoreCalculator(); this.pValueCalculator = Objects.requireNonNull(pValueCalculator); AcmgEvidenceAssigner acmgEvidenceAssigner = new Acmg2015EvidenceAssigner(probandId, inheritanceModeAnnotator.getPedigree()); - AcmgEvidenceClassifier acmgEvidenceClassifier = new Acgs2020Classifier(); + AcmgEvidenceClassifier acmgEvidenceClassifier = new Acmg2020PointsBasedClassifier(); this.acmgAssignmentCalculator = new AcmgAssignmentCalculator(acmgEvidenceAssigner, acmgEvidenceClassifier); } @@ -101,6 +101,15 @@ private GeneScore calculateGeneScore(Gene gene, ModeOfInheritance modeOfInherita GenePriorityScoreCalculator.GenePriorityScore priorityScore = genePriorityScoreCalculator.calculateGenePriorityScore(gene, modeOfInheritance); + List> compatibleDiseaseMatches = priorityScore.getCompatibleDiseaseMatches(); + + List acmgAssignments = acmgAssignmentCalculator.calculateAcmgAssignments(modeOfInheritance, gene, contributingVariants, compatibleDiseaseMatches); + +// double variantScore = acmgAssignments.stream() +// .mapToDouble(acmgAssignment -> acmgAssignment.acmgEvidence().postProbPath()) +// .average() +// .orElse(0.1); // 0.1 is the equivalent of a 0-point VUS + double variantScore = contributingVariants.stream() .mapToDouble(VariantEvaluation::getVariantScore) .average() @@ -110,10 +119,6 @@ private GeneScore calculateGeneScore(Gene gene, ModeOfInheritance modeOfInherita double pValue = pValueCalculator.calculatePvalueFromCombinedScore(combinedScore); - List> compatibleDiseaseMatches = priorityScore.getCompatibleDiseaseMatches(); - - List acmgAssignments = acmgAssignmentCalculator.calculateAcmgAssignments(modeOfInheritance, gene, contributingVariants, compatibleDiseaseMatches); - return GeneScore.builder() .geneIdentifier(gene.getGeneIdentifier()) .modeOfInheritance(modeOfInheritance) diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/RawScoreGeneScorer.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/RawScoreGeneScorer.java index e4f1e8abe..e9ad03353 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/RawScoreGeneScorer.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/RawScoreGeneScorer.java @@ -70,7 +70,7 @@ public RawScoreGeneScorer(String probandId, Sex probandSex, InheritanceModeAnnot this.contributingAlleleCalculator = new ContributingAlleleCalculator(probandId, probandSex, inheritanceModeAnnotator); this.genePriorityScoreCalculator = new GenePriorityScoreCalculator(); AcmgEvidenceAssigner acmgEvidenceAssigner = new Acmg2015EvidenceAssigner(probandId, inheritanceModeAnnotator.getPedigree()); - AcmgEvidenceClassifier acmgEvidenceClassifier = new Acgs2020Classifier(); + AcmgEvidenceClassifier acmgEvidenceClassifier = new Acmg2020PointsBasedClassifier(); this.acmgAssignmentCalculator = new AcmgAssignmentCalculator(acmgEvidenceAssigner, acmgEvidenceClassifier); } diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acgs2020Classifier.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acgs2020Classifier.java index 7c7746632..dbd1f1c8b 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acgs2020Classifier.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acgs2020Classifier.java @@ -78,6 +78,9 @@ private static boolean isPathogenic(int pvs, int ps, int pm, int pp) { } private static boolean isLikelyPathogenic(int pvs, int ps, int pm, int pp) { + if (pvs == 1 && pp == 1) { + return true; + } if (ps >= 2) { return true; } diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015Classifier.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015Classifier.java index 29671b8ea..c521839cd 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015Classifier.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015Classifier.java @@ -78,7 +78,7 @@ private static boolean isPathogenic(int pvs, int ps, int pm, int pp) { } private static boolean isLikelyPathogenic(int pvs, int ps, int pm, int pp) { - if (pvs == 1 && pm == 1) { + if (pvs == 1 && (pm == 1 || pp == 1)) { return true; } if (ps == 1 && (pm == 1 || pm == 2) || ps == 1 && pp >= 2) { diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssigner.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssigner.java index 15f32e46e..ee1dd23aa 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssigner.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssigner.java @@ -80,12 +80,18 @@ public Acmg2015EvidenceAssigner(String probandId, Pedigree pedigree) { */ // https://www.ncbi.nlm.nih.gov/clinvar/variation/464/ - check in ClinVar VCF if there is MOI information for a classification public AcmgEvidence assignVariantAcmgEvidence(VariantEvaluation variantEvaluation, ModeOfInheritance modeOfInheritance, List contributingVariants, List knownDiseases, List> compatibleDiseaseMatches) { - // try strict ACMG assignments only if there are known disease-gene associations - if (knownDiseases.isEmpty()) { - return AcmgEvidence.empty(); + AcmgEvidence.Builder acmgEvidenceBuilder = AcmgEvidence.builder(); + + FrequencyData frequencyData = variantEvaluation.getFrequencyData(); + // BA1 "Allele frequency is >5% in Exome Sequencing Project, 1000 Genomes Project, or Exome Aggregation Consortium" + if (frequencyData.getMaxFreq() >= 5.0) { + acmgEvidenceBuilder.add(BA1); + // BA1 is supposed to be used as a filtering criterion where no other evidence need be considered. + return acmgEvidenceBuilder.build(); } + // PM2 "Absent from controls (or at extremely low frequency if recessive) in Exome Sequencing Project, 1000 Genomes Project, or Exome Aggregation Consortium" + assignPM2(acmgEvidenceBuilder, frequencyData); - AcmgEvidence.Builder acmgEvidenceBuilder = AcmgEvidence.builder(); boolean hasCompatibleDiseaseMatches = !compatibleDiseaseMatches.isEmpty(); @@ -106,12 +112,6 @@ public AcmgEvidence assignVariantAcmgEvidence(VariantEvaluation variantEvaluatio assignBS4(acmgEvidenceBuilder, variantEvaluation, proband); } - FrequencyData frequencyData = variantEvaluation.getFrequencyData(); - // PM2 "Absent from controls (or at extremely low frequency if recessive) in Exome Sequencing Project, 1000 Genomes Project, or Exome Aggregation Consortium" - assignPM2(acmgEvidenceBuilder, frequencyData); - // BA1 "Allele frequency is >5% in Exome Sequencing Project, 1000 Genomes Project, or Exome Aggregation Consortium" - assignBA1(acmgEvidenceBuilder, frequencyData); - // PM3 "For recessive disorders, detected in trans with a pathogenic variant" assignPM3orBP2(acmgEvidenceBuilder, variantEvaluation, modeOfInheritance, contributingVariants, hasCompatibleDiseaseMatches); // PM4 Protein length changes as a result of in-frame deletions/insertions in a nonrepeat region or stop-loss variants @@ -365,6 +365,7 @@ private boolean possibleDeNovo(SampleGenotype ancestorGenotype, SampleGenotype p private void assignPM1(Map acmgEvidenceBuilder) { // TODO - need UniProt domain / site info and clinvar counts // can upgrade to STRONG + // https://www.cell.com/ajhg/fulltext/S0002-9297(22)00461-X suggests to limit the combined evidence from PM1 and PP3 to strong } /** @@ -372,7 +373,7 @@ private void assignPM1(Map acmgEvidenceBuilder) { */ private void assignPM2(AcmgEvidence.Builder acmgEvidenceBuilder, FrequencyData frequencyData) { if (!frequencyData.hasEspData() && !frequencyData.hasExacData() && !frequencyData.hasDbSnpData()) { - acmgEvidenceBuilder.add(PM2); + acmgEvidenceBuilder.add(PM2, Evidence.SUPPORTING); } // TODO: require disease incidence in carriers and penetrance to be able to calculate expected frequencies for AR } @@ -523,15 +524,6 @@ private void assignPP4(AcmgEvidence.Builder acmgEvidenceBuilder, List5% in Exome Sequencing Project, 1000 Genomes Project, or Exome Aggregation Consortium" - */ - private void assignBA1(AcmgEvidence.Builder acmgEvidenceBuilder, FrequencyData frequencyData) { - if (frequencyData.getMaxFreq() >= 5.0) { - acmgEvidenceBuilder.add(BA1); - } - } - /** * BS4 "Lack of segregation in affected members of a family" */ diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifier.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifier.java new file mode 100644 index 000000000..95eda7faf --- /dev/null +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifier.java @@ -0,0 +1,58 @@ +package org.monarchinitiative.exomiser.core.analysis.util.acmg; + +/** + * This is recommended by the ClinGen Sequence Variant Interpretation (SVI) group + *

+ * Fitting a naturally scaled point system to the ACMG/AMP variant classification guidelines - Tavtigian et al. 2020, + * (DOI:10.1002/humu.24088). + *

+ */ +public class Acmg2020PointsBasedClassifier implements AcmgEvidenceClassifier { + + @Override + public AcmgClassification classify(AcmgEvidence acmgEvidence) { + + if (acmgEvidence.ba() == 1) { + return AcmgClassification.BENIGN; + } + + return classification(acmgEvidence.points()); + } + + protected AcmgClassification classification(double points) { + if (points >= 10) { + return AcmgClassification.PATHOGENIC; + } + if (points >= 6 && points <= 9) { + return AcmgClassification.LIKELY_PATHOGENIC; + } + if (points >= 0 && points <= 5) { + return AcmgClassification.UNCERTAIN_SIGNIFICANCE; + } + if (points >= -6 && points <= -1) { + return AcmgClassification.LIKELY_BENIGN; + } + // points <= -7 + return AcmgClassification.BENIGN; + } + + public double score(AcmgEvidence acmgEvidence) { + if (acmgEvidence.ba() == 1) { + return 0; + } + int maxPath = Math.min(scorePaths(acmgEvidence), 10); + int minBenign = Math.max(scoreBenign(acmgEvidence), -4); + + double score = ((maxPath - minBenign) - -4) / (double) (10 - -4); + return Math.max(Math.min(score, 1.0), 0.0); + } + + private int scorePaths(AcmgEvidence acmgEvidence) { + return acmgEvidence.pp() + (acmgEvidence.pm() * 2) + (acmgEvidence.ps() * 4) + (acmgEvidence.pvs() * 8); + } + + private int scoreBenign(AcmgEvidence acmgEvidence) { + return acmgEvidence.bp() + (acmgEvidence.bs() * 4); + } + +} diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgEvidence.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgEvidence.java index 01a578c74..442cbe3b4 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgEvidence.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgEvidence.java @@ -32,6 +32,21 @@ */ public class AcmgEvidence { + // These constants are derived in "Modeling the ACMG/AMP Variant Classification Guidelines as a Bayesian + // Classification Framework" Tavtigian et al. 2018, DOI:10.1038/gim.2017.210 + // https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6336098/bin/NIHMS915467-supplement-Supplemental_Table_S1.xlsx + + // Very_Strong == (2 * Strong) == (2 * Moderate) == (2 * Supporting) + // therefore points Supporting = 1, Moderate = 2, Strong = 4, Very_strong = 8 can be assigned and these fit to a + // Bayesian classification framework where (using the combining rules from Riggs et al. 2016) the posterior + // probabilities are Path >= 0.99, LikelyPath 0.90 - 0.98, LikelyBenign 0.1 - 0.01, Benign < 0.01 + + private static final double PRIOR_PROB = 0.1; + private static final double ODDS_PATH_VERY_STRONG = 350.0; + private static final double EXPONENTIAL_PROGRESSION = 2.0; + private static final double SUPPORTING_EVIDENCE_EXPONENT = Math.pow(EXPONENTIAL_PROGRESSION, -3); // 0.125 + private static final double ODDS_PATH_SUPPORTING = Math.pow(ODDS_PATH_VERY_STRONG, SUPPORTING_EVIDENCE_EXPONENT); // 2.08 + private static final AcmgEvidence EMPTY = new AcmgEvidence(Map.of()); @JsonProperty @@ -43,12 +58,17 @@ public class AcmgEvidence { private int pp = 0; private int ba = 0; + private int bvs = 0; private int bs = 0; + private int bm = 0; private int bp = 0; + private int points = 0; + private AcmgEvidence(Map evidence) { this.evidence = evidence == null || evidence.isEmpty() ? Map.of() : Collections.unmodifiableMap(new EnumMap<>(evidence)); countCriteriaEvidence(this.evidence); + points = pathPoints() - benignPoints(); } @JsonCreator @@ -89,9 +109,15 @@ private void countCriteriaEvidence(Map evidence) { case STAND_ALONE: ba++; break; + case VERY_STRONG: + bvs++; + break; case STRONG: bs++; break; + case MODERATE: + bm++; + break; case SUPPORTING: bp++; break; @@ -103,6 +129,21 @@ private void countCriteriaEvidence(Map evidence) { } } + public int pathPoints() { + return (int) (pp + pm * 2.0 + ps * 4.0 + pvs * 8.0); + } + + public int benignPoints() { + // n.b. here BA1 is given the equivalent weight as PVS1. This was *not* specified in the two papers. Specifically, + // in the 2018 paper they state "We excluded BA1, “benign stand alone” because it is used as absolute evidence + // that a variant is benign, irrespective of other evidence, which is contrary to Bayesian reasoning. The BA1 + // filter is useful for excluding a variant from entering a Bayesian framework, and will be addressed separately + // by the ClinGen Sequence Variant Interpretation (SVI) Working Group." + // Similarly, BM and BVS have been added here because it is possible to assign a Moderate, Strong or VeryStrong + // modifier to BP4 which will result in a VUS rather than LB if not included + return (int) (bp + bm * 2.0 + bs * 4.0 + bvs * 8.0 + ba * 8.0); + } + public boolean hasCriterion(AcmgCriterion acmgCriterion) { return evidence.containsKey(acmgCriterion); } @@ -144,14 +185,34 @@ public int ba() { return ba; } + public int bvs() { + return bvs; + } + public int bs() { return bs; } + public int bm() { + return bm; + } + public int bp() { return bp; } + public int points() { + return points; + } + + public double postProbPath() { + // Equation 2 from Tavtigian et al., 2020 (DOI: 10.1002/humu.24088) which is a re-written from of equation 5 from + // Tavtigian et al., 2018 (DOI: 10.1038/gim.2017.210) + double oddsPath = Math.pow(ODDS_PATH_SUPPORTING, points); + // posteriorProbability = (OddsPathogenicity*Prior P)/((OddsPathogenicity−1)*Prior_P+1) + return (oddsPath * PRIOR_PROB) / ((oddsPath - 1) * PRIOR_PROB + 1); + } + public static AcmgEvidence.Builder builder() { return new Builder(); } diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acgs2020ClassifierTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acgs2020ClassifierTest.java index e7b396a62..aff317ed9 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acgs2020ClassifierTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acgs2020ClassifierTest.java @@ -91,6 +91,7 @@ void classifiesPathogenic(String criteria) { @CsvSource({ // (c) >=2 Strong "PS1 PS2", + "PVS1 PP1", // updated rule https://clinicalgenome.org/site/assets/files/5182/pm2_-_svi_recommendation_-_approved_sept2020.pdf // (b) 1 Strong (PS1–PS4) AND // 1–2 moderate (PM1–PM6) OR "PS1 PM1 PM2", @@ -143,7 +144,7 @@ void classifiesLikelyBenign(String criteria) { @ParameterizedTest @CsvSource({ // (i) Other criteria shown above are not met - "PVS1 PP1", +// "PVS1 PP1", // "PS1 PP1", // VUS_Hot "PM1 PM2 PP1", // VUS_Hot // "PM1 PP1 PP2 PP3", // VUS_Hot - classified as LP diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015ClassifierTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015ClassifierTest.java index 64629e1d3..9d7dc52c2 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015ClassifierTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015ClassifierTest.java @@ -71,6 +71,7 @@ void classifiesPathogenic(String criteria) { @CsvSource({ // (i) 1 Very strong (PVS1) AND 1 moderate (PM1–PM6) "PVS1 PM1", + "PVS1 PP1", // updated rule https://clinicalgenome.org/site/assets/files/5182/pm2_-_svi_recommendation_-_approved_sept2020.pdf // OR (ii) 1 Strong (PS1–PS4) AND 1–2 moderate (PM1–PM6) "PS1 PM1 PM2", // OR (iii) 1 Strong (PS1–PS4) AND ≥2 supporting (PP1–PP5) @@ -121,7 +122,7 @@ void classifiesLikelyBenign(String criteria) { @ParameterizedTest @CsvSource({ // (i) Other criteria shown above are not met - "PVS1 PP1", +// "PVS1 PP1", - Changed to LP in https://clinicalgenome.org/site/assets/files/5182/pm2_-_svi_recommendation_-_approved_sept2020.pdf "PS1 PP1", // VUS_Hot "PM1 PM2 PP1", // VUS_Hot // "PM1 PP1 PP2 PP3", // VUS_Hot - classified as LP diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssignerTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssignerTest.java index 0bce7474e..568d2a2e9 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssignerTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssignerTest.java @@ -194,11 +194,11 @@ void testAssignsPM2() { AcmgEvidence acmgEvidence = instance.assignVariantAcmgEvidence(variantEvaluation, ModeOfInheritance.AUTOSOMAL_DOMINANT, List.of(variantEvaluation), List.of(cowdenSyndrome), List.of()); - assertThat(acmgEvidence, equalTo(AcmgEvidence.builder().add(AcmgCriterion.PM2).build())); + assertThat(acmgEvidence, equalTo(AcmgEvidence.builder().add(AcmgCriterion.PM2, Evidence.SUPPORTING).build())); } @Test - void testVariantMustBeInGeneWithKnownDiseaseAssociationForAcmgCriteriaToBeAssigned() { + void testVariantNeedNotBeInGeneWithKnownDiseaseAssociationForAcmgCriteriaToBeAssigned() { Acmg2015EvidenceAssigner instance = new Acmg2015EvidenceAssigner("proband", Pedigree.empty()); VariantEvaluation variantEvaluation = TestFactory.variantBuilder(1, 12345, "A", "G") // n.b. missing frequency data - should trigger PM2 @@ -207,7 +207,8 @@ void testVariantMustBeInGeneWithKnownDiseaseAssociationForAcmgCriteriaToBeAssign // Requires variant to be in gene associated with a disorder in order that any ACMG criteria can be applied AcmgEvidence acmgEvidence = instance.assignVariantAcmgEvidence(variantEvaluation, ModeOfInheritance.AUTOSOMAL_DOMINANT, List.of(variantEvaluation), List.of(), List.of()); - assertThat(acmgEvidence, equalTo(AcmgEvidence.empty())); + AcmgEvidence expected = AcmgEvidence.builder().add(PM2, Evidence.SUPPORTING).build(); + assertThat(acmgEvidence, equalTo(expected)); } @Test diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifierTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifierTest.java new file mode 100644 index 000000000..1a1f57c7f --- /dev/null +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifierTest.java @@ -0,0 +1,189 @@ +package org.monarchinitiative.exomiser.core.analysis.util.acmg; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +class Acmg2020PointsBasedClassifierTest { + + + private final AcmgEvidenceClassifier instance = new Acmg2020PointsBasedClassifier(); + + private AcmgEvidence parseAcmgEvidence(String criteria) { + AcmgEvidence.Builder acmgEvidenceBuilder = AcmgEvidence.builder(); + for (String criterion : criteria.split(" ")) { + String[] criteriaModifier = criterion.split("_"); + AcmgCriterion acmgCriterion = AcmgCriterion.valueOf(criteriaModifier[0]); + if (criteriaModifier.length == 2) { + AcmgCriterion.Evidence evidence = AcmgCriterion.Evidence.parseValue(criteriaModifier[1]); + acmgEvidenceBuilder.add(acmgCriterion, evidence); + } else { + acmgEvidenceBuilder.add(acmgCriterion); + } + } + return acmgEvidenceBuilder.build(); + } + + @ParameterizedTest + @CsvSource({ + "PVS1 PP5_VeryStrong", +// (a) 1 Very strong (PVS1) AND +// ≥1 Strong (PS1–PS4) OR + "PVS1 PS1", + "PVS1 PS2", + "PVS1 PS3", + "PVS1 PS4", + "PVS1 PS1 PS2", + "PVS1 PS1 PS2 PS3", +// ≥1 moderate (PM1–PM6) OR + "PVS1 PM1", + "PVS1 PM1 PM2", + "PVS1 PM1 PM2 PM3", + "PVS1 PM1 PM2 PM3 PM4", + "PVS1 PM1 PM2 PP1", +// ≥2 supporting (PP1–PP5) + "PVS1 PP1 PP2", + "PVS1 PP1 PP2 PP3", +// (b) ≥3 Strong (PS1-PS4) + "PS1 PS2 PS3", +// (c) 2 Strong (PS1-PS4) AND +// ≥1 moderate (PM1–PM6) OR + "PS1 PS2 PM1", +// ≥2 supporting (PP1–PP5) + "PS1 PS2 PP1 PP2", +// (d) 1 Strong (PS1-PS4) AND +// ≥3 moderate (PM1–PM6) OR + "PS1 PM1 PM2 PM3", +// ≥2 moderate (PM1–PM6) AND ≥2 supporting (PP1–PP5) OR + "PS1 PM1 PM2 PP1 PP2", +// ≥1 moderate (PM1–PM6) AND ≥4 supporting (PP1–PP5) + "PS1 PM1 PP1 PP2 PP3 PP4", + }) + void classifiesPathogenic(String criteria) { + AcmgEvidence acmgEvidence = parseAcmgEvidence(criteria); + assertThat(instance.classify(acmgEvidence), equalTo(AcmgClassification.PATHOGENIC)); + } + + @ParameterizedTest + @CsvSource({ + "PVS1 PP1", +// (c) >=2 Strong + "PS1 PS2", + "PS1 PS2 PP1", +// (b) 1 Strong (PS1–PS4) AND +// 1–2 moderate (PM1–PM6) OR + "PS1 PM1 PM2", + "PS1 PM1", +// ≥2 supporting (PP1–PP5) + "PS1 PP1 PP2", + "PS1 PP1 PP2 PP3", +// (c) ≥3 Moderate (PM1–PM6) OR + "PM1 PM2 PM3", +// 2 Moderate (PM1–PM6) AND ≥2 supporting (PP1–PP5) OR + "PM1 PM2 PP1 PP2", + "PM1 PM2 PP1 PP2 PP3", + "PM1 PM2 PP1 PP2 PP3 PP4", +// 1 Moderate (PM1–PM6) AND ≥4 supporting (PP1–PP5) + "PM1 PP1 PP2 PP3 PP4", + "PM1 PP1 PP2 PP3 PP4 PP5", + //PM2, PP3_Strong, PP4, PP5_Strong + }) + void classifiesLikelyPathogenic(String criteria) { + AcmgEvidence acmgEvidence = parseAcmgEvidence(criteria); + assertThat(instance.classify(acmgEvidence), equalTo(AcmgClassification.LIKELY_PATHOGENIC)); + } + + @ParameterizedTest + @CsvSource({ +// (i) Other criteria shown above are not met + "PS1 PP1", // VUS_Hot + "PM1 PM2 PP1", // VUS_Hot + "PM1 PP1 PP2 PP3", // VUS_Hot - classified as LP + "PS1", // VUS_Warm + "PM1 PM2", // VUS_Warm + "PM1 PP1 PP2", // VUS_Warm + "PP1 PP2 PP3 PP4", // VUS_Warm + "PM1 PP2", // VUS_Tepid + "PP1 PP2 PP3", // VUS_Warm + "PM1", // VUS_Cool + "PP1 PP2", // VUS_Warm + "PP1", // VUS_Cold +// OR (ii) the criteria for benign and pathogenic are contradictory + "PS1 BP1", +// "BS1 BP1 PVS1 PS1", // This is LP (12P, 5B = 7 points) +// "BA1 PVS1 PM1", // is this possible? + "BP1 BP2 BP3 PM1 PP1 PP2 PP3 PP4", + "PP1 BP1", + }) + void classifiesUncertain(String criteria) { + AcmgEvidence acmgEvidence = parseAcmgEvidence(criteria); + assertThat(instance.classify(acmgEvidence), equalTo(AcmgClassification.UNCERTAIN_SIGNIFICANCE)); + } + + @ParameterizedTest + @CsvSource({ +// (i) 1 Strong (BS1–BS4) and 1 supporting (BP1–BP7) + "BS1 BP1", +// OR (ii) ≥2 Supporting (BP1–BP7) + "BP1 BP2", + "BP4", + "BP4_Moderate", // This is possible + "BP1 BP2 BP3", + "BP4_Moderate BP6", + }) + void classifiesLikelyBenign(String criteria) { + AcmgEvidence acmgEvidence = parseAcmgEvidence(criteria); + assertThat(instance.classify(acmgEvidence), equalTo(AcmgClassification.LIKELY_BENIGN)); + } + + @ParameterizedTest + @CsvSource({ +// (i) 1 Stand-alone (BA1) + "BA1", + "BA1 BS1 BP1", +// OR (ii) ≥2 Strong (BS1–BS4) + "BS1 BS2", + "BS1 BS2 BS3" + }) + void classifiesBenign(String criteria) { + AcmgEvidence acmgEvidence = parseAcmgEvidence(criteria); + assertThat(instance.classify(acmgEvidence), equalTo(AcmgClassification.BENIGN)); + } + + @Test + void noEvidenceClassifiesUnknown() { + assertThat(instance.classify(AcmgEvidence.empty()), equalTo(AcmgClassification.UNCERTAIN_SIGNIFICANCE)); + } + + + @ParameterizedTest + @CsvSource({ + "11, PATHOGENIC", + "10, PATHOGENIC", + "9, LIKELY_PATHOGENIC", + "8, LIKELY_PATHOGENIC", + "7, LIKELY_PATHOGENIC", + "6, LIKELY_PATHOGENIC", + "5, UNCERTAIN_SIGNIFICANCE", + "4, UNCERTAIN_SIGNIFICANCE", + "3, UNCERTAIN_SIGNIFICANCE", + "2, UNCERTAIN_SIGNIFICANCE", + "1, UNCERTAIN_SIGNIFICANCE", + "0, UNCERTAIN_SIGNIFICANCE", + "-1, LIKELY_BENIGN", + "-2, LIKELY_BENIGN", + "-3, LIKELY_BENIGN", + "-4, LIKELY_BENIGN", + "-5, LIKELY_BENIGN", + "-6, LIKELY_BENIGN", + "-7, BENIGN", + "-8, BENIGN", + }) + void testPointsClassification(int points, AcmgClassification acmgClassification) { + assertThat(new Acmg2020PointsBasedClassifier().classification(points), equalTo(acmgClassification)); + } + +} \ No newline at end of file diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgAssignmentCalculatorTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgAssignmentCalculatorTest.java index 7b1c7b928..309c0d4e5 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgAssignmentCalculatorTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgAssignmentCalculatorTest.java @@ -93,7 +93,7 @@ void calculatePathAcmgAssignments() { AcmgEvidence acmgEvidence = AcmgEvidence.builder() .add(AcmgCriterion.PVS1) - .add(AcmgCriterion.PM2) + .add(AcmgCriterion.PM2, AcmgCriterion.Evidence.SUPPORTING) .add(AcmgCriterion.PP3, AcmgCriterion.Evidence.STRONG) .add(AcmgCriterion.PP4) .add(AcmgCriterion.PP5, AcmgCriterion.Evidence.STRONG) @@ -167,12 +167,11 @@ void calculateBenignAcmgAssignments() { AcmgEvidence acmgEvidence = AcmgEvidence.builder() .add(AcmgCriterion.BA1) - .add(AcmgCriterion.BP4, AcmgCriterion.Evidence.VERY_STRONG) .build(); AcmgAssignment acmgAssignment = AcmgAssignment.of(variantEvaluation, gene.getGeneIdentifier(), ModeOfInheritance.AUTOSOMAL_DOMINANT, cowdenSyndrome, acmgEvidence, AcmgClassification.BENIGN); AcmgEvidenceAssigner acmgEvidenceAssigner = new Acmg2015EvidenceAssigner("proband", justProband("proband", MALE)); - AcmgAssignmentCalculator instance = new AcmgAssignmentCalculator(acmgEvidenceAssigner, new Acgs2020Classifier()); + AcmgAssignmentCalculator instance = new AcmgAssignmentCalculator(acmgEvidenceAssigner, new Acmg2020PointsBasedClassifier()); List acmgAssignments = instance.calculateAcmgAssignments(ModeOfInheritance.AUTOSOMAL_DOMINANT, gene, List.of(variantEvaluation), compatibleDiseaseMatches); assertThat(acmgAssignments, equalTo(List.of(acmgAssignment))); } diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgEvidenceTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgEvidenceTest.java index 72e8860e7..f2568b849 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgEvidenceTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgEvidenceTest.java @@ -21,10 +21,13 @@ package org.monarchinitiative.exomiser.core.analysis.util.acmg; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import java.util.Map; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.equalTo; import static org.monarchinitiative.exomiser.core.analysis.util.acmg.AcmgCriterion.*; @@ -218,4 +221,46 @@ void testEvidence() { .build(); assertThat(instance.evidence(), equalTo(Map.of(PVS1, PVS1.evidence(), PM1, Evidence.VERY_STRONG))); } + + @ParameterizedTest + @CsvSource({ + "PVS1 PS1, 12, 0.999", + "PVS1 PM2 PM6 BP5, 11, 0.997", + "PVS1 PM2_Supporting, 9, 0.988", + "PS1 PS2 BP1, 7, 0.949", + "PS1 PS2 BP4 BP5, 6, 0.900", + "PS1 PS2 BS1, 4, 0.675", + "PM2 PP1, 3, 0.500", + "PM2, 2, 0.325", + "PP1, 1, 0.188", + "PP1 BP1, 0, 0.1", + "BP4, -1, 0.051", + "BP1, -1, 0.051", + "BP4_Moderate, -2, 0.025", + "BP1 BP2, -2, 0.025", + "BP4_Strong, -4, 0.006", + "BS1 BP1, -5, 0.003", + "BP4_VeryStrong, -8, 0.000", // There are no (current) recommendations where a Benign_VeryStrong is used, but it seems like a logical addition + "BA1, -8, 0.000", // BA1 is a bit of an anomaly - it's intended as a hard filter, so doesn't fit into the points system + }) + void testPosteriorProb(String criteria, int points, double posteriorProb) { + AcmgEvidence acmgEvidence = parseAcmgEvidence(criteria); + assertThat(acmgEvidence.points(), equalTo(points)); + assertThat(acmgEvidence.postProbPath(), closeTo(posteriorProb, 0.001)); + } + + private AcmgEvidence parseAcmgEvidence(String criteria) { + AcmgEvidence.Builder acmgEvidenceBuilder = AcmgEvidence.builder(); + for (String criterion : criteria.split(" ")) { + String[] criteriaModifier = criterion.split("_"); + AcmgCriterion acmgCriterion = AcmgCriterion.valueOf(criteriaModifier[0]); + if (criteriaModifier.length == 2) { + AcmgCriterion.Evidence evidence = AcmgCriterion.Evidence.parseValue(criteriaModifier[1]); + acmgEvidenceBuilder.add(acmgCriterion, evidence); + } else { + acmgEvidenceBuilder.add(acmgCriterion); + } + } + return acmgEvidenceBuilder.build(); + } } \ No newline at end of file From 4ab70798173d324e6e9c5bf573b3aa50dc30ba16 Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Fri, 15 Sep 2023 13:13:00 +0100 Subject: [PATCH 04/17] Add new FrequencyData.getMaxFreqForPopulation to allow for specific population frequency filtering Add new FrequencySource.NON_FOUNDER_POPS to exclude FIN, ASJ, OTH ExAC and gnomAD populations. Update Acmg2015EvidenceAssigner to implement updated guidelines from ClinGen SVI for BA1 and PM2 see issue #513 for details --- docs/acmg_assignment.rst | 23 ++++-- docs/advanced_analysis.rst | 4 +- .../util/acmg/Acmg2015EvidenceAssigner.java | 75 ++++++++++++++++--- .../acmg/Acmg2020PointsBasedClassifier.java | 25 +------ .../core/analysis/util/acmg/AcmgEvidence.java | 3 +- .../core/model/frequency/FrequencyData.java | 20 ++++- .../core/model/frequency/FrequencySource.java | 49 ++++++++++++ .../acmg/Acmg2015EvidenceAssignerTest.java | 38 +++++++++- .../Acmg2020PointsBasedClassifierTest.java | 3 +- .../model/frequency/FrequencySourceTest.java | 14 ++++ 10 files changed, 209 insertions(+), 45 deletions(-) diff --git a/docs/acmg_assignment.rst b/docs/acmg_assignment.rst index 64916fd7b..21cd541d2 100644 --- a/docs/acmg_assignment.rst +++ b/docs/acmg_assignment.rst @@ -7,8 +7,11 @@ ACMG Assignment Starting with version 13.1.0, Exomiser performs a partial categorisation of the variants contributing to the gene score for a mode of inheritance using the ACMG/AMP `Standards and guidelines for the interpretation of sequence variants: a joint consensus recommendation of the American College of Medical Genetics and Genomics and the Association -for Molecular Pathology `_. The criteria are assigned and combined according to the -`UK ACGS 2020 guidelines `_. +for Molecular Pathology `_. The criteria are assigned according to the +`UK ACGS 2020 guidelines `_ +and scored according to the +`ClinGen SVI `_ +`updated 2020 guidelines `_. It is important to be aware that these scores are not a substitute for manual assignment by a qualified clinical geneticist or clinician - The scores displayed utilise the data found in the Exomiser database and are a subset of the possible @@ -60,15 +63,25 @@ at least two ancestors of the proband, none of whom are affected and none of who Population Data =============== + +For the population data criteria, all frequencies are considered using the populations set by the user in the +:ref:`frequencysources`, apart from any bottle-necked populations not recommended for frequency filtering from gnomAD +according to their `filtering allele frequency `_ document. This excludes +the Ashkenazi Jewish (ASJ), European Finnish (FIN), Other (OTH), Amish (AMI) and Middle Eastern (MID) populations. In +addition the LOCAL frequency will also not be used. + BA1 --- Given Exomiser will filter out alleles with an allele frequency of >= 2.0%, this is unlikely to be seen. However, alleles -with a maximum frequency >= 5.0% in the frequency sources specified will be assigned the `BA1` criterion. +with a maximum frequency >= 5.0% in the frequency sources specified will be assigned the `BA1` criterion. Variants listed +as being excluded from this category by the ClinGen SVI working group `BA1 exclusion list `_ +will not be marked as `BA1`, assuming they survived variant filtering. PM2 --- -Alleles not present in the ESP, ExAC and 1000 Genomes data sets (i.e. the allele must be absent from all three) are -assigned the `PM2` criterion. +In accordance with the `updated PM2 guidance `_, variants absent from all of the user-defined :ref:`frequencysources` +will be assigned the `PM2_Supporting` criterion. Additionally, for variants considered under a recessive mode of inheritance they +can have a frequency of < 0.01% (0.0001) in all non-bottlenecked populations to be assigned `PM2_Supporting`. Allelic Data ============ diff --git a/docs/advanced_analysis.rst b/docs/advanced_analysis.rst index 7fcdea434..c81843cc6 100644 --- a/docs/advanced_analysis.rst +++ b/docs/advanced_analysis.rst @@ -247,8 +247,8 @@ gnomAD genomes: ``GNOMAD_G_OTH``, ``GNOMAD_G_SAS`` -We recommend using all databases if the proband population background is unknown, although removing the ``GNOMAD_E_ASJ`` and ``GNOMAD_G_ASJ``, unless your proband is -known to come from an Ashkenazi population e.g. +We recommend using all databases if the proband population background is unknown, although removing the ``GNOMAD_E_ASJ`` +and ``GNOMAD_G_ASJ``, unless your proband is known to come from an Ashkenazi population e.g. .. code-block:: yaml diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssigner.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssigner.java index ee1dd23aa..ee4797e81 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssigner.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssigner.java @@ -25,19 +25,20 @@ import org.monarchinitiative.exomiser.core.analysis.util.GeneConstraint; import org.monarchinitiative.exomiser.core.analysis.util.GeneConstraints; import org.monarchinitiative.exomiser.core.analysis.util.InheritanceModeAnalyser; -import org.monarchinitiative.exomiser.core.model.Pedigree; +import org.monarchinitiative.exomiser.core.genome.GenomeAssembly; +import org.monarchinitiative.exomiser.core.model.*; import org.monarchinitiative.exomiser.core.model.Pedigree.Individual; -import org.monarchinitiative.exomiser.core.model.SampleGenotype; -import org.monarchinitiative.exomiser.core.model.TranscriptAnnotation; -import org.monarchinitiative.exomiser.core.model.VariantEvaluation; import org.monarchinitiative.exomiser.core.model.frequency.FrequencyData; +import org.monarchinitiative.exomiser.core.model.frequency.FrequencySource; import org.monarchinitiative.exomiser.core.model.pathogenicity.*; import org.monarchinitiative.exomiser.core.phenotype.ModelPhenotypeMatch; import org.monarchinitiative.exomiser.core.prioritisers.model.Disease; +import org.monarchinitiative.exomiser.core.proto.AlleleProto; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import static org.monarchinitiative.exomiser.core.analysis.util.acmg.AcmgCriterion.*; @@ -47,6 +48,49 @@ */ public class Acmg2015EvidenceAssigner implements AcmgEvidenceAssigner { + // Variants to be excluded from being assigned BA1 as specified by the ClinGen SVI working group in: + // https://www.clinicalgenome.org/site/assets/files/3460/ba1_exception_list_07_30_2018.pdf + private static final Set HG19_BA1_EXCLUSION_VARIANTS = Set.of( + // ClinVar 1018 - 3: 128598490 (GRCh37) 128879647 (GRCh38) (SPDI: NC_000003.12:128879647:TAAG:TAAGTAAG) + AlleleProto.AlleleKey.newBuilder().setChr(3).setPosition(128_598_490).setRef("C").setAlt("CTAAG").build(), + // ClinVar 17023 - 13: 20763612 (GRCh37) 20189473 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(13).setPosition(20_763_612).setRef("C").setAlt("T").build(), + // ClinVar 10 - 6: 26091179 (GRCh37) 26090951 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(6).setPosition(26_091_179).setRef("C").setAlt("G").build(), + // ClinVar 9 - 6: 26093141 (GRCh37) 26092913 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(6).setPosition(26_093_141).setRef("G").setAlt("A").build(), + // ClinVar 2551 - 16: 3299586 (GRCh37) 3249586 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(16).setPosition(3_299_586).setRef("G").setAlt("A").build(), + // ClinVar 2552 - 16: 3299468 (GRCh37) 3249468 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(16).setPosition(3_299_468).setRef("C").setAlt("T").build(), + // ClinVar 217689 - 13: 73409497 (GRCh37) 72835359 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(13).setPosition(73_409_497).setRef("G").setAlt("A").build(), + // ClinVar 3830 - 12: 121175678 (GRCh37) 120737875 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(12).setPosition(121_175_678).setRef("C").setAlt("T").build(), + // ClinVar 1900 - 3: 15686693 (GRCh37) 15645186 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(3).setPosition(15_686_693).setRef("G").setAlt("C").build() + ); + private static final Set HG38_BA1_EXCLUSION_VARIANTS = Set.of( + // ClinVar 1018 - 3: 128598490 (GRCh37) 128879647 (GRCh38) (SPDI: NC_000003.12:128879647:TAAG:TAAGTAAG) + AlleleProto.AlleleKey.newBuilder().setChr(3).setPosition(128_879_647).setRef("C").setAlt("CTAAG").build(), + // ClinVar 17023 - 13: 20763612 (GRCh37) 20189473 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(13).setPosition(20_189_473).setRef("C").setAlt("T").build(), + // ClinVar 10 - 6: 26091179 (GRCh37) 26090951 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(6).setPosition(26_090_951).setRef("C").setAlt("G").build(), + // ClinVar 9 - 6: 26093141 (GRCh37) 26092913 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(6).setPosition(26_092_913).setRef("G").setAlt("A").build(), + // ClinVar 2551 - 16: 3299586 (GRCh37) 3249586 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(16).setPosition(3_249_586).setRef("G").setAlt("A").build(), + // ClinVar 2552 - 16: 3299468 (GRCh37) 3249468 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(16).setPosition(3_249_468).setRef("C").setAlt("T").build(), + // ClinVar 217689 - 13: 73409497 (GRCh37) 72835359 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(13).setPosition(72_835_359).setRef("G").setAlt("A").build(), + // ClinVar 3830 - 12: 121175678 (GRCh37) 120737875 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(12).setPosition(120_737_875).setRef("C").setAlt("T").build(), + // ClinVar 1900 - 3: 15686693 (GRCh37) 15645186 (GRCh38) + AlleleProto.AlleleKey.newBuilder().setChr(3).setPosition(15_645_186).setRef("G").setAlt("C").build() + ); + private final String probandId; private final Individual.Sex probandSex; private final Pedigree pedigree; @@ -84,13 +128,18 @@ public AcmgEvidence assignVariantAcmgEvidence(VariantEvaluation variantEvaluatio FrequencyData frequencyData = variantEvaluation.getFrequencyData(); // BA1 "Allele frequency is >5% in Exome Sequencing Project, 1000 Genomes Project, or Exome Aggregation Consortium" - if (frequencyData.getMaxFreq() >= 5.0) { + // Updated recommendation: "Allele frequency is >0.05 in any general continental population dataset of at least + // 2,000 observed alleles and found in a gene without a gene- or variant-specific BA1 modification." i.e. ExAC + // African, East Asian, European [non-Finnish], Latino, and South Asian + AlleleProto.AlleleKey alleleKey = AlleleProtoAdaptor.toAlleleKey(variantEvaluation); + boolean isBa1ExcludedVariant = variantEvaluation.getGenomeAssembly() == GenomeAssembly.HG19 ? HG19_BA1_EXCLUSION_VARIANTS.contains(alleleKey) : HG38_BA1_EXCLUSION_VARIANTS.contains(alleleKey); + if (!isBa1ExcludedVariant && frequencyData.getMaxFreqForPopulation(FrequencySource.NON_FOUNDER_POPS) >= 5.0) { acmgEvidenceBuilder.add(BA1); // BA1 is supposed to be used as a filtering criterion where no other evidence need be considered. return acmgEvidenceBuilder.build(); } // PM2 "Absent from controls (or at extremely low frequency if recessive) in Exome Sequencing Project, 1000 Genomes Project, or Exome Aggregation Consortium" - assignPM2(acmgEvidenceBuilder, frequencyData); + assignPM2(acmgEvidenceBuilder, frequencyData, modeOfInheritance); boolean hasCompatibleDiseaseMatches = !compatibleDiseaseMatches.isEmpty(); @@ -369,13 +418,19 @@ private void assignPM1(Map acmgEvidenceBuilder) { } /** - * PM2 "Absent from controls (or at extremely low frequency if recessive) in Exome Sequencing Project, 1000 Genomes Project, or Exome Aggregation Consortium" + * PM2 "Absent from controls (or at extremely low frequency if recessive) in Exome Sequencing Project, 1000 Genomes + * Project, or Exome Aggregation Consortium" + * See ClinGen SVI updated recommendations. + * This method uses the recommended frequency filtering populations from gnomAD for their Filtering allele frequency + * which excludes the bottle-necked populations Ashkenazi Jewish (ASJ), European Finnish (FIN), Other (OTH), Amish (AMI) + * and Middle Eastern (MID). */ - private void assignPM2(AcmgEvidence.Builder acmgEvidenceBuilder, FrequencyData frequencyData) { - if (!frequencyData.hasEspData() && !frequencyData.hasExacData() && !frequencyData.hasDbSnpData()) { + private void assignPM2(AcmgEvidence.Builder acmgEvidenceBuilder, FrequencyData frequencyData, ModeOfInheritance modeOfInheritance) { + boolean absentFromDatabase = !frequencyData.hasKnownFrequency(); + boolean atVeryLowFrequencyIfRecessive = modeOfInheritance.isRecessive() && frequencyData.getMaxFreqForPopulation(FrequencySource.NON_FOUNDER_POPS) < 0.01f; + if (absentFromDatabase || atVeryLowFrequencyIfRecessive) { acmgEvidenceBuilder.add(PM2, Evidence.SUPPORTING); } - // TODO: require disease incidence in carriers and penetrance to be able to calculate expected frequencies for AR } /** diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifier.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifier.java index 95eda7faf..2c26e94dc 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifier.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifier.java @@ -1,11 +1,13 @@ package org.monarchinitiative.exomiser.core.analysis.util.acmg; /** - * This is recommended by the ClinGen Sequence Variant Interpretation (SVI) group + * A points-based classification recommended by the ClinGen Sequence Variant Interpretation (SVI) group. + * This implementation uses the points scales described in *

* Fitting a naturally scaled point system to the ACMG/AMP variant classification guidelines - Tavtigian et al. 2020, - * (DOI:10.1002/humu.24088). + * DOI:10.1002/humu.24088. *

+ * @since 13.3.0 */ public class Acmg2020PointsBasedClassifier implements AcmgEvidenceClassifier { @@ -36,23 +38,4 @@ protected AcmgClassification classification(double points) { return AcmgClassification.BENIGN; } - public double score(AcmgEvidence acmgEvidence) { - if (acmgEvidence.ba() == 1) { - return 0; - } - int maxPath = Math.min(scorePaths(acmgEvidence), 10); - int minBenign = Math.max(scoreBenign(acmgEvidence), -4); - - double score = ((maxPath - minBenign) - -4) / (double) (10 - -4); - return Math.max(Math.min(score, 1.0), 0.0); - } - - private int scorePaths(AcmgEvidence acmgEvidence) { - return acmgEvidence.pp() + (acmgEvidence.pm() * 2) + (acmgEvidence.ps() * 4) + (acmgEvidence.pvs() * 8); - } - - private int scoreBenign(AcmgEvidence acmgEvidence) { - return acmgEvidence.bp() + (acmgEvidence.bs() * 4); - } - } diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgEvidence.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgEvidence.java index 442cbe3b4..46657d01d 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgEvidence.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/AcmgEvidence.java @@ -140,7 +140,8 @@ public int benignPoints() { // filter is useful for excluding a variant from entering a Bayesian framework, and will be addressed separately // by the ClinGen Sequence Variant Interpretation (SVI) Working Group." // Similarly, BM and BVS have been added here because it is possible to assign a Moderate, Strong or VeryStrong - // modifier to BP4 which will result in a VUS rather than LB if not included + // modifier to BP4 according to https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9748256/ which will result in a VUS + // rather than LB if not included return (int) (bp + bm * 2.0 + bs * 4.0 + bvs * 8.0 + ba * 8.0); } diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencyData.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencyData.java index 1eb8c83eb..ceaf04d8d 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencyData.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencyData.java @@ -207,6 +207,24 @@ public boolean hasExacData() { return false; } + /** + * Returns the highest frequency in percent for a given set of {@link FrequencySource}. + * + * @param frequencySources to find the highest frequency for + * @return the population frequency as a percentage value i.e. 0.001 == 0.1% + * @since 13.3.3 + */ + public float getMaxFreqForPopulation(Set frequencySources) { + float max = 0f; + for (int i = 0; i < size; i++) { + FrequencySource freqSource = this.sources[i]; + if (frequencySources.contains(freqSource)) { + max = Math.max(max, values[i]); + } + } + return max; + } + @JsonIgnore public boolean hasKnownFrequency() { return size != 0; @@ -246,7 +264,7 @@ public List getKnownFrequencies() { } /** - * Returns a the maximum frequency - if there are no known frequencies/ no + * Returns the maximum frequency - if there are no known frequencies/ no * frequency data it will return 0. * * @return diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencySource.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencySource.java index c25f98ab7..90eaa63a9 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencySource.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencySource.java @@ -92,8 +92,57 @@ public enum FrequencySource { public static final Set ALL_EXAC_SOURCES = Sets.immutableEnumSet(EnumSet.range(EXAC_AFRICAN_INC_AFRICAN_AMERICAN, EXAC_SOUTH_ASIAN)); + public static final Set ALL_GNOMAD_SOURCES = Sets.immutableEnumSet(EnumSet.range(GNOMAD_E_AFR, GNOMAD_G_SAS)); + public static final Set ALL_EXTERNAL_FREQ_SOURCES = Sets.immutableEnumSet(EnumSet.range(THOUSAND_GENOMES, GNOMAD_G_SAS)); + /** + * Returns the set of non-founder/bottle-necked populations for use in frequency filtering. + * Here we're using the populations included in the gnomAD + * filtering allele frequency. Note that this is related to the ClinGen recommendations for populations to + * consider for filtering against when considering the BA1 (Benign standAlone) evidence category. More explicitly, + * this means any {@link FrequencySource} excluding Ashkenazi Jewish (ASJ), European Finnish (FIN), and + * "Other" (OTH) populations (gnomAD v2) or Amish (AMI), Ashkenazi Jewish (ASJ), European Finnish (FIN), + * Middle Eastern (MID), and "Other" (OTH) populations (gnomAD v3). + */ + public static final Set NON_FOUNDER_POPS = Sets.immutableEnumSet( + EnumSet.of( + THOUSAND_GENOMES, + TOPMED, + UK10K, + + ESP_AFRICAN_AMERICAN, + ESP_EUROPEAN_AMERICAN, + ESP_ALL, + + EXAC_AFRICAN_INC_AFRICAN_AMERICAN, + EXAC_AMERICAN, + EXAC_EAST_ASIAN, +// EXAC_FINNISH, + EXAC_NON_FINNISH_EUROPEAN, +// EXAC_OTHER, + EXAC_SOUTH_ASIAN, + + GNOMAD_E_AFR, + GNOMAD_E_AMR, +// GNOMAD_E_ASJ, + GNOMAD_E_EAS, +// GNOMAD_E_FIN, + GNOMAD_E_NFE, +// GNOMAD_E_OTH, + GNOMAD_E_SAS, + + GNOMAD_G_AFR, + GNOMAD_G_AMR, +// GNOMAD_G_ASJ, + GNOMAD_G_EAS, +// GNOMAD_G_FIN, + GNOMAD_G_NFE, +// GNOMAD_G_OTH, + GNOMAD_G_SAS + ) + ); + private final String source; FrequencySource(String source) { diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssignerTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssignerTest.java index 568d2a2e9..579d79e1e 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssignerTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssignerTest.java @@ -183,7 +183,7 @@ void testAssignsPS2_hasFamilyHistory() { } @Test - void testAssignsPM2() { + void testAssignsPM2AutosomalDominant() { Acmg2015EvidenceAssigner instance = new Acmg2015EvidenceAssigner("proband", Pedigree.empty()); VariantEvaluation variantEvaluation = TestFactory.variantBuilder(10, 12345, "A", "G") // n.b. missing frequency data - will trigger PM2 @@ -197,6 +197,19 @@ void testAssignsPM2() { assertThat(acmgEvidence, equalTo(AcmgEvidence.builder().add(AcmgCriterion.PM2, Evidence.SUPPORTING).build())); } + @Test + void testAssignsPM2AutosomalRecessive() { + Acmg2015EvidenceAssigner instance = new Acmg2015EvidenceAssigner("proband", Pedigree.empty()); + VariantEvaluation variantEvaluation = TestFactory.variantBuilder(10, 12345, "A", "G") + // n.b. low frequency for AR - will trigger PM2 + .frequencyData(FrequencyData.of(Frequency.of(FrequencySource.GNOMAD_E_EAS, 0.009f))) + .build(); + + AcmgEvidence acmgEvidence = instance.assignVariantAcmgEvidence(variantEvaluation, ModeOfInheritance.AUTOSOMAL_RECESSIVE, List.of(variantEvaluation), List.of(), List.of()); + + assertThat(acmgEvidence, equalTo(AcmgEvidence.builder().add(AcmgCriterion.PM2, Evidence.SUPPORTING).build())); + } + @Test void testVariantNeedNotBeInGeneWithKnownDiseaseAssociationForAcmgCriteriaToBeAssigned() { Acmg2015EvidenceAssigner instance = new Acmg2015EvidenceAssigner("proband", Pedigree.empty()); @@ -204,7 +217,7 @@ void testVariantNeedNotBeInGeneWithKnownDiseaseAssociationForAcmgCriteriaToBeAss // n.b. missing frequency data - should trigger PM2 .frequencyData(FrequencyData.of()) .build(); - // Requires variant to be in gene associated with a disorder in order that any ACMG criteria can be applied + // Not required that a variant is in gene associated with a disorder in order that any ACMG criteria can be applied AcmgEvidence acmgEvidence = instance.assignVariantAcmgEvidence(variantEvaluation, ModeOfInheritance.AUTOSOMAL_DOMINANT, List.of(variantEvaluation), List.of(), List.of()); AcmgEvidence expected = AcmgEvidence.builder().add(PM2, Evidence.SUPPORTING).build(); @@ -598,12 +611,29 @@ void testAssignsBA1() { .frequencyData(FrequencyData.of(Frequency.of(FrequencySource.EXAC_AMERICAN, 5.0f))) .variantEffect(VariantEffect.MISSENSE_VARIANT) .build(); - Disease cowdenSyndrome = Disease.builder().diseaseId("OMIM:158350").diseaseName("COWDEN SYNDROME 1; CWS1").inheritanceMode(InheritanceMode.AUTOSOMAL_DOMINANT).diseaseType(Disease.DiseaseType.DISEASE).build(); - AcmgEvidence acmgEvidence = instance.assignVariantAcmgEvidence(variantEvaluation, ModeOfInheritance.AUTOSOMAL_DOMINANT, List.of(variantEvaluation), List.of(cowdenSyndrome), List.of()); + AcmgEvidence acmgEvidence = instance.assignVariantAcmgEvidence(variantEvaluation, ModeOfInheritance.AUTOSOMAL_DOMINANT, List.of(variantEvaluation), List.of(), List.of()); assertThat(acmgEvidence, equalTo(AcmgEvidence.builder().add(AcmgCriterion.BA1).build())); } + @Test + void testDoesntAssignBA1ForException() { + Acmg2015EvidenceAssigner instance = new Acmg2015EvidenceAssigner("proband", justProband("proband", MALE)); + // NM_004004.6:c.109G>A https://www.ncbi.nlm.nih.gov/clinvar/variation/17023/ + VariantEvaluation variantEvaluation = TestFactory.variantBuilder(3, 128598490, "C", "CTAAG") + .geneSymbol("GJB2") + // high allele freq - triggers BA1 assignment but this is an exception + .frequencyData(FrequencyData.of(Frequency.of(FrequencySource.GNOMAD_G_EAS, 9.444445f))) + .variantEffect(VariantEffect.MISSENSE_VARIANT) + .build(); + // Causes non-syndromic hearing loss (ClinVar 3* reviewed by expert panel) + Disease deafness = Disease.builder().diseaseId("OMIM:220290").diseaseName("DEAFNESS, AUTOSOMAL RECESSIVE 1A; DFNB1A") + .inheritanceMode(InheritanceMode.AUTOSOMAL_RECESSIVE).diseaseType(Disease.DiseaseType.DISEASE).build(); + + AcmgEvidence acmgEvidence = instance.assignVariantAcmgEvidence(variantEvaluation, ModeOfInheritance.AUTOSOMAL_RECESSIVE, List.of(variantEvaluation), List.of(deafness), List.of()); + assertThat(acmgEvidence, equalTo(AcmgEvidence.empty())); + } + @Test void testAssignsBS4() { Individual proband = Individual.builder().id("proband").motherId("mother").fatherId("father").sex(MALE).status(Status.AFFECTED).build(); diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifierTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifierTest.java index 1a1f57c7f..5bcef7173 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifierTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2020PointsBasedClassifierTest.java @@ -146,7 +146,8 @@ void classifiesLikelyBenign(String criteria) { "BA1 BS1 BP1", // OR (ii) ≥2 Strong (BS1–BS4) "BS1 BS2", - "BS1 BS2 BS3" + "BS1 BS2 BS3", + "PS3 PS4 PP1_Supporting PM3 PP4 BA1" // would be a warm VUS (4 points) if not for the BA1 benign hard-filter }) void classifiesBenign(String criteria) { AcmgEvidence acmgEvidence = parseAcmgEvidence(criteria); diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencySourceTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencySourceTest.java index 00c49dea1..4c296f40a 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencySourceTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencySourceTest.java @@ -27,6 +27,8 @@ import org.junit.jupiter.api.Test; +import java.util.EnumSet; + import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; @@ -110,4 +112,16 @@ public void testGetAllEspFrequencySources(){ public void testGetAllExacFrequencySources(){ assertThat(FrequencySource.ALL_EXAC_SOURCES.size(), equalTo(7)); } + + @Test + void nonFounderPopulations() { + // Finnish, Other, Ashkenazi + EnumSet founderPopulations = EnumSet.of( + FrequencySource.EXAC_FINNISH, FrequencySource.EXAC_OTHER, + FrequencySource.GNOMAD_E_FIN, FrequencySource.GNOMAD_G_FIN, + FrequencySource.GNOMAD_E_ASJ, FrequencySource.GNOMAD_G_ASJ, + FrequencySource.GNOMAD_E_OTH, FrequencySource.GNOMAD_G_OTH + ); + assertThat(FrequencySource.NON_FOUNDER_POPS.containsAll(founderPopulations), equalTo(false)); + } } From dd6e676ed173e0d7665217d7b7606476002ff11e Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Fri, 15 Sep 2023 13:38:11 +0100 Subject: [PATCH 05/17] Change for #513 - remove ASJ, FIN, OTH ExAC and gnomAD populations from presets and examples. --- ...NA19722_252900_AR_SGSH_1_NONSYNONYMOUS.yml | 17 +++++++------- ...MAL_RECESSIVE_POMP_13_29233225_5UTR_38.yml | 17 +++++++------- .../examples/preset-exome-analysis.yml | 17 +++++++------- .../examples/preset-genome-analysis.yml | 17 +++++++------- .../examples/test-analysis-exome.yml | 17 +++++++------- .../examples/test-analysis-genome.yml | 17 +++++++------- .../examples/test-analysis-multisample.yml | 17 +++++++------- .../core/analysis/AnalysisPresetBuilder.java | 23 +++++++++++++------ 8 files changed, 79 insertions(+), 63 deletions(-) diff --git a/exomiser-cli/src/main/resources/examples/NA19722_252900_AR_SGSH_1_NONSYNONYMOUS.yml b/exomiser-cli/src/main/resources/examples/NA19722_252900_AR_SGSH_1_NONSYNONYMOUS.yml index 7fd84d7b4..44efece5a 100644 --- a/exomiser-cli/src/main/resources/examples/NA19722_252900_AR_SGSH_1_NONSYNONYMOUS.yml +++ b/exomiser-cli/src/main/resources/examples/NA19722_252900_AR_SGSH_1_NONSYNONYMOUS.yml @@ -71,25 +71,26 @@ analysis: EXAC_AFRICAN_INC_AFRICAN_AMERICAN, EXAC_AMERICAN, EXAC_SOUTH_ASIAN, EXAC_EAST_ASIAN, - EXAC_FINNISH, EXAC_NON_FINNISH_EUROPEAN, - EXAC_OTHER, + # EXAC_FINNISH, + EXAC_NON_FINNISH_EUROPEAN, + # EXAC_OTHER, GNOMAD_E_AFR, GNOMAD_E_AMR, - # GNOMAD_E_ASJ, + # GNOMAD_E_ASJ, GNOMAD_E_EAS, - GNOMAD_E_FIN, + # GNOMAD_E_FIN, GNOMAD_E_NFE, - GNOMAD_E_OTH, + # GNOMAD_E_OTH, GNOMAD_E_SAS, GNOMAD_G_AFR, GNOMAD_G_AMR, - # GNOMAD_G_ASJ, + # GNOMAD_G_ASJ, GNOMAD_G_EAS, - GNOMAD_G_FIN, + # GNOMAD_G_FIN, GNOMAD_G_NFE, - GNOMAD_G_OTH, + # GNOMAD_G_OTH, GNOMAD_G_SAS ] # Possible pathogenicitySources: (POLYPHEN, MUTATION_TASTER, SIFT), (REVEL, MVP), CADD, REMM diff --git a/exomiser-cli/src/main/resources/examples/NA19722_601952_AUTOSOMAL_RECESSIVE_POMP_13_29233225_5UTR_38.yml b/exomiser-cli/src/main/resources/examples/NA19722_601952_AUTOSOMAL_RECESSIVE_POMP_13_29233225_5UTR_38.yml index 2a36ae94b..b704c9db2 100644 --- a/exomiser-cli/src/main/resources/examples/NA19722_601952_AUTOSOMAL_RECESSIVE_POMP_13_29233225_5UTR_38.yml +++ b/exomiser-cli/src/main/resources/examples/NA19722_601952_AUTOSOMAL_RECESSIVE_POMP_13_29233225_5UTR_38.yml @@ -55,25 +55,26 @@ analysis: EXAC_AFRICAN_INC_AFRICAN_AMERICAN, EXAC_AMERICAN, EXAC_SOUTH_ASIAN, EXAC_EAST_ASIAN, - EXAC_FINNISH, EXAC_NON_FINNISH_EUROPEAN, - EXAC_OTHER, + # EXAC_FINNISH, + EXAC_NON_FINNISH_EUROPEAN, + # EXAC_OTHER, GNOMAD_E_AFR, GNOMAD_E_AMR, - # GNOMAD_E_ASJ, + # GNOMAD_E_ASJ, GNOMAD_E_EAS, - GNOMAD_E_FIN, + # GNOMAD_E_FIN, GNOMAD_E_NFE, - GNOMAD_E_OTH, + # GNOMAD_E_OTH, GNOMAD_E_SAS, GNOMAD_G_AFR, GNOMAD_G_AMR, - # GNOMAD_G_ASJ, + # GNOMAD_G_ASJ, GNOMAD_G_EAS, - GNOMAD_G_FIN, + # GNOMAD_G_FIN, GNOMAD_G_NFE, - GNOMAD_G_OTH, + # GNOMAD_G_OTH, GNOMAD_G_SAS ] # Possible pathogenicitySources: (POLYPHEN, MUTATION_TASTER, SIFT), (REVEL, MVP), CADD, REMM diff --git a/exomiser-cli/src/main/resources/examples/preset-exome-analysis.yml b/exomiser-cli/src/main/resources/examples/preset-exome-analysis.yml index b08dfcbab..869c75646 100644 --- a/exomiser-cli/src/main/resources/examples/preset-exome-analysis.yml +++ b/exomiser-cli/src/main/resources/examples/preset-exome-analysis.yml @@ -21,25 +21,26 @@ frequencySources: [ EXAC_AFRICAN_INC_AFRICAN_AMERICAN, EXAC_AMERICAN, EXAC_SOUTH_ASIAN, EXAC_EAST_ASIAN, - EXAC_FINNISH, EXAC_NON_FINNISH_EUROPEAN, - EXAC_OTHER, + # EXAC_FINNISH, + EXAC_NON_FINNISH_EUROPEAN, + # EXAC_OTHER, GNOMAD_E_AFR, GNOMAD_E_AMR, - # GNOMAD_E_ASJ, + # GNOMAD_E_ASJ, GNOMAD_E_EAS, - GNOMAD_E_FIN, + # GNOMAD_E_FIN, GNOMAD_E_NFE, - GNOMAD_E_OTH, + # GNOMAD_E_OTH, GNOMAD_E_SAS, GNOMAD_G_AFR, GNOMAD_G_AMR, - # GNOMAD_G_ASJ, + # GNOMAD_G_ASJ, GNOMAD_G_EAS, - GNOMAD_G_FIN, + # GNOMAD_G_FIN, GNOMAD_G_NFE, - GNOMAD_G_OTH, + # GNOMAD_G_OTH, GNOMAD_G_SAS ] # Possible pathogenicitySources: (POLYPHEN, MUTATION_TASTER, SIFT), (REVEL, MVP), CADD, REMM diff --git a/exomiser-cli/src/main/resources/examples/preset-genome-analysis.yml b/exomiser-cli/src/main/resources/examples/preset-genome-analysis.yml index daebb78d3..b28bfec98 100644 --- a/exomiser-cli/src/main/resources/examples/preset-genome-analysis.yml +++ b/exomiser-cli/src/main/resources/examples/preset-genome-analysis.yml @@ -21,25 +21,26 @@ frequencySources: [ EXAC_AFRICAN_INC_AFRICAN_AMERICAN, EXAC_AMERICAN, EXAC_SOUTH_ASIAN, EXAC_EAST_ASIAN, - EXAC_FINNISH, EXAC_NON_FINNISH_EUROPEAN, - EXAC_OTHER, + # EXAC_FINNISH, + EXAC_NON_FINNISH_EUROPEAN, + # EXAC_OTHER, GNOMAD_E_AFR, GNOMAD_E_AMR, - # GNOMAD_E_ASJ, + # GNOMAD_E_ASJ, GNOMAD_E_EAS, - GNOMAD_E_FIN, + # GNOMAD_E_FIN, GNOMAD_E_NFE, - GNOMAD_E_OTH, + # GNOMAD_E_OTH, GNOMAD_E_SAS, GNOMAD_G_AFR, GNOMAD_G_AMR, - # GNOMAD_G_ASJ, + # GNOMAD_G_ASJ, GNOMAD_G_EAS, - GNOMAD_G_FIN, + # GNOMAD_G_FIN, GNOMAD_G_NFE, - GNOMAD_G_OTH, + # GNOMAD_G_OTH, GNOMAD_G_SAS ] # Possible pathogenicitySources: (POLYPHEN, MUTATION_TASTER, SIFT), (REVEL, MVP), CADD, REMM diff --git a/exomiser-cli/src/main/resources/examples/test-analysis-exome.yml b/exomiser-cli/src/main/resources/examples/test-analysis-exome.yml index 86d8fabba..b2f2148c5 100644 --- a/exomiser-cli/src/main/resources/examples/test-analysis-exome.yml +++ b/exomiser-cli/src/main/resources/examples/test-analysis-exome.yml @@ -56,25 +56,26 @@ analysis: EXAC_AFRICAN_INC_AFRICAN_AMERICAN, EXAC_AMERICAN, EXAC_SOUTH_ASIAN, EXAC_EAST_ASIAN, - EXAC_FINNISH, EXAC_NON_FINNISH_EUROPEAN, - EXAC_OTHER, + # EXAC_FINNISH, + EXAC_NON_FINNISH_EUROPEAN, + # EXAC_OTHER, GNOMAD_E_AFR, GNOMAD_E_AMR, -# GNOMAD_E_ASJ, + # GNOMAD_E_ASJ, GNOMAD_E_EAS, - GNOMAD_E_FIN, + # GNOMAD_E_FIN, GNOMAD_E_NFE, - GNOMAD_E_OTH, + # GNOMAD_E_OTH, GNOMAD_E_SAS, GNOMAD_G_AFR, GNOMAD_G_AMR, - # GNOMAD_G_ASJ, + # GNOMAD_G_ASJ, GNOMAD_G_EAS, - GNOMAD_G_FIN, + # GNOMAD_G_FIN, GNOMAD_G_NFE, - GNOMAD_G_OTH, + # GNOMAD_G_OTH, GNOMAD_G_SAS ] # Possible pathogenicitySources: (POLYPHEN, MUTATION_TASTER, SIFT), (REVEL, MVP), CADD, REMM diff --git a/exomiser-cli/src/main/resources/examples/test-analysis-genome.yml b/exomiser-cli/src/main/resources/examples/test-analysis-genome.yml index 39d413287..172af1c6c 100644 --- a/exomiser-cli/src/main/resources/examples/test-analysis-genome.yml +++ b/exomiser-cli/src/main/resources/examples/test-analysis-genome.yml @@ -46,25 +46,26 @@ analysis: EXAC_AFRICAN_INC_AFRICAN_AMERICAN, EXAC_AMERICAN, EXAC_SOUTH_ASIAN, EXAC_EAST_ASIAN, - EXAC_FINNISH, EXAC_NON_FINNISH_EUROPEAN, - EXAC_OTHER, + # EXAC_FINNISH, + EXAC_NON_FINNISH_EUROPEAN, + # EXAC_OTHER, GNOMAD_E_AFR, GNOMAD_E_AMR, -# GNOMAD_E_ASJ, + # GNOMAD_E_ASJ, GNOMAD_E_EAS, - GNOMAD_E_FIN, + # GNOMAD_E_FIN, GNOMAD_E_NFE, - GNOMAD_E_OTH, + # GNOMAD_E_OTH, GNOMAD_E_SAS, GNOMAD_G_AFR, GNOMAD_G_AMR, - # GNOMAD_G_ASJ, + # GNOMAD_G_ASJ, GNOMAD_G_EAS, - GNOMAD_G_FIN, + # GNOMAD_G_FIN, GNOMAD_G_NFE, - GNOMAD_G_OTH, + # GNOMAD_G_OTH, GNOMAD_G_SAS ] # Possible pathogenicitySources: (POLYPHEN, MUTATION_TASTER, SIFT), (REVEL, MVP), CADD, REMM diff --git a/exomiser-cli/src/main/resources/examples/test-analysis-multisample.yml b/exomiser-cli/src/main/resources/examples/test-analysis-multisample.yml index 54800947a..ccc162838 100644 --- a/exomiser-cli/src/main/resources/examples/test-analysis-multisample.yml +++ b/exomiser-cli/src/main/resources/examples/test-analysis-multisample.yml @@ -45,25 +45,26 @@ analysis: EXAC_AFRICAN_INC_AFRICAN_AMERICAN, EXAC_AMERICAN, EXAC_SOUTH_ASIAN, EXAC_EAST_ASIAN, - EXAC_FINNISH, EXAC_NON_FINNISH_EUROPEAN, - EXAC_OTHER, + # EXAC_FINNISH, + EXAC_NON_FINNISH_EUROPEAN, + # EXAC_OTHER, GNOMAD_E_AFR, GNOMAD_E_AMR, -# GNOMAD_E_ASJ, + # GNOMAD_E_ASJ, GNOMAD_E_EAS, - GNOMAD_E_FIN, + # GNOMAD_E_FIN, GNOMAD_E_NFE, - GNOMAD_E_OTH, + # GNOMAD_E_OTH, GNOMAD_E_SAS, GNOMAD_G_AFR, GNOMAD_G_AMR, - # GNOMAD_G_ASJ, + # GNOMAD_G_ASJ, GNOMAD_G_EAS, - GNOMAD_G_FIN, + # GNOMAD_G_FIN, GNOMAD_G_NFE, - GNOMAD_G_OTH, + # GNOMAD_G_OTH, GNOMAD_G_SAS ] # Possible pathogenicitySources: (POLYPHEN, MUTATION_TASTER, SIFT), (REVEL, MVP), CADD, REMM diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/AnalysisPresetBuilder.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/AnalysisPresetBuilder.java index 97ac2cf7d..bb5876501 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/AnalysisPresetBuilder.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/AnalysisPresetBuilder.java @@ -63,17 +63,26 @@ class AnalysisPresetBuilder { FrequencySource.ESP_AFRICAN_AMERICAN, FrequencySource.ESP_ALL, FrequencySource.ESP_EUROPEAN_AMERICAN, FrequencySource.THOUSAND_GENOMES, FrequencySource.EXAC_AFRICAN_INC_AFRICAN_AMERICAN, FrequencySource.EXAC_AMERICAN, - FrequencySource.EXAC_EAST_ASIAN, FrequencySource.EXAC_FINNISH, - FrequencySource.EXAC_NON_FINNISH_EUROPEAN, FrequencySource.EXAC_SOUTH_ASIAN, FrequencySource.EXAC_OTHER, + FrequencySource.EXAC_EAST_ASIAN, + FrequencySource.EXAC_NON_FINNISH_EUROPEAN, FrequencySource.EXAC_SOUTH_ASIAN, FrequencySource.UK10K, FrequencySource.TOPMED, FrequencySource.GNOMAD_E_AFR, FrequencySource.GNOMAD_E_AMR, - //FrequencySource.GNOMAD_E_ASJ, - FrequencySource.GNOMAD_E_EAS, FrequencySource.GNOMAD_E_FIN, - FrequencySource.GNOMAD_E_NFE, FrequencySource.GNOMAD_E_OTH, FrequencySource.GNOMAD_E_SAS, + FrequencySource.GNOMAD_E_EAS, + FrequencySource.GNOMAD_E_NFE, + FrequencySource.GNOMAD_E_SAS, FrequencySource.GNOMAD_G_AFR, FrequencySource.GNOMAD_G_AMR, + FrequencySource.GNOMAD_G_EAS, + FrequencySource.GNOMAD_G_NFE, + FrequencySource.GNOMAD_G_SAS + // small/bottle-necked populations not suitable for allele frequency filtering + //FrequencySource.EXAC_FINNISH, + //FrequencySource.EXAC_OTHER, + //FrequencySource.GNOMAD_E_ASJ, + //FrequencySource.GNOMAD_E_FIN, + //FrequencySource.GNOMAD_E_OTH, //FrequencySource.GNOMAD_G_ASJ, - FrequencySource.GNOMAD_G_EAS, FrequencySource.GNOMAD_G_FIN, - FrequencySource.GNOMAD_G_NFE, FrequencySource.GNOMAD_G_OTH, FrequencySource.GNOMAD_G_SAS + //FrequencySource.GNOMAD_G_FIN, + //FrequencySource.GNOMAD_G_OTH, ); private static final HiPhiveOptions HI_PHIVE_OPTIONS = HiPhiveOptions.builder() From d5f1b2aa3c0073db4b0c657c888f850035185e30 Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Fri, 15 Sep 2023 13:50:02 +0100 Subject: [PATCH 06/17] Delete system.out from VariantEvaluation.getPathogenicityScore --- .../monarchinitiative/exomiser/core/model/VariantEvaluation.java | 1 - 1 file changed, 1 deletion(-) diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/VariantEvaluation.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/VariantEvaluation.java index 6b01e32a4..cd55207f8 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/VariantEvaluation.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/VariantEvaluation.java @@ -376,7 +376,6 @@ public float getPathogenicityScore() { float predictedScore = pathogenicityData.getScore(); float variantEffectScore = VariantEffectPathogenicityScore.getPathogenicityScoreOf(variantEffect); if (this.isSymbolic()) { - System.out.println(variantEffect + ": " + variantEffectScore); // SvAnna scoring https://genomemedicine.biomedcentral.com/articles/10.1186/s13073-022-01046-6/tables/1 // | element contains v // class | v contains t | v overlaps t | Coding or splice | UTR | Intronic | Promoter From 02bded61c45036a2d72119c852442e90e22f71d0 Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Fri, 15 Sep 2023 14:01:52 +0100 Subject: [PATCH 07/17] Fix broken AnalysisPresetBuilderTest --- .../core/analysis/AnalysisPresetBuilderTest.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/AnalysisPresetBuilderTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/AnalysisPresetBuilderTest.java index ab993ea1a..b74d729b7 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/AnalysisPresetBuilderTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/AnalysisPresetBuilderTest.java @@ -42,7 +42,16 @@ public class AnalysisPresetBuilderTest { private static final Set FREQUENCY_SOURCES = FrequencySource.ALL_EXTERNAL_FREQ_SOURCES.stream() - .filter(frequencySource -> frequencySource != FrequencySource.GNOMAD_E_ASJ && frequencySource != FrequencySource.GNOMAD_G_ASJ) + .filter(frequencySource -> !( + frequencySource == FrequencySource.EXAC_FINNISH || + frequencySource == FrequencySource.EXAC_OTHER || + frequencySource == FrequencySource.GNOMAD_E_ASJ || + frequencySource == FrequencySource.GNOMAD_G_ASJ || + frequencySource == FrequencySource.GNOMAD_E_FIN || + frequencySource == FrequencySource.GNOMAD_G_FIN || + frequencySource == FrequencySource.GNOMAD_E_OTH || + frequencySource == FrequencySource.GNOMAD_G_OTH + )) .collect(Collectors.toSet()); private final AnalysisPresetBuilder instance = new AnalysisPresetBuilder(new GenomeAnalysisServiceProvider(TestFactory From 082350b8bc9f7a3e3290a8d6318b2c2524056cc8 Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Fri, 15 Sep 2023 14:03:52 +0100 Subject: [PATCH 08/17] Update version to 13.3.0-RC1 --- exomiser-cli/pom.xml | 2 +- exomiser-core/pom.xml | 2 +- exomiser-data-genome/pom.xml | 2 +- exomiser-data-phenotype/pom.xml | 2 +- exomiser-rest-prioritiser/pom.xml | 2 +- exomiser-spring-boot-autoconfigure/pom.xml | 2 +- exomiser-spring-boot-starter/pom.xml | 2 +- exomiser-spring-boot-test/pom.xml | 2 +- exomiser-web/pom.xml | 2 +- phenix-repository/pom.xml | 2 +- pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/exomiser-cli/pom.xml b/exomiser-cli/pom.xml index c1e785208..8bde03d3c 100644 --- a/exomiser-cli/pom.xml +++ b/exomiser-cli/pom.xml @@ -32,7 +32,7 @@ org.monarchinitiative.exomiser exomiser - 13.2.1 + 13.3.0-RC1 diff --git a/exomiser-core/pom.xml b/exomiser-core/pom.xml index e7d15a4fc..3a8347d01 100644 --- a/exomiser-core/pom.xml +++ b/exomiser-core/pom.xml @@ -30,7 +30,7 @@ org.monarchinitiative.exomiser exomiser - 13.2.1 + 13.3.0-RC1 diff --git a/exomiser-data-genome/pom.xml b/exomiser-data-genome/pom.xml index b292dc24c..b51b0ecfb 100644 --- a/exomiser-data-genome/pom.xml +++ b/exomiser-data-genome/pom.xml @@ -31,7 +31,7 @@ org.monarchinitiative.exomiser exomiser - 13.2.1 + 13.3.0-RC1 diff --git a/exomiser-data-phenotype/pom.xml b/exomiser-data-phenotype/pom.xml index 1492bd2ba..600c71618 100644 --- a/exomiser-data-phenotype/pom.xml +++ b/exomiser-data-phenotype/pom.xml @@ -31,7 +31,7 @@ org.monarchinitiative.exomiser exomiser - 13.2.1 + 13.3.0-RC1 diff --git a/exomiser-rest-prioritiser/pom.xml b/exomiser-rest-prioritiser/pom.xml index 623db4ebd..df033a59d 100644 --- a/exomiser-rest-prioritiser/pom.xml +++ b/exomiser-rest-prioritiser/pom.xml @@ -27,7 +27,7 @@ org.monarchinitiative.exomiser exomiser - 13.2.1 + 13.3.0-RC1 exomiser-rest-prioritiser diff --git a/exomiser-spring-boot-autoconfigure/pom.xml b/exomiser-spring-boot-autoconfigure/pom.xml index d41058f40..d009f5a97 100644 --- a/exomiser-spring-boot-autoconfigure/pom.xml +++ b/exomiser-spring-boot-autoconfigure/pom.xml @@ -35,7 +35,7 @@ org.monarchinitiative.exomiser exomiser - 13.2.1 + 13.3.0-RC1 diff --git a/exomiser-spring-boot-starter/pom.xml b/exomiser-spring-boot-starter/pom.xml index 9ab01a3d1..b19714a57 100644 --- a/exomiser-spring-boot-starter/pom.xml +++ b/exomiser-spring-boot-starter/pom.xml @@ -28,7 +28,7 @@ org.monarchinitiative.exomiser exomiser - 13.2.1 + 13.3.0-RC1 exomiser-spring-boot-starter diff --git a/exomiser-spring-boot-test/pom.xml b/exomiser-spring-boot-test/pom.xml index 11fe37e80..140a43ce8 100644 --- a/exomiser-spring-boot-test/pom.xml +++ b/exomiser-spring-boot-test/pom.xml @@ -27,7 +27,7 @@ org.monarchinitiative.exomiser exomiser - 13.2.1 + 13.3.0-RC1 exomiser-spring-boot-test diff --git a/exomiser-web/pom.xml b/exomiser-web/pom.xml index bd7a7df89..77a4a73c8 100644 --- a/exomiser-web/pom.xml +++ b/exomiser-web/pom.xml @@ -31,7 +31,7 @@ org.monarchinitiative.exomiser exomiser - 13.2.1 + 13.3.0-RC1 diff --git a/phenix-repository/pom.xml b/phenix-repository/pom.xml index d369644c7..634c784a4 100644 --- a/phenix-repository/pom.xml +++ b/phenix-repository/pom.xml @@ -7,7 +7,7 @@ org.monarchinitiative.exomiser exomiser - 13.2.1 + 13.3.0-RC1 phenix-repository diff --git a/pom.xml b/pom.xml index 8f0387c29..6394ceec4 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ org.monarchinitiative.exomiser exomiser - 13.2.1 + 13.3.0-RC1 pom exomiser From defa3b7ed765691435ac8d840e0a530af27eac34 Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Tue, 19 Sep 2023 11:17:58 +0100 Subject: [PATCH 09/17] Fix fo #486 - replace whitespace with underscores in VCF `EXOMISER_ACMG_DISEASE_NAME` INFO sub-field --- .../core/writers/VcfResultsWriter.java | 2 +- .../core/writers/VcfResultsWriterTest.java | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/writers/VcfResultsWriter.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/writers/VcfResultsWriter.java index 35bcd351a..abacbd0f1 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/writers/VcfResultsWriter.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/writers/VcfResultsWriter.java @@ -220,7 +220,7 @@ private String buildVariantRecord(int rank, VariantEvaluation ve, GeneScore gene fields.add(assignment.map(AcmgAssignment::acmgClassification).orElse(AcmgClassification.NOT_AVAILABLE).toString()); fields.add(assignment.map(acmgAssignment -> toVcfAcmgInfo(acmgAssignment.acmgEvidence())).orElse("")); fields.add(assignment.map(acmgAssignment -> acmgAssignment.disease().getDiseaseId()).orElse("")); - fields.add('"' + assignment.map(acmgAssignment -> acmgAssignment.disease().getDiseaseName()).orElse("") + '"'); + fields.add('"' + assignment.map(acmgAssignment -> acmgAssignment.disease().getDiseaseName().replace(" ", "_")).orElse("") + '"'); return "{"+ String.join("|", fields) + "}"; } diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/writers/VcfResultsWriterTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/writers/VcfResultsWriterTest.java index c20f0dc5f..338f94ce5 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/writers/VcfResultsWriterTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/writers/VcfResultsWriterTest.java @@ -31,6 +31,10 @@ import org.monarchinitiative.exomiser.core.analysis.AnalysisResults; import org.monarchinitiative.exomiser.core.analysis.sample.Sample; import org.monarchinitiative.exomiser.core.analysis.util.InheritanceModeOptions; +import org.monarchinitiative.exomiser.core.analysis.util.acmg.AcmgAssignment; +import org.monarchinitiative.exomiser.core.analysis.util.acmg.AcmgClassification; +import org.monarchinitiative.exomiser.core.analysis.util.acmg.AcmgCriterion; +import org.monarchinitiative.exomiser.core.analysis.util.acmg.AcmgEvidence; import org.monarchinitiative.exomiser.core.filters.FilterResult; import org.monarchinitiative.exomiser.core.filters.FilterType; import org.monarchinitiative.exomiser.core.genome.TestFactory; @@ -45,6 +49,7 @@ import org.monarchinitiative.exomiser.core.model.pathogenicity.PathogenicitySource; import org.monarchinitiative.exomiser.core.model.pathogenicity.PolyPhenScore; import org.monarchinitiative.exomiser.core.prioritisers.OmimPriorityResult; +import org.monarchinitiative.exomiser.core.prioritisers.model.Disease; import java.io.BufferedReader; import java.io.FileInputStream; @@ -355,4 +360,50 @@ public void testHomozygousAltAlleleOutputVcfContainsConcatenatedVariantScoresOnO "GENE=FGFR2;INHERITANCE=AD;MIM=101600\tGT\t1/2\n"; assertThat(output, equalTo(expected)); } + + @Test + public void testAnnotatedVariantAcmgDiseaseNameWhitespaceIsReplacedWithUnderscore() { + GeneIdentifier geneIdentifier = GeneIdentifier.builder() + .geneId("6469") + // this should not have spaces in the VCF file + .geneSymbol("SHH alpha spaces") + .hgncId("HGNC:10848") + .hgncSymbol("SHH") + .entrezId("6469") + .ensemblId("ENSG00000164690") + .ucscId("uc003wmk.2") + .build(); + + Gene gene = new Gene(geneIdentifier); + VariantEvaluation shhFailedVariant = TestVariantFactory.buildVariant(7, 155604800, "C", "CT", SampleGenotype.het(), 30, 1.0); + shhFailedVariant.addFilterResult(FilterResult.pass(FilterType.VARIANT_EFFECT_FILTER)); + shhFailedVariant.addFilterResult(FilterResult.pass(FilterType.INHERITANCE_FILTER)); + shhFailedVariant.setCompatibleInheritanceModes(Set.of(ModeOfInheritance.AUTOSOMAL_DOMINANT)); + shhFailedVariant.setContributesToGeneScoreUnderMode(ModeOfInheritance.AUTOSOMAL_DOMINANT); + gene.addVariant(shhFailedVariant); + gene.addPriorityResult(new OmimPriorityResult(gene.getEntrezGeneID(), gene.getGeneSymbol(), 1f, Collections.emptyList(), Collections.emptyMap())); + gene.setCompatibleInheritanceModes(EnumSet.of(ModeOfInheritance.AUTOSOMAL_DOMINANT)); + + Disease diseaseNameWithSpaces = Disease.builder() + .diseaseId("DISEASE:1") + // this should not have spaces in the VCF file + .diseaseName("Name with spaces") + .build(); + + GeneScore adScore = GeneScore.builder() + .acmgAssignments(List.of(AcmgAssignment.of(shhFailedVariant, geneIdentifier, ModeOfInheritance.AUTOSOMAL_DOMINANT, diseaseNameWithSpaces, AcmgEvidence.of(Map.of(AcmgCriterion.BP1, AcmgCriterion.Evidence.MODERATE)), AcmgClassification.LIKELY_BENIGN))) + .contributingVariants(List.of(shhFailedVariant)) + .modeOfInheritance(ModeOfInheritance.AUTOSOMAL_DOMINANT) + .geneIdentifier(geneIdentifier) + .combinedScore(1.0) + .build(); + gene.addGeneScore(adScore); + + AnalysisResults analysisResults = buildAnalysisResults(sample, analysis, gene); + + String vcf = instance.writeString(analysisResults, settings); + final String expected = METADATA_HEADER + CHR_7_CONTIG_HEADER + SAMPLE_HEADER + + "7\t155604800\t.\tC\tCT\t1\tPASS\tExomiser={1|7-155604800-C-CT_AD|SHH_alpha_spaces|6469|AD|1.0000|1.0000|0.0000|0.0000|1.0000|1|0|frameshift_variant|SHH:uc003wmk.1:c.16dup:p.(Arg6Lysfs*58)|LIKELY_BENIGN|BP1_Moderate|DISEASE:1|\"Name_with_spaces\"}\tGT:RD\t0/1:30\n"; + assertThat(vcf, equalTo(expected)); + } } From 744fe618c8a7820633653014becd9171c38fafe3 Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Thu, 21 Sep 2023 10:02:24 +0100 Subject: [PATCH 10/17] Update logging to display hours, should an analysis take that long. --- .../exomiser/core/analysis/AbstractAnalysisRunner.java | 6 +++++- .../exomiser/core/genome/VariantFactoryImpl.java | 9 +++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/AbstractAnalysisRunner.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/AbstractAnalysisRunner.java index c33dd290b..c6e2947e3 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/AbstractAnalysisRunner.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/AbstractAnalysisRunner.java @@ -148,7 +148,11 @@ public AnalysisResults run(Sample sample, Analysis analysis) { Duration duration = Duration.between(timeStart, Instant.now()); long ms = duration.toMillis(); - logger.info("Finished analysis in {}m {}s {}ms ({} ms)", (ms / 1000) / 60 % 60, ms / 1000 % 60, ms % 1000, ms); + int hoursPart = duration.toHoursPart(); + if (hoursPart > 0) { + logger.info("Finished analysis in {}h {}m {}s {}ms ({} ms)", hoursPart, duration.toMinutesPart(), duration.toSecondsPart(), duration.toMillisPart(), ms); + } + logger.info("Finished analysis in {}m {}s {}ms ({} ms)", duration.toMinutesPart(), duration.toSecondsPart(), duration.toMillisPart(), ms); return analysisResults; } diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/genome/VariantFactoryImpl.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/genome/VariantFactoryImpl.java index 646d1dec3..1f914f2c0 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/genome/VariantFactoryImpl.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/genome/VariantFactoryImpl.java @@ -40,6 +40,8 @@ import java.nio.file.Path; import java.time.Duration; import java.time.Instant; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAccessor; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -234,8 +236,11 @@ void logCount() { variantRecords.get(), annotatedVariants.get(), structuralVariants.get()); } Duration duration = Duration.between(start, Instant.now()); - long ms = duration.toMillis(); - logger.info("Variant annotation finished in {}m {}s {}ms ({} ms)", (ms / 1000) / 60 % 60, ms / 1000 % 60, ms % 1000, ms); + int hoursPart = duration.toHoursPart(); + if (hoursPart > 0) { + logger.info("Variant annotation finished in {}h {}m {}s {}ms ({} ms)", hoursPart, duration.toMinutesPart(), duration.toSecondsPart(), duration.toMillisPart(), duration.toMillis()); + } + logger.info("Variant annotation finished in {}m {}s {}ms ({} ms)", duration.toMinutesPart(), duration.toSecondsPart(), duration.toMillisPart(), duration.toMillis()); } } } From 24ee98b4a7cffa9e394a3c145853c34f505b5310 Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Mon, 25 Sep 2023 12:05:39 +0100 Subject: [PATCH 11/17] Update Jannovar version 0.30 to 0.41 Update JannovarProtoConverter to handle new Alignment requirement Add tests to check handling of reading pre and post update Jannovar data Update JannovarVariantAnnotatorTest to check correct annotation of mitochondrial variants requiring use of the mitochondrial-specific encodings in the codon table --- .../jannovar/JannovarProtoConverter.java | 121 +++++++++--------- .../genome/JannovarVariantAnnotatorTest.java | 56 +++++++- .../core/genome/TranscriptModelUtilTest.java | 17 ++- .../JannovarDataProtoSerialiserTest.java | 3 +- .../JannovarDataSourceLoaderTest.java | 24 ++-- .../jannovar/JannovarProtoConverterTest.java | 17 +++ .../1710_hg19_transcripts_ensembl.ser | Bin 1160 -> 0 bytes ...19_transcripts_ensembl_exomiser_format.ser | Bin 0 -> 5345 bytes ...hg19_transcripts_ensembl_native_format.ser | Bin 0 -> 6618 bytes ...10_hg19_transcripts_ensembl_new_format.ser | Bin 503 -> 0 bytes ...19_transcripts_ensembl_exomiser_format.ser | Bin 0 -> 5396 bytes ...hg19_transcripts_ensembl_native_format.ser | Bin 0 -> 6775 bytes .../1710_hg19_transcripts_ensembl.ser | Bin 1160 -> 503 bytes .../1710_hg38_transcripts_ensembl.ser | Bin 1160 -> 503 bytes pom.xml | 2 +- 15 files changed, 158 insertions(+), 82 deletions(-) delete mode 100644 exomiser-core/src/test/resources/jannovar/1710_hg19_transcripts_ensembl.ser create mode 100644 exomiser-core/src/test/resources/jannovar/1710_hg19_transcripts_ensembl_exomiser_format.ser create mode 100644 exomiser-core/src/test/resources/jannovar/1710_hg19_transcripts_ensembl_native_format.ser delete mode 100644 exomiser-core/src/test/resources/jannovar/1710_hg19_transcripts_ensembl_new_format.ser create mode 100644 exomiser-core/src/test/resources/jannovar/2309_hg19_transcripts_ensembl_exomiser_format.ser create mode 100644 exomiser-core/src/test/resources/jannovar/2309_hg19_transcripts_ensembl_native_format.ser diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarProtoConverter.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarProtoConverter.java index 3f9941d86..8b755775c 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarProtoConverter.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarProtoConverter.java @@ -25,9 +25,7 @@ import de.charite.compbio.jannovar.data.JannovarData; import de.charite.compbio.jannovar.data.ReferenceDictionary; import de.charite.compbio.jannovar.data.ReferenceDictionaryBuilder; -import de.charite.compbio.jannovar.reference.GenomeInterval; -import de.charite.compbio.jannovar.reference.Strand; -import de.charite.compbio.jannovar.reference.TranscriptModel; +import de.charite.compbio.jannovar.reference.*; import org.monarchinitiative.exomiser.core.proto.JannovarProto; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -86,19 +84,19 @@ private static Function toProtoT .setGeneSymbol(transcriptModel.getGeneSymbol()) .setGeneID((transcriptModel.getGeneID() == null || transcriptModel.getGeneID() .equals(".")) ? "" : transcriptModel.getGeneID()) - .putAllAltGeneIds(replaceDotGeneIdWithEmpty(transcriptModel.getAltGeneIDs())) - .setTranscriptSupportLevel(transcriptModel.getTranscriptSupportLevel()) - .setSequence(transcriptModel.getSequence()) - .setCdsRegion(toProtoGenomeInterval(transcriptModel.getCDSRegion())) .setTxRegion(toProtoGenomeInterval(transcriptModel.getTXRegion())) + .setCdsRegion(toProtoGenomeInterval(transcriptModel.getCDSRegion())) .addAllExonRegions(toProtoExonRegions(transcriptModel.getExonRegions())) -// .setHasIndels(transcriptModel.isHasIndels()) -// .setHasSubstitutions(transcriptModel.isHasSubstitutions()) -// .setAlignment(toProtoSeqAlignment(transcriptModel.getSeqAlignment())) + .setSequence(transcriptModel.getSequence()) + .setTranscriptSupportLevel(transcriptModel.getTranscriptSupportLevel()) + .setHasSubstitutions(transcriptModel.isHasSubstitutions()) + .setHasIndels(transcriptModel.isHasIndels()) + .putAllAltGeneIds(replaceDotGeneIdWithEmpty(transcriptModel.getAltGeneIDs())) + .setAlignment(toProtoSeqAlignment(transcriptModel.getSeqAlignment())) .build(); } - private static final Pattern ENST_REPEAT_VERSION = Pattern.compile("ENST[0-9]{11}\\.[0-9]+\\.[0-9]+"); + private static final Pattern ENST_REPEAT_VERSION = Pattern.compile("ENST\\d{11}\\.\\d+\\.\\d+"); //TODO: REMOVE THIS for jannovar version 0.33! // fix bug in Jannovar 0.29 where the transcript version is duplicated @@ -137,21 +135,21 @@ private static List toProtoExonRegions(List toProtoAnchors(List anchors) { -// List protoAnchors = new ArrayList<>(); -// anchors.forEach(anchor -> protoAnchors.add(JannovarProto.Anchor.newBuilder() -// .setGapPos(anchor.getGapPos()) -// .setSeqPos(anchor.getSeqPos()) -// .build())); -// return protoAnchors; -// } + private static JannovarProto.Alignment toProtoSeqAlignment(Alignment alignment) { + return JannovarProto.Alignment.newBuilder() + .addAllRefAnchors(toProtoAnchors(alignment.getRefAnchors())) + .addAllQryAnchors(toProtoAnchors(alignment.getQryAnchors())) + .build(); + } + + private static List toProtoAnchors(List anchors) { + List protoAnchors = new ArrayList<>(); + anchors.forEach(anchor -> protoAnchors.add(JannovarProto.Anchor.newBuilder() + .setGapPos(anchor.getGapPos()) + .setSeqPos(anchor.getSeqPos()) + .build())); + return protoAnchors; + } public static JannovarData toJannovarData(JannovarProto.JannovarData protoJannovarData) { logger.debug("Converting to jannovar data..."); @@ -175,30 +173,31 @@ private static ReferenceDictionary toReferenceDictionary(JannovarProto.Reference public static Function toTranscriptModel(ReferenceDictionary referenceDictionary) { return protoTranscriptModel -> new TranscriptModel( - protoTranscriptModel.getAccession(), - protoTranscriptModel.getGeneSymbol(), - toGenomeInterval(referenceDictionary, protoTranscriptModel.getTxRegion()), - toGenomeInterval(referenceDictionary, protoTranscriptModel.getCdsRegion()), - toExonRegions(referenceDictionary, protoTranscriptModel.getExonRegionsList()), - protoTranscriptModel.getSequence(), - protoTranscriptModel.getGeneID(), - protoTranscriptModel.getTranscriptSupportLevel(), - protoTranscriptModel.getAltGeneIdsMap() - ); -// new TranscriptModel( -// protoTranscriptModel.getAccession(), -// protoTranscriptModel.getGeneSymbol(), -// toGenomeInterval(referenceDictionary, protoTranscriptModel.getTxRegion()), -// toGenomeInterval(referenceDictionary, protoTranscriptModel.getCdsRegion()), -// toExonRegions(referenceDictionary, protoTranscriptModel.getExonRegionsList()), -// protoTranscriptModel.getSequence(), -// protoTranscriptModel.getGeneID(), -// protoTranscriptModel.getTranscriptSupportLevel(), -// protoTranscriptModel.getHasSubstitutions(), -// protoTranscriptModel.getHasIndels(), -// protoTranscriptModel.getAltGeneIdsMap(), -// toAlignment(protoTranscriptModel.getAlignment()) -// ); + protoTranscriptModel.getAccession(), + protoTranscriptModel.getGeneSymbol(), + toGenomeInterval(referenceDictionary, protoTranscriptModel.getTxRegion()), + toGenomeInterval(referenceDictionary, protoTranscriptModel.getCdsRegion()), + toExonRegions(referenceDictionary, protoTranscriptModel.getExonRegionsList()), + protoTranscriptModel.getSequence(), + protoTranscriptModel.getGeneID(), + protoTranscriptModel.getTranscriptSupportLevel(), + protoTranscriptModel.getHasSubstitutions(), + protoTranscriptModel.getHasIndels(), + protoTranscriptModel.getAltGeneIdsMap(), + protoTranscriptModel.hasAlignment() ? toAlignment(protoTranscriptModel.getAlignment()) : buildUngappedAlignment(protoTranscriptModel.getExonRegionsList()) + ); + } + + // Builds an alignment if there was one missing. This will be the case for data created before the 2302 data release. + // For Ensembl/MANE data there will be no difference. RefSeq will be affected, but this should be no different to the + // <= 2302 data. + private static Alignment buildUngappedAlignment(List exonRegions) { + // Jannovar TranscriptModelBuilder uses the sum of the exon lengths in all the GFF parser code. Only the TranscriptModel + // alt constructor uses the sequence length when calling Alignment.createUngappedAlignment + int exonsLength = exonRegions.stream().mapToInt(exon -> exon.getEndPos() - exon.getBeginPos()).sum(); + // Jannovar uses ImmutableList internally + List anchors = ImmutableList.of(new Anchor(0, 0), new Anchor(exonsLength, exonsLength)); + return new Alignment(anchors, anchors); } private static GenomeInterval toGenomeInterval(ReferenceDictionary refDict, JannovarProto.GenomeInterval protoGenomeInterval) { @@ -217,15 +216,15 @@ private static ImmutableList toExonRegions(ReferenceDictionary r return intervals.build(); } -// private static Alignment toAlignment(JannovarProto.Alignment protoAlignment) { -// ImmutableList refAnchors = toAnchors(protoAlignment.getRefAnchorsList()); -// ImmutableList qryAnchors = toAnchors(protoAlignment.getQryAnchorsList()); -// return new Alignment(refAnchors, qryAnchors); -// } -// -// private static ImmutableList toAnchors(List protoAnchors) { -// ImmutableList.Builder anchors = ImmutableList.builder(); -// protoAnchors.forEach(anchor -> anchors.add(new Anchor(anchor.getGapPos(), anchor.getSeqPos()))); -// return anchors.build(); -// } + private static Alignment toAlignment(JannovarProto.Alignment protoAlignment) { + ImmutableList refAnchors = toAnchors(protoAlignment.getRefAnchorsList()); + ImmutableList qryAnchors = toAnchors(protoAlignment.getQryAnchorsList()); + return new Alignment(refAnchors, qryAnchors); + } + + private static ImmutableList toAnchors(List protoAnchors) { + ImmutableList.Builder anchors = ImmutableList.builder(); + protoAnchors.forEach(anchor -> anchors.add(new Anchor(anchor.getGapPos(), anchor.getSeqPos()))); + return anchors.build(); + } } diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/JannovarVariantAnnotatorTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/JannovarVariantAnnotatorTest.java index 846eec179..407f2a665 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/JannovarVariantAnnotatorTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/JannovarVariantAnnotatorTest.java @@ -81,7 +81,7 @@ void testAnnotateMissenseVariant() { assertThat(transcriptAnnotation.getGeneSymbol(), equalTo("FGFR2")); assertThat(transcriptAnnotation.getAccession(), equalTo("uc021pzz.1")); assertThat(transcriptAnnotation.getDistanceFromNearestGene(), equalTo(0)); - assertThat(transcriptAnnotation.getHgvsGenomic(), equalTo("g.12278533A>C")); + assertThat(transcriptAnnotation.getHgvsGenomic(), equalTo("g.123256215T>G")); assertThat(transcriptAnnotation.getHgvsCdna(), equalTo("c.1694A>C")); assertThat(transcriptAnnotation.getHgvsProtein(), equalTo("p.(Glu565Ala)")); } @@ -104,11 +104,63 @@ void testAnnotateSpliceAcceptorVariant() { assertThat(transcriptAnnotation.getGeneSymbol(), equalTo("FGFR2")); assertThat(transcriptAnnotation.getAccession(), equalTo("uc021pzz.1")); assertThat(transcriptAnnotation.getDistanceFromNearestGene(), equalTo(0)); - assertThat(transcriptAnnotation.getHgvsGenomic(), equalTo("g.12291429A>C")); + assertThat(transcriptAnnotation.getHgvsGenomic(), equalTo("g.123243319T>G")); assertThat(transcriptAnnotation.getHgvsCdna(), equalTo("c.2196-2A>C")); assertThat(transcriptAnnotation.getHgvsProtein(), equalTo("p.?")); } + @Test + void testAnnotateMitochondrialAlternateCodonStopGainVariant() { + TranscriptModel tmMTCYB = new GeneTranscriptModelBuilder("MT-CYB", "HGNC:7427", "ENST00000361789.2", 25, de.charite.compbio.jannovar.reference.Strand.FWD, + "ATGACCCCAATACGCAAAACTAACCCCCTAATAAAATTAATTAACCACTCATTCATCGAC" + + "CTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGC" + + "CTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATGCACTACTCACCAGACGCCTCA" + + "ACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGC" + + "TACCTTCACGCCAATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGA" + + "GGCCTATATTACGGATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTG" + + "CTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTC" + + "TGAGGGGCCACAGTAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTA" + + "GTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACC" + + "TTTCACTTCATCTTGCCCTTCATTATTGCAGCCCTAGCAACACTCCACCTCCTATTCTTG" + + "CACGAAACGGGATCAAACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTC" + + "CACCCTTACTACACAATCAAAGACGCCCTCGGCTTACTTCTCTTCCTTCTCTCCTTAATG" + + "ACATTAACACTATTCTCACCAGACCTCCTAGGCGACCCAGACAATTATACCCTAGCCAAC" + + "CCCTTAAACACCCCTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATT" + + "CTCCGATCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATC" + + "CTAGCAATAATCCCCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTA" + + "AGCCAATCACTTTATTGACTCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGA" + + "CAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACA" + + "ACAATCCTAATCCTAATACCAACTATCTCCCTAATTGAAAACAAAATACTCAAATGGGCC" + + "T") + .buildTxRegion(14746, 15887) // zero-based coordinates + .buildCdsRegion(14746, 15887) + .addExon(14746, 15887) + .build(); + JannovarData jannovarData = new JannovarData(TestFactory.getDefaultRefDict(), ImmutableList.of(tmMTCYB));; + + JannovarVariantAnnotator jannovarVariantAnnotator = new JannovarVariantAnnotator(TestFactory.getDefaultGenomeAssembly(), jannovarData, ChromosomalRegionIndex.empty()); + + // see https://www.mitomap.org/foswiki/bin/view/MITOMAP/VariantsCoding for know variants + // MT-CYB m.15150G>A p.(Trp135*) + // MT-CYB m.15722T>A p.(Trp326*) + List annotations = annotate(jannovarVariantAnnotator, "MT", 15150, "G", "A"); + assertThat(annotations.size(), equalTo(1)); + + VariantAnnotation variantAnnotation = annotations.get(0); + + assertThat(variantAnnotation.getGeneId(), equalTo("HGNC:7427")); + assertThat(variantAnnotation.getGeneSymbol(), equalTo("MT-CYB")); + assertThat(variantAnnotation.getVariantEffect(), equalTo(VariantEffect.STOP_GAINED)); + assertThat(variantAnnotation.hasTranscriptAnnotations(), is(true)); + TranscriptAnnotation transcriptAnnotation = variantAnnotation.getTranscriptAnnotations().get(0); + assertThat(transcriptAnnotation.getGeneSymbol(), equalTo("MT-CYB")); + assertThat(transcriptAnnotation.getAccession(), equalTo("ENST00000361789.2")); + assertThat(transcriptAnnotation.getDistanceFromNearestGene(), equalTo(0)); + assertThat(transcriptAnnotation.getHgvsGenomic(), equalTo("g.15150G>A")); // should be NC_012920.1:m.15150G>A + assertThat(transcriptAnnotation.getHgvsCdna(), equalTo("c.404G>A")); + assertThat(transcriptAnnotation.getHgvsProtein(), equalTo("p.(Trp135*)")); // p.(Ter135=) using the standard eukaryotic codon table + } + @Test void testAnnotateDownstreamVariant() { // This transcript is on the negative strand diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/TranscriptModelUtilTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/TranscriptModelUtilTest.java index bbb9195ca..a4019a7b8 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/TranscriptModelUtilTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/TranscriptModelUtilTest.java @@ -21,12 +21,11 @@ package org.monarchinitiative.exomiser.core.genome; import com.google.common.collect.ImmutableList; -import de.charite.compbio.jannovar.reference.GenomeInterval; -import de.charite.compbio.jannovar.reference.HG19RefDictBuilder; -import de.charite.compbio.jannovar.reference.Strand; -import de.charite.compbio.jannovar.reference.TranscriptModel; +import de.charite.compbio.jannovar.reference.*; import org.junit.jupiter.api.Test; +import java.util.Map; + import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; @@ -45,7 +44,7 @@ void getTranscriptAccessionNullTranscriptModel() { @Test void getTranscriptAccession() { TranscriptModel transcriptModel = new TranscriptModel("ENST12345678", null, TX_REGION, TX_REGION, - ImmutableList.of(TX_REGION), null, null, 0); + ImmutableList.of(TX_REGION), null, null, 0, false, false, Map.of(), Alignment.createUngappedAlignment(TX_REGION.length())); assertThat(TranscriptModelUtil.getTranscriptAccession(transcriptModel), equalTo("ENST12345678")); } @@ -57,14 +56,14 @@ void getTranscriptGeneIdNullTranscriptModel() { @Test void getTranscriptNullGeneIdNullTranscriptModelGeneId() { TranscriptModel transcriptModel = new TranscriptModel(null, null, TX_REGION, TX_REGION, - ImmutableList.of(TX_REGION), null, null, 0); + ImmutableList.of(TX_REGION), null, null, 0, false, false, Map.of(), Alignment.createUngappedAlignment(TX_REGION.length())); assertThat(TranscriptModelUtil.getTranscriptGeneId(transcriptModel), equalTo("")); } @Test void getTranscriptGeneId() { TranscriptModel transcriptModel = new TranscriptModel(null, null, TX_REGION, TX_REGION, - ImmutableList.of(TX_REGION), null, "GENE:12345", 0); + ImmutableList.of(TX_REGION), null, "GENE:12345", 0, false, false, Map.of(), Alignment.createUngappedAlignment(TX_REGION.length())); assertThat(TranscriptModelUtil.getTranscriptGeneId(transcriptModel), equalTo("GENE:12345")); } @@ -76,14 +75,14 @@ void getTranscriptGeneSymbolNullTranscriptModel() { @Test void getTranscriptNullGeneSymbolNullTranscriptModelGeneSymbol() { TranscriptModel transcriptModel = new TranscriptModel(null, null, TX_REGION, TX_REGION, - ImmutableList.of(TX_REGION), null, null, 0); + ImmutableList.of(TX_REGION), null, null, 0, false, false, Map.of(), Alignment.createUngappedAlignment(TX_REGION.length())); assertThat(TranscriptModelUtil.getTranscriptGeneSymbol(transcriptModel), equalTo(".")); } @Test void getTranscriptGeneSymbol() { TranscriptModel transcriptModel = new TranscriptModel(null, "SYMBOL", TX_REGION, TX_REGION, - ImmutableList.of(TX_REGION), null, null, 0); + ImmutableList.of(TX_REGION), null, null, 0, false, false, Map.of(), Alignment.createUngappedAlignment(TX_REGION.length())); assertThat(TranscriptModelUtil.getTranscriptGeneSymbol(transcriptModel), equalTo("SYMBOL")); } } \ No newline at end of file diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarDataProtoSerialiserTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarDataProtoSerialiserTest.java index 7213f5248..175be08fc 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarDataProtoSerialiserTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarDataProtoSerialiserTest.java @@ -62,6 +62,7 @@ public void roundTrip() throws Exception { @Test public void incorrectFileFormatThrowsException() throws Exception { Path protoJannovarPath = getTempFile(); - assertThrows(InvalidFileFormatException.class, () -> JannovarDataProtoSerialiser.load(protoJannovarPath)); + Exception exception = assertThrows(InvalidFileFormatException.class, () -> JannovarDataProtoSerialiser.load(protoJannovarPath)); + assertThat(exception.getMessage(), equalTo(protoJannovarPath + " not an Exomiser format Jannovar transcript database.")); } } \ No newline at end of file diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarDataSourceLoaderTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarDataSourceLoaderTest.java index e1ff8244b..caa2b5b0c 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarDataSourceLoaderTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarDataSourceLoaderTest.java @@ -20,12 +20,16 @@ package org.monarchinitiative.exomiser.core.genome.jannovar; +import de.charite.compbio.jannovar.UncheckedJannovarException; import de.charite.compbio.jannovar.data.JannovarData; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import java.nio.file.Path; import java.nio.file.Paths; +import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -36,17 +40,21 @@ public class JannovarDataSourceLoaderTest { @Test - public void loadsOldFormatData() { - Path jannovarDataPath = Paths.get("src/test/resources/jannovar/1710_hg19_transcripts_ensembl.ser"); - JannovarData jannovarData = JannovarDataSourceLoader.loadJannovarData(jannovarDataPath); - assertThat(jannovarData, instanceOf(JannovarData.class) ); + public void failsToLoadPreviousNativeJannovarVersionFormatData() { + Path jannovarDataPath = Paths.get("src/test/resources/jannovar/1710_hg19_transcripts_ensembl_native_format.ser"); + Exception exception = assertThrows(UncheckedJannovarException.class, () -> JannovarDataSourceLoader.loadJannovarData(jannovarDataPath)); + assertThat(exception.getMessage(), equalTo("src/test/resources/jannovar/1710_hg19_transcripts_ensembl_native_format.ser was created by Jannovar 0.30 but we need at least 0.33-SNAPSHOT")); } - @Test - public void loadsNewFormatData() { - Path jannovarDataPath = Paths.get("src/test/resources/jannovar/1710_hg19_transcripts_ensembl_new_format.ser"); + @ParameterizedTest + @CsvSource({ + "src/test/resources/jannovar/2309_hg19_transcripts_ensembl_native_format.ser", // jannovar native format >= 0.33 + "src/test/resources/jannovar/1710_hg19_transcripts_ensembl_exomiser_format.ser", // jannovar exomiser format < 0.33 + "src/test/resources/jannovar/2309_hg19_transcripts_ensembl_exomiser_format.ser" // jannovar exomiser format >= 0.33 + }) + public void loadJannovarData(Path jannovarDataPath) { JannovarData jannovarData = JannovarDataSourceLoader.loadJannovarData(jannovarDataPath); - assertThat(jannovarData, instanceOf(JannovarData.class) ); + assertThat(jannovarData, instanceOf(JannovarData.class)); } @Test diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarProtoConverterTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarProtoConverterTest.java index 4888f5862..b6752e8c5 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarProtoConverterTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/genome/jannovar/JannovarProtoConverterTest.java @@ -25,6 +25,8 @@ import org.monarchinitiative.exomiser.core.genome.TestFactory; import org.monarchinitiative.exomiser.core.proto.JannovarProto; +import java.nio.file.Path; + import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; @@ -56,4 +58,19 @@ public void thereAndBackAgain() { void testTrimDuplicatedVersionFromEnst() { assertThat(JannovarProtoConverter.trimDuplicatedEnsemblVersion("ENST00000523072.11.11"), equalTo("ENST00000523072.11")); } + + @Test + void canLoadPreJannovar041Data() { + // jannovar exomiser format < 0.33 + JannovarData v30Data = JannovarDataSourceLoader.loadJannovarData(Path.of("src/test/resources/jannovar/1710_hg19_transcripts_ensembl_exomiser_format.ser")); + // jannovar exomiser format >= 0.33 + JannovarData v41Data = JannovarDataSourceLoader.loadJannovarData(Path.of("src/test/resources/jannovar/2309_hg19_transcripts_ensembl_exomiser_format.ser")); + // jannovarData does not implement equals, so we need to test the internals manually + assertThat(v30Data.getRefDict().getContigNameToID(), equalTo(v41Data.getRefDict().getContigNameToID())); + assertThat(v30Data.getRefDict().getContigIDToLength(), equalTo(v41Data.getRefDict() + .getContigIDToLength())); + assertThat(v30Data.getRefDict().getContigIDToName(), equalTo(v41Data.getRefDict().getContigIDToName())); + assertThat(v30Data.getTmByGeneSymbol(), equalTo(v41Data.getTmByGeneSymbol())); + assertThat(v30Data.getTmByAccession(), equalTo(v41Data.getTmByAccession())); + } } \ No newline at end of file diff --git a/exomiser-core/src/test/resources/jannovar/1710_hg19_transcripts_ensembl.ser b/exomiser-core/src/test/resources/jannovar/1710_hg19_transcripts_ensembl.ser deleted file mode 100644 index f6e960f11e0c3f4e7fafee61568d1beec1ea8439..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1160 zcmV;31b6#NRzyM{iwFP!000000L_<6Xk1kofX}`2NG6j^-jC5fd_=T_-rITPQPVaFlrXFj90;0;|7s`F`dNABwgJOeAjRKE^RXMLYWUY>%L!isL9dwJ+2&wR+(9H z-4?Sd4qdkz%Vp9R(5*GQ${1NF*LY{Sya~&j-Q`WOy!kraq5<`)RE)5F&k8zxiXrB{ z)LE%kX|u`O-XYhCUM3mQ_zLyt<&InN9Y#(cDW;agY?lYtZt(M%=iLlB!jK~j7-8(+ z#q4Do*p_3zM{6(pfeYtCbfRyP_}jF@4`h6^ykqTJrek?^^R>zjpJI8FBzG;RMVlhx zzILM(bh{a%n*rTE{dwc7k>)8!C#2or(`I>KqfxJt$7r1fV}ITGdhf;uOFGd?BoWTr z4#-HiZI>*UhAsU53!TLC$}^(nc&Xq!=Ss^<6s-k`Txms#Txs(XxzZLSa-}Uw zVJw2ND2ydA zmV|K@3=u&dA`n{7Lj*$Wd5A!0ZG-<`<^St4_6@17O0^yxn}8t{85F}PMo^5R7(+3R zVgkh^iYXM+C}vP(Q9Oa-NfgIW97k~i#Yq%Tp?Dg_Gbo-FVpfRf4wwfnP`39FqOC_8 zj}qYkmeGQUDBsg?70pzXuGf4jBs!oC0L2a$zEgHobF@z9`L zXiy+@tOz<*039=4#|+moqjk(+p1ESRYeH-a@g}dUORBmmO0$8b+2|?FQElaQGliWP zIdzm5M%ivM{$?4(aTmRs2S9DLB2>2pweqMAI zFc+Gihn`+{Ozn=V-3hfjsdo3N-Ti8JO6?v{yVGj-pxQm8c4yS?VYPci?H*OT$JFj| zwR=MCo>aT1)b44udq(Zf9_o%7qmoA=5-+PqC)-80!8$z|*ZpM>r5fQ6Z1afudT?|s a96fiG-xr6h+juuFu>BtwmF9iE4FCY_06;?k diff --git a/exomiser-core/src/test/resources/jannovar/1710_hg19_transcripts_ensembl_exomiser_format.ser b/exomiser-core/src/test/resources/jannovar/1710_hg19_transcripts_ensembl_exomiser_format.ser new file mode 100644 index 0000000000000000000000000000000000000000..d1cf20ca9b074a7134767175d75caee7b61e213c GIT binary patch literal 5345 zcmV<76dvnJR8T@6iwFP!00000|Am`vtY+0!$9-V#yxigC@bET}#t>qg8%!qmxp(Hy z3}1B3cDhkJ7-4COCiX+qMB{6;ElEFBL9`$(p}bjA(gc!r)F`bi5z1W*Jr*pHZ7kkrz z>AY;}#olyqIzO9wu{Ui^Q#SQtZ#pzxkWIbVn+{L&Z0g0{bY!|Pn|iS|ZLCihsVR!R zX)#@#O}*HgHl|CmsTZ3Z-acL0FE>p4`sMg^S%2=hw=2@=_bK&9D7B~NE4yd&*`i&} zn$I@cDjh*si_5i{?!T?Rs&$ z_Wmwu*FLdJ=d-uB%f9*ShIYAZK0AK-uHCcg%eTDz-c~qky8YSLeyLsmk z$@I!+PwZ=jOQ(;$cJt4)!oKPC?|kx2m+#zt*>vLfXY&X5uCBi4o$KpIZv3_P?r*ZJ z*IswcbsLwTH_i6VuK3D{6N|OKd+EgDO6s3`zSW<3@xQu{-Pg0dqkhwR7wwh)HV?E;+Y`Mr@6+hLmG*L*S{sv!=FunD$BrKR zOYPVDY--f|@U=I_T56weJkw|0I`rOKU$gaf6#n&leSk_&QR@?p2bpo77ISP8>x+xw z`kF&{bkb+p`-(q(5zMInwx#qj3rnjZijaMKqP-guu~=xIG;dMtjjXv3Lu?9%KT7V9mnH?+vnP<7g6SVN2Zy&C;`Oy5=R((@1- zs+^j{7{;<%Z?W2txEq@pwNSN~EVJwK=o3S#Yy#pgM$haN%9kn|Z!-6);p30R4i||x z-U&Izxv1!I91(P&OVrp6w`lLvjY-Ej;+Vy&{jfRmjB{ydOU%5B&qCYcc$=5(tMI1r zM2)?3X@Nx{jztMEgc0bniY*LN5R(kkfGy}UvpDyjU2vM?IK&>r)v8olGYbO}g1&m^ zVsYT`;=s`>SI<9o?e)iwAAQ?9>alB&z2m2UYTg^_djHvI4;@?_ZGQIHwSL{PU+Q=B z#fw*WT~n_uy=k=le!P@$`>e^Mm}E%|Emj zR(fOcJMVkn{^m*FTHh)oy?VtT-G6dr?eG8g)XJ6AAAY>m|LHGJtz5P3{{KF3GV6E# zb*ta~#Hhdekr!6hZvN;CS^u{OTm6xTM*V?XUu^x~_F~q*`Esj2cWTt1e*LADwR_+H z?X17};cu_3y>{2AfAyhOzxxxT{@C|h{p+uf`l-8KURnFr-7jbTu1~i5O%IRycfQc- zpZ?;g-|=dz-}b#xfAaNK|KlHw`p0iSwX*h^503SJ^CPYPwfjf?kuRM>UK^kOvF-%o zH@r$XmeT8TGW{sjIM+3w>}pjTHI%ad!CB;<0V^NNvonRVtDt{;u@Z>Cf)FL@!}EDqcF5GjBH}~ z=&lAeJe=XZt7I6$kRJ;#P~_g_;)IkyPEsRmz3>SLst;pK!_j7A7Pu3fuA>kVhaCkWLMc2&4-C2DD&VHH@!RIE;MQ?r_X_L5&iRg**+v0Prb{ zZJd(yU?Bb$6`V) zcuZV3BE~V9aBCQbil20#A7{7f;piN=g?Qs+#jy{3j4vHV zg|3aovYDahAc)Xm=96YxhmY;>%Az`qime%vOIXBAL$(FQmY>G}xaIt@EV9>u$%?CU z6;SfPeX(T$d$IYUAT=NEg7TPgpcD&ih7Hg`kBA_qBNN#-#(+GS52&u=B(JoYAv4yOnN5kYeAc>6$U60w|ON@wu5LzWb4-v`gV-N@@*i}8OqgG3>u!ywqoDE1+E>`h>@7M^jQ>iPe40^S31{_%@V2sn9;V28t znwS9-gAoTrP9dakh`|7k@-{`$f7}Ja$UGSHEN;nz5F(5LB{3!~77GaD!ig?}B(H?) z4wo!4%b*B|!5xPz&dk&ox`JLPsFtmAd3zL81d1gl#8H)^O~Mg7A=!2?T&>n0u(C z4+#}{rV@?_2_=~;To+K8GlqZ1c*{9s-fbg?qjEP|u`zBN_F^OM<3U`yQ0w)0#H7pWv z10sZ)$=}MK3b~mWIES2FXgNJVXjd$%|Y-a@TIgh-}=8eDk>-!h;v#-DAn&1O>UGe^>o|>(F9fBsLO=KYO_&w=7fL@&AvmTXCZ6%k^| zr4!|5NK6^=7PJ6LD;iu^05~N%R6?gJgyh5lj5tgTOqnHig81jGSFzmr7+gUSlBq>O zJp>bg3fPqlw$eBNJ;E2U*+pTr$QD5X7lgOuxZFftC>Bu6p&>>B%Mw6W8FLv!5z;6> zq@NCdKBhp7v&9||O%+gE@$^G3;69ZQiPHBqnvWx)oqCt^J8 zy2X6(lL{h)sbQO{a6wHFS4Kia(WmU?Hg1*`rCPEbz@?mhaJ0r@O7xj&ydjWaAjHsy z-Y91QwI=7FoK+RYTTALc+@;QyMud8y*}(W?r6to}oOPWZi9&pbdy>xybZb5(IFvCz z=Ssqao>;Ppc|c+%ONogR6RTX7w1FNB$RGnFg<>(V&7|f`R8r=xT(q9C!c;0}e~@6t ziZ#)a=MtH|W1h5rX(OyN6Ry(rsx@!7W|=U+n$>O9lI;HYB_br6Go>06`@%>mHQ*yL zklmD2ctUMK6VwcXx27VOR5J;)DEt?pQj@nxtYL~9lY!LLmXx~!(R%fc=Jk&JaL>5t zkF1~J8RNA#=E&9$A2@t;e!6SyF78ani2K{v?igPuRkpr(*KfUh|Hgdfx}(Pr+vVr% zn_cmZ4?KEo?eQ-?dhE(x`{!F*?b&-CJ$BW&clT|oedhL7d+B!7PJOV|9{Z4L-@BvL zZn{&o&)wDU-L2Z6-=h&WUVaOhjBJe97$|;E2P7(|C?8yt0plRLBHpT`4(2Va1I|NH z^>BbPH@Ltg3uNEeC52vbR*8THIZwA02wqHSX1t5()d-B0^cCA7rOJeH)#S;(IL9~O zCj3toJCSr#Nw>p^!7>%kq(W8b=V`(O@|A)CZ*US!UKdscXh#-|P^J#{S|PoQ_YcG? zuUQq&E78n~0#TNX32@;WCnr$Si9k$cU_3l23Xqln2oKOVad-}lmIxDo*JU<+*iMYU zqLP~Ah9U;gjxt~=$227)1~Hf-rd7n}6orMBSs90cf=I$7gRfn&WJJJ)I9-`Bx{Nre z4rHyNoMjS53?QDqPhp`#nwp;&6ap~hJLr+{X2f`SMu9rB2+9M#l3x%Js}CGAPk{ zburYUJW%_p1cf+;5DM|Qx|Nd@j5KU@l z$z*wU;i6$nNo5#L9};h*+~6KUom04Bsc^+=theRaD-uN~d5XL@5wJLkdV~r2a}d=tH3VK&qzA(^++C zjabf-luzb6M5aX4ALb)nAiRwdD@CM}sI^j-6t`FzOIxf{#a_cVn~ZAaJzyW<6q1Bh zn3w{0%Z19ynP;r#qW|F=@dcRh^tH;%nKUyK`uZTThzw62QHRr$qY}}Sne}3_-#Wo2 z2O63O#jGzSmP3^xLghoN9u~VQcFRaLd$L-J0Aafo`pL6c#{G&wim>=R`or zOY|=R(ij}0o?br)FE~N97S2a-$td1-IY-g=WH5XB(~8CR}4^KbI2N$(P;WsZ56 zRgg+0T({)zV6p`8<#L zXL3MzCl<_ydvMu#>hma?i0h(BiZwPlS2Ce^496YnEHIoa%0D3mr)ufqhv|5Nhr! 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 YN?*$NSahT8e`xLh0J6E!e4S4K0G`srS^xk5 literal 0 HcmV?d00001 diff --git a/exomiser-core/src/test/resources/jannovar/1710_hg19_transcripts_ensembl_new_format.ser b/exomiser-core/src/test/resources/jannovar/1710_hg19_transcripts_ensembl_new_format.ser deleted file mode 100644 index 94f8df34ee181f08d068aa3bb623ebbce1b3eec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 503 zcmV+Ick2zJ`o?99F^1+h_5 z*hqq4V`HsguY@gvf@tA_C?bLoEFuI8S0T0{Vxvt8QIu#QKEQ+!6wfhptMl<+xXj$} zy&rm^iD1GY%$z%aL1KuJN`l1DMLG!*Ll2oGNDO^=Nst%@@RJ}h43SNO#4tjT1c_mc zToNQdOhp}pVJ`IaWuj7qyi1}|jDky|QWr&+M5P`|E{RHglwA^)27pVV(hwDwM5Pg| zOQO;kRhLAjxPw}f{!=MJ-6c^eM#CkM@34rbW(h6L0@}%|sP9Wh`{Jqf0%J|YNm&zf z($;i28EbkR&ze5Rw`Rb}S~KJX){HngYsS_OLd&P-=D88Kz>T>@ZkJo)_PAwkp9}7Q zTj375mOJ8Bxw@}r`SaX5SNAoz`mm-oi=37H5txgokI-`=<#Xv*lN(h%B}yKTi??wjX^yPUNujXZ08n;`ZY=M~OVvZ>$Lg z?7aPYgecXtDm0ukKc=2WBFj2wF51WSwi;bsu4iZ(|+MUi5HT?KE tIY890^?J8KG_bukYY|P{+gmjHcC9$9Z9Af4sXa4=)QWq%njb88O++`_Am_ z4FBla>-4VLUE^{!MHBl+(?sLXXj_v0RRz(4R6=(PmXr|7+D)^zC9Sq~sX&d!G{#g@ zWdn(gP`d@XTQ!kNNvZdq&-dJSb~mZR>^%40=XvgrbI(2Jd%ovke0J-2VLX}+qw)6f zmUsU0Z?{rym<^Y!p_OXG@^FP3TB$ay3|rLDO0{ACu%L!kstv2dRyDLzZ8$J&Q$s7& zhP7e48d|9~tPeZX&`Mj!mrs|5@p#90q0OunThnyd8BML&nr6eUXlljQv^-oHO|96P zR)*ct)QYWX|8P|_wPI^p9foLX#nyCSxH_6zu{Es?lW1zi*0erc6HTpHn`TSH9yNKf zHBEjdnp&~S;qAlq?Q-X^w_OeoH?-#tmwH7y?LMXU2&MYeWMTVgGMd)Q z<&)8@Uapvomg{B9WVBK*3zO0Qdf7S|t=7x7$>>16Y@dwQ>Sf1dv_9FoeLSfmuh*UR zI<41T^*XE9E9-T+UU%2)O1)lHulwtDsMpncy}Dix)a#^P*Xs3}dTssfnN%Uv>$UaT z`n#@P+r+M)jNV=^dncni>*a>Y=o?7jc>)3vaDcE9hqzOZvVe$P9Xme%k3mG|zevdl-0 z9y&U^arZFVJG$vhr%z88|L)b()0?S(=A~MH{*}|y+cw=l`Ndv8^>nR&;MrdP*o(FP z+DpCuxwGnTc4CK>R7%SAUrHq>%VxDuveja{)N3u|*66?fK>bs4u77ihHh(qe`fBm# zE!BV4x~?6R`djbo+163JX|0R;N_(3JYNz#y)>&!OXuYNSa-CWolZxiiCfCOH9@|Ux zx3t-0ueafIYxK3`HeG+F&AN72T5oO5*4B~u*Y33eGCg^%P1GM`#%)^6u}Z8h&WCGj zcHz-Un`P_E|FlIgqxM^u(#A|IExRaO_VtPSu1myxp>5K`(vl~as(T!hdcjLut z$J-9&BdIlwTjBQU>hj98Ht+Q2JMKJu@Mqo@X7}LE@wT5!clgtn9r}L!jE?RZUpC&l z{lt#p#E!{jlPH~7blW|f{?_~6x3Buwx8}FXbdPWPgGbLUEdKr9o?p0``pKtj{hz*Y ze&M!F_y6~?vr&KOuWSAIGrj)$M_yi7yyv4YNB!SER_mvp==I0$d!_b&|0_}d#<^O5 z@qDkJdGpnU#fRVjt*F29p>HiLzHzMAzx+h4AOEvnf9iX+{?#{o{rs_W3ya@8elF_A zK3?m0pX~K-|3$5T@^iiZ;On)1|95-+**9zb55M2*CmuMzu=uGD_Vs_`BenjOM|=I$ z=g%Xr*(YyluEBrZ*SNb$tuEKo4oLRXp5w`;Y`M1@_C)_>OtIVxPb9y=akD}v1vk-* zir&Mlb=y)H$~&Y7b9<#WpB5%B3^g+-vJmo#Z4Ulwn~>WCmg&CB4=^SLi;-kckR$faGp4`D*fT!|1Q^1M7egLxRGeUOv)|_B zwo=07(j?!+pZ#g=X!0(T;eF&lEPh#=+s_@yHAnrzprJ2Jf zUi>6_?T<%?55u>y1Q$9 zqek(^T%Lxv01hR_Hcm1hrM$^7~=Jl<;UJpGaf!kXE0Pk zy5^_NI70=r>@zBYMjSC8-bHlK4rxm*?PodNJ9ACkBoL91D4HY8S6Qy+^B%0i5V zXsRtdU}M%OMP^lM%R8<-pkh~3UsaOgb5LU-msj{C3;*IHq96oZ0oz?fvicYVf(&+5 z59_Gq6f1S7R@5o+VwO`fOgK@Hb~GjrXh%s?$HEzpRpOqavn-2&=6Qe-N}?VVn8mlFmQ=aLABWz0Rk%lILSNGcWiXJ(rsJe0i_%ph7y5oJOE%zJk8R|3u#BIc&V z*y^r~+ynwy*km`Rl9>A<=`fBfX*lGDw<0X!beVR;Fv^0F*cvGUk$;dE_{!oZkQj?d znGJ*mz}q{1%VA?mmaZu}_H|{!BH1X{Z7an3*huV+v{x_&`6`6U(rrY9HSj_vVsrS? z{UL6(AbnhR#HA)*2iuY5`wL(rNQjJK!;-m5A~(YfCQ%tBW&;wHixn%-IyM6DQ0j~- zgI=wlfr6|9F#73^Ae9A1O?-ig*YE=(r{K~z#9#nNd7C6o!0!TKWFCxpreeX45F+#e zB{3!~ZVL!ggcFMllDrbG+g-9KE`vBAGA}q}F=?j0&=vGTp|)&Qk+(-dMXOj~LL5~} z+9VutA!OM^Va<^izR`UeAU<`mN_&eYq=n=@X%Mf8cf-OFJfUEmw=Djohyvgkx~73v ziuFdoNx``V6f*R{wFm%bQhwk~w=!6Pf{Q4e9$$fPrxQfHnxt=`FC}~@o;u}VDz$N_ zx7Qph;9M_AR6ZGDp|UOk~~v#M}≤uWrQsLUC|zhk^*r;36g#jQp0AdbON z6JadD7IYa91kYVU#(*SoWr4+$(2kFp0+-3X#$m!%%UZhN&KVvH;)yQ!Cs5NRqHE!`gwex`^qG0fuR zgvuo*v5pYr#pJ8NNkByniv)@R5nRpWZ{<&g+)TV&fwGr%5nwR|ePKI&zvxI~%78F} zPK!xQoO7{xN%!#j3G1R0Cg46_NW_CsCSfq5`%OQ$Z<)dg!x zukD%hgFBobTwYyUudNr*gD`uIOAL0f@qYUc-1Tek+BdzFCw%;t;qhCXC!}<0H#wf= zyMFyw_f02P+;QlTvxM7jdjE6JjTXQ3_?gko)E_=m>yOp?ZJX}@&GXMi{i}DM87)5l z`~Ch)e{zQRXD4?-dmx&a4&5?i#lu3xk6rOS7*aKp$1eQxByi*Y#j5M4M zt0<8i*jVASz=SvzaiJCrp@W~K*h6R{&7q9q*W~Cci_{DdVnuN@RD+Y2Viidv2z83= zO5#UFX$W^`B~`FONg*T~X2N&cYho*fRB8zl#!6=`6

s!$D=Cg&fc>_2h|SQd!YW zj4dk)wPZU0Q89aGZjHkfm^4y;T_Da&h_`jUQGNr$O)f+Ett{d4l`>pDFWg;)v=J_v31{hg)|xk4 zvq&Rg&GM#d3eLa(5+@SlnbMMhh~cS}Fep7;5Z$Cucmi+%7Ss&dH-{ppP%{ZLi4+jc zl7r0%1Y(LNgO}9R=0v>0(|r4u>I>I@u)mzPN0u(~m;TzN`Lw0Am9>MD3ms;2aTmKw z+~4d{cX@KxaB`QsOG?Ln1a~=o*KfRg-)ypQ^x)w&yK&dv(M@0fz>^z`Pk;W&jhkET zpYN-+7e4&t#%=xH@%vT#)C0Bl>I15s|6r{>^~b7x_rY4b`ytgnbFAGvuG*h}SR>5N z-3opqb0g-4bU+EWB-$q_qnv{+<9HTD$5{y=jGo&JT#6#_?iOW)aEw7L$m+3o3e)@q z6D@TjpKdd7J(&{K_#D%#9z-i`EM`Qi7Afbf$&;xm9BPNAa79^6Mo?2JoDt^;dzDHg zAhN>55{69yfzmag5YC6m7sJ2+1Id^X_T)#> z6B9_`S|G6^i0=Ls1qk~9+$Sh7@qGozEfEG-&+~kIx2U)TMKC#t5JeYYAZ5!!j$vSW zykf9QOe=}|NeUq?GB^dc3epKf4HhqoJ3U%X#PrId(WS>sxub9mRahn=M+fcU5fwrz z{K@f=LLyj0zMV>OA4fchzZBFn3!YQ)d(cG@TU!uyo0b$zTTuvwDI_4nXU{)$A)>=$ zqIwY~$-R@ma| ziDPNP=2*e7w9-aG8B>Bs?o_~A8C+Dan5ZF6X-YvgDTXM*%oYj23?E%oj>AvJ1S`WA zPBHiH%VianBh1n%*bC7Q1lte@QW~kh(i8fWC_b^uVe@oWi?l|JXbO5Law8&MoFQ=Y z5iSspM@g6@f=V=8N^?3~4332@)~RBz;igSSHF6{{mGBQi*eZAofftK~%F0=Z2(Bnq z05^#*z=VgdRSwUjnUVb0CyhzOd2o(8oF(`yky4R`PbT}V6Kryzu6fYW`l@0+RO%vB z?lkLRF|lI8jI?wK2261w%(wzVc@_&cKyisYd~g%4a0Mh)7%!4U7#~xX-+f^2GUg3soiFeFyV?i!pFUlVoYiajxXHPeAC-H6as zZZne|NK$wc-p^V1tjH#I$t8uy!p?l@kb9chY0*_n=&b0PN|=O* zDanL$!s1f`@OoCz#8cqP3xlShIPoM2^3ZyyBzLztW-3LWvX+Rwiwq^P8&tHm6gCYP zTEqdezryhmy9wZ!yrE*J$bSYP1}<~>dI&f-!$OqA3upxv(e#14JXs-SR+JM>vOxhg z<{?g&;NaIyDL*~d1BA$+ATfnoLQRk;fKEP&^7K9L{>^>Mm(r47yLI^5txijN>Hh%0A2M(hIRF5}iF!N$ literal 0 HcmV?d00001 diff --git a/exomiser-core/src/test/resources/jannovar/2309_hg19_transcripts_ensembl_native_format.ser b/exomiser-core/src/test/resources/jannovar/2309_hg19_transcripts_ensembl_native_format.ser new file mode 100644 index 0000000000000000000000000000000000000000..136b75f59bbb265777169b5a70b865368250f2b5 GIT binary patch literal 6775 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 ZURU~JzQ>}^mi?{M{|5uZY4;{l0049BEV=*y literal 0 HcmV?d00001 diff --git a/exomiser-spring-boot-autoconfigure/src/test/resources/data/1710_hg19/1710_hg19_transcripts_ensembl.ser b/exomiser-spring-boot-autoconfigure/src/test/resources/data/1710_hg19/1710_hg19_transcripts_ensembl.ser index f6e960f11e0c3f4e7fafee61568d1beec1ea8439..3d6aec9490327dac618744989e109de8dca8b53c 100644 GIT binary patch literal 503 zcmV+Ick2zJ`o?99F^1+h_5 z*hqq4V`HsguY@gvf@tA_C?bLoEFuI8S0T0{Vxvt8QIu#QKEQ+!6wfhptMl<+xXj$} zy&rm^iD1GY%$z%aL1KuJN`l1DMLG!*Ll2oGNDO^=Nst%@@RJ}h43SNO#4tjT1c_mc zToNQdOhp}pVJ`IaWuj7qyi1}|jDky|QWr&+M5P`|E{RHglwA^)27pVV(hwDwM5Pg| zOQO;kRhLAjxPw}f{!=MJ-6c^eM#CkM@34rbW(h6L0@}%|sP9Wh`{Jqf0%J|YNm&zf z($;i28EbkR&ze5Rw`Rb}S~KJX){HngYsS_OLd&P-=D88Kz>T>@ZkJo)_PAwkp9}7Q zTj375mOJ8Bxw@}r`SaX5SNAoz`mm-oi=37H5txgokI-`=<#Xv*lN(h%B}yKTi??wjX^yPUNujXZ08n;`ZY=M~OVvZ>$Lg z?7aPYgecXtDm0ukKc=2WBFj2wF51WSwi;bsu4iZ(|+MUi5HT?KE tIY890^?J8KG_bukYY|P{+gmaFlrXFj90;0;|7s`F`dNABwgJOeAjRKE^RXMLYWUY>%L!isL9dwJ+2&wR+(9H z-4?Sd4qdkz%Vp9R(5*GQ${1NF*LY{Sya~&j-Q`WOy!kraq5<`)RE)5F&k8zxiXrB{ z)LE%kX|u`O-XYhCUM3mQ_zLyt<&InN9Y#(cDW;agY?lYtZt(M%=iLlB!jK~j7-8(+ z#q4Do*p_3zM{6(pfeYtCbfRyP_}jF@4`h6^ykqTJrek?^^R>zjpJI8FBzG;RMVlhx zzILM(bh{a%n*rTE{dwc7k>)8!C#2or(`I>KqfxJt$7r1fV}ITGdhf;uOFGd?BoWTr z4#-HiZI>*UhAsU53!TLC$}^(nc&Xq!=Ss^<6s-k`Txms#Txs(XxzZLSa-}Uw zVJw2ND2ydA zmV|K@3=u&dA`n{7Lj*$Wd5A!0ZG-<`<^St4_6@17O0^yxn}8t{85F}PMo^5R7(+3R zVgkh^iYXM+C}vP(Q9Oa-NfgIW97k~i#Yq%Tp?Dg_Gbo-FVpfRf4wwfnP`39FqOC_8 zj}qYkmeGQUDBsg?70pzXuGf4jBs!oC0L2a$zEgHobF@z9`L zXiy+@tOz<*039=4#|+moqjk(+p1ESRYeH-a@g}dUORBmmO0$8b+2|?FQElaQGliWP zIdzm5M%ivM{$?4(aTmRs2S9DLB2>2pweqMAI zFc+Gihn`+{Ozn=V-3hfjsdo3N-Ti8JO6?v{yVGj-pxQm8c4yS?VYPci?H*OT$JFj| zwR=MCo>aT1)b44udq(Zf9_o%7qmoA=5-+PqC)-80!8$z|*ZpM>r5fQ6Z1afudT?|s a96fiG-xr6h+juuFu>BtwmF9iE4FCY_06;?k diff --git a/exomiser-spring-boot-autoconfigure/src/test/resources/data/1710_hg38/1710_hg38_transcripts_ensembl.ser b/exomiser-spring-boot-autoconfigure/src/test/resources/data/1710_hg38/1710_hg38_transcripts_ensembl.ser index f6e960f11e0c3f4e7fafee61568d1beec1ea8439..3d6aec9490327dac618744989e109de8dca8b53c 100644 GIT binary patch literal 503 zcmV+Ick2zJ`o?99F^1+h_5 z*hqq4V`HsguY@gvf@tA_C?bLoEFuI8S0T0{Vxvt8QIu#QKEQ+!6wfhptMl<+xXj$} zy&rm^iD1GY%$z%aL1KuJN`l1DMLG!*Ll2oGNDO^=Nst%@@RJ}h43SNO#4tjT1c_mc zToNQdOhp}pVJ`IaWuj7qyi1}|jDky|QWr&+M5P`|E{RHglwA^)27pVV(hwDwM5Pg| zOQO;kRhLAjxPw}f{!=MJ-6c^eM#CkM@34rbW(h6L0@}%|sP9Wh`{Jqf0%J|YNm&zf z($;i28EbkR&ze5Rw`Rb}S~KJX){HngYsS_OLd&P-=D88Kz>T>@ZkJo)_PAwkp9}7Q zTj375mOJ8Bxw@}r`SaX5SNAoz`mm-oi=37H5txgokI-`=<#Xv*lN(h%B}yKTi??wjX^yPUNujXZ08n;`ZY=M~OVvZ>$Lg z?7aPYgecXtDm0ukKc=2WBFj2wF51WSwi;bsu4iZ(|+MUi5HT?KE tIY890^?J8KG_bukYY|P{+gmaFlrXFj90;0;|7s`F`dNABwgJOeAjRKE^RXMLYWUY>%L!isL9dwJ+2&wR+(9H z-4?Sd4qdkz%Vp9R(5*GQ${1NF*LY{Sya~&j-Q`WOy!kraq5<`)RE)5F&k8zxiXrB{ z)LE%kX|u`O-XYhCUM3mQ_zLyt<&InN9Y#(cDW;agY?lYtZt(M%=iLlB!jK~j7-8(+ z#q4Do*p_3zM{6(pfeYtCbfRyP_}jF@4`h6^ykqTJrek?^^R>zjpJI8FBzG;RMVlhx zzILM(bh{a%n*rTE{dwc7k>)8!C#2or(`I>KqfxJt$7r1fV}ITGdhf;uOFGd?BoWTr z4#-HiZI>*UhAsU53!TLC$}^(nc&Xq!=Ss^<6s-k`Txms#Txs(XxzZLSa-}Uw zVJw2ND2ydA zmV|K@3=u&dA`n{7Lj*$Wd5A!0ZG-<`<^St4_6@17O0^yxn}8t{85F}PMo^5R7(+3R zVgkh^iYXM+C}vP(Q9Oa-NfgIW97k~i#Yq%Tp?Dg_Gbo-FVpfRf4wwfnP`39FqOC_8 zj}qYkmeGQUDBsg?70pzXuGf4jBs!oC0L2a$zEgHobF@z9`L zXiy+@tOz<*039=4#|+moqjk(+p1ESRYeH-a@g}dUORBmmO0$8b+2|?FQElaQGliWP zIdzm5M%ivM{$?4(aTmRs2S9DLB2>2pweqMAI zFc+Gihn`+{Ozn=V-3hfjsdo3N-Ti8JO6?v{yVGj-pxQm8c4yS?VYPci?H*OT$JFj| zwR=MCo>aT1)b44udq(Zf9_o%7qmoA=5-+PqC)-80!8$z|*ZpM>r5fQ6Z1afudT?|s a96fiG-xr6h+juuFu>BtwmF9iE4FCY_06;?k diff --git a/pom.xml b/pom.xml index 8f0387c29..b3a0766b0 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,7 @@ https://sonarcloud.io exomiser java - 0.30 + 0.41 1.0.2 2.24.1 31.1-jre From 9caabffdada7b0d0d53ef34d6b1c4abda090746c Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Mon, 25 Sep 2023 14:09:05 +0100 Subject: [PATCH 12/17] Fix for issue #511 typo in advanced_analysis.rst --- docs/advanced_analysis.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/advanced_analysis.rst b/docs/advanced_analysis.rst index c81843cc6..7e506ec9d 100644 --- a/docs/advanced_analysis.rst +++ b/docs/advanced_analysis.rst @@ -38,8 +38,9 @@ Sample It is recommended to provide Exomiser the input sample as in `Phenopacket `_ format. Exomiser will accept this in either JSON or YAML format. -probandId: +proband: ---------- +Identifier used for the proband in the VCF file. hpoIds: ------- From 3b4cc8825ff5ce8e0b06d10fe5715695bdb290d6 Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Mon, 25 Sep 2023 14:09:41 +0100 Subject: [PATCH 13/17] Update version to 13.3.0-RC2 --- exomiser-cli/pom.xml | 2 +- exomiser-core/pom.xml | 2 +- exomiser-data-genome/pom.xml | 2 +- exomiser-data-phenotype/pom.xml | 2 +- exomiser-rest-prioritiser/pom.xml | 2 +- exomiser-spring-boot-autoconfigure/pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/exomiser-cli/pom.xml b/exomiser-cli/pom.xml index 8bde03d3c..4d3aaf3a5 100644 --- a/exomiser-cli/pom.xml +++ b/exomiser-cli/pom.xml @@ -32,7 +32,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC1 + 13.3.0-RC2 diff --git a/exomiser-core/pom.xml b/exomiser-core/pom.xml index 3a8347d01..c38f3ad05 100644 --- a/exomiser-core/pom.xml +++ b/exomiser-core/pom.xml @@ -30,7 +30,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC1 + 13.3.0-RC2 diff --git a/exomiser-data-genome/pom.xml b/exomiser-data-genome/pom.xml index b51b0ecfb..3dd8be8b6 100644 --- a/exomiser-data-genome/pom.xml +++ b/exomiser-data-genome/pom.xml @@ -31,7 +31,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC1 + 13.3.0-RC2 diff --git a/exomiser-data-phenotype/pom.xml b/exomiser-data-phenotype/pom.xml index 600c71618..e38c0b116 100644 --- a/exomiser-data-phenotype/pom.xml +++ b/exomiser-data-phenotype/pom.xml @@ -31,7 +31,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC1 + 13.3.0-RC2 diff --git a/exomiser-rest-prioritiser/pom.xml b/exomiser-rest-prioritiser/pom.xml index df033a59d..22779bb24 100644 --- a/exomiser-rest-prioritiser/pom.xml +++ b/exomiser-rest-prioritiser/pom.xml @@ -27,7 +27,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC1 + 13.3.0-RC2 exomiser-rest-prioritiser diff --git a/exomiser-spring-boot-autoconfigure/pom.xml b/exomiser-spring-boot-autoconfigure/pom.xml index d009f5a97..07dd5870c 100644 --- a/exomiser-spring-boot-autoconfigure/pom.xml +++ b/exomiser-spring-boot-autoconfigure/pom.xml @@ -35,7 +35,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC1 + 13.3.0-RC2 From e1b6cf3d92f30cfe13c9d2237c8175155c214093 Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Mon, 25 Sep 2023 14:10:00 +0100 Subject: [PATCH 14/17] Update version to 13.3.0-RC2 --- exomiser-spring-boot-starter/pom.xml | 2 +- exomiser-spring-boot-test/pom.xml | 2 +- exomiser-web/pom.xml | 2 +- phenix-repository/pom.xml | 2 +- pom.xml | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/exomiser-spring-boot-starter/pom.xml b/exomiser-spring-boot-starter/pom.xml index b19714a57..ba9cdc2b4 100644 --- a/exomiser-spring-boot-starter/pom.xml +++ b/exomiser-spring-boot-starter/pom.xml @@ -28,7 +28,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC1 + 13.3.0-RC2 exomiser-spring-boot-starter diff --git a/exomiser-spring-boot-test/pom.xml b/exomiser-spring-boot-test/pom.xml index 140a43ce8..34be64c32 100644 --- a/exomiser-spring-boot-test/pom.xml +++ b/exomiser-spring-boot-test/pom.xml @@ -27,7 +27,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC1 + 13.3.0-RC2 exomiser-spring-boot-test diff --git a/exomiser-web/pom.xml b/exomiser-web/pom.xml index 77a4a73c8..5b01efdc0 100644 --- a/exomiser-web/pom.xml +++ b/exomiser-web/pom.xml @@ -31,7 +31,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC1 + 13.3.0-RC2 diff --git a/phenix-repository/pom.xml b/phenix-repository/pom.xml index 634c784a4..8b654afe8 100644 --- a/phenix-repository/pom.xml +++ b/phenix-repository/pom.xml @@ -7,7 +7,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC1 + 13.3.0-RC2 phenix-repository diff --git a/pom.xml b/pom.xml index 007aeecc5..2587e12d6 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC1 + 13.3.0-RC2 pom exomiser @@ -105,8 +105,8 @@ docker.io exomiser - 2302 - 2302 + 2309 + 2309 From ee42b99addcf6197cedd3813571171e5b821d87c Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Wed, 25 Oct 2023 14:06:01 +0100 Subject: [PATCH 15/17] Alter Acmg2015EvidenceAssigner.assignPM2 to ignore LOCAL population frequency, if present, --- .../util/acmg/Acmg2015EvidenceAssigner.java | 30 ++++++++-------- .../core/model/frequency/FrequencyData.java | 35 +++++++++++++++++++ .../core/model/frequency/FrequencySource.java | 1 + .../acmg/Acmg2015EvidenceAssignerTest.java | 17 ++++++++- .../model/frequency/FrequencyDataTest.java | 24 +++++++++++++ 5 files changed, 92 insertions(+), 15 deletions(-) diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssigner.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssigner.java index ee4797e81..2f1711da0 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssigner.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssigner.java @@ -233,6 +233,19 @@ private void assignPVS1(AcmgEvidence.Builder acmgEvidenceBuilder, VariantEvaluat } } + private boolean isLossOfFunctionEffect(VariantEffect variantEffect) { + return variantEffect == VariantEffect.INITIATOR_CODON_VARIANT + || variantEffect == VariantEffect.START_LOST + || variantEffect == VariantEffect.STOP_LOST + || variantEffect == VariantEffect.STOP_GAINED + || variantEffect == VariantEffect.FRAMESHIFT_ELONGATION + || variantEffect == VariantEffect.FRAMESHIFT_TRUNCATION + || variantEffect == VariantEffect.FRAMESHIFT_VARIANT + || variantEffect == VariantEffect.SPLICE_ACCEPTOR_VARIANT + || variantEffect == VariantEffect.SPLICE_DONOR_VARIANT + || variantEffect == VariantEffect.EXON_LOSS_VARIANT; + } + private boolean predictedToLeadToNmd(TranscriptAnnotation transcriptAnnotation) { // predicted to lead to NMD if in last exon or last 50bp of penultimate exon, or in single exon transcript boolean notInLastExon = transcriptAnnotation.getRank() < transcriptAnnotation.getRankTotal(); @@ -257,19 +270,6 @@ private boolean compatibleWithDominant(ModeOfInheritance modeOfInheritance) { return (probandSex == Individual.Sex.FEMALE || probandSex == Individual.Sex.UNKNOWN) && modeOfInheritance == ModeOfInheritance.X_DOMINANT; } - private boolean isLossOfFunctionEffect(VariantEffect variantEffect) { - return variantEffect == VariantEffect.INITIATOR_CODON_VARIANT - || variantEffect == VariantEffect.START_LOST - || variantEffect == VariantEffect.STOP_LOST - || variantEffect == VariantEffect.STOP_GAINED - || variantEffect == VariantEffect.FRAMESHIFT_ELONGATION - || variantEffect == VariantEffect.FRAMESHIFT_TRUNCATION - || variantEffect == VariantEffect.FRAMESHIFT_VARIANT - || variantEffect == VariantEffect.SPLICE_ACCEPTOR_VARIANT - || variantEffect == VariantEffect.SPLICE_DONOR_VARIANT - || variantEffect == VariantEffect.EXON_LOSS_VARIANT; - } - /** * PM3 "For recessive disorders, detected in trans with a pathogenic variant" * Note: This requires testing of parents (or offspring) to determine phase @@ -426,7 +426,9 @@ private void assignPM1(Map acmgEvidenceBuilder) { * and Middle Eastern (MID). */ private void assignPM2(AcmgEvidence.Builder acmgEvidenceBuilder, FrequencyData frequencyData, ModeOfInheritance modeOfInheritance) { - boolean absentFromDatabase = !frequencyData.hasKnownFrequency(); + // allow local frequency occurrences as these are unverifiable as to their size or content. Also do not use isRepresentedInDatabase() + // as this will exclude anything with an rsID which could be a ClinVar variant not seen in any population database. + boolean absentFromDatabase = frequencyData.isEmpty() || (frequencyData.size() == 1 && frequencyData.containsFrequencySource(FrequencySource.LOCAL)); boolean atVeryLowFrequencyIfRecessive = modeOfInheritance.isRecessive() && frequencyData.getMaxFreqForPopulation(FrequencySource.NON_FOUNDER_POPS) < 0.01f; if (absentFromDatabase || atVeryLowFrequencyIfRecessive) { acmgEvidenceBuilder.add(PM2, Evidence.SUPPORTING); diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencyData.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencyData.java index ceaf04d8d..c4e3824c8 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencyData.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencyData.java @@ -135,6 +135,41 @@ private int countNotNullFrequencies(Frequency[] sorted) { return notNull; } + /** + * + * @return the count of the frequencies + * @since 13.3.0 + */ + public int size() { + return size; + } + + /** + * Checks if there are any frequencies present. It is possible that there may be an rsID where there are no + * frequencies. For example, rare variants seen only in ClinVar. + * + * @return true if the count of the frequencies is zero + * @since 13.3.0 + */ + public boolean isEmpty() { + return size == 0; + } + + /** + * Checks whether the instance contains a given {@link FrequencySource}. + * @param frequencySource The frequency source to check for membership in the instance. + * @return true if the instance contains the given {@link FrequencySource} + * @since 13.3.0 + */ + public boolean containsFrequencySource(FrequencySource frequencySource) { + for (FrequencySource dataSource : sources) { + if (dataSource == frequencySource) { + return true; + } + } + return false; + } + public String getRsId() { return rsId; } diff --git a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencySource.java b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencySource.java index 90eaa63a9..9adaa2d68 100644 --- a/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencySource.java +++ b/exomiser-core/src/main/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencySource.java @@ -104,6 +104,7 @@ public enum FrequencySource { * this means any {@link FrequencySource} excluding Ashkenazi Jewish (ASJ), European Finnish (FIN), and * "Other" (OTH) populations (gnomAD v2) or Amish (AMI), Ashkenazi Jewish (ASJ), European Finnish (FIN), * Middle Eastern (MID), and "Other" (OTH) populations (gnomAD v3). + * @since 13.3.0 */ public static final Set NON_FOUNDER_POPS = Sets.immutableEnumSet( EnumSet.of( diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssignerTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssignerTest.java index 579d79e1e..b8de06468 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssignerTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/analysis/util/acmg/Acmg2015EvidenceAssignerTest.java @@ -187,7 +187,22 @@ void testAssignsPM2AutosomalDominant() { Acmg2015EvidenceAssigner instance = new Acmg2015EvidenceAssigner("proband", Pedigree.empty()); VariantEvaluation variantEvaluation = TestFactory.variantBuilder(10, 12345, "A", "G") // n.b. missing frequency data - will trigger PM2 - .frequencyData(FrequencyData.of()) + .frequencyData(FrequencyData.empty()) + .build(); + // Requires variant to be in gene associated with a disorder in order that any ACMG criteria can be applied + Disease cowdenSyndrome = Disease.builder().diseaseId("OMIM:158350").diseaseName("COWDEN SYNDROME 1; CWS1").inheritanceMode(InheritanceMode.AUTOSOMAL_RECESSIVE).diseaseType(Disease.DiseaseType.DISEASE).build(); + + AcmgEvidence acmgEvidence = instance.assignVariantAcmgEvidence(variantEvaluation, ModeOfInheritance.AUTOSOMAL_DOMINANT, List.of(variantEvaluation), List.of(cowdenSyndrome), List.of()); + + assertThat(acmgEvidence, equalTo(AcmgEvidence.builder().add(AcmgCriterion.PM2, Evidence.SUPPORTING).build())); + } + + @Test + void testAssignsPM2AutosomalDominantAllowsPresenceOfLocalFrequency() { + Acmg2015EvidenceAssigner instance = new Acmg2015EvidenceAssigner("proband", Pedigree.empty()); + VariantEvaluation variantEvaluation = TestFactory.variantBuilder(10, 12345, "A", "G") + // n.b. missing frequency data APART FROM LOCAL - will trigger PM2 + .frequencyData(FrequencyData.of(Frequency.of(FrequencySource.LOCAL, 0.019f))) .build(); // Requires variant to be in gene associated with a disorder in order that any ACMG criteria can be applied Disease cowdenSyndrome = Disease.builder().diseaseId("OMIM:158350").diseaseName("COWDEN SYNDROME 1; CWS1").inheritanceMode(InheritanceMode.AUTOSOMAL_RECESSIVE).diseaseType(Disease.DiseaseType.DISEASE).build(); diff --git a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencyDataTest.java b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencyDataTest.java index 2fd994592..fcac37903 100644 --- a/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencyDataTest.java +++ b/exomiser-core/src/test/java/org/monarchinitiative/exomiser/core/model/frequency/FrequencyDataTest.java @@ -309,4 +309,28 @@ public void testGetScoreRareVariant() { assertThat(instance.getScore(), equalTo(0.9857672f)); } + @Test + void testSize() { + Frequency maxFrequency = Frequency.of(THOUSAND_GENOMES, 100f); + FrequencyData instance = FrequencyData.of(maxFrequency); + assertThat(FrequencyData.empty().size(), equalTo(0)); + assertThat(instance.size(), equalTo(1)); + } + + @Test + void testIsEmpty() { + Frequency maxFrequency = Frequency.of(THOUSAND_GENOMES, 100f); + FrequencyData instance = FrequencyData.of(maxFrequency); + assertThat(FrequencyData.empty().isEmpty(), equalTo(true)); + assertThat(instance.isEmpty(), equalTo(false)); + } + + @Test + void testContainsFrequencySource() { + Frequency maxFrequency = Frequency.of(THOUSAND_GENOMES, 100f); + FrequencyData instance = FrequencyData.of(maxFrequency); + assertThat(FrequencyData.empty().containsFrequencySource(LOCAL), equalTo(false)); + assertThat(instance.containsFrequencySource(LOCAL), equalTo(false)); + assertThat(instance.containsFrequencySource(THOUSAND_GENOMES), equalTo(true)); + } } From a22e78b14fb1ff5264c12ecdb35c8939b680390e Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Wed, 25 Oct 2023 14:06:42 +0100 Subject: [PATCH 16/17] Update CHANGELOG.md in cli and core --- exomiser-cli/CHANGELOG.md | 10 ++++++++++ exomiser-core/CHANGELOG.md | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/exomiser-cli/CHANGELOG.md b/exomiser-cli/CHANGELOG.md index d4055653b..dfbdc9b60 100644 --- a/exomiser-cli/CHANGELOG.md +++ b/exomiser-cli/CHANGELOG.md @@ -1,5 +1,15 @@ # The Exomiser Command Line Executable - Changelog +## 13.3.0 2023-10-17 + +- Updated Jannovar version to 0.41 to fix incorrect MT codon table usage [#521](https://github.com/exomiser/Exomiser/issues/521) +- Downgraded PM2 - PM2_Supporting for variants lacking frequency information [#502](https://github.com/exomiser/Exomiser/issues/502). +- Updated AcmgEvidence to fit a Bayesian points-based system [#514](https://github.com/exomiser/Exomiser/issues/514) +- Removed ASJ, FIN, OTH ExAC and gnomAD populations from presets and examples [#513](https://github.com/exomiser/Exomiser/issues/513). +- Fix for regression causing `` variants to be incorrectly down-ranked +- Fix for issue [#486](https://github.com/exomiser/Exomiser/issues/486) where VCF output includes whitespace in INFO field. +- Logs will now display elapsed time correctly if an analysis runs over an hour (!). + ## 13.2.1 2023-06-30 - Fix for bug where all `` structural variants were given a maximal variant score of 1.0 regardless of their position on a transcript. diff --git a/exomiser-core/CHANGELOG.md b/exomiser-core/CHANGELOG.md index c3b386362..4ec2943a8 100644 --- a/exomiser-core/CHANGELOG.md +++ b/exomiser-core/CHANGELOG.md @@ -1,5 +1,29 @@ # The Exomiser - Core Library Changelog +## 13.3.0 2023-10-17 + +- Updated Jannovar version to 0.41 to fix incorrect MT codon table usage [#521](https://github.com/exomiser/Exomiser/issues/521) +- Downgraded PM2 - PM2_Supporting for variants lacking frequency information [#502](https://github.com/exomiser/Exomiser/issues/502). +- Updated Acgs2020Classifier and Acmg2015Classifier to allow for PVS1 and PM2_Supporting to be sufficient to trigger LIKELY_PATHOGENIC +- Updated AcmgEvidence to fit a Bayesian points-based system [#514](https://github.com/exomiser/Exomiser/issues/514) +- Removed ASJ, FIN, OTH ExAC and gnomAD populations from presets and examples [#513](https://github.com/exomiser/Exomiser/issues/513). +- Fix for regression causing `` variants to be incorrectly down-ranked +- Fix for issue [#486](https://github.com/exomiser/Exomiser/issues/486) where VCF output includes whitespace in INFO field. +- Logs will now display elapsed time correctly if an analysis runs over an hour (!). +- Updated exomiser-phenotype-data to take annotations from phenotype.hpoa [#351](https://github.com/exomiser/Exomiser/issues/351), [#373](https://github.com/exomiser/Exomiser/issues/373), [#379](https://github.com/exomiser/Exomiser/issues/379) +- Updated application.properties and ResourceConfigurationProperties to remove unused fields. +- Updated DiseaseInheritanceCacheReader and DiseasePhenotypeReader to parse phenotype.hpoa file +- Updated DiseaseResourceConfig to use hpoa resource + +New APIs: + +- New `Acmg2020PointsBasedClassifier` class +- New `FrequencyData.size()` method +- New `FrequencyData.isEmpty()` method +- New `FrequencyData.containsFrequencySource()` method +- New `FrequencyData.getMaxFreqForPopulation()` method +- New `FrequencySource.NON_FOUNDER_POPS` method + ## 13.2.1 2023-06-30 - Fix for bug where all `` structural variants were given a maximal variant score of 1.0 regardless of their position on a transcript. From e3b928a3049ab590ce301205a30c11b6eac17c40 Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Wed, 25 Oct 2023 14:07:25 +0100 Subject: [PATCH 17/17] Update version to 13.3.0 --- exomiser-cli/pom.xml | 2 +- exomiser-core/pom.xml | 2 +- exomiser-data-genome/pom.xml | 2 +- exomiser-data-phenotype/pom.xml | 2 +- exomiser-rest-prioritiser/pom.xml | 2 +- exomiser-spring-boot-autoconfigure/pom.xml | 2 +- exomiser-spring-boot-starter/pom.xml | 2 +- exomiser-spring-boot-test/pom.xml | 2 +- exomiser-web/pom.xml | 2 +- phenix-repository/pom.xml | 2 +- pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/exomiser-cli/pom.xml b/exomiser-cli/pom.xml index 4d3aaf3a5..bfadc46d3 100644 --- a/exomiser-cli/pom.xml +++ b/exomiser-cli/pom.xml @@ -32,7 +32,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC2 + 13.3.0 diff --git a/exomiser-core/pom.xml b/exomiser-core/pom.xml index c38f3ad05..e63d20334 100644 --- a/exomiser-core/pom.xml +++ b/exomiser-core/pom.xml @@ -30,7 +30,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC2 + 13.3.0 diff --git a/exomiser-data-genome/pom.xml b/exomiser-data-genome/pom.xml index 3dd8be8b6..bce60a511 100644 --- a/exomiser-data-genome/pom.xml +++ b/exomiser-data-genome/pom.xml @@ -31,7 +31,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC2 + 13.3.0 diff --git a/exomiser-data-phenotype/pom.xml b/exomiser-data-phenotype/pom.xml index e38c0b116..092b42d6f 100644 --- a/exomiser-data-phenotype/pom.xml +++ b/exomiser-data-phenotype/pom.xml @@ -31,7 +31,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC2 + 13.3.0 diff --git a/exomiser-rest-prioritiser/pom.xml b/exomiser-rest-prioritiser/pom.xml index 22779bb24..48d052b7b 100644 --- a/exomiser-rest-prioritiser/pom.xml +++ b/exomiser-rest-prioritiser/pom.xml @@ -27,7 +27,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC2 + 13.3.0 exomiser-rest-prioritiser diff --git a/exomiser-spring-boot-autoconfigure/pom.xml b/exomiser-spring-boot-autoconfigure/pom.xml index 07dd5870c..372a818ed 100644 --- a/exomiser-spring-boot-autoconfigure/pom.xml +++ b/exomiser-spring-boot-autoconfigure/pom.xml @@ -35,7 +35,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC2 + 13.3.0 diff --git a/exomiser-spring-boot-starter/pom.xml b/exomiser-spring-boot-starter/pom.xml index ba9cdc2b4..97f85ce0e 100644 --- a/exomiser-spring-boot-starter/pom.xml +++ b/exomiser-spring-boot-starter/pom.xml @@ -28,7 +28,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC2 + 13.3.0 exomiser-spring-boot-starter diff --git a/exomiser-spring-boot-test/pom.xml b/exomiser-spring-boot-test/pom.xml index 34be64c32..db9d1ae38 100644 --- a/exomiser-spring-boot-test/pom.xml +++ b/exomiser-spring-boot-test/pom.xml @@ -27,7 +27,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC2 + 13.3.0 exomiser-spring-boot-test diff --git a/exomiser-web/pom.xml b/exomiser-web/pom.xml index 5b01efdc0..af0e1986a 100644 --- a/exomiser-web/pom.xml +++ b/exomiser-web/pom.xml @@ -31,7 +31,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC2 + 13.3.0 diff --git a/phenix-repository/pom.xml b/phenix-repository/pom.xml index 8b654afe8..1728c682e 100644 --- a/phenix-repository/pom.xml +++ b/phenix-repository/pom.xml @@ -7,7 +7,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC2 + 13.3.0 phenix-repository diff --git a/pom.xml b/pom.xml index 2587e12d6..b1013ea1c 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ org.monarchinitiative.exomiser exomiser - 13.3.0-RC2 + 13.3.0 pom exomiser