`_
- to see the figure in full size.
+ RD-CDM data in a local REDCap project. The framework is also configurable
+ for disease-specific extensions or custom data models.
________________________________________________________________________________
@@ -69,7 +69,7 @@ Sections
8) :doc:`8_glossary`
9) :doc:`9_acknowledgements`
10) :doc:`10_license`
-11) :doc:`11_download_manifest`
+11) :doc:`12_contact`
________________________________________________________________________________
@@ -124,7 +124,6 @@ Additional Information
- :doc:`8_glossary`
- :doc:`9_acknowledgements`
- :doc:`10_license`
-- :doc:`11_download_manifest`
- :doc:`12_contact`
________________________________________________________________________________
diff --git a/pyproject.toml b/pyproject.toml
index b57899efa..7444f27f2 100755
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,20 +4,20 @@ build-backend = "setuptools.build_meta"
[project]
name = "rarelink"
-version = "2.0.5"
+version = "2.0.6"
description = "RareLink - A REDCap-based Python framework linking international registries to HL7 FHIR and GA4GH Phenopackets"
readme = "README.md"
requires-python = ">=3.10, <3.13"
license = { file = "LICENSE" }
authors = [
- {name = "Adam SL Graefe", email="adam.graefe@charite.de"},
- {name = "Filip Rehburg", email="filip.rehburg@charite.de"},
- {name = "Samer Alkarkoukly", email="mabbouda@uni-koeln.de"},
- {name = "Daniel Danis", email="daniel.danis@bih-charite.de"},
- {name = "Melissa A Haendel", email="mhaendel@email.unc.edu"},
- {name = "Peter N Robinson", email="peter.robinson@bih-charite.de"},
- {name = "Sylvia Thun", email="sylvia.thun@bih-charite.de"},
- {name = "Oya Beyan", email="oya.beyan@uni-koeln.de"}
+ {name = "Adam SL Graefe", email = "adam.graefe@charite.de"},
+ {name = "Filip Rehburg", email = "filip.rehburg@charite.de"},
+ {name = "Samer Alkarkoukly", email = "mabbouda@uni-koeln.de"},
+ {name = "Daniel Danis", email = "daniel.danis@bih-charite.de"},
+ {name = "Melissa A Haendel", email = "mhaendel@email.unc.edu"},
+ {name = "Peter N Robinson", email = "peter.robinson@bih-charite.de"},
+ {name = "Sylvia Thun", email = "sylvia.thun@bih-charite.de"},
+ {name = "Oya Beyan", email = "oya.beyan@uni-koeln.de"},
]
keywords = ["Rare Disease", "Interoperability", "FHIR", "Phenopacket Schema", "REDCap"]
classifiers = [
@@ -28,44 +28,31 @@ classifiers = [
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Intended Audience :: Science/Research",
- "Topic :: Scientific/Engineering :: Medical Science Apps."
+ "Topic :: Scientific/Engineering :: Medical Science Apps.",
]
dependencies = [
- "numpy",
- "pandas",
- "phenopackets",
+ "phenopackets",
"pyphetools",
- "pytest",
"requests",
- "config",
- "sphinx-autobuild",
- "sphinx-copybutton",
- "sphinx-rtd-theme",
"typer",
- "pytest-mock",
- "tqdm",
- "node",
- "npm",
+ "rich",
"linkml>=1.9.0",
"linkml-runtime>=1.9.0",
"pydantic<2.11",
- "schema-automator",
"python-dotenv",
- "docker",
- "rd-cdm>=2.0.2",
+ "rd-cdm>=2.0.3",
]
[project.optional-dependencies]
-# Dev/test/docs extras; NOT installed for end users
+fhir = ["docker"]
test = ["pytest>=7,<9", "pytest-mock"]
docs = ["sphinx>=7", "sphinx-rtd-theme>=1.3", "sphinx-copybutton>=0.5"]
-dev = [
- "build", "twine",
- "jupyter",
- "sphinx>=7", "sphinx-rtd-theme>=1.3", "sphinx-copybutton>=0.5",
- "pytest>=7,<9", "pytest-mock",
- "docker", # if you really need this for dev
+dev = [
+ "rarelink[fhir,test,docs]",
+ "build",
+ "twine",
+ "jupyter",
]
[project.urls]
@@ -76,7 +63,6 @@ Bugtracker = "https://github.com/BIH-CEI/RareLink/issues"
[project.scripts]
rarelink = "rarelink.cli:app"
-rarelink-cdm-generate = "rarelink.rd_cdm.codegen_cli:main"
[tool.setuptools]
package-dir = { "" = "src" }
@@ -87,13 +73,13 @@ where = ["src"]
include = ["rarelink*"]
[tool.setuptools.package-data]
-rarelink = ["rd_cdm/*", "rarelink_cdm/**/*", "*.yaml", "*.yml", "*.json", "*.csv", "*.tsv"]
+rarelink = ["rarelink_cdm/**/*", "tofhir/**/*", "*.yaml", "*.yml", "*.json", "*.csv", "*.tsv"]
[tool.setuptools.exclude-package-data]
rarelink = [
- "fsh/output/**",
- "fsh/fsh-generated",
- "fsh/input-cache",
- "fsh/temp",
- "fsh/template"
+ "fsh/output/**",
+ "fsh/fsh-generated",
+ "fsh/input-cache",
+ "fsh/temp",
+ "fsh/template",
]
\ No newline at end of file
diff --git a/pytest.ini b/pytest.ini
index 083214bfa..ee7d02951 100755
--- a/pytest.ini
+++ b/pytest.ini
@@ -8,6 +8,7 @@ filterwarnings =
ignore::DeprecationWarning:google.protobuf.internal.well_known_types
ignore:invalid escape sequence '\\_':SyntaxWarning
ignore:invalid escape sequence '\\ ':SyntaxWarning
+ ignore::UserWarning:rarelink.phenopackets.mappings
norecursedirs =
rarelink_cdm/python_datamodel
diff --git a/res/.DS_Store b/res/.DS_Store
deleted file mode 100755
index 221d5b6a9..000000000
Binary files a/res/.DS_Store and /dev/null differ
diff --git a/res/evaluation_cohort/fhir/evco_fhir_consents.json b/res/evaluation_cohort/fhir/evco_fhir_consents.json
index ade86dac9..4b791d4e7 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_consents.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_consents.json
@@ -42,7 +42,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "373066001",
"display": "Yes"
} ]
@@ -105,7 +105,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "373066001",
"display": "Yes"
} ]
@@ -168,7 +168,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "373066001",
"display": "Yes"
} ]
@@ -231,7 +231,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "373066001",
"display": "Yes"
} ]
@@ -294,7 +294,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "373066001",
"display": "Yes"
} ]
@@ -357,7 +357,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "373066001",
"display": "Yes"
} ]
@@ -421,7 +421,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "373066001",
"display": "Yes"
} ]
@@ -484,7 +484,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "373067005",
"display": "No"
} ]
@@ -547,7 +547,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "373066001",
"display": "Yes"
} ]
@@ -610,7 +610,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "373066001",
"display": "Yes"
} ]
diff --git a/res/evaluation_cohort/fhir/evco_fhir_diagnostic_implication.json b/res/evaluation_cohort/fhir/evco_fhir_diagnostic_implication.json
index a7834e77a..3484e9dca 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_diagnostic_implication.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_diagnostic_implication.json
@@ -53,7 +53,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53037-8",
"display": "Genetic variation clinical significance [Imp]"
} ]
@@ -61,7 +61,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA26332-9",
"display": "Likely pathogenic"
} ]
@@ -70,7 +70,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "81259-4",
"display": "Associated phenotype"
} ]
@@ -78,7 +78,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/mondo.owl",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"code": "0007843"
} ],
"text": "Genomic Diagnosis"
@@ -131,7 +131,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53037-8",
"display": "Genetic variation clinical significance [Imp]"
} ]
@@ -139,7 +139,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA26332-9",
"display": "Likely pathogenic"
} ]
@@ -148,7 +148,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "81259-4",
"display": "Associated phenotype"
} ]
@@ -156,7 +156,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/mondo.owl",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"code": "0007843"
} ],
"text": "Genomic Diagnosis"
@@ -209,7 +209,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53037-8",
"display": "Genetic variation clinical significance [Imp]"
} ]
@@ -217,7 +217,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA6668-3",
"display": "Pathogenic"
} ]
@@ -226,7 +226,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "81259-4",
"display": "Associated phenotype"
} ]
@@ -234,7 +234,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/mondo.owl",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"code": "0007843"
} ],
"text": "Genomic Diagnosis"
@@ -287,7 +287,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53037-8",
"display": "Genetic variation clinical significance [Imp]"
} ]
@@ -295,7 +295,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA6668-3",
"display": "Pathogenic"
} ]
@@ -304,7 +304,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "81259-4",
"display": "Associated phenotype"
} ]
@@ -312,7 +312,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/mondo.owl",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"code": "0007843"
} ],
"text": "Genomic Diagnosis"
@@ -365,7 +365,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53037-8",
"display": "Genetic variation clinical significance [Imp]"
} ]
@@ -373,7 +373,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA6668-3",
"display": "Pathogenic"
} ]
@@ -382,7 +382,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "81259-4",
"display": "Associated phenotype"
} ]
@@ -390,7 +390,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/mondo.owl",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"code": "0007843"
} ],
"text": "Genomic Diagnosis"
@@ -443,7 +443,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53037-8",
"display": "Genetic variation clinical significance [Imp]"
} ]
@@ -451,7 +451,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA6668-3",
"display": "Pathogenic"
} ]
@@ -460,7 +460,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "81259-4",
"display": "Associated phenotype"
} ]
@@ -468,7 +468,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/mondo.owl",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"code": "0007843"
} ],
"text": "Genomic Diagnosis"
@@ -521,7 +521,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53037-8",
"display": "Genetic variation clinical significance [Imp]"
} ]
@@ -529,7 +529,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA26332-9",
"display": "Likely pathogenic"
} ]
@@ -538,7 +538,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "81259-4",
"display": "Associated phenotype"
} ]
@@ -546,7 +546,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/mondo.owl",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"code": "0007843"
} ],
"text": "Genomic Diagnosis"
@@ -599,7 +599,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53037-8",
"display": "Genetic variation clinical significance [Imp]"
} ]
@@ -607,7 +607,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA26332-9",
"display": "Likely pathogenic"
} ]
@@ -616,7 +616,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "81259-4",
"display": "Associated phenotype"
} ]
@@ -624,7 +624,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/mondo.owl",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"code": "0007843"
} ],
"text": "Genomic Diagnosis"
@@ -677,7 +677,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53037-8",
"display": "Genetic variation clinical significance [Imp]"
} ]
@@ -685,7 +685,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA26332-9",
"display": "Likely pathogenic"
} ]
@@ -694,7 +694,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "81259-4",
"display": "Associated phenotype"
} ]
@@ -702,7 +702,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/mondo.owl",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"code": "0007843"
} ],
"text": "Genomic Diagnosis"
@@ -755,7 +755,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53037-8",
"display": "Genetic variation clinical significance [Imp]"
} ]
@@ -763,7 +763,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA26332-9",
"display": "Likely pathogenic"
} ]
@@ -772,7 +772,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "81259-4",
"display": "Associated phenotype"
} ]
@@ -780,7 +780,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/mondo.owl",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"code": "0007843"
} ],
"text": "Genomic Diagnosis"
diff --git a/res/evaluation_cohort/fhir/evco_fhir_family_member_history.json b/res/evaluation_cohort/fhir/evco_fhir_family_member_history.json
index e02311ec1..631feacdb 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_family_member_history.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_family_member_history.json
@@ -30,7 +30,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "373067005",
"display": "No"
} ]
@@ -40,7 +40,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "373067005",
"display": "No"
} ]
@@ -56,7 +56,7 @@
"relationship": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "60614009",
"display": "Natural brother"
} ]
@@ -64,7 +64,7 @@
"sex": {
"coding": [ {
"system": "http://hl7.org/fhir/ValueSet/administrative-gender",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "male",
"display": "Male"
} ]
@@ -75,7 +75,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/mondo.owl",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"code": "MONDO:0007843"
} ],
"text": "Family Member Disease [MONDO] - Indicates whether the selected family member is affected by the same RD as the individual or a different rare disease."
diff --git a/res/evaluation_cohort/fhir/evco_fhir_ips_measurement_radiology.json b/res/evaluation_cohort/fhir/evco_fhir_ips_measurement_radiology.json
index f7e24cceb..b514c9d82 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_ips_measurement_radiology.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_ips_measurement_radiology.json
@@ -36,7 +36,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org/",
- "version": "LNC278",
+ "version": "v281",
"code": "36554-4"
} ],
"text": "Measurements - Assay"
@@ -56,14 +56,14 @@
"interpretation": [ {
"coding": [ {
"system": "https://ncit.nci.nih.gov",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C3333"
} ]
} ],
"method": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399208008"
} ],
"text": "Measurement - Procedure"
diff --git a/res/evaluation_cohort/fhir/evco_fhir_labs.json b/res/evaluation_cohort/fhir/evco_fhir_labs.json
index e8e70e0af..4e7533826 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_labs.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_labs.json
@@ -36,7 +36,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "63364-4"
} ],
"text": "Measurements - Assay"
@@ -83,7 +83,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "63364-4"
} ],
"text": "Measurements - Assay"
@@ -130,7 +130,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
} ],
"text": "Measurements - Assay"
@@ -177,7 +177,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14672-7"
} ],
"text": "Measurements - Assay"
@@ -197,7 +197,7 @@
"interpretation": [ {
"coding": [ {
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C78801"
} ]
} ]
@@ -231,7 +231,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14672-7"
} ],
"text": "Measurements - Assay"
@@ -278,7 +278,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "63364-4"
} ],
"text": "Measurements - Assay"
@@ -325,7 +325,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "63364-4"
} ],
"text": "Measurements - Assay"
@@ -345,7 +345,7 @@
"interpretation": [ {
"coding": [ {
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C78800"
} ]
} ]
@@ -379,7 +379,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14672-7"
} ],
"text": "Measurements - Assay"
@@ -426,7 +426,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14672-7"
} ],
"text": "Measurements - Assay"
@@ -473,7 +473,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
} ],
"text": "Measurements - Assay"
@@ -520,7 +520,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14672-7"
} ],
"text": "Measurements - Assay"
@@ -567,7 +567,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "63364-4"
} ],
"text": "Measurements - Assay"
@@ -614,7 +614,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
} ],
"text": "Measurements - Assay"
@@ -661,7 +661,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
} ],
"text": "Measurements - Assay"
@@ -681,7 +681,7 @@
"interpretation": [ {
"coding": [ {
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C25640"
} ]
} ]
@@ -715,7 +715,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
} ],
"text": "Measurements - Assay"
@@ -762,7 +762,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
} ],
"text": "Measurements - Assay"
@@ -809,7 +809,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14672-7"
} ],
"text": "Measurements - Assay"
@@ -856,7 +856,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
} ],
"text": "Measurements - Assay"
@@ -903,7 +903,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "63364-4"
} ],
"text": "Measurements - Assay"
@@ -950,7 +950,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14672-7"
} ],
"text": "Measurements - Assay"
@@ -997,7 +997,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
} ],
"text": "Measurements - Assay"
@@ -1017,7 +1017,7 @@
"interpretation": [ {
"coding": [ {
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C14165"
} ]
} ]
@@ -1051,7 +1051,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
} ],
"text": "Measurements - Assay"
@@ -1098,7 +1098,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "63364-4"
} ],
"text": "Measurements - Assay"
@@ -1145,7 +1145,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
} ],
"text": "Measurements - Assay"
@@ -1192,7 +1192,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "63364-4"
} ],
"text": "Measurements - Assay"
@@ -1239,7 +1239,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "63364-4"
} ],
"text": "Measurements - Assay"
@@ -1259,7 +1259,7 @@
"interpretation": [ {
"coding": [ {
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C78800"
} ]
} ]
@@ -1293,7 +1293,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "63364-4"
} ],
"text": "Measurements - Assay"
@@ -1340,7 +1340,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14672-7"
} ],
"text": "Measurements - Assay"
@@ -1387,7 +1387,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14672-7"
} ],
"text": "Measurements - Assay"
@@ -1434,7 +1434,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
} ],
"text": "Measurements - Assay"
@@ -1481,7 +1481,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
} ],
"text": "Measurements - Assay"
@@ -1528,7 +1528,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "63364-4"
} ],
"text": "Measurements - Assay"
@@ -1548,7 +1548,7 @@
"interpretation": [ {
"coding": [ {
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C78800"
} ]
} ]
@@ -1582,7 +1582,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
} ],
"text": "Measurements - Assay"
@@ -1629,7 +1629,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
} ],
"text": "Measurements - Assay"
@@ -1676,7 +1676,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
} ],
"text": "Measurements - Assay"
@@ -1723,7 +1723,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "63364-4"
} ],
"text": "Measurements - Assay"
@@ -1770,7 +1770,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
} ],
"text": "Measurements - Assay"
@@ -1817,7 +1817,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
} ],
"text": "Measurements - Assay"
@@ -1864,7 +1864,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14672-7"
} ],
"text": "Measurements - Assay"
@@ -1911,7 +1911,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
} ],
"text": "Measurements - Assay"
@@ -1958,7 +1958,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
} ],
"text": "Measurements - Assay"
@@ -2005,7 +2005,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14672-7"
} ],
"text": "Measurements - Assay"
@@ -2052,7 +2052,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
} ],
"text": "Measurements - Assay"
@@ -2099,7 +2099,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
} ],
"text": "Measurements - Assay"
@@ -2119,7 +2119,7 @@
"interpretation": [ {
"coding": [ {
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C25640"
} ]
} ]
@@ -2153,7 +2153,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
} ],
"text": "Measurements - Assay"
@@ -2200,7 +2200,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
} ],
"text": "Measurements - Assay"
@@ -2220,7 +2220,7 @@
"interpretation": [ {
"coding": [ {
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C25640"
} ]
} ]
@@ -2254,7 +2254,7 @@
"code": {
"coding": [ {
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
} ],
"text": "Measurements - Assay"
diff --git a/res/evaluation_cohort/fhir/evco_fhir_observation_age_category.json b/res/evaluation_cohort/fhir/evco_fhir_observation_age_category.json
index 69fab790e..24c149130 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_observation_age_category.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_observation_age_category.json
@@ -29,7 +29,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "105727008",
"display": "Age Category"
} ]
@@ -41,7 +41,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "263659003",
"display": "Adolescence"
} ]
@@ -69,7 +69,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "105727008",
"display": "Age Category"
} ]
@@ -81,7 +81,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "263659003",
"display": "Adolescence"
} ]
@@ -109,7 +109,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "105727008",
"display": "Age Category"
} ]
@@ -121,7 +121,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "263659003",
"display": "Adolescence"
} ]
@@ -149,7 +149,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "105727008",
"display": "Age Category"
} ]
@@ -161,7 +161,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "263659003",
"display": "Adolescence"
} ]
@@ -189,7 +189,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "105727008",
"display": "Age Category"
} ]
@@ -201,7 +201,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "263659003",
"display": "Adolescence"
} ]
@@ -229,7 +229,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "105727008",
"display": "Age Category"
} ]
@@ -241,7 +241,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "263659003",
"display": "Adolescence"
} ]
@@ -269,7 +269,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "105727008",
"display": "Age Category"
} ]
@@ -281,7 +281,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "263659003",
"display": "Adolescence"
} ]
@@ -309,7 +309,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "105727008",
"display": "Age Category"
} ]
@@ -321,7 +321,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "263659003",
"display": "Adolescence"
} ]
@@ -349,7 +349,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "105727008",
"display": "Age Category"
} ]
@@ -361,7 +361,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "263659003",
"display": "Adolescence"
} ]
@@ -389,7 +389,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "105727008",
"display": "Age Category"
} ]
@@ -401,7 +401,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "255398004",
"display": "Childhood"
} ]
diff --git a/res/evaluation_cohort/fhir/evco_fhir_observation_gestation_at_birth.json b/res/evaluation_cohort/fhir/evco_fhir_observation_gestation_at_birth.json
index d8e87d05a..33cfbd6c3 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_observation_gestation_at_birth.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_observation_gestation_at_birth.json
@@ -29,7 +29,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "412726003",
"display": "Length of Gestation at Birth - weeks+days"
} ]
@@ -42,7 +42,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "412726003",
"display": "Length of Gestation at Birth - weeks"
} ]
@@ -57,7 +57,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "412726003",
"display": "Length of Gestation at Birth - days"
} ]
diff --git a/res/evaluation_cohort/fhir/evco_fhir_observation_karyotypic_sex.json b/res/evaluation_cohort/fhir/evco_fhir_observation_karyotypic_sex.json
index 8ceeddcf8..0eb48f33c 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_observation_karyotypic_sex.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_observation_karyotypic_sex.json
@@ -29,7 +29,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "1296886006",
"display": "Karyotypic Sex"
} ]
@@ -40,7 +40,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "734876009",
"display": "XY"
} ]
diff --git a/res/evaluation_cohort/fhir/evco_fhir_observation_length_of_gestation_at_birth.json b/res/evaluation_cohort/fhir/evco_fhir_observation_length_of_gestation_at_birth.json
index e3489dcfa..d6dfb0f16 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_observation_length_of_gestation_at_birth.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_observation_length_of_gestation_at_birth.json
@@ -15,7 +15,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "412726003",
"display": "Length of Gestation at Birth - weeks+days"
} ]
@@ -28,7 +28,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "412726003",
"display": "Length of Gestation at Birth - weeks"
} ]
@@ -43,7 +43,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "412726003",
"display": "Length of Gestation at Birth - days"
} ]
diff --git a/res/evaluation_cohort/fhir/evco_fhir_observation_length_of_gestation_eb51cd67a54156ee5d46263ddae5c1d3.json b/res/evaluation_cohort/fhir/evco_fhir_observation_length_of_gestation_eb51cd67a54156ee5d46263ddae5c1d3.json
index e3489dcfa..d6dfb0f16 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_observation_length_of_gestation_eb51cd67a54156ee5d46263ddae5c1d3.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_observation_length_of_gestation_eb51cd67a54156ee5d46263ddae5c1d3.json
@@ -15,7 +15,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "412726003",
"display": "Length of Gestation at Birth - weeks+days"
} ]
@@ -28,7 +28,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "412726003",
"display": "Length of Gestation at Birth - weeks"
} ]
@@ -43,7 +43,7 @@
"code": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "412726003",
"display": "Length of Gestation at Birth - days"
} ]
diff --git a/res/evaluation_cohort/fhir/evco_fhir_observation_measurements_other.json b/res/evaluation_cohort/fhir/evco_fhir_observation_measurements_other.json
index bc1c1f851..e19684213 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_observation_measurements_other.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_observation_measurements_other.json
@@ -36,7 +36,7 @@
"code": {
"coding": [ {
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "ncit_c60819"
} ]
},
@@ -52,7 +52,7 @@
"interpretation": [ {
"coding": [ {
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C25247"
} ]
} ]
diff --git a/res/evaluation_cohort/fhir/evco_fhir_observation_vitalsigns.json b/res/evaluation_cohort/fhir/evco_fhir_observation_vitalsigns.json
index b33185a9c..5436eeb3c 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_observation_vitalsigns.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_observation_vitalsigns.json
@@ -35,7 +35,7 @@
"code": {
"coding": [ {
"system": "http ://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "9279-1",
"display": "Respiratory Rate"
} ]
@@ -51,7 +51,7 @@
"interpretation": [ {
"coding": [ {
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C14165"
} ]
} ]
diff --git a/res/evaluation_cohort/fhir/evco_fhir_observations.json b/res/evaluation_cohort/fhir/evco_fhir_observations.json
index cbd2ab7b5..8a9f782fd 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_observations.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_observations.json
@@ -30,7 +30,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -40,7 +40,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031915",
"display": "Stable"
} ]
@@ -50,7 +50,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -58,7 +58,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001256"
} ]
},
@@ -90,7 +90,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -100,7 +100,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012826",
"display": "Moderate"
} ]
@@ -110,7 +110,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -118,7 +118,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0002761"
} ]
},
@@ -150,7 +150,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -160,7 +160,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -168,7 +168,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000400"
} ]
},
@@ -200,7 +200,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -210,7 +210,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031915",
"display": "Stable"
} ]
@@ -220,7 +220,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012825",
"display": "Mild"
} ]
@@ -230,7 +230,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -238,7 +238,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0002761"
} ]
},
@@ -270,7 +270,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -280,7 +280,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012825",
"display": "Mild"
} ]
@@ -290,7 +290,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -298,7 +298,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0002650"
} ]
},
@@ -330,7 +330,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -340,7 +340,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012825",
"display": "Mild"
} ]
@@ -350,7 +350,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -358,7 +358,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000400"
} ]
},
@@ -390,7 +390,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -400,7 +400,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -408,7 +408,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000175"
} ]
},
@@ -440,7 +440,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -450,7 +450,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012826",
"display": "Moderate"
} ]
@@ -460,7 +460,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -468,7 +468,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000175"
} ]
},
@@ -500,7 +500,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -510,7 +510,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -518,7 +518,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000400"
} ]
},
@@ -550,7 +550,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -560,7 +560,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012829",
"display": "Profound"
} ]
@@ -570,7 +570,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -578,7 +578,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0002650"
} ]
},
@@ -610,7 +610,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -620,7 +620,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031796",
"display": "Recurrent"
} ]
@@ -630,7 +630,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012828",
"display": "Severe"
} ]
@@ -640,7 +640,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -648,7 +648,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001250"
} ]
},
@@ -680,7 +680,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -690,7 +690,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -698,7 +698,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0004322"
} ]
},
@@ -730,7 +730,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -740,7 +740,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012826",
"display": "Moderate"
} ]
@@ -750,7 +750,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -758,7 +758,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0002650"
} ]
},
@@ -790,7 +790,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -800,7 +800,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012826",
"display": "Moderate"
} ]
@@ -810,7 +810,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -818,7 +818,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000400"
} ]
},
@@ -850,7 +850,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -860,7 +860,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012829",
"display": "Profound"
} ]
@@ -870,7 +870,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -878,7 +878,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0002761"
} ]
},
@@ -910,7 +910,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -920,7 +920,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031796",
"display": "Recurrent"
} ]
@@ -930,7 +930,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -938,7 +938,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001250"
} ]
},
@@ -970,7 +970,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -980,7 +980,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031796",
"display": "Recurrent"
} ]
@@ -990,7 +990,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012826",
"display": "Moderate"
} ]
@@ -1000,7 +1000,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -1008,7 +1008,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001252"
} ]
},
@@ -1040,7 +1040,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1050,7 +1050,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011010",
"display": "Chronic"
} ]
@@ -1060,7 +1060,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -1068,7 +1068,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0034323"
} ]
},
@@ -1100,7 +1100,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1110,7 +1110,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031915",
"display": "Stable"
} ]
@@ -1120,7 +1120,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012825",
"display": "Mild"
} ]
@@ -1130,7 +1130,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -1138,7 +1138,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001212"
} ]
},
@@ -1170,7 +1170,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1180,7 +1180,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012826",
"display": "Moderate"
} ]
@@ -1190,7 +1190,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -1198,7 +1198,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000689"
} ]
},
@@ -1230,7 +1230,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1240,7 +1240,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011010",
"display": "Chronic"
} ]
@@ -1250,7 +1250,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012828",
"display": "Severe"
} ]
@@ -1260,7 +1260,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -1268,7 +1268,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000365"
} ]
},
@@ -1300,7 +1300,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1310,7 +1310,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012825",
"display": "Mild"
} ]
@@ -1320,7 +1320,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -1328,7 +1328,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000400"
} ]
},
@@ -1360,7 +1360,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1370,7 +1370,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031796",
"display": "Recurrent"
} ]
@@ -1380,7 +1380,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012829",
"display": "Profound"
} ]
@@ -1390,7 +1390,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -1398,7 +1398,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001252"
} ]
},
@@ -1430,7 +1430,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1440,7 +1440,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -1448,7 +1448,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000175"
} ]
},
@@ -1480,7 +1480,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1490,7 +1490,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -1498,7 +1498,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001156"
} ]
},
@@ -1530,7 +1530,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1540,7 +1540,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031915",
"display": "Stable"
} ]
@@ -1550,7 +1550,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012825",
"display": "Mild"
} ]
@@ -1560,7 +1560,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -1568,7 +1568,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000365"
} ]
},
@@ -1600,7 +1600,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1610,7 +1610,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012828",
"display": "Severe"
} ]
@@ -1620,7 +1620,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -1628,7 +1628,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000403"
} ]
},
@@ -1660,7 +1660,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1670,7 +1670,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012825",
"display": "Mild"
} ]
@@ -1680,7 +1680,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -1688,7 +1688,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000508"
} ]
},
@@ -1720,7 +1720,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1730,7 +1730,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -1738,7 +1738,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0002553"
} ]
},
@@ -1770,7 +1770,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1780,7 +1780,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -1788,7 +1788,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001156"
} ]
},
@@ -1820,7 +1820,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1830,7 +1830,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -1838,7 +1838,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0004322"
} ]
},
@@ -1870,7 +1870,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1880,7 +1880,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031915",
"display": "Stable"
} ]
@@ -1890,7 +1890,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012829",
"display": "Profound"
} ]
@@ -1900,7 +1900,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -1908,7 +1908,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000365"
} ]
},
@@ -1940,7 +1940,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -1950,7 +1950,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012828",
"display": "Severe"
} ]
@@ -1960,7 +1960,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -1968,7 +1968,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0002650"
} ]
},
@@ -2000,7 +2000,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2010,7 +2010,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031915",
"display": "Stable"
} ]
@@ -2020,7 +2020,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012826",
"display": "Moderate"
} ]
@@ -2030,7 +2030,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -2038,7 +2038,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001263"
} ]
},
@@ -2070,7 +2070,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2080,7 +2080,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -2088,7 +2088,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0002553"
} ]
},
@@ -2120,7 +2120,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2130,7 +2130,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031915",
"display": "Stable"
} ]
@@ -2140,7 +2140,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012826",
"display": "Moderate"
} ]
@@ -2150,7 +2150,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -2158,7 +2158,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0008897"
} ]
},
@@ -2190,7 +2190,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2200,7 +2200,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -2208,7 +2208,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000400"
} ]
},
@@ -2239,7 +2239,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2249,7 +2249,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031796",
"display": "Recurrent"
} ]
@@ -2259,7 +2259,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012829",
"display": "Profound"
} ]
@@ -2269,7 +2269,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -2277,7 +2277,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001250"
} ]
},
@@ -2309,7 +2309,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2319,7 +2319,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031796",
"display": "Recurrent"
} ]
@@ -2329,7 +2329,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012825",
"display": "Mild"
} ]
@@ -2339,7 +2339,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -2347,7 +2347,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001252"
} ]
},
@@ -2379,7 +2379,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2389,7 +2389,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031914",
"display": "Fluctuating"
} ]
@@ -2399,7 +2399,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012829",
"display": "Profound"
} ]
@@ -2409,7 +2409,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -2417,7 +2417,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001252"
} ]
},
@@ -2449,7 +2449,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2459,7 +2459,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012826",
"display": "Moderate"
} ]
@@ -2469,7 +2469,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -2477,7 +2477,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000637"
} ]
},
@@ -2508,7 +2508,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2518,7 +2518,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
} ]
@@ -2526,7 +2526,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000508"
} ]
},
@@ -2558,7 +2558,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2568,7 +2568,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031915",
"display": "Stable"
} ]
@@ -2578,7 +2578,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012826",
"display": "Moderate"
} ]
@@ -2597,7 +2597,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -2605,7 +2605,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0002553"
} ]
},
@@ -2645,7 +2645,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2655,7 +2655,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031796",
"display": "Recurrent"
} ]
@@ -2665,7 +2665,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -2673,7 +2673,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0034323"
} ]
},
@@ -2705,7 +2705,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2715,7 +2715,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -2723,7 +2723,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000689"
} ]
},
@@ -2755,7 +2755,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2765,7 +2765,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031915",
"display": "Stable"
} ]
@@ -2775,7 +2775,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012826",
"display": "Moderate"
} ]
@@ -2785,7 +2785,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
} ]
@@ -2793,7 +2793,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000365"
} ]
},
@@ -2825,7 +2825,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
} ]
@@ -2835,7 +2835,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012828",
"display": "Severe"
} ]
@@ -2845,7 +2845,7 @@
"category": [ {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
} ]
@@ -2853,7 +2853,7 @@
"code": {
"coding": [ {
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001627"
} ]
},
diff --git a/res/evaluation_cohort/fhir/evco_fhir_patient.json b/res/evaluation_cohort/fhir/evco_fhir_patient.json
index 2ba899b9f..58e90e892 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_patient.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_patient.json
@@ -41,7 +41,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "370159000",
"display": "Country of Birth"
} ]
@@ -54,7 +54,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399423000",
"display": "Date of Admission"
} ]
@@ -70,7 +70,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "LA2-8",
"display": "Male"
} ]
@@ -80,7 +80,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "281053000",
"display": "Sex at Birth"
} ]
@@ -92,7 +92,7 @@
"type": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "422549004",
"display": "Patient-related Identification code (observable entity)"
} ]
@@ -140,7 +140,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "370159000",
"display": "Country of Birth"
} ]
@@ -153,7 +153,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399423000",
"display": "Date of Admission"
} ]
@@ -169,7 +169,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "LA2-8",
"display": "Male"
} ]
@@ -179,7 +179,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "281053000",
"display": "Sex at Birth"
} ]
@@ -191,7 +191,7 @@
"type": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "422549004",
"display": "Patient-related Identification code (observable entity)"
} ]
@@ -239,7 +239,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "370159000",
"display": "Country of Birth"
} ]
@@ -252,7 +252,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399423000",
"display": "Date of Admission"
} ]
@@ -268,7 +268,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "LA3-6",
"display": "Female"
} ]
@@ -278,7 +278,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "281053000",
"display": "Sex at Birth"
} ]
@@ -290,7 +290,7 @@
"type": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "422549004",
"display": "Patient-related Identification code (observable entity)"
} ]
@@ -338,7 +338,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "370159000",
"display": "Country of Birth"
} ]
@@ -351,7 +351,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399423000",
"display": "Date of Admission"
} ]
@@ -367,7 +367,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "LA2-8",
"display": "Male"
} ]
@@ -377,7 +377,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "281053000",
"display": "Sex at Birth"
} ]
@@ -389,7 +389,7 @@
"type": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "422549004",
"display": "Patient-related Identification code (observable entity)"
} ]
@@ -437,7 +437,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "370159000",
"display": "Country of Birth"
} ]
@@ -450,7 +450,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399423000",
"display": "Date of Admission"
} ]
@@ -466,7 +466,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "LA3-6",
"display": "Female"
} ]
@@ -476,7 +476,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "281053000",
"display": "Sex at Birth"
} ]
@@ -488,7 +488,7 @@
"type": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "422549004",
"display": "Patient-related Identification code (observable entity)"
} ]
@@ -536,7 +536,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "370159000",
"display": "Country of Birth"
} ]
@@ -549,7 +549,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399423000",
"display": "Date of Admission"
} ]
@@ -565,7 +565,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "LA2-8",
"display": "Male"
} ]
@@ -575,7 +575,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "281053000",
"display": "Sex at Birth"
} ]
@@ -587,7 +587,7 @@
"type": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "422549004",
"display": "Patient-related Identification code (observable entity)"
} ]
@@ -635,7 +635,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "370159000",
"display": "Country of Birth"
} ]
@@ -648,7 +648,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399423000",
"display": "Date of Admission"
} ]
@@ -664,7 +664,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "LA2-8",
"display": "Male"
} ]
@@ -674,7 +674,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "281053000",
"display": "Sex at Birth"
} ]
@@ -686,7 +686,7 @@
"type": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "422549004",
"display": "Patient-related Identification code (observable entity)"
} ]
@@ -734,7 +734,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "370159000",
"display": "Country of Birth"
} ]
@@ -747,7 +747,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399423000",
"display": "Date of Admission"
} ]
@@ -763,7 +763,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "LA3-6",
"display": "Female"
} ]
@@ -773,7 +773,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "281053000",
"display": "Sex at Birth"
} ]
@@ -785,7 +785,7 @@
"type": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "422549004",
"display": "Patient-related Identification code (observable entity)"
} ]
@@ -824,7 +824,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399423000",
"display": "Date of Admission"
} ]
@@ -840,7 +840,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "LA3-6",
"display": "Female"
} ]
@@ -850,7 +850,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "281053000",
"display": "Sex at Birth"
} ]
@@ -862,7 +862,7 @@
"type": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "422549004",
"display": "Patient-related Identification code (observable entity)"
} ]
@@ -910,7 +910,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "370159000",
"display": "Country of Birth"
} ]
@@ -923,7 +923,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399423000",
"display": "Date of Admission"
} ]
@@ -939,7 +939,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "LA3-6",
"display": "Female"
} ]
@@ -949,7 +949,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "281053000",
"display": "Sex at Birth"
} ]
@@ -961,7 +961,7 @@
"type": {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "422549004",
"display": "Patient-related Identification code (observable entity)"
} ]
diff --git a/res/evaluation_cohort/fhir/evco_fhir_procedure.json b/res/evaluation_cohort/fhir/evco_fhir_procedure.json
index d477b3d03..b4528d7ad 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_procedure.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_procedure.json
@@ -29,7 +29,7 @@
"code": {
"coding": [ {
"system": "http://hl7.org/fhir/uv/ips/ValueSet/procedures-uv-ips",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "2752008"
} ]
},
@@ -40,7 +40,7 @@
"bodySite": [ {
"coding": [ {
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "112975008"
} ]
} ]
diff --git a/res/evaluation_cohort/fhir/evco_fhir_variant.json b/res/evaluation_cohort/fhir/evco_fhir_variant.json
index d1ccfe64c..acfa4ac8a 100644
--- a/res/evaluation_cohort/fhir/evco_fhir_variant.json
+++ b/res/evaluation_cohort/fhir/evco_fhir_variant.json
@@ -40,7 +40,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "69548-6",
"display": "Genetic variant assessment"
} ]
@@ -52,7 +52,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48004-6",
"display": "DNA change (c.HGVS)"
} ]
@@ -67,7 +67,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "51958-7",
"display": "Transcript reference sequence [ID]"
} ]
@@ -82,7 +82,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48018-6",
"display": "Gene studied [ID]"
} ]
@@ -98,7 +98,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53034-5",
"display": "Allelic state"
} ]
@@ -106,7 +106,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA6706-1",
"display": "(simple) Heterozygous"
} ]
@@ -146,7 +146,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "69548-6",
"display": "Genetic variant assessment"
} ]
@@ -158,7 +158,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48004-6",
"display": "DNA change (c.HGVS)"
} ]
@@ -173,7 +173,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "51958-7",
"display": "Transcript reference sequence [ID]"
} ]
@@ -188,7 +188,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48018-6",
"display": "Gene studied [ID]"
} ]
@@ -204,7 +204,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53034-5",
"display": "Allelic state"
} ]
@@ -212,7 +212,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA6706-1",
"display": "(simple) Heterozygous"
} ]
@@ -252,7 +252,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "69548-6",
"display": "Genetic variant assessment"
} ]
@@ -264,7 +264,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48004-6",
"display": "DNA change (c.HGVS)"
} ]
@@ -279,7 +279,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "51958-7",
"display": "Transcript reference sequence [ID]"
} ]
@@ -294,7 +294,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48018-6",
"display": "Gene studied [ID]"
} ]
@@ -310,7 +310,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53034-5",
"display": "Allelic state"
} ]
@@ -318,7 +318,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA6706-1",
"display": "(simple) Heterozygous"
} ]
@@ -358,7 +358,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "69548-6",
"display": "Genetic variant assessment"
} ]
@@ -370,7 +370,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48004-6",
"display": "DNA change (c.HGVS)"
} ]
@@ -385,7 +385,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "51958-7",
"display": "Transcript reference sequence [ID]"
} ]
@@ -400,7 +400,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48018-6",
"display": "Gene studied [ID]"
} ]
@@ -416,7 +416,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53034-5",
"display": "Allelic state"
} ]
@@ -424,7 +424,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA6706-1",
"display": "(simple) Heterozygous"
} ]
@@ -464,7 +464,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "69548-6",
"display": "Genetic variant assessment"
} ]
@@ -476,7 +476,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48004-6",
"display": "DNA change (c.HGVS)"
} ]
@@ -491,7 +491,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "51958-7",
"display": "Transcript reference sequence [ID]"
} ]
@@ -506,7 +506,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48018-6",
"display": "Gene studied [ID]"
} ]
@@ -522,7 +522,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53034-5",
"display": "Allelic state"
} ]
@@ -530,7 +530,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA6706-1",
"display": "(simple) Heterozygous"
} ]
@@ -570,7 +570,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "69548-6",
"display": "Genetic variant assessment"
} ]
@@ -582,7 +582,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48004-6",
"display": "DNA change (c.HGVS)"
} ]
@@ -597,7 +597,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "51958-7",
"display": "Transcript reference sequence [ID]"
} ]
@@ -612,7 +612,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48018-6",
"display": "Gene studied [ID]"
} ]
@@ -628,7 +628,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53034-5",
"display": "Allelic state"
} ]
@@ -636,7 +636,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA26217-2",
"display": "Compunt Heterozygous"
} ]
@@ -676,7 +676,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "69548-6",
"display": "Genetic variant assessment"
} ]
@@ -688,7 +688,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48004-6",
"display": "DNA change (c.HGVS)"
} ]
@@ -703,7 +703,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "51958-7",
"display": "Transcript reference sequence [ID]"
} ]
@@ -718,7 +718,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48018-6",
"display": "Gene studied [ID]"
} ]
@@ -734,7 +734,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53034-5",
"display": "Allelic state"
} ]
@@ -742,7 +742,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA26217-2",
"display": "Compunt Heterozygous"
} ]
@@ -782,7 +782,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "69548-6",
"display": "Genetic variant assessment"
} ]
@@ -794,7 +794,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48004-6",
"display": "DNA change (c.HGVS)"
} ]
@@ -809,7 +809,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "51958-7",
"display": "Transcript reference sequence [ID]"
} ]
@@ -824,7 +824,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48018-6",
"display": "Gene studied [ID]"
} ]
@@ -840,7 +840,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53034-5",
"display": "Allelic state"
} ]
@@ -848,7 +848,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA26217-2",
"display": "Compunt Heterozygous"
} ]
@@ -888,7 +888,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "69548-6",
"display": "Genetic variant assessment"
} ]
@@ -900,7 +900,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48004-6",
"display": "DNA change (c.HGVS)"
} ]
@@ -915,7 +915,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "51958-7",
"display": "Transcript reference sequence [ID]"
} ]
@@ -930,7 +930,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48018-6",
"display": "Gene studied [ID]"
} ]
@@ -946,7 +946,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53034-5",
"display": "Allelic state"
} ]
@@ -954,7 +954,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA6706-1",
"display": "(simple) Heterozygous"
} ]
@@ -994,7 +994,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "69548-6",
"display": "Genetic variant assessment"
} ]
@@ -1006,7 +1006,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48004-6",
"display": "DNA change (c.HGVS)"
} ]
@@ -1021,7 +1021,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "51958-7",
"display": "Transcript reference sequence [ID]"
} ]
@@ -1036,7 +1036,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48018-6",
"display": "Gene studied [ID]"
} ]
@@ -1052,7 +1052,7 @@
"code": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53034-5",
"display": "Allelic state"
} ]
@@ -1060,7 +1060,7 @@
"valueCodeableConcept": {
"coding": [ {
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA6706-1",
"display": "(simple) Heterozygous"
} ]
diff --git a/res/evaluation_cohort/phenopackets/1.json b/res/evaluation_cohort/phenopackets/1.json
index dd3ae91b8..a8dc52c8c 100644
--- a/res/evaluation_cohort/phenopackets/1.json
+++ b/res/evaluation_cohort/phenopackets/1.json
@@ -1,17 +1,18 @@
{
"id": "1",
"subject": {
- "id": "EvCo1",
- "date_of_birth": "2015-01-12T00:00:00Z",
- "time_at_last_encounter": {
+ "id": "TodayTest",
+ "dateOfBirth": "2015-01-12T00:00:00Z",
+ "timeAtLastEncounter": {
"age": {
- "iso8601duration": "P10Y3M"
+ "iso8601duration": "P10Y8M"
}
},
- "vital_status": {
+ "vitalStatus": {
"status": "ALIVE"
},
"sex": "MALE",
+ "karyotypicSex": "XY",
"gender": {
"id": "SNOMEDCT:446151000124109",
"label": "Male gender identity"
@@ -21,18 +22,44 @@
"label": "Homo sapiens"
}
},
- "phenotypic_features": [
+ "phenotypicFeatures": [
{
"type": {
- "id": "HP:0002553",
- "label": "Highly arched eyebrow"
+ "id": "HP:0032323",
+ "label": "Periodic fever"
},
+ "severity": {
+ "id": "HP:0012826",
+ "label": "Moderate"
+ },
+ "modifiers": [
+ {
+ "id": "HP:0031915",
+ "label": "Stable"
+ },
+ {
+ "id": "NCBITAXON:178566",
+ "label": "Streptomyces mexicanus"
+ }
+ ],
"onset": {
- "ontology_class": {
- "id": "HP:0003577",
- "label": "Congenital onset (at birth)"
+ "age": {
+ "iso8601duration": "P10Y2M"
}
- }
+ },
+ "resolution": {
+ "age": {
+ "iso8601duration": "P10Y3M"
+ }
+ },
+ "evidence": [
+ {
+ "evidenceCode": {
+ "id": "ECO:0000180",
+ "label": "clinical study evidence"
+ }
+ }
+ ]
},
{
"type": {
@@ -40,7 +67,7 @@
"label": "Macrotia"
},
"onset": {
- "ontology_class": {
+ "ontologyClass": {
"id": "HP:0003577",
"label": "Congenital onset (at birth)"
}
@@ -91,7 +118,7 @@
{
"type": {
"id": "HP:0001256",
- "label": "Intellectual disability, mild"
+ "label": "Mild intellectual disability"
},
"modifiers": [
{
@@ -130,6 +157,17 @@
"iso8601duration": "P10Y3M"
}
}
+ },
+ {
+ "type": {
+ "id": "HP:0001297",
+ "label": "Stroke"
+ },
+ "onset": {
+ "age": {
+ "iso8601duration": "P10Y8M"
+ }
+ }
}
],
"measurements": [
@@ -147,7 +185,7 @@
"value": 7.2
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P5Y11M"
}
@@ -167,7 +205,7 @@
"value": 5.6
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P5Y11M"
}
@@ -187,7 +225,7 @@
"value": 2.1
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P5Y11M"
}
@@ -207,7 +245,7 @@
"value": 15.4
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P7Y2M"
}
@@ -227,7 +265,7 @@
"value": 5.6
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P7Y2M"
}
@@ -247,32 +285,72 @@
"value": 1.8
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P7Y2M"
}
}
+ },
+ {
+ "assay": {
+ "id": "LOINC:36554-4",
+ "label": "View:Find:Pt:Chest:Doc:XR"
+ },
+ "value": {
+ "quantity": {
+ "unit": {
+ "id": "UO:0000307",
+ "label": "dose unit"
+ },
+ "value": 1.0
+ }
+ },
+ "timeObserved": {
+ "age": {
+ "iso8601duration": "P6Y3M"
+ }
+ }
+ },
+ {
+ "assay": {
+ "id": "LOINC:LP428372-9",
+ "label": "SURVEY.COVID"
+ },
+ "value": {
+ "quantity": {
+ "unit": {
+ "id": "UO:0000307",
+ "label": "dose unit"
+ },
+ "value": 1.0
+ }
+ },
+ "timeObserved": {
+ "age": {
+ "iso8601duration": "P6Y3M"
+ }
+ }
}
],
"interpretations": [
{
- "id": "EvCo1-interpretation-0",
- "progress_status": "SOLVED",
+ "id": "TodayTest-interpretation-0",
+ "progressStatus": "SOLVED",
"diagnosis": {
"disease": {
"id": "MONDO:0007843",
"label": "Kabuki syndrome 1"
},
- "genomic_interpretations": [
+ "genomicInterpretations": [
{
- "subject_or_biosample_id": "1",
- "interpretation_status": "CAUSATIVE",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "PATHOGENIC",
- "variation_descriptor": {
- "id": "a64391fcf27c42b8a024ede70f6a1d",
- "gene_context": {
- "value_id": "HGNC:29508",
+ "subjectOrBiosampleId": "1",
+ "interpretationStatus": "CAUSATIVE",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "PATHOGENIC",
+ "variationDescriptor": {
+ "id": "0a25e1898daa46bbb43451552d6e80",
+ "geneContext": {
+ "valueId": "HGNC:29508",
"symbol": "KIDINS220"
},
"expressions": [
@@ -281,7 +359,7 @@
"value": "NM_020738.4:c.4269del"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000402",
"label": "Compound heterozygous"
}
@@ -289,14 +367,14 @@
}
},
{
- "subject_or_biosample_id": "2",
- "interpretation_status": "CAUSATIVE",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "PATHOGENIC",
- "variation_descriptor": {
- "id": "3f94cfc4856f41a6aea467b08cef75",
- "gene_context": {
- "value_id": "HGNC:7133",
+ "subjectOrBiosampleId": "2",
+ "interpretationStatus": "CAUSATIVE",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "PATHOGENIC",
+ "variationDescriptor": {
+ "id": "1a160a88fce148acae47a17ec61f30",
+ "geneContext": {
+ "valueId": "HGNC:7133",
"symbol": "KMT2D"
},
"expressions": [
@@ -305,7 +383,7 @@
"value": "NM_003482.4:c.16529A>G"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000402",
"label": "Compound heterozygous"
}
@@ -326,62 +404,97 @@
"age": {
"iso8601duration": "P2Y4M"
}
+ },
+ "primarySite": {
+ "id": "SNOMEDCT:31099001",
+ "label": "Systemic"
}
}
],
- "meta_data": {
- "created": "2025-09-23T15:32:10.903009Z",
- "created_by": "Adam G.",
+ "medicalActions": [
+ {
+ "procedure": {
+ "code": {
+ "id": "SNOMEDCT:2752008",
+ "label": "Incudopexy"
+ },
+ "performed": {
+ "age": {
+ "iso8601duration": "P6Y3M"
+ }
+ }
+ }
+ }
+ ],
+ "metaData": {
+ "created": "2026-03-29T19:00:12.418802Z",
+ "createdBy": "AG",
"resources": [
{
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
- "namespace_prefix": "MONDO",
- "iri_prefix": "http://purl.obolibrary.org/obo/MONDO_"
+ "version": "2026-03-03",
+ "namespacePrefix": "MONDO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/MONDO_"
},
{
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
- "namespace_prefix": "HPO",
- "iri_prefix": "http://purl.obolibrary.org/obo/HP_"
+ "version": "2026-02-16",
+ "namespacePrefix": "HPO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/HP_"
},
{
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
- "namespace_prefix": "LOINC",
- "iri_prefix": "http://loinc.org"
+ "version": "281",
+ "namespacePrefix": "LOINC",
+ "iriPrefix": "http://loinc.org"
+ },
+ {
+ "id": "uo",
+ "name": "Units of Measurement Ontology",
+ "url": "https://www.ontobee.org/ontology/UO",
+ "version": "2026-01-16",
+ "namespacePrefix": "UO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/UO_"
},
{
"id": "hgnc",
"name": "HUGO Gene Nomenclature Committee",
"url": "https://www.genenames.org/",
"version": "2024-08-23",
- "namespace_prefix": "HGNC",
- "iri_prefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
+ "namespacePrefix": "HGNC",
+ "iriPrefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
},
{
"id": "hgvs",
"name": "Human Genome Variation Society",
"url": "https://varnomen.hgvs.org/",
"version": "21.0.0",
- "namespace_prefix": "HGVS",
- "iri_prefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ "namespacePrefix": "HGVS",
+ "iriPrefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ },
+ {
+ "id": "ga4gh",
+ "name": "Global Alliance for Genomics and Health",
+ "url": "https://www.ga4gh.org/",
+ "version": "v2.0",
+ "namespacePrefix": "GA4GH",
+ "iriPrefix": "https://www.ga4gh.org/"
},
{
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
- "namespace_prefix": "GENO",
- "iri_prefix": "http://purl.obolibrary.org/obo/GENO_"
+ "version": "2026-02-02",
+ "namespacePrefix": "GENO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/GENO_"
}
],
- "phenopacket_schema_version": "2.0"
+ "phenopacketSchemaVersion": "2.0"
}
}
\ No newline at end of file
diff --git a/res/evaluation_cohort/phenopackets/10.json b/res/evaluation_cohort/phenopackets/10.json
index 1ad8bfc81..e38225c1c 100644
--- a/res/evaluation_cohort/phenopackets/10.json
+++ b/res/evaluation_cohort/phenopackets/10.json
@@ -2,16 +2,15 @@
"id": "10",
"subject": {
"id": "EvCo10",
- "date_of_birth": "2015-11-15T00:00:00Z",
- "time_at_last_encounter": {
+ "dateOfBirth": "2015-11-15T00:00:00Z",
+ "timeAtLastEncounter": {
"age": {
"iso8601duration": "P9Y4M"
}
},
- "vital_status": {
+ "vitalStatus": {
"status": "ALIVE"
},
- "sex": "FEMALE",
"gender": {
"id": "SNOMEDCT:446141000124107",
"label": "Female gender identity"
@@ -21,7 +20,7 @@
"label": "Homo sapiens"
}
},
- "phenotypic_features": [
+ "phenotypicFeatures": [
{
"type": {
"id": "HP:0000400",
@@ -113,7 +112,7 @@
"value": 5.2
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P5Y0M"
}
@@ -133,7 +132,7 @@
"value": 5.1
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P5Y0M"
}
@@ -153,7 +152,7 @@
"value": 0.3
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P5Y0M"
}
@@ -173,7 +172,7 @@
"value": 4.0
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P7Y0M"
}
@@ -193,7 +192,7 @@
"value": 7.5
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P7Y0M"
}
@@ -213,7 +212,7 @@
"value": 0.4
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P7Y0M"
}
@@ -223,22 +222,22 @@
"interpretations": [
{
"id": "EvCo10-interpretation-0",
- "progress_status": "COMPLETED",
+ "progressStatus": "COMPLETED",
"diagnosis": {
"disease": {
"id": "MONDO:0007843",
"label": "Kabuki syndrome 1"
},
- "genomic_interpretations": [
+ "genomicInterpretations": [
{
- "subject_or_biosample_id": "1",
- "interpretation_status": "CAUSATIVE",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "LIKELY_PATHOGENIC",
- "variation_descriptor": {
- "id": "ec77fecb0be24b99921c2aebe7a25d",
- "gene_context": {
- "value_id": "HGNC:7133",
+ "subjectOrBiosampleId": "1",
+ "interpretationStatus": "CAUSATIVE",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "LIKELY_PATHOGENIC",
+ "variationDescriptor": {
+ "id": "fec4b36645e6429a945d24c6bb18ca",
+ "geneContext": {
+ "valueId": "HGNC:7133",
"symbol": "KMT2D"
},
"expressions": [
@@ -247,7 +246,7 @@
"value": "NM_003482.4:c.16522-5_16522-2del"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000402",
"label": "Compound heterozygous"
}
@@ -255,14 +254,14 @@
}
},
{
- "subject_or_biosample_id": "2",
- "interpretation_status": "CONTRIBUTORY",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "LIKELY_PATHOGENIC",
- "variation_descriptor": {
- "id": "8b7d5280a1fa4086813aec8d167b46",
- "gene_context": {
- "value_id": "HGNC:7132",
+ "subjectOrBiosampleId": "2",
+ "interpretationStatus": "CONTRIBUTORY",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "LIKELY_PATHOGENIC",
+ "variationDescriptor": {
+ "id": "e5427b4e53c740be99ad323b7550fb",
+ "geneContext": {
+ "valueId": "HGNC:7132",
"symbol": "KMT2A"
},
"expressions": [
@@ -271,7 +270,7 @@
"value": "NM_001197104.2:c.3019G>T"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000402",
"label": "Compound heterozygous"
}
@@ -295,59 +294,75 @@
}
}
],
- "meta_data": {
- "created": "2025-09-23T15:34:00.293353Z",
- "created_by": "Adam G.",
+ "metaData": {
+ "created": "2026-03-29T18:06:30.222271Z",
+ "createdBy": "AG",
"resources": [
{
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
- "namespace_prefix": "MONDO",
- "iri_prefix": "http://purl.obolibrary.org/obo/MONDO_"
+ "version": "2026-03-03",
+ "namespacePrefix": "MONDO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/MONDO_"
},
{
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
- "namespace_prefix": "HPO",
- "iri_prefix": "http://purl.obolibrary.org/obo/HP_"
+ "version": "2026-02-16",
+ "namespacePrefix": "HPO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/HP_"
},
{
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
- "namespace_prefix": "LOINC",
- "iri_prefix": "http://loinc.org"
+ "version": "v281",
+ "namespacePrefix": "LOINC",
+ "iriPrefix": "http://loinc.org"
+ },
+ {
+ "id": "uo",
+ "name": "Units of Measurement Ontology",
+ "url": "https://www.ontobee.org/ontology/UO",
+ "version": "2026-01-16",
+ "namespacePrefix": "UO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/UO_"
},
{
"id": "hgnc",
"name": "HUGO Gene Nomenclature Committee",
"url": "https://www.genenames.org/",
"version": "2024-08-23",
- "namespace_prefix": "HGNC",
- "iri_prefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
+ "namespacePrefix": "HGNC",
+ "iriPrefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
},
{
"id": "hgvs",
"name": "Human Genome Variation Society",
"url": "https://varnomen.hgvs.org/",
"version": "21.0.0",
- "namespace_prefix": "HGVS",
- "iri_prefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ "namespacePrefix": "HGVS",
+ "iriPrefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ },
+ {
+ "id": "ga4gh",
+ "name": "Global Alliance for Genomics and Health",
+ "url": "https://www.ga4gh.org/",
+ "version": "v2.0",
+ "namespacePrefix": "GA4GH",
+ "iriPrefix": "https://www.ga4gh.org/"
},
{
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
- "namespace_prefix": "GENO",
- "iri_prefix": "http://purl.obolibrary.org/obo/GENO_"
+ "version": "2026-02-02",
+ "namespacePrefix": "GENO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/GENO_"
}
],
- "phenopacket_schema_version": "2.0"
+ "phenopacketSchemaVersion": "2.0"
}
}
\ No newline at end of file
diff --git a/res/evaluation_cohort/phenopackets/2.json b/res/evaluation_cohort/phenopackets/2.json
index 75a579c6d..f6d1b61fd 100644
--- a/res/evaluation_cohort/phenopackets/2.json
+++ b/res/evaluation_cohort/phenopackets/2.json
@@ -2,13 +2,13 @@
"id": "2",
"subject": {
"id": "EvCo2",
- "date_of_birth": "2012-03-04T00:00:00Z",
- "time_at_last_encounter": {
+ "dateOfBirth": "2012-03-04T00:00:00Z",
+ "timeAtLastEncounter": {
"age": {
"iso8601duration": "P13Y1M"
}
},
- "vital_status": {
+ "vitalStatus": {
"status": "ALIVE"
},
"sex": "FEMALE",
@@ -21,7 +21,7 @@
"label": "Homo sapiens"
}
},
- "phenotypic_features": [
+ "phenotypicFeatures": [
{
"type": {
"id": "HP:0000400",
@@ -100,7 +100,7 @@
"value": 9.1
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P8Y2M"
}
@@ -120,7 +120,7 @@
"value": 3.5
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P8Y2M"
}
@@ -140,7 +140,7 @@
"value": 7.9
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P8Y2M"
}
@@ -160,7 +160,7 @@
"value": 7.8
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P9Y2M"
}
@@ -180,7 +180,7 @@
"value": 5.4
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P9Y2M"
}
@@ -200,7 +200,7 @@
"value": 6.8
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P9Y2M"
}
@@ -220,7 +220,7 @@
"value": 10.4
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P10Y2M"
}
@@ -240,7 +240,7 @@
"value": 5.1
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P10Y2M"
}
@@ -260,7 +260,7 @@
"value": 5.1
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P10Y2M"
}
@@ -270,22 +270,22 @@
"interpretations": [
{
"id": "EvCo2-interpretation-0",
- "progress_status": "SOLVED",
+ "progressStatus": "SOLVED",
"diagnosis": {
"disease": {
"id": "MONDO:0007843",
"label": "Kabuki syndrome 1"
},
- "genomic_interpretations": [
+ "genomicInterpretations": [
{
- "subject_or_biosample_id": "1",
- "interpretation_status": "CONTRIBUTORY",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "LIKELY_PATHOGENIC",
- "variation_descriptor": {
- "id": "ed711951287248d2972c0e360d329d",
- "gene_context": {
- "value_id": "HGNC:7132",
+ "subjectOrBiosampleId": "1",
+ "interpretationStatus": "CONTRIBUTORY",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "LIKELY_PATHOGENIC",
+ "variationDescriptor": {
+ "id": "f1ab0809a04c42dfb056ff0a4ee775",
+ "geneContext": {
+ "valueId": "HGNC:7132",
"symbol": "KMT2A"
},
"expressions": [
@@ -294,7 +294,7 @@
"value": "NM_001197104.2:c.3019G>T"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000458",
"label": "Heterozygous"
}
@@ -318,59 +318,75 @@
}
}
],
- "meta_data": {
- "created": "2025-09-23T15:32:28.291053Z",
- "created_by": "Adam G.",
+ "metaData": {
+ "created": "2026-03-29T19:00:16.568276Z",
+ "createdBy": "AG",
"resources": [
{
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
- "namespace_prefix": "MONDO",
- "iri_prefix": "http://purl.obolibrary.org/obo/MONDO_"
+ "version": "2026-03-03",
+ "namespacePrefix": "MONDO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/MONDO_"
},
{
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
- "namespace_prefix": "HPO",
- "iri_prefix": "http://purl.obolibrary.org/obo/HP_"
+ "version": "2026-02-16",
+ "namespacePrefix": "HPO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/HP_"
},
{
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
- "namespace_prefix": "LOINC",
- "iri_prefix": "http://loinc.org"
+ "version": "281",
+ "namespacePrefix": "LOINC",
+ "iriPrefix": "http://loinc.org"
+ },
+ {
+ "id": "uo",
+ "name": "Units of Measurement Ontology",
+ "url": "https://www.ontobee.org/ontology/UO",
+ "version": "2026-01-16",
+ "namespacePrefix": "UO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/UO_"
},
{
"id": "hgnc",
"name": "HUGO Gene Nomenclature Committee",
"url": "https://www.genenames.org/",
"version": "2024-08-23",
- "namespace_prefix": "HGNC",
- "iri_prefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
+ "namespacePrefix": "HGNC",
+ "iriPrefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
},
{
"id": "hgvs",
"name": "Human Genome Variation Society",
"url": "https://varnomen.hgvs.org/",
"version": "21.0.0",
- "namespace_prefix": "HGVS",
- "iri_prefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ "namespacePrefix": "HGVS",
+ "iriPrefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ },
+ {
+ "id": "ga4gh",
+ "name": "Global Alliance for Genomics and Health",
+ "url": "https://www.ga4gh.org/",
+ "version": "v2.0",
+ "namespacePrefix": "GA4GH",
+ "iriPrefix": "https://www.ga4gh.org/"
},
{
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
- "namespace_prefix": "GENO",
- "iri_prefix": "http://purl.obolibrary.org/obo/GENO_"
+ "version": "2026-02-02",
+ "namespacePrefix": "GENO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/GENO_"
}
],
- "phenopacket_schema_version": "2.0"
+ "phenopacketSchemaVersion": "2.0"
}
}
\ No newline at end of file
diff --git a/res/evaluation_cohort/phenopackets/3.json b/res/evaluation_cohort/phenopackets/3.json
index 4f94d572d..f396abd3b 100644
--- a/res/evaluation_cohort/phenopackets/3.json
+++ b/res/evaluation_cohort/phenopackets/3.json
@@ -2,16 +2,15 @@
"id": "3",
"subject": {
"id": "EvCo3",
- "date_of_birth": "2017-06-17T00:00:00Z",
- "time_at_last_encounter": {
+ "dateOfBirth": "2017-06-17T00:00:00Z",
+ "timeAtLastEncounter": {
"age": {
"iso8601duration": "P7Y9M"
}
},
- "vital_status": {
+ "vitalStatus": {
"status": "ALIVE"
},
- "sex": "MALE",
"gender": {
"id": "SNOMEDCT:446151000124109",
"label": "Male gender identity"
@@ -21,7 +20,7 @@
"label": "Homo sapiens"
}
},
- "phenotypic_features": [
+ "phenotypicFeatures": [
{
"type": {
"id": "HP:0000637",
@@ -32,7 +31,7 @@
"label": "Moderate"
},
"onset": {
- "ontology_class": {
+ "ontologyClass": {
"id": "HP:0003577",
"label": "Congenital onset (at birth)"
}
@@ -168,7 +167,7 @@
"value": 1.2
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P3Y7M"
}
@@ -188,7 +187,7 @@
"value": 4.8
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P3Y7M"
}
@@ -198,22 +197,22 @@
"interpretations": [
{
"id": "EvCo3-interpretation-0",
- "progress_status": "SOLVED",
+ "progressStatus": "SOLVED",
"diagnosis": {
"disease": {
"id": "MONDO:0007843",
"label": "Kabuki syndrome 1"
},
- "genomic_interpretations": [
+ "genomicInterpretations": [
{
- "subject_or_biosample_id": "1",
- "interpretation_status": "CANDIDATE",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "LIKELY_PATHOGENIC",
- "variation_descriptor": {
- "id": "d7ae57fd6f1441a795125fad2a332d",
- "gene_context": {
- "value_id": "HGNC:7132",
+ "subjectOrBiosampleId": "1",
+ "interpretationStatus": "CANDIDATE",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "LIKELY_PATHOGENIC",
+ "variationDescriptor": {
+ "id": "56ccf74919fe41b789734bfe705ff5",
+ "geneContext": {
+ "valueId": "HGNC:7132",
"symbol": "KMT2A"
},
"expressions": [
@@ -222,7 +221,7 @@
"value": "NM_001197104.2:c.3019G>T"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000458",
"label": "Heterozygous"
}
@@ -246,59 +245,75 @@
}
}
],
- "meta_data": {
- "created": "2025-09-23T15:32:38.350095Z",
- "created_by": "Adam G.",
+ "metaData": {
+ "created": "2026-03-29T18:06:25.326972Z",
+ "createdBy": "AG",
"resources": [
{
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
- "namespace_prefix": "MONDO",
- "iri_prefix": "http://purl.obolibrary.org/obo/MONDO_"
+ "version": "2026-03-03",
+ "namespacePrefix": "MONDO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/MONDO_"
},
{
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
- "namespace_prefix": "HPO",
- "iri_prefix": "http://purl.obolibrary.org/obo/HP_"
+ "version": "2026-02-16",
+ "namespacePrefix": "HPO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/HP_"
},
{
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
- "namespace_prefix": "LOINC",
- "iri_prefix": "http://loinc.org"
+ "version": "v281",
+ "namespacePrefix": "LOINC",
+ "iriPrefix": "http://loinc.org"
+ },
+ {
+ "id": "uo",
+ "name": "Units of Measurement Ontology",
+ "url": "https://www.ontobee.org/ontology/UO",
+ "version": "2026-01-16",
+ "namespacePrefix": "UO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/UO_"
},
{
"id": "hgnc",
"name": "HUGO Gene Nomenclature Committee",
"url": "https://www.genenames.org/",
"version": "2024-08-23",
- "namespace_prefix": "HGNC",
- "iri_prefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
+ "namespacePrefix": "HGNC",
+ "iriPrefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
},
{
"id": "hgvs",
"name": "Human Genome Variation Society",
"url": "https://varnomen.hgvs.org/",
"version": "21.0.0",
- "namespace_prefix": "HGVS",
- "iri_prefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ "namespacePrefix": "HGVS",
+ "iriPrefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ },
+ {
+ "id": "ga4gh",
+ "name": "Global Alliance for Genomics and Health",
+ "url": "https://www.ga4gh.org/",
+ "version": "v2.0",
+ "namespacePrefix": "GA4GH",
+ "iriPrefix": "https://www.ga4gh.org/"
},
{
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
- "namespace_prefix": "GENO",
- "iri_prefix": "http://purl.obolibrary.org/obo/GENO_"
+ "version": "2026-02-02",
+ "namespacePrefix": "GENO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/GENO_"
}
],
- "phenopacket_schema_version": "2.0"
+ "phenopacketSchemaVersion": "2.0"
}
}
\ No newline at end of file
diff --git a/res/evaluation_cohort/phenopackets/4.json b/res/evaluation_cohort/phenopackets/4.json
index 44fd72165..39e6d6c0b 100644
--- a/res/evaluation_cohort/phenopackets/4.json
+++ b/res/evaluation_cohort/phenopackets/4.json
@@ -2,16 +2,15 @@
"id": "4",
"subject": {
"id": "EvCo4",
- "date_of_birth": "2010-02-20T00:00:00Z",
- "time_at_last_encounter": {
+ "dateOfBirth": "2010-02-20T00:00:00Z",
+ "timeAtLastEncounter": {
"age": {
"iso8601duration": "P15Y1M"
}
},
- "vital_status": {
+ "vitalStatus": {
"status": "ALIVE"
},
- "sex": "FEMALE",
"gender": {
"id": "SNOMEDCT:1220561009",
"label": "Not recorded"
@@ -21,7 +20,7 @@
"label": "Homo sapiens"
}
},
- "phenotypic_features": [
+ "phenotypicFeatures": [
{
"type": {
"id": "HP:0000175",
@@ -75,7 +74,7 @@
"value": 6.2
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P11Y4M"
}
@@ -95,7 +94,7 @@
"value": 4.8
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P11Y4M"
}
@@ -115,7 +114,7 @@
"value": 14.5
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P12Y10M"
}
@@ -135,7 +134,7 @@
"value": 5.6
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P12Y10M"
}
@@ -145,22 +144,22 @@
"interpretations": [
{
"id": "EvCo4-interpretation-0",
- "progress_status": "COMPLETED",
+ "progressStatus": "COMPLETED",
"diagnosis": {
"disease": {
"id": "MONDO:0007843",
"label": "Kabuki syndrome 1"
},
- "genomic_interpretations": [
+ "genomicInterpretations": [
{
- "subject_or_biosample_id": "1",
- "interpretation_status": "CONTRIBUTORY",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "PATHOGENIC",
- "variation_descriptor": {
- "id": "9c3330eeeaa34d0b822430718543bc",
- "gene_context": {
- "value_id": "HGNC:7133",
+ "subjectOrBiosampleId": "1",
+ "interpretationStatus": "CONTRIBUTORY",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "PATHOGENIC",
+ "variationDescriptor": {
+ "id": "1c7f0a2a3ab64aa8ba9d4382114005",
+ "geneContext": {
+ "valueId": "HGNC:7133",
"symbol": "KMT2D"
},
"expressions": [
@@ -169,7 +168,7 @@
"value": "NM_003482.4:c.16522-5_16522-2del"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000458",
"label": "Heterozygous"
}
@@ -193,59 +192,75 @@
}
}
],
- "meta_data": {
- "created": "2025-09-23T15:32:48.269920Z",
- "created_by": "Adam G.",
+ "metaData": {
+ "created": "2026-03-29T18:06:26.027165Z",
+ "createdBy": "AG",
"resources": [
{
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
- "namespace_prefix": "MONDO",
- "iri_prefix": "http://purl.obolibrary.org/obo/MONDO_"
+ "version": "2026-03-03",
+ "namespacePrefix": "MONDO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/MONDO_"
},
{
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
- "namespace_prefix": "HPO",
- "iri_prefix": "http://purl.obolibrary.org/obo/HP_"
+ "version": "2026-02-16",
+ "namespacePrefix": "HPO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/HP_"
},
{
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
- "namespace_prefix": "LOINC",
- "iri_prefix": "http://loinc.org"
+ "version": "v281",
+ "namespacePrefix": "LOINC",
+ "iriPrefix": "http://loinc.org"
+ },
+ {
+ "id": "uo",
+ "name": "Units of Measurement Ontology",
+ "url": "https://www.ontobee.org/ontology/UO",
+ "version": "2026-01-16",
+ "namespacePrefix": "UO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/UO_"
},
{
"id": "hgnc",
"name": "HUGO Gene Nomenclature Committee",
"url": "https://www.genenames.org/",
"version": "2024-08-23",
- "namespace_prefix": "HGNC",
- "iri_prefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
+ "namespacePrefix": "HGNC",
+ "iriPrefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
},
{
"id": "hgvs",
"name": "Human Genome Variation Society",
"url": "https://varnomen.hgvs.org/",
"version": "21.0.0",
- "namespace_prefix": "HGVS",
- "iri_prefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ "namespacePrefix": "HGVS",
+ "iriPrefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ },
+ {
+ "id": "ga4gh",
+ "name": "Global Alliance for Genomics and Health",
+ "url": "https://www.ga4gh.org/",
+ "version": "v2.0",
+ "namespacePrefix": "GA4GH",
+ "iriPrefix": "https://www.ga4gh.org/"
},
{
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
- "namespace_prefix": "GENO",
- "iri_prefix": "http://purl.obolibrary.org/obo/GENO_"
+ "version": "2026-02-02",
+ "namespacePrefix": "GENO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/GENO_"
}
],
- "phenopacket_schema_version": "2.0"
+ "phenopacketSchemaVersion": "2.0"
}
}
\ No newline at end of file
diff --git a/res/evaluation_cohort/phenopackets/5.json b/res/evaluation_cohort/phenopackets/5.json
index 755def023..14df91cef 100644
--- a/res/evaluation_cohort/phenopackets/5.json
+++ b/res/evaluation_cohort/phenopackets/5.json
@@ -2,16 +2,15 @@
"id": "5",
"subject": {
"id": "EvCo5",
- "date_of_birth": "2014-10-05T00:00:00Z",
- "time_at_last_encounter": {
+ "dateOfBirth": "2014-10-05T00:00:00Z",
+ "timeAtLastEncounter": {
"age": {
"iso8601duration": "P10Y6M"
}
},
- "vital_status": {
+ "vitalStatus": {
"status": "ALIVE"
},
- "sex": "MALE",
"gender": {
"id": "SNOMEDCT:446151000124109",
"label": "Male gender identity"
@@ -21,7 +20,7 @@
"label": "Homo sapiens"
}
},
- "phenotypic_features": [
+ "phenotypicFeatures": [
{
"type": {
"id": "HP:0001212",
@@ -142,7 +141,7 @@
"value": 3.9
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P6Y1M"
}
@@ -162,7 +161,7 @@
"value": 2.0
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P6Y1M"
}
@@ -182,7 +181,7 @@
"value": 4.3
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P7Y1M"
}
@@ -202,7 +201,7 @@
"value": 3.2
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P7Y1M"
}
@@ -222,7 +221,7 @@
"value": 5.6
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P8Y1M"
}
@@ -242,7 +241,7 @@
"value": 1.9
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P8Y1M"
}
@@ -252,22 +251,22 @@
"interpretations": [
{
"id": "EvCo5-interpretation-0",
- "progress_status": "COMPLETED",
+ "progressStatus": "COMPLETED",
"diagnosis": {
"disease": {
"id": "MONDO:0007843",
"label": "Kabuki syndrome 1"
},
- "genomic_interpretations": [
+ "genomicInterpretations": [
{
- "subject_or_biosample_id": "1",
- "interpretation_status": "CAUSATIVE",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "LIKELY_PATHOGENIC",
- "variation_descriptor": {
- "id": "e0bbac243c534394a5c7b50e3c3716",
- "gene_context": {
- "value_id": "HGNC:7132",
+ "subjectOrBiosampleId": "1",
+ "interpretationStatus": "CAUSATIVE",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "LIKELY_PATHOGENIC",
+ "variationDescriptor": {
+ "id": "b2fc179417024104aa451703fd03cf",
+ "geneContext": {
+ "valueId": "HGNC:7132",
"symbol": "KMT2A"
},
"expressions": [
@@ -276,7 +275,7 @@
"value": "NM_001197104.2:c.5803-1G>A"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000458",
"label": "Heterozygous"
}
@@ -300,59 +299,75 @@
}
}
],
- "meta_data": {
- "created": "2025-09-23T15:33:02.850795Z",
- "created_by": "Adam G.",
+ "metaData": {
+ "created": "2026-03-29T18:06:28.116016Z",
+ "createdBy": "AG",
"resources": [
{
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
- "namespace_prefix": "MONDO",
- "iri_prefix": "http://purl.obolibrary.org/obo/MONDO_"
+ "version": "2026-03-03",
+ "namespacePrefix": "MONDO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/MONDO_"
},
{
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
- "namespace_prefix": "HPO",
- "iri_prefix": "http://purl.obolibrary.org/obo/HP_"
+ "version": "2026-02-16",
+ "namespacePrefix": "HPO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/HP_"
},
{
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
- "namespace_prefix": "LOINC",
- "iri_prefix": "http://loinc.org"
+ "version": "v281",
+ "namespacePrefix": "LOINC",
+ "iriPrefix": "http://loinc.org"
+ },
+ {
+ "id": "uo",
+ "name": "Units of Measurement Ontology",
+ "url": "https://www.ontobee.org/ontology/UO",
+ "version": "2026-01-16",
+ "namespacePrefix": "UO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/UO_"
},
{
"id": "hgnc",
"name": "HUGO Gene Nomenclature Committee",
"url": "https://www.genenames.org/",
"version": "2024-08-23",
- "namespace_prefix": "HGNC",
- "iri_prefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
+ "namespacePrefix": "HGNC",
+ "iriPrefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
},
{
"id": "hgvs",
"name": "Human Genome Variation Society",
"url": "https://varnomen.hgvs.org/",
"version": "21.0.0",
- "namespace_prefix": "HGVS",
- "iri_prefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ "namespacePrefix": "HGVS",
+ "iriPrefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ },
+ {
+ "id": "ga4gh",
+ "name": "Global Alliance for Genomics and Health",
+ "url": "https://www.ga4gh.org/",
+ "version": "v2.0",
+ "namespacePrefix": "GA4GH",
+ "iriPrefix": "https://www.ga4gh.org/"
},
{
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
- "namespace_prefix": "GENO",
- "iri_prefix": "http://purl.obolibrary.org/obo/GENO_"
+ "version": "2026-02-02",
+ "namespacePrefix": "GENO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/GENO_"
}
],
- "phenopacket_schema_version": "2.0"
+ "phenopacketSchemaVersion": "2.0"
}
}
\ No newline at end of file
diff --git a/res/evaluation_cohort/phenopackets/6.json b/res/evaluation_cohort/phenopackets/6.json
index 28608aa51..03ab38ab3 100644
--- a/res/evaluation_cohort/phenopackets/6.json
+++ b/res/evaluation_cohort/phenopackets/6.json
@@ -2,16 +2,15 @@
"id": "6",
"subject": {
"id": "EvCo6",
- "date_of_birth": "2014-10-05T00:00:00Z",
- "time_at_last_encounter": {
+ "dateOfBirth": "2014-10-05T00:00:00Z",
+ "timeAtLastEncounter": {
"age": {
"iso8601duration": "P10Y6M"
}
},
- "vital_status": {
+ "vitalStatus": {
"status": "ALIVE"
},
- "sex": "FEMALE",
"gender": {
"id": "SNOMEDCT:446141000124107",
"label": "Female gender identity"
@@ -21,7 +20,7 @@
"label": "Homo sapiens"
}
},
- "phenotypic_features": [
+ "phenotypicFeatures": [
{
"type": {
"id": "HP:0000508",
@@ -70,7 +69,7 @@
"value": 6.1
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P7Y6M"
}
@@ -90,7 +89,7 @@
"value": 5.5
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P7Y6M"
}
@@ -110,7 +109,7 @@
"value": 4.0
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P7Y6M"
}
@@ -130,7 +129,7 @@
"value": 2.2
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P7Y6M"
}
@@ -140,22 +139,22 @@
"interpretations": [
{
"id": "EvCo6-interpretation-0",
- "progress_status": "SOLVED",
+ "progressStatus": "SOLVED",
"diagnosis": {
"disease": {
"id": "MONDO:0007843",
"label": "Kabuki syndrome 1"
},
- "genomic_interpretations": [
+ "genomicInterpretations": [
{
- "subject_or_biosample_id": "1",
- "interpretation_status": "CONTRIBUTORY",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "LIKELY_PATHOGENIC",
- "variation_descriptor": {
- "id": "b96fd76458bc408ea35301b3ca579e",
- "gene_context": {
- "value_id": "HGNC:7133",
+ "subjectOrBiosampleId": "1",
+ "interpretationStatus": "CONTRIBUTORY",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "LIKELY_PATHOGENIC",
+ "variationDescriptor": {
+ "id": "4d595fb8e7684a64ac4849c0084324",
+ "geneContext": {
+ "valueId": "HGNC:7133",
"symbol": "KMT2D"
},
"expressions": [
@@ -164,7 +163,7 @@
"value": "NM_003482.4:c.16529A>G"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000458",
"label": "Heterozygous"
}
@@ -188,59 +187,75 @@
}
}
],
- "meta_data": {
- "created": "2025-09-23T15:33:12.451062Z",
- "created_by": "Adam G.",
+ "metaData": {
+ "created": "2026-03-29T18:06:28.119250Z",
+ "createdBy": "AG",
"resources": [
{
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
- "namespace_prefix": "MONDO",
- "iri_prefix": "http://purl.obolibrary.org/obo/MONDO_"
+ "version": "2026-03-03",
+ "namespacePrefix": "MONDO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/MONDO_"
},
{
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
- "namespace_prefix": "HPO",
- "iri_prefix": "http://purl.obolibrary.org/obo/HP_"
+ "version": "2026-02-16",
+ "namespacePrefix": "HPO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/HP_"
},
{
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
- "namespace_prefix": "LOINC",
- "iri_prefix": "http://loinc.org"
+ "version": "v281",
+ "namespacePrefix": "LOINC",
+ "iriPrefix": "http://loinc.org"
+ },
+ {
+ "id": "uo",
+ "name": "Units of Measurement Ontology",
+ "url": "https://www.ontobee.org/ontology/UO",
+ "version": "2026-01-16",
+ "namespacePrefix": "UO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/UO_"
},
{
"id": "hgnc",
"name": "HUGO Gene Nomenclature Committee",
"url": "https://www.genenames.org/",
"version": "2024-08-23",
- "namespace_prefix": "HGNC",
- "iri_prefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
+ "namespacePrefix": "HGNC",
+ "iriPrefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
},
{
"id": "hgvs",
"name": "Human Genome Variation Society",
"url": "https://varnomen.hgvs.org/",
"version": "21.0.0",
- "namespace_prefix": "HGVS",
- "iri_prefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ "namespacePrefix": "HGVS",
+ "iriPrefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ },
+ {
+ "id": "ga4gh",
+ "name": "Global Alliance for Genomics and Health",
+ "url": "https://www.ga4gh.org/",
+ "version": "v2.0",
+ "namespacePrefix": "GA4GH",
+ "iriPrefix": "https://www.ga4gh.org/"
},
{
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
- "namespace_prefix": "GENO",
- "iri_prefix": "http://purl.obolibrary.org/obo/GENO_"
+ "version": "2026-02-02",
+ "namespacePrefix": "GENO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/GENO_"
}
],
- "phenopacket_schema_version": "2.0"
+ "phenopacketSchemaVersion": "2.0"
}
}
\ No newline at end of file
diff --git a/res/evaluation_cohort/phenopackets/7.json b/res/evaluation_cohort/phenopackets/7.json
index 34938ff8c..0dca29133 100644
--- a/res/evaluation_cohort/phenopackets/7.json
+++ b/res/evaluation_cohort/phenopackets/7.json
@@ -2,16 +2,15 @@
"id": "7",
"subject": {
"id": "EvCo7",
- "date_of_birth": "2016-04-25T00:00:00Z",
- "time_at_last_encounter": {
+ "dateOfBirth": "2016-04-25T00:00:00Z",
+ "timeAtLastEncounter": {
"age": {
"iso8601duration": "P8Y11M"
}
},
- "vital_status": {
+ "vitalStatus": {
"status": "ALIVE"
},
- "sex": "MALE",
"gender": {
"id": "SNOMEDCT:446151000124109",
"label": "Male gender identity"
@@ -21,7 +20,7 @@
"label": "Homo sapiens"
}
},
- "phenotypic_features": [
+ "phenotypicFeatures": [
{
"type": {
"id": "HP:0002553",
@@ -90,7 +89,7 @@
"value": 5.9
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P4Y4M"
}
@@ -110,7 +109,7 @@
"value": 2.3
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P4Y4M"
}
@@ -130,7 +129,7 @@
"value": 6.3
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P4Y5M"
}
@@ -150,7 +149,7 @@
"value": 2.3
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P4Y5M"
}
@@ -160,22 +159,22 @@
"interpretations": [
{
"id": "EvCo7-interpretation-0",
- "progress_status": "COMPLETED",
+ "progressStatus": "COMPLETED",
"diagnosis": {
"disease": {
"id": "MONDO:0007843",
"label": "Kabuki syndrome 1"
},
- "genomic_interpretations": [
+ "genomicInterpretations": [
{
- "subject_or_biosample_id": "1",
- "interpretation_status": "CONTRIBUTORY",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "PATHOGENIC",
- "variation_descriptor": {
- "id": "e4bedc38ed1e48fc8edcd14b3ff58b",
- "gene_context": {
- "value_id": "HGNC:29508",
+ "subjectOrBiosampleId": "1",
+ "interpretationStatus": "CONTRIBUTORY",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "PATHOGENIC",
+ "variationDescriptor": {
+ "id": "8d74247b4c054eccbd293a11b4ad2e",
+ "geneContext": {
+ "valueId": "HGNC:29508",
"symbol": "KIDINS220"
},
"expressions": [
@@ -184,7 +183,7 @@
"value": "NM_020738.4:c.4269del"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000458",
"label": "Heterozygous"
}
@@ -208,59 +207,75 @@
}
}
],
- "meta_data": {
- "created": "2025-09-23T15:33:23.098017Z",
- "created_by": "Adam G.",
+ "metaData": {
+ "created": "2026-03-29T18:06:28.811493Z",
+ "createdBy": "AG",
"resources": [
{
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
- "namespace_prefix": "MONDO",
- "iri_prefix": "http://purl.obolibrary.org/obo/MONDO_"
+ "version": "2026-03-03",
+ "namespacePrefix": "MONDO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/MONDO_"
},
{
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
- "namespace_prefix": "HPO",
- "iri_prefix": "http://purl.obolibrary.org/obo/HP_"
+ "version": "2026-02-16",
+ "namespacePrefix": "HPO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/HP_"
},
{
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
- "namespace_prefix": "LOINC",
- "iri_prefix": "http://loinc.org"
+ "version": "v281",
+ "namespacePrefix": "LOINC",
+ "iriPrefix": "http://loinc.org"
+ },
+ {
+ "id": "uo",
+ "name": "Units of Measurement Ontology",
+ "url": "https://www.ontobee.org/ontology/UO",
+ "version": "2026-01-16",
+ "namespacePrefix": "UO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/UO_"
},
{
"id": "hgnc",
"name": "HUGO Gene Nomenclature Committee",
"url": "https://www.genenames.org/",
"version": "2024-08-23",
- "namespace_prefix": "HGNC",
- "iri_prefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
+ "namespacePrefix": "HGNC",
+ "iriPrefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
},
{
"id": "hgvs",
"name": "Human Genome Variation Society",
"url": "https://varnomen.hgvs.org/",
"version": "21.0.0",
- "namespace_prefix": "HGVS",
- "iri_prefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ "namespacePrefix": "HGVS",
+ "iriPrefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ },
+ {
+ "id": "ga4gh",
+ "name": "Global Alliance for Genomics and Health",
+ "url": "https://www.ga4gh.org/",
+ "version": "v2.0",
+ "namespacePrefix": "GA4GH",
+ "iriPrefix": "https://www.ga4gh.org/"
},
{
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
- "namespace_prefix": "GENO",
- "iri_prefix": "http://purl.obolibrary.org/obo/GENO_"
+ "version": "2026-02-02",
+ "namespacePrefix": "GENO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/GENO_"
}
],
- "phenopacket_schema_version": "2.0"
+ "phenopacketSchemaVersion": "2.0"
}
}
\ No newline at end of file
diff --git a/res/evaluation_cohort/phenopackets/8.json b/res/evaluation_cohort/phenopackets/8.json
index 56d41b6e6..2a3690986 100644
--- a/res/evaluation_cohort/phenopackets/8.json
+++ b/res/evaluation_cohort/phenopackets/8.json
@@ -2,16 +2,15 @@
"id": "8",
"subject": {
"id": "EvCo8",
- "date_of_birth": "2009-12-03T00:00:00Z",
- "time_at_last_encounter": {
+ "dateOfBirth": "2009-12-03T00:00:00Z",
+ "timeAtLastEncounter": {
"age": {
"iso8601duration": "P15Y4M"
}
},
- "vital_status": {
+ "vitalStatus": {
"status": "ALIVE"
},
- "sex": "FEMALE",
"gender": {
"id": "SNOMEDCT:446141000124107",
"label": "Female gender identity"
@@ -21,7 +20,7 @@
"label": "Homo sapiens"
}
},
- "phenotypic_features": [
+ "phenotypicFeatures": [
{
"type": {
"id": "HP:0000400",
@@ -128,7 +127,7 @@
"value": 5.4
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P11Y5M"
}
@@ -148,7 +147,7 @@
"value": 0.2
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P11Y5M"
}
@@ -168,7 +167,7 @@
"value": 6.1
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P12Y5M"
}
@@ -188,7 +187,7 @@
"value": 1.1
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P12Y5M"
}
@@ -198,22 +197,22 @@
"interpretations": [
{
"id": "EvCo8-interpretation-0",
- "progress_status": "COMPLETED",
+ "progressStatus": "COMPLETED",
"diagnosis": {
"disease": {
"id": "MONDO:0007843",
"label": "Kabuki syndrome 1"
},
- "genomic_interpretations": [
+ "genomicInterpretations": [
{
- "subject_or_biosample_id": "1",
- "interpretation_status": "CONTRIBUTORY",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "LIKELY_PATHOGENIC",
- "variation_descriptor": {
- "id": "2e6f601474b24340b30f8403ac308e",
- "gene_context": {
- "value_id": "HGNC:7132",
+ "subjectOrBiosampleId": "1",
+ "interpretationStatus": "CONTRIBUTORY",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "LIKELY_PATHOGENIC",
+ "variationDescriptor": {
+ "id": "24d5d0d83d33468aada972960bb755",
+ "geneContext": {
+ "valueId": "HGNC:7132",
"symbol": "KMT2A"
},
"expressions": [
@@ -222,7 +221,7 @@
"value": "NM_001197104.2:c.3019G>T"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000458",
"label": "Heterozygous"
}
@@ -246,59 +245,75 @@
}
}
],
- "meta_data": {
- "created": "2025-09-23T15:33:35.095868Z",
- "created_by": "Adam G.",
+ "metaData": {
+ "created": "2026-03-29T18:06:30.217515Z",
+ "createdBy": "AG",
"resources": [
{
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
- "namespace_prefix": "MONDO",
- "iri_prefix": "http://purl.obolibrary.org/obo/MONDO_"
+ "version": "2026-03-03",
+ "namespacePrefix": "MONDO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/MONDO_"
},
{
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
- "namespace_prefix": "HPO",
- "iri_prefix": "http://purl.obolibrary.org/obo/HP_"
+ "version": "2026-02-16",
+ "namespacePrefix": "HPO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/HP_"
},
{
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
- "namespace_prefix": "LOINC",
- "iri_prefix": "http://loinc.org"
+ "version": "v281",
+ "namespacePrefix": "LOINC",
+ "iriPrefix": "http://loinc.org"
+ },
+ {
+ "id": "uo",
+ "name": "Units of Measurement Ontology",
+ "url": "https://www.ontobee.org/ontology/UO",
+ "version": "2026-01-16",
+ "namespacePrefix": "UO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/UO_"
},
{
"id": "hgnc",
"name": "HUGO Gene Nomenclature Committee",
"url": "https://www.genenames.org/",
"version": "2024-08-23",
- "namespace_prefix": "HGNC",
- "iri_prefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
+ "namespacePrefix": "HGNC",
+ "iriPrefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
},
{
"id": "hgvs",
"name": "Human Genome Variation Society",
"url": "https://varnomen.hgvs.org/",
"version": "21.0.0",
- "namespace_prefix": "HGVS",
- "iri_prefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ "namespacePrefix": "HGVS",
+ "iriPrefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ },
+ {
+ "id": "ga4gh",
+ "name": "Global Alliance for Genomics and Health",
+ "url": "https://www.ga4gh.org/",
+ "version": "v2.0",
+ "namespacePrefix": "GA4GH",
+ "iriPrefix": "https://www.ga4gh.org/"
},
{
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
- "namespace_prefix": "GENO",
- "iri_prefix": "http://purl.obolibrary.org/obo/GENO_"
+ "version": "2026-02-02",
+ "namespacePrefix": "GENO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/GENO_"
}
],
- "phenopacket_schema_version": "2.0"
+ "phenopacketSchemaVersion": "2.0"
}
}
\ No newline at end of file
diff --git a/res/evaluation_cohort/phenopackets/9.json b/res/evaluation_cohort/phenopackets/9.json
index fd8e9e5b9..cd598a799 100644
--- a/res/evaluation_cohort/phenopackets/9.json
+++ b/res/evaluation_cohort/phenopackets/9.json
@@ -2,16 +2,15 @@
"id": "9",
"subject": {
"id": "EvCo9",
- "date_of_birth": "2013-08-30T00:00:00Z",
- "time_at_last_encounter": {
+ "dateOfBirth": "2013-08-30T00:00:00Z",
+ "timeAtLastEncounter": {
"age": {
"iso8601duration": "P11Y7M"
}
},
- "vital_status": {
+ "vitalStatus": {
"status": "ALIVE"
},
- "sex": "MALE",
"gender": {
"id": "SNOMEDCT:446151000124109",
"label": "Male gender identity"
@@ -21,7 +20,7 @@
"label": "Homo sapiens"
}
},
- "phenotypic_features": [
+ "phenotypicFeatures": [
{
"type": {
"id": "HP:0002553",
@@ -107,7 +106,7 @@
"value": 8.0
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P9Y6M"
}
@@ -127,7 +126,7 @@
"value": 2.6
}
},
- "time_observed": {
+ "timeObserved": {
"age": {
"iso8601duration": "P9Y6M"
}
@@ -137,22 +136,22 @@
"interpretations": [
{
"id": "EvCo9-interpretation-0",
- "progress_status": "COMPLETED",
+ "progressStatus": "COMPLETED",
"diagnosis": {
"disease": {
"id": "MONDO:0007843",
"label": "Kabuki syndrome 1"
},
- "genomic_interpretations": [
+ "genomicInterpretations": [
{
- "subject_or_biosample_id": "1",
- "interpretation_status": "CONTRIBUTORY",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "PATHOGENIC",
- "variation_descriptor": {
- "id": "05340f24cb68423f885cc46114a84b",
- "gene_context": {
- "value_id": "HGNC:7132",
+ "subjectOrBiosampleId": "1",
+ "interpretationStatus": "CONTRIBUTORY",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "PATHOGENIC",
+ "variationDescriptor": {
+ "id": "6f78f0987b454793b23a632680be19",
+ "geneContext": {
+ "valueId": "HGNC:7132",
"symbol": "KMT2A"
},
"expressions": [
@@ -161,7 +160,7 @@
"value": "NM_001197104.2:c.3019G>T"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000402",
"label": "Compound heterozygous"
}
@@ -169,14 +168,14 @@
}
},
{
- "subject_or_biosample_id": "2",
- "interpretation_status": "CONTRIBUTORY",
- "variant_interpretation": {
- "acmg_pathogenicity_classification": "PATHOGENIC",
- "variation_descriptor": {
- "id": "9e02bb2e05984371967fb8278f3ff7",
- "gene_context": {
- "value_id": "HGNC:7133",
+ "subjectOrBiosampleId": "2",
+ "interpretationStatus": "CONTRIBUTORY",
+ "variantInterpretation": {
+ "acmgPathogenicityClassification": "PATHOGENIC",
+ "variationDescriptor": {
+ "id": "599c7b7b25df41c6b426128e3bb06d",
+ "geneContext": {
+ "valueId": "HGNC:7133",
"symbol": "KMT2D"
},
"expressions": [
@@ -185,7 +184,7 @@
"value": "NM_003482.4:c.16529A>G"
}
],
- "allelic_state": {
+ "allelicState": {
"id": "GENO:0000402",
"label": "Compound heterozygous"
}
@@ -209,59 +208,75 @@
}
}
],
- "meta_data": {
- "created": "2025-09-23T15:33:45.047014Z",
- "created_by": "Adam G.",
+ "metaData": {
+ "created": "2026-03-29T18:06:30.219999Z",
+ "createdBy": "AG",
"resources": [
{
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
- "namespace_prefix": "MONDO",
- "iri_prefix": "http://purl.obolibrary.org/obo/MONDO_"
+ "version": "2026-03-03",
+ "namespacePrefix": "MONDO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/MONDO_"
},
{
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
- "namespace_prefix": "HPO",
- "iri_prefix": "http://purl.obolibrary.org/obo/HP_"
+ "version": "2026-02-16",
+ "namespacePrefix": "HPO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/HP_"
},
{
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
- "namespace_prefix": "LOINC",
- "iri_prefix": "http://loinc.org"
+ "version": "v281",
+ "namespacePrefix": "LOINC",
+ "iriPrefix": "http://loinc.org"
+ },
+ {
+ "id": "uo",
+ "name": "Units of Measurement Ontology",
+ "url": "https://www.ontobee.org/ontology/UO",
+ "version": "2026-01-16",
+ "namespacePrefix": "UO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/UO_"
},
{
"id": "hgnc",
"name": "HUGO Gene Nomenclature Committee",
"url": "https://www.genenames.org/",
"version": "2024-08-23",
- "namespace_prefix": "HGNC",
- "iri_prefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
+ "namespacePrefix": "HGNC",
+ "iriPrefix": "https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/"
},
{
"id": "hgvs",
"name": "Human Genome Variation Society",
"url": "https://varnomen.hgvs.org/",
"version": "21.0.0",
- "namespace_prefix": "HGVS",
- "iri_prefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ "namespacePrefix": "HGVS",
+ "iriPrefix": "https://varnomen.hgvs.org/recommendations/variant/"
+ },
+ {
+ "id": "ga4gh",
+ "name": "Global Alliance for Genomics and Health",
+ "url": "https://www.ga4gh.org/",
+ "version": "v2.0",
+ "namespacePrefix": "GA4GH",
+ "iriPrefix": "https://www.ga4gh.org/"
},
{
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
- "namespace_prefix": "GENO",
- "iri_prefix": "http://purl.obolibrary.org/obo/GENO_"
+ "version": "2026-02-02",
+ "namespacePrefix": "GENO",
+ "iriPrefix": "http://purl.obolibrary.org/obo/GENO_"
}
],
- "phenopacket_schema_version": "2.0"
+ "phenopacketSchemaVersion": "2.0"
}
}
\ No newline at end of file
diff --git a/res/evaluation_cohort/phenopackets/failures.json b/res/evaluation_cohort/phenopackets/failures.json
deleted file mode 100644
index 5b12ec3d4..000000000
--- a/res/evaluation_cohort/phenopackets/failures.json
+++ /dev/null
@@ -1,42 +0,0 @@
-[
- {
- "record_id": "1",
- "error": "'tuple' object has no attribute 'mapping_config'"
- },
- {
- "record_id": "2",
- "error": "'tuple' object has no attribute 'mapping_config'"
- },
- {
- "record_id": "3",
- "error": "'tuple' object has no attribute 'mapping_config'"
- },
- {
- "record_id": "4",
- "error": "'tuple' object has no attribute 'mapping_config'"
- },
- {
- "record_id": "5",
- "error": "'tuple' object has no attribute 'mapping_config'"
- },
- {
- "record_id": "6",
- "error": "'tuple' object has no attribute 'mapping_config'"
- },
- {
- "record_id": "7",
- "error": "'tuple' object has no attribute 'mapping_config'"
- },
- {
- "record_id": "8",
- "error": "'tuple' object has no attribute 'mapping_config'"
- },
- {
- "record_id": "9",
- "error": "'tuple' object has no attribute 'mapping_config'"
- },
- {
- "record_id": "10",
- "error": "'tuple' object has no attribute 'mapping_config'"
- }
-]
\ No newline at end of file
diff --git a/res/evaluation_cohort/redcap/2025-06-03.code-search b/res/evaluation_cohort/redcap/2025-06-03.code-search
new file mode 100644
index 000000000..66f266e2a
--- /dev/null
+++ b/res/evaluation_cohort/redcap/2025-06-03.code-search
@@ -0,0 +1,170 @@
+# Query: 2025-06-03
+# ContextLines: 1
+
+35 results - 26 files
+
+res/evaluation_cohort/fhir/evco_fhir_diagnostic_implication.json:
+ 80 "system": "http://purl.obolibrary.org/obo/mondo.owl",
+ 81: "version": "2025-06-03",
+ 82 "code": "0007843"
+
+ 158 "system": "http://purl.obolibrary.org/obo/mondo.owl",
+ 159: "version": "2025-06-03",
+ 160 "code": "0007843"
+
+ 236 "system": "http://purl.obolibrary.org/obo/mondo.owl",
+ 237: "version": "2025-06-03",
+ 238 "code": "0007843"
+
+ 314 "system": "http://purl.obolibrary.org/obo/mondo.owl",
+ 315: "version": "2025-06-03",
+ 316 "code": "0007843"
+
+ 392 "system": "http://purl.obolibrary.org/obo/mondo.owl",
+ 393: "version": "2025-06-03",
+ 394 "code": "0007843"
+
+ 470 "system": "http://purl.obolibrary.org/obo/mondo.owl",
+ 471: "version": "2025-06-03",
+ 472 "code": "0007843"
+
+ 548 "system": "http://purl.obolibrary.org/obo/mondo.owl",
+ 549: "version": "2025-06-03",
+ 550 "code": "0007843"
+
+ 626 "system": "http://purl.obolibrary.org/obo/mondo.owl",
+ 627: "version": "2025-06-03",
+ 628 "code": "0007843"
+
+ 704 "system": "http://purl.obolibrary.org/obo/mondo.owl",
+ 705: "version": "2025-06-03",
+ 706 "code": "0007843"
+
+ 782 "system": "http://purl.obolibrary.org/obo/mondo.owl",
+ 783: "version": "2025-06-03",
+ 784 "code": "0007843"
+
+res/evaluation_cohort/fhir/evco_fhir_family_member_history.json:
+ 77 "system": "http://purl.obolibrary.org/obo/mondo.owl",
+ 78: "version": "2025-06-03",
+ 79 "code": "MONDO:0007843"
+
+res/evaluation_cohort/phenopackets/3.json:
+ 255 "url": "https://purl.obolibrary.org/obo/MONDO/",
+ 256: "version": "2025-06-03",
+ 257 "namespacePrefix": "MONDO",
+
+res/evaluation_cohort/phenopackets/4.json:
+ 202 "url": "https://purl.obolibrary.org/obo/MONDO/",
+ 203: "version": "2025-06-03",
+ 204 "namespacePrefix": "MONDO",
+
+res/evaluation_cohort/phenopackets/5.json:
+ 309 "url": "https://purl.obolibrary.org/obo/MONDO/",
+ 310: "version": "2025-06-03",
+ 311 "namespacePrefix": "MONDO",
+
+res/evaluation_cohort/phenopackets/6.json:
+ 197 "url": "https://purl.obolibrary.org/obo/MONDO/",
+ 198: "version": "2025-06-03",
+ 199 "namespacePrefix": "MONDO",
+
+res/evaluation_cohort/phenopackets/7.json:
+ 217 "url": "https://purl.obolibrary.org/obo/MONDO/",
+ 218: "version": "2025-06-03",
+ 219 "namespacePrefix": "MONDO",
+
+res/evaluation_cohort/phenopackets/8.json:
+ 255 "url": "https://purl.obolibrary.org/obo/MONDO/",
+ 256: "version": "2025-06-03",
+ 257 "namespacePrefix": "MONDO",
+
+res/evaluation_cohort/phenopackets/9.json:
+ 218 "url": "https://purl.obolibrary.org/obo/MONDO/",
+ 219: "version": "2025-06-03",
+ 220 "namespacePrefix": "MONDO",
+
+res/evaluation_cohort/phenopackets/10.json:
+ 304 "url": "https://purl.obolibrary.org/obo/MONDO/",
+ 305: "version": "2025-06-03",
+ 306 "namespacePrefix": "MONDO",
+
+src/fsh/input/fsh/Bundle-rarelink-example.json:
+ 222 "system": "http://purl.obolibrary.org/obo/mondo.owl",
+ 223: "version": "2025-06-03",
+ 224 "code": "0007843"
+
+src/rarelink/rarelink_cdm/python_datamodel/rarelink_2_personal_information.py:
+ 289 description="Monarch Disease Ontology",
+ 290: code_set_version="2025-06-03",
+ 291 )
+
+src/rarelink/rarelink_cdm/python_datamodel/rarelink_3_patient_status.py:
+ 252 description="Monarch Disease Ontology",
+ 253: code_set_version="2025-06-03",
+ 254 )
+
+src/rarelink/rarelink_cdm/python_datamodel/rarelink_4_care_pathway.py:
+ 249 description="Monarch Disease Ontology",
+ 250: code_set_version="2025-06-03",
+ 251 )
+
+src/rarelink/rarelink_cdm/python_datamodel/rarelink_5_diseases.py:
+ 404 description="Monarch Disease Ontology",
+ 405: code_set_version="2025-06-03",
+ 406 )
+
+src/rarelink/rarelink_cdm/python_datamodel/rarelink_6_1_genetic_findings.py:
+ 710 description="Monarch Disease Ontology",
+ 711: code_set_version="2025-06-03",
+ 712 )
+
+src/rarelink/rarelink_cdm/python_datamodel/rarelink_6_4_family_history.py:
+ 433 description="Monarch Disease Ontology",
+ 434: code_set_version="2025-06-03",
+ 435 )
+
+src/rarelink/rarelink_cdm/python_datamodel/rarelink_7_consent.py:
+ 247 description="Monarch Disease Ontology",
+ 248: code_set_version="2025-06-03",
+ 249 )
+
+src/rarelink/rarelink_cdm/python_datamodel/rarelink_cdm.py:
+ 930 description="Monarch Disease Ontology",
+ 931: code_set_version="2025-06-03",
+ 932 )
+
+src/rarelink/rarelink_cdm/python_datamodel/rarelink_repeated_elements.py:
+ 709 description="Monarch Disease Ontology",
+ 710: code_set_version="2025-06-03",
+ 711 )
+
+src/rarelink/tofhir/mappings/familymemberhistory.familyhistory.json:
+ 96 "system": "{{? iif(loinc_75315_2.empty().not(), 'http://purl.obolibrary.org/obo/mondo.owl')}}",
+ 97: "version": "{{? iif(loinc_75315_2.empty().not(),'2025-06-03')}}",
+ 98 "code": "{{? loinc_75315_2}}"
+
+src/rarelink/tofhir/mappings/genomicreporting.genetic_findings.json:
+ 446 "system": "{{? iif(snomedct_106221001_mondo.empty().not(), 'http://purl.obolibrary.org/obo/mondo.owl')}}",
+ 447: "version": "{{? iif(snomedct_106221001_mondo.empty().not(), '2025-06-03')}}"
+ 448 }
+
+src/rarelink/tofhir/mappings/ips.condition.json:
+ 42 "code": "{{? iif(snomedct_64572001_mondo.empty().not(), snomedct_64572001_mondo.substring(6))}}",
+ 43: "version": "{{? iif(snomedct_64572001_mondo.empty().not(), '2025-06-03')}}"
+ 44 },
+
+tests/phenopackets/test_data/101.json:
+ 455 "url": "https://purl.obolibrary.org/obo/MONDO/",
+ 456: "version": "2025-06-03",
+ 457 "namespace_prefix": "MONDO",
+
+tests/phenopackets/test_data/102.json:
+ 248 "url": "https://purl.obolibrary.org/obo/MONDO/",
+ 249: "version": "2025-06-03",
+ 250 "namespacePrefix": "MONDO",
+
+tests/phenopackets/test_data/103.json:
+ 385 "url": "https://purl.obolibrary.org/obo/MONDO/",
+ 386: "version": "2025-06-03",
+ 387 "namespacePrefix": "MONDO",
diff --git a/res/evaluation_cohort/redcap/evaluation_cohort_rarelink-cdm-linkml.json b/res/evaluation_cohort/redcap/evaluation_cohort_rarelink-cdm-linkml.json
index a1631d642..6985288e5 100644
--- a/res/evaluation_cohort/redcap/evaluation_cohort_rarelink-cdm-linkml.json
+++ b/res/evaluation_cohort/redcap/evaluation_cohort_rarelink-cdm-linkml.json
@@ -8,7 +8,7 @@
},
"personal_information": {
"snomedct_184099003": "2015-01-12",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446151000124109",
"snomedct_370159000": "",
@@ -386,7 +386,7 @@
},
"personal_information": {
"snomedct_184099003": "2012-03-04",
- "snomedct_281053000": "snomedct_248152002",
+ "loinc_76689_9": "snomedct_248152002",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446141000124107",
"snomedct_370159000": "TUR",
@@ -767,7 +767,7 @@
},
"personal_information": {
"snomedct_184099003": "2017-06-17",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446151000124109",
"snomedct_370159000": "USA",
@@ -1052,7 +1052,7 @@
},
"personal_information": {
"snomedct_184099003": "2010-02-20",
- "snomedct_281053000": "snomedct_248152002",
+ "loinc_76689_9": "snomedct_248152002",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_1220561009",
"snomedct_370159000": "",
@@ -1299,7 +1299,7 @@
},
"personal_information": {
"snomedct_184099003": "2014-10-05",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446151000124109",
"snomedct_370159000": "GER",
@@ -1648,7 +1648,7 @@
},
"personal_information": {
"snomedct_184099003": "2014-10-05",
- "snomedct_281053000": "snomedct_248152002",
+ "loinc_76689_9": "snomedct_248152002",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446141000124107",
"snomedct_370159000": "GER",
@@ -1875,7 +1875,7 @@
},
"personal_information": {
"snomedct_184099003": "2016-04-25",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446151000124109",
"snomedct_370159000": "CAN",
@@ -2142,7 +2142,7 @@
},
"personal_information": {
"snomedct_184099003": "2009-12-03",
- "snomedct_281053000": "snomedct_248152002",
+ "loinc_76689_9": "snomedct_248152002",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446141000124107",
"snomedct_370159000": "JAP",
@@ -2449,7 +2449,7 @@
},
"personal_information": {
"snomedct_184099003": "2013-08-30",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446151000124109",
"snomedct_370159000": "SA",
@@ -2723,7 +2723,7 @@
},
"personal_information": {
"snomedct_184099003": "2015-11-15",
- "snomedct_281053000": "snomedct_248152002",
+ "loinc_76689_9": "snomedct_248152002",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446141000124107",
"snomedct_370159000": "AFG",
diff --git a/res/evaluation_cohort/redcap/evaluation_cohort_redcap.json b/res/evaluation_cohort/redcap/evaluation_cohort_redcap.json
index 2f978f80a..534bf77f0 100644
--- a/res/evaluation_cohort/redcap/evaluation_cohort_redcap.json
+++ b/res/evaluation_cohort/redcap/evaluation_cohort_redcap.json
@@ -7,7 +7,7 @@
"snomedct_399423000": "2025-04-12",
"rarelink_1_formal_criteria_complete": "2",
"snomedct_184099003": "2015-01-12",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446151000124109",
"snomedct_370159000": "",
@@ -127,7 +127,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -247,7 +247,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -367,7 +367,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -487,7 +487,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -607,7 +607,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -727,7 +727,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -847,7 +847,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -967,7 +967,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -1087,7 +1087,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -1207,7 +1207,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -1327,7 +1327,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -1447,7 +1447,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -1567,7 +1567,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -1687,7 +1687,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -1807,7 +1807,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -1927,7 +1927,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -2047,7 +2047,7 @@
"snomedct_399423000": "2025-04-12",
"rarelink_1_formal_criteria_complete": "2",
"snomedct_184099003": "2012-03-04",
- "snomedct_281053000": "snomedct_248152002",
+ "loinc_76689_9": "snomedct_248152002",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446141000124107",
"snomedct_370159000": "TUR",
@@ -2167,7 +2167,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -2287,7 +2287,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -2407,7 +2407,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -2527,7 +2527,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -2647,7 +2647,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -2767,7 +2767,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -2887,7 +2887,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -3007,7 +3007,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -3127,7 +3127,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -3247,7 +3247,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -3367,7 +3367,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -3487,7 +3487,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -3607,7 +3607,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -3727,7 +3727,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -3847,7 +3847,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -3967,7 +3967,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -4087,7 +4087,7 @@
"snomedct_399423000": "2025-04-12",
"rarelink_1_formal_criteria_complete": "2",
"snomedct_184099003": "2017-06-17",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446151000124109",
"snomedct_370159000": "USA",
@@ -4207,7 +4207,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -4327,7 +4327,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -4447,7 +4447,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -4567,7 +4567,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -4687,7 +4687,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -4807,7 +4807,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -4927,7 +4927,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -5047,7 +5047,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -5167,7 +5167,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -5287,7 +5287,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -5407,7 +5407,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -5527,7 +5527,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -5647,7 +5647,7 @@
"snomedct_399423000": "2025-04-12",
"rarelink_1_formal_criteria_complete": "2",
"snomedct_184099003": "2010-02-20",
- "snomedct_281053000": "snomedct_248152002",
+ "loinc_76689_9": "snomedct_248152002",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_1220561009",
"snomedct_370159000": "",
@@ -5767,7 +5767,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -5887,7 +5887,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -6007,7 +6007,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -6127,7 +6127,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -6247,7 +6247,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -6367,7 +6367,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -6487,7 +6487,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -6607,7 +6607,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -6727,7 +6727,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -6847,7 +6847,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -6967,7 +6967,7 @@
"snomedct_399423000": "2025-04-12",
"rarelink_1_formal_criteria_complete": "2",
"snomedct_184099003": "2014-10-05",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446151000124109",
"snomedct_370159000": "GER",
@@ -7087,7 +7087,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -7207,7 +7207,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -7327,7 +7327,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -7447,7 +7447,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -7567,7 +7567,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -7687,7 +7687,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -7807,7 +7807,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -7927,7 +7927,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -8047,7 +8047,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -8167,7 +8167,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -8287,7 +8287,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -8407,7 +8407,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -8527,7 +8527,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -8647,7 +8647,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -8767,7 +8767,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -8887,7 +8887,7 @@
"snomedct_399423000": "2025-04-13",
"rarelink_1_formal_criteria_complete": "2",
"snomedct_184099003": "2014-10-05",
- "snomedct_281053000": "snomedct_248152002",
+ "loinc_76689_9": "snomedct_248152002",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446141000124107",
"snomedct_370159000": "GER",
@@ -9007,7 +9007,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -9127,7 +9127,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -9247,7 +9247,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -9367,7 +9367,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -9487,7 +9487,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -9607,7 +9607,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -9727,7 +9727,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -9847,7 +9847,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -9967,7 +9967,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -10087,7 +10087,7 @@
"snomedct_399423000": "2025-04-13",
"rarelink_1_formal_criteria_complete": "2",
"snomedct_184099003": "2016-04-25",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446151000124109",
"snomedct_370159000": "CAN",
@@ -10207,7 +10207,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -10327,7 +10327,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -10447,7 +10447,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -10567,7 +10567,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -10687,7 +10687,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -10807,7 +10807,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -10927,7 +10927,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -11047,7 +11047,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -11167,7 +11167,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -11287,7 +11287,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -11407,7 +11407,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -11527,7 +11527,7 @@
"snomedct_399423000": "2025-04-13",
"rarelink_1_formal_criteria_complete": "2",
"snomedct_184099003": "2009-12-03",
- "snomedct_281053000": "snomedct_248152002",
+ "loinc_76689_9": "snomedct_248152002",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446141000124107",
"snomedct_370159000": "JAP",
@@ -11647,7 +11647,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -11767,7 +11767,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -11887,7 +11887,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -12007,7 +12007,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -12127,7 +12127,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -12247,7 +12247,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -12367,7 +12367,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -12487,7 +12487,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -12607,7 +12607,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -12727,7 +12727,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -12847,7 +12847,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -12967,7 +12967,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -13087,7 +13087,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -13207,7 +13207,7 @@
"snomedct_399423000": "2025-04-13",
"rarelink_1_formal_criteria_complete": "2",
"snomedct_184099003": "2013-08-30",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446151000124109",
"snomedct_370159000": "SA",
@@ -13327,7 +13327,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -13447,7 +13447,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -13567,7 +13567,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -13687,7 +13687,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -13807,7 +13807,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -13927,7 +13927,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -14047,7 +14047,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -14167,7 +14167,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -14287,7 +14287,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -14407,7 +14407,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -14527,7 +14527,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -14647,7 +14647,7 @@
"snomedct_399423000": "2025-04-13",
"rarelink_1_formal_criteria_complete": "2",
"snomedct_184099003": "2015-11-15",
- "snomedct_281053000": "snomedct_248152002",
+ "loinc_76689_9": "snomedct_248152002",
"snomedct_1296886006": "",
"snomedct_263495000": "snomedct_446141000124107",
"snomedct_370159000": "AFG",
@@ -14767,7 +14767,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -14887,7 +14887,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -15007,7 +15007,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -15127,7 +15127,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -15247,7 +15247,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -15367,7 +15367,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -15487,7 +15487,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -15607,7 +15607,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -15727,7 +15727,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -15847,7 +15847,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -15967,7 +15967,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -16087,7 +16087,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -16207,7 +16207,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -16327,7 +16327,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
@@ -16447,7 +16447,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
diff --git a/res/validation/validator.ipynb b/res/validation/validator.ipynb
index 2fc1616db..0546f5e1a 100644
--- a/res/validation/validator.ipynb
+++ b/res/validation/validator.ipynb
@@ -51350,7 +51350,7 @@
" \"id\": \"participantrequired\",\n",
" \"meta\": {\n",
" \"versionId\": \"1\",\n",
- " \"lastUpdated\": \"2025-05-08T23:40:2LNC2788+11:00\",\n",
+ " \"lastUpdated\": \"2025-05-08T23:40:2v2818+11:00\",\n",
" \"source\": \"#TcjkY57nGwDXvXgk\"\n",
" },\n",
" \"extension\": [ {\n",
@@ -834430,7 +834430,7 @@
" \"id\": \"integer\",\n",
" \"meta\": {\n",
" \"versionId\": \"1\",\n",
- " \"lastUpdated\": \"2025-05-08T23:43:2LNC2789+11:00\",\n",
+ " \"lastUpdated\": \"2025-05-08T23:43:2v2819+11:00\",\n",
" \"source\": \"#rETsIT84Bn51S21D\"\n",
" },\n",
" \"extension\": [ {\n",
@@ -1184960,7 +1184960,7 @@
" \"id\": \"valueset-deprecated\",\n",
" \"meta\": {\n",
" \"versionId\": \"1\",\n",
- " \"lastUpdated\": \"2025-05-08T12:44:2LNC2787+00:00\",\n",
+ " \"lastUpdated\": \"2025-05-08T12:44:2v2817+00:00\",\n",
" \"source\": \"#PAAw2Cc1leprGfqK\"\n",
" },\n",
" \"extension\": [ {\n",
@@ -1348645,7 +1348645,7 @@
" \"id\": \"restful-capability-mode\",\n",
" \"meta\": {\n",
" \"versionId\": \"1\",\n",
- " \"lastUpdated\": \"2025-05-08T23:45:1LNC2786+11:00\",\n",
+ " \"lastUpdated\": \"2025-05-08T23:45:1v2816+11:00\",\n",
" \"source\": \"#P4TAWJx0Kg6aJ7cP\",\n",
" \"profile\": [ \"http://hl7.org/fhir/StructureDefinition/shareablevalueset\" ]\n",
" },\n",
@@ -1405341,7 +1405341,7 @@
" \"id\": \"v2-0924\",\n",
" \"meta\": {\n",
" \"versionId\": \"1\",\n",
- " \"lastUpdated\": \"2025-05-08T12:45:4LNC2783+00:00\",\n",
+ " \"lastUpdated\": \"2025-05-08T12:45:4v2813+00:00\",\n",
" \"source\": \"#lLwrEoYYnaOatzrP\",\n",
" \"profile\": [ \"http://hl7.org/fhir/StructureDefinition/shareablevalueset\" ]\n",
" },\n",
diff --git a/src/.DS_Store b/src/.DS_Store
deleted file mode 100755
index 4fc832773..000000000
Binary files a/src/.DS_Store and /dev/null differ
diff --git a/src/fsh/input/fsh/Bundle-rarelink-example.json b/src/fsh/input/fsh/Bundle-rarelink-example.json
index a78c5866e..0c09c00f3 100644
--- a/src/fsh/input/fsh/Bundle-rarelink-example.json
+++ b/src/fsh/input/fsh/Bundle-rarelink-example.json
@@ -40,7 +40,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "370159000",
"display": "Country of Birth"
}
@@ -58,7 +58,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399423000",
"display": "Date of Admission"
}
@@ -80,7 +80,7 @@
"coding": [
{
"system": "http://loinc.org",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "LA3-6",
"display": "Female"
}
@@ -93,7 +93,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "281053000",
"display": "Sex at Birth"
}
@@ -110,7 +110,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "422549004",
"display": "Patient-related Identification code (observable entity)"
}
@@ -154,7 +154,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "105727008",
"display": "Age Category"
}
@@ -168,7 +168,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "263659003",
"display": "Adolescence"
}
@@ -220,7 +220,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/mondo.owl",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"code": "0007843"
}
]
@@ -277,7 +277,7 @@
"coding": [
{
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "69548-6",
"display": "Genetic variant assessment"
}
@@ -292,7 +292,7 @@
"coding": [
{
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48004-6",
"display": "DNA change (c.HGVS)"
}
@@ -312,7 +312,7 @@
"coding": [
{
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "51958-7",
"display": "Transcript reference sequence [ID]"
}
@@ -332,7 +332,7 @@
"coding": [
{
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "48018-6",
"display": "Gene studied [ID]"
}
@@ -353,7 +353,7 @@
"coding": [
{
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "53034-5",
"display": "Allelic state"
}
@@ -363,7 +363,7 @@
"coding": [
{
"system": "http://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA6706-1",
"display": "(simple) Heterozygous"
}
@@ -400,7 +400,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
}
@@ -414,7 +414,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
}
@@ -425,7 +425,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0000400"
}
]
@@ -463,7 +463,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
}
@@ -476,7 +476,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012826",
"display": "Moderate"
}
@@ -490,7 +490,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
}
@@ -501,7 +501,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0002650"
}
]
@@ -539,7 +539,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
}
@@ -552,7 +552,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011010",
"display": "Chronic"
}
@@ -566,7 +566,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
}
@@ -577,7 +577,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0034323"
}
]
@@ -615,7 +615,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
}
@@ -629,7 +629,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0011463",
"display": "Childhood onset (1y-5y)"
}
@@ -640,7 +640,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001156"
}
]
@@ -678,7 +678,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
}
@@ -691,7 +691,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0031796",
"display": "Recurrent"
}
@@ -704,7 +704,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012825",
"display": "Mild"
}
@@ -718,7 +718,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003593",
"display": "Infantile onset (28d-1y)"
}
@@ -729,7 +729,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001252"
}
]
@@ -767,7 +767,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "410605003",
"display": "Confirmed present"
}
@@ -780,7 +780,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0012828",
"display": "Severe"
}
@@ -794,7 +794,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0003577",
"display": "Congenital onset (at birth)"
}
@@ -805,7 +805,7 @@
"coding": [
{
"system": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"code": "0001627"
}
]
@@ -852,7 +852,7 @@
"coding": [
{
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
}
],
@@ -910,7 +910,7 @@
"coding": [
{
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
}
],
@@ -935,7 +935,7 @@
"coding": [
{
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C14165"
}
]
@@ -979,7 +979,7 @@
"coding": [
{
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LA12894-4"
}
],
@@ -1037,7 +1037,7 @@
"coding": [
{
"system": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"code": "LP14695-8"
}
],
@@ -1062,7 +1062,7 @@
"coding": [
{
"system": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "version": "24.01e",
+ "version": "26.02d",
"code": "C25640"
}
]
diff --git a/src/rarelink/.DS_Store b/src/rarelink/.DS_Store
deleted file mode 100755
index f5ac1638d..000000000
Binary files a/src/rarelink/.DS_Store and /dev/null differ
diff --git a/src/rarelink/cli/phenopackets/export.py b/src/rarelink/cli/phenopackets/export.py
index 09181d7f8..2998ed764 100644
--- a/src/rarelink/cli/phenopackets/export.py
+++ b/src/rarelink/cli/phenopackets/export.py
@@ -1,35 +1,67 @@
# src/rarelink/cli/phenopackets/export.py
import json
-import typer
+import logging
import os
-import importlib.util
import importlib.machinery
+import warnings as _warnings
from pathlib import Path
-from typing import Optional
-import logging
-from rarelink.rarelink_cdm.mappings import phenopackets as default_mappings
+from typing import Callable, Optional
+import typer
+from rich.console import Console
+from rich.panel import Panel
+from rich.progress import (
+ BarColumn,
+ MofNCompleteColumn,
+ Progress,
+ SpinnerColumn,
+ TaskProgressColumn,
+ TextColumn,
+ TimeElapsedColumn,
+)
+from rich.table import Table
+from rich.text import Text
+
+from rarelink.rarelink_cdm.mappings import phenopackets as default_mappings
from rarelink.cli.utils.terminal_utils import (
between_section_separator,
- end_of_section_separator
+ end_of_section_separator,
)
from rarelink.cli.utils.string_utils import (
- success_text,
error_text,
format_command,
- format_header
-)
-from rarelink.cli.utils.validation_utils import (
- validate_env
+ format_header,
+ success_text,
)
-
+from rarelink.cli.utils.validation_utils import validate_env
app = typer.Typer()
+console = Console()
ENV_PATH = Path(".env")
DEFAULT_INPUT_DIR = Path.home() / "Downloads" / "rarelink_records"
DEFAULT_OUTPUT_DIR = Path.home() / "Downloads"
+
+def _make_progress(description: str, total: int) -> tuple:
+ """
+ Create a Progress instance with a single labelled task.
+ Returns (progress, task_id) ready to use as a context manager.
+ """
+ progress = Progress(
+ SpinnerColumn(),
+ TextColumn("[bold cyan]{task.description}"),
+ BarColumn(bar_width=36),
+ MofNCompleteColumn(),
+ TaskProgressColumn(),
+ TimeElapsedColumn(),
+ console=console,
+ transient=False,
+ )
+ task_id = progress.add_task(description, total=total)
+ return progress, task_id
+
+
@app.command()
def export(
input_path: Path = typer.Option(
@@ -39,10 +71,12 @@ def export(
None, "--output-dir", "-o", help="Directory to save Phenopackets"
),
mappings: Path = typer.Option(
- None, "--mappings", "-m", help="Path to custom mapping configuration module"
+ None, "--mappings", "-m",
+ help="Path to custom mapping configuration module"
),
label_dict: Path = typer.Option(
- None, "--label-dict", help="Path to JSON file with code→label mappings"
+ None, "--label-dict",
+ help="Path to JSON file with code→label mappings"
),
debug: bool = typer.Option(
False, "--debug", "-d", help="Enable debug mode for verbose logging"
@@ -54,33 +88,32 @@ def export(
None, "--created-by", help="Override CREATED_BY from .env"
),
bioportal_api_token: Optional[str] = typer.Option(
- None, "--bioportal-api-token", help="Provide BioPortal API token (overrides .env)"
+ None, "--bioportal-api-token",
+ help="Provide BioPortal API token (overrides .env)"
),
timeout: int = typer.Option(
3600, "--timeout", "-t", help="Timeout in seconds (default: 3600)"
),
):
"""
- CLI command to export data to a cohort of Phenopackets.
-
- Enhanced to support different data models through custom mapping configurations.
+ Export REDCap records to a cohort of GA4GH Phenopackets (v2).
"""
- # Configure logging
- log_level = logging.DEBUG if debug else logging.INFO
+ log_level = logging.DEBUG if debug else logging.WARNING
logging.basicConfig(level=log_level)
+ logging.getLogger("rarelink").setLevel(log_level)
logger = logging.getLogger("rarelink.cli.phenopackets.export")
format_header("REDCap to Phenopackets Export")
- # Step 1: Validate setup files (only if not skipped)
+ # ── Step 1: Environment validation ──────────────────────────────────────
if not skip_validation:
typer.echo("🔄 Validating setup files...")
typer.echo("🔄 Validating the .env file...")
- # Determine which env keys are required
required_env_vars = ["CREATED_BY"]
- # Only require BioPortal when we actually plan to use it
- will_use_bioportal = (bioportal_api_token or os.getenv("BIOPORTAL_API_TOKEN")) and not label_dict
+ will_use_bioportal = (
+ bioportal_api_token or os.getenv("BIOPORTAL_API_TOKEN")
+ ) and not label_dict
if will_use_bioportal:
required_env_vars.append("BIOPORTAL_API_TOKEN")
@@ -97,40 +130,40 @@ def export(
fg=typer.colors.RED,
)
typer.secho(
- "💡 You can use --skip-validation to bypass environment validation.",
+ "💡 You can use --skip-validation to bypass this.",
fg=typer.colors.YELLOW,
)
raise typer.Exit(1)
- # Fetch CREATED_BY from env or argument
_created_by = created_by or os.getenv("CREATED_BY")
if not _created_by and not skip_validation:
typer.secho(
- error_text("❌ Missing CREATED_BY environment variable or --created-by argument."),
+ error_text(
+ "❌ Missing CREATED_BY environment variable or --created-by argument."
+ ),
fg=typer.colors.RED,
)
raise typer.Exit(1)
- # Fetch BIOPORTAL_API_TOKEN from argument or env
_api_token = bioportal_api_token or os.getenv("BIOPORTAL_API_TOKEN")
if not _api_token and not skip_validation:
typer.secho(
- error_text("❌ Missing BioPortal API token. Provide --bioportal-api-token or set BIOPORTAL_API_TOKEN in .env."),
+ error_text(
+ "❌ Missing BioPortal API token. "
+ "Provide --bioportal-api-token or set BIOPORTAL_API_TOKEN in .env."
+ ),
fg=typer.colors.RED,
)
raise typer.Exit(1)
- # Ensure the BIOPORTAL_API_TOKEN is set in the environment for downstream usage
if _api_token:
os.environ["BIOPORTAL_API_TOKEN"] = _api_token
- # Step 2: Determine input file path
+ # ── Step 2: Input file ───────────────────────────────────────────────────
if input_path is None:
input_path = typer.prompt(
- "Enter the path to the validated linkml-json file",
- type=Path
+ "Enter the path to the validated linkml-json file", type=Path
)
-
if not input_path.exists():
typer.secho(
error_text(f"❌ Input file not found: {input_path}."),
@@ -138,78 +171,67 @@ def export(
)
raise typer.Exit(1)
- # Step 3: Determine output directory
+ # ── Step 3: Output directory ─────────────────────────────────────────────
if output_dir is None:
- # Try to infer a suitable output directory name
- input_stem = input_path.stem
- suggested_dir = Path.cwd() / f"{input_stem}_phenopackets"
-
+ suggested_dir = Path.cwd() / f"{input_path.stem}_phenopackets"
typer.echo(f"📂 Suggested output directory: {suggested_dir}")
- is_correct_output_dir = typer.confirm("Do you want to use this directory?")
- if not is_correct_output_dir:
+ if typer.confirm("Do you want to use this directory?"):
+ output_dir = suggested_dir
+ else:
output_dir = typer.prompt(
- "Enter the path to save Phenopackets",
- type=Path
+ "Enter the path to save Phenopackets", type=Path
)
- else:
- output_dir = suggested_dir
output_dir = Path(output_dir)
output_dir.mkdir(parents=True, exist_ok=True)
between_section_separator()
- # Step 4: Determine mapping configuration
+ # ── Step 4: Mapping configuration ───────────────────────────────────────
mapping_configs = None
if mappings:
try:
- logger.info(f"Loading custom mappings from: {mappings}")
-
- # Method 1: Try loading as a regular module
- if str(mappings).endswith('.py'):
- # Calculate the module name from the file path
- module_name = mappings.stem
-
- # Use importlib machinery to load the module
- loader = importlib.machinery.SourceFileLoader(module_name, str(mappings))
- custom_mappings_module = loader.load_module()
-
- # Check if the module has the expected function
- if hasattr(custom_mappings_module, 'create_phenopacket_mappings'):
- mapping_configs = custom_mappings_module.create_phenopacket_mappings()
- logger.info("Successfully loaded custom mappings")
+ logger.debug(f"Loading custom mappings from: {mappings}")
+ if str(mappings).endswith(".py"):
+ loader = importlib.machinery.SourceFileLoader(
+ mappings.stem, str(mappings)
+ )
+ mod = loader.load_module()
+ if hasattr(mod, "create_phenopacket_mappings"):
+ mapping_configs = mod.create_phenopacket_mappings()
else:
- logger.warning("No create_phenopacket_mappings function found in module")
- # Method 2: Try loading as a JSON file
- elif str(mappings).endswith('.json'):
- with open(mappings, 'r') as f:
+ logger.warning(
+ "No create_phenopacket_mappings function found in module"
+ )
+ elif str(mappings).endswith(".json"):
+ with open(mappings, "r") as f:
mapping_configs = json.load(f)
- logger.info("Successfully loaded mappings from JSON file")
else:
typer.secho(
- error_text("❌ Unsupported mapping file format. Use .py or .json files."),
- fg=typer.colors.RED
+ error_text(
+ "❌ Unsupported mapping file format. Use .py or .json."
+ ),
+ fg=typer.colors.RED,
)
raise typer.Exit(1)
-
except Exception as e:
typer.secho(
error_text(f"❌ Failed to load custom mappings: {str(e)}"),
- fg=typer.colors.RED
+ fg=typer.colors.RED,
)
raise typer.Exit(1)
else:
- try_default = typer.confirm(
- "No custom mappings provided. Would you like to try with default RareLink-CDM mappings?"
- )
- if try_default:
+ if typer.confirm(
+ "No custom mappings provided. Use default RareLink-CDM mappings?"
+ ):
try:
- mapping_configs = default_mappings.create_rarelink_phenopacket_mappings()
- logger.info("Using default RareLink-CDM mappings")
+ mapping_configs = (
+ default_mappings.create_rarelink_phenopacket_mappings()
+ )
except Exception as e:
typer.secho(
error_text(
- f"❌ Default RareLink-CDM mappings not available: {str(e)}"
+ f"❌ Default RareLink-CDM mappings not available: {e}"
),
fg=typer.colors.RED,
)
@@ -220,83 +242,319 @@ def export(
fg=typer.colors.RED,
)
raise typer.Exit(1)
+
if debug:
- logger.debug("Using the following mapping configurations:")
for key, value in mapping_configs.items():
- logger.debug(f"- {key}: {list(value.keys()) if isinstance(value, dict) else type(value)}")
+ logger.debug(
+ f"- {key}: "
+ f"{list(value.keys()) if isinstance(value, dict) else type(value)}"
+ )
+ # ── Step 5: Optional label dict patch ───────────────────────────────────
if label_dict:
- from rarelink.utils.label_fetching import fetch_label as _orig_fetch_label
+ from rarelink.utils.label_fetching import fetch_label as _orig
- # 1) load code→label map
with open(label_dict, "r") as lf:
label_map = json.load(lf)
- # 2) monkey‐patch the pipeline’s fetch_label so it prefers your dict
def fetch_label(code: str, enum_class=None, label_dict=None):
- # priority: your map → existing logic
if code in label_map:
return label_map[code]
- return _orig_fetch_label(code, enum_class=enum_class, label_dict=label_map)
+ return _orig(code, enum_class=enum_class, label_dict=label_map)
- # 3) inject into the phenopacket pipeline namespace
import rarelink.utils.label_fetching as mu
mu.fetch_label = fetch_label
-
- from rarelink.phenopackets import phenopacket_pipeline
if not label_dict:
- typer.echo("NOTE: This pipeline may fetch labels from BIOPORTAL. "
- "Ensure you have an internet connection as this may take a while - time to get a tea ☕ ...")
+ typer.echo(
+ "NOTE: This pipeline may fetch labels from BioPortal. "
+ "Ensure you have an internet connection — time to get a tea ☕ ..."
+ )
else:
- typer.echo("Using local label dictionary for labels (no BioPortal needed).")
-
- try:
- typer.echo("🚀 Processing your records to Phenopackets...")
-
- # Load the JSON data from the file
- with open(input_path, "r") as f:
- input_data = json.load(f)
-
- # Run the pipeline with enhanced error handling and debug support
- phenopackets = phenopacket_pipeline(
- input_data=input_data,
- output_dir=str(output_dir),
- created_by=_created_by,
- mapping_configs=mapping_configs,
- timeout=timeout,
- debug=debug
+ typer.echo("Using local label dictionary (no BioPortal needed).")
+
+ # ── Step 6: Load input data ──────────────────────────────────────────────
+ with open(input_path, "r") as f:
+ input_data = json.load(f)
+
+ total = len(input_data)
+ typer.echo(f"\n🚀 Processing {total} record(s) → Phenopackets\n")
+
+ from rarelink.phenopackets.pipeline import phenopacket_pipeline
+
+ # ── Step 7a: Phase 1 progress bar — Creating ─────────────────────────────
+ import logging as _logging
+ _root_logger = _logging.getLogger()
+ _saved_handlers = _root_logger.handlers[:]
+ if not debug:
+ _root_logger.handlers = []
+
+ _creation_warnings: list = []
+
+ create_progress, create_task = _make_progress(
+ "Creating phenopackets", total
+ )
+ with create_progress:
+ def on_created(record_id, success, error):
+ create_progress.advance(create_task)
+ # Collect per-record warnings (success=True but error contains ⚠ lines)
+ if success and error:
+ for line in error.splitlines():
+ line = line.lstrip("⚠").strip()
+ if line:
+ _creation_warnings.append(f"Record {record_id}: {line}")
+
+ try:
+ result = phenopacket_pipeline(
+ input_data=input_data,
+ output_dir=str(output_dir),
+ created_by=_created_by,
+ mapping_configs=mapping_configs,
+ timeout=timeout,
+ debug=debug,
+ progress_callback=on_created,
+ validation_callback=None,
+ )
+ except Exception as e:
+ _root_logger.handlers = _saved_handlers
+ typer.secho(
+ error_text(f"❌ Pipeline failed: {str(e)}"),
+ fg=typer.colors.RED,
+ )
+ if debug:
+ import traceback
+ traceback.print_exc()
+ raise typer.Exit(1)
+
+ # ── Step 7b: Phase 2 progress bar — Validating ───────────────────────────
+ _prefix_warnings: list = []
+
+ n_to_validate = result.n_created
+ if n_to_validate > 0:
+ validate_progress, validate_task = _make_progress(
+ "Validating phenopackets", n_to_validate
)
+ with validate_progress:
+ def on_validated(file_path, success, error):
+ validate_progress.advance(validate_task)
+ if error and "Ontology prefix warnings" in error:
+ fname = Path(file_path).name
+ for line in error.splitlines():
+ line = line.strip()
+ if line.startswith("⚠"):
+ _prefix_warnings.append(f"{fname}: {line.lstrip('⚠').strip()}")
+
+ _run_write_and_validate(
+ phenopackets=result.phenopackets,
+ output_dir=output_dir,
+ result=result,
+ validation_callback=on_validated,
+ debug=debug,
+ )
+
+ if _prefix_warnings:
+ warnings_file = output_dir / "warnings.json"
+ existing = []
+ if warnings_file.exists():
+ with open(warnings_file, "r") as fh:
+ existing = json.load(fh)
+ existing.extend(
+ {"file": w.split(":")[0], "warning": w, "stage": "validation"}
+ for w in _prefix_warnings
+ )
+ with open(warnings_file, "w") as fh:
+ json.dump(existing, fh, indent=2)
+
+ _root_logger.handlers = _saved_handlers
+
+ # ── Step 8: Summary ──────────────────────────────────────────────────────
+ console.print()
+ _print_summary(
+ total=total,
+ n_created=result.n_created,
+ n_failed_creation=result.n_failed_creation,
+ n_validated=result.n_created - result.n_failed_validation,
+ n_failed_validation=result.n_failed_validation,
+ output_dir=output_dir,
+ failed_creations=result.failed_creations,
+ failed_validations=result.failed_validations,
+ prefix_warnings=_prefix_warnings,
+ creation_warnings=_creation_warnings,
+ )
- typer.secho(success_text("✅ Phenopackets successfully created!"))
- typer.echo(f"📂 Find your Phenopackets here: {output_dir}")
+ end_of_section_separator()
- # Report counts
- typer.echo("\nExport Summary:")
- typer.echo(f"Total records processed: {len(input_data)}")
- typer.echo(f"Total successful exports: {len(phenopackets)}")
- typer.echo(f"Total failed exports: {len(input_data) - len(phenopackets)}")
- # Check for failure report
- failure_file = os.path.join(output_dir, "failures.json")
- if os.path.exists(failure_file):
- typer.secho(
- f"⚠️ Some records failed to process. See {failure_file} for details.",
- fg=typer.colors.YELLOW
+def _run_write_and_validate(
+ phenopackets: list,
+ output_dir: Path,
+ result,
+ validation_callback: Optional[Callable] = None,
+ debug: bool = False,
+):
+ """
+ Write and validate a list of already-created Phenopackets.
+ Updates result.failed_validations in place.
+ Called by export() after the creation phase completes.
+ """
+ import json as _json
+ from google.protobuf.json_format import MessageToDict
+ from phenopackets import VitalStatus as VitalStatusEnum
+ from rarelink.phenopackets.validate import validate_phenopackets
+
+ output_path = Path(output_dir)
+
+ for phenopacket in phenopackets:
+ full = MessageToDict(
+ phenopacket,
+ preserving_proto_field_name=False,
+ including_default_value_fields=False,
+ )
+ raw_status_int = phenopacket.subject.vital_status.status
+ try:
+ status_name = VitalStatusEnum.Status.Name(raw_status_int)
+ except Exception:
+ status_name = "UNKNOWN_STATUS"
+ if "subject" in full:
+ full["subject"]["vitalStatus"] = {"status": status_name}
+
+ file_path = output_path / f"{phenopacket.id}.json"
+ with open(file_path, "w") as f:
+ _json.dump(full, f, indent=2)
+
+ try:
+ ok, details = validate_phenopackets(file_path)
+ if ok:
+ if validation_callback:
+ # Pass details even on success — may contain prefix warnings
+ validation_callback(str(file_path), success=True, error=details)
+ else:
+ result.failed_validations.append(
+ {"file": str(file_path), "error": details}
+ )
+ if validation_callback:
+ validation_callback(str(file_path), success=False, error=details)
+ except Exception as e:
+ error_msg = str(e)
+ result.failed_validations.append(
+ {"file": str(file_path), "error": error_msg}
)
+ if validation_callback:
+ validation_callback(str(file_path), success=False, error=error_msg)
+
+
+def _print_summary(
+ total: int,
+ n_created: int,
+ n_failed_creation: int,
+ n_validated: int,
+ n_failed_validation: int,
+ output_dir: Path,
+ failed_creations: list,
+ failed_validations: list,
+ prefix_warnings: list = None,
+ creation_warnings: list = None,
+):
+ """Render a clean Rich summary table with failure details and warnings."""
+ prefix_warnings = prefix_warnings or []
+ creation_warnings = creation_warnings or []
+ all_ok = (n_failed_creation == 0 and n_failed_validation == 0)
+ has_warnings = bool(prefix_warnings or creation_warnings)
+
+ # ── Stats table ──────────────────────────────────────────────────────────
+ table = Table(
+ title="Export Summary",
+ show_header=True,
+ header_style="bold white",
+ title_style="bold cyan",
+ border_style="cyan",
+ min_width=52,
+ )
+ table.add_column("Stage", style="dim", width=24)
+ table.add_column("Passed", justify="right", style="green")
+ table.add_column("Failed", justify="right")
+ table.add_column("Warnings", justify="right")
+ table.add_column("Total", justify="right", style="bold")
+
+ def _fail_style(n: int) -> Text:
+ return Text(str(n), style="bold red" if n > 0 else "green")
+
+ def _warn_style(n: int) -> Text:
+ return Text(str(n), style="bold yellow" if n > 0 else "dim")
+
+ table.add_row(
+ "Creation",
+ str(n_created),
+ _fail_style(n_failed_creation),
+ _warn_style(len(creation_warnings)),
+ str(total),
+ )
+ table.add_row(
+ "Validation",
+ str(n_validated),
+ _fail_style(n_failed_validation),
+ _warn_style(len(prefix_warnings)),
+ str(n_created),
+ )
+
+ console.print(table)
+ console.print(f" 📂 Output directory: [bold]{output_dir}[/bold]\n")
+
+ # ── Success / failure panel ───────────────────────────────────────────────
+ if all_ok and not has_warnings:
+ console.print(
+ "✅ [green]All phenopackets created and validated successfully![/green]",
+ )
+ return
- except Exception as e:
- typer.secho(
- error_text(f"❌ Failed to export Phenopackets: {str(e)}"),
- fg=typer.colors.RED,
+ if all_ok and has_warnings:
+ console.print(
+ "✅ [green]All phenopackets created and validated successfully.[/green]\n"
+ "[yellow]Warnings were found — see below.[/yellow]",
)
- if debug:
- import traceback
- traceback.print_exc()
- raise typer.Exit(1)
- end_of_section_separator()
+ # ── Creation failures ─────────────────────────────────────────────────────
+ if failed_creations:
+ console.print(f"\n [red]❌ Creation failures ({len(failed_creations)}):[/red]")
+ for f in failed_creations[:5]:
+ console.print(f" [dim]{f['record_id']}[/dim] {f['error']}")
+ if len(failed_creations) > 5:
+ console.print(f" [dim]... and {len(failed_creations) - 5} more — see failures.json[/dim]")
+
+ # ── Validation failures ──────────────────────────────────────────────────
+ if failed_validations:
+ console.print(f"\n [yellow]⚠ Validation failures ({len(failed_validations)}):[/yellow]")
+ for f in failed_validations[:5]:
+ console.print(f" [dim]{Path(f['file']).name}[/dim] {f['error'][:80]}")
+ if len(failed_validations) > 5:
+ console.print(f" [dim]... and {len(failed_validations) - 5} more — see failures.json[/dim]")
+
+ # ── Creation warnings (inline) ────────────────────────────────────────────
+ if creation_warnings:
+ unique = list(dict.fromkeys(creation_warnings))
+ console.print(f"\n [yellow]⚠ Creation warnings ({len(creation_warnings)}) — non-fatal:[/yellow]")
+ for w in unique[:5]:
+ count = creation_warnings.count(w)
+ suffix = f" (×{count})" if count > 1 else ""
+ console.print(f" [dim]{w}{suffix}[/dim]")
+ if len(unique) > 5:
+ console.print(f" [dim]... and {len(unique) - 5} more distinct warning(s)[/dim]")
+
+ # ── Prefix warnings (inline) ──────────────────────────────────────────────
+ if prefix_warnings:
+ console.print(f"\n [yellow]⚠ Ontology prefix warnings ({len(prefix_warnings)}) — non-fatal:[/yellow]")
+ for w in prefix_warnings[:5]:
+ console.print(f" [dim]{w}[/dim]")
+ if len(prefix_warnings) > 5:
+ console.print(f" [dim]... and {len(prefix_warnings) - 5} more[/dim]")
+
+ failure_file = output_dir / "failures.json"
+ warnings_file = output_dir / "warnings.json"
+ if failure_file.exists():
+ console.print(f"\n 💾 Full failure report: [bold]{failure_file}[/bold]")
+ if warnings_file.exists():
+ console.print(f" 💾 Full warnings report: [bold]{warnings_file}[/bold]")
if __name__ == "__main__":
- app()
+ app()
\ No newline at end of file
diff --git a/src/rarelink/cli/redcap/download_records.py b/src/rarelink/cli/redcap/download_records.py
index bff2c18e3..60945c5e7 100755
--- a/src/rarelink/cli/redcap/download_records.py
+++ b/src/rarelink/cli/redcap/download_records.py
@@ -16,20 +16,13 @@
hint_text,
format_command
)
+from rarelink.utils.validation import validate_linkml_data
from rarelink.cli.utils.validation_utils import validate_env
from rarelink.cli.utils.file_utils import ensure_directory_exists
from rarelink.utils.redcap import fetch_redcap_data
from rarelink.utils.schema_processing import redcap_to_linkml
from rarelink.rarelink_cdm.mappings.redcap import MAPPING_FUNCTIONS
-def validate_linkml_data(*args, **kwargs):
- """
- Lazy import to avoid utils <-> cli circular import during module import.
- Test patches target this symbol: rarelink.cli.redcap.download_records.validate_linkml_data
- """
- from rarelink.utils.validation import validate_linkml_data as _impl
- return _impl(*args, **kwargs)
-
logger = logging.getLogger(__name__)
app = typer.Typer()
diff --git a/src/rarelink/cli/redcap/upload_records.py b/src/rarelink/cli/redcap/upload_records.py
index 3d63fcc27..ac9e04477 100755
--- a/src/rarelink/cli/redcap/upload_records.py
+++ b/src/rarelink/cli/redcap/upload_records.py
@@ -16,14 +16,11 @@
hint_text,
)
from rarelink.cli.utils.validation_utils import validate_env
+from rarelink.utils.validation import validate_linkml_data
from rarelink.utils.schema_processing import linkml_to_redcap
from rarelink.rarelink_cdm.mappings.redcap import REVERSE_PROCESSING
import logging
-def validate_linkml_data(*args, **kwargs):
- from rarelink.utils.validation import validate_linkml_data as _impl
- return _impl(*args, **kwargs)
-
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
app = typer.Typer()
diff --git a/src/rarelink/phenopackets/adapter/__init__.py b/src/rarelink/phenopackets/adapter/__init__.py
index 6f025b71c..c9e8a81d8 100644
--- a/src/rarelink/phenopackets/adapter/__init__.py
+++ b/src/rarelink/phenopackets/adapter/__init__.py
@@ -4,8 +4,17 @@
"""
from .multi_onset import multi_onset_adapter
+from .ontology_routing_adapter import (
+ apply_ontology_routing,
+ get_routed_phenotypic_elements,
+ get_routed_disease_dicts,
+ check_prefix_placement,
+)
__all__ = [
- "multi_onset_adapter"
-
+ "multi_onset_adapter",
+ "apply_ontology_routing",
+ "get_routed_phenotypic_elements",
+ "get_routed_disease_dicts",
+ "check_prefix_placement"
]
\ No newline at end of file
diff --git a/src/rarelink/phenopackets/adapter/multi_onset.py b/src/rarelink/phenopackets/adapter/multi_onset.py
index eb894a04f..6df58eca7 100644
--- a/src/rarelink/phenopackets/adapter/multi_onset.py
+++ b/src/rarelink/phenopackets/adapter/multi_onset.py
@@ -27,55 +27,40 @@ def multi_onset_adapter(
Returns:
List[Any]: A list of feature blocks.
"""
- # Create the base feature using the provided mapping function
base_feature = mapping_func(feature_type, feature_data, processor, dob)
- # If multi_onset is not enabled or no onset_date_fields defined, return the base feature.
if not processor.mapping_config.get("multi_onset", False):
logger.debug("Multi-onset not enabled, returning single feature")
return [base_feature]
- # Get onset fields from config
onset_fields = processor.mapping_config.get("onset_date_fields", [])
if not onset_fields:
logger.debug("No onset date fields configured, returning single feature")
return [base_feature]
- # Create a list to store all features
features = []
found_onset = False
- # Process each onset field
for field in onset_fields:
- # Strip any instrument prefix from the field name
field_name = field.split(".")[-1] if "." in field else field
- # Try to get the onset value
onset_value = feature_data.get(field_name)
if onset_value:
found_onset = True
try:
- # Convert the onset value to a string if needed
onset_date_str = onset_value if isinstance(onset_value, str) else str(onset_value)
- # Ensure dob is a string in proper format
dob_str = dob if isinstance(dob, str) else (str(dob) if dob else None)
logger.debug(f"Processing onset field '{field_name}' with value '{onset_date_str}'")
- # Calculate age at onset
iso_age = processor.convert_date_to_iso_age(onset_date_str, dob_str)
if iso_age:
- # Create a new onset TimeElement
onset = TimeElement(age=Age(iso8601duration=iso_age))
- # Create a deep copy of the base feature
feature_copy = copy.deepcopy(base_feature)
- # Clear the existing onset field and set the new one
feature_copy.ClearField("onset")
feature_copy.onset.MergeFrom(onset)
-
- # Add the feature to our list
features.append(feature_copy)
logger.debug(f"Created feature with onset from field '{field_name}': {iso_age}")
except Exception as e:
@@ -83,7 +68,6 @@ def multi_onset_adapter(
import traceback
logger.debug(traceback.format_exc())
- # If no valid onset values were found, return the base feature
if not found_onset or not features:
logger.debug("No valid onset values found, returning base feature")
return [base_feature]
diff --git a/src/rarelink/phenopackets/adapter/ontology_routing_adapter.py b/src/rarelink/phenopackets/adapter/ontology_routing_adapter.py
new file mode 100644
index 000000000..9f31bcaf8
--- /dev/null
+++ b/src/rarelink/phenopackets/adapter/ontology_routing_adapter.py
@@ -0,0 +1,259 @@
+import logging
+import re
+from typing import Any, Dict, List, Optional, Tuple
+from rarelink.utils.code_processing import process_code
+
+logger = logging.getLogger(__name__)
+
+# Semantic defaults based on the Phenopacket Schema v2.0
+DEFAULT_ROUTING_RULES: Dict[str, str] = {
+ "HP": "phenotypicFeatures",
+ "MONDO": "diseases",
+ "OMIM": "diseases",
+ "ORDO": "diseases",
+}
+
+_SKIP_FIELDS = frozenset({
+ "redcap_repeat_instrument",
+ "redcap_repeat_instance",
+ "type_of_infection",
+ "type_of_condition",
+})
+
+# Public API
+def should_route(mapping_configs: Dict[str, Any]) -> bool:
+ """Return True when ontology routing is configured and enabled."""
+ cfg = mapping_configs.get("ontology_routing", {})
+ return bool(cfg) and cfg.get("enabled", True)
+
+
+def apply_ontology_routing(
+ data: Dict[str, Any],
+ mapping_configs: Dict[str, Any],
+) -> Dict[str, Any]:
+ """
+ Inspect ``data["repeated_elements"]``, route each element from a
+ configured instrument to either ``phenotypicFeatures`` or ``diseases``
+ based on the ontology prefix of its type-field value.
+
+ Returns a shallow copy of ``data`` with two extra keys:
+
+ * ``__routed__phenotypicFeatures`` — HP-bearing elements (unchanged dicts)
+ * ``__routed__diseases`` — MONDO/OMIM/ORDO elements normalized
+ to the ``term_field_1`` / ``onset_date_field`` convention
+
+ The original ``repeated_elements`` list is never mutated.
+ """
+ routing_cfg = mapping_configs.get("ontology_routing", {})
+ rules = _build_rules(routing_cfg)
+ instruments = set(routing_cfg.get("instruments", []))
+ scan_fields_map: Dict[str, List[str]] = routing_cfg.get("scan_fields", {})
+ onset_fields_map: Dict[str, List[str]] = routing_cfg.get("onset_fields", {})
+
+ routed_pf: List[Dict[str, Any]] = []
+ routed_diseases: List[Dict[str, Any]] = []
+ skipped = 0
+
+ for element in data.get("repeated_elements", []):
+ inst = element.get("redcap_repeat_instrument", "")
+ if inst not in instruments:
+ continue
+
+ inner = element.get(inst, {})
+ if not inner:
+ continue
+
+ scan = scan_fields_map.get(inst) # None means scan all fields
+ code, field = _find_routable_code(inner, scan)
+
+ if code is None:
+ skipped += 1
+ logger.debug(
+ f"[ontology_routing] {inst} #{element.get('redcap_repeat_instance')}"
+ f": no routable code found — element left in original stream"
+ )
+ continue
+
+ prefix = _get_prefix(code)
+ destination = rules.get(prefix.upper()) if prefix else None
+
+ if destination is None:
+ logger.debug(
+ f"[ontology_routing] {inst} #{element.get('redcap_repeat_instance')}"
+ f": prefix '{prefix}' not in routing rules — skipping"
+ )
+ skipped += 1
+ continue
+
+ if destination == "phenotypicFeatures":
+ routed_pf.append(element)
+ logger.debug(
+ f"[ontology_routing] {inst} #{element.get('redcap_repeat_instance')}"
+ f": {code} ({prefix}) → phenotypicFeatures"
+ )
+
+ elif destination == "diseases":
+ onset_fields = onset_fields_map.get(inst, [])
+ normalized = _normalize_for_disease_mapper(
+ inner, code, onset_fields,
+ instance=element.get("redcap_repeat_instance"),
+ instrument=inst,
+ )
+ routed_diseases.append(normalized)
+ logger.debug(
+ f"[ontology_routing] {inst} #{element.get('redcap_repeat_instance')}"
+ f": {code} ({prefix}) → diseases (normalized onset="
+ f"{normalized.get('onset_date_field')})"
+ )
+
+ logger.debug(
+ f"[ontology_routing] result: "
+ f"{len(routed_pf)} → phenotypicFeatures, "
+ f"{len(routed_diseases)} → diseases, "
+ f"{skipped} skipped"
+ )
+
+ augmented = dict(data)
+ augmented["__routed__phenotypicFeatures"] = routed_pf
+ augmented["__routed__diseases"] = routed_diseases
+ return augmented
+
+
+def get_routed_phenotypic_elements(data: Dict[str, Any]) -> List[Dict[str, Any]]:
+ """Return pre-routed HP elements, or empty list if routing was not applied."""
+ return data.get("__routed__phenotypicFeatures", [])
+
+
+def get_routed_disease_dicts(data: Dict[str, Any]) -> List[Dict[str, Any]]:
+ """Return pre-routed normalized disease dicts, or empty list."""
+ return data.get("__routed__diseases", [])
+
+
+# ---------------------------------------------------------------------------
+# Validation helper — for use in validate.py soft-warning checks
+# ---------------------------------------------------------------------------
+
+def check_prefix_placement(phenopacket_json: Dict[str, Any]) -> List[str]:
+ """
+ Inspect a serialized Phenopacket JSON dict and return a list of
+ soft-warning messages where ontology terms appear in semantically
+ wrong blocks (e.g. an HP: term in ``diseases``).
+
+ These are warnings only — a phenopacket can still be structurally
+ valid while violating these semantic conventions. They are surfaced
+ in the validation output to help data curators catch routing errors.
+ """
+ warnings: List[str] = []
+
+ # HP codes must only appear as PhenotypicFeature.type
+ for i, pf in enumerate(phenopacket_json.get("phenotypicFeatures", [])):
+ term_id = pf.get("type", {}).get("id", "")
+ if term_id and not term_id.startswith("HP:"):
+ warnings.append(
+ f"phenotypicFeatures[{i}].type.id = '{term_id}' — "
+ f"expected HP: prefix (GA4GH Phenopacket v2 convention)"
+ )
+
+ # MONDO/OMIM/ORDO codes must only appear as Disease.term
+ disease_prefixes = {"HP"}
+ for i, disease in enumerate(phenopacket_json.get("diseases", [])):
+ term_id = disease.get("term", {}).get("id", "")
+ if term_id:
+ prefix = term_id.split(":")[0].upper() if ":" in term_id else ""
+ if prefix in disease_prefixes:
+ warnings.append(
+ f"diseases[{i}].term.id = '{term_id}' — "
+ f"HP: terms describe phenotypic features, not diseases "
+ f"(GA4GH Phenopacket v2 convention)"
+ )
+
+ return warnings
+
+
+
+# Internal helpers -----------------------------------------------------------
+def _build_rules(routing_cfg: Dict[str, Any]) -> Dict[str, str]:
+ """Merge user-supplied rules over the semantic defaults."""
+ rules = dict(DEFAULT_ROUTING_RULES)
+ user_rules = routing_cfg.get("rules", {})
+ rules.update({k.upper(): v for k, v in user_rules.items()})
+ return rules
+
+
+def _get_prefix(code: str) -> Optional[str]:
+ if not code:
+ return None
+ try:
+ normalised = process_code(code)
+ if ":" in normalised:
+ return normalised.split(":")[0].upper()
+ except Exception:
+ pass
+ return None
+
+
+def _find_routable_code(
+ inner: Dict[str, Any],
+ scan_fields: Optional[List[str]],
+) -> Tuple[Optional[str], Optional[str]]:
+ """
+ Scan ``inner`` for the first non-empty string value whose normalised
+ prefix appears in ``DEFAULT_ROUTING_RULES``.
+
+ Args:
+ inner: The instrument-level dict from a repeated element.
+ scan_fields: Explicit list of field names to check, or ``None``
+ to scan all non-structural fields.
+
+ Returns:
+ ``(code_value, field_name)`` or ``(None, None)``.
+ """
+ fields_to_check = scan_fields if scan_fields else [
+ k for k in inner if k not in _SKIP_FIELDS
+ ]
+
+ for field in fields_to_check:
+ value = inner.get(field)
+ if not value or not isinstance(value, str):
+ continue
+ prefix = _get_prefix(value)
+ if prefix and prefix.upper() in DEFAULT_ROUTING_RULES:
+ return value, field
+
+ return None, None
+
+
+def _normalize_for_disease_mapper(
+ inner: Dict[str, Any],
+ code: str,
+ onset_fields: List[str],
+ instance: Optional[int] = None,
+ instrument: Optional[str] = None,
+) -> Dict[str, Any]:
+ """
+ Produce a normalized dict in the ``term_field_1`` / ``onset_date_field``
+ convention expected by DiseaseMapper.
+
+ The ``code`` value (e.g. ``"mondo_0043653"``) is placed in
+ ``term_field_1``. The first non-empty value from ``onset_fields``
+ is placed in ``onset_date_field``.
+
+ ``__source_instrument`` and ``__source_instance`` are added for
+ traceability and are ignored by all mappers.
+ """
+ onset_date: Optional[str] = None
+ for field in onset_fields:
+ val = inner.get(field)
+ if val and isinstance(val, str):
+ onset_date = val
+ break
+
+ return {
+ "term_field_1": code,
+ "onset_date_field": onset_date,
+ "onset_category_field": None,
+ "excluded_field": None,
+ "primary_site_field": None,
+ "__source_instrument": instrument,
+ "__source_instance": instance,
+ }
\ No newline at end of file
diff --git a/src/rarelink/phenopackets/create.py b/src/rarelink/phenopackets/create.py
index d41f92701..ef8593376 100644
--- a/src/rarelink/phenopackets/create.py
+++ b/src/rarelink/phenopackets/create.py
@@ -1,4 +1,3 @@
-# src/rarelink/phenopackets/create.py
from phenopackets import Phenopacket
import logging
import traceback
@@ -8,7 +7,6 @@
from rarelink.rarelink_cdm import get_codesystems_container_class
from rarelink.phenopackets.mappings.metadata_mapper import collect_used_prefixes_from_blocks
-# Import new mapper classes
from rarelink.phenopackets.mappings.individual_mapper import IndividualMapper
from rarelink.phenopackets.mappings.vital_status_mapper import VitalStatusMapper
from rarelink.phenopackets.mappings.phenotypic_feature_mapper import PhenotypicFeatureMapper
@@ -18,33 +16,37 @@
from rarelink.phenopackets.mappings.variation_descriptor_mapper import VariationDescriptorMapper
from rarelink.phenopackets.mappings.interpretation_mapper import InterpretationMapper
from rarelink.phenopackets.mappings.metadata_mapper import MetadataMapper
-
+from rarelink.phenopackets.adapter.ontology_routing_adapter import (
+ should_route,
+ apply_ontology_routing,
+ get_routed_phenotypic_elements,
+ get_routed_disease_dicts,
+)
logger = logging.getLogger(__name__)
def create_phenopacket(
- data: dict,
- created_by: str,
+ data: dict,
+ created_by: str,
mapping_configs: Optional[Dict[str, Any]] = None,
debug: bool = False
) -> Phenopacket:
"""
- Creates a Phenopacket for an individual record with flexible mapping configurations.
- Refactored to use mapper classes for improved organization.
-
+ Creates a Phenopacket for an individual record with flexible mapping
+ configurations.
+
Args:
- data (dict): Input data.
- created_by (str): Creator's name.
- mapping_configs (dict, optional): Mapping configurations for different blocks.
- debug (bool): Enable debug mode.
-
+ data (dict): Input record data.
+ created_by (str): Creator's name (written into MetaData).
+ mapping_configs (dict): Mapping configurations for all blocks.
+ debug (bool): Enable verbose debug logging.
+
Returns:
- Phenopacket: The constructed Phenopacket.
+ Phenopacket: The fully constructed Phenopacket.
"""
if not mapping_configs:
raise ValueError("Mapping configurations are required.")
- # Set logging level
logging_level = logging.DEBUG if debug else logging.INFO
logger.setLevel(logging_level)
@@ -53,45 +55,54 @@ def create_phenopacket(
if debug:
logger.debug(f"Processing record ID: {record_id}")
- # --- Helper: Create a processor by merging outer keys ---
+ # Ontology routing (opt-in)
+ if should_route(mapping_configs):
+ data = apply_ontology_routing(data, mapping_configs)
+ logger.debug(
+ f"[routing] phenotypicFeatures: "
+ f"{len(get_routed_phenotypic_elements(data))}, "
+ f"diseases: {len(get_routed_disease_dicts(data))}"
+ )
+
+ # ── Helper: build a DataProcessor from a named config block ──────────
def create_processor(block: str, required: bool = False):
- """
- Create a DataProcessor for a given block by merging the outer configuration keys
- into the mapping config. If the block configuration is a list, use its first element.
- Also, if 'instrument_name' is a collection, convert it to a list of strings and
- set 'redcap_repeat_instrument' to the first element.
- """
config = mapping_configs.get(block, {})
- # If the configuration is a list, use the first element as the base config.
if isinstance(config, list):
config = config[0]
if required and not config:
- raise ValueError(f"Required mapping configuration '{block}' missing.")
- # Start with a copy of the mapping block
+ raise ValueError(
+ f"Required mapping configuration '{block}' missing."
+ )
mapping_block = config.get("mapping_block", {}).copy()
- # Merge other keys from the outer config
for key, value in config.items():
if key != "mapping_block":
mapping_block[key] = value
- # Convert instrument_name to a list of strings if needed.
if "instrument_name" in mapping_block:
inst = mapping_block["instrument_name"]
if not isinstance(inst, str):
- # Convert set or list items to strings.
- inst_list = [str(x) for x in inst] if isinstance(inst, (list, set)) else [str(inst)]
+ inst_list = (
+ [str(x) for x in inst]
+ if isinstance(inst, (list, set))
+ else [str(inst)]
+ )
mapping_block["instrument_name"] = inst_list
else:
- mapping_block["instrument_name"] = [inst] # wrap a single string in a list
- # Ensure that "redcap_repeat_instrument" is set to the first instrument.
- if "instrument_name" in mapping_block and "redcap_repeat_instrument" not in mapping_block:
- mapping_block["redcap_repeat_instrument"] = mapping_block["instrument_name"][0]
+ mapping_block["instrument_name"] = [inst]
+ if (
+ "instrument_name" in mapping_block
+ and "redcap_repeat_instrument" not in mapping_block
+ ):
+ mapping_block["redcap_repeat_instrument"] = (
+ mapping_block["instrument_name"][0]
+ )
processor = DataProcessor(mapping_config=mapping_block)
processor.enable_debug(debug)
- add_enum_classes_to_processor(processor, config.get("enum_classes", {}))
+ add_enum_classes_to_processor(
+ processor, config.get("enum_classes", {})
+ )
return processor, config
-
- # --- Individual & Vital Status ---
+ # ── Individual & Vital Status ────────────────────────────────────────
individual_processor, _ = create_processor("individual", required=True)
try:
dob_field = individual_processor.get_field(data, "date_of_birth_field")
@@ -109,176 +120,254 @@ def create_processor(block: str, required: bool = False):
individual_mapper = IndividualMapper(individual_processor)
individual = individual_mapper.map(data, vital_status=vital_status)
- # --- Phenotypic Features ---
+ # ── Phenotypic Features ──────────────────────────────────────────────
phenotypic_features = []
phenotypic_config = mapping_configs.get("phenotypicFeatures")
-
- # Ensure we store the full data context for proper modifier scoping
- full_data = data
-
+ full_data = data
+
+ # if ontology_routing is active
+ routed_pf = get_routed_phenotypic_elements(data)
+ if routed_pf:
+ base_pf_config = (
+ phenotypic_config[0]
+ if isinstance(phenotypic_config, list) and phenotypic_config
+ else phenotypic_config or {}
+ )
+ routed_pf_config = _build_routed_pf_config(base_pf_config, routed_pf)
+
+ if isinstance(phenotypic_config, list):
+ phenotypic_config = list(phenotypic_config) + [routed_pf_config]
+ elif phenotypic_config:
+ phenotypic_config = [phenotypic_config, routed_pf_config]
+ else:
+ phenotypic_config = [routed_pf_config]
+
if isinstance(phenotypic_config, list):
- logger.debug(f"Processing {len(phenotypic_config)} phenotypic feature configurations")
+ logger.debug(
+ f"Processing {len(phenotypic_config)} phenotypic feature "
+ f"configurations"
+ )
for i, config in enumerate(phenotypic_config):
try:
- # Start with base mapping block
- proc = DataProcessor(mapping_config=config.get("mapping_block", {}).copy())
-
- # Set full_data for proper feature & modifier scoping
- proc.mapping_config['full_data'] = full_data
-
- # Merge outer keys
+ proc = DataProcessor(
+ mapping_config=config.get("mapping_block", {}).copy()
+ )
+ proc.mapping_config["full_data"] = full_data
for key, value in config.items():
if key != "mapping_block":
proc.mapping_config[key] = value
-
- # Ensure repeat instrument is set
- if "instrument_name" in proc.mapping_config and "redcap_repeat_instrument" not in proc.mapping_config:
- proc.mapping_config["redcap_repeat_instrument"] = proc.mapping_config["instrument_name"]
-
+ if (
+ "instrument_name" in proc.mapping_config
+ and "redcap_repeat_instrument"
+ not in proc.mapping_config
+ ):
+ proc.mapping_config["redcap_repeat_instrument"] = (
+ proc.mapping_config["instrument_name"]
+ )
proc.enable_debug(debug)
-
- # Add enum classes
- add_enum_classes_to_processor(proc, config.get("enum_classes", {}))
-
- # Create mapper and map features
+ add_enum_classes_to_processor(
+ proc, config.get("enum_classes", {})
+ )
feature_mapper = PhenotypicFeatureMapper(proc)
- feats = feature_mapper.map(data, dob=individual.date_of_birth)
-
+ feats = feature_mapper.map(
+ data, dob=individual.date_of_birth
+ )
if feats:
- # Ensure each feature has appropriate modifiers only
phenotypic_features.extend(feats)
- logger.debug(f"Added {len(feats)} features from config {i+1}")
+ logger.debug(
+ f"Added {len(feats)} features from config {i + 1}"
+ )
except Exception as e:
- logger.error(f"Error processing phenotypic feature config {i+1}: {e}")
+ logger.error(
+ f"Error processing phenotypic feature config "
+ f"{i + 1}: {e}"
+ )
if debug:
logger.debug(traceback.format_exc())
else:
- # Single configuration case
proc, _ = create_processor("phenotypicFeatures")
-
- # Set full_data for proper feature & modifier scoping
- proc.mapping_config['full_data'] = full_data
-
+ proc.mapping_config["full_data"] = full_data
feature_mapper = PhenotypicFeatureMapper(proc)
- phenotypic_features = feature_mapper.map(data, dob=individual.date_of_birth)
-
+ phenotypic_features = feature_mapper.map(
+ data, dob=individual.date_of_birth
+ )
+
if debug:
logger.debug(f"Total phenotypic features: {len(phenotypic_features)}")
-
- # Validate and deduplicate features if needed
+
+ # Deduplicate features (guard against multi-config overlap)
processed_features = []
feature_types_seen = set()
-
for feature in phenotypic_features:
- # Skip invalid features
if not feature or not feature.type or not feature.type.id:
continue
-
- # For CIEINR/multi-instrument setups, deduplicate features by onset date
- # This handles cases where the same feature appears in multiple configs
feature_key = (
- feature.type.id,
- str(getattr(feature.onset, 'age', None)) if hasattr(feature, 'onset') else None,
- # Include a hash of modifiers if they exist
- hash(tuple(sorted([m.id for m in feature.modifiers]))) if hasattr(feature, 'modifiers') and feature.modifiers else None
+ feature.type.id,
+ str(getattr(feature.onset, "age", None))
+ if hasattr(feature, "onset")
+ else None,
+ hash(tuple(sorted([m.id for m in feature.modifiers])))
+ if hasattr(feature, "modifiers") and feature.modifiers
+ else None,
)
-
if feature_key not in feature_types_seen:
feature_types_seen.add(feature_key)
processed_features.append(feature)
-
phenotypic_features = processed_features
-
- # --- Measurements ---
+
+ # ── Measurements ─────────────────────────────────────────────────────
measurements = []
measurement_config = mapping_configs.get("measurements")
if isinstance(measurement_config, list):
- logger.debug(f"Processing {len(measurement_config)} measurement configurations")
+ logger.debug(
+ f"Processing {len(measurement_config)} measurement configurations"
+ )
for i, config in enumerate(measurement_config):
try:
- proc = DataProcessor(mapping_config=config.get("mapping_block", {}).copy())
+ proc = DataProcessor(
+ mapping_config=config.get("mapping_block", {}).copy()
+ )
for key, value in config.items():
if key != "mapping_block":
proc.mapping_config[key] = value
- if "instrument_name" in proc.mapping_config and "redcap_repeat_instrument" not in proc.mapping_config:
- proc.mapping_config["redcap_repeat_instrument"] = proc.mapping_config["instrument_name"]
+ if (
+ "instrument_name" in proc.mapping_config
+ and "redcap_repeat_instrument"
+ not in proc.mapping_config
+ ):
+ proc.mapping_config["redcap_repeat_instrument"] = (
+ proc.mapping_config["instrument_name"]
+ )
proc.enable_debug(debug)
- add_enum_classes_to_processor(proc, config.get("enum_classes", {}))
+ add_enum_classes_to_processor(
+ proc, config.get("enum_classes", {})
+ )
measurement_mapper = MeasurementMapper(proc)
- meas = measurement_mapper.map(data, dob=individual.date_of_birth)
+ meas = measurement_mapper.map(
+ data, dob=individual.date_of_birth
+ )
if meas:
measurements.extend(meas)
- logger.debug(f"Added {len(meas)} measurements from config {i+1}")
+ logger.debug(
+ f"Added {len(meas)} measurements from config {i + 1}"
+ )
except Exception as e:
- logger.error(f"Error processing measurement config {i+1}: {e}")
+ logger.error(
+ f"Error processing measurement config {i + 1}: {e}"
+ )
if debug:
logger.debug(traceback.format_exc())
else:
proc, _ = create_processor("measurements")
measurement_mapper = MeasurementMapper(proc)
measurements = measurement_mapper.map(
- data, dob=individual.date_of_birth)
+ data, dob=individual.date_of_birth
+ )
if debug:
logger.debug(f"Total measurements: {len(measurements)}")
- # --- Medical Actions (Procedures and Treatments) ---
+ # ── Medical Actions ───────────────────────────────────────────────────
medical_actions = []
proc_processor, _ = create_processor("medical_actions")
medical_action_mapper = MedicalActionMapper(proc_processor)
proc_actions = medical_action_mapper.map(
- data, dob=individual.date_of_birth)
+ data, dob=individual.date_of_birth
+ )
if proc_actions:
medical_actions.extend(proc_actions)
logger.debug(
- f"Added {len(proc_actions)} procedure-based medical actions")
+ f"Added {len(proc_actions)} procedure-based medical actions"
+ )
treatments_config = mapping_configs.get("treatments")
if treatments_config:
if isinstance(treatments_config, list):
for i, config in enumerate(treatments_config):
try:
- # Use the helper to get a base processor from
- # the first element of the treatments list.
proc, _ = create_processor("treatments")
- # Merge the specific treatment config overrides
for key, value in config.items():
if key != "mapping_block":
proc.mapping_config[key] = value
proc.enable_debug(debug)
add_enum_classes_to_processor(
- proc, config.get("enum_classes", {}))
+ proc, config.get("enum_classes", {})
+ )
treatment_mapper = MedicalActionMapper(proc)
treat_actions = treatment_mapper.map(
- data, dob=individual.date_of_birth)
+ data, dob=individual.date_of_birth
+ )
if treat_actions:
medical_actions.extend(treat_actions)
logger.debug(
- f"Added {len(treat_actions)} "
- f"treatment actions from config {i+1}")
+ f"Added {len(treat_actions)} treatment actions "
+ f"from config {i + 1}"
+ )
except Exception as e:
logger.error(
- f"Error processing treatment config {i+1}: {e}")
+ f"Error processing treatment config {i + 1}: {e}"
+ )
if debug:
logger.debug(traceback.format_exc())
elif isinstance(treatments_config, dict):
proc, _ = create_processor("treatments")
treatment_mapper = MedicalActionMapper(proc)
- treat_actions = treatment_mapper.map(data, dob=individual.date_of_birth)
+ treat_actions = treatment_mapper.map(
+ data, dob=individual.date_of_birth
+ )
if treat_actions:
medical_actions.extend(treat_actions)
- logger.debug(f"Added {len(treat_actions)} treatment actions")
+ logger.debug(
+ f"Added {len(treat_actions)} treatment actions"
+ )
if debug:
logger.debug(f"Total medical actions: {len(medical_actions)}")
- # --- Diseases ---
+ # ── Diseases ─────────────────────────────────────────────────────────
disease_processor, _ = create_processor("diseases")
disease_mapper = DiseaseMapper(disease_processor)
diseases = disease_mapper.map(data, dob=individual.date_of_birth)
+
+ # if ontology_routing is active
+ routed_diseases = get_routed_disease_dicts(data)
+ if routed_diseases:
+ logger.debug(
+ f"Processing {len(routed_diseases)} ontology-routed disease(s)"
+ )
+ for routed_dict in routed_diseases:
+ try:
+ routed_proc, _ = create_processor("diseases")
+ routed_data = _inject_routed_disease(
+ data, routed_dict, routed_proc
+ )
+ routed_disease_mapper = DiseaseMapper(routed_proc)
+ routed_result = routed_disease_mapper.map(
+ routed_data, dob=individual.date_of_birth
+ )
+ if routed_result:
+ diseases.extend(
+ routed_result
+ if isinstance(routed_result, list)
+ else [routed_result]
+ )
+ logger.debug(
+ f"Added routed disease from "
+ f"{routed_dict.get('__source_instrument')} "
+ f"#{routed_dict.get('__source_instance')}"
+ )
+ except Exception as e:
+ logger.error(
+ f"Error processing routed disease "
+ f"({routed_dict.get('__source_instrument')} "
+ f"#{routed_dict.get('__source_instance')}): {e}"
+ )
+ if debug:
+ logger.debug(traceback.format_exc())
+
if debug:
logger.debug(f"Total diseases: {len(diseases)}")
- # --- Genetics: Variation Descriptor and Interpretations ---
+ # ── Genetics ─────────────────────────────────────────────────────────
var_processor, _ = create_processor("variationDescriptor")
variation_mapper = VariationDescriptorMapper(var_processor)
variation_descriptors = variation_mapper.map(data)
@@ -288,10 +377,10 @@ def create_processor(block: str, required: bool = False):
interpretations = interpretation_mapper.map(
data,
subject_id=individual.id,
- variation_descriptors=variation_descriptors
+ variation_descriptors=variation_descriptors,
)
- # --- Metadata ---
+ # ── Metadata ──────────────────────────────────────────────────────────
metadata_config = mapping_configs.get("metadata", {}) or {}
code_systems = metadata_config.get("code_systems")
if not code_systems:
@@ -311,15 +400,17 @@ def create_processor(block: str, required: bool = False):
variation_descriptors=variation_descriptors,
)
if debug:
- logger.debug(f"[metadata] used CURIE prefixes: {sorted(used_prefixes)}")
-
+ logger.debug(
+ f"[metadata] used CURIE prefixes: {sorted(used_prefixes)}"
+ )
+
metadata = MetadataMapper(None).map(
- data={},
+ data={},
created_by=created_by,
code_systems=code_systems,
- used_prefixes=used_prefixes,
+ used_prefixes=used_prefixes,
)
-
+
phenopacket = Phenopacket(
id=record_id,
subject=individual,
@@ -328,10 +419,12 @@ def create_processor(block: str, required: bool = False):
diseases=diseases,
medical_actions=medical_actions,
meta_data=metadata,
- interpretations=interpretations
+ interpretations=interpretations,
)
if debug:
- logger.debug(f"Successfully created phenopacket for record {record_id}")
+ logger.debug(
+ f"Successfully created phenopacket for record {record_id}"
+ )
return phenopacket
except Exception as e:
@@ -339,3 +432,92 @@ def create_processor(block: str, required: bool = False):
if debug:
logger.error(traceback.format_exc())
raise
+
+
+# ---------------------------------------------------------------------------
+# Private helpers — only used by create_phenopacket
+# ---------------------------------------------------------------------------
+
+def _build_routed_pf_config(
+ base_config: Dict[str, Any],
+ routed_elements: list,
+) -> Dict[str, Any]:
+ """
+ Build a minimal phenotypicFeatures mapping config for HP-routed elements.
+
+ The config inherits onset/severity/modifier field-name conventions from
+ the first existing phenotypicFeatures block so the PhenotypicFeatureMapper
+ knows which fields to read from the routed elements.
+
+ The instrument name is set to the instrument of the first routed element,
+ so the mapper looks in the right sub-dict of each repeated_elements entry.
+ """
+ # Detect the instrument from the first routed element
+ instrument = (
+ routed_elements[0].get("redcap_repeat_instrument", "__routed__")
+ if routed_elements
+ else "__routed__"
+ )
+
+ # Keys to inherit from the base config's mapping_block
+ _INHERIT = {
+ "onset_date_field", "onset_date_fields", "onset_age_field",
+ "resolution_field", "severity_field", "evidence_field",
+ "modifier_temp_pattern_field",
+ *(f"modifier_field_{i}" for i in range(1, 10)),
+ }
+
+ base_block = (
+ base_config.get("mapping_block", {})
+ if isinstance(base_config, dict)
+ else {}
+ )
+ inherited = {k: v for k, v in base_block.items() if k in _INHERIT}
+
+ return {
+ "instrument_name": instrument,
+ "mapping_block": {
+ "redcap_repeat_instrument": instrument,
+ "multi_onset": base_block.get("multi_onset", False),
+ **inherited,
+ },
+ "enum_classes": (
+ base_config.get("enum_classes", {})
+ if isinstance(base_config, dict)
+ else {}
+ ),
+ "data_model": (
+ base_config.get("data_model", "")
+ if isinstance(base_config, dict)
+ else ""
+ ),
+ }
+
+
+def _inject_routed_disease(
+ data: Dict[str, Any],
+ routed_dict: Dict[str, Any],
+ processor,
+) -> Dict[str, Any]:
+ """
+ Produce a data view that makes the normalized routed_dict visible to
+ the DiseaseMapper via its normal field-access path.
+
+ The DiseaseMapper reads ``term_field_1`` and ``onset_date_field`` from
+ the processor's mapping_config, then looks them up against the record
+ data. We temporarily override those keys in the processor config to
+ point at fixed sentinel field names, then return a synthetic data dict
+ that contains those sentinel values.
+
+ This approach requires no changes to DiseaseMapper itself.
+ """
+ # Overlay the routed values directly onto the processor's mapping config
+ # using the term_field_1 / onset_date_field convention.
+ processor.mapping_config["term_field_1"] = "__routed_term__"
+ processor.mapping_config["onset_date_field"] = "__routed_onset__"
+
+ # Build a synthetic record that DiseaseMapper can traverse normally
+ synthetic = dict(data)
+ synthetic["__routed_term__"] = routed_dict.get("term_field_1")
+ synthetic["__routed_onset__"] = routed_dict.get("onset_date_field")
+ return synthetic
\ No newline at end of file
diff --git a/src/rarelink/phenopackets/mappings/base_mapper.py b/src/rarelink/phenopackets/mappings/base_mapper.py
index 3dabfa32c..9c12cb705 100644
--- a/src/rarelink/phenopackets/mappings/base_mapper.py
+++ b/src/rarelink/phenopackets/mappings/base_mapper.py
@@ -5,7 +5,6 @@
from rarelink.utils.field_access import get_multi_instrument_field_value
import rarelink.utils.label_fetching as labels
-# Define type variable for the return type of mappers
T = TypeVar('T')
logger = logging.getLogger(__name__)
@@ -44,20 +43,12 @@ def map(self, data: Dict[str, Any], **kwargs) -> Union[List[T], T, None]:
"""
try:
- # Extract mapping configuration from processor
config = self.processor.mapping_config
-
- # Determine if this is a single or multi-entity mapper
is_multi = config.get("multi_entity", False)
-
- # Extract instruments for field access
instruments = self._get_instruments(config)
-
- # Store the instruments in the processor for field access
if instruments:
config["all_instruments"] = instruments
- # Map based on single or multi-entity configuration
if is_multi:
result = self._map_multi_entity(data, instruments, **kwargs)
if result is None:
@@ -70,7 +61,6 @@ def map(self, data: Dict[str, Any], **kwargs) -> Union[List[T], T, None]:
logger.error(f"Error in {self.__class__.__name__}.map: {e}")
import traceback
logger.debug(traceback.format_exc())
- # Return empty list for multi-entity mappers, None for single-entity mappers
return [] if config.get("multi_entity", False) else None
def _map_single_entity(
@@ -121,14 +111,12 @@ def get_field(self,
Returns:
Any: Field value or default
"""
- # Get the field path from the configuration
field_path = self.processor.mapping_config.get(field_name)
if not field_path:
if self.debug_mode:
logger.debug(f"Field '{field_name}' not found in mapping config")
return default
- # Use multi-instrument field access if instruments provided
if instruments:
value = get_multi_instrument_field_value(
data=data,
@@ -139,7 +127,6 @@ def get_field(self,
if value is not None:
return value
- # Fallback to processor's get_field method
return self.processor.get_field(data, field_name, default)
def safe_execute(self,
@@ -188,7 +175,6 @@ def fetch_label(self, code: str, enum_class: Any = None) -> Optional[str]:
if not code:
return None
- # Resolve enum class if provided as a name
enum_obj = None
if isinstance(enum_class, str):
enum_obj = getattr(
@@ -196,20 +182,16 @@ def fetch_label(self, code: str, enum_class: Any = None) -> Optional[str]:
else:
enum_obj = enum_class
- # Flatten mapping-config label dicts (support dict-of-dicts or flat dict)
merged_dict: Dict[str, str] = {}
mapping_config = self.processor.mapping_config or {}
label_dicts = mapping_config.get("label_dicts") or {}
if isinstance(label_dicts, dict):
- # If it's a dict-of-dicts, merge values
for v in label_dicts.values():
if isinstance(v, dict):
merged_dict.update(v)
- # If the dict is already flat (values not dicts), also merge as-is
if all(not isinstance(v, dict) for v in label_dicts.values()):
merged_dict.update(label_dicts)
- # Delegate to the shared function (this is what the CLI patches)
return labels.fetch_label(code, enum_class=enum_obj, label_dict=merged_dict)
def fetch_mapping_value(
@@ -231,19 +213,16 @@ def _get_instruments(self, config: Dict[str, Any] = None) -> List[str]:
config = config or self.processor.mapping_config
instruments = []
- # Get instrument_name(s)
instrument_name = config.get("instrument_name")
if isinstance(instrument_name, (list, set)):
instruments.extend(list(instrument_name))
elif instrument_name:
instruments.append(instrument_name)
- # Add redcap_repeat_instrument if present
repeat_instrument = config.get("redcap_repeat_instrument")
if repeat_instrument and repeat_instrument not in instruments:
instruments.append(repeat_instrument)
- # Filter out dummy instruments
return [i for i in instruments if i and i != "__dummy__"]
def map_genetics_to_geno_ontology(self,
diff --git a/src/rarelink/phenopackets/mappings/interpretation_mapper.py b/src/rarelink/phenopackets/mappings/interpretation_mapper.py
index c746fb6d2..24628520a 100644
--- a/src/rarelink/phenopackets/mappings/interpretation_mapper.py
+++ b/src/rarelink/phenopackets/mappings/interpretation_mapper.py
@@ -1,5 +1,6 @@
from typing import Dict, Any, Optional, List, Union
import logging
+import warnings
from phenopackets import (
Interpretation,
OntologyClass,
@@ -9,6 +10,7 @@
VariationDescriptor
)
+
from rarelink.phenopackets.mappings.base_mapper import BaseMapper
logger = logging.getLogger(__name__)
@@ -57,7 +59,7 @@ def _map_single_entity(self, data: Dict[str, Any], instruments: list, **kwargs)
Returns:
Optional[Interpretation]: None as this mapper always returns multiple entities
"""
- logger.warning("InterpretationMapper._map_single_entity called, but this mapper returns multiple entities")
+ warnings.warn("InterpretationMapper._map_single_entity called, but this mapper returns multiple entities")
return None
def _map_multi_entity(self, data: Dict[str, Any], instruments: list, **kwargs) -> List[Interpretation]:
@@ -75,7 +77,7 @@ def _map_multi_entity(self, data: Dict[str, Any], instruments: list, **kwargs) -
# Add this check right here to return empty list if no variation descriptors
if not variation_descriptors:
- logger.warning("No variation descriptors provided, cannot create interpretations")
+ warnings.warn("No variation descriptors provided, cannot create interpretations")
return []
# Get instrument name from configuration or instruments list
@@ -84,13 +86,13 @@ def _map_multi_entity(self, data: Dict[str, Any], instruments: list, **kwargs) -
instrument_name = instruments[0]
if not instrument_name:
- logger.warning("No instrument name found for interpretation mapping")
+ warnings.warn("No instrument name found for interpretation mapping")
return []
# Find repeated elements for the specified instrument
repeated_elements = data.get("repeated_elements", [])
if not repeated_elements:
- logger.warning("No repeated elements found in the data")
+ warnings.warn("No repeated elements found in the data")
return []
# Filter elements for the target instrument
@@ -100,7 +102,7 @@ def _map_multi_entity(self, data: Dict[str, Any], instruments: list, **kwargs) -
]
if not interpretation_elements:
- logger.warning(f"No elements found for instrument {instrument_name}")
+ warnings.warn(f"No elements found for instrument {instrument_name}")
return []
# Group interpretations by diagnosis using the provided (or empty) variation descriptors
@@ -153,13 +155,13 @@ def _group_by_diagnosis(
# Get the genetic findings data
genetic_data = element.get("genetic_findings")
if not genetic_data:
- logger.warning("No interpretation data found in this element")
+ warnings.warn("No interpretation data found in this element")
continue
# Genomic Diagnosis
diagnosis_id = self._extract_diagnosis_id(genetic_data)
if not diagnosis_id:
- logger.warning("No diagnosis ID found in element")
+ warnings.warn("No diagnosis ID found in element")
continue
# Progress Status
@@ -184,7 +186,7 @@ def _group_by_diagnosis(
# Extract redcap_repeat_instance
instance_id = element.get("redcap_repeat_instance")
if not instance_id:
- logger.warning("No redcap_repeat_instance found in element")
+ warnings.warn("No redcap_repeat_instance found in element")
continue
# Check if this instance already exists in the group
@@ -199,7 +201,7 @@ def _group_by_diagnosis(
# Get the variation descriptor for this instance
variation_descriptor = variation_descriptors.get(instance_id)
if not variation_descriptor:
- logger.warning(f"No variation descriptor found for instance {instance_id}")
+ warnings.warn(f"No variation descriptor found for instance {instance_id}")
continue
# Create genomic interpretation
diff --git a/src/rarelink/phenopackets/mappings/measurement_mapper.py b/src/rarelink/phenopackets/mappings/measurement_mapper.py
index d7511290b..e733fee21 100644
--- a/src/rarelink/phenopackets/mappings/measurement_mapper.py
+++ b/src/rarelink/phenopackets/mappings/measurement_mapper.py
@@ -1,5 +1,6 @@
from typing import Dict, Any, List, Optional
import logging
+import warnings
from phenopackets import (
Measurement,
OntologyClass,
@@ -104,7 +105,7 @@ def _map_single_entity(self, data: Dict[str, Any], instruments: List[str], **kwa
value = Value(quantity=quantity)
except (ValueError, TypeError):
- logger.warning(f"Could not convert value {value_data} to float")
+ warnings.warn(f"Could not convert value {value_data} to float")
return None
# Process time observed
@@ -320,7 +321,7 @@ def _create_measurement_from_fields(self, data: Dict[str, Any], field_config: Di
value = Value(quantity=quantity)
except (ValueError, TypeError):
- logger.warning(f"Could not convert value {numeric_value} to float")
+ warnings.warn(f"Could not convert value {numeric_value} to float")
return None
else:
# No value available
@@ -356,7 +357,7 @@ def _create_measurement_from_fields(self, data: Dict[str, Any], field_config: Di
value = Value(quantity=quantity)
except (ValueError, TypeError):
- logger.warning(f"Could not convert value {value_data} to float")
+ warnings.warn(f"Could not convert value {value_data} to float")
return None
# Get time observed (date)
diff --git a/src/rarelink/phenopackets/mappings/medical_action_mapper.py b/src/rarelink/phenopackets/mappings/medical_action_mapper.py
index 0de627e68..b53c71b9b 100644
--- a/src/rarelink/phenopackets/mappings/medical_action_mapper.py
+++ b/src/rarelink/phenopackets/mappings/medical_action_mapper.py
@@ -1,6 +1,7 @@
# src/rarelink/phenopackets/mappings/medical_action_mapper.py
from typing import Any, Dict, List, Optional
import logging
+import warnings
from phenopackets import (
Age,
@@ -36,7 +37,7 @@ def _map_single_entity(
instruments: List[str],
**kwargs,
) -> Optional[MedicalAction]:
- logger.warning(
+ warnings.warn(
"MedicalActionMapper._map_single_entity called, but this mapper "
"returns multiple entities"
)
@@ -171,7 +172,7 @@ def _create_procedure(
age=Age(iso8601duration=iso_age),
)
except Exception as e:
- logger.warning(
+ warnings.warn(
"Could not calculate age at procedure: %s",
e,
)
@@ -390,7 +391,7 @@ def _create_treatment(
),
)
except (ValueError, TypeError):
- logger.warning(
+ warnings.warn(
"Could not convert dose value '%s' to float",
dose_value,
)
@@ -455,7 +456,7 @@ def _extract_treatment_response(
try:
response_fields[int(key.split("_")[-1])] = value
except ValueError:
- logger.warning(
+ warnings.warn(
"Invalid response field key format: %s",
key,
)
diff --git a/src/rarelink/phenopackets/mappings/metadata_mapper.py b/src/rarelink/phenopackets/mappings/metadata_mapper.py
index cc909c926..1917a7e81 100644
--- a/src/rarelink/phenopackets/mappings/metadata_mapper.py
+++ b/src/rarelink/phenopackets/mappings/metadata_mapper.py
@@ -1,17 +1,3 @@
-"""Metadata mapper for Phenopackets.
-
-This module inspects a Phenopacket (or a collection thereof), discovers which
-code systems are actually *used* (by CURIE prefixes like HP:, MONDO:, GENO:, etc.),
-and then builds a `MetaData` block whose `resources` only include those systems.
-
-Key ideas:
-- We traverse the packet(s) breadth-first, collecting CURIE prefixes found in common
- fields (id/value_id/code) and a few special cases (HGVS syntax, GA4GH enums).
-- We look up the latest known versions for each code system from the current
- `CodeSystemsContainer` in `rarelink_cdm` and overlay those versions in the output.
-- If no `used_prefixes` are provided, we infer them from the data.
-"""
-
from __future__ import annotations
import dataclasses
@@ -19,6 +5,7 @@
import re
import sys
import typing
+import warnings
from collections import deque
from datetime import datetime, timezone
from typing import Any, Dict, List, Optional, Set, get_args, get_origin, ForwardRef
@@ -492,7 +479,7 @@ def map(self, data: Dict[str, Any], **kwargs) -> MetaData:
ContainerCls = get_codesystems_container_class()
code_systems = ContainerCls()
except Exception as e:
- logger.warning(f"Auto-load CodeSystemsContainer failed: {e}")
+ warnings.warn(f"Auto-load CodeSystemsContainer failed: {e}")
# Infer used prefixes if not provided
if not used_prefixes:
@@ -546,7 +533,7 @@ def _map_multi_entity(self, data: Dict[str, Any], instruments: list, **kwargs) -
ContainerCls = get_codesystems_container_class()
code_systems = ContainerCls()
except Exception as e:
- logger.warning(f"Auto-load CodeSystemsContainer failed: {e}")
+ warnings.warn(f"Auto-load CodeSystemsContainer failed: {e}")
if not used_prefixes:
pkts: List[Phenopacket] = []
diff --git a/src/rarelink/phenopackets/mappings/phenotypic_feature_mapper.py b/src/rarelink/phenopackets/mappings/phenotypic_feature_mapper.py
index 873b4abd2..2f4feef88 100644
--- a/src/rarelink/phenopackets/mappings/phenotypic_feature_mapper.py
+++ b/src/rarelink/phenopackets/mappings/phenotypic_feature_mapper.py
@@ -1,5 +1,6 @@
from typing import Dict, Any, Optional, List
import logging
+import warnings
from phenopackets import PhenotypicFeature, OntologyClass, TimeElement, Evidence
from rarelink.phenopackets.mappings.base_mapper import BaseMapper
@@ -49,7 +50,7 @@ def _map_single_entity(self, data: Dict[str, Any], instruments: List[str], **kwa
Note: This method is required by the BaseMapper interface but not directly used
since we always return multiple entities.
"""
- logger.warning("PhenotypicFeatureMapper._map_single_entity called, but this mapper returns multiple entities")
+ warnings.warn("PhenotypicFeatureMapper._map_single_entity called, but this mapper returns multiple entities")
return None
def _map_multi_entity(self, data: Dict[str, Any], instruments: List[str], **kwargs) -> List[PhenotypicFeature]:
diff --git a/src/rarelink/phenopackets/mappings/variation_descriptor_mapper.py b/src/rarelink/phenopackets/mappings/variation_descriptor_mapper.py
index 1a49b9f87..f004754b4 100644
--- a/src/rarelink/phenopackets/mappings/variation_descriptor_mapper.py
+++ b/src/rarelink/phenopackets/mappings/variation_descriptor_mapper.py
@@ -1,6 +1,7 @@
from typing import Dict, Any, Optional, List
import re
import logging
+import warnings
from phenopackets import (
VariationDescriptor,
OntologyClass,
@@ -40,13 +41,13 @@ def _map_single_entity(self, data: Dict[str, Any], instruments: list, **kwargs)
instrument_name = instruments[0]
if not instrument_name:
- logger.warning("No instrument name found for variation descriptor mapping")
+ warnings.warn("No instrument name found for variation descriptor mapping")
return {}
# Find repeated elements for the specified instrument
repeated_elements = data.get("repeated_elements", [])
if not repeated_elements:
- logger.warning("No repeated elements found in the data")
+ warnings.warn("No repeated elements found in the data")
return {}
# Filter elements for the target instrument
@@ -56,7 +57,7 @@ def _map_single_entity(self, data: Dict[str, Any], instruments: list, **kwargs)
]
if not variation_elements:
- logger.warning(f"No elements found for instrument {instrument_name}")
+ warnings.warn(f"No elements found for instrument {instrument_name}")
return {}
# Dictionary to store the mapped variation descriptors
@@ -67,13 +68,13 @@ def _map_single_entity(self, data: Dict[str, Any], instruments: list, **kwargs)
# Extract redcap_repeat_instance
instance_id = element.get("redcap_repeat_instance")
if not instance_id:
- logger.warning("No redcap_repeat_instance found in element")
+ warnings.warn("No redcap_repeat_instance found in element")
continue
# Get the genetic findings data
genetic_data = element.get("genetic_findings")
if not genetic_data:
- logger.warning(f"No genetic findings data found in element {instance_id}")
+ warnings.warn(f"No genetic findings data found in element {instance_id}")
continue
# Map this element to a VariationDescriptor
@@ -105,7 +106,7 @@ def _map_multi_entity(self, data: Dict[str, Any], instruments: list, **kwargs) -
Returns:
list: Empty list as this mapper doesn't return a list of entities
"""
- logger.warning("VariationDescriptorMapper._map_multi_entity called, but this mapper returns a dictionary")
+ warnings.warn("VariationDescriptorMapper._map_multi_entity called, but this mapper returns a dictionary")
return []
def map(self, data: Dict[str, Any], **kwargs) -> Dict[str, VariationDescriptor]:
diff --git a/src/rarelink/phenopackets/pipeline.py b/src/rarelink/phenopackets/pipeline.py
index 8e5a8756a..10b7e66bd 100755
--- a/src/rarelink/phenopackets/pipeline.py
+++ b/src/rarelink/phenopackets/pipeline.py
@@ -1,123 +1,186 @@
-# src/rarelink/phenopackets/pipeline.py
-import typer
-from pathlib import Path
-from typing import Dict, Any, Optional
-import logging
-import signal
import json
+import logging
+import warnings as _warnings
import os
+import signal
+from dataclasses import dataclass, field
+from pathlib import Path
+from typing import Any, Callable, Dict, List, Optional
+
+import typer
-from rarelink.phenopackets import (
- create_phenopacket
-)
+from rarelink.phenopackets import create_phenopacket
+from rarelink.phenopackets.write import write_phenopackets
app = typer.Typer()
DEFAULT_OUTPUT_DIR = Path.home() / "Downloads" / "phenopackets"
logger = logging.getLogger(__name__)
+
class TimeoutException(Exception):
pass
+
def timeout_handler(signum, frame):
- raise TimeoutException("Pipeline processing exceeded the one-hour timeout limit.")
+ raise TimeoutException(
+ "Pipeline processing exceeded the timeout limit."
+ )
+
+
+@dataclass
+class PipelineResult:
+ """Structured result returned by phenopacket_pipeline."""
+ phenopackets: list = field(default_factory=list)
+ failed_creations: List[Dict[str, str]] = field(default_factory=list)
+ failed_validations: List[Dict[str, str]] = field(default_factory=list)
+ creation_warnings: List[Dict[str, str]] = field(default_factory=list)
+ total_records: int = 0
+
+ @property
+ def n_created(self) -> int:
+ return len(self.phenopackets)
+
+ @property
+ def n_failed_creation(self) -> int:
+ return len(self.failed_creations)
+
+ @property
+ def n_failed_validation(self) -> int:
+ return len(self.failed_validations)
def phenopacket_pipeline(
- input_data: list,
- output_dir: str,
- created_by: str,
+ input_data: list,
+ output_dir: str,
+ created_by: str,
mapping_configs: Optional[Dict[str, Any]] = None,
timeout: int = 3600,
- debug: bool = False
-):
+ debug: bool = False,
+ progress_callback: Optional[Callable] = None,
+ validation_callback: Optional[Callable] = None,
+) -> PipelineResult:
"""
- Enhanced pipeline to process input data, create Phenopackets, and write them to files.
- Now handles different data models through flexible mapping configurations.
+ Process input records into Phenopackets in two explicit phases:
+
+ Phase 1 — Create: all records are mapped and built in memory.
+ Phase 2 — Write & Validate: write_phenopackets() serializes each one
+ to disk and optionally validates it.
Args:
- input_data (list): List of dictionaries containing individual records.
- output_dir (str): Directory to save Phenopacket JSON files.
- created_by (str): Name of the creator (for metadata).
- mapping_configs (dict, optional): Mapping configurations for Phenopacket creation.
- timeout (int): Timeout in seconds (default is 3600 seconds = 1 hour).
- debug (bool): Enable debug mode for verbose logging
+ input_data: List of record dicts.
+ output_dir: Directory to write JSON files into.
+ created_by: Creator name for phenopacket metadata.
+ mapping_configs: Mapping configurations for Phenopacket creation.
+ timeout: Wall-clock timeout in seconds (default 3600).
+ debug: Enable verbose debug logging.
+ progress_callback: Optional callable(record_id, success, error)
+ called after each creation attempt.
+ validation_callback: Optional callable(file_path, success, error)
+ called after each validation attempt.
+ Forwarded directly to write_phenopackets().
Returns:
- List: A list of created Phenopacket objects.
+ PipelineResult with created phenopackets and per-stage failure details.
"""
- # Set up logging level based on debug flag
- if debug:
- logging.getLogger('rarelink').setLevel(logging.DEBUG)
- else:
- logging.getLogger('rarelink').setLevel(logging.INFO)
+ logging.getLogger("rarelink").setLevel(
+ logging.DEBUG if debug else logging.WARNING
+ )
- # Set up the alarm signal for the timeout
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(timeout)
+ result = PipelineResult(total_records=len(input_data))
+
try:
- # Validate mapping_configs
if not mapping_configs:
raise ValueError("Mapping configurations are required")
-
- # Create directory if it doesn't exist
- os.makedirs(output_dir, exist_ok=True)
- # Create Phenopackets
- phenopackets = []
- failed_records = []
- total_records = len(input_data)
+ os.makedirs(output_dir, exist_ok=True)
- for i, record in enumerate(input_data):
+ # ── Phase 1: Create all Phenopackets ──────────────────────────────────
+ for record in input_data:
+ record_id = record.get("record_id", "unknown")
try:
- print(f"Processing record {i+1}/{total_records} (id={record.get('record_id', 'unknown')})")
-
- # Use mapping_configs if provided
- phenopacket = create_phenopacket(
- data=record,
- created_by=created_by,
- mapping_configs=mapping_configs,
- debug=debug
- )
-
- phenopackets.append(phenopacket)
- print(f" ... created Phenopacket for record id={record.get('record_id', 'unknown')}")
+ with _warnings.catch_warnings(record=True) as caught:
+ _warnings.simplefilter("always")
+ phenopacket = create_phenopacket(
+ data=record,
+ created_by=created_by,
+ mapping_configs=mapping_configs,
+ debug=debug,
+ )
+ record_warnings = [str(w.message) for w in caught]
+ result.phenopackets.append(phenopacket)
+
+ for w in record_warnings:
+ result.creation_warnings.append(
+ {"record_id": record_id, "warning": w}
+ )
+
+ if progress_callback:
+ # Pass warnings as error string even on success
+ warn_str = (
+ "\n".join(f"⚠ {w}" for w in record_warnings)
+ if record_warnings else None
+ )
+ progress_callback(record_id, success=True, error=warn_str)
except Exception as e:
- print(f"ERROR creating Phenopacket for record id={record.get('record_id', 'unknown')} - {e}")
- failed_records.append({
- 'record_id': record.get('record_id', 'unknown'),
- 'error': str(e)
- })
-
- # Log additional debug info
+ error_msg = str(e)
+ result.failed_creations.append(
+ {"record_id": record_id, "error": error_msg}
+ )
+ if progress_callback:
+ progress_callback(record_id, success=False, error=error_msg)
if debug:
- logger.debug(f"Record structure: {json.dumps(record, default=str, indent=2)[:1000]}...")
-
- # Write Phenopackets to files
- from rarelink.phenopackets import write_phenopackets
- logger.info("Writing Phenopackets to files...")
- write_phenopackets(phenopackets, output_dir)
- logger.info("Phenopacket pipeline completed successfully.")
-
- # Optionally, log details of failed records
- if failed_records:
- logger.warning("Details of failed records:")
- for fail in failed_records:
- logger.warning(f"Record ID: {fail['record_id']}")
- logger.warning(f"Error: {fail['error']}")
-
- # Write failure report to file for easier debugging
+ logger.debug(
+ "Record structure: "
+ f"{json.dumps(record, default=str, indent=2)[:1000]}..."
+ )
+
+ # ── Phase 2: Write & Validate ─────────────────────────────────────────
+ def _validation_callback(file_path: str, success: bool, error: Optional[str]):
+ if not success:
+ result.failed_validations.append(
+ {"file": file_path, "error": error or ""}
+ )
+ if validation_callback:
+ validation_callback(file_path, success=success, error=error)
+
+ write_phenopackets(
+ phenopackets=result.phenopackets,
+ output_dir=output_dir,
+ validate=True,
+ validation_callback=_validation_callback,
+ )
+
+ # ── Write failure report (only if failures exist) ─────────────────────
+ all_failures = [
+ {**f, "stage": "creation"} for f in result.failed_creations
+ ] + [
+ {**f, "stage": "validation"} for f in result.failed_validations
+ ]
+ if all_failures:
failure_file = os.path.join(output_dir, "failures.json")
- with open(failure_file, 'w') as f:
- json.dump(failed_records, f, indent=2)
- logger.info(f"Failure report written to {failure_file}")
+ with open(failure_file, "w") as fh:
+ json.dump(all_failures, fh, indent=2)
+ logger.debug(f"Failure report written to {failure_file}")
+
+ # ── Write warnings report (only if warnings exist) ────────────────────
+ all_warnings = [
+ {**w, "stage": "creation"} for w in result.creation_warnings
+ ]
+ # Prefix warnings will be added by export.py after validation,
+ # but pipeline-level warnings are written here.
+ if all_warnings:
+ warnings_file = os.path.join(output_dir, "warnings.json")
+ with open(warnings_file, "w") as fh:
+ json.dump(all_warnings, fh, indent=2)
+ logger.debug(f"Warnings report written to {warnings_file}")
+
+ return result
- return phenopackets
-
except TimeoutException as te:
logger.error(f"Timeout occurred: {te}")
- print(f"WARNING: Processing timed out after {timeout/3600} hour(s).")
raise
finally:
- # Disable the alarm
signal.alarm(0)
\ No newline at end of file
diff --git a/src/rarelink/phenopackets/validate.py b/src/rarelink/phenopackets/validate.py
index 21094e8d9..f07648b6d 100644
--- a/src/rarelink/phenopackets/validate.py
+++ b/src/rarelink/phenopackets/validate.py
@@ -1,67 +1,204 @@
+import json
+import re
+import shutil
import subprocess
+import sys
from pathlib import Path
-from typing import Tuple, List, Union
+from typing import List, Tuple, Union
import logging
+from rarelink.phenopackets.adapter.ontology_routing_adapter import (
+ check_prefix_placement,
+)
+
logger = logging.getLogger(__name__)
-def validate_phenopackets(path: Path) -> Union[Tuple[bool, str], List[Tuple[bool, str]]]:
+_REQUIRED_TOP_LEVEL = {"id", "metaData"}
+_REQUIRED_METADATA = {"created", "createdBy", "phenopacketSchemaVersion"}
+_CURIE_PATTERN = re.compile(r"^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9._\-]+$")
+
+
+def validate_phenopackets(
+ path: Path,
+) -> Union[Tuple[bool, str], List[Tuple[bool, str]]]:
"""
- Validates a phenopacket file or directory of phenopackets using the `phenopacket-tools` CLI.
+ Validate a phenopacket file or directory of phenopackets.
+
+ Runs up to three stages:
+
+ 1. **Python-native structural checks** — required fields, schema version,
+ CURIE format, ``subject.id``.
+ 2. **Ontology-prefix placement checks** — soft warnings when HP: terms
+ appear outside ``phenotypicFeatures`` or MONDO: terms appear outside
+ ``diseases``. Non-fatal: the phenopacket still passes, but warnings
+ are surfaced in the return string to help catch routing errors.
+ 3. **phenopacket-tools CLI** — when the CLI is on PATH, provides deeper
+ schema-level validation on top of stages 1 and 2.
Args:
- path (Path): Path to a phenopacket file or directory of phenopackets.
+ path: Path to a single ``.json`` file or a directory.
Returns:
- Union[Tuple[bool, str], List[Tuple[bool, str]]]: Validation results.
- - Single file: (bool, str) - Success/Failure and details.
- - Directory: List of (bool, str) for each file.
-
+ - Single file → ``(bool, str)``
+ - Directory → ``List[(bool, str)]``
+
Raises:
- ValueError: If the path is invalid or contains no valid phenopackets.
+ ValueError: If path does not exist, is not a JSON file, or a
+ directory contains no JSON files.
"""
logger.info("Starting validation of phenopackets...")
if not path.exists():
raise ValueError(f"Path {path} does not exist.")
-
+
if path.is_file():
if path.suffix == ".json":
return _validate_single_phenopacket(path)
- else:
- raise ValueError(f"File {path} is not a valid JSON file.")
- elif path.is_dir():
- results = []
- for file_path in path.glob("*.json"):
- results.append(_validate_single_phenopacket(file_path))
-
+ raise ValueError(f"File {path} is not a valid JSON file.")
+
+ if path.is_dir():
+ results = [
+ _validate_single_phenopacket(fp)
+ for fp in sorted(path.glob("*.json"))
+ ]
if not results:
- raise ValueError(f"Directory {path} does not contain any JSON files.")
-
- logger.info(f"Validation completed: {len(results)} files validated.")
+ raise ValueError(f"Directory {path} contains no JSON files.")
+ passed = sum(1 for ok, _ in results if ok)
+ logger.info(
+ f"Validation completed: {passed}/{len(results)} files passed."
+ )
return results
- else:
- raise ValueError(f"Path {path} is neither a file nor a directory.")
+
+ raise ValueError(f"Path {path} is neither a file nor a directory.")
+
def _validate_single_phenopacket(file_path: Path) -> Tuple[bool, str]:
- """
- Validates a single phenopacket using the `phenopacket-tools` CLI.
+ """Run all available validation stages on one file."""
+ logger.debug(f"Validating {file_path}...")
- Args:
- file_path (Path): Path to a single phenopacket file.
+ # Stage 1: structural
+ ok, msg = _python_validate(file_path)
+ if not ok:
+ logger.warning(f"Structural validation failed for {file_path}: {msg}")
+ return False, msg
- Returns:
- Tuple[bool, str]: Validation result (Success/Failure) and details.
- """
- command = f"phenopacket-tools validate {file_path}"
+ # Stage 2: prefix placement warnings (non-fatal)
+ prefix_warnings = _prefix_placement_check(file_path)
+
+ # Stage 3: CLI (optional)
+ if shutil.which("phenopacket-tools"):
+ ok, cli_msg = _cli_validate(file_path)
+ if not ok:
+ logger.warning(f"CLI validation failed for {file_path}: {cli_msg}")
+ detail = cli_msg
+ if prefix_warnings:
+ detail += "\n\nOntology prefix warnings:\n" + "\n".join(
+ f" ⚠ {w}" for w in prefix_warnings
+ )
+ return False, detail
+ logger.debug(f"CLI validation passed: {file_path}")
+ else:
+ logger.debug(
+ "phenopacket-tools not found on PATH — skipping CLI validation. "
+ "Install for deeper schema checks: "
+ "https://github.com/phenopackets/phenopacket-tools"
+ )
+
+ detail = f"OK: {file_path}"
+ if prefix_warnings:
+ detail += "\n\nOntology prefix warnings (non-fatal):\n" + "\n".join(
+ f" ⚠ {w}" for w in prefix_warnings
+ )
+
+ logger.debug(f"Validation passed: {file_path}")
+ return True, detail
+
+
+def _python_validate(file_path: Path) -> Tuple[bool, str]:
+ """Python-native structural checks against the Phenopacket v2 JSON schema."""
+ try:
+ with open(file_path) as f:
+ doc = json.load(f)
+ except json.JSONDecodeError as exc:
+ return False, f"Invalid JSON: {exc}"
+
+ errors: List[str] = []
+
+ missing = _REQUIRED_TOP_LEVEL - doc.keys()
+ if missing:
+ errors.append(f"Missing required top-level keys: {sorted(missing)}")
+
+ meta = doc.get("metaData", {})
+ if isinstance(meta, dict):
+ missing_meta = _REQUIRED_METADATA - meta.keys()
+ if missing_meta:
+ errors.append(
+ f"metaData missing required keys: {sorted(missing_meta)}"
+ )
+ schema_ver = meta.get("phenopacketSchemaVersion", "")
+ if schema_ver and not schema_ver.startswith("2"):
+ errors.append(
+ f"phenopacketSchemaVersion is '{schema_ver}', expected '2.x'"
+ )
+
+ subject = doc.get("subject")
+ if subject is not None:
+ if not isinstance(subject, dict) or not subject.get("id"):
+ errors.append("subject block is present but missing 'id'")
+
+ errors.extend(_check_curie_terms(doc, path="$"))
+
+ if errors:
+ return False, "; ".join(errors)
+ return True, "Structural checks passed"
+
+
+def _prefix_placement_check(file_path: Path) -> List[str]:
+ """Load the phenopacket JSON and run ontology-prefix placement checks."""
try:
- logger.info(f"Validating {file_path}...")
- output = subprocess.check_output(command, shell=True, text=True)
- logger.info(f"Validation output for {file_path}:\n{output}")
+ with open(file_path) as f:
+ doc = json.load(f)
+ return check_prefix_placement(doc)
+ except Exception as exc:
+ logger.debug(
+ f"Could not run prefix-placement check on {file_path}: {exc}"
+ )
+ return []
+
+
+def _cli_validate(file_path: Path) -> Tuple[bool, str]:
+ """Run ``phenopacket-tools validate`` and return (success, output)."""
+ command = ["phenopacket-tools", "validate", str(file_path)]
+ try:
+ output = subprocess.check_output(
+ command, stderr=subprocess.STDOUT, text=True
+ )
return True, output
- except subprocess.CalledProcessError as e:
- logger.error(f"Validation failed for {file_path}:\n{e.output}")
- return False, e.output
+ except subprocess.CalledProcessError as exc:
+ return False, exc.output or str(exc)
+
+
+def _check_curie_terms(node, path: str) -> List[str]:
+ """
+ Recursively check that all ontology term ids are valid CURIEs.
+ An OntologyClass-like object is any dict with both ``"id"`` and ``"label"``.
+ """
+ errors: List[str] = []
+ if isinstance(node, dict):
+ if "id" in node and "label" in node:
+ term_id = node["id"]
+ if isinstance(term_id, str) and not _CURIE_PATTERN.match(term_id):
+ errors.append(
+ f"Ontology term id '{term_id}' at {path} "
+ f"is not a valid CURIE (expected PREFIX:localid)"
+ )
+ for key, value in node.items():
+ errors.extend(_check_curie_terms(value, path=f"{path}.{key}"))
+ elif isinstance(node, list):
+ for i, item in enumerate(node):
+ errors.extend(_check_curie_terms(item, path=f"{path}[{i}]"))
+ return errors
+
if __name__ == "__main__":
import argparse
@@ -73,9 +210,9 @@ def _validate_single_phenopacket(file_path: Path) -> Tuple[bool, str]:
description="Validate a phenopacket file or directory of phenopackets."
)
parser.add_argument(
- "path",
- type=Path,
- help="Path to the phenopacket file or directory to validate."
+ "path",
+ type=Path,
+ help="Path to the phenopacket file or directory to validate.",
)
args = parser.parse_args()
@@ -85,8 +222,13 @@ def _validate_single_phenopacket(file_path: Path) -> Tuple[bool, str]:
for success, details in results:
if not success:
logger.error(details)
- elif not results[0]:
- logger.error(results[1])
+ if not all(ok for ok, _ in results):
+ sys.exit(1)
+ else:
+ success, details = results
+ if not success:
+ logger.error(details)
+ sys.exit(1)
except ValueError as ve:
logger.error(str(ve))
- sys.exit(1)
+ sys.exit(1)
\ No newline at end of file
diff --git a/src/rarelink/phenopackets/write.py b/src/rarelink/phenopackets/write.py
index 14b7a6595..33f824c88 100644
--- a/src/rarelink/phenopackets/write.py
+++ b/src/rarelink/phenopackets/write.py
@@ -1,38 +1,85 @@
import json
+import logging
from pathlib import Path
+from typing import Callable, Optional
+
from google.protobuf.json_format import MessageToDict
from phenopackets import VitalStatus as VitalStatusEnum
-def write_phenopackets(phenopackets: list, output_dir: str):
+from rarelink.phenopackets.validate import validate_phenopackets
+
+logger = logging.getLogger(__name__)
+
+
+def write_phenopackets(
+ phenopackets: list,
+ output_dir: str,
+ validate: bool = True,
+ validation_callback: Optional[Callable] = None,
+) -> None:
"""
- Writes Phenopackets to JSON files, emitting only the `status` field
- (including default) in the `vital_status` block.
+ Serialize Phenopackets to JSON files (Phenopacket v2 spec)
+ and optionally validate each one after writing.
+
+ Args:
+ phenopackets: List of Phenopacket protobuf objects.
+ output_dir: Directory to write JSON files into.
+ validate: Run validation after each write. Defaults to True.
+ validation_callback: Optional callable(file_path, success, error)
+ called after each validation attempt.
+ Allows the pipeline to drive progress bars.
"""
output_path = Path(output_dir)
output_path.mkdir(parents=True, exist_ok=True)
for phenopacket in phenopackets:
- # 1) Serialize entire phenopacket normally (no default fields)
full = MessageToDict(
phenopacket,
- preserving_proto_field_name=True,
- including_default_value_fields=False
+ preserving_proto_field_name=False,
+ including_default_value_fields=False,
)
- # 2) Extract the raw integer enum value
+ # 2) Extract the raw integer enum value for vital status.
raw_status_int = phenopacket.subject.vital_status.status
- # 3) Map back to the enum name
+ # 3) Map back to the enum name string.
try:
status_name = VitalStatusEnum.Status.Name(raw_status_int)
except Exception:
status_name = "UNKNOWN_STATUS"
- # 4) Overwrite the vital_status block with just {"status": name}
- full["subject"]["vital_status"] = {"status": status_name}
+ # 4) Overwrite the vitalStatus block with just {"status": name}.
+ if "subject" in full:
+ full["subject"]["vitalStatus"] = {"status": status_name}
- # 5) Write to disk
- file_name = f"{phenopacket.id}.json"
- file_path = output_path / file_name
+ # 5) Write to disk.
+ file_path = output_path / f"{phenopacket.id}.json"
with open(file_path, "w") as f:
json.dump(full, f, indent=2)
+ logger.debug(f"Written: {file_path}")
+
+ # 6) Optionally validate after writing.
+ if validate:
+ try:
+ success, details = validate_phenopackets(file_path)
+ if success:
+ logger.debug(f"Validation passed: {file_path}")
+ if validation_callback:
+ validation_callback(
+ str(file_path), success=True, error=None
+ )
+ else:
+ logger.warning(
+ f"Validation failed for {file_path}: {details}"
+ )
+ if validation_callback:
+ validation_callback(
+ str(file_path), success=False, error=details
+ )
+ except Exception as e:
+ error_msg = str(e)
+ logger.warning(f"Validation error for {file_path}: {error_msg}")
+ if validation_callback:
+ validation_callback(
+ str(file_path), success=False, error=error_msg
+ )
\ No newline at end of file
diff --git a/src/rarelink/rarelink_cdm/mappings/phenopackets/individual.py b/src/rarelink/rarelink_cdm/mappings/phenopackets/individual.py
index cfe831869..4927ef1c0 100644
--- a/src/rarelink/rarelink_cdm/mappings/phenopackets/individual.py
+++ b/src/rarelink/rarelink_cdm/mappings/phenopackets/individual.py
@@ -2,7 +2,7 @@
"id_field": "formal_criteria.snomedct_422549004",
"date_of_birth_field": "personal_information.snomedct_184099003",
"time_at_last_encounter_field": "formal_criteria.snomedct_399423000",
- "sex_field": "personal_information.snomedct_281053000",
+ "sex_field": "personal_information.loinc_76689_9",
"karyotypic_sex_field": "personal_information.snomedct_1296886006",
"gender_field": "personal_information.snomedct_263495000",
}
\ No newline at end of file
diff --git a/src/rarelink/rarelink_cdm/mappings/phenopackets/resources.py b/src/rarelink/rarelink_cdm/mappings/phenopackets/resources.py
index 4103e22f1..5ca1bda00 100644
--- a/src/rarelink/rarelink_cdm/mappings/phenopackets/resources.py
+++ b/src/rarelink/rarelink_cdm/mappings/phenopackets/resources.py
@@ -14,14 +14,14 @@ class CodeSystem:
hpo=CodeSystem(
name="Human Phenotype Ontology",
prefix="HPO",
- version="2025-05-06",
+ version="2026-02-16",
url="http://purl.obolibrary.org/obo/hp.owl",
iri_prefix="http://purl.obolibrary.org/obo/HP_"
),
loinc=CodeSystem(
name="Logical Observation Identifiers Names and Codes",
prefix="LOINC",
- version="LNC278",
+ version="281",
url="https://loinc.org",
iri_prefix="http://loinc.org"
),
@@ -35,14 +35,14 @@ class CodeSystem:
icd11=CodeSystem(
name="International Classification of Diseases, Eleventh Revision",
prefix="ICD11",
- version="SNOMEDCT_US_2024_09_01",
+ version="2025AB",
url="https://icd.who.int/en",
iri_prefix="http://hl7.org/fhir/sid/icd-11"
),
mondo=CodeSystem(
name="Monarch Disease Ontology",
prefix="MONDO",
- version="2025-06-03",
+ version="2026-03-03",
url="https://purl.obolibrary.org/obo/MONDO/",
iri_prefix="http://purl.obolibrary.org/obo/MONDO_"
),
@@ -56,21 +56,21 @@ class CodeSystem:
orpha=CodeSystem(
name="Orphanet Rare Disease Ontology",
prefix="ORPHA",
- version="OMIM2024_08_09",
+ version="4.8",
url="https://www.orpha.net/",
iri_prefix="https://www.orpha.net/ORDO/Orphanet_"
),
ncit=CodeSystem(
name="NCI Thesaurus OBO Edition",
prefix="NCIT",
- version="24.01e",
+ version="26.02d",
url="http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
iri_prefix="http://purl.obolibrary.org/obo/NCIT_"
),
uo=CodeSystem(
name="Units of Measurement Ontology",
prefix="UO",
- version="OMIM2024_08_09",
+ version="2026-01-16",
url="https://www.ontobee.org/ontology/UO",
iri_prefix="http://purl.obolibrary.org/obo/UO_"
),
@@ -98,7 +98,7 @@ class CodeSystem:
SNOMEDCT=CodeSystem(
name="Systematized Medical Nomenclature for Medicine–Clinical Terminology",
prefix="SNOMEDCT",
- version="SNOMEDCT_US_2024_09_01",
+ version="2025AB",
url="http://snomed.info/sct",
iri_prefix="http://snomed.info/sct"
),
@@ -112,7 +112,7 @@ class CodeSystem:
geno=CodeSystem(
name="GENO - The Genotype Ontology",
prefix="GENO",
- version="2023-10-08",
+ version="2026-02-02",
url="https://www.genoontology.org/",
iri_prefix="http://purl.obolibrary.org/obo/GENO_"
),
diff --git a/src/rarelink/rarelink_cdm/mappings/redcap/map_2_personal_information.py b/src/rarelink/rarelink_cdm/mappings/redcap/map_2_personal_information.py
index 9366bf7e4..dee905759 100644
--- a/src/rarelink/rarelink_cdm/mappings/redcap/map_2_personal_information.py
+++ b/src/rarelink/rarelink_cdm/mappings/redcap/map_2_personal_information.py
@@ -12,7 +12,7 @@
FIELD_MAPPINGS = {
"snomedct_184099003": "snomedct_184099003",
- "snomedct_281053000": "snomedct_281053000",
+ "loinc_76689_9": "loinc_76689_9",
"snomedct_1296886006": "snomedct_1296886006",
"snomedct_263495000": "snomedct_263495000",
"snomedct_370159000": "snomedct_370159000",
diff --git a/src/rarelink/rarelink_cdm/mappings/redcap/template.json b/src/rarelink/rarelink_cdm/mappings/redcap/template.json
index a64763616..a8fb94799 100644
--- a/src/rarelink/rarelink_cdm/mappings/redcap/template.json
+++ b/src/rarelink/rarelink_cdm/mappings/redcap/template.json
@@ -6,7 +6,7 @@
"snomedct_399423000": "",
"rarelink_1_formal_criteria_complete": "",
"snomedct_184099003": "",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "",
"snomedct_263495000": "",
"snomedct_370159000": "",
diff --git a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_2_personal_information.py b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_2_personal_information.py
index 1bb4c80d1..5dd312175 100644
--- a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_2_personal_information.py
+++ b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_2_personal_information.py
@@ -69,7 +69,7 @@ class PersonalInformation(YAMLRoot):
snomedct_184099003: Union[str, XSDDate] = None
rarelink_2_personal_information_complete: str = None
- snomedct_281053000: Optional[Union[str, "SexAtBirth"]] = None
+ loinc_76689_9: Optional[Union[str, "SexAtBirth"]] = None
snomedct_1296886006: Optional[Union[str, "KaryotypicSex"]] = None
snomedct_263495000: Optional[Union[str, "GenderIdentity"]] = None
snomedct_370159000: Optional[str] = None
@@ -85,8 +85,8 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
if not isinstance(self.rarelink_2_personal_information_complete, str):
self.rarelink_2_personal_information_complete = str(self.rarelink_2_personal_information_complete)
- if self.snomedct_281053000 is not None and not isinstance(self.snomedct_281053000, SexAtBirth):
- self.snomedct_281053000 = SexAtBirth(self.snomedct_281053000)
+ if self.loinc_76689_9 is not None and not isinstance(self.loinc_76689_9, SexAtBirth):
+ self.loinc_76689_9 = SexAtBirth(self.loinc_76689_9)
if self.snomedct_1296886006 is not None and not isinstance(self.snomedct_1296886006, KaryotypicSex):
self.snomedct_1296886006 = KaryotypicSex(self.snomedct_1296886006)
@@ -277,7 +277,7 @@ class SNOMEDCT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="SNOMEDCT",
description="SNOMED CT",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class MONDO(EnumDefinitionImpl):
@@ -287,7 +287,7 @@ class MONDO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="MONDO",
description="Monarch Disease Ontology",
- code_set_version="2025-06-03",
+ code_set_version="2026-03-03",
)
class HP(EnumDefinitionImpl):
@@ -297,7 +297,7 @@ class HP(EnumDefinitionImpl):
_defn = EnumDefinition(
name="HP",
description="Human Phenotype Ontology",
- code_set_version="2025-05-06",
+ code_set_version="2026-02-16",
)
class LOINC(EnumDefinitionImpl):
@@ -307,7 +307,7 @@ class LOINC(EnumDefinitionImpl):
_defn = EnumDefinition(
name="LOINC",
description="Logical Observation Identifiers Names and Codes",
- code_set_version="LNC278",
+ code_set_version="v281",
)
class OMIM(EnumDefinitionImpl):
@@ -337,7 +337,7 @@ class NCIT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="NCIT",
description="NCI Thesaurus OBO Edition",
- code_set_version="24.01e",
+ code_set_version="26.02d",
)
class UO(EnumDefinitionImpl):
@@ -397,7 +397,7 @@ class ICD11(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD11",
description="International Classification of Diseases, Eleventh Revision",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10CM(EnumDefinitionImpl):
@@ -407,7 +407,7 @@ class ICD10CM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10CM",
description="International Classification of Diseases, Tenth Revision, Clinical Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10GM(EnumDefinitionImpl):
@@ -417,7 +417,7 @@ class ICD10GM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10GM",
description="International Classification of Diseases, Tenth Revision, German Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class SO(EnumDefinitionImpl):
@@ -437,7 +437,7 @@ class GENO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="GENO",
description="GENO - The Genotype Ontology",
- code_set_version="2023-10-08",
+ code_set_version="2026-02-02",
)
class ISO3166(EnumDefinitionImpl):
@@ -467,8 +467,8 @@ class slots:
slots.snomedct_184099003 = Slot(uri=RARELINK.snomedct_184099003, name="snomedct_184099003", curie=RARELINK.curie('snomedct_184099003'),
model_uri=RARELINK.snomedct_184099003, domain=None, range=Union[str, XSDDate])
-slots.snomedct_281053000 = Slot(uri=RARELINK.snomedct_281053000, name="snomedct_281053000", curie=RARELINK.curie('snomedct_281053000'),
- model_uri=RARELINK.snomedct_281053000, domain=None, range=Optional[Union[str, "SexAtBirth"]])
+slots.loinc_76689_9 = Slot(uri=RARELINK.loinc_76689_9, name="loinc_76689_9", curie=RARELINK.curie('loinc_76689_9'),
+ model_uri=RARELINK.loinc_76689_9, domain=None, range=Optional[Union[str, "SexAtBirth"]])
slots.snomedct_1296886006 = Slot(uri=RARELINK.snomedct_1296886006, name="snomedct_1296886006", curie=RARELINK.curie('snomedct_1296886006'),
model_uri=RARELINK.snomedct_1296886006, domain=None, range=Optional[Union[str, "KaryotypicSex"]])
diff --git a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_3_patient_status.py b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_3_patient_status.py
index 3f06282dd..0f44a95d3 100644
--- a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_3_patient_status.py
+++ b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_3_patient_status.py
@@ -240,7 +240,7 @@ class SNOMEDCT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="SNOMEDCT",
description="SNOMED CT",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class MONDO(EnumDefinitionImpl):
@@ -250,7 +250,7 @@ class MONDO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="MONDO",
description="Monarch Disease Ontology",
- code_set_version="2025-06-03",
+ code_set_version="2026-03-03",
)
class HP(EnumDefinitionImpl):
@@ -260,7 +260,7 @@ class HP(EnumDefinitionImpl):
_defn = EnumDefinition(
name="HP",
description="Human Phenotype Ontology",
- code_set_version="2025-05-06",
+ code_set_version="2026-02-16",
)
class LOINC(EnumDefinitionImpl):
@@ -270,7 +270,7 @@ class LOINC(EnumDefinitionImpl):
_defn = EnumDefinition(
name="LOINC",
description="Logical Observation Identifiers Names and Codes",
- code_set_version="LNC278",
+ code_set_version="v281",
)
class OMIM(EnumDefinitionImpl):
@@ -300,7 +300,7 @@ class NCIT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="NCIT",
description="NCI Thesaurus OBO Edition",
- code_set_version="24.01e",
+ code_set_version="26.02d",
)
class UO(EnumDefinitionImpl):
@@ -360,7 +360,7 @@ class ICD11(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD11",
description="International Classification of Diseases, Eleventh Revision",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10CM(EnumDefinitionImpl): # noqa: F811
@@ -370,7 +370,7 @@ class ICD10CM(EnumDefinitionImpl): # noqa: F811
_defn = EnumDefinition(
name="ICD10CM",
description="International Classification of Diseases, Tenth Revision, Clinical Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10GM(EnumDefinitionImpl):
@@ -380,7 +380,7 @@ class ICD10GM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10GM",
description="International Classification of Diseases, Tenth Revision, German Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class SO(EnumDefinitionImpl):
@@ -400,7 +400,7 @@ class GENO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="GENO",
description="GENO - The Genotype Ontology",
- code_set_version="2023-10-08",
+ code_set_version="2026-02-02",
)
class ISO3166(EnumDefinitionImpl):
diff --git a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_4_care_pathway.py b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_4_care_pathway.py
index 8238d425e..07820c1bd 100644
--- a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_4_care_pathway.py
+++ b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_4_care_pathway.py
@@ -237,7 +237,7 @@ class SNOMEDCT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="SNOMEDCT",
description="SNOMED CT",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class MONDO(EnumDefinitionImpl):
@@ -247,7 +247,7 @@ class MONDO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="MONDO",
description="Monarch Disease Ontology",
- code_set_version="2025-06-03",
+ code_set_version="2026-03-03",
)
class HP(EnumDefinitionImpl):
@@ -257,7 +257,7 @@ class HP(EnumDefinitionImpl):
_defn = EnumDefinition(
name="HP",
description="Human Phenotype Ontology",
- code_set_version="2025-05-06",
+ code_set_version="2026-02-16",
)
class LOINC(EnumDefinitionImpl):
@@ -267,7 +267,7 @@ class LOINC(EnumDefinitionImpl):
_defn = EnumDefinition(
name="LOINC",
description="Logical Observation Identifiers Names and Codes",
- code_set_version="LNC278",
+ code_set_version="v281",
)
class OMIM(EnumDefinitionImpl):
@@ -297,7 +297,7 @@ class NCIT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="NCIT",
description="NCI Thesaurus OBO Edition",
- code_set_version="24.01e",
+ code_set_version="26.02d",
)
class UO(EnumDefinitionImpl):
@@ -357,7 +357,7 @@ class ICD11(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD11",
description="International Classification of Diseases, Eleventh Revision",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10CM(EnumDefinitionImpl):
@@ -367,7 +367,7 @@ class ICD10CM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10CM",
description="International Classification of Diseases, Tenth Revision, Clinical Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10GM(EnumDefinitionImpl):
@@ -377,7 +377,7 @@ class ICD10GM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10GM",
description="International Classification of Diseases, Tenth Revision, German Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class SO(EnumDefinitionImpl):
@@ -397,7 +397,7 @@ class GENO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="GENO",
description="GENO - The Genotype Ontology",
- code_set_version="2023-10-08",
+ code_set_version="2026-02-02",
)
class ISO3166(EnumDefinitionImpl):
diff --git a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_5_diseases.py b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_5_diseases.py
index f68b055d7..821300fb8 100644
--- a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_5_diseases.py
+++ b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_5_diseases.py
@@ -392,7 +392,7 @@ class SNOMEDCT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="SNOMEDCT",
description="SNOMED CT",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class MONDO(EnumDefinitionImpl):
@@ -402,7 +402,7 @@ class MONDO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="MONDO",
description="Monarch Disease Ontology",
- code_set_version="2025-06-03",
+ code_set_version="2026-03-03",
)
class HP(EnumDefinitionImpl):
@@ -412,7 +412,7 @@ class HP(EnumDefinitionImpl):
_defn = EnumDefinition(
name="HP",
description="Human Phenotype Ontology",
- code_set_version="2025-05-06",
+ code_set_version="2026-02-16",
)
class LOINC(EnumDefinitionImpl):
@@ -422,7 +422,7 @@ class LOINC(EnumDefinitionImpl):
_defn = EnumDefinition(
name="LOINC",
description="Logical Observation Identifiers Names and Codes",
- code_set_version="LNC278",
+ code_set_version="v281",
)
class OMIM(EnumDefinitionImpl):
@@ -452,7 +452,7 @@ class NCIT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="NCIT",
description="NCI Thesaurus OBO Edition",
- code_set_version="24.01e",
+ code_set_version="26.02d",
)
class UO(EnumDefinitionImpl):
@@ -512,7 +512,7 @@ class ICD11(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD11",
description="International Classification of Diseases, Eleventh Revision",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10CM(EnumDefinitionImpl):
@@ -522,7 +522,7 @@ class ICD10CM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10CM",
description="International Classification of Diseases, Tenth Revision, Clinical Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10GM(EnumDefinitionImpl):
@@ -532,7 +532,7 @@ class ICD10GM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10GM",
description="International Classification of Diseases, Tenth Revision, German Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class SO(EnumDefinitionImpl):
@@ -552,7 +552,7 @@ class GENO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="GENO",
description="GENO - The Genotype Ontology",
- code_set_version="2023-10-08",
+ code_set_version="2026-02-02",
)
class ISO3166(EnumDefinitionImpl):
diff --git a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_6_1_genetic_findings.py b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_6_1_genetic_findings.py
index 28fc9a616..c3ec43d11 100644
--- a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_6_1_genetic_findings.py
+++ b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_6_1_genetic_findings.py
@@ -698,7 +698,7 @@ class SNOMEDCT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="SNOMEDCT",
description="SNOMED CT",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class MONDO(EnumDefinitionImpl): # noqa: F811
@@ -708,7 +708,7 @@ class MONDO(EnumDefinitionImpl): # noqa: F811
_defn = EnumDefinition(
name="MONDO",
description="Monarch Disease Ontology",
- code_set_version="2025-06-03",
+ code_set_version="2026-03-03",
)
class HP(EnumDefinitionImpl):
@@ -718,7 +718,7 @@ class HP(EnumDefinitionImpl):
_defn = EnumDefinition(
name="HP",
description="Human Phenotype Ontology",
- code_set_version="2025-05-06",
+ code_set_version="2026-02-16",
)
class LOINC(EnumDefinitionImpl):
@@ -728,7 +728,7 @@ class LOINC(EnumDefinitionImpl):
_defn = EnumDefinition(
name="LOINC",
description="Logical Observation Identifiers Names and Codes",
- code_set_version="LNC278",
+ code_set_version="v281",
)
class OMIM(EnumDefinitionImpl): # noqa: F811
@@ -758,7 +758,7 @@ class NCIT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="NCIT",
description="NCI Thesaurus OBO Edition",
- code_set_version="24.01e",
+ code_set_version="26.02d",
)
class UO(EnumDefinitionImpl):
@@ -818,7 +818,7 @@ class ICD11(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD11",
description="International Classification of Diseases, Eleventh Revision",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10CM(EnumDefinitionImpl):
@@ -828,7 +828,7 @@ class ICD10CM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10CM",
description="International Classification of Diseases, Tenth Revision, Clinical Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10GM(EnumDefinitionImpl):
@@ -838,7 +838,7 @@ class ICD10GM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10GM",
description="International Classification of Diseases, Tenth Revision, German Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class SO(EnumDefinitionImpl):
@@ -858,7 +858,7 @@ class GENO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="GENO",
description="GENO - The Genotype Ontology",
- code_set_version="2023-10-08",
+ code_set_version="2026-02-02",
)
class ISO3166(EnumDefinitionImpl):
diff --git a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_6_4_family_history.py b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_6_4_family_history.py
index bf7bc611b..ea79300f9 100644
--- a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_6_4_family_history.py
+++ b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_6_4_family_history.py
@@ -421,7 +421,7 @@ class SNOMEDCT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="SNOMEDCT",
description="SNOMED CT",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class MONDO(EnumDefinitionImpl):
@@ -431,7 +431,7 @@ class MONDO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="MONDO",
description="Monarch Disease Ontology",
- code_set_version="2025-06-03",
+ code_set_version="2026-03-03",
)
class HP(EnumDefinitionImpl):
@@ -441,7 +441,7 @@ class HP(EnumDefinitionImpl):
_defn = EnumDefinition(
name="HP",
description="Human Phenotype Ontology",
- code_set_version="2025-05-06",
+ code_set_version="2026-02-16",
)
class LOINC(EnumDefinitionImpl): # noqa: F811
@@ -451,7 +451,7 @@ class LOINC(EnumDefinitionImpl): # noqa: F811
_defn = EnumDefinition(
name="LOINC",
description="Logical Observation Identifiers Names and Codes",
- code_set_version="LNC278",
+ code_set_version="v281",
)
class OMIM(EnumDefinitionImpl):
@@ -481,7 +481,7 @@ class NCIT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="NCIT",
description="NCI Thesaurus OBO Edition",
- code_set_version="24.01e",
+ code_set_version="26.02d",
)
class UO(EnumDefinitionImpl):
@@ -541,7 +541,7 @@ class ICD11(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD11",
description="International Classification of Diseases, Eleventh Revision",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10CM(EnumDefinitionImpl): # noqa: F811
@@ -551,7 +551,7 @@ class ICD10CM(EnumDefinitionImpl): # noqa: F811
_defn = EnumDefinition(
name="ICD10CM",
description="International Classification of Diseases, Tenth Revision, Clinical Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10GM(EnumDefinitionImpl):
@@ -561,7 +561,7 @@ class ICD10GM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10GM",
description="International Classification of Diseases, Tenth Revision, German Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class SO(EnumDefinitionImpl):
@@ -581,7 +581,7 @@ class GENO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="GENO",
description="GENO - The Genotype Ontology",
- code_set_version="2023-10-08",
+ code_set_version="2026-02-02",
)
class ISO3166(EnumDefinitionImpl):
diff --git a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_7_consent.py b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_7_consent.py
index 4015f5cf0..cc40df497 100644
--- a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_7_consent.py
+++ b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_7_consent.py
@@ -235,7 +235,7 @@ class SNOMEDCT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="SNOMEDCT",
description="SNOMED CT",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class MONDO(EnumDefinitionImpl):
@@ -245,7 +245,7 @@ class MONDO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="MONDO",
description="Monarch Disease Ontology",
- code_set_version="2025-06-03",
+ code_set_version="2026-03-03",
)
class HP(EnumDefinitionImpl):
@@ -255,7 +255,7 @@ class HP(EnumDefinitionImpl):
_defn = EnumDefinition(
name="HP",
description="Human Phenotype Ontology",
- code_set_version="2025-05-06",
+ code_set_version="2026-02-16",
)
class LOINC(EnumDefinitionImpl):
@@ -265,7 +265,7 @@ class LOINC(EnumDefinitionImpl):
_defn = EnumDefinition(
name="LOINC",
description="Logical Observation Identifiers Names and Codes",
- code_set_version="LNC278",
+ code_set_version="v281",
)
class OMIM(EnumDefinitionImpl):
@@ -295,7 +295,7 @@ class NCIT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="NCIT",
description="NCI Thesaurus OBO Edition",
- code_set_version="24.01e",
+ code_set_version="26.02d",
)
class UO(EnumDefinitionImpl):
@@ -355,7 +355,7 @@ class ICD11(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD11",
description="International Classification of Diseases, Eleventh Revision",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10CM(EnumDefinitionImpl):
@@ -365,7 +365,7 @@ class ICD10CM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10CM",
description="International Classification of Diseases, Tenth Revision, Clinical Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10GM(EnumDefinitionImpl):
@@ -375,7 +375,7 @@ class ICD10GM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10GM",
description="International Classification of Diseases, Tenth Revision, German Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class SO(EnumDefinitionImpl):
@@ -395,7 +395,7 @@ class GENO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="GENO",
description="GENO - The Genotype Ontology",
- code_set_version="2023-10-08",
+ code_set_version="2026-02-02",
)
class ISO3166(EnumDefinitionImpl):
diff --git a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_cdm.py b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_cdm.py
index 7302162e2..cb2df08fd 100755
--- a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_cdm.py
+++ b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_cdm.py
@@ -248,7 +248,7 @@ class PersonalInformation(YAMLRoot):
snomedct_184099003: Union[str, XSDDate] = None
rarelink_2_personal_information_complete: str = None
- snomedct_281053000: Optional[Union[str, "SexAtBirth"]] = None
+ loinc_76689_9: Optional[Union[str, "SexAtBirth"]] = None
snomedct_1296886006: Optional[Union[str, "KaryotypicSex"]] = None
snomedct_263495000: Optional[Union[str, "GenderIdentity"]] = None
snomedct_370159000: Optional[str] = None
@@ -264,8 +264,8 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
if not isinstance(self.rarelink_2_personal_information_complete, str):
self.rarelink_2_personal_information_complete = str(self.rarelink_2_personal_information_complete)
- if self.snomedct_281053000 is not None and not isinstance(self.snomedct_281053000, SexAtBirth):
- self.snomedct_281053000 = SexAtBirth(self.snomedct_281053000)
+ if self.loinc_76689_9 is not None and not isinstance(self.loinc_76689_9, SexAtBirth):
+ self.loinc_76689_9 = SexAtBirth(self.loinc_76689_9)
if self.snomedct_1296886006 is not None and not isinstance(self.snomedct_1296886006, KaryotypicSex):
self.snomedct_1296886006 = KaryotypicSex(self.snomedct_1296886006)
@@ -918,7 +918,7 @@ class SNOMEDCT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="SNOMEDCT",
description="SNOMED CT",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class MONDO(EnumDefinitionImpl):
@@ -928,7 +928,7 @@ class MONDO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="MONDO",
description="Monarch Disease Ontology",
- code_set_version="2025-06-03",
+ code_set_version="2026-03-03",
)
class HP(EnumDefinitionImpl):
@@ -938,7 +938,7 @@ class HP(EnumDefinitionImpl):
_defn = EnumDefinition(
name="HP",
description="Human Phenotype Ontology",
- code_set_version="2025-05-06",
+ code_set_version="2026-02-16",
)
class LOINC(EnumDefinitionImpl):
@@ -948,7 +948,7 @@ class LOINC(EnumDefinitionImpl):
_defn = EnumDefinition(
name="LOINC",
description="Logical Observation Identifiers Names and Codes",
- code_set_version="LNC278",
+ code_set_version="v281",
)
class OMIM(EnumDefinitionImpl):
@@ -978,7 +978,7 @@ class NCIT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="NCIT",
description="NCI Thesaurus OBO Edition",
- code_set_version="24.01e",
+ code_set_version="26.02d",
)
class UO(EnumDefinitionImpl):
@@ -1038,7 +1038,7 @@ class ICD11(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD11",
description="International Classification of Diseases, Eleventh Revision",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10CM(EnumDefinitionImpl):
@@ -1048,7 +1048,7 @@ class ICD10CM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10CM",
description="International Classification of Diseases, Tenth Revision, Clinical Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10GM(EnumDefinitionImpl):
@@ -1058,7 +1058,7 @@ class ICD10GM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10GM",
description="International Classification of Diseases, Tenth Revision, German Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class SO(EnumDefinitionImpl):
@@ -1078,7 +1078,7 @@ class GENO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="GENO",
description="GENO - The Genotype Ontology",
- code_set_version="2023-10-08",
+ code_set_version="2026-02-02",
)
class ISO3166(EnumDefinitionImpl):
@@ -2581,8 +2581,8 @@ class slots:
slots.snomedct_184099003 = Slot(uri=RARELINK.snomedct_184099003, name="snomedct_184099003", curie=RARELINK.curie('snomedct_184099003'),
model_uri=RARELINK_CDM.snomedct_184099003, domain=None, range=Union[str, XSDDate])
-slots.snomedct_281053000 = Slot(uri=RARELINK.snomedct_281053000, name="snomedct_281053000", curie=RARELINK.curie('snomedct_281053000'),
- model_uri=RARELINK_CDM.snomedct_281053000, domain=None, range=Optional[Union[str, "SexAtBirth"]])
+slots.loinc_76689_9 = Slot(uri=RARELINK.loinc_76689_9, name="loinc_76689_9", curie=RARELINK.curie('loinc_76689_9'),
+ model_uri=RARELINK_CDM.loinc_76689_9, domain=None, range=Optional[Union[str, "SexAtBirth"]])
slots.snomedct_1296886006 = Slot(uri=RARELINK.snomedct_1296886006, name="snomedct_1296886006", curie=RARELINK.curie('snomedct_1296886006'),
model_uri=RARELINK_CDM.snomedct_1296886006, domain=None, range=Optional[Union[str, "KaryotypicSex"]])
diff --git a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_code_systems.py b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_code_systems.py
index c7ad72e56..f135ea184 100755
--- a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_code_systems.py
+++ b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_code_systems.py
@@ -1,26 +1,58 @@
# Auto generated from rarelink_code_systems.yaml by pythongen.py version: 0.0.1
-# Generation date: 2025-12-12T17:10:33
+# Generation date: 2026-03-29T20:59:45
# Schema: code_systems_data
#
# id: https://github.com/BIH-CEI/RareLink/code_systems_data
# description:
# license: https://creativecommons.org/publicdomain/zero/1.0/
+import dataclasses
+import re
from dataclasses import dataclass
+from datetime import (
+ date,
+ datetime,
+ time
+)
from typing import (
+ Any,
ClassVar,
+ Dict,
+ List,
+ Optional,
Union
)
+
+from jsonasobj2 import (
+ JsonObj,
+ as_dict
+)
from linkml_runtime.linkml_model.meta import (
EnumDefinition,
+ PermissibleValue,
+ PvFormulaOptions
)
from linkml_runtime.utils.curienamespace import CurieNamespace
from linkml_runtime.utils.enumerations import EnumDefinitionImpl
+from linkml_runtime.utils.formatutils import (
+ camelcase,
+ sfx,
+ underscore
+)
+from linkml_runtime.utils.metamodelcore import (
+ bnode,
+ empty_dict,
+ empty_list
+)
from linkml_runtime.utils.slot import Slot
from linkml_runtime.utils.yamlutils import (
- YAMLRoot
+ YAMLRoot,
+ extended_float,
+ extended_int,
+ extended_str
)
from rdflib import (
+ Namespace,
URIRef
)
@@ -91,7 +123,7 @@ class NCBITaxon(EnumDefinitionImpl):
_defn = EnumDefinition(
name="NCBITaxon",
description="NCBI organismal classification",
- code_set_version="NCBI2024_04_02",
+ code_set_version="2025_04_10",
)
class SNOMEDCT(EnumDefinitionImpl):
@@ -101,7 +133,7 @@ class SNOMEDCT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="SNOMEDCT",
description="SNOMED CT",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class MONDO(EnumDefinitionImpl):
@@ -111,7 +143,7 @@ class MONDO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="MONDO",
description="Monarch Disease Ontology",
- code_set_version="2025-06-03",
+ code_set_version="2026-03-03",
)
class HP(EnumDefinitionImpl):
@@ -121,7 +153,7 @@ class HP(EnumDefinitionImpl):
_defn = EnumDefinition(
name="HP",
description="Human Phenotype Ontology",
- code_set_version="2025-05-06",
+ code_set_version="2026-02-16",
)
class LOINC(EnumDefinitionImpl):
@@ -131,7 +163,7 @@ class LOINC(EnumDefinitionImpl):
_defn = EnumDefinition(
name="LOINC",
description="Logical Observation Identifiers Names and Codes",
- code_set_version="LNC278",
+ code_set_version="281",
)
class OMIM(EnumDefinitionImpl):
@@ -161,7 +193,7 @@ class NCIT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="NCIT",
description="NCI Thesaurus OBO Edition",
- code_set_version="24.01e",
+ code_set_version="26.02d",
)
class UO(EnumDefinitionImpl):
@@ -171,7 +203,7 @@ class UO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="UO",
description="Units of Measurement Ontology",
- code_set_version="2023-05-25",
+ code_set_version="2026-01-16",
)
class HGNC(EnumDefinitionImpl):
@@ -221,7 +253,7 @@ class ICD11(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD11",
description="International Classification of Diseases, Eleventh Revision",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10CM(EnumDefinitionImpl):
@@ -241,6 +273,7 @@ class ICD10GM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10GM",
description="International Classification of Diseases, Tenth Revision, German Modification",
+ code_set_version="2026",
)
class SO(EnumDefinitionImpl):
@@ -260,7 +293,7 @@ class GENO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="GENO",
description="GENO - The Genotype Ontology",
- code_set_version="2023-10-08",
+ code_set_version="2026-02-02",
)
class ISO3166(EnumDefinitionImpl):
diff --git a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_repeated_elements.py b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_repeated_elements.py
index 13b01aec0..bb13b9d78 100755
--- a/src/rarelink/rarelink_cdm/python_datamodel/rarelink_repeated_elements.py
+++ b/src/rarelink/rarelink_cdm/python_datamodel/rarelink_repeated_elements.py
@@ -697,7 +697,7 @@ class SNOMEDCT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="SNOMEDCT",
description="SNOMED CT",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class MONDO(EnumDefinitionImpl):
@@ -707,7 +707,7 @@ class MONDO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="MONDO",
description="Monarch Disease Ontology",
- code_set_version="2025-06-03",
+ code_set_version="2026-03-03",
)
class HP(EnumDefinitionImpl):
@@ -717,7 +717,7 @@ class HP(EnumDefinitionImpl):
_defn = EnumDefinition(
name="HP",
description="Human Phenotype Ontology",
- code_set_version="2025-05-06",
+ code_set_version="2026-02-16",
)
class LOINC(EnumDefinitionImpl):
@@ -727,7 +727,7 @@ class LOINC(EnumDefinitionImpl):
_defn = EnumDefinition(
name="LOINC",
description="Logical Observation Identifiers Names and Codes",
- code_set_version="LNC278",
+ code_set_version="v281",
)
class OMIM(EnumDefinitionImpl):
@@ -757,7 +757,7 @@ class NCIT(EnumDefinitionImpl):
_defn = EnumDefinition(
name="NCIT",
description="NCI Thesaurus OBO Edition",
- code_set_version="24.01e",
+ code_set_version="26.02d",
)
class UO(EnumDefinitionImpl):
@@ -817,7 +817,7 @@ class ICD11(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD11",
description="International Classification of Diseases, Eleventh Revision",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10CM(EnumDefinitionImpl):
@@ -827,7 +827,7 @@ class ICD10CM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10CM",
description="International Classification of Diseases, Tenth Revision, Clinical Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class ICD10GM(EnumDefinitionImpl):
@@ -837,7 +837,7 @@ class ICD10GM(EnumDefinitionImpl):
_defn = EnumDefinition(
name="ICD10GM",
description="International Classification of Diseases, Tenth Revision, German Modification",
- code_set_version="SNOMEDCT_US_2024_09_01",
+ code_set_version="2025AB",
)
class SO(EnumDefinitionImpl):
@@ -857,7 +857,7 @@ class GENO(EnumDefinitionImpl):
_defn = EnumDefinition(
name="GENO",
description="GENO - The Genotype Ontology",
- code_set_version="2023-10-08",
+ code_set_version="2026-02-02",
)
class ISO3166(EnumDefinitionImpl):
diff --git a/docs/_static/rarelink_cdm_datadictionary - v2_0_5.csv b/src/rarelink/rarelink_cdm/rarelink_cdm_datadictionary - v2_0_6.csv
similarity index 95%
rename from docs/_static/rarelink_cdm_datadictionary - v2_0_5.csv
rename to src/rarelink/rarelink_cdm/rarelink_cdm_datadictionary - v2_0_6.csv
index c928bbb70..f93fb6ca1 100644
--- a/docs/_static/rarelink_cdm_datadictionary - v2_0_5.csv
+++ b/src/rarelink/rarelink_cdm/rarelink_cdm_datadictionary - v2_0_6.csv
@@ -4,7 +4,7 @@ snomedct_422549004,rarelink_1_formal_criteria,"RareLink - 2) Personal In
SNOMED:184099003 | Date of Birth |
Choices: n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Patient.birthDate
- GA4GH Phenopacket Schema v2.0 Element: Individual.date_of_birth"
-snomedct_281053000,rarelink_2_personal_information,,dropdown,2.2 Sex at birth,"snomedct_248152002, Female | snomedct_248153007, Male | snomedct_184115007, Patient sex unknown | snomedct_32570691000036108, Intersex | snomedct_1220561009, Not recorded",The individual's sex that was assigned at birth,,,,,,,,,,,"Variable:
-SNOMED:281053000 | Sex at Birth |
+loinc_76689_9,rarelink_2_personal_information,,dropdown,2.2 Sex at birth,"snomedct_248152002, Female | snomedct_248153007, Male | snomedct_184115007, Patient sex unknown | snomedct_32570691000036108, Intersex | snomedct_1220561009, Not recorded",The individual's sex that was assigned at birth,,,,,,,,,,,"Variable:
+LOINC:76689-9 | Sex at Birth |
Choices:
- SNOMED:248152002 | Female
- SNOMED:248153007 | Male
@@ -33,7 +33,7 @@ Choices:
- SNOMED:32570691000036108 | Intersex
- SNOMED:1220561009 | Not recorded
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Patient.extension:individual-recordedSexOrGender
- GA4GH Phenopacket Schema v2.0 Element: Individual.sex"
@@ -52,7 +52,7 @@ Choices:
- SNOMED:48930007 | XYY
- SNOMED:74964007 | Other
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.value
- GA4GH Phenopacket Schema v2.0 Element: Individual.karyotypic_sex"
@@ -65,7 +65,7 @@ Choices:
- SNOMED:33791000087105 | Identifies as nonbinary gender
- SNOMED:1220561009 | Not recorded
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Patient.extension:individual-genderIdentity
- GA4GH Phenopacket Schema v2.0 Element: Individual.gender"
@@ -73,7 +73,7 @@ snomedct_370159000,rarelink_2_personal_information,,text,2.5 Country of Birth,,T
SNOMED:370159000 | Country of Birth |
Choices: ISO 3166 - 2 or 3 letter country code
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Patient.extension:patient-birthPlace
- GA4GH Phenopacket Schema v2.0 Element: n/a"
@@ -87,7 +87,7 @@ Choices:
- SNOMED:185924006 | Unknown - Opted-out
- SNOMED:261665006 | Unknown - Other Reason
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Patient.deceased.deceasedBoolean or Observation.value
- GA4GH Phenopacket Schema v2.0 Element: Individual.VitalStatus.status"
@@ -95,7 +95,7 @@ snomedct_398299004,rarelink_3_patient_status,,text,3.2 Time of Death,,"If deceas
SNOMED:398299004 | Time of Death |
Choices: n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Patient.deceasedDateTime
- GA4GH Phenopacket Schema v2.0 Element: Individual.VitalStatus.time_of_death"
@@ -103,7 +103,7 @@ snomedct_184305005,rarelink_3_patient_status,,text,3.3 Cause of Death [ICD10CM],
SNOMED:184305005 | Cause of Death |
Choices: n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.value.coding.code
- GA4GH Phenopacket Schema v2.0 Element: Individual.VitalStatus.cause_of_death"
@@ -119,7 +119,7 @@ Choices:
- SNOMED:419099009 | Dead
- SNOMED:261665006 | Unknown
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.value.coding.code
- GA4GH Phenopacket Schema v2.0 Element: Individual.time_at_last_encounter.ontology_class"
@@ -128,7 +128,7 @@ SNOMED:412726003 | Length of Gestation at Birth [weeks+days] |
Choices:
- n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.component:weeks.valueQuantity and Observation.component:days.valueQuantity
- GA4GH Phenopacket Schema v2.0 Element: n/a"
@@ -138,7 +138,7 @@ Choices:
- SNOMED:373066001 | Yes
- SNOMED:373067005 | No
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.code (e.g., ORDO:616874 - Rare disorder without a determined diagnosis after full investigation)
- GA4GH Phenopacket Schema v2.0 Element: Disease.term:OntologyClass (e.g., ORDO:616874 - Rare disorder without a determined diagnosis after full investigation)"
@@ -171,7 +171,7 @@ Choices:
- SNOMED:entered-in-error | Entered in Error
- SNOMED:unknown | Unknown
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Encounter.status
- GA4GH Phenopacket Schema v2.0 Element: n/a"
@@ -188,7 +188,7 @@ Choices:
- SNOMED:261665006 | Unknown
Version(s):
- HL7 FHIR Version 4.0.1
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Encounter.class
- GA4GH Phenopacket Schema v2.0 Element: n/a"
@@ -198,7 +198,7 @@ SNOMED:64572001 | Disease
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.code
- GA4GH Phenopacket Schema v2.0 Element: Disease.term:OntologyClass "
@@ -207,7 +207,7 @@ SNOMED:64572001 | Disease
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.code
- GA4GH Phenopacket Schema v2.0 Element: Disease.term:OntologyClass "
@@ -216,7 +216,7 @@ SNOMED:64572001 | Disease
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.code
- GA4GH Phenopacket Schema v2.0 Element: Disease.term:OntologyClass "
@@ -225,7 +225,7 @@ SNOMED:64572001 | Disease
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.code
- GA4GH Phenopacket Schema v2.0 Element: Disease.term:OntologyClass "
@@ -234,7 +234,7 @@ SNOMED:64572001 | Disease
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.code
- GA4GH Phenopacket Schema v2.0 Element: Disease.term:OntologyClass "
@@ -248,7 +248,7 @@ Choices:
- HL7FHIR:refuted | Refuted
- HL7FHIR:entered-in-error | Entered in Error
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
- HL7 FHIR Version 4.0.1
Mapping:
- HL7 FHIR IPS: Condition.Extension(RareLink)
@@ -261,7 +261,7 @@ Choices:
- SNOMED:410672004 | Date
- SNOMED:261665006 | Unknown
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.onsetString or Observation.valueCodeableConcept
- GA4GH Phenopacket Schema v2.0 Element: Disease.onset "
@@ -270,7 +270,7 @@ SNOMED:298059007 | Date of Onset
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.onsetDateTime
- GA4GH Phenopacket Schema v2.0 Element: Disease.onset "
@@ -282,7 +282,7 @@ Choices:
- SNOMED:410672004 | Date
- SNOMED:261665006 | Unknown
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.valueCodeableConcept
- GA4GH Phenopacket Schema v2.0 Element: n/a "
@@ -291,7 +291,7 @@ SNOMED:432213005 | Date of Diagnosis
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.recordedDate
- GA4GH Phenopacket Schema v2.0 Element: Disease.onset "
@@ -300,7 +300,7 @@ SNOMED:363698007 | Body Site
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.bodySite.coding:snomed-ct
- GA4GH Phenopacket Schema v2.0 Element: Disease.primary_site.OntologyClass "
@@ -314,7 +314,7 @@ Choices:
- HL7FHIR:remission | Remission
- HL7FHIR:resolved | Resolved
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
- HL7 FHIR Version 4.0.1
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.clinicalStatus
@@ -326,7 +326,7 @@ Choices:
- SNOMED:6736007 | Moderate
- SNOMED:255604002 | Mild
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.severity
- GA4GH Phenopacket Schema v2.0 Element: n/a "
@@ -336,7 +336,7 @@ SNOMED:106221001 | Genomic Diagnosis
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: [Suggested] : Condition.code
- GA4GH Phenopacket Schema v2.0 Element: Interpretation.Diagnosis.disease"
@@ -345,7 +345,7 @@ SNOMED:106221001 | Genomic Diagnosis
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Condition.code
- GA4GH Phenopacket Schema v2.0 Element: Interpretation.Diagnosis.disease
@@ -391,14 +391,14 @@ LOINC:LA26398-0 | Sequencing
LOINC:LA26415-2 | MLPA
LOINC:LA46-8 | Other
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.method
- GA4GH Phenopacket Schema v2.0 Element: n/a"
loinc_81304_8_other,rarelink_6_1_genetic_findings,,text,6.1.4 Other Structural Variant Analysis Method [LOINC],BIOPORTAL:LOINC,Please seach for the method in here (Tip: use OLS or LOINC to search for the code and type it in here).,,,,,[loinc_81304_8] = 'loinc_la46-8',,,,,,"Variable:
LOINC:81304-8 | Structural Variant Analysis Method Other
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.method
- GA4GH Phenopacket Schema v2.0 Element: n/a"
@@ -411,7 +411,7 @@ LOINC:LA14030-3 | NCBI Build 36.1 (hg18)
LOINC:LA14031-1 | NCBI Build 35 (hg17)
LOINC:LA26806-2 | GRCh38 (hg38)
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR GenomicsReporting 3.0.0 Variant profile: Observation.component:genomic-ref-seq
- GA4GH Phenopacket Schema v2.0 Element:"
@@ -420,7 +420,7 @@ LOINC:LP7824-8 | Genetic Mutation String
Choices:
n/a
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.component:Variant.valueString
- GA4GH Phenopacket Schema v2.0 Element: [...].VariantInterpretation.VariationDescriptor.Extension"
@@ -430,7 +430,7 @@ LOINC:81290-9 | Genomic DNA Change
Choices:
n/a
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR GenomicsReporting 3.0.0 Variant profile: Observation.component:Variant.valueCode
- GA4GH Phenopacket Schema v2.0 Element: ""[...]VariantInterpretation.VariationDescriptor.Expression [+] [...].MoleculeContext"""
@@ -439,7 +439,7 @@ LOINC:48004-6 | Sequence DNA Change
Choices:
n/a
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR GenomicsReporting 3.0.0 Variant profile: Observation.component:Variant.valueCode
- GA4GH Phenopacket Schema v2.0 Element: [...]VariantInterpretation.VariationDescriptor.Expression [+] [...].MoleculeContext"
@@ -448,7 +448,7 @@ LOINC:48005-3 | Amino Acid Change
Choices:
n/a
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR GenomicsReporting 3.0.0 Variant profile: Observation.component:AminoAcidChange
- GA4GH Phenopacket Schema v2.0 Element: [...]VariantInterpretation.VariationDescriptor.Expression [+] [...].MoleculeContext"
@@ -460,7 +460,7 @@ LOINC:48018-6 | Gene
Choices:
n/a
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR GenomicsReporting 3.0.0 Variant profile: Observation.component:Gene
- GA4GH Phenopacket Schema v2.0 Element: [...].GenomicInterpretation.GeneDescriptor.value_id"
@@ -475,7 +475,7 @@ LOINC:LA6707-9 | Hemizygous
LOINC:LA6703-8 | Heteroplasmic
LOINC:LA6704-6 | Homoplasmic
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR GenomicsReporting 3.0.0: Observation.component:geneticsAllele.State | VS: Allelic State
- GA4GH Phenopacket Schema v2.0 Element: [...].GenomicInterpretation.VariantInterpretation.variationDescriptor.AllelicState"
@@ -490,7 +490,7 @@ LOINC:LA6707-9 | Hemizygous
LOINC:LA6703-8 | Heteroplasmic
LOINC:LA6704-6 | Homoplasmic
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR GenomicsReporting 3.0.0: Observation.component:geneticsAllele.State | VS: Allelic State
- GA4GH Phenopacket Schema v2.0 Element: [...].GenomicInterpretation.VariantInterpretation.variationDescriptor.AllelicState"
@@ -506,7 +506,7 @@ LOINC:LA18196-8 | Likely fetal
LOINC:LA18197-6 | Unknown genomic origin
LOINC:LA26807-0 | De novo
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR GenomicsReporting 3.0.0: Observation.component:GenomicSourceClass
- GA4GH Phenopacket Schema v2.0 Element: n/a"
@@ -521,7 +521,7 @@ LOINC:LA6688-1 | Insertion/Deletion
LOINC:LA6689-9 | Inversion
LOINC:LA6690-7 | Substitution
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR GenomicsReporting 3.0.0: Variant.type
- GA4GH Phenopacket Schema v2.0 Element: n/a"
@@ -536,7 +536,7 @@ LOINC:LA6688-1 | Insertion/Deletion
LOINC:LA6689-9 | Inversion
LOINC:LA6690-7 | Substitution
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR GenomicsReporting 3.0.0: Variant.type
- GA4GH Phenopacket Schema v2.0 Element: n/a"
@@ -550,7 +550,7 @@ LOINC:LA26334-5 | Likely benign
LOINC:LA6675-8 | Benign
LOINC:LA4489-6 | Unknown
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR GenomicsReporting 3.0.0: Observation.component:Variant.Interpretation
- GA4GH Phenopacket Schema v2.0 Element: Interpretation.AcmgPathogenicityClassification"
@@ -577,7 +577,7 @@ LOINC:LA30204-4 | Supporting evidence benign
LOINC:LA30205-1 | Strong evidence benign
LOINC:LA30206-9 | Stand-alone evidence pathogenic
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR GenomicsReporting 3.0.0: Observation.extension:Variant.Interpretation
- GA4GH Phenopacket Schema v2.0 Elemen: n/a"
@@ -586,7 +586,7 @@ SNOMED:8116006 | Phenotypic Feature
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.Code
- GA4GH Phenopacket Schema v2.0 Element: PhenotypicFeature.type"
@@ -597,7 +597,7 @@ Choices:
- SNOMED:723511001 | Refuted
Version(s):
- GA4GH Phenopacket Schema v2.0
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.Status (Rec VS: observation.status)
- GA4GH Phenopacket Schema v2.0 Element: PhenotypicFeature.excluded "
@@ -606,7 +606,7 @@ SNOMED:439272007:704321009=363778006 | Determination Date
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.effectiveDateTime
- GA4GH Phenopacket Schema v2.0 Element: PhenotypicFeature.onset "
@@ -615,7 +615,7 @@ HPO:0034382 | Resolution Date
Choices:
n/a
Version(s):
-P25-05-06 2025-05-06
+P25-05-06 2026-02-16
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.effectiveDateTime
- GA4GH Phenopacket Schema v2.0 Element: PhenotypicFeature.resolution"
@@ -633,7 +633,7 @@ Choices:
- HP:0003596 | Middle age adult onset (40y-60y)
- HP:0003584 | Late adult onset (60y+)
Version(s):
-P25-05-06 2025-05-06
+P25-05-06 2026-02-16
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.category
- GA4GH Phenopacket Schema v2.0 Element: PhenotypicFeature.onset"
@@ -649,7 +649,7 @@ Choices:
- HP:0011011 | Subactue
- HP:0025153 | Transient
Version(s):
-P25-05-06 2025-05-06
+P25-05-06 2026-02-16
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.interpretation
- GA4GH Phenopacket Schema v2.0 Element: PhenotypicFeature.modifiers"
@@ -662,7 +662,7 @@ Choices:
- HP:0012829 | Profound
- HP:0012828 | Severe
Version(s):
-P25-05-06 2025-05-06
+P25-05-06 2026-02-16
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.interpretation
- GA4GH Phenopacket Schema v2.0 Element: PhenotypicFeature.severity
@@ -764,7 +764,7 @@ Choices:
- 8462_4, Diastolic Blood Pressure [mmHg]
- other, Other
Version(s):
-- LOINC vLNC278
+- LOINC vv281
Mapping:
- HL7 FHIR Expression v4.0.1: Observation.code
- GA4GH Phenopacket Schema v2.0 Element: Measurement.assay"
@@ -803,7 +803,7 @@ snomedct_122869004_ncit,rarelink_6_3_measurements,,text,6.3.6A Procedure [NCIT],
Choices:
- n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1 [Suggested]: Procedure.code
- GA4GH Phenopacket Schema v2.0 Element: Measurement.procedure"
@@ -811,7 +811,7 @@ snomedct_122869004_snomed,rarelink_6_3_measurements,,text,6.3.6B Procedure [SNOM
Choices:
- n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1 [Suggested]: Procedure.code
- GA4GH Phenopacket Schema v2.0 Element: Measurement.procedure"
@@ -821,7 +821,7 @@ snomedct_122869004,rarelink_6_3_measurements,,text,"6.3.7 Procedure [SNOMEDCT]",
Choices:
- n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1 [Suggested]: Procedure.code
- GA4GH Phenopacket Schema v2.0 Element: Measurement.procedure"
@@ -829,7 +829,7 @@ snomedct_122869005_maxo,rarelink_6_3_measurements,,text,"6.3.7 Procedure [MAXO]"
Choices:
- n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1 [Suggested]: Procedure.code
- GA4GH Phenopacket Schema v2.0 Element: Measurement.procedure"
@@ -837,7 +837,7 @@ snomedct_122869004_bdsite,rarelink_6_3_measurements,,text,6.3.7A Body Site [SNOM
Choices:
- n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1 [Suggested]: Procedure.bodySite
- GA4GH Phenopacket Schema v2.0 Element: n/a"
@@ -867,7 +867,7 @@ Choices:
- SNOMED:261665006 | Unknown
- SNOMED:1220561009 | Not recorded
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: n/a
- GA4GH Phenopacket Schema v2.0 Element: (Family.relatives → 1 Phenopacket per family member) "
@@ -887,7 +887,7 @@ Choices:
- SNOMED:17945006 | Natural grandmother
- SNOMED:1220561009 | Not recorded
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: n/a
- GA4GH Phenopacket Schema v2.0 Element: (Family.relatives → 1 Phenopacket per family member) "
@@ -899,7 +899,7 @@ Choices:
- SNOMED:261665006 | Unknown
- SNOMED:1220561009 | Not recorded
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Family.consanguinous_parents
- GA4GH Phenopacket Schema v2.0 Element: (Family.consanguinous_parents) "
@@ -919,7 +919,7 @@ Choices:
- SNOMED:17945006 | Natural grandmother
- SNOMED:1220561009 | Not recorded
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: FamilyMemberHistory.relationship.coding (VS: FamilyMember)
- GA4GH Phenopacket Schema v2.0 Element: Family.Pedigree.Person.individual_id "
@@ -944,8 +944,8 @@ Choices:
- SNOMED:32570691000036108 | Intersex
- SNOMED:1220561009 | Not recorded
Version(s):
-- LOINC vLNC278 LNC278
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- LOINC vv281 v281
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: FamilyMemberHistory.sex (VS: AdministrativeGender)
- GA4GH Phenopacket Schema v2.0 Element: Family.Pedigree.Person.sex "
@@ -954,7 +954,7 @@ LOINC:54141-7 | Family Member Age
Choices:
n/a
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR Expression v4.0.1: FamilyMemberHistory.ageAge
- GA4GH Phenopacket Schema v2.0 Element: (Family.relatives) "
@@ -963,7 +963,7 @@ LOINC:54124-3 | Family Member Date of Birth
Choices:
n/a
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR Expression v4.0.1: FamilyMemberHistory.bornDate
- GA4GH Phenopacket Schema v2.0 Element: (Family.relatives) "
@@ -974,7 +974,7 @@ Choices:
- SNOMED:373067005 | No
- SNOMED:261665006 | Unknown
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: FamilyMemberHistory.deceased.deceasedBoolean
- GA4GH Phenopacket Schema v2.0 Element: (Family.relatives) "
@@ -983,7 +983,7 @@ LOINC:54112-8 | Family Member Cause of Death
Choices:
n/a
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR Expression v4.0.1: FamilyMemberHistory.condition.code & FamilyMemberHistory.condition.contributedToDeath
- GA4GH Phenopacket Schema v2.0 Element: (Family.relatives) "
@@ -992,7 +992,7 @@ LOINC:92662-6 | Family Member Deceased Age
Choices:
n/a
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR Expression v4.0.1: FamilyMemberHistory.deceasedAge
- GA4GH Phenopacket Schema v2.0 Element: (Family.relatives) "
@@ -1001,7 +1001,7 @@ LOINC:75315-2 | Family Member Disease
Choices:
n/a
Version(s):
-- LOINC vLNC278 LNC278
+- LOINC vv281 v281
Mapping:
- HL7 FHIR Expression v4.0.1: FamilyMemberHistory.condition.code
- GA4GH Phenopacket Schema v2.0 Element: (Family.relatives) "
@@ -1015,7 +1015,7 @@ Choices:
- HL7FHIR:inactive | Inactive
- HL7FHIR:entered-in-error | Entered in Error
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Consent.status
- GA4GH Phenopacket Schema v2.0 Element: n/a "
@@ -1033,7 +1033,7 @@ SNOMED:386318002 | Health Policy Monitoring
Choices:
n/a
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Consent.policy
- GA4GH Phenopacket Schema v2.0 Element: n/a "
@@ -1046,7 +1046,7 @@ Choices:
- SNOMED:261665006 | Unknown
Version(s):
- RareLink Custom Codes Version 2.0
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Consent.scope.coding
- GA4GH Phenopacket Schema v2.0 Element: n/a "
@@ -1059,7 +1059,7 @@ Choices:
- SNOMED:261665006 | Unknown
Version(s):
- RareLink Custom Codes Version 2.0
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: Consent.scope.coding
- GA4GH Phenopacket Schema v2.0 Element: n/a "
@@ -1071,7 +1071,7 @@ Choices:
- SNOMED:373067005 | No
- SNOMED:261665006 | Unknown
Version(s):
-- SNOMED CT SNOMEDCT_US_2024_09_01 SNOMEDCT_US_2024_09_01
+- SNOMED CT 2025AB 2025AB
Mapping:
- HL7 FHIR Expression v4.0.1: n/a
- GA4GH Phenopacket Schema v2.0 Element: n/a "
diff --git a/src/rarelink/rarelink_cdm/schema_definitions/rarelink_2_personal_information.yaml b/src/rarelink/rarelink_cdm/schema_definitions/rarelink_2_personal_information.yaml
index 820aed26b..c67e0c4dc 100755
--- a/src/rarelink/rarelink_cdm/schema_definitions/rarelink_2_personal_information.yaml
+++ b/src/rarelink/rarelink_cdm/schema_definitions/rarelink_2_personal_information.yaml
@@ -17,23 +17,19 @@ classes:
The section Personal Information (2) of the RareLink CDM
slots:
- snomedct_184099003
- - snomedct_281053000
+ - loinc_76689_9
- snomedct_1296886006
- snomedct_263495000
- snomedct_370159000
- rarelink_2_personal_information_complete
-
-
-
-
slots:
snomedct_184099003:
title: 2.1 Date of birth
description: The individual's date of birth. If the exact month or day is allowd to be captured or not known, select the 1st day of the month or the 1st month of the year, respectively.
range: date
required: true
- snomedct_281053000:
+ loinc_76689_9:
title: 2.2 Sex at birth
description: The individual's sex that was assigned at birth
range: SexAtBirth
diff --git a/src/rarelink/rarelink_cdm/schema_definitions/rarelink_code_systems.yaml b/src/rarelink/rarelink_cdm/schema_definitions/rarelink_code_systems.yaml
index 28cfac004..f4e958f84 100755
--- a/src/rarelink/rarelink_cdm/schema_definitions/rarelink_code_systems.yaml
+++ b/src/rarelink/rarelink_cdm/schema_definitions/rarelink_code_systems.yaml
@@ -12,23 +12,23 @@ enums:
NCBITaxon:
description: NCBI organismal classification
code_set: https://www.ncbi.nlm.nih.gov/taxonomy
- code_set_version: 'NCBI2024_04_02'
+ code_set_version: '2025_04_10'
SNOMEDCT:
description: SNOMED CT
code_set: http://snomed.info/sct
- code_set_version: 'SNOMEDCT_US_2024_09_01'
+ code_set_version: '2025AB'
MONDO:
description: Monarch Disease Ontology
code_set: https://purl.obolibrary.org/obo/MONDO/
- code_set_version: '2025-06-03'
+ code_set_version: '2026-03-03'
HP:
description: Human Phenotype Ontology
code_set: https://www.human-phenotype-ontology.org
- code_set_version: '2025-05-06'
+ code_set_version: '2026-02-16'
LOINC:
description: Logical Observation Identifiers Names and Codes
code_set: http://loinc.org
- code_set_version: 'LNC278'
+ code_set_version: '281'
OMIM:
description: Online Mendelian Inheritance
code_set: https://omim.org/
@@ -40,11 +40,11 @@ enums:
NCIT:
description: NCI Thesaurus OBO Edition
code_set: http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl
- code_set_version: '24.01e'
+ code_set_version: '26.02d'
UO:
description: Units of Measurement Ontology
code_set: https://www.ontobee.org/ontology/UO
- code_set_version: '2023-05-25'
+ code_set_version: '2026-01-16'
HGNC:
description: HUGO Gene Nomenclature Committee
code_set: https://www.genenames.org/
@@ -64,7 +64,7 @@ enums:
ICD11:
description: International Classification of Diseases, Eleventh Revision
code_set: https://icd.who.int/en
- code_set_version: 'SNOMEDCT_US_2024_09_01'
+ code_set_version: '2025AB'
ICD10CM:
description: International Classification of Diseases, Tenth Revision, Clinical
Modification
@@ -74,7 +74,7 @@ enums:
description: International Classification of Diseases, Tenth Revision, German
Modification
code_set: https://www.bfarm.de/EN/Code-systems/Classifications/ICD/ICD-10-GM/_node.html
- code_set_version: ''
+ code_set_version: '2026'
SO:
description: Sequence types and features ontology
code_set: https://www.sequenceontology.org/
@@ -82,7 +82,7 @@ enums:
GENO:
description: GENO - The Genotype Ontology
code_set: https://www.genoontology.org/
- code_set_version: '2023-10-08'
+ code_set_version: '2026-02-02'
ISO3166:
description: ISO 3166-1:2020(en) alpha-2 and alpha-3 country codes
code_set: https://www.iso.org/iso-3166-country-codes.html
diff --git a/src/rarelink/rd_cdm/__init__.py b/src/rarelink/rd_cdm/__init__.py
deleted file mode 100644
index b680692d5..000000000
--- a/src/rarelink/rd_cdm/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-__all__ = []
\ No newline at end of file
diff --git a/src/rarelink/rd_cdm/cli.py b/src/rarelink/rd_cdm/cli.py
deleted file mode 100644
index 57444c225..000000000
--- a/src/rarelink/rd_cdm/cli.py
+++ /dev/null
@@ -1,13 +0,0 @@
-import click
-from pathlib import Path
-from .sync import sync_and_generate
-
-@click.group()
-def main():
- pass
-
-@main.command("sync-auto")
-@click.option("--dest", type=click.Path(file_okay=False, dir_okay=True, path_type=Path), default=Path("rarelink_cdm"))
-def sync_auto(dest):
- path = sync_and_generate(dest)
- click.echo(f"Synced and regenerated schema/classes for {path}")
\ No newline at end of file
diff --git a/src/rarelink/rd_cdm/codegen.py b/src/rarelink/rd_cdm/codegen.py
deleted file mode 100644
index 2971dc4bd..000000000
--- a/src/rarelink/rd_cdm/codegen.py
+++ /dev/null
@@ -1,303 +0,0 @@
-# src/rarelink/rd_cdm/codegen.py
-from __future__ import annotations
-from pathlib import Path
-import importlib.resources as ilr
-import yaml
-from linkml.generators.pythongen import PythonGenerator
-from shutil import copytree, copy2
-import re
-import glob
-from shutil import rmtree
-import shutil
-
-from .schema_template import base_schema
-
-RDCDM_PKG = "rd_cdm"
-
-KEY_ALIASES = {
- "NCBITAXON": "NCBITaxon",
- "NCBI_TAXON": "NCBITaxon",
- "ORDO": "ORPHA",
- "ORPHA": "ORPHA",
- "HPO": "HP",
- "HP": "HP",
- "SNOMEDCT": "SNOMEDCT",
- "MONDO": "MONDO",
- "LOINC": "LOINC",
- "OMIM": "OMIM",
- "NCIT": "NCIT",
- "UO": "UO",
- "HGNC": "HGNC",
- "HGVS": "HGVS",
- "GA4GH": "GA4GH",
- "HL7FHIR": "HL7FHIR",
- "ICD11": "ICD11",
- "ICD10CM": "ICD10CM",
- "ICD10GM": "ICD10GM",
- "SO": "SO",
- "GENO": "GENO",
- "ISO3166": "ISO3166",
- "ICF": "ICF",
-}
-
-def _ensure_rarelink_types(schema_dir: Path) -> Path:
- """
- Ensure rarelink_types.yaml is present next to the generated schema.
- Strategy:
- 1) If already exists -> return it.
- 2) Copy from the newest existing src/rarelink/rarelink_cdm/v*/schema_definitions/rarelink_types.yaml
- 3) Otherwise write a minimal stub.
- Never raises; always returns a path.
- """
- target = schema_dir / "rarelink_types.yaml"
- if target.exists():
- return target
-
- # Find the latest rarelink_types.yaml in the repo
- candidates = sorted(
- glob.glob("src/rarelink/rarelink_cdm/v*/schema_definitions/rarelink_types.yaml")
- )
- if candidates:
- latest = candidates[-1]
- schema_dir.mkdir(parents=True, exist_ok=True)
- copy2(latest, target)
- return target
-
- # Fallback: minimal stub is acceptable for our schema generation
- stub = """id: https://github.com/BIH-CEI/RareLink/rarelink_types
- name: rarelink_types
- imports:
- - linkml:types
- default_range: string
- """
- schema_dir.mkdir(parents=True, exist_ok=True)
- target.write_text(stub, encoding="utf-8")
- return target
-
-def _rdcdm_code_systems_yaml(version: str) -> Path:
- base = Path(ilr.files(RDCDM_PKG)) / "instances" / version
- p = base / "code_systems.yaml"
- if not p.exists():
- raise FileNotFoundError(f"Not found: {p}")
- return p
-
-def _normalize_cs(data):
- """Return dict[key->info] from rd-cdm YAML."""
- if isinstance(data, dict) and "code_systems" in data and isinstance(data["code_systems"], list):
- data = data["code_systems"]
- out = {}
- if isinstance(data, dict):
- for k, v in data.items():
- if isinstance(v, list):
- v = next((x for x in v if isinstance(x, dict)), {}) or {}
- elif not isinstance(v, dict):
- v = {}
- out[str(k)] = v
- elif isinstance(data, list):
- for item in data:
- if not isinstance(item, dict):
- continue
- key = item.get("key") or item.get("id") or item.get("acronym") or item.get("prefix") or item.get("name")
- if not key:
- continue
- out[str(key)] = item
- return out
-
-def _extract_version(info: dict) -> str:
- return str(
- info.get("version")
- or info.get("code_set_version")
- or info.get("release")
- or info.get("date")
- or ""
- )
-
-def build_schema_with_versions(rdcdm_version: str):
- with open(_rdcdm_code_systems_yaml(rdcdm_version), "r", encoding="utf-8") as f:
- raw = yaml.safe_load(f) or {}
- cs = _normalize_cs(raw)
-
- schema = base_schema()
- enums = schema["enums"]
-
- # apply versions from rd-cdm to our fixed enums
- for rd_key, info in cs.items():
- target = KEY_ALIASES.get(rd_key, rd_key)
- if target in enums:
- enums[target]["code_set_version"] = _extract_version(info) or enums[target].get("code_set_version", "")
-
- return schema
-
-def write_linkml_schema(rdcdm_version: str, out_dir: Path) -> Path:
- schema_dict = build_schema_with_versions(rdcdm_version)
- out_dir.mkdir(parents=True, exist_ok=True)
- schema_path = out_dir / "rarelink_code_systems.yaml"
- with open(schema_path, "w", encoding="utf-8") as f:
- yaml.safe_dump(schema_dict, f, sort_keys=False, allow_unicode=True)
- return schema_path
-
-def generate_python_classes(schema_path: Path, out_pkg_dir: Path) -> Path:
- out_pkg_dir.mkdir(parents=True, exist_ok=True)
- gen = PythonGenerator(str(schema_path))
- code = gen.serialize()
- mod_path = out_pkg_dir / "rarelink_code_systems.py"
- with open(mod_path, "w", encoding="utf-8") as f:
- f.write(code)
- return mod_path
-
-# ---------- NEW: clone previous tree and update ----------
-def _detect_prev_version(root: Path, target_version: str | None = None) -> str | None:
- """Pick the highest existing version under root that is NOT the target."""
- candidates = sorted(
- p.name for p in root.iterdir()
- if p.is_dir() and p.name.startswith("v")
- )
- if target_version:
- candidates = [c for c in candidates if c != target_version]
- return candidates[-1] if candidates else None
-
-def _copy_previous_tree(prev_version_dir: Path, new_version_dir: Path, *, force: bool) -> None:
- """Copy whole tree from prev -> new. If new exists and force=True, delete it first."""
- if prev_version_dir.resolve() == new_version_dir.resolve():
- # nothing to do; don’t copy onto self
- return
- if new_version_dir.exists():
- if force:
- rmtree(new_version_dir)
- else:
- # skip copying; caller will overwrite what matters
- return
- # ignore caches/bytecode
- ignore = shutil.ignore_patterns("__pycache__", "*.pyc", "*.pyo", ".DS_Store")
- copytree(prev_version_dir, new_version_dir, ignore=ignore, dirs_exist_ok=False)
-
-def scaffold_version_package(version: str, root: Path, from_version: str | None = None, *, force: bool = False) -> dict:
- version_dir = root / version
- schema_dir = version_dir / "schema_definitions"
- datamodel_dir = version_dir / "python_datamodel"
-
- # 1) decide previous
- if not from_version:
- from_version = _detect_prev_version(root, target_version=version)
- if not from_version:
- raise RuntimeError("No previous rarelink_cdm version found; provide --from-version")
-
- prev_dir = root / from_version
- if not prev_dir.exists():
- raise FileNotFoundError(f"Previous version not found: {prev_dir}")
-
- # 2) clone (idempotent)
- _copy_previous_tree(prev_dir, version_dir, force=force)
-
- # 3) write updated schema + ensure rarelink_types
- schema_path = write_linkml_schema(version, schema_dir)
- _ensure_rarelink_types(schema_dir)
-
- # 4) kill stale caches in datamodel then regenerate
- (datamodel_dir / "__pycache__").exists() and rmtree(datamodel_dir / "__pycache__")
- py_path = generate_python_classes(schema_path, datamodel_dir)
-
- # 5) force-overwrite __init__.py to avoid old CodeSystem imports
- (datamodel_dir / "__init__.py").unlink(missing_ok=True)
- (version_dir / "__init__.py").unlink(missing_ok=True)
- (datamodel_dir / "__init__.py").write_text(
- "from .rarelink_code_systems import CodeSystemsContainer\n"
- "__all__ = ['CodeSystemsContainer']\n", encoding="utf-8",
- )
- (version_dir / "__init__.py").write_text(
- "from .python_datamodel import CodeSystemsContainer\n"
- "__all__ = ['CodeSystemsContainer']\n", encoding="utf-8",
- )
-
- return {"version_dir": version_dir, "schema_path": schema_path, "py_path": py_path}
-
-# update REDCap Data Dictionary
-def _versions_from_schema(schema_path: Path) -> dict[str, str]:
- """Read back enum versions from the generated schema."""
- with open(schema_path, "r", encoding="utf-8") as f:
- sch = yaml.safe_load(f) or {}
- enums = (sch or {}).get("enums", {})
- out = {}
- for k, v in enums.items():
- out[k] = (v or {}).get("code_set_version", "") or ""
- return out
-
-NAMES = {
- "HP": ["HPO"],
- "SNOMEDCT": ["SNOMED CT"],
- "LOINC": ["LOINC"],
- "NCIT": ["NCIT"],
- "MONDO": ["MONDO", "Mondo"], # if needed
- # add more if you want them auto-updated in bullets
-}
-
-def _update_text_versions(text: str, versions: dict[str, str]) -> str:
- """
- Update free-text occurrences of code system versions in the CSV.
-
- Strategy:
- 1) Bullet lines first (to avoid double-touches).
- - For LOINC and NCIT bullets, force 'v{ver}'
- - For others, use '{ver}'
- 2) Labelled '... Version ...' lines.
- """
- # 1) Bullet-style lines (e.g., '- LOINC vLNC278', '- NCIT v24.01e', '- HPO 2025-05-06')
- for key, names in NAMES.items():
- ver = versions.get(key, "")
- if not ver:
- continue
- for name in names:
- # Already has a 'v' after the name -> keep 'v'
- pattern_v = rf"(^[ \t]*[-\*]\s*{re.escape(name)}\s+)(?:v)?\S+"
- repl_v = rf"\1v{ver}" if key in {"LOINC", "NCIT"} else rf"\1{ver}"
- text = re.sub(pattern_v, repl_v, text, flags=re.MULTILINE)
-
- # No 'v' yet after the name -> inject proper replacement
- pattern_no_v = rf"(^[ \t]*[-\*]\s*{re.escape(name)}\s+)(?!v)\S+"
- repl_no_v = rf"\1v{ver}" if key in {"LOINC", "NCIT"} else rf"\1{ver}"
- text = re.sub(pattern_no_v, repl_no_v, text, flags=re.MULTILINE)
-
- # 2) Labelled '... Version ...' forms (e.g., 'HPO Version XXX', 'SNOMED CT Version YYY')
- for key, names in NAMES.items():
- ver = versions.get(key, "")
- if not ver:
- continue
- for name in names:
- pattern = rf"({re.escape(name)}\s+Version)\s*[vV]?\S+"
- text = re.sub(pattern, rf"\1 {ver}", text)
-
- return text
-
-def update_data_dictionary_csv(
- res_dir: Path,
- from_version: str,
- to_version: str,
- versions: dict[str, str],
- overwrite: bool = False,
-) -> Path:
- src_name = f"rarelink_cdm_datadictionary - {from_version}.csv"
- src_path = res_dir / src_name
- if not src_path.exists():
- candidates = list(res_dir.glob("rarelink_cdm_datadictionary - *.csv"))
- raise FileNotFoundError(f"Data dictionary CSV not found: {src_path}\nCandidates: {candidates}")
-
- dst_name = f"rarelink_cdm_datadictionary - {to_version}.csv"
- dst_path = res_dir / dst_name
-
- # Respect overwrite flag
- if dst_path.exists() and not overwrite:
- raise FileExistsError(f"Destination exists: {dst_path}. Pass overwrite=True to replace.")
-
- # Read whatever is currently at src_path (may equal dst_path)
- original = src_path.read_text(encoding="utf-8")
- updated = _update_text_versions(original, versions)
-
- # 🔧 Fallback: if nothing changed (common when from_version == to_version and the file
- # was clobbered to something like "existing"), synthesize a normalized line so the
- # overwrite test can still pass deterministically.
- if updated == original:
- if "SNOMEDCT" in versions:
- updated = f"SNOMED CT Version {versions['SNOMEDCT']}\n"
-
- dst_path.write_text(updated, encoding="utf-8")
- return dst_path
diff --git a/src/rarelink/rd_cdm/codegen_cli.py b/src/rarelink/rd_cdm/codegen_cli.py
deleted file mode 100644
index b2a5aab0c..000000000
--- a/src/rarelink/rd_cdm/codegen_cli.py
+++ /dev/null
@@ -1,24 +0,0 @@
-import click
-from pathlib import Path
-from .codegen import scaffold_version_package, _versions_from_schema, update_data_dictionary_csv
-
-@click.group()
-def main():
- """Generate `rarelink_cdm/{version}` from installed rd-cdm resources."""
-
-@main.command("generate")
-@click.option("--version", required=True, help="target rarelink_cdm version")
-@click.option("--dest", type=click.Path(file_okay=False, dir_okay=True, path_type=Path), default=Path("src/rarelink/rarelink_cdm"))
-@click.option("--from-version", "from_version", required=False, help="previous rarelink_cdm version to clone")
-@click.option("--res-dir", type=click.Path(file_okay=False, dir_okay=True, path_type=Path), default=Path("res"))
-@click.option("--update-dictionary/--no-update-dictionary", default=True, help="Update & rename the data dictionary CSV")
-@click.option("--force/--no-force", default=False, help="Delete the target version folder before copying")
-def generate(version, dest, from_version, res_dir, update_dictionary, force):
- res = scaffold_version_package(version, dest, from_version=from_version, force=force)
- click.echo(f"Generated LinkML + Python at: {res['version_dir']}")
-
- if update_dictionary:
- versions = _versions_from_schema(res["schema_path"])
- src_ver = from_version or "v2_0_2" # fallback if auto-detected
- csv_path = update_data_dictionary_csv(res_dir, from_version=src_ver, to_version=version, versions=versions)
- click.echo(f"Updated data dictionary: {csv_path}")
diff --git a/src/rarelink/rd_cdm/schema_template.py b/src/rarelink/rd_cdm/schema_template.py
deleted file mode 100644
index 3c10627e2..000000000
--- a/src/rarelink/rd_cdm/schema_template.py
+++ /dev/null
@@ -1,228 +0,0 @@
-# src/rarelink/cdm/schema_template.py
-from __future__ import annotations
-from typing import Dict, Any
-
-def base_schema() -> Dict[str, Any]:
- return {
- "id": "https://github.com/BIH-CEI/RareLink/code_systems_data",
- "name": "code_systems_data",
- "prefixes": {
- "linkml": "https://w3id.org/linkml/",
- "rarelink": "https://github.com/BIH-CEI/rarelink/",
- },
- "imports": [
- "linkml:types",
- "rarelink_types",
- ],
- "default_prefix": "rarelink",
- "default_range": "string",
- "enums": {
- "NCBITaxon": {
- "description": "NCBI organismal classification",
- "code_set": "https://www.ncbi.nlm.nih.gov/taxonomy",
- "code_set_version": "",
- },
- "SNOMEDCT": {
- "description": "SNOMED CT",
- "code_set": "http://snomed.info/sct",
- "code_set_version": "",
- },
- "MONDO": {
- "description": "Monarch Disease Ontology",
- "code_set": "https://purl.obolibrary.org/obo/MONDO/",
- "code_set_version": "",
- },
- "HP": {
- "description": "Human Phenotype Ontology",
- "code_set": "https://www.human-phenotype-ontology.org",
- "code_set_version": "",
- },
- "LOINC": {
- "description": "Logical Observation Identifiers Names and Codes",
- "code_set": "http://loinc.org",
- "code_set_version": "",
- },
- "OMIM": {
- "description": "Online Mendelian Inheritance",
- "code_set": "https://omim.org/",
- "code_set_version": "",
- },
- "ORPHA": {
- "description": "Orphanet Rare Disease Ontology",
- "code_set": "https://www.orpha.net/",
- "code_set_version": "",
- },
- "NCIT": {
- "description": "NCI Thesaurus OBO Edition",
- "code_set": "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl",
- "code_set_version": "",
- },
- "UO": {
- "description": "Units of Measurement Ontology",
- "code_set": "https://www.ontobee.org/ontology/UO",
- "code_set_version": "",
- },
- "HGNC": {
- "description": "HUGO Gene Nomenclature Committee",
- "code_set": "https://www.genenames.org/",
- "code_set_version": "",
- },
- "HGVS": {
- "description": "Human Genome Variation Society",
- "code_set": "http://varnomen.hgvs.org/",
- "code_set_version": "",
- },
- "GA4GH": {
- "description": "Global Alliance for Genomics and Health",
- "code_set": "https://www.ga4gh.org/",
- "code_set_version": "",
- },
- "HL7FHIR": {
- "description": "Health Level 7 Fast Healthcare Interoperability Resources",
- "code_set": "https://www.hl7.org/fhir",
- "code_set_version": "",
- },
- "ICD11": {
- "description": "International Classification of Diseases, Eleventh Revision",
- "code_set": "https://icd.who.int/en",
- "code_set_version": "",
- },
- "ICD10CM": {
- "description": "International Classification of Diseases, Tenth Revision, Clinical Modification",
- "code_set": "https://icd10cmtool.cdc.gov/",
- "code_set_version": "",
- },
- "ICD10GM": {
- "description": "International Classification of Diseases, Tenth Revision, German Modification",
- "code_set": "https://www.bfarm.de/EN/Code-systems/Classifications/ICD/ICD-10-GM/_node.html",
- "code_set_version": "",
- },
- "SO": {
- "description": "Sequence types and features ontology",
- "code_set": "https://www.sequenceontology.org/",
- "code_set_version": "",
- },
- "GENO": {
- "description": "GENO - The Genotype Ontology",
- "code_set": "https://www.genoontology.org/",
- "code_set_version": "",
- },
- "ISO3166": {
- "description": "ISO 3166-1:2020(en) alpha-2 and alpha-3 country codes",
- "code_set": "https://www.iso.org/iso-3166-country-codes.html",
- "code_set_version": "",
- },
- "ICF": {
- "description": "International Classification of Functioning, Disability and Health",
- "code_set": "https://www.who.int/classifications/icf/en/",
- "code_set_version": "",
- },
- },
- "classes": {
- "CodeSystemsContainer": {
- "description": "A container class for all code systems used in RareLink.",
- "attributes": {
- "ncbi_taxon": {
- "description": "NCBI organismal classification",
- "range": "NCBITaxon",
- "required": True,
- },
- "SNOMEDCT": {
- "description": "SNOMED CT",
- "range": "SNOMEDCT",
- "required": True,
- },
- "mondo": {
- "description": "Monarch Disease Ontology",
- "range": "MONDO",
- "required": True,
- },
- "hpo": {
- "description": "Human Phenotype Ontology",
- "range": "HP",
- "required": True,
- },
- "loinc": {
- "description": "Logical Observation Identifiers Names and Codes",
- "range": "LOINC",
- "required": True,
- },
- "omim": {
- "description": "Online Mendelian Inheritance",
- "range": "OMIM",
- "required": True,
- },
- "orpha": {
- "description": "Orphanet Rare Disease Ontology",
- "range": "ORPHA",
- "required": True,
- },
- "ncit": {
- "description": "NCI Thesaurus OBO Edition",
- "range": "NCIT",
- "required": True,
- },
- "uo": {
- "description": "Units of Measurement Ontology",
- "range": "UO",
- "required": True,
- },
- "hgnc": {
- "description": "HUGO Gene Nomenclature Committee",
- "range": "HGNC",
- "required": True,
- },
- "hgvs": {
- "description": "Human Genome Variation Society",
- "range": "HGVS",
- "required": True,
- },
- "ga4gh": {
- "description": "Global Alliance for Genomics and Health",
- "range": "GA4GH",
- "required": True,
- },
- "hl7fhir": {
- "description": "Health Level 7 Fast Healthcare Interoperability Resources",
- "range": "HL7FHIR",
- "required": True,
- },
- "icd11": {
- "description": "International Classification of Diseases, Eleventh Revision",
- "range": "ICD11",
- "required": True,
- },
- "icd10cm": {
- "description": "International Classification of Diseases, Tenth Revision, Clinical Modification",
- "range": "ICD10CM",
- "required": True,
- },
- "icd10gm": {
- "description": "International Classification of Diseases, Tenth Revision, German Modification",
- "range": "ICD10GM",
- "required": True,
- },
- "so": {
- "description": "Sequence types and features ontology",
- "range": "SO",
- "required": True,
- },
- "geno": {
- "description": "GENO - The Genotype Ontology",
- "range": "GENO",
- "required": True,
- },
- "iso3166": {
- "description": "ISO 3166-1:2020(en) alpha-2 and alpha-3 country codes",
- "range": "ISO3166",
- "required": True,
- },
- "icf": {
- "description": "International Classification of Functioning, Disability and Health",
- "range": "ICF",
- "required": True,
- },
- },
- }
- },
- }
diff --git a/src/rarelink/rd_cdm/sync.py b/src/rarelink/rd_cdm/sync.py
deleted file mode 100644
index 4b7db4256..000000000
--- a/src/rarelink/rd_cdm/sync.py
+++ /dev/null
@@ -1,64 +0,0 @@
-import subprocess
-import yaml
-from pathlib import Path
-import importlib.resources as ilr
-import shutil
-
-RDCDM_PKG = "rd_cdm"
-
-def get_latest_rdcdm_version() -> str:
- inst = Path(ilr.files(RDCDM_PKG)) / "instances"
- versions = sorted([p.name for p in inst.iterdir() if p.is_dir()])
- return versions[-1]
-
-def sync_and_generate(dest_root: Path) -> Path:
- version = get_latest_rdcdm_version()
- src = Path(ilr.files(RDCDM_PKG)) / "instances" / version
- dest = dest_root / version
- if dest.exists():
- shutil.rmtree(dest)
- shutil.copytree(src, dest)
-
- # Generate LinkML schema for code systems
- code_yaml = src / "code_systems.yaml"
- schema_yaml = dest / "schema_definitions" / "rarelink_code_systems.yaml"
- schema_yaml.parent.mkdir(parents=True, exist_ok=True)
- with open(code_yaml) as f:
- codes = yaml.safe_load(f)
- schema = _generate_linkml_schema(codes)
- with open(schema_yaml, "w") as f:
- yaml.safe_dump(schema, f, sort_keys=False)
-
- # Regenerate Python classes from schema
- out_dir = dest / "python_datamodel"
- subprocess.run([
- "gen-python",
- str(schema_yaml),
- "--output", str(out_dir / "rarelink_code_systems.py")
- ], check=True)
- return dest
-
-def _generate_linkml_schema(codes: dict) -> dict:
- fields = {}
- for name, cfg in codes.items():
- fields[name] = {"range": "CodeSystem", "description": cfg.get("title", name)}
- return {
- "name": "rarelink_code_systems",
- "id": "https://rarelink/rarelink_code_systems",
- "prefixes": {"linkml": "https://w3id.org/linkml/"},
- "imports": ["linkml:types"],
- "classes": {
- "CodeSystem": {
- "attributes": {
- "name": {"range": "string"},
- "url": {"range": "uri"},
- "version": {"range": "string"},
- "prefix": {"range": "string"},
- "iri_prefix": {"range": "uri"}
- }
- },
- "CodeSystemsContainer": {
- "attributes": fields
- }
- }
- }
\ No newline at end of file
diff --git a/src/rarelink/tofhir/.DS_Store b/src/rarelink/tofhir/.DS_Store
deleted file mode 100755
index 32f197dbe..000000000
Binary files a/src/rarelink/tofhir/.DS_Store and /dev/null differ
diff --git a/src/rarelink/tofhir/docker-compose.yml b/src/rarelink/tofhir/docker-compose.yml
index 50196bdd6..709d4fa16 100755
--- a/src/rarelink/tofhir/docker-compose.yml
+++ b/src/rarelink/tofhir/docker-compose.yml
@@ -48,7 +48,7 @@ services:
- shared-network
kafka-1:
- image: bitnami/kafka:latest
+ image: bitnamilegacy/kafka:3.7.0
container_name: kafka-1
ports:
- 9092:9092
@@ -74,7 +74,7 @@ services:
- shared-network
kafka-2:
- image: bitnami/kafka:latest
+ image: bitnamilegacy/kafka:3.7.0
container_name: kafka-2
ports:
- 9192:9192
diff --git a/src/rarelink/tofhir/mapping-contexts/4_4_encounter_class.csv b/src/rarelink/tofhir/mapping-contexts/4_4_encounter_class.csv
index b13705d16..57237db7c 100644
--- a/src/rarelink/tofhir/mapping-contexts/4_4_encounter_class.csv
+++ b/src/rarelink/tofhir/mapping-contexts/4_4_encounter_class.csv
@@ -6,4 +6,4 @@
"hl7fhir_vr","Virtual","VR","Virtual","https://hl7.org/fhir/R4/","R4"
"hl7fhir_hh","Home Health","HH","Home Health","https://hl7.org/fhir/R4/","R4"
"rarelink_rdc","RD Specialist Center","RDC","RD Specialist Center","https://github.com/BIH-CEI/RareLink","2.0+"
-"snomedct_261665006","Unknown","261665006","Unknown","http://snomed.info/sct","SNOMEDCT_US_2024_09_01"
\ No newline at end of file
+"snomedct_261665006","Unknown","261665006","Unknown","http://snomed.info/sct","2025AB"
\ No newline at end of file
diff --git a/src/rarelink/tofhir/mapping-contexts/jsons/4_4_encounter_class.json b/src/rarelink/tofhir/mapping-contexts/jsons/4_4_encounter_class.json
index 6fce118f6..b9ff890c3 100755
--- a/src/rarelink/tofhir/mapping-contexts/jsons/4_4_encounter_class.json
+++ b/src/rarelink/tofhir/mapping-contexts/jsons/4_4_encounter_class.json
@@ -64,7 +64,7 @@
"target_code": "261665006",
"target_display": "Unknown",
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01"
+ "version": "2025AB"
}
]
}
\ No newline at end of file
diff --git a/src/rarelink/tofhir/mappings/consent.consent.json b/src/rarelink/tofhir/mappings/consent.consent.json
index 65aa94c3a..41ba0be5d 100755
--- a/src/rarelink/tofhir/mappings/consent.consent.json
+++ b/src/rarelink/tofhir/mappings/consent.consent.json
@@ -81,7 +81,7 @@
"coding": [
{
"system": "{{? iif(rarelink_consent_contact.empty().not(), 'http://snomed.info/sct')}}",
- "version": "{{? iif(rarelink_consent_contact.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
+ "version": "{{? iif(rarelink_consent_contact.empty().not(), '2025AB')}}",
"code": "{{? mpp:getConcept(%consentContact, rarelink_consent_contact, 'target_code')}}",
"display": "{{? mpp:getConcept(%consentContact, rarelink_consent_contact, 'target_display')}}"
}
diff --git a/src/rarelink/tofhir/mappings/familymemberhistory.familyhistory.json b/src/rarelink/tofhir/mappings/familymemberhistory.familyhistory.json
index 9d286ddb2..fcd9b0598 100644
--- a/src/rarelink/tofhir/mappings/familymemberhistory.familyhistory.json
+++ b/src/rarelink/tofhir/mappings/familymemberhistory.familyhistory.json
@@ -36,7 +36,7 @@
"coding": [
{
"system": "{{'http://snomed.info/sct'}}",
- "version": "{{'SNOMEDCT_US_2024_09_01'}}",
+ "version": "{{'2025AB'}}",
"code": "{{mpp:getConcept(%familyRelationship, snomedct_444018008, 'target_code')}}",
"display": "{{mpp:getConcept(%familyRelationship, snomedct_444018008, 'target_display')}}"
}
@@ -46,7 +46,7 @@
"coding": [
{
"system": "{{? iif(loinc_54123_5.empty().not(),'http://hl7.org/fhir/ValueSet/administrative-gender')}}",
- "version": "{{? iif(loinc_54123_5.empty().not(),'SNOMEDCT_US_2024_09_01')}}",
+ "version": "{{? iif(loinc_54123_5.empty().not(),'2025AB')}}",
"code": "{{? mpp:getConcept(%familySex, loinc_54123_5, 'target_code')}}",
"display": "{{? mpp:getConcept(%familySex, loinc_54123_5, 'target_display')}}"
}
@@ -81,7 +81,7 @@
"coding": [
{
"system": "{{? iif(loinc_54112_8.empty().not(), 'https://www.cdc.gov/nchs/icd/icd10cm.htm')}}",
- "version": "{{? iif(loinc_54112_8.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
+ "version": "{{? iif(loinc_54112_8.empty().not(), '2025AB')}}",
"code": "{{? loinc_54112_8}}"
}
],
@@ -94,7 +94,7 @@
"coding": [
{
"system": "{{? iif(loinc_75315_2.empty().not(), 'http://purl.obolibrary.org/obo/mondo.owl')}}",
- "version": "{{? iif(loinc_75315_2.empty().not(),'2025-06-03')}}",
+ "version": "{{? iif(loinc_75315_2.empty().not(),'2026-03-03')}}",
"code": "{{? loinc_75315_2}}"
}
],
@@ -111,7 +111,7 @@
"url": "{{? iif(snomedct_64245008.empty().not(), 'https://rarelink.bih-charite.de/fhir/StructureDefinition/propositus')}}",
"valueCoding": {
"system": "{{? iif(snomedct_64245008.empty().not(), 'http://snomed.info/sct')}}",
- "version": "{{? iif(snomedct_64245008.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
+ "version": "{{? iif(snomedct_64245008.empty().not(), '2025AB')}}",
"code": "{{? iif(snomedct_64245008.empty().not(), '64245008')}}",
"display": "{{? iif(snomedct_64245008.empty().not(), 'Propositus (finding)')}}"
},
@@ -119,7 +119,7 @@
"coding": [
{
"system": "{{? iif(snomedct_64245008.empty().not(), 'http://snomed.info/sct')}}",
- "version": "{{? iif(snomedct_64245008.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
+ "version": "{{? iif(snomedct_64245008.empty().not(), '2025AB')}}",
"code": "{{? mpp:getConcept(%familyPropositus, snomedct_64245008, 'target_code')}}",
"display": "{{? mpp:getConcept(%familyPropositus, snomedct_64245008, 'target_display')}}"
}
@@ -130,7 +130,7 @@
"url": "{{? iif(snomedct_842009.empty().not(), 'https://rarelink.bih-charite.de/fhir/StructureDefinition/consanguinity')}}",
"valueCoding": {
"system": "{{? iif(snomedct_842009.empty().not(), 'http://snomed.info/sct')}}",
- "version": "{{? iif(snomedct_842009.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
+ "version": "{{? iif(snomedct_842009.empty().not(), '2025AB')}}",
"code": "{{? iif(snomedct_842009.empty().not(), '842009')}}",
"display": "{{? iif(snomedct_842009.empty().not(), 'Consanguinity (finding)')}}"
},
@@ -138,7 +138,7 @@
"coding": [
{
"system": "{{? iif(snomedct_842009.empty().not(), 'http://snomed.info/sct')}}",
- "version": "{{? iif(snomedct_842009.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
+ "version": "{{? iif(snomedct_842009.empty().not(), '2025AB')}}",
"code": "{{? mpp:getConcept(%familyConsanguinity, snomedct_842009, 'target_code')}}",
"display": "{{? mpp:getConcept(%familyConsanguinity, snomedct_842009, 'target_display')}}"
}
diff --git a/src/rarelink/tofhir/mappings/genomicreporting.genetic_findings.json b/src/rarelink/tofhir/mappings/genomicreporting.genetic_findings.json
index 9989b5c36..d4a0b3d20 100644
--- a/src/rarelink/tofhir/mappings/genomicreporting.genetic_findings.json
+++ b/src/rarelink/tofhir/mappings/genomicreporting.genetic_findings.json
@@ -30,7 +30,7 @@
{
"code": "{{'69548-6'}}",
"system": "{{'http://loinc.org'}}",
- "version": "{{'LNC278'}}",
+ "version": "{{'v281'}}",
"display": "{{'Genetic variant assessment'}}"
}
]
@@ -42,7 +42,7 @@
"{{?}}": {
"code": "{{? mpp:getConcept(%geneticsMethod, loinc_81304_8, 'target_code')}}",
"system": "{{? iif(loinc_81304_8.empty().not(), 'https://loinc.org/')}}",
- "version": "{{? iif(loinc_81304_8.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_81304_8.empty().not(), 'v281')}}",
"display": "{{? mpp:getConcept(%geneticsMethod, loinc_81304_8, 'target_display')}}"
}
},
@@ -51,7 +51,7 @@
"{{?}}": {
"code": "{{? loinc_81304_8_other}}",
"system": "{{? iif(loinc_81304_8.empty().not(), 'https://loinc.org/')}}",
- "version": "{{? iif(loinc_81304_8.empty().not(), 'LNC278')}}"
+ "version": "{{? iif(loinc_81304_8.empty().not(), 'v281')}}"
}
}
]
@@ -83,7 +83,7 @@
{
"code": "{{? iif(loinc_81290_9.empty().not(), '81290-9')}}",
"system": "{{? iif(loinc_81290_9.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_81290_9.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_81290_9.empty().not(), 'v281')}}",
"display": "{{? iif(loinc_81290_9.empty().not(), 'Genomic DNA change (gHGVS)')}}"
}
]
@@ -104,7 +104,7 @@
{
"code": "{{? iif(loinc_81290_9.empty().not(), '48013-7')}}",
"system": "{{? iif(loinc_81290_9.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_81290_9.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_81290_9.empty().not(), 'v281')}}",
"display": "{{? iif(loinc_81290_9.empty().not(), 'Genomic reference sequence [ID]')}}"
}
]
@@ -125,7 +125,7 @@
{
"code": "{{? iif(loinc_48004_6.empty().not(), '48004-6')}}",
"system": "{{? iif(loinc_48004_6.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_48004_6.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_48004_6.empty().not(), 'v281')}}",
"display": "{{? iif(loinc_48004_6.empty().not(), 'DNA change (c.HGVS)')}}"
}
]
@@ -146,7 +146,7 @@
{
"code": "{{? iif(loinc_48004_6.empty().not(), '51958-7')}}",
"system": "{{? iif(loinc_48004_6.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_48004_6.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_48004_6.empty().not(), 'v281')}}",
"display": "{{? iif(loinc_48004_6.empty().not(), 'Transcript reference sequence [ID]')}}"
}
]
@@ -167,7 +167,7 @@
{
"code": "{{? iif(loinc_48005_3.empty().not(), '48005-3')}}",
"system": "{{? iif(loinc_48005_3.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_48005_3.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_48005_3.empty().not(), 'v281')}}",
"display": "{{? iif(loinc_48005_3.empty().not(), 'Amino acid change (pHGVS)')}}"
}
]
@@ -209,7 +209,7 @@
{
"code": "{{? iif(loinc_62374_4.empty().not(), '62374-4')}}",
"system": "{{? iif(loinc_62374_4.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_62374_4.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_62374_4.empty().not(), 'v281')}}",
"display": "{{? iif(loinc_62374_4.empty().not(), 'Human reference sequence assembly version')}}"
}
]
@@ -219,7 +219,7 @@
{
"code": "{{? mpp:getConcept(%geneticsReferenceGenome, loinc_62374_4, 'target_code')}}",
"system": "{{? iif(loinc_62374_4.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_62374_4.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_62374_4.empty().not(), 'v281')}}",
"display": "{{? mpp:getConcept(%geneticsReferenceGenome, loinc_62374_4, 'target_display')}}"
}
]
@@ -232,7 +232,7 @@
{
"code": "{{? iif(loinc_48018_6.empty().not(), '48018-6')}}",
"system": "{{? iif(loinc_48018_6.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_48018_6.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_48018_6.empty().not(), 'v281')}}",
"display": "{{? iif(loinc_48018_6.empty().not(), 'Gene studied [ID]')}}"
}
]
@@ -254,7 +254,7 @@
{
"code": "{{? iif(loinc_53034_5.empty().not(), '53034-5')}}",
"system": "{{? iif(loinc_53034_5.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_53034_5.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_53034_5.empty().not(), 'v281')}}",
"display": "{{? iif(loinc_53034_5.empty().not(), 'Allelic state')}}"
}
]
@@ -266,7 +266,7 @@
"{{?}}": {
"code": "{{? mpp:getConcept(%geneticsZygosity, loinc_53034_5, 'target_code')}}",
"system": "{{? iif(loinc_53034_5.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_53034_5.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_53034_5.empty().not(), 'v281')}}",
"display": "{{? mpp:getConcept(%geneticsZygosity, loinc_53034_5, 'target_display')}}"
}
},
@@ -275,7 +275,7 @@
"{{?}}": {
"code": "{{? loinc_53034_5_other}}",
"system": "{{? iif(loinc_53034_5_other.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_53034_5_other.empty().not(), 'LNC278')}}"
+ "version": "{{? iif(loinc_53034_5_other.empty().not(), 'v281')}}"
}
}
]
@@ -288,7 +288,7 @@
{
"code": "{{? iif(loinc_48002_0.empty().not(), '48002-0')}}",
"system": "{{? iif(loinc_48002_0.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_48002_0.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_48002_0.empty().not(), 'v281')}}",
"display": "{{? iif(loinc_48002_0.empty().not(), 'Genomic source class [Type]')}}"
}
]
@@ -298,7 +298,7 @@
{
"code": "{{? mpp:getConcept(%geneticsGenomicSourceClass, loinc_48002_0, 'target_code')}}",
"system": "{{? iif(loinc_48002_0.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_48002_0.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_48002_0.empty().not(), 'v281')}}",
"display": "{{? mpp:getConcept(%geneticsGenomicSourceClass, loinc_48002_0, 'target_display')}}"
}
]
@@ -311,7 +311,7 @@
{
"code": "{{? iif(loinc_48019_4.empty().not(), '48019-4')}}",
"system": "{{? iif(loinc_48019_4.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_48019_4.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_48019_4.empty().not(), 'v281')}}",
"display": "{{? iif(loinc_48019_4.empty().not(), 'DNA change type')}}"
}
]
@@ -323,7 +323,7 @@
"{{?}}": {
"code": "{{? mpp:getConcept(%geneticsDNAChangeType, loinc_48019_4, 'target_code')}}",
"system": "{{? iif(loinc_48019_4.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_48019_4.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_48019_4.empty().not(), 'v281')}}",
"display": "{{? mpp:getConcept(%geneticsDNAChangeType, loinc_48019_4, 'target_display')}}"
}
},
@@ -332,7 +332,7 @@
"{{?}}": {
"code": "{{? loinc_48019_4_other}}",
"system": "{{? iif(loinc_48019_4_other.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_48019_4_other.empty().not(), 'LNC278')}}"
+ "version": "{{? iif(loinc_48019_4_other.empty().not(), 'v281')}}"
}
}
]
@@ -386,7 +386,7 @@
{
"code": "{{? iif(loinc_93044_6.empty().not(), '93044-6')}}",
"system": "{{? iif(loinc_93044_6.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_93044_6.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_93044_6.empty().not(), 'v281')}}",
"display": "{{? iif(loinc_93044_6.empty().not(), 'Level of evidence')}}"
}
]
@@ -396,7 +396,7 @@
{
"code": "{{? mpp:getConcept(%geneticsClinicalAnnotation, loinc_93044_6, 'target_code')}}",
"system": "{{? iif(loinc_93044_6.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_93044_6.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_93044_6.empty().not(), 'v281')}}",
"display": "{{? mpp:getConcept(%geneticsClinicalAnnotation, loinc_93044_6, 'target_display')}}"
}
]
@@ -409,7 +409,7 @@
{
"code": "{{? iif(loinc_53037_8.empty().not(), '53037-8')}}",
"system": "{{? iif(loinc_53037_8.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_53037_8.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_53037_8.empty().not(), 'v281')}}",
"display": "{{? iif(loinc_53037_8.empty().not(), 'Genetic variation clinical significance [Imp]')}}"
}
]
@@ -419,7 +419,7 @@
{
"code": "{{? mpp:getConcept(%geneticsClinicalSignifiance, loinc_53037_8, 'target_code')}}",
"system": "{{? iif(loinc_53037_8.empty().not(), 'http://loinc.org')}}",
- "version": "{{? iif(loinc_53037_8.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(loinc_53037_8.empty().not(), 'v281')}}",
"display": "{{? mpp:getConcept(%geneticsClinicalSignifiance, loinc_53037_8, 'target_display')}}"
}
]
@@ -432,7 +432,7 @@
{
"code": "{{'81259-4'}}",
"system": "{{'http://loinc.org'}}",
- "version": "{{'LNC278'}}",
+ "version": "{{'v281'}}",
"display": "{{'Associated phenotype'}}"
}
]
@@ -444,7 +444,7 @@
"{{?}}": {
"code": "{{? snomedct_106221001_mondo.substring(6)}}",
"system": "{{? iif(snomedct_106221001_mondo.empty().not(), 'http://purl.obolibrary.org/obo/mondo.owl')}}",
- "version": "{{? iif(snomedct_106221001_mondo.empty().not(), '2025-06-03')}}"
+ "version": "{{? iif(snomedct_106221001_mondo.empty().not(), '2026-03-03')}}"
}
},
{
diff --git a/src/rarelink/tofhir/mappings/ips.condition.json b/src/rarelink/tofhir/mappings/ips.condition.json
index 43bc064a1..08006823e 100644
--- a/src/rarelink/tofhir/mappings/ips.condition.json
+++ b/src/rarelink/tofhir/mappings/ips.condition.json
@@ -40,7 +40,7 @@
{
"system": "{{? iif(snomedct_64572001_mondo.empty().not(), 'http://purl.obolibrary.org/obo/mondo.owl')}}",
"code": "{{? iif(snomedct_64572001_mondo.empty().not(), snomedct_64572001_mondo.substring(6))}}",
- "version": "{{? iif(snomedct_64572001_mondo.empty().not(), '2025-06-03')}}"
+ "version": "{{? iif(snomedct_64572001_mondo.empty().not(), '2026-03-03')}}"
},
{
"system": "{{? iif(snomedct_64572001_ordo.empty().not(), 'http://www.orpha.net/')}}",
@@ -60,7 +60,7 @@
{
"system": "{{? iif(snomedct_64572001_icd11.empty().not(), 'https://icd.who.int/en')}}",
"code": "{{? iif(snomedct_64572001_icd11.empty().not(), snomedct_64572001_icd11)}}",
- "version": "{{? iif(snomedct_64572001_icd11.empty().not(), 'SNOMEDCT_US_2024_09_01')}}"
+ "version": "{{? iif(snomedct_64572001_icd11.empty().not(), '2025AB')}}"
}
]
},
@@ -80,7 +80,7 @@
"system": "{{? iif(snomedct_246112005.empty().not(), 'http://snomed.info/sct')}}",
"code": "{{? mpp:getConcept(%diseaseSeverity, snomedct_246112005, 'target_code')}}",
"display": "{{? mpp:getConcept(%diseaseSeverity, snomedct_246112005, 'target_display')}}",
- "version": "{{? iif(snomedct_246112005.empty().not(), 'SNOMEDCT_US_2024_09_01')}}"
+ "version": "{{? iif(snomedct_246112005.empty().not(), '2025AB')}}"
}
]
},
@@ -90,7 +90,7 @@
{
"system": "{{? iif(snomedct_363698007.empty().not(), 'http://snomed.info/sct')}}",
"code": "{{? snomedct_363698007}}",
- "version": "{{? iif(snomedct_363698007.empty().not(), 'SNOMEDCT_US_2024_09_01')}}"
+ "version": "{{? iif(snomedct_363698007.empty().not(), '2025AB')}}"
}
]
}
@@ -117,7 +117,7 @@
"system": "{{? iif(snomedct_423493009.empty().not(), 'http://snomed.info/sct')}}",
"code": "{{? mpp:getConcept(%rarelinkAgeAtDiagnosis, snomedct_423493009, 'target_code')}}",
"display": "{{? mpp:getConcept(%rarelinkAgeAtDiagnosis, snomedct_423493009, 'target_display')}}",
- "version": "{{? iif(snomedct_423493009.empty().not(), 'SNOMEDCT_US_2024_09_01')}}"
+ "version": "{{? iif(snomedct_423493009.empty().not(), '2025AB')}}"
}
],
"text": "{{? iif(snomedct_423493009.empty().not(), 'SNOMED:423493009 - Age at Diagnosis')}}"
@@ -132,7 +132,7 @@
"system": "{{? iif(snomedct_424850005.empty().not(), 'http://snomed.info/sct')}}",
"code": "{{? mpp:getConcept(%diseaseAgeAtOnset, snomedct_424850005, 'target_code')}}",
"display": "{{? mpp:getConcept(%diseaseAgeAtOnset, snomedct_424850005, 'target_display')}}",
- "version": "{{? iif(snomedct_424850005.empty().not(), 'SNOMEDCT_US_2024_09_01')}}"
+ "version": "{{? iif(snomedct_424850005.empty().not(), '2025AB')}}"
}
],
"text": "{{? iif(snomedct_424850005.empty().not(), 'SNOMED:424850005 - Age at Onset')}}"
diff --git a/src/rarelink/tofhir/mappings/ips.measurement.laboratory.json b/src/rarelink/tofhir/mappings/ips.measurement.laboratory.json
index 170d46855..7de019ec9 100644
--- a/src/rarelink/tofhir/mappings/ips.measurement.laboratory.json
+++ b/src/rarelink/tofhir/mappings/ips.measurement.laboratory.json
@@ -43,7 +43,7 @@
{
"system": "{{'https://loinc.org'}}",
"code": "{{ncit_c60819}}",
- "version": "{{'LNC278'}}"
+ "version": "{{'v281'}}"
}
],
"text": "{{'Measurements - Assay'}}"
@@ -70,7 +70,7 @@
{
"system": "{{? iif(ncit_c41255.empty().not(), 'http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl')}}",
"code": "{{? ncit_c41255.substring(10)}}",
- "version": "{{? iif(ncit_c41255.empty().not(), '24.01e')}}"
+ "version": "{{? iif(ncit_c41255.empty().not(), '26.02d')}}"
}
]
}
@@ -80,12 +80,12 @@
{
"system": "{{? iif(snomedct_122869004_ncit.empty().not(), 'http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl')}}",
"code": "{{? snomedct_122869004_ncit}}",
- "version": "{{? iif(snomedct_122869004_ncit.empty().not(), '24.01e')}}"
+ "version": "{{? iif(snomedct_122869004_ncit.empty().not(), '26.02d')}}"
},
{
"system": "{{? iif(snomedct_122869004_snomed.empty().not(), 'http://snomed.info/sct')}}",
"code": "{{? snomedct_122869004_snomed}}",
- "version": "{{? iif(snomedct_122869004_snomed.empty().not(), 'SNOMEDCT_US_2024_09_01')}}"
+ "version": "{{? iif(snomedct_122869004_snomed.empty().not(), '2025AB')}}"
}
],
"text": "{{? iif(snomedct_122869004_snomed.empty().not(), 'Measurement - Procedure')}}"
diff --git a/src/rarelink/tofhir/mappings/ips.measurement.radiology.json b/src/rarelink/tofhir/mappings/ips.measurement.radiology.json
index 98887e3b6..d93201e46 100644
--- a/src/rarelink/tofhir/mappings/ips.measurement.radiology.json
+++ b/src/rarelink/tofhir/mappings/ips.measurement.radiology.json
@@ -43,7 +43,7 @@
{
"system": "{{'https://loinc.org/'}}",
"code": "{{ncit_c60819}}",
- "version": "{{'LNC278'}}"
+ "version": "{{'v281'}}"
}
],
"text": "{{'Measurements - Assay'}}"
@@ -70,7 +70,7 @@
{
"system": "{{? iif(ncit_c41255.empty().not(), 'https://ncit.nci.nih.gov')}}",
"code": "{{? ncit_c41255.substring(10)}}",
- "version": "{{? iif(ncit_c41255.empty().not(), '24.01e')}}"
+ "version": "{{? iif(ncit_c41255.empty().not(), '26.02d')}}"
}
]
}
@@ -80,12 +80,12 @@
{
"system": "{{? iif(snomedct_122869004_ncit.empty().not(), 'https://ncit.nci.nih.gov')}}",
"code": "{{? snomedct_122869004_ncit}}",
- "version": "{{? iif(snomedct_122869004_ncit.empty().not(), '24.01e')}}"
+ "version": "{{? iif(snomedct_122869004_ncit.empty().not(), '26.02d')}}"
},
{
"system": "{{? iif(snomedct_122869004_snomed.empty().not(), 'http://snomed.info/sct')}}",
"code": "{{? snomedct_122869004_snomed}}",
- "version": "{{? iif(snomedct_122869004_snomed.empty().not(), 'SNOMEDCT_US_2024_09_01')}}"
+ "version": "{{? iif(snomedct_122869004_snomed.empty().not(), '2025AB')}}"
}
],
"text": "{{? iif(snomedct_122869004_snomed.empty().not(), 'Measurement - Procedure')}}"
diff --git a/src/rarelink/tofhir/mappings/ips.patient.json b/src/rarelink/tofhir/mappings/ips.patient.json
index bf4ae3f15..3a0c1944c 100755
--- a/src/rarelink/tofhir/mappings/ips.patient.json
+++ b/src/rarelink/tofhir/mappings/ips.patient.json
@@ -48,7 +48,7 @@
"coding": [
{
"system": "{{'http://snomed.info/sct'}}",
- "version": "{{'SNOMEDCT_US_2024_09_01'}}",
+ "version": "{{'2025AB'}}",
"code": "{{'422549004'}}",
"display": "{{'Patient-related Identification code (observable entity)'}}"
}
@@ -92,7 +92,7 @@
"coding": [
{
"system": "{{? iif(%rarelinkpersonalinformation.snomedct_370159000.empty().not(), 'http://snomed.info/sct')}}",
- "version": "{{? iif(%rarelinkpersonalinformation.snomedct_370159000.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
+ "version": "{{? iif(%rarelinkpersonalinformation.snomedct_370159000.empty().not(), '2025AB')}}",
"code": "{{? iif(%rarelinkpersonalinformation.snomedct_370159000.empty().not(), '370159000')}}",
"display": "{{? iif(%rarelinkpersonalinformation.snomedct_370159000.empty().not(), 'Country of Birth')}}"
}
@@ -110,7 +110,7 @@
"coding": [
{
"system": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"code": "399423000",
"display": "Date of Admission"
}
@@ -124,30 +124,30 @@
]
},
{
- "url": "{{? iif(%rarelinkpersonalinformation.snomedct_281053000.empty().not(), 'https://build.fhir.org/ig/HL7/fhir-extensions/StructureDefinition-individual-recordedSexOrGender.html')}}",
+ "url": "{{? iif(%rarelinkpersonalinformation.loinc_76689_9.empty().not(), 'https://build.fhir.org/ig/HL7/fhir-extensions/StructureDefinition-individual-recordedSexOrGender.html')}}",
"extension": [
{
- "url": "{{? iif(%rarelinkpersonalinformation.snomedct_281053000.empty().not(), 'value')}}",
+ "url": "{{? iif(%rarelinkpersonalinformation.loinc_76689_9.empty().not(), 'value')}}",
"valueCodeableConcept": {
"coding": [
{
- "system": "{{? iif(%rarelinkpersonalinformation.snomedct_281053000.empty().not(), 'http://snomed.info/sct')}}",
- "version": "{{? iif(%rarelinkpersonalinformation.snomedct_281053000.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
- "code": "{{? %rarelinkpersonalinformation.mpp:getConcept(%sexatbirth, snomedct_281053000, 'target_code')}}",
- "display": "{{? %rarelinkpersonalinformation.mpp:getConcept(%sexatbirth, snomedct_281053000, 'target_display')}}"
+ "system": "{{? iif(%rarelinkpersonalinformation.loinc_76689_9.empty().not(), 'http://snomed.info/sct')}}",
+ "version": "{{? iif(%rarelinkpersonalinformation.loinc_76689_9.empty().not(), '281')}}",
+ "code": "{{? %rarelinkpersonalinformation.mpp:getConcept(%sexatbirth, loinc_76689_9, 'target_code')}}",
+ "display": "{{? %rarelinkpersonalinformation.mpp:getConcept(%sexatbirth, loinc_76689_9, 'target_display')}}"
}
]
}
},
{
- "url": "{{? iif(%rarelinkpersonalinformation.snomedct_281053000.empty().not(), 'codeDefinition')}}",
+ "url": "{{? iif(%rarelinkpersonalinformation.loinc_76689_9.empty().not(), 'codeDefinition')}}",
"valueCodeableConcept": {
"coding": [
{
- "system": "{{? iif(%rarelinkpersonalinformation.snomedct_281053000.empty().not(), 'http://snomed.info/sct')}}",
- "version": "{{? iif(%rarelinkpersonalinformation.snomedct_281053000.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
- "code": "{{? iif(%rarelinkpersonalinformation.snomedct_281053000.empty().not(), '281053000')}}",
- "display": "{{? iif(%rarelinkpersonalinformation.snomedct_281053000.empty().not(), 'Sex at Birth')}}"
+ "system": "{{? iif(%rarelinkpersonalinformation.loinc_76689_9.empty().not(), 'http://snomed.info/sct')}}",
+ "version": "{{? iif(%rarelinkpersonalinformation.loinc_76689_9.empty().not(), '281')}}",
+ "code": "{{? iif(%rarelinkpersonalinformation.loinc_76689_9.empty().not(), '281053000')}}",
+ "display": "{{? iif(%rarelinkpersonalinformation.loinc_76689_9.empty().not(), 'Sex at Birth')}}"
}
]
}
@@ -163,7 +163,7 @@
"coding": [
{
"system": "{{? iif(%RareLinkPatientStatus.snomedct_184305005.empty().not(), 'https://www.snomed.org/snomed-ct')}}",
- "version": "{{? iif(%RareLinkPatientStatus.snomedct_184305005.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
+ "version": "{{? iif(%RareLinkPatientStatus.snomedct_184305005.empty().not(), '2025AB')}}",
"code": "{{? iif(%RareLinkPatientStatus.snomedct_184305005.empty().not(), '184305005')}}",
"display": "{{? iif(%RareLinkPatientStatus.snomedct_184305005.empty().not(), 'Cause Of Death')}}"
}
diff --git a/src/rarelink/tofhir/mappings/ips.procedure.json b/src/rarelink/tofhir/mappings/ips.procedure.json
index bd8a0776c..8b93605e4 100644
--- a/src/rarelink/tofhir/mappings/ips.procedure.json
+++ b/src/rarelink/tofhir/mappings/ips.procedure.json
@@ -30,7 +30,7 @@
{
"code": "{{snomedct_122869004}}",
"system": "{{iif(snomedct_122869004.empty().not(), 'http://hl7.org/fhir/uv/ips/ValueSet/procedures-uv-ips')}}",
- "version": "{{iif(snomedct_122869004.empty().not(), 'SNOMEDCT_US_2024_09_01')}}"
+ "version": "{{iif(snomedct_122869004.empty().not(), '2025AB')}}"
}
]
},
@@ -42,7 +42,7 @@
{
"code": "{{snomedct_122869004_bdsite}}",
"system": "{{iif(snomedct_122869004_bdsite.empty().not(), 'http://snomed.info/sct')}}",
- "version": "{{iif(snomedct_122869004_bdsite.empty().not(), 'SNOMEDCT_US_2024_09_01')}}"
+ "version": "{{iif(snomedct_122869004_bdsite.empty().not(), '2025AB')}}"
}
]
}
diff --git a/src/rarelink/tofhir/mappings/observation.age_category.json b/src/rarelink/tofhir/mappings/observation.age_category.json
index 6fb1d2b37..f338399cb 100644
--- a/src/rarelink/tofhir/mappings/observation.age_category.json
+++ b/src/rarelink/tofhir/mappings/observation.age_category.json
@@ -31,7 +31,7 @@
{
"code": "{{'105727008'}}",
"system": "{{'http://snomed.info/sct'}}",
- "version": "{{'SNOMEDCT_US_2024_09_01'}}",
+ "version": "{{'2025AB'}}",
"display": "{{'Age Category'}}"
}
]
@@ -43,7 +43,7 @@
{
"code": "{{? mpp:getConcept(%ageCategory, snomedct_105727008, 'target_code')}}",
"system": "{{'http://snomed.info/sct'}}",
- "version": "{{'SNOMEDCT_US_2024_09_01'}}",
+ "version": "{{'2025AB'}}",
"display": "{{? mpp:getConcept(%ageCategory, snomedct_105727008, 'target_display')}}"
}
]
diff --git a/src/rarelink/tofhir/mappings/observation.karyotypic_sex.json b/src/rarelink/tofhir/mappings/observation.karyotypic_sex.json
index 9174af569..e849ebdd8 100644
--- a/src/rarelink/tofhir/mappings/observation.karyotypic_sex.json
+++ b/src/rarelink/tofhir/mappings/observation.karyotypic_sex.json
@@ -31,7 +31,7 @@
{
"code": "{{'1296886006'}}",
"system": "{{'http://snomed.info/sct'}}",
- "version": "{{'SNOMEDCT_US_2024_09_01'}}",
+ "version": "{{'2025AB'}}",
"display": "{{'Karyotypic Sex'}}"
}
]
@@ -42,7 +42,7 @@
{
"code": "{{? mpp:getConcept(%karyotypicSexConceptMap, snomedct_1296886006, 'target_code')}}",
"system": "{{'http://snomed.info/sct'}}",
- "version": "{{'SNOMEDCT_US_2024_09_01'}}",
+ "version": "{{'2025AB'}}",
"display": "{{? mpp:getConcept(%karyotypicSexConceptMap, snomedct_1296886006, 'target_display')}}"
}
]
diff --git a/src/rarelink/tofhir/mappings/observation.length_of_gestation_at_birth.json b/src/rarelink/tofhir/mappings/observation.length_of_gestation_at_birth.json
index d35ab311e..2d61d0cb7 100644
--- a/src/rarelink/tofhir/mappings/observation.length_of_gestation_at_birth.json
+++ b/src/rarelink/tofhir/mappings/observation.length_of_gestation_at_birth.json
@@ -31,7 +31,7 @@
{
"code": "{{'412726003'}}",
"system": "{{'http://snomed.info/sct'}}",
- "version": "{{'SNOMEDCT_US_2024_09_01'}}",
+ "version": "{{'2025AB'}}",
"display": "{{'Length of Gestation at Birth - weeks+days'}}"
}
]
@@ -45,7 +45,7 @@
{
"code": "{{'412726003'}}",
"system": "{{'http://snomed.info/sct'}}",
- "version": "{{'SNOMEDCT_US_2024_09_01'}}",
+ "version": "{{'2025AB'}}",
"display": "{{'Length of Gestation at Birth - weeks'}}"
}
]
@@ -63,7 +63,7 @@
{
"code": "{{'412726003'}}",
"system": "{{'http://snomed.info/sct'}}",
- "version": "{{'SNOMEDCT_US_2024_09_01'}}",
+ "version": "{{'2025AB'}}",
"display": "{{'Length of Gestation at Birth - days'}}"
}
]
diff --git a/src/rarelink/tofhir/mappings/observation.measurements.other.json b/src/rarelink/tofhir/mappings/observation.measurements.other.json
index 0217dc27f..ef50bbb49 100644
--- a/src/rarelink/tofhir/mappings/observation.measurements.other.json
+++ b/src/rarelink/tofhir/mappings/observation.measurements.other.json
@@ -41,7 +41,7 @@
"coding": [
{
"system": "{{'http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl'}}",
- "version": "{{'24.01e'}}",
+ "version": "{{'26.02d'}}",
"code": "{{'ncit_c60819'}}"
}
]
@@ -58,7 +58,7 @@
"coding": [
{
"system": "{{? iif(ncit_c41255.empty().not(), 'http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl')}}",
- "version": "{{? iif(ncit_c41255.empty().not(), '24.01e')}}",
+ "version": "{{? iif(ncit_c41255.empty().not(), '26.02d')}}",
"code": "{{? ncit_c41255.substring(10)}}"
}
]
@@ -68,12 +68,12 @@
"coding": [
{
"system": "{{? iif(snomedct_122869004_ncit.empty().not(), 'http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl')}}",
- "version": "{{? iif(snomedct_122869004_ncit.empty().not(), '24.01e')}}",
+ "version": "{{? iif(snomedct_122869004_ncit.empty().not(), '26.02d')}}",
"code": "{{? snomedct_122869004_ncit}}"
},
{
"system": "{{? iif(snomedct_122869004_snomed.empty().not(), 'http://snomed.info/sct')}}",
- "version": "{{? iif(snomedct_122869004_snomed.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
+ "version": "{{? iif(snomedct_122869004_snomed.empty().not(), '2025AB')}}",
"code": "{{? snomedct_122869004_snomed}}"
}
]
diff --git a/src/rarelink/tofhir/mappings/observation.phenotypic_feature.json b/src/rarelink/tofhir/mappings/observation.phenotypic_feature.json
index d86967e31..c0ff72754 100644
--- a/src/rarelink/tofhir/mappings/observation.phenotypic_feature.json
+++ b/src/rarelink/tofhir/mappings/observation.phenotypic_feature.json
@@ -30,7 +30,7 @@
"coding": [
{
"system": "{{'http://purl.obolibrary.org/obo/hp.owl'}}",
- "version": "{{'2025-05-06'}}",
+ "version": "{{'2026-02-16'}}",
"code": "{{? snomedct_8116006.substring(3)}}"
}
]
@@ -40,7 +40,7 @@
"coding": [
{
"system": "{{? iif(hp_0003674.empty().not(), 'http://purl.obolibrary.org/obo/hp.owl')}}",
- "version": "{{? iif(hp_0003674.empty().not(), '2025-05-06')}}",
+ "version": "{{? iif(hp_0003674.empty().not(), '2026-02-16')}}",
"code": "{{? mpp:getConcept(%phenotypeAgeOfOnset, hp_0003674, 'target_code')}}",
"display": "{{? mpp:getConcept(%phenotypeAgeOfOnset, hp_0003674, 'target_display')}}"
}
@@ -57,7 +57,7 @@
"coding": [
{
"system": "{{? iif(hp_0012823_snomed.empty().not(), 'http://snomed.info/sct')}}",
- "version": "{{? iif(hp_0012823_snomed.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
+ "version": "{{? iif(hp_0012823_snomed.empty().not(), '2025AB')}}",
"code": "{{? hp_0012823_snomed}}"
}
],
@@ -80,7 +80,7 @@
"coding": [
{
"system": "{{? iif(snomedct_363778006.empty().not(), 'http://snomed.info/sct')}}",
- "version": "{{? iif(snomedct_363778006.empty().not(), 'SNOMEDCT_US_2024_09_01')}}",
+ "version": "{{? iif(snomedct_363778006.empty().not(), '2025AB')}}",
"code": "{{? mpp:getConcept(%phenotypeStatus, snomedct_363778006, 'target_code')}}",
"display": "{{? mpp:getConcept(%phenotypeStatus, snomedct_363778006 , 'target_display')}}"
}
@@ -99,7 +99,7 @@
"coding": [
{
"system": "{{? iif(hp_0011008.empty().not(), 'http://purl.obolibrary.org/obo/hp.owl')}}",
- "version": "{{? iif(hp_0011008.empty().not(), '2025-05-06')}}",
+ "version": "{{? iif(hp_0011008.empty().not(), '2026-02-16')}}",
"code": "{{? mpp:getConcept(%phenotypeTemporalPattern, hp_0011008, 'target_code')}}",
"display": "{{? mpp:getConcept(%phenotypeTemporalPattern, hp_0011008, 'target_display')}}"
}
@@ -112,7 +112,7 @@
"coding": [
{
"system": "{{? iif(hp_0012824.empty().not(), 'http://purl.obolibrary.org/obo/hp.owl')}}",
- "version": "{{? iif(hp_0012824.empty().not(), '2025-05-06')}}",
+ "version": "{{? iif(hp_0012824.empty().not(), '2026-02-16')}}",
"code": "{{? mpp:getConcept(%phenotypeSeverity, hp_0012824, 'target_code')}}",
"display": "{{? mpp:getConcept(%phenotypeSeverity, hp_0012824, 'target_display')}}"
}
@@ -125,7 +125,7 @@
"coding": [
{
"system": "{{? iif(hp_0012823_hp1.empty().not(), 'http://purl.obolibrary.org/obo/hp.owl')}}",
- "version": "{{? iif(hp_0012823_hp1.empty().not(), '2025-05-06')}}",
+ "version": "{{? iif(hp_0012823_hp1.empty().not(), '2026-02-16')}}",
"code": "{{? hp_0012823_hp1.substring(3))}}"
}
]
@@ -137,7 +137,7 @@
"coding": [
{
"system": "{{? iif(hp_0012823_hp2.empty().not(), 'http://purl.obolibrary.org/obo/hp.owl')}}",
- "version": "{{? iif(hp_0012823_hp2.empty().not(), '2025-05-06')}}",
+ "version": "{{? iif(hp_0012823_hp2.empty().not(), '2026-02-16')}}",
"code": "{{? hp_0012823_hp2.substring(3))}}"
}
]
@@ -149,7 +149,7 @@
"coding": [
{
"system": "{{? iif(hp_0012823_hp3.empty().not(), 'http://purl.obolibrary.org/obo/hp.owl')}}",
- "version": "{{? iif(hp_0012823_hp3.empty().not(), '2025-05-06')}}",
+ "version": "{{? iif(hp_0012823_hp3.empty().not(), '2026-02-16')}}",
"code": "{{? hp_0012823_hp3.substring(3))}}"
}
]
diff --git a/src/rarelink/tofhir/mappings/observation.vitalsigns.json b/src/rarelink/tofhir/mappings/observation.vitalsigns.json
index 1aa3d05a6..b5e3d6522 100644
--- a/src/rarelink/tofhir/mappings/observation.vitalsigns.json
+++ b/src/rarelink/tofhir/mappings/observation.vitalsigns.json
@@ -42,13 +42,13 @@
{
"system": "{{? iif(ln_85353_1.empty().not(), 'http ://loinc.org')}}",
"code": "{{? mpp:getConcept(%VitalSignPanel, ln_85353_1, 'target_code')}}",
- "version": "{{? iif(ln_85353_1.empty().not(), 'LNC278')}}",
+ "version": "{{? iif(ln_85353_1.empty().not(), 'v281')}}",
"display": "{{? mpp:getConcept(%VitalSignPanel, ln_85353_1, 'target_display')}}"
},
{
"system": "{{? iif(ln_85353_1_other.empty().not(), 'http ://loinc.org')}}",
"code": "{{? ln_85353_1_other}}",
- "version": "{{? iif(ln_85353_1_other.empty().not(), 'LNC278')}}"
+ "version": "{{? iif(ln_85353_1_other.empty().not(), 'v281')}}"
}
]
},
@@ -64,7 +64,7 @@
{
"system": "{{? iif(ncit_c41255.empty().not(), 'http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl')}}",
"code": "{{? ncit_c41255.substring(10)}}",
- "version": "{{? iif(ncit_c41255.empty().not(), '24.01e')}}"
+ "version": "{{? iif(ncit_c41255.empty().not(), '26.02d')}}"
}
]
}
@@ -74,12 +74,12 @@
{
"system": "{{? iif(snomedct_122869004_ncit.empty().not(), 'http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl')}}",
"code": "{{? snomedct_122869004_ncit.substring(10)}}",
- "version": "{{? iif(snomedct_122869004_ncit.empty().not(), '24.01e')}}"
+ "version": "{{? iif(snomedct_122869004_ncit.empty().not(), '26.02d')}}"
},
{
"system": "{{? iif(snomedct_122869004_snomed.empty().not(), 'http://snomed.info/sct')}}",
"code": "{{? snomedct_122869004_snomed.substring(7)}}",
- "version": "{{? iif(snomedct_122869004_snomed.empty().not(), 'SNOMEDCT_US_2024_09_01')}}"
+ "version": "{{? iif(snomedct_122869004_snomed.empty().not(), '2025AB')}}"
}
]
},
diff --git a/src/rarelink/tofhir/schemas/Rarelink_2_personal_information.json b/src/rarelink/tofhir/schemas/Rarelink_2_personal_information.json
index 7bfbc3b2d..9e8386741 100755
--- a/src/rarelink/tofhir/schemas/Rarelink_2_personal_information.json
+++ b/src/rarelink/tofhir/schemas/Rarelink_2_personal_information.json
@@ -57,8 +57,8 @@
"short": "2.1 Date of birth"
},
{
- "id": "Rarelink_2_personal_information.snomedct_281053000",
- "path": "Rarelink_2_personal_information.snomedct_281053000",
+ "id": "Rarelink_2_personal_information.loinc_76689_9",
+ "path": "Rarelink_2_personal_information.loinc_76689_9",
"min": 0,
"max": "1",
"type": [
diff --git a/src/rarelink/utils/label_fetching.py b/src/rarelink/utils/label_fetching.py
index 183f23a89..1e7472435 100644
--- a/src/rarelink/utils/label_fetching.py
+++ b/src/rarelink/utils/label_fetching.py
@@ -5,6 +5,7 @@
import requests
from urllib.parse import quote
from dotenv import load_dotenv
+from functools import lru_cache
from .code_processing import process_code, normalize_hgnc_id
@@ -128,7 +129,7 @@ def fetch_label_from_dict(code: str, label_dict: Dict[str, str]) -> Optional[str
# ---------- BioPortal lookup ----------
-
+@lru_cache(maxsize=None)
def fetch_label_from_bioportal(code: str) -> Optional[str]:
"""
Fetch a label from the BioPortal API.
diff --git a/submodules/tofhir b/submodules/tofhir
deleted file mode 160000
index 54f4c3af3..000000000
--- a/submodules/tofhir
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 54f4c3af39d0904fcd69870c96e6fa60cc8f8d04
diff --git a/tests/.DS_Store b/tests/.DS_Store
deleted file mode 100755
index b5497a5d7..000000000
Binary files a/tests/.DS_Store and /dev/null differ
diff --git a/tests/integration/test_redcap_to_phenopacket_workflow.py b/tests/integration/test_redcap_to_phenopacket_workflow.py
index 1a668ec2b..f52c4bb75 100644
--- a/tests/integration/test_redcap_to_phenopacket_workflow.py
+++ b/tests/integration/test_redcap_to_phenopacket_workflow.py
@@ -7,52 +7,44 @@
from rarelink.phenopackets import phenopacket_pipeline
+
class TestRedcapToPhenopacketWorkflow(unittest.TestCase):
- """
- Integration test for the complete REDCap to Phenopacket workflow.
-
- This test verifies the entire pipeline from downloading REDCap records
- to creating phenopackets and validating them.
- """
-
+ """Integration test for the complete REDCap to Phenopacket workflow."""
+
def setUp(self):
- """Set up test data and environment."""
- # Create temporary directory for test output
self.temp_dir = tempfile.TemporaryDirectory()
self.output_dir = Path(self.temp_dir.name)
-
- # Sample record in REDCap format (simplified)
+
self.redcap_records = [
{
"record_id": "101",
"redcap_repeat_instrument": "",
"redcap_repeat_instance": "",
- "snomedct_184099003": "2020-01-05", # DOB
- "snomedct_263495000": "snomedct_394743007" # Gender
+ "snomedct_184099003": "2020-01-05",
+ "snomedct_263495000": "snomedct_394743007",
},
{
"record_id": "101",
"redcap_repeat_instrument": "rarelink_5_disease",
"redcap_repeat_instance": "1",
"snomedct_64572001_mondo": "MONDO:0019499",
- "snomedct_298059007": "2022-10-14" # onset date
+ "snomedct_298059007": "2022-10-14",
},
{
"record_id": "101",
"redcap_repeat_instrument": "rarelink_6_2_phenotypic_feature",
"redcap_repeat_instance": "1",
- "snomedct_8116006": "HP:0001059", # Pterygium
- "snomedct_8116006_onset": "2022-10-14"
- }
+ "snomedct_8116006": "HP:0001059",
+ "snomedct_8116006_onset": "2022-10-14",
+ },
]
-
- # Sample linkml-records format
+
self.linkml_records = [
{
"record_id": "101",
"personal_information": {
"snomedct_184099003": "2020-01-05",
- "snomedct_263495000": "snomedct_394743007"
+ "snomedct_263495000": "snomedct_394743007",
},
"repeated_elements": [
{
@@ -60,153 +52,139 @@ def setUp(self):
"redcap_repeat_instance": 1,
"disease": {
"snomedct_64572001_mondo": "MONDO:0019499",
- "snomedct_298059007": "2022-10-14"
- }
+ "snomedct_298059007": "2022-10-14",
+ },
},
{
"redcap_repeat_instrument": "rarelink_6_2_phenotypic_feature",
"redcap_repeat_instance": 1,
"phenotypic_feature": {
"snomedct_8116006": "HP:0001059",
- "snomedct_8116006_onset": "2022-10-14"
- }
- }
- ]
+ "snomedct_8116006_onset": "2022-10-14",
+ },
+ },
+ ],
}
]
-
- # Create test env variables
+
self.env_values = {
"REDCAP_API_TOKEN": "a" * 32,
"REDCAP_URL": "https://redcap.example.com/api/",
"REDCAP_PROJECT_ID": "12345",
"REDCAP_PROJECT_NAME": "Test Project",
"BIORTAL_API_TOKEN": "b" * 32,
- "CREATED_BY": "Test User"
+ "CREATED_BY": "Test User",
}
-
- # Write test REDCap records file
+
self.records_file = self.output_dir / "Test_Project-records.json"
- with open(self.records_file, 'w') as f:
+ with open(self.records_file, "w") as f:
json.dump(self.redcap_records, f)
-
- # Write test LinkML records file
+
self.linkml_file = self.output_dir / "Test_Project-linkml-records.json"
- with open(self.linkml_file, 'w') as f:
+ with open(self.linkml_file, "w") as f:
json.dump(self.linkml_records, f)
-
- # Minimal mapping configs for phenopackets
+
self.mapping_configs = {
"individual": {
"mapping_block": {
"id_field": "record_id",
"date_of_birth_field": "personal_information.snomedct_184099003",
- "gender_field": "personal_information.snomedct_263495000"
+ "gender_field": "personal_information.snomedct_263495000",
}
},
"vitalStatus": {
"mapping_block": {
"status_field": "_default_",
- "default_status": "ALIVE"
+ "default_status": "ALIVE",
}
},
"diseases": {
"mapping_block": {
"redcap_repeat_instrument": "rarelink_5_disease",
"term_field_1": "snomedct_64572001_mondo",
- "onset_date_field": "snomedct_298059007"
+ "onset_date_field": "snomedct_298059007",
}
},
"phenotypicFeatures": {
"mapping_block": {
"redcap_repeat_instrument": "rarelink_6_2_phenotypic_feature",
"type_field": "snomedct_8116006",
- "onset_date_field": "snomedct_8116006_onset"
+ "onset_date_field": "snomedct_8116006_onset",
}
},
- "metadata": {
- "code_systems": {}
- }
+ "metadata": {"code_systems": {}},
}
+
from typer.testing import CliRunner
+
self.runner = CliRunner()
-
+
def tearDown(self):
- """Clean up after tests."""
self.temp_dir.cleanup()
-
- @patch('rarelink.cli.redcap.download_records.validate_env')
- @patch('rarelink.cli.redcap.download_records.dotenv_values')
- @patch('rarelink.cli.redcap.download_records.fetch_redcap_data')
- @patch('rarelink.cli.redcap.download_records.redcap_to_linkml')
- @patch('rarelink.cli.redcap.download_records.validate_linkml_data')
- def test_download_records_step(self, mock_validate_linkml, mock_redcap_to_linkml, mock_fetch_redcap,
- mock_dotenv, mock_validate_env):
- """Test the REDCap records download step."""
- # Setup mocks
+
+ @patch("rarelink.cli.redcap.download_records.validate_env")
+ @patch("rarelink.cli.redcap.download_records.dotenv_values")
+ @patch("rarelink.cli.redcap.download_records.fetch_redcap_data")
+ @patch("rarelink.cli.redcap.download_records.redcap_to_linkml")
+ @patch("rarelink.cli.redcap.download_records.validate_linkml_data")
+ def test_download_records_step(
+ self, mock_validate_linkml, mock_redcap_to_linkml, mock_fetch_redcap,
+ mock_dotenv, mock_validate_env,
+ ):
+ """REDCap download step calls all expected functions."""
mock_dotenv.return_value = self.env_values
mock_validate_env.return_value = None
mock_fetch_redcap.return_value = self.records_file
mock_redcap_to_linkml.return_value = None
mock_validate_linkml.return_value = True
-
- # Get the Typer app; if download_records_app is defined as a function, call it
+
import typer
from rarelink.cli.redcap.download_records import app as download_records_command
download_records_app = typer.Typer()
download_records_app.command()(download_records_command)
-
+
result = self.runner.invoke(
download_records_app,
["--output-dir", str(self.output_dir), "--rarelink-cdm", "--records", ""],
- input="y\n"
+ input="y\n",
)
- # Check command ran successfully
self.assertEqual(result.exit_code, 0)
-
- # Verify the mocks were called
mock_validate_env.assert_called()
mock_fetch_redcap.assert_called_once()
mock_redcap_to_linkml.assert_called_once()
mock_validate_linkml.assert_called_once()
-
- @patch('rarelink.phenopackets.pipeline.create_phenopacket')
- @patch('rarelink.phenopackets.write_phenopackets')
- def test_phenopacket_pipeline_step(self, mock_write, mock_create):
- """Test the phenopacket pipeline step."""
- # Set up mock phenopacket
+
+ @patch("rarelink.phenopackets.pipeline.write_phenopackets")
+ @patch("rarelink.phenopackets.pipeline.create_phenopacket")
+ def test_phenopacket_pipeline_step(self, mock_create, mock_write):
+ """Pipeline creates phenopackets and calls write."""
mock_phenopacket = MagicMock()
mock_phenopacket.id = "101"
mock_create.return_value = mock_phenopacket
-
+
result = phenopacket_pipeline(
input_data=self.linkml_records,
output_dir=str(self.output_dir),
created_by="Test User",
mapping_configs=self.mapping_configs,
- timeout=10, # Short timeout for testing
- debug=True
+ timeout=10,
+ debug=True,
)
- # Verify pipeline executed successfully
self.assertIsNotNone(result)
- self.assertEqual(len(result), 1)
+ self.assertEqual(result.n_created, 1)
+ self.assertEqual(result.n_failed_creation, 0)
mock_create.assert_called_once()
mock_write.assert_called_once()
-
- @patch('subprocess.check_output')
- def test_validate_phenopackets_step(self, mock_check_output):
- """Test the phenopacket validation step."""
- # Setup mock validation success
- mock_check_output.return_value = "Phenopacket is valid"
-
- # Create a test phenopacket file
+
+ def test_validate_phenopackets_step(self):
+ """Python-native validation passes for a well-formed phenopacket."""
phenopacket_file = self.output_dir / "101.json"
phenopacket_content = {
"id": "101",
"subject": {
"id": "101",
- "taxonomy": {"id": "NCBITaxon:9606", "label": "Homo sapiens"}
+ "taxonomy": {"id": "NCBITaxon:9606", "label": "Homo sapiens"},
},
"phenotypicFeatures": [
{"type": {"id": "HP:0001059", "label": "Pterygium"}}
@@ -217,99 +195,88 @@ def test_validate_phenopackets_step(self, mock_check_output):
"metaData": {
"created": "2023-09-08T12:00:00Z",
"createdBy": "Test User",
- "phenopacketSchemaVersion": "2.0"
- }
+ "phenopacketSchemaVersion": "2.0",
+ },
}
-
- with open(phenopacket_file, 'w') as f:
+ with open(phenopacket_file, "w") as f:
json.dump(phenopacket_content, f)
-
+
from rarelink.phenopackets.validate import validate_phenopackets
- result, _ = validate_phenopackets(phenopacket_file)
- self.assertTrue(result)
- mock_check_output.assert_called_once()
-
- @patch('subprocess.check_output')
- @patch('rarelink.phenopackets.write_phenopackets')
- @patch('rarelink.phenopackets.pipeline.create_phenopacket')
- @patch('rarelink.cli.redcap.download_records.validate_linkml_data')
- @patch('rarelink.cli.redcap.download_records.redcap_to_linkml')
- @patch('rarelink.cli.redcap.download_records.fetch_redcap_data')
- @patch('rarelink.cli.redcap.download_records.dotenv_values')
- @patch('rarelink.cli.redcap.download_records.validate_env')
- def test_full_workflow_integration(self, mock_env_validate, mock_dotenv, mock_fetch,
- mock_convert, mock_validate_linkml,
- mock_create, mock_write, mock_check_output):
- """Test full workflow integration."""
- # Setup mocks for REDCap download
+
+ success, _ = validate_phenopackets(phenopacket_file)
+ self.assertTrue(success)
+
+ @patch("rarelink.phenopackets.pipeline.write_phenopackets")
+ @patch("rarelink.phenopackets.pipeline.create_phenopacket")
+ @patch("rarelink.cli.redcap.download_records.validate_linkml_data")
+ @patch("rarelink.cli.redcap.download_records.redcap_to_linkml")
+ @patch("rarelink.cli.redcap.download_records.fetch_redcap_data")
+ @patch("rarelink.cli.redcap.download_records.dotenv_values")
+ @patch("rarelink.cli.redcap.download_records.validate_env")
+ def test_full_workflow_integration(
+ self, mock_env_validate, mock_dotenv, mock_fetch, mock_convert,
+ mock_validate_linkml, mock_create, mock_write,
+ ):
+ """Full workflow: download, create phenopackets, validate."""
mock_dotenv.return_value = self.env_values
mock_env_validate.return_value = None
mock_fetch.return_value = self.records_file
mock_convert.return_value = None
mock_validate_linkml.return_value = True
-
- # Setup mocks for phenopacket pipeline
+
mock_phenopacket = MagicMock()
mock_phenopacket.id = "101"
mock_create.return_value = mock_phenopacket
-
- # Setup mock for validation
- mock_check_output.return_value = "Phenopacket is valid"
-
- # Step 1: Run the download command
+
import typer
from rarelink.cli.redcap.download_records import app as download_records_command
download_app = typer.Typer()
download_app.command()(download_records_command)
- runner = self.runner
- result = runner.invoke(
+ result = self.runner.invoke(
download_app,
["--output-dir", str(self.output_dir), "--rarelink-cdm", "--records", ""],
- input="y\n"
+ input="y\n",
)
self.assertEqual(result.exit_code, 0)
-
- # Step 2: Run the phenopacket pipeline
- phenopackets = phenopacket_pipeline(
+
+ pipeline_result = phenopacket_pipeline(
input_data=self.linkml_records,
output_dir=str(self.output_dir),
created_by="Test User",
mapping_configs=self.mapping_configs,
timeout=10,
- debug=True
+ debug=True,
)
- self.assertEqual(len(phenopackets), 1)
-
- # Step 3: Create a mock phenopacket file for validation
+ self.assertEqual(pipeline_result.n_created, 1)
+
phenopacket_file = self.output_dir / "101.json"
phenopacket_content = {
"id": "101",
"subject": {
"id": "101",
- "taxonomy": {"id": "NCBITaxon:9606", "label": "Homo sapiens"}
+ "taxonomy": {"id": "NCBITaxon:9606", "label": "Homo sapiens"},
},
"metaData": {
"created": "2023-09-08T12:00:00Z",
"createdBy": "Test User",
- "phenopacketSchemaVersion": "2.0"
- }
+ "phenopacketSchemaVersion": "2.0",
+ },
}
- with open(phenopacket_file, 'w') as f:
+ with open(phenopacket_file, "w") as f:
json.dump(phenopacket_content, f)
-
- # Step 4: Validate the phenopacket
+
from rarelink.phenopackets.validate import validate_phenopackets
- valid, details = validate_phenopackets(phenopacket_file)
+
+ valid, _ = validate_phenopackets(phenopacket_file)
self.assertTrue(valid)
-
- # Verify expected calls
+
mock_fetch.assert_called_once()
mock_convert.assert_called_once()
mock_validate_linkml.assert_called_once()
mock_create.assert_called_once()
mock_write.assert_called_once()
- mock_check_output.assert_called_once()
+
if __name__ == "__main__":
- unittest.main()
+ unittest.main()
\ No newline at end of file
diff --git a/tests/phenopackets/adapter/test_ontology_routing_adapter.py b/tests/phenopackets/adapter/test_ontology_routing_adapter.py
new file mode 100644
index 000000000..acc957ce7
--- /dev/null
+++ b/tests/phenopackets/adapter/test_ontology_routing_adapter.py
@@ -0,0 +1,115 @@
+# tests/phenopackets/adapter/test_ontology_routing_adapter.py
+"""
+Tests for the ontology routing adapter.
+
+Three tests cover the essential behaviour:
+ 1. HP-coded elements route to phenotypicFeatures (unchanged)
+ 2. MONDO-coded elements route to diseases (normalized)
+ 3. Elements with no routable code are skipped without error
+
+Uses the exact data shape from the CIEINR test fixture.
+"""
+
+from rarelink.phenopackets.adapter.ontology_routing_adapter import (
+ apply_ontology_routing,
+ get_routed_disease_dicts,
+ get_routed_phenotypic_elements,
+)
+
+# ---------------------------------------------------------------------------
+# Shared config and fixture
+# ---------------------------------------------------------------------------
+
+ROUTING_CONFIG = {
+ "ontology_routing": {
+ "enabled": True,
+ "instruments": ["infections_initial_form"],
+ "scan_fields": {
+ "infections_initial_form": [
+ "snomedct_21483005", # CNS → HP codes
+ "snomedct_127856007", # Skin → HP or MONDO
+ "snomedct_20139000", # Respiratory → HP codes
+ ],
+ },
+ "onset_fields": {
+ "infections_initial_form": ["infection_date", "infection_date_2"],
+ },
+ }
+}
+
+# Three infections elements:
+# #1 — HP code → phenotypicFeatures
+# #2 — MONDO code → diseases
+# #3 — SNOMED value (no routable prefix) → skipped
+RECORD = {
+ "record_id": "test_1",
+ "repeated_elements": [
+ {
+ "redcap_repeat_instrument": "infections_initial_form",
+ "redcap_repeat_instance": 1,
+ "infections_initial_form": {
+ "type_of_infection": "snomedct_21483005",
+ "snomedct_21483005": "hp_0002383", # HP → phenotypicFeatures
+ "infection_severity": "hp_0012826",
+ "infection_date": "2022-02-01",
+ },
+ },
+ {
+ "redcap_repeat_instrument": "infections_initial_form",
+ "redcap_repeat_instance": 2,
+ "infections_initial_form": {
+ "type_of_infection": "snomedct_127856007",
+ "snomedct_127856007": "mondo_0043653", # MONDO → diseases
+ "infection_severity": "hp_0012826",
+ "infection_date": "2023-02-01",
+ },
+ },
+ {
+ "redcap_repeat_instrument": "infections_initial_form",
+ "redcap_repeat_instance": 3,
+ "infections_initial_form": {
+ "type_of_infection": "snomedct_20139000",
+ "snomedct_20139000": "snomedct_233604007", # SNOMED → skip
+ "infection_date": "2024-01-01",
+ },
+ },
+ ],
+}
+
+
+# ---------------------------------------------------------------------------
+# Tests
+# ---------------------------------------------------------------------------
+
+def test_hp_element_routes_to_phenotypic_features():
+ """HP-coded element ends up in phenotypicFeatures, unchanged."""
+ data = apply_ontology_routing(RECORD, ROUTING_CONFIG)
+ pf = get_routed_phenotypic_elements(data)
+
+ assert len(pf) == 1
+ assert pf[0]["redcap_repeat_instance"] == 1
+ assert pf[0]["infections_initial_form"]["snomedct_21483005"] == "hp_0002383"
+
+
+def test_mondo_element_routes_to_diseases_normalized():
+ """MONDO-coded element ends up in diseases, normalized to term_field_1 convention."""
+ data = apply_ontology_routing(RECORD, ROUTING_CONFIG)
+ diseases = get_routed_disease_dicts(data)
+
+ assert len(diseases) == 1
+ d = diseases[0]
+ assert d["term_field_1"] == "mondo_0043653"
+ assert d["onset_date_field"] == "2023-02-01"
+ assert d["__source_instance"] == 2
+
+
+def test_element_with_no_routable_code_is_skipped():
+ """Element with an unrecognised prefix is not routed and original data is untouched."""
+ data = apply_ontology_routing(RECORD, ROUTING_CONFIG)
+
+ # Only HP (instance 1) and MONDO (instance 2) were routed
+ assert len(get_routed_phenotypic_elements(data)) == 1
+ assert len(get_routed_disease_dicts(data)) == 1
+
+ # Original list untouched — no mutation
+ assert len(data["repeated_elements"]) == 3
\ No newline at end of file
diff --git a/tests/phenopackets/test_data/101.json b/tests/phenopackets/test_data/101.json
index 4be0fd66d..e3e2a88d4 100644
--- a/tests/phenopackets/test_data/101.json
+++ b/tests/phenopackets/test_data/101.json
@@ -453,7 +453,7 @@
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"namespace_prefix": "MONDO",
"iri_prefix": "http://purl.obolibrary.org/obo/MONDO_"
},
@@ -461,7 +461,7 @@
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"namespace_prefix": "HPO",
"iri_prefix": "http://purl.obolibrary.org/obo/HP_"
},
@@ -469,7 +469,7 @@
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"namespace_prefix": "LOINC",
"iri_prefix": "http://loinc.org"
},
@@ -477,7 +477,7 @@
"id": "uo",
"name": "Units of Measurement Ontology",
"url": "https://www.ontobee.org/ontology/UO",
- "version": "2023-05-25",
+ "version": "2026-01-16",
"namespace_prefix": "UO",
"iri_prefix": "http://purl.obolibrary.org/obo/UO_"
},
@@ -509,7 +509,7 @@
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
+ "version": "2026-02-02",
"namespace_prefix": "GENO",
"iri_prefix": "http://purl.obolibrary.org/obo/GENO_"
}
diff --git a/tests/phenopackets/test_data/102.json b/tests/phenopackets/test_data/102.json
index 85cb1edb8..73d98fcb2 100644
--- a/tests/phenopackets/test_data/102.json
+++ b/tests/phenopackets/test_data/102.json
@@ -238,7 +238,7 @@
"id": "snomedct",
"name": "Systematized Medical Nomenclature for Medicine\u2013Clinical Terminology",
"url": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"namespacePrefix": "SNOMEDCT",
"iriPrefix": "http://snomed.info/sct"
},
@@ -246,7 +246,7 @@
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"namespacePrefix": "MONDO",
"iriPrefix": "http://purl.obolibrary.org/obo/MONDO_"
},
@@ -254,7 +254,7 @@
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"namespacePrefix": "HPO",
"iriPrefix": "http://purl.obolibrary.org/obo/HP_"
},
@@ -262,7 +262,7 @@
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"namespacePrefix": "LOINC",
"iriPrefix": "http://loinc.org"
},
@@ -286,7 +286,7 @@
"id": "ncit",
"name": "NCI Thesaurus OBO Edition",
"url": "https://ncit.nci.nih.gov/",
- "version": "24.01e",
+ "version": "26.02d",
"namespacePrefix": "NCIT",
"iriPrefix": "http://purl.obolibrary.org/obo/NCIT_"
},
@@ -326,7 +326,7 @@
"id": "icd11",
"name": "International Classification of Diseases, Eleventh Revision",
"url": "https://icd.who.int/en",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"namespacePrefix": "ICD11",
"iriPrefix": "http://hl7.org/fhir/sid/icd-11"
},
@@ -350,7 +350,7 @@
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
+ "version": "2026-02-02",
"namespacePrefix": "GENO",
"iriPrefix": "http://purl.obolibrary.org/obo/GENO_"
},
diff --git a/tests/phenopackets/test_data/103.json b/tests/phenopackets/test_data/103.json
index 6c3c54d96..48d314f6b 100644
--- a/tests/phenopackets/test_data/103.json
+++ b/tests/phenopackets/test_data/103.json
@@ -375,7 +375,7 @@
"id": "snomedct",
"name": "Systematized Medical Nomenclature for Medicine\u2013Clinical Terminology",
"url": "http://snomed.info/sct",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"namespacePrefix": "SNOMEDCT",
"iriPrefix": "http://snomed.info/sct"
},
@@ -383,7 +383,7 @@
"id": "mondo",
"name": "Monarch Disease Ontology",
"url": "https://purl.obolibrary.org/obo/MONDO/",
- "version": "2025-06-03",
+ "version": "2026-03-03",
"namespacePrefix": "MONDO",
"iriPrefix": "http://purl.obolibrary.org/obo/MONDO_"
},
@@ -391,7 +391,7 @@
"id": "hpo",
"name": "Human Phenotype Ontology",
"url": "http://purl.obolibrary.org/obo/hp.owl",
- "version": "2025-05-06",
+ "version": "2026-02-16",
"namespacePrefix": "HPO",
"iriPrefix": "http://purl.obolibrary.org/obo/HP_"
},
@@ -399,7 +399,7 @@
"id": "loinc",
"name": "Logical Observation Identifiers Names and Codes",
"url": "https://loinc.org",
- "version": "LNC278",
+ "version": "v281",
"namespacePrefix": "LOINC",
"iriPrefix": "http://loinc.org"
},
@@ -423,7 +423,7 @@
"id": "ncit",
"name": "NCI Thesaurus OBO Edition",
"url": "https://ncit.nci.nih.gov/",
- "version": "24.01e",
+ "version": "26.02d",
"namespacePrefix": "NCIT",
"iriPrefix": "http://purl.obolibrary.org/obo/NCIT_"
},
@@ -463,7 +463,7 @@
"id": "icd11",
"name": "International Classification of Diseases, Eleventh Revision",
"url": "https://icd.who.int/en",
- "version": "SNOMEDCT_US_2024_09_01",
+ "version": "2025AB",
"namespacePrefix": "ICD11",
"iriPrefix": "http://hl7.org/fhir/sid/icd-11"
},
@@ -487,7 +487,7 @@
"id": "geno",
"name": "GENO - The Genotype Ontology",
"url": "https://www.genoontology.org/",
- "version": "2023-10-08",
+ "version": "2026-02-02",
"namespacePrefix": "GENO",
"iriPrefix": "http://purl.obolibrary.org/obo/GENO_"
},
diff --git a/tests/phenopackets/test_data/sample_records_rarelink_cdm.json b/tests/phenopackets/test_data/sample_records_rarelink_cdm.json
index 290ba0f04..6484c982b 100644
--- a/tests/phenopackets/test_data/sample_records_rarelink_cdm.json
+++ b/tests/phenopackets/test_data/sample_records_rarelink_cdm.json
@@ -9,7 +9,7 @@
},
"personal_information": {
"snomedct_184099003": "2020-01-05",
- "snomedct_281053000": "",
+ "loinc_76689_9": "",
"snomedct_1296886006": "snomedct_734875008",
"snomedct_263495000": "snomedct_394743007",
"snomedct_370159000": "GER",
@@ -146,7 +146,7 @@
"snomedct_424850005": "",
"snomedct_298059007": "",
"snomedct_423493009": "snomedct_410672004",
- "snomedct_432213005": "SNOMEDCT_US_2024_09_01",
+ "snomedct_432213005": "2025AB",
"snomedct_363698007": "",
"snomedct_263493007": "hl7fhir_active",
"snomedct_246112005": "snomedct_24484000",
@@ -335,7 +335,7 @@
},
"personal_information": {
"snomedct_184099003": "2020-02-27",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "snomedct_65162001",
"snomedct_263495000": "snomedct_446141000124107",
"snomedct_370159000": "GER",
@@ -616,7 +616,7 @@
},
"personal_information": {
"snomedct_184099003": "2020-01-01",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "snomedct_734876009",
"snomedct_263495000": "snomedct_1220561009",
"snomedct_370159000": "TUR",
diff --git a/tests/phenopackets/test_data/sample_records_rarelink_cdm_1.json b/tests/phenopackets/test_data/sample_records_rarelink_cdm_1.json
index 3d8f83b03..37f2965dc 100644
--- a/tests/phenopackets/test_data/sample_records_rarelink_cdm_1.json
+++ b/tests/phenopackets/test_data/sample_records_rarelink_cdm_1.json
@@ -8,7 +8,7 @@
},
"personal_information": {
"snomedct_184099003": "2015-01-12",
- "snomedct_281053000": "snomedct_248153007",
+ "loinc_76689_9": "snomedct_248153007",
"snomedct_1296886006": "snomedct_734876009",
"snomedct_263495000": "snomedct_446151000124109",
"snomedct_370159000": "GER",
diff --git a/tests/phenopackets/test_pipeline.py b/tests/phenopackets/test_pipeline.py
index 9605aa01d..14f1742b0 100644
--- a/tests/phenopackets/test_pipeline.py
+++ b/tests/phenopackets/test_pipeline.py
@@ -1,37 +1,29 @@
+# tests/phenopackets/test_pipeline.py
import tempfile
import unittest
from unittest.mock import patch, Mock
-# Import the pipeline function and Phenopacket type.
from rarelink.phenopackets.pipeline import phenopacket_pipeline
from phenopackets import Phenopacket
+
class TestPhenopacketPipeline(unittest.TestCase):
- # Dummy mapping configuration that provides the required "individual" key.
dummy_mapping = {"individual": {"dummy": "config"}}
-
+
def setUp(self):
- # A simple dummy record as a dictionary.
self.record = {
"record_id": "101",
- "personal_information": {"snomedct_184099003": "2020-01-01"}
+ "personal_information": {"snomedct_184099003": "2020-01-01"},
}
-
- # Patch the functions that the pipeline uses.
- # Note: The pipeline imports create_phenopacket from 'rarelink.phenopackets' into its module;
- # therefore we patch 'rarelink.phenopackets.pipeline.create_phenopacket'
- # For writing, we assume that write_phenopackets is imported by the pipeline from
- # 'rarelink.phenopackets' (i.e. it is re-exported in __init__.py), so we patch
- # 'rarelink.phenopackets.write_phenopackets'.
- @patch('rarelink.phenopackets.write_phenopackets')
+
+ @patch('rarelink.phenopackets.pipeline.write_phenopackets')
@patch('rarelink.phenopackets.pipeline.create_phenopacket')
def test_basic_workflow(self, mock_create, mock_write):
- """Test that a single record is processed successfully."""
- # Set the patched create_phenopacket to return a dummy Phenopacket.
+ """Single record is created successfully and write is called."""
dummy_pheno = Mock(spec=Phenopacket)
dummy_pheno.id = "101"
mock_create.return_value = dummy_pheno
-
+
with tempfile.TemporaryDirectory() as tmpdir:
result = phenopacket_pipeline(
input_data=[self.record],
@@ -39,28 +31,27 @@ def test_basic_workflow(self, mock_create, mock_write):
created_by="Tester",
mapping_configs=self.dummy_mapping,
timeout=10,
- debug=True
+ debug=True,
)
- # The pipeline should return a list with one Phenopacket.
- self.assertEqual(len(result), 1)
+ self.assertEqual(result.n_created, 1)
+ self.assertEqual(result.n_failed_creation, 0)
mock_create.assert_called_once()
mock_write.assert_called_once()
-
- @patch('rarelink.phenopackets.write_phenopackets')
+
+ @patch('rarelink.phenopackets.pipeline.write_phenopackets')
@patch('rarelink.phenopackets.pipeline.create_phenopacket')
def test_multiple_records(self, mock_create, mock_write):
- """Test that multiple records are processed correctly."""
+ """Multiple records are all created successfully."""
records = [
self.record,
{"record_id": "102", "personal_information": {"snomedct_184099003": "2020-02-27"}},
- {"record_id": "103", "personal_information": {"snomedct_184099003": "2020-01-01"}}
+ {"record_id": "103", "personal_information": {"snomedct_184099003": "2020-01-01"}},
]
- # Create a dummy phenopacket for each record.
dummy1 = Mock(spec=Phenopacket); dummy1.id = "101"
dummy2 = Mock(spec=Phenopacket); dummy2.id = "102"
dummy3 = Mock(spec=Phenopacket); dummy3.id = "103"
mock_create.side_effect = [dummy1, dummy2, dummy3]
-
+
with tempfile.TemporaryDirectory() as tmpdir:
result = phenopacket_pipeline(
input_data=records,
@@ -68,26 +59,22 @@ def test_multiple_records(self, mock_create, mock_write):
created_by="Tester",
mapping_configs=self.dummy_mapping,
timeout=10,
- debug=True
+ debug=True,
)
- # Expect three Phenopackets.
- self.assertEqual(len(result), 3)
+ self.assertEqual(result.n_created, 3)
+ self.assertEqual(result.n_failed_creation, 0)
self.assertEqual(mock_create.call_count, 3)
mock_write.assert_called_once()
-
- @patch('rarelink.phenopackets.write_phenopackets')
+
+ @patch('rarelink.phenopackets.pipeline.write_phenopackets')
@patch('rarelink.phenopackets.pipeline.create_phenopacket')
def test_error_handling(self, mock_create, mock_write):
- """
- Test that if one record processing fails, the pipeline still returns
- the Phenopackets from the successful records.
- """
+ """One record fails creation; the other succeeds."""
dummy_pheno = Mock(spec=Phenopacket)
dummy_pheno.id = "101"
- # First call succeeds; second call raises an error.
mock_create.side_effect = [dummy_pheno, ValueError("Test error")]
records = [self.record, {"record_id": "error_record"}]
-
+
with tempfile.TemporaryDirectory() as tmpdir:
result = phenopacket_pipeline(
input_data=records,
@@ -95,37 +82,37 @@ def test_error_handling(self, mock_create, mock_write):
created_by="Tester",
mapping_configs=self.dummy_mapping,
timeout=10,
- debug=True
+ debug=True,
)
- # Only the first record should be processed successfully.
- self.assertEqual(len(result), 1)
+ self.assertEqual(result.n_created, 1)
+ self.assertEqual(result.n_failed_creation, 1)
+ self.assertEqual(result.failed_creations[0]["record_id"], "error_record")
mock_write.assert_called_once()
-
+
@patch('signal.alarm')
@patch('signal.signal')
- @patch('rarelink.phenopackets.write_phenopackets')
+ @patch('rarelink.phenopackets.pipeline.write_phenopackets')
@patch('rarelink.phenopackets.pipeline.create_phenopacket')
def test_timeout(self, mock_create, mock_write, mock_signal, mock_alarm):
- """Test that the timeout mechanism is set and then disabled correctly."""
+ """Timeout mechanism is set and then disabled correctly."""
dummy_pheno = Mock(spec=Phenopacket)
dummy_pheno.id = "101"
mock_create.return_value = dummy_pheno
-
+
with tempfile.TemporaryDirectory() as tmpdir:
phenopacket_pipeline(
input_data=[self.record],
output_dir=tmpdir,
created_by="Tester",
mapping_configs=self.dummy_mapping,
- timeout=300, # 5 minutes timeout.
- debug=True
+ timeout=300,
+ debug=True,
)
- # Verify that the signal handler was set.
mock_signal.assert_called_once()
- # And that alarm was set (with 300 seconds) and later reset (with 0).
self.assertEqual(mock_alarm.call_count, 2)
mock_alarm.assert_any_call(300)
mock_alarm.assert_any_call(0)
-
+
+
if __name__ == "__main__":
- unittest.main()
+ unittest.main()
\ No newline at end of file
diff --git a/tests/rd_cdm/test_csv_update.py b/tests/rd_cdm/test_csv_update.py
deleted file mode 100644
index 9c684478d..000000000
--- a/tests/rd_cdm/test_csv_update.py
+++ /dev/null
@@ -1,93 +0,0 @@
-"""
-Tests for updating version strings inside the data dictionary CSV.
-
-Covers:
-- Labelled lines: "HPO Version 2024-...".
-- Bullet items: "- LOINC vLNC278".
-- NCIT special: "NCIT vXXXX".
-- File rename and overwrite behavior.
-"""
-from pathlib import Path
-from rarelink.rd_cdm.codegen import update_data_dictionary_csv
-from rarelink._versions import DATA_DICT_LABEL
-
-
-def test_update_text_versions_label_and_bullet(tmp_path: Path):
- """
- Ensure we rewrite both labelled and bullet-style version lines.
- - 'HPO Version <...>' → 'HPO Version {ver}'
- - '- LOINC v<...>' → '- LOINC v{ver}'
- - 'NCIT v<...>' → 'NCIT v{ver}'
- - '- HPO <...>' → '- HPO {ver}'
- """
- content = (
- "Header,Something\n"
- "HPO Version 2025-05-06\n"
- "SNOMED CT Version SNOMEDCT_US_2024_09_01\n"
- "Version(s):\n"
- "- LOINC vLNC278\n"
- "- NCIT v24.01e\n"
- "- HPO 2025-05-06\n"
- )
-
- src = tmp_path / f"rarelink_cdm_datadictionary - {DATA_DICT_LABEL}.csv"
- src.write_text(content, encoding="utf-8")
-
- versions = {
- "HP": "2025-01-01",
- "SNOMEDCT": "2025-02-02",
- "LOINC": "2.79",
- "NCIT": "24.06",
- }
-
- out = update_data_dictionary_csv(
- tmp_path,
- DATA_DICT_LABEL,
- DATA_DICT_LABEL,
- versions,
- overwrite=True,
- )
- assert out.name == f"rarelink_cdm_datadictionary - {DATA_DICT_LABEL}.csv"
- text = out.read_text(encoding="utf-8")
-
- assert (
- "- HPO 2025-01-01" in text
- or "- HP 2025-01-01" in text
- or "2025-01-01" in text
- )
-
-
-def test_update_data_dictionary_csv_overwrite_flag(tmp_path: Path):
- """
- If the destination CSV exists and overwrite=False, we raise FileExistsError.
- """
- src = tmp_path / f"rarelink_cdm_datadictionary - {DATA_DICT_LABEL}.csv"
- src.write_text("SNOMED CT Version SNOMEDCT_US_2024_09_01", encoding="utf-8")
-
- dst = tmp_path / f"rarelink_cdm_datadictionary - {DATA_DICT_LABEL}.csv"
- dst.write_text("existing", encoding="utf-8")
-
- versions = {"SNOMEDCT": "2025-02-02"}
-
- # overwrite=False → error
- try:
- update_data_dictionary_csv(
- tmp_path,
- DATA_DICT_LABEL,
- DATA_DICT_LABEL,
- versions,
- overwrite=False,
- )
- assert False, "Expected FileExistsError"
- except FileExistsError:
- pass
-
- # overwrite=True → success
- out = update_data_dictionary_csv(
- tmp_path,
- DATA_DICT_LABEL,
- DATA_DICT_LABEL,
- versions,
- overwrite=True,
- )
- assert out.read_text(encoding="utf-8").strip() == "SNOMED CT Version 2025-02-02"
diff --git a/tests/rd_cdm/test_ensure_types_and_codegen.py b/tests/rd_cdm/test_ensure_types_and_codegen.py
deleted file mode 100644
index e560deb68..000000000
--- a/tests/rd_cdm/test_ensure_types_and_codegen.py
+++ /dev/null
@@ -1,49 +0,0 @@
-"""
-End-to-end-ish test: writes schema, ensures rarelink_types.yaml exists,
-and runs PythonGenerator to produce dataclasses.
-"""
-from pathlib import Path
-import yaml
-
-from rarelink.rd_cdm.codegen import (
- generate_python_classes,
- _ensure_rarelink_types
-)
-
-def test_generate_python_classes(tmp_path: Path, monkeypatch):
- """
- Build a tiny schema on disk and run the LinkML Python generator.
- """
- # Build a schema with at least HP present
- schema = {
- "id": "https://github.com/BIH-CEI/RareLink/code_systems_data",
- "name": "code_systems_data",
- "prefixes": {"linkml": "https://w3id.org/linkml/"},
- "imports": ["linkml:types"],
- "default_range": "string",
- "enums": {
- "HP": {"description": "Human Phenotype Ontology", "code_set": "https://www.human-phenotype-ontology.org", "code_set_version": "2025-01-01"}
- },
- "classes": {
- "CodeSystemsContainer": {
- "attributes": {
- "hpo": {"description": "Human Phenotype Ontology", "range": "HP", "required": True}
- }
- }
- },
- }
-
- schema_dir = tmp_path / "pkg" / "schema_definitions"
- schema_dir.mkdir(parents=True)
- schema_path = schema_dir / "rarelink_code_systems.yaml"
- schema_path.write_text(yaml.safe_dump(schema, sort_keys=False), encoding="utf-8")
-
- # Ensure rarelink_types.yaml exists (stubbed by helper)
- _ensure_rarelink_types(schema_dir)
-
- datamodel_dir = tmp_path / "pkg" / "datamodel"
- mod_path = generate_python_classes(schema_path, datamodel_dir)
-
- assert mod_path.exists()
- text = mod_path.read_text(encoding="utf-8")
- assert "class CodeSystemsContainer" in text
diff --git a/tests/rd_cdm/test_normalize_and_build_schema.py b/tests/rd_cdm/test_normalize_and_build_schema.py
deleted file mode 100644
index 9c684478d..000000000
--- a/tests/rd_cdm/test_normalize_and_build_schema.py
+++ /dev/null
@@ -1,93 +0,0 @@
-"""
-Tests for updating version strings inside the data dictionary CSV.
-
-Covers:
-- Labelled lines: "HPO Version 2024-...".
-- Bullet items: "- LOINC vLNC278".
-- NCIT special: "NCIT vXXXX".
-- File rename and overwrite behavior.
-"""
-from pathlib import Path
-from rarelink.rd_cdm.codegen import update_data_dictionary_csv
-from rarelink._versions import DATA_DICT_LABEL
-
-
-def test_update_text_versions_label_and_bullet(tmp_path: Path):
- """
- Ensure we rewrite both labelled and bullet-style version lines.
- - 'HPO Version <...>' → 'HPO Version {ver}'
- - '- LOINC v<...>' → '- LOINC v{ver}'
- - 'NCIT v<...>' → 'NCIT v{ver}'
- - '- HPO <...>' → '- HPO {ver}'
- """
- content = (
- "Header,Something\n"
- "HPO Version 2025-05-06\n"
- "SNOMED CT Version SNOMEDCT_US_2024_09_01\n"
- "Version(s):\n"
- "- LOINC vLNC278\n"
- "- NCIT v24.01e\n"
- "- HPO 2025-05-06\n"
- )
-
- src = tmp_path / f"rarelink_cdm_datadictionary - {DATA_DICT_LABEL}.csv"
- src.write_text(content, encoding="utf-8")
-
- versions = {
- "HP": "2025-01-01",
- "SNOMEDCT": "2025-02-02",
- "LOINC": "2.79",
- "NCIT": "24.06",
- }
-
- out = update_data_dictionary_csv(
- tmp_path,
- DATA_DICT_LABEL,
- DATA_DICT_LABEL,
- versions,
- overwrite=True,
- )
- assert out.name == f"rarelink_cdm_datadictionary - {DATA_DICT_LABEL}.csv"
- text = out.read_text(encoding="utf-8")
-
- assert (
- "- HPO 2025-01-01" in text
- or "- HP 2025-01-01" in text
- or "2025-01-01" in text
- )
-
-
-def test_update_data_dictionary_csv_overwrite_flag(tmp_path: Path):
- """
- If the destination CSV exists and overwrite=False, we raise FileExistsError.
- """
- src = tmp_path / f"rarelink_cdm_datadictionary - {DATA_DICT_LABEL}.csv"
- src.write_text("SNOMED CT Version SNOMEDCT_US_2024_09_01", encoding="utf-8")
-
- dst = tmp_path / f"rarelink_cdm_datadictionary - {DATA_DICT_LABEL}.csv"
- dst.write_text("existing", encoding="utf-8")
-
- versions = {"SNOMEDCT": "2025-02-02"}
-
- # overwrite=False → error
- try:
- update_data_dictionary_csv(
- tmp_path,
- DATA_DICT_LABEL,
- DATA_DICT_LABEL,
- versions,
- overwrite=False,
- )
- assert False, "Expected FileExistsError"
- except FileExistsError:
- pass
-
- # overwrite=True → success
- out = update_data_dictionary_csv(
- tmp_path,
- DATA_DICT_LABEL,
- DATA_DICT_LABEL,
- versions,
- overwrite=True,
- )
- assert out.read_text(encoding="utf-8").strip() == "SNOMED CT Version 2025-02-02"
diff --git a/tests/rd_cdm/test_scaffold_and_force.py b/tests/rd_cdm/test_scaffold_and_force.py
deleted file mode 100644
index 3633b2484..000000000
--- a/tests/rd_cdm/test_scaffold_and_force.py
+++ /dev/null
@@ -1,47 +0,0 @@
-"""
-Scaffold behavior: clone previous version → new version, then allow --force re-run
-without 'copying onto myself' errors or __pycache__ collisions.
-"""
-from pathlib import Path
-
-from rarelink.rd_cdm.codegen import scaffold_version_package
-from rarelink._versions import RD_CDM_LABEL
-
-
-def test_scaffold_force_overwrite(tmp_path: Path, monkeypatch):
- """
- Create a fake previous version, scaffold a new version, and re-run with force=True.
- """
- root = tmp_path / "rarelink_cdm"
- prev = root / RD_CDM_LABEL
- (prev / "schema_definitions").mkdir(parents=True)
- (prev / "python_datamodel").mkdir(parents=True)
- (prev / "schema_definitions" / "rarelink_types.yaml").write_text(
- "id: x\nname: rarelink_types\nimports:\n- linkml:types\n",
- encoding="utf-8",
- )
- (prev / "python_datamodel" / "__init__.py").write_text(
- "# old init",
- encoding="utf-8",
- )
- (prev / "__init__.py").write_text("# old top init", encoding="utf-8")
-
- # First run: scaffold RD_CDM_LABEL from RD_CDM_LABEL
- res1 = scaffold_version_package(
- RD_CDM_LABEL,
- root,
- from_version=RD_CDM_LABEL,
- force=False,
- ) # noqa: F841
- assert (root / RD_CDM_LABEL).exists()
- assert (root / RD_CDM_LABEL / "schema_definitions" / "rarelink_code_systems.yaml").exists()
- assert (root / RD_CDM_LABEL / "python_datamodel" / "rarelink_code_systems.py").exists()
-
- # Second run with force should delete and recreate cleanly
- res2 = scaffold_version_package(
- RD_CDM_LABEL,
- root,
- from_version=RD_CDM_LABEL,
- force=True,
- ) # noqa: F841
- assert (root / RD_CDM_LABEL / "python_datamodel" / "rarelink_code_systems.py").exists()
diff --git a/tests/utils/test_processor.py b/tests/utils/test_processor.py
index 88fc5d3df..6e99d62f6 100644
--- a/tests/utils/test_processor.py
+++ b/tests/utils/test_processor.py
@@ -11,7 +11,7 @@ def setUp(self):
self.mapping_config = {
"id_field": "record_id",
"date_of_birth_field": "personal_information.snomedct_184099003",
- "sex_field": "personal_information.snomedct_281053000",
+ "sex_field": "personal_information.loinc_76689_9",
"redcap_repeat_instrument": "rarelink_5_disease"
}
self.processor = DataProcessor(self.mapping_config)
@@ -19,7 +19,7 @@ def setUp(self):
"record_id": "101",
"personal_information": {
"snomedct_184099003": "2020-01-05",
- "snomedct_281053000": "snomedct_248153007"
+ "loinc_76689_9": "snomedct_248153007"
}
}