From 9a8e62c7bf411e493ee488ae957f4af9c351c62a Mon Sep 17 00:00:00 2001 From: Dougal Fleming Date: Tue, 24 Sep 2024 17:51:19 +0100 Subject: [PATCH] Add support for v6 schema --- .gitignore | 45 +++ pom.xml | 2 +- .../LabcodesetResourceGenerator.java | 15 +- .../generators/LoincResourceGenerator.java | 24 +- .../MaterialsResourceGenerator.java | 22 +- .../generators/UcumResourceGenerator.java | 5 +- src/main/resources/labcodeset.xsd | 313 +++++++++--------- 7 files changed, 229 insertions(+), 197 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6433c7a --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +# maven +/target/ + +# output +/output/** + +# upload +/upload/** + +# mac crud +.DS_Store + +# vscode +.vscode + +# secrets +*.secret.properties + +# excel outputs +*.xlsx \ No newline at end of file diff --git a/pom.xml b/pom.xml index e9e705d..abe819d 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ au.csiro labcodeset-fhir-transform - 1.0.1 + 1.1.0 jar Nederlandse Labcodeset XML to FHIR Terminology Transforms diff --git a/src/main/java/au/csiro/fhir/transforms/generators/LabcodesetResourceGenerator.java b/src/main/java/au/csiro/fhir/transforms/generators/LabcodesetResourceGenerator.java index db34816..6a786b9 100644 --- a/src/main/java/au/csiro/fhir/transforms/generators/LabcodesetResourceGenerator.java +++ b/src/main/java/au/csiro/fhir/transforms/generators/LabcodesetResourceGenerator.java @@ -23,6 +23,9 @@ import org.hl7.fhir.r4.model.MetadataResource; import org.hl7.fhir.r4.model.Resource; import org.hl7.fhir.r4.model.ValueSet; + +import au.csiro.fhir.transform.xml.nl.labcodeset.LabConcept; +import au.csiro.fhir.transform.xml.nl.labcodeset.LabConcept.Materials.Material; import au.csiro.fhir.transform.xml.nl.labcodeset.MaterialDefinition; import au.csiro.fhir.transform.xml.nl.labcodeset.Publication; import au.csiro.fhir.transform.xml.nl.labcodeset.UnitDefinition; @@ -56,7 +59,7 @@ public class LabcodesetResourceGenerator { private Publication pub; private File outputDir; private String labcodesetVersion; - private Map materialMap = new HashMap<>(); + private Map materialMap = new HashMap<>(); private Map unitMap = new HashMap<>(); private TerminologyClient terminologyClient; @@ -93,8 +96,10 @@ public LabcodesetResourceGenerator(File labcodesetFile, File outputDir, String l this.labcodesetVersion = pub.getEffectiveDate().split("-")[0]; - for (MaterialDefinition material : pub.getMaterials().getMaterial()) { - materialMap.put(material.getId(), material); + for (LabConcept concept : pub.getLabConcepts().getLabConcept()) { + for (Material material : concept.getMaterials().getMaterial()) { + materialMap.put(material.getCode(), material); + } } for (UnitDefinition unit : pub.getUnits().getUnit()) { @@ -150,7 +155,7 @@ private void generateMaterialResources(Bundle bundle) { } private void generateUcumResources(Bundle bundle) { - UcumResourceGenerator ucumResourceGenerator = new UcumResourceGenerator(labcodesetVersion, loincVersion, unitMap, materialMap); + UcumResourceGenerator ucumResourceGenerator = new UcumResourceGenerator(labcodesetVersion, loincVersion, unitMap); CodeSystem ucumCodeSystem = ucumResourceGenerator.createUcumCodeSystem(pub); outputResource(ucumCodeSystem, UCUM_CS_FILENAME); @@ -165,7 +170,7 @@ private void generateUcumResources(Bundle bundle) { private void generateLoincResources(Bundle bundle) { LoincResourceGenerator loincResourceGenerator = - new LoincResourceGenerator(labcodesetVersion, loincVersion, terminologyClient, unitMap, materialMap); + new LoincResourceGenerator(labcodesetVersion, loincVersion, terminologyClient, unitMap); CodeSystem loincSupplement = loincResourceGenerator.createLoincCodeSystemSupplement(pub); bundle.addEntry().setResource(loincSupplement); diff --git a/src/main/java/au/csiro/fhir/transforms/generators/LoincResourceGenerator.java b/src/main/java/au/csiro/fhir/transforms/generators/LoincResourceGenerator.java index 83ca2da..d2b4dde 100644 --- a/src/main/java/au/csiro/fhir/transforms/generators/LoincResourceGenerator.java +++ b/src/main/java/au/csiro/fhir/transforms/generators/LoincResourceGenerator.java @@ -34,8 +34,6 @@ import au.csiro.fhir.transform.xml.nl.labcodeset.LabConcept.Units; import au.csiro.fhir.transform.xml.nl.labcodeset.LoincAxis; import au.csiro.fhir.transform.xml.nl.labcodeset.LoincConcept; -import au.csiro.fhir.transform.xml.nl.labcodeset.MaterialDefinition; -import au.csiro.fhir.transform.xml.nl.labcodeset.MaterialOrMethodStatus; import au.csiro.fhir.transform.xml.nl.labcodeset.Publication; import au.csiro.fhir.transform.xml.nl.labcodeset.UnitDefinition; import au.csiro.fhir.transforms.utility.Constants; @@ -73,7 +71,6 @@ public class LoincResourceGenerator { private String loincVersion; private TerminologyClient terminologyClient; private Map unitMap; - private Map materialsMap; /** * @param labcodesetVersion version of the Labcodeset being transformed @@ -81,15 +78,13 @@ public class LoincResourceGenerator { * @param terminologyClient {@link TerminologyClient} that can be used to lookup details of LOINC * codes * @param unitMap Map of the unit references and their details in the Labcodeset file - * @param materialsMap Map of the materials references and their details in the Labcodeset file */ public LoincResourceGenerator(String labcodesetVersion, String loincVersion, TerminologyClient terminologyClient, - Map unitMap, Map materialsMap) { + Map unitMap) { this.labcodesetVersion = labcodesetVersion; this.loincVersion = loincVersion; this.terminologyClient = terminologyClient; this.unitMap = unitMap; - this.materialsMap = materialsMap; } /** @@ -163,20 +158,9 @@ private void setUnitProperties(Units units, ConceptDefinitionComponent concept) private void setMaterialProperties(Materials materials, ConceptDefinitionComponent concept) { if (materials != null && materials.getMaterial() != null) { for (Material material : materials.getMaterial()) { - if (material.getStatus() != null && !material.getStatus().equals(MaterialOrMethodStatus.ACTIVE)) { - System.err.println("All materials should be active, yet material " + material.getRef() + " on code " + concept.getCode() + " is " - + material.getStatus()); - } - - MaterialDefinition materialDefinition = materialsMap.get(material.getRef()); - - if (materialDefinition != null) { - concept.addProperty(new ConceptPropertyComponent(new CodeType(LABCODESET_MATERIAL_PROPERTY), - new Coding(Constants.SCT_CS_URI, materialDefinition.getCode().toString(), - terminologyClient.getSnomedDisplay(materialDefinition.getCode().toString(), materialDefinition.getDisplayName())))); - } else { - System.err.println("Could not find material for reference " + material.getRef() + " - omitting this property!"); - } + concept.addProperty(new ConceptPropertyComponent(new CodeType(LABCODESET_MATERIAL_PROPERTY), + new Coding(Constants.SCT_CS_URI, material.getCode().toString(), + terminologyClient.getSnomedDisplay(material.getCode().toString(), material.getDisplayName())))); } } } diff --git a/src/main/java/au/csiro/fhir/transforms/generators/MaterialsResourceGenerator.java b/src/main/java/au/csiro/fhir/transforms/generators/MaterialsResourceGenerator.java index e8caf7d..2eb78b0 100644 --- a/src/main/java/au/csiro/fhir/transforms/generators/MaterialsResourceGenerator.java +++ b/src/main/java/au/csiro/fhir/transforms/generators/MaterialsResourceGenerator.java @@ -20,8 +20,6 @@ import org.hl7.fhir.r4.model.ValueSet.ValueSetComposeComponent; import au.csiro.fhir.transform.xml.nl.labcodeset.LabConcept; import au.csiro.fhir.transform.xml.nl.labcodeset.LabConcept.Materials.Material; -import au.csiro.fhir.transform.xml.nl.labcodeset.MaterialDefinition; -import au.csiro.fhir.transform.xml.nl.labcodeset.MaterialOrMethodStatus; import au.csiro.fhir.transform.xml.nl.labcodeset.Publication; import au.csiro.fhir.transforms.utility.Constants; import au.csiro.fhir.transforms.utility.TerminologyClient; @@ -43,7 +41,7 @@ public class MaterialsResourceGenerator { private String labcodesetVersion; private String loincVersion; private TerminologyClient terminologyClient; - private Map materialsMap; + private Map materialsMap; /** * @param labcodesetVersion version of the Labcodeset being transformed @@ -53,7 +51,7 @@ public class MaterialsResourceGenerator { * @param materialsMap Map of the materials references and their details in the Labcodeset file */ public MaterialsResourceGenerator(String labcodesetVersion, String loincVersion, TerminologyClient terminologyClient, - Map materialsMap) { + Map materialsMap) { this.labcodesetVersion = labcodesetVersion; this.loincVersion = loincVersion; this.terminologyClient = terminologyClient; @@ -70,7 +68,7 @@ public ValueSet createMaterialsValueSet(Publication pub) { ValueSet valueSet = new ValueSet(); String identifier = "Labconcepts-materials-" + labcodesetVersion; valueSet.setId(identifier); - valueSet.setName(identifier).setVersion(labcodesetVersion).setTitle(LABCODESET_MATERIALS_VS_TITLE).setStatus(PublicationStatus.DRAFT) + valueSet.setName(identifier).setVersion(labcodesetVersion).setTitle(LABCODESET_MATERIALS_VS_TITLE).setStatus(PublicationStatus.ACTIVE) .setUrl(LABCODESET_MATERIALS_VS_URI).setDescription(LABCODESET_MATERIALS_VS_DESCRIPTION).setExperimental(false) .setPublisher(Constants.LABCODESET_RESOURCE_PUBLISHER).setCopyright(Constants.LABCODESET_RESOURCE_COPYRIGHT) .setLanguage(Constants.DUTCH_LANGUAGE_CODE); @@ -82,11 +80,8 @@ public ValueSet createMaterialsValueSet(Publication pub) { conceptSet.setSystem(Constants.SCT_CS_URI); conceptSet.setVersion(Constants.NL_SCT_EDITION); - for (MaterialDefinition material : pub.getMaterials().getMaterial()) { - if (material.getStatus() != null && !material.getStatus().equals(MaterialOrMethodStatus.ACTIVE)) { - System.err.println("All materials should be active, yet material " + material.getCode() + " is " + material.getStatus()); - } - + for (Map.Entry entry : materialsMap.entrySet()) { + Material material = entry.getValue(); ConceptReferenceComponent con = new ConceptReferenceComponent(); con.setCode(material.getCode().toString()); @@ -128,11 +123,6 @@ public ConceptMap createMaterialsConceptMap(Publication pub) { if (labConcept.getMaterials() != null) { for (Material material : labConcept.getMaterials().getMaterial()) { - if (material.getStatus() != null && !material.getStatus().equals(MaterialOrMethodStatus.ACTIVE)) { - System.err.println("All materials should be active, yet material " + material.getRef() + " on code " - + labConcept.getLoincConcept().getLoincNum() + " is " + material.getStatus()); - } - SourceElementComponent element = new SourceElementComponent(); element.setCode(labConcept.getLoincConcept().getLoincNum()); if (labConcept.getLoincConcept().getTranslation() != null @@ -143,7 +133,7 @@ public ConceptMap createMaterialsConceptMap(Publication pub) { } TargetElementComponent targetElement = new TargetElementComponent(); - MaterialDefinition cachedMaterial = materialsMap.get(material.getRef()); + Material cachedMaterial = materialsMap.get(material.getCode()); targetElement.setCode(cachedMaterial.getCode().toString()); targetElement.setDisplay(terminologyClient.getSnomedDisplay(targetElement.getCode(), cachedMaterial.getDisplayName())); targetElement.setEquivalence(ConceptMapEquivalence.RELATEDTO); diff --git a/src/main/java/au/csiro/fhir/transforms/generators/UcumResourceGenerator.java b/src/main/java/au/csiro/fhir/transforms/generators/UcumResourceGenerator.java index 94a3999..cfae157 100644 --- a/src/main/java/au/csiro/fhir/transforms/generators/UcumResourceGenerator.java +++ b/src/main/java/au/csiro/fhir/transforms/generators/UcumResourceGenerator.java @@ -25,7 +25,6 @@ import org.hl7.fhir.r4.model.ValueSet.ValueSetComposeComponent; import au.csiro.fhir.transform.xml.nl.labcodeset.LabConcept; import au.csiro.fhir.transform.xml.nl.labcodeset.LabConcept.Units; -import au.csiro.fhir.transform.xml.nl.labcodeset.MaterialDefinition; import au.csiro.fhir.transform.xml.nl.labcodeset.Publication; import au.csiro.fhir.transform.xml.nl.labcodeset.UnitDefinition; import au.csiro.fhir.transforms.utility.Constants; @@ -56,10 +55,8 @@ public class UcumResourceGenerator { * @param terminologyClient {@link TerminologyClient} that can be used to lookup details of LOINC * codes * @param unitMap Map of the unit references and their details in the Labcodeset file - * @param materialsMap Map of the materials references and their details in the Labcodeset file */ - public UcumResourceGenerator(String labcodesetVersion, String loincVersion, Map unitMap, - Map materialsMap) { + public UcumResourceGenerator(String labcodesetVersion, String loincVersion, Map unitMap) { this.labcodesetVersion = labcodesetVersion; this.loincVersion = loincVersion; this.unitMap = unitMap; diff --git a/src/main/resources/labcodeset.xsd b/src/main/resources/labcodeset.xsd index fed06a7..7a0d962 100644 --- a/src/main/resources/labcodeset.xsd +++ b/src/main/resources/labcodeset.xsd @@ -1,4 +1,3 @@ - @@ -13,14 +12,9 @@ Lijst met alle actieve concepten in de Nederlandse Labcodeset - + - Lijst met gebruikte Snomed materialen - - - - - Lijst met gebruikte Snomed methoden + Lijst met gebruikte LOINC System op Snomed materialen mappings @@ -38,10 +32,32 @@ Lijst met verwijzingen naar gebruikte nominale uitslagenlijsten + + + Lijst met panels + + + + + + + + + + + + + + + + + + + @@ -53,10 +69,8 @@ - + - - @@ -64,8 +78,7 @@ - LOINC concept behorende bij dit Labcodeset concept. Bevat de Engelstalige en (waar aanwezig) Nederlandstalige - assen. + LOINC concept behorende bij dit Labcodeset concept. Bevat de Engelstalige en (waar aanwezig) Nederlandstalige assen. @@ -76,80 +89,68 @@ - Verwijst naar een materiaal in de materialenlijst. + Verwijst naar een SNOMED materiaal uit de mapping. - - + + - + - Methoden die gebruikt kunnen worden bij dit concept. + Bevat de lijst van mogelijke nominale of ordinale uitkomsten. + + + + + + Verwijst naar een referentieset in SNOMED. U kunt deze vinden in de Nederlandse SNOMED-editie met behulp van het gegeven conceptId. + + + + + "Verwijst naar de lijst van mogelijke ordinale uitkomsten." + + + + + + + + + + + Eenheden (units) die gebruikt worden bij dit concept. - + - Verwijst naar een methode in de methodenlijst. + Verwijst naar een eenheid (unit) in de eenhedenlijst. - - + - - - - - Bevat de lijst van mogelijke nominale of ordinale uitkomsten. - - - - - - Verwijst naar een referentieset in SNOMED. U kunt deze vinden in de Nederlandse SNOMED-editie met behulp van het gegeven conceptId. - - - - - "Verwijst naar de lijst van mogelijke ordinale uitkomsten." - - - - - - - - - - - Eenheden (units) die gebruikt worden bij dit concept. - - - - - - Verwijst naar een eenheid (unit) in de eenhedenlijst. - - - - - - - - - - - + + + Reden dat een concept status 'retired' heeft gekregen. + + + - Commentaar - m.n. tijdens ontwikkeling + Eventuele vervangende concepten voor een concept dat status 'retired' heeft gekregen. + + + + + Een release note met vrije toelichtende tekst bij een concept. @@ -189,7 +190,7 @@ - + De LOINC-as component. @@ -199,7 +200,7 @@ - De LOINC-as timing. + De LOINC-as timing ofwel tijdsduur. @@ -229,9 +230,19 @@ - Bevat de Long Common Name (LCN) van een LOINC-concept. Naast name heeft het attributen count (het aantal tokens) en length (de totale lengte). Dit is de naam waarmee een LOINC-concept getoond dient te worden. + Bevat de Long Common Name (LCN) van een LOINC-concept. Dit is de naam waarmee een LOINC-concept getoond dient te worden. + + + Vervangend LOINC concept voor DISCOURAGED of DEPRECATED concepten. Attributen "from" (oude concept), "to" (nieuwe concept) en "comment" (toelichting). + + + + + + + Voor een panel van bepalingen zal dit element aanwezig zijn met de waarde 'Panel'. In andere gevallen is het afwezig. @@ -258,7 +269,7 @@ - + @@ -269,6 +280,7 @@ + @@ -279,14 +291,10 @@ - - - - - + - + @@ -295,77 +303,21 @@ Een materiaal, d.w.z. een monster (specimen) waarin een bepaling uitgevoerd kan worden, bv. urine. - - - - De Nederlandse weergavenaam. - - - - - Het ouderconcept in SNOMED. - - - - - De substantie die in SNOMED aan dit materiaal gekoppeld is, bv. ‘urine’ voor het materiaal ‘midstream-urine’. - - - - - De herkomst van het materiaal, bv. ‘eye proper’ voor ‘eye fluid sample’. - - - - - De morfologische afwijking waaruit het materiaal afkomstig is, bv. een wond of abces. - - - - - Wanneer het materiaal in feite een object is, bv. een kathetertip, wordt dit object op deze as gespecificeerd. - - - - - De verrichting waarmee het materiaal verkregen is, bv. een uitstrijk. - - - - - Verwijzingen naar externe websites met informatie over dit concept. - - - - - - - - - - - - - - - - - - - Methodes dienen nog nader gedefinieerd te worden. - - - - - - - - - - - - - + + + De SNOMED code. + + + + + De SNOMED weergavenaam. + + + + + Het LOINC System. + + @@ -394,6 +346,7 @@ + @@ -422,7 +375,7 @@ - + @@ -472,6 +425,64 @@ - + + + + + + Lijst met alle panels in de NL Labcodeset. + + + + + + + + + + Type van de LOINC concepten in een panel. + Ieder loincConcept in een panel verwijst naar een LOINC concept uit de NL Labcodeset. + + + + + Lijst met alle NL Labcodeset concepten + + + + + Korte naam van het concept. Alleen voor de leesbaarheid van deze lijst - gebruik de naam uit het hele LOINC concept in uw toepassing. + + + + + Een eventuele aanduiding de bepaling binnen het panel verplicht, optioneel of voorwaardelijk is. + Waarden: R (Required), O (Optional) of C (Conditional + + + + + Een eventuele tekstuele beschrijving van voorwaarde voor inclusie. + + + + + Een eventuele tekstuele beschrijving van voorwaarde voor inclusie. + + + + + Een lijst met de leden van het panel. Dit kunnen zelf weer panels zijn, of individuele testen. + + + + + + + + + + + - + \ No newline at end of file