From e83416c825cac1af3df02ff8c8a9c4efd2ff06b2 Mon Sep 17 00:00:00 2001 From: David Osumi-Sutherland Date: Mon, 27 Apr 2026 22:04:17 +0100 Subject: [PATCH 01/22] Phase 2 end-to-end test on first 10 muscular-system terms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 10 input terms processed by the new dual-template flow: - Stage 1: pre-classified into 8 leaf + 2 group rows - Stage 2: 8 group JSONs (7 leaf parent groups + 1 grouping_terms bucket) - Stage 3: 8 ntr-term-researcher agents (3 needed retry due to API stream timeouts; grouping_terms handled inline after retry stalled) - Stage 4: dual-template merge Final output: - 4 NEW leaf terms with Aristotelian definitions, real PMID/DOI refs, resolved is_a/part_of, Wikipedia + FMA xrefs - 0 NEW group terms — both 'anterior vertebral muscle' and 'circular pharyngeal muscle' resolved to existing UBERON terms via Step 2 OLS4 check, validating that confirmed_match takes precedence over Step 8 EC pattern detection - 5 confirmed_match (5 of 10 input terms already exist in UBERON): - ceratoglossus → UBERON:0008428 - chondroglossus muscle → UBERON:0011535 - costal diaphragm → UBERON:0035831 - aryepiglotticus muscle → UBERON:0011025 - constrictor muscle of pharynx → UBERON:0001569 (NEW from group flow) - 1 possible_match: anterior vertebral muscle ≈ UBERON:0008549 (prevertebral muscle) — flagged for curator decision (synonym vs new term) - 1 manual_curation: anterior vertebral muscle — UBERON's similar term uses attaches_to + innervated_by axioms, not the simple genus + part_of pattern, so out of EC template scope The test exercises: leaf+INFER parent, leaf+NEEDS_MAPPING:FMA parent, leaf+UNRESOLVABLE parent (including wrong-domain), group→confirmed_match, group→possible_match+manual_curation. All paths working as designed. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../outputs/definitions/grouping_terms.json | 56 ++++++++++++++++++ .../definitions/input/grouping_terms.json | 28 +++++++++ .../input/needs_mapping_fma_22424.json | 20 +++++++ .../input/needs_mapping_fma_46583.json | 20 +++++++ .../definitions/input/uberon_0000975.json | 20 +++++++ .../definitions/input/uberon_0001572.json | 28 +++++++++ .../definitions/input/uberon_0002381.json | 20 +++++++ ...nresolvable_meningohypophyseal_artery.json | 20 +++++++ .../unresolvable_segmental_back_muscle.json | 20 +++++++ .../definitions/needs_mapping_fma_22424.json | 27 +++++++++ .../definitions/needs_mapping_fma_46583.json | 18 ++++++ .../outputs/definitions/uberon_0000975.json | 25 ++++++++ .../outputs/definitions/uberon_0001572.json | 28 +++++++++ .../outputs/definitions/uberon_0002381.json | 17 ++++++ ...nresolvable_meningohypophyseal_artery.json | 24 ++++++++ .../unresolvable_segmental_back_muscle.json | 24 ++++++++ .../outputs/template_groups_initial.tsv | 4 ++ .../outputs/template_initial.tsv | 10 ++++ hra_unmapped-asct-term-list-with-refs.xlsx | Bin 0 -> 277563 bytes .../hra-muscular-groups.template.tsv | 2 + .../hra-muscular-reports/candidates.tsv | 7 +++ src/templates/hra-muscular-reports/errors.tsv | 5 ++ src/templates/hra-muscular-reports/input.tsv | 11 ++++ .../hra-muscular-reports/manual_curation.tsv | 2 + src/templates/hra-muscular.template.tsv | 6 ++ 25 files changed, 442 insertions(+) create mode 100644 bulk_ntr_workflow/outputs/definitions/grouping_terms.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/grouping_terms.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22424.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46583.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0000975.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0001572.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0002381.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/unresolvable_meningohypophyseal_artery.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/unresolvable_segmental_back_muscle.json create mode 100644 bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json create mode 100644 bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46583.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0000975.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0001572.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0002381.json create mode 100644 bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json create mode 100644 bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json create mode 100644 bulk_ntr_workflow/outputs/template_groups_initial.tsv create mode 100644 bulk_ntr_workflow/outputs/template_initial.tsv create mode 100644 hra_unmapped-asct-term-list-with-refs.xlsx create mode 100644 src/templates/hra-muscular-groups.template.tsv create mode 100644 src/templates/hra-muscular-reports/candidates.tsv create mode 100644 src/templates/hra-muscular-reports/errors.tsv create mode 100644 src/templates/hra-muscular-reports/input.tsv create mode 100644 src/templates/hra-muscular-reports/manual_curation.tsv create mode 100644 src/templates/hra-muscular.template.tsv diff --git a/bulk_ntr_workflow/outputs/definitions/grouping_terms.json b/bulk_ntr_workflow/outputs/definitions/grouping_terms.json new file mode 100644 index 000000000..ae6de6c3c --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/grouping_terms.json @@ -0,0 +1,56 @@ +{ + "confirmed_matches": [ + { + "label": "circular pharyngeal muscle", + "uberon_id": "UBERON:0001569", + "confidence": "high", + "uberon_definition": "Pharyngeal constrictor refers to one of the muscles that serves to constrict the pharynx. They include: Superior pharyngeal constrictor muscle Middle pharyngeal constrictor muscle Inferior pharyngeal constrictor muscle.", + "wikipedia_summary": "Pharyngeal constrictor / circular pharyngeal muscle is the outer circular layer of pharyngeal musculature comprising the superior, middle, and inferior constrictors; functions to constrict the pharyngeal lumen during swallowing.", + "note": "UBERON:0001569 has EXACT synonym 'pharyngeal constrictor muscle' and xref Wikipedia:Pharyngeal_constrictor. The TA2 'circular pharyngeal muscle' refers to the same circular layer collective. UBERON:0001569 is a parent class with members superior/middle/inferior pharyngeal constrictor (UBERON:0006329, UBERON:0010749, UBERON:0001570). Recommend adding 'circular pharyngeal muscle' as RELATED synonym to UBERON:0001569." + } + ], + "possible_matches": [ + { + "label": "anterior vertebral muscle", + "uberon_id": "UBERON:0008549", + "confidence": "medium", + "note": "UBERON:0008549 'prevertebral muscle' has the same definition (one of the muscles deep to the prevertebral fascia... including the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis). Synonym 'flexor muscle of vertebral column'. The TA2 term 'anterior vertebral muscle' is a synonymous regional grouping. Curator should confirm whether to map directly to UBERON:0008549, to its child UBERON:0017647 'prevertebral muscle of neck', or add as RELATED synonym. Definition uses attaches_to + innervated_by axioms (multi-axiom pattern), not the simple genus + part_of pattern, so this would be out of scope for the EC template even if added as a new term." + } + ], + "manual_curation": [ + { + "label": "anterior vertebral muscle", + "definition": "A group of muscles deep to the prevertebral fascia on the anterior surface of the cervical and superior thoracic vertebrae, comprising the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis muscles; innervated by anterior rami of cervical spinal nerves; functions in flexion of the head and neck.", + "reason": "The closest existing UBERON term is UBERON:0008549 (prevertebral muscle) which uses 'is_a + attaches_to + innervated_by' axioms — NOT the simple genus + part_of pattern supported by the groups template. If treated as a confirmed/possible match instead, no new term is needed. Curator should decide between mapping to UBERON:0008549 vs creating 'anterior vertebral muscle' as a synonym.", + "similar_terms": [ + { + "id": "UBERON:0008549", + "label": "prevertebral muscle", + "intersection_of": ["(none — uses is_a + attaches_to UBERON:0002412 vertebra + innervated_by UBERON:0006838 ventral ramus of spinal nerve)"] + }, + { + "id": "UBERON:0017647", + "label": "prevertebral muscle of neck", + "intersection_of": ["UBERON:0008549 prevertebral muscle", "part_of UBERON:0000974 neck"] + } + ], + "suggestion": "Most likely outcome: add 'anterior vertebral muscle' as RELATED synonym to UBERON:0008549, no new term needed." + } + ], + "definitions": { + "circular pharyngeal muscle": "A group of pharyngeal muscles forming the outer circular layer of the pharyngeal wall, comprising the superior, middle, and inferior pharyngeal constrictors, which encircle the pharynx and contract sequentially during swallowing to propel the food bolus into the esophagus; innervated chiefly by the pharyngeal branch of the vagus nerve (CN X).", + "anterior vertebral muscle": "A group of muscles deep to the prevertebral fascia on the anterior surface of the cervical and superior thoracic vertebrae, comprising the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis muscles, innervated by anterior rami of cervical spinal nerves and acting to flex and stabilize the head and neck." + }, + "wikipedia_images": { + "circular pharyngeal muscle": "http://upload.wikimedia.org/wikipedia/commons/a/ac/Musculusconstrictorpharyngissuperior.png", + "anterior vertebral muscle": "https://upload.wikimedia.org/wikipedia/commons/b/b0/Prevertebral_muscles.png" + }, + "xrefs": { + "circular pharyngeal muscle": "Wikipedia:Pharyngeal_constrictor|FMA:46620", + "anterior vertebral muscle": "Wikipedia:Prevertebral_muscles|FMA:32514" + }, + "def_xrefs_to_add": { + "circular pharyngeal muscle": "Wikipedia:Pharyngeal_constrictor", + "anterior vertebral muscle": "Wikipedia:Prevertebral_muscles" + } +} diff --git a/bulk_ntr_workflow/outputs/definitions/input/grouping_terms.json b/bulk_ntr_workflow/outputs/definitions/input/grouping_terms.json new file mode 100644 index 000000000..4616b0efe --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/grouping_terms.json @@ -0,0 +1,28 @@ +{ + "group_name": "grouping_terms", + "parent_id": "GROUPING_TERMS", + "parent_label": "(grouping terms \u2014 agent determines genus + part_of differentiator per term)", + "term_counts": { + "leaf": 0, + "group": 2 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900002", + "label": "anterior vertebral muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-vertebral-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900007", + "label": "circular pharyngeal muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_circular-pharyngeal-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22424.json b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22424.json new file mode 100644 index 000000000..53d301b5a --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22424.json @@ -0,0 +1,20 @@ +{ + "group_name": "needs_mapping_fma_22424", + "parent_id": "NEEDS_MAPPING:FMA:22424", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900003", + "label": "articularis genu muscle", + "term_type": "leaf", + "is_a": "NEEDS_MAPPING:FMA:22424", + "part_of": "NEEDS_MAPPING:FMA:22424", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46583.json b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46583.json new file mode 100644 index 000000000..81708cef8 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46583.json @@ -0,0 +1,20 @@ +{ + "group_name": "needs_mapping_fma_46583", + "parent_id": "NEEDS_MAPPING:FMA:46583", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900004", + "label": "aryepiglottic part of oblique arytenoid muscle", + "term_type": "leaf", + "is_a": "NEEDS_MAPPING:FMA:46583", + "part_of": "NEEDS_MAPPING:FMA:46583", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_aryepiglottic-part-of-oblique-arytenoid-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0000975.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0000975.json new file mode 100644 index 000000000..02b17ac95 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0000975.json @@ -0,0 +1,20 @@ +{ + "group_name": "uberon_0000975", + "parent_id": "UBERON:0000975", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900009", + "label": "costal part of respiratory diaphragm muscle", + "term_type": "leaf", + "is_a": "INFER:UBERON:0000975", + "part_of": "INFER:UBERON:0000975", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_costal-part-of-respiratory-diaphragm-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0001572.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001572.json new file mode 100644 index 000000000..c31829dab --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001572.json @@ -0,0 +1,28 @@ +{ + "group_name": "uberon_0001572", + "parent_id": "UBERON:0001572", + "parent_label": "", + "term_counts": { + "leaf": 2, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900005", + "label": "ceratoglossus of hyoglossus muscle", + "term_type": "leaf", + "is_a": "INFER:UBERON:0001572", + "part_of": "INFER:UBERON:0001572", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_ceratoglossus-of-hyoglossus-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900006", + "label": "chondroglossus of hyoglossus muscle", + "term_type": "leaf", + "is_a": "INFER:UBERON:0001572", + "part_of": "INFER:UBERON:0001572", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_chondroglossus-of-hyoglossus-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0002381.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002381.json new file mode 100644 index 000000000..e1755163a --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002381.json @@ -0,0 +1,20 @@ +{ + "group_name": "uberon_0002381", + "parent_id": "UBERON:0002381", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900008", + "label": "clavicular head of pectoralis major muscle", + "term_type": "leaf", + "is_a": "INFER:UBERON:0002381", + "part_of": "INFER:UBERON:0002381", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_meningohypophyseal_artery.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_meningohypophyseal_artery.json new file mode 100644 index 000000000..11afa6779 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_meningohypophyseal_artery.json @@ -0,0 +1,20 @@ +{ + "group_name": "unresolvable_meningohypophyseal_artery", + "parent_id": "UNRESOLVABLE:meningohypophyseal artery", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900010", + "label": "dorsal part of intertransversarii laterales lumborum muscle", + "term_type": "leaf", + "is_a": "UNRESOLVABLE:meningohypophyseal artery", + "part_of": "UNRESOLVABLE:meningohypophyseal artery", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_segmental_back_muscle.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_segmental_back_muscle.json new file mode 100644 index 000000000..9a654509d --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_segmental_back_muscle.json @@ -0,0 +1,20 @@ +{ + "group_name": "unresolvable_segmental_back_muscle", + "parent_id": "UNRESOLVABLE:segmental back muscle", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900001", + "label": "anterior cervical intertransversarii muscle", + "term_type": "leaf", + "is_a": "UNRESOLVABLE:segmental back muscle", + "part_of": "UNRESOLVABLE:segmental back muscle", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json new file mode 100644 index 000000000..9f29eb6ef --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json @@ -0,0 +1,27 @@ +{ + "definitions": { + "articularis genu muscle": "A skeletal muscle of the anterior compartment of the thigh that arises from the anterior surface of the lower body of the femur, deep to the vastus intermedius, and inserts onto the synovial membrane of the knee joint, retracting the suprapatellar bursa superiorly during knee extension and preventing impingement of the synovium between the patella and femur." + }, + "wikipedia_images": { + "articularis genu muscle": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Gray244.png/512px-Gray244.png" + }, + "xrefs": { + "articularis genu muscle": "Wikipedia:Articularis_genus_muscle|FMA:22437" + }, + "def_xrefs_to_add": { + "articularis genu muscle": "PMID:30229230|PMID:33215156" + }, + "resolved_relationships": { + "articularis genu muscle": "is_a" + }, + "resolved_parents": { + "articularis genu muscle": "UBERON:0004252" + }, + "unresolvable": [ + { + "label": "parent FMA:22424 (muscle of anterior compartment of thigh)", + "reason": "No UBERON term exists with FMA:22424 as xref or with 'anterior compartment of thigh' in label/synonyms. OLS4 searches for the FMA ID and for the label text return no hits. Closest UBERON grouping for the anterior thigh compartment specifically is UBERON:0001377 (quadriceps femoris), but articularis genu is anatomically discrete from the quadriceps (sometimes referred to as the 'fifth quadriceps muscle' but not part of the named quadriceps complex).", + "suggestion": "Fell back to UBERON:0004252 (hindlimb stylopod muscle; synonyms 'muscle of thigh', 'thigh muscle') as parent per workflow instructions. Curator may consider creating a new UBERON term 'muscle of anterior compartment of thigh' (FMA:22424) as an intermediate parent in a future batch." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46583.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46583.json new file mode 100644 index 000000000..2871c01d5 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46583.json @@ -0,0 +1,18 @@ +{ + "resolved_parents": { + "_parent_FMA:46583": "UBERON:0008575" + }, + "xrefs": { + "aryepiglottic part of oblique arytenoid muscle": "FMA:46602|Wikipedia:Aryepiglottic_muscle" + }, + "confirmed_matches": [ + { + "label": "aryepiglottic part of oblique arytenoid muscle", + "uberon_id": "UBERON:0011025", + "confidence": "high", + "uberon_definition": "The aryepiglotticus is a muscle of the larynx running in the aryepiglottic fold from the arytenoid cartilage to the epiglottis.", + "wikipedia_summary": "The aryepiglotticus muscle (aryepiglottic muscle) is a muscle of the larynx that runs within the aryepiglottic fold, from the arytenoid cartilage to the epiglottis. It is sometimes described as a separate muscle but is often considered the most superficial fibres of the oblique arytenoid muscle that are prolonged into the aryepiglottic fold. Together with the transverse arytenoid and thyroarytenoid muscles it acts as a sphincter to close the larynx during swallowing or coughing.", + "note": "UBERON:0011025 already carries the FMA:46602 xref and the exact synonym 'ary-epiglottic part of oblique arytenoid' [FMA:46602]. It is asserted as part_of UBERON:0008575 (oblique arytenoid), which is precisely the relationship the NTR requested. The proposed NTR label is a near-identical variant of the existing FMA-sourced synonym; this is a confirmed exact-structure match. The proposed parent FMA:46583 (oblique arytenoid muscle) maps to UBERON:0008575 (oblique arytenoid), confirmed via xref FMA:46583 on that UBERON term." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0000975.json b/bulk_ntr_workflow/outputs/definitions/uberon_0000975.json new file mode 100644 index 000000000..dff80823b --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0000975.json @@ -0,0 +1,25 @@ +{ + "confirmed_matches": [ + { + "label": "costal part of respiratory diaphragm muscle", + "uberon_id": "UBERON:0035831", + "confidence": "high", + "uberon_definition": "The domain of the diaphragm that is a thin domed sheet of muscle composed of a radial array of myofibers extending laterally from the ribs and medially to a central tendon.", + "wikipedia_summary": "The costal part of the diaphragm originates from the inner surfaces of the lower six ribs and their costal cartilages and inserts into the central tendon of the diaphragm. Its radial myofibers converge towards the central tendon and are responsible for the primary movement of the diaphragm during respiration.", + "uberon_label": "costal diaphragm", + "matched_via_synonym": "costal part of diaphragm (EXACT, FMA:58277)", + "fma_xref": "FMA:58277", + "note": "The requested label 'costal part of respiratory diaphragm muscle' is the TA2-style fuller name for the same structure. UBERON's term 'costal diaphragm' (UBERON:0035831) carries 'costal part of diaphragm' as an EXACT synonym with FMA:58277, and the diaphragm itself (UBERON:0001103) carries 'diaphragm muscle' as an EXACT synonym. Definitions describe identical structure (radial myofibers from ribs to central tendon)." + } + ], + "resolved_parents": { + "costal part of respiratory diaphragm muscle": "UBERON:0001103" + }, + "unresolvable": [ + { + "label": "costal part of respiratory diaphragm muscle", + "reason": "Source-supplied parent UBERON:0000975 is 'sternum' (an endochondral skeletal element, is_a 'endochondral element'), which is the wrong anatomical domain for a part of the diaphragm muscle. The correct parent is UBERON:0001103 'diaphragm' (a skeletal muscle organ, with synonym 'diaphragm muscle').", + "suggestion": "Term already exists as UBERON:0035831 'costal diaphragm' (synonym: 'costal part of diaphragm', FMA:58277), part_of UBERON:0001103. Exclude from the template via confirmed_matches; no NTR needed. Curator should note the upstream HRA ASCT+B parent mapping error (UBERON:0000975 sternum) for feedback." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0001572.json b/bulk_ntr_workflow/outputs/definitions/uberon_0001572.json new file mode 100644 index 000000000..2295003bb --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0001572.json @@ -0,0 +1,28 @@ +{ + "confirmed_matches": [ + { + "label": "ceratoglossus of hyoglossus muscle", + "uberon_id": "UBERON:0008428", + "confidence": "high", + "uberon_definition": "Main, posterior part of hyoglossus muscle (vs. chondroglossus) arising from the greater horn of the hyoid bone.", + "wikipedia_summary": "The ceratoglossus is the main posterior portion of the hyoglossus muscle, arising from the greater horn (cornu) of the hyoid bone and inserting into the side of the tongue. It is described in standard anatomy references as the principal component of the hyoglossus, distinguished from the chondroglossus which arises from the lesser horn.", + "uberon_label": "ceratoglossus", + "uberon_synonyms": ["ceratoglossus muscle", "musculus ceratoglossus"], + "uberon_xrefs": ["FMA:46720"], + "uberon_relationship": "part_of UBERON:0001572 (hyoglossus muscle)", + "note": "Existing UBERON term ceratoglossus (UBERON:0008428) is part_of hyoglossus muscle (UBERON:0001572) with FMA:46720 xref, exactly matching the source term 'ceratoglossus of hyoglossus muscle'. Source label is effectively a verbose synonym of the existing UBERON term; curator may consider adding the source label as a related synonym." + }, + { + "label": "chondroglossus of hyoglossus muscle", + "uberon_id": "UBERON:0011535", + "confidence": "high", + "uberon_definition": "The Chondroglossus is sometimes described as a part of the Hyoglossus, but is separated from it by fibers of the Genioglossus, which pass to the side of the pharynx. It is about 2 cm. long, and arises from the medial side and base of the lesser cornu and contiguous portion of the body of the hyoid bone, and passes directly upward to blend with the intrinsic muscular fibers of the tongue, between the Hyoglossus and Genioglossus.", + "wikipedia_summary": "The chondroglossus is a small (~2 cm) tongue muscle that arises from the medial side and base of the lesser cornu of the hyoid bone and ascends to blend with the intrinsic muscular fibres of the tongue. It is sometimes described as a part of the hyoglossus but is separated from it by fibres of the genioglossus.", + "uberon_label": "chondroglossus muscle", + "uberon_synonyms": ["chondroglossal", "chondroglossal muscle", "chondroglossus", "musculus chondroglossus"], + "uberon_xrefs": ["FMA:46700", "SCTID:244787000", "Wikipedia:Chondroglossus"], + "uberon_relationship": "part_of UBERON:0001572 (hyoglossus muscle)", + "note": "Existing UBERON term chondroglossus muscle (UBERON:0011535) is part_of hyoglossus muscle (UBERON:0001572) with FMA:46700 xref, exactly matching the source term 'chondroglossus of hyoglossus muscle'. Source label is effectively a verbose synonym; curator may consider adding the source label as a related synonym." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json b/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json new file mode 100644 index 000000000..6279c09b3 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json @@ -0,0 +1,17 @@ +{ + "definitions": { + "clavicular head of pectoralis major muscle": "A muscle head that is part of the pectoralis major muscle, originating from the anterior surface of the medial half of the clavicle. Its fibres pass obliquely downward and laterally to converge with those of the sternocostal head, contributing the anterior lamina of the broad flat tendon that inserts onto the lateral lip of the intertubercular groove of the humerus, and is innervated by the lateral pectoral nerve (C5-C6)." + }, + "xrefs": { + "clavicular head of pectoralis major muscle": "FMA:34687" + }, + "def_xrefs_to_add": { + "clavicular head of pectoralis major muscle": "PMID:30252247|PMID:31061824" + }, + "resolved_relationships": { + "clavicular head of pectoralis major muscle": "part_of" + }, + "resolved_parents": { + "clavicular head of pectoralis major muscle": "UBERON:0002381" + } +} diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json new file mode 100644 index 000000000..87072a1b1 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json @@ -0,0 +1,24 @@ +{ + "definitions": { + "dorsal part of intertransversarii laterales lumborum muscle": "A skeletal muscle bundle that is the posterior (dorsal) portion of the lateral intertransversarii muscles of the lumbar region, connecting the accessory processes of one lumbar vertebra to the transverse process of the adjacent vertebra; it acts to stabilise the lumbar vertebral column and assist lateral flexion." + }, + "xrefs": { + "dorsal part of intertransversarii laterales lumborum muscle": "Wikipedia:Intertransversarii" + }, + "def_xrefs_to_add": { + "dorsal part of intertransversarii laterales lumborum muscle": "doi:10.1007/BF00518810" + }, + "resolved_relationships": { + "dorsal part of intertransversarii laterales lumborum muscle": "part_of" + }, + "resolved_parents": { + "dorsal part of intertransversarii laterales lumborum muscle": "UBERON:0008242" + }, + "unresolvable": [ + { + "label": "dorsal part of intertransversarii laterales lumborum muscle", + "reason": "Source-supplied parent 'meningohypophyseal artery' is wrong-domain (an artery cannot be parent of a muscle subdivision). No UBERON term exists for the parent muscle 'intertransversarii laterales lumborum muscle' itself - the most specific available ancestor is UBERON:0008242 (lower back muscle). Ideally a parent term 'lateral intertransversarii lumborum muscle' should be added first, with this term as its dorsal subdivision (part_of).", + "suggestion": "Use UBERON:0008242 (lower back muscle) as the part_of parent for now. Curator should consider adding intermediate parent term 'lateral intertransversarii lumborum muscle' (FMA:32576 if available) and re-parenting this term as part_of that intermediate term. Note that 'dorsal part of' implies a subdivision, hence part_of relationship rather than is_a." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json new file mode 100644 index 000000000..00bf00c32 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json @@ -0,0 +1,24 @@ +{ + "definitions": { + "anterior cervical intertransversarii muscle": "A small segmental back muscle that arises from the anterior tubercle of the transverse process of one cervical vertebra and inserts on the anterior tubercle of the transverse process of the adjacent cervical vertebra, contributing to lateral flexion and proprioceptive stabilisation of the cervical spine." + }, + "xrefs": { + "anterior cervical intertransversarii muscle": "Wikipedia:Intertransversarii|FMA:71442" + }, + "def_xrefs_to_add": { + "anterior cervical intertransversarii muscle": "PMID:12650404" + }, + "resolved_relationships": { + "anterior cervical intertransversarii muscle": "is_a" + }, + "resolved_parents": { + "anterior cervical intertransversarii muscle": "UBERON:0002324" + }, + "unresolvable": [ + { + "label": "segmental back muscle", + "reason": "Source parent label 'segmental back muscle' is not present in UBERON as a distinct class. The anterior cervical intertransversarii muscles span the transverse processes of adjacent cervical vertebrae and are classified as deep (segmental) back muscles in standard anatomy; the closest existing UBERON parent is UBERON:0002324 (muscle of back).", + "suggestion": "Use UBERON:0002324 (muscle of back) as the is_a parent. A more specific intermediate class such as 'segmental muscle of back' or 'deep muscle of back' could be added in future curation; 'musculature of neck' (UBERON:0004465) would be an alternative grouping for the cervical-region member but the source intent points to back musculature." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/template_groups_initial.tsv b/bulk_ntr_workflow/outputs/template_groups_initial.tsv new file mode 100644 index 000000000..1b6fe7e77 --- /dev/null +++ b/bulk_ntr_workflow/outputs/template_groups_initial.tsv @@ -0,0 +1,4 @@ +ID LABEL Definition def_xref genus location In_subset Date Contributor Present_in_taxon Wikipedia_image xref +ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| EC % EC BFO:0000050 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| +http://purl.obolibrary.org/obo/UBERON_9900002 anterior vertebral muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-vertebral-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900007 circular pharyngeal muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_circular-pharyngeal-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 diff --git a/bulk_ntr_workflow/outputs/template_initial.tsv b/bulk_ntr_workflow/outputs/template_initial.tsv new file mode 100644 index 000000000..d8cb71843 --- /dev/null +++ b/bulk_ntr_workflow/outputs/template_initial.tsv @@ -0,0 +1,10 @@ +ID LABEL Definition def_xref is_a part_of In_subset Date Contributor Present_in_taxon Wikipedia_image xref +ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| SC % SC BFO:0000050 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| +http://purl.obolibrary.org/obo/UBERON_9900001 anterior cervical intertransversarii muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle UNRESOLVABLE:segmental back muscle UNRESOLVABLE:segmental back muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900003 articularis genu muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle NEEDS_MAPPING:FMA:22424 NEEDS_MAPPING:FMA:22424 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900004 aryepiglottic part of oblique arytenoid muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_aryepiglottic-part-of-oblique-arytenoid-muscle NEEDS_MAPPING:FMA:46583 NEEDS_MAPPING:FMA:46583 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900005 ceratoglossus of hyoglossus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_ceratoglossus-of-hyoglossus-muscle INFER:UBERON:0001572 INFER:UBERON:0001572 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900006 chondroglossus of hyoglossus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_chondroglossus-of-hyoglossus-muscle INFER:UBERON:0001572 INFER:UBERON:0001572 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900008 clavicular head of pectoralis major muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle INFER:UBERON:0002381 INFER:UBERON:0002381 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900009 costal part of respiratory diaphragm muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_costal-part-of-respiratory-diaphragm-muscle INFER:UBERON:0000975 INFER:UBERON:0000975 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900010 dorsal part of intertransversarii laterales lumborum muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle UNRESOLVABLE:meningohypophyseal artery UNRESOLVABLE:meningohypophyseal artery http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 diff --git a/hra_unmapped-asct-term-list-with-refs.xlsx b/hra_unmapped-asct-term-list-with-refs.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e504f74ee29c9b11c027ea9765f5c084da84bce4 GIT binary patch literal 277563 zcmeEv2|QJ8+i$Z>DTyRWrVLRTOYA6xGGxw7A#=#g-pLe_nGm}qGS4%6mmx(c^Slk2 zhaDRmdpe7r_k8bnzH`dz_x7Eh@71qmt-aPgUDy8}uJymK`(Da7cJHCvv48*m9s5Ni zb$9&JzoWplit4_~3v|EzfS zzz~NGQ&>pDfmi*|FY+Sh?mJIdH$v9XO*RjTSFai$_F$XNr`_vzq;Nrx?Eu=gAnLT( zqb@`5`fIwObvC#{M&YcM%G6VH?)s_uhdiIuXv=FzTpT)2HQ823{q)jvdNi zRe63}mH#SL3T~_NU!_W+ZB_oOR4Kfz%72wAMYdJ>uTrJxwkrQssubH+<-bam7q(UT ztEzOiwYPM*XJYceL16Rr-9#VgvuC;x{&1M9+gW)M!J)A$z`JI#_VWR4M0fYo*n|Yj z;;Xl*ZX`cSrXj4{2vet{xSU5!44N-~oym9B?(~qV%nShqm4N8swXBL8m#4?`%i?tP z`81qoaAVUmO=C!+^NLPsW%vAe25zm*t*EpN?~qr8@AD_QksPYliamAtoEUI>GUl4b zMs2W*^XqQz*ix57+ni2;pbnxq%}f);@&zB*xy&51#YcCic^z!A{Z8qygCNXbXIfWH3}%gk~~7t*5)S@v8vkzf9f zng0QTr-L2VvqA@g;*U09amG#EceO*hJcGe{J#`@jcUPo)KP;<^_JSvYWd@#VSatC( zQU_v9L$Zl*?9$V}B%oPOYKAcrahO$RoRblO)?6U0jbou+rKw z?00t;U3jXdK>Oay$Lftpecp5{qv%=hc+9Ki$S=(2*M&ykvfDI=%-p^F;t(#6+usT! z5=L{bWa7?xlQ<+-iAC(hc|W07Qz*yY_q8<_J*_Oqc>0jjs!VM+6=Ry-Hc2|i2&XpM zC}CL;eKCUr>z3HH0C(+5uKGPwK2|~*SDD&_>&EwnC7&GOGLf;kEtK;(`AAxFta@8%C3}^SLgH7A289qh zHp{cuk$$sz?534HZTyp~1No1Nj@KO*uA+!u&fp+-C47=4+`Nr^)@2KXgU)jEIc

bk=bYbRc_C2va{}{4!Pd|g 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 lf1lL-yVB^GA^$d!SCWMS%{c%7a?s}A oboInOwl:hasDbXref SPLIT=| EC % EC BFO:0000050 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| diff --git a/src/templates/hra-muscular-reports/candidates.tsv b/src/templates/hra-muscular-reports/candidates.tsv new file mode 100644 index 000000000..84e6f1102 --- /dev/null +++ b/src/templates/hra-muscular-reports/candidates.tsv @@ -0,0 +1,7 @@ +label as_iri uberon_id note +circular pharyngeal muscle UBERON:0001569 confirmed_match (confidence: high) +aryepiglottic part of oblique arytenoid muscle UBERON:0011025 confirmed_match (confidence: high) +costal part of respiratory diaphragm muscle UBERON:0035831 confirmed_match (confidence: high) +ceratoglossus of hyoglossus muscle UBERON:0008428 confirmed_match (confidence: high) +chondroglossus of hyoglossus muscle UBERON:0011535 confirmed_match (confidence: high) +anterior vertebral muscle UBERON:0008549 possible_match (UBERON:0008549 'prevertebral muscle' has the same definition (one of the muscles deep to the prevertebral fascia... including the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis). Synonym 'flexor muscle of vertebral column'. The TA2 term 'anterior vertebral muscle' is a synonymous regional grouping. Curator should confirm whether to map directly to UBERON:0008549, to its child UBERON:0017647 'prevertebral muscle of neck', or add as RELATED synonym. Definition uses attaches_to + innervated_by axioms (multi-axiom pattern), not the simple genus + part_of pattern, so this would be out of scope for the EC template even if added as a new term.) diff --git a/src/templates/hra-muscular-reports/errors.tsv b/src/templates/hra-muscular-reports/errors.tsv new file mode 100644 index 000000000..7717647e6 --- /dev/null +++ b/src/templates/hra-muscular-reports/errors.tsv @@ -0,0 +1,5 @@ +label as_iri issue_type parent_id parent_label detail +anterior cervical intertransversarii muscle https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle Parent not yet in UBERON; subagent should search OLS4 for correct parent +articularis genu muscle https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle fma_parent FMA:22424 Muscle of anterior compartment of thigh Subagent should resolve FMA→UBERON via OLS4 +aryepiglottic part of oblique arytenoid muscle https://purl.org/ccf/ASCTB-TEMP_aryepiglottic-part-of-oblique-arytenoid-muscle fma_parent FMA:46583 Oblique arytenoid Subagent should resolve FMA→UBERON via OLS4 +dorsal part of intertransversarii laterales lumborum muscle https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_meningohypophyseal-artery meningohypophyseal artery Parent not yet in UBERON; subagent should search OLS4 for correct parent diff --git a/src/templates/hra-muscular-reports/input.tsv b/src/templates/hra-muscular-reports/input.tsv new file mode 100644 index 000000000..ef5a62910 --- /dev/null +++ b/src/templates/hra-muscular-reports/input.tsv @@ -0,0 +1,11 @@ +table as_iri label uberon_id parent_id parent_label references term_type +muscular-system https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle anterior cervical intertransversarii muscle https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_anterior-vertebral-muscle anterior vertebral muscle UBERON:0002377 muscle of neck https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle articularis genu muscle http://purl.org/sig/ont/fma/fma22424 Muscle of anterior compartment of thigh https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_aryepiglottic-part-of-oblique-arytenoid-muscle aryepiglottic part of oblique arytenoid muscle http://purl.org/sig/ont/fma/fma46583 Oblique arytenoid https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_ceratoglossus-of-hyoglossus-muscle ceratoglossus of hyoglossus muscle UBERON:0001572 hyoglossus muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_chondroglossus-of-hyoglossus-muscle chondroglossus of hyoglossus muscle UBERON:0001572 hyoglossus muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_circular-pharyngeal-muscle circular pharyngeal muscle UBERON:0002377 muscle of neck https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle clavicular head of pectoralis major muscle UBERON:0002381 pectoralis major https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_costal-part-of-respiratory-diaphragm-muscle costal part of respiratory diaphragm muscle UBERON:0000975 sternum https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle dorsal part of intertransversarii laterales lumborum muscle https://purl.org/ccf/ASCTB-TEMP_meningohypophyseal-artery meningohypophyseal artery https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf diff --git a/src/templates/hra-muscular-reports/manual_curation.tsv b/src/templates/hra-muscular-reports/manual_curation.tsv new file mode 100644 index 000000000..b55e48338 --- /dev/null +++ b/src/templates/hra-muscular-reports/manual_curation.tsv @@ -0,0 +1,2 @@ +label definition reason similar_terms suggestion +anterior vertebral muscle A group of muscles deep to the prevertebral fascia on the anterior surface of the cervical and superior thoracic vertebrae, comprising the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis muscles; innervated by anterior rami of cervical spinal nerves; functions in flexion of the head and neck. The closest existing UBERON term is UBERON:0008549 (prevertebral muscle) which uses 'is_a + attaches_to + innervated_by' axioms — NOT the simple genus + part_of pattern supported by the groups template. If treated as a confirmed/possible match instead, no new term is needed. Curator should decide between mapping to UBERON:0008549 vs creating 'anterior vertebral muscle' as a synonym. UBERON:0008549=prevertebral muscle; UBERON:0017647=prevertebral muscle of neck Most likely outcome: add 'anterior vertebral muscle' as RELATED synonym to UBERON:0008549, no new term needed. diff --git a/src/templates/hra-muscular.template.tsv b/src/templates/hra-muscular.template.tsv new file mode 100644 index 000000000..4bd25c3ea --- /dev/null +++ b/src/templates/hra-muscular.template.tsv @@ -0,0 +1,6 @@ +ID LABEL Definition def_xref is_a part_of In_subset Date Contributor Present_in_taxon Wikipedia_image xref +ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| SC % SC BFO:0000050 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| +http://purl.obolibrary.org/obo/UBERON_9900001 anterior cervical intertransversarii muscle A small segmental back muscle that arises from the anterior tubercle of the transverse process of one cervical vertebra and inserts on the anterior tubercle of the transverse process of the adjacent cervical vertebra, contributing to lateral flexion and proprioceptive stabilisation of the cervical spine. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle|PMID:12650404 UBERON:0002324 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii|FMA:71442 +http://purl.obolibrary.org/obo/UBERON_9900003 articularis genu muscle A skeletal muscle of the anterior compartment of the thigh that arises from the anterior surface of the lower body of the femur, deep to the vastus intermedius, and inserts onto the synovial membrane of the knee joint, retracting the suprapatellar bursa superiorly during knee extension and preventing impingement of the synovium between the patella and femur. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle|PMID:30229230|PMID:33215156 UBERON:0004252 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Gray244.png/512px-Gray244.png Wikipedia:Articularis_genus_muscle|FMA:22437 +http://purl.obolibrary.org/obo/UBERON_9900008 clavicular head of pectoralis major muscle A muscle head that is part of the pectoralis major muscle, originating from the anterior surface of the medial half of the clavicle. Its fibres pass obliquely downward and laterally to converge with those of the sternocostal head, contributing the anterior lamina of the broad flat tendon that inserts onto the lateral lip of the intertubercular groove of the humerus, and is innervated by the lateral pectoral nerve (C5-C6). https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle|PMID:30252247|PMID:31061824 UBERON:0002381 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 FMA:34687 +http://purl.obolibrary.org/obo/UBERON_9900010 dorsal part of intertransversarii laterales lumborum muscle A skeletal muscle bundle that is the posterior (dorsal) portion of the lateral intertransversarii muscles of the lumbar region, connecting the accessory processes of one lumbar vertebra to the transverse process of the adjacent vertebra; it acts to stabilise the lumbar vertebral column and assist lateral flexion. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle|doi:10.1007/BF00518810 UBERON:0008242 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii From 3ad9844689f0c9bd63164e3159da0a3ee72ba952 Mon Sep 17 00:00:00 2001 From: David Osumi-Sutherland Date: Tue, 28 Apr 2026 11:17:07 +0100 Subject: [PATCH 02/22] Leaf flow: look up genus + part_of via obo-grep instead of single-column assignment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously the agent picked is_a OR part_of and put the resolved parent in one column, leaving the other empty. UBERON convention for specific named structures is to populate BOTH — e.g. vastus lateralis (UBERON:0001379) has 'is_a UBERON:0001630 (muscle organ)' AND 'relationship: part_of UBERON:0001377 (quadriceps femoris)'. ntr-term-researcher.md changes: - Step 7 rewritten: agent now uses awk over uberon-edit.obo to find similar specific UBERON terms, identifies the genus class (typically muscle organ UBERON:0001630, muscle head UBERON:0011906) AND the part_of containing structure, then populates leaf_template_rows[label] = {is_a, part_of} - Worked examples included (clavicular head, articularis genu, dominant follicle subtypes) - Explicit warning: do NOT just take the source parent and assign it to one column; the source parent is often too broad to serve as the genus - Output JSON gains leaf_template_rows key (analogous to group_template_rows) - Quality checks updated: prefer leaf_template_rows; both is_a and part_of should be populated when applicable merge_definitions.py changes: - load_subagent_outputs reads leaf_template_rows - merge_leaf_template uses leaf_template_rows first; falls back to legacy resolved_relationships + resolved_parents if absent (backward compatible) - New counter 'leaf_template_rows used' in summary output Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/agents/ntr-term-researcher.md | 136 +++++++++++++----- .../scripts/merge_definitions.py | 72 ++++++---- 2 files changed, 141 insertions(+), 67 deletions(-) diff --git a/.claude/agents/ntr-term-researcher.md b/.claude/agents/ntr-term-researcher.md index bb1e8b73e..0ef799ce9 100644 --- a/.claude/agents/ntr-term-researcher.md +++ b/.claude/agents/ntr-term-researcher.md @@ -183,40 +183,81 @@ For each term without a confirmed existing UBERON match: - Where members are known and bounded, enumerate: "...comprising the X, Y, and Z." - Length still 20–60 words. -## Step 7: Resolve Relationship Types (LEAF terms only) - -For each `term_type: "leaf"` term, determine whether it should be `is_a` or `part_of` the -resolved parent: - -**Use `part_of` when the term is a physical subdivision of the parent:** -- Named **layer**, zone, region, wall, surface, border, lumen, stroma, cortex, medulla -- Named **head**, belly, compartment, lobe, segment, fascicle of a specific named structure -- Any term where the phrase "is **contained within**", "is **a subdivision of**", or - "is **a layer of**" the parent is correct -- Examples: `corpus luteum granulosa lutein layer` **part_of** corpus luteum; - `clavicular head of pectoralis major` **part_of** pectoralis major; - `costal part of diaphragm` **part_of** diaphragm; - `cumulus oophorus oocyte complex` **part_of** antral follicle - -**Use `is_a` when the term is a classification type within the parent category:** -- The parent is a **grouping class** (e.g. "muscle of neck", "ovarian follicle stage", - "cranial muscle") and the term is a **member of that category** -- The term can be truly described as "IS A [parent]" — i.e. it has all properties of the - parent and adds further specificity -- Examples: `anterior vertebral muscle` **is_a** muscle of neck; - `primary ovarian follicle` **is_a** ovarian follicle; - `dominant antral follicle` **is_a** antral follicle - -**Quick test**: ask "Is a [term] a kind of [parent]?" (→ `is_a`) vs "Is a [term] inside/part -of a [parent]?" (→ `part_of`). When in doubt, prefer `part_of` for physically bounded -sub-structures and `is_a` for stages or functional subtypes. - -If unclear after applying these rules: search `ols4` for existing children of the same parent -and check the relationship type they use; apply the same pattern. - -Record each decision in `resolved_relationships`. (Skip for `term_type: "group"` — -relationships for those are encoded as `genus + part_of some Y` equivalent classes; -see Step 8.) +## Step 7: Resolve genus AND part_of for LEAF terms + +For each `term_type: "leaf"` term, look up how UBERON defines similar specific structures +to determine BOTH a genus (`is_a`) class AND a `part_of` containing structure. UBERON +convention typically populates both for specific named anatomical entities — e.g. +`vastus lateralis` has `is_a: UBERON:0001630 ! muscle organ` AND +`relationship: part_of UBERON:0001377 ! quadriceps femoris`. + +**Procedure:** + +1. Use awk over `src/ontology/uberon-edit.obo` to find similar specific UBERON terms. + Examples for muscle subdivisions: + ```bash + awk 'BEGIN{RS=""} /\nname: .*head of .*muscle/' src/ontology/uberon-edit.obo + awk 'BEGIN{RS=""} /\nname: .*part of .*muscle/' src/ontology/uberon-edit.obo + awk 'BEGIN{RS=""} /\nname: .*belly of/' src/ontology/uberon-edit.obo + awk 'BEGIN{RS=""} /\nid: UBERON:0001379\n/' src/ontology/uberon-edit.obo # vastus lateralis + ``` + +2. From similar terms, extract the genus pattern. Common UBERON genus classes for + muscle leaf terms: + - `UBERON:0001630` muscle organ — for whole named individual muscles (e.g. articularis + genu, longus capitis, vastus lateralis) + - `UBERON:0011906` muscle head — for named heads of muscles (clavicular head, long + head, short head) + - `UBERON:0014892` skeletal muscle organ, vertebrate — for skeletal muscles when a + more specific class is unavailable + - `UBERON:0014892` or domain-specific (e.g. `UBERON:0001135` smooth muscle organ) + for non-skeletal cases + +3. From similar terms, extract the part_of pattern. Common targets: + - For "X head/belly/part of Y muscle" → part_of the named parent muscle Y + - For named muscles in a region → part_of the region (e.g. neck, thigh, + anterior compartment) + - For named segmental muscles → part_of the relevant region (cervical vertebral + column, lumbar region, etc.) + +4. Emit a `leaf_template_rows[label]` entry with `{"is_a": "UBERON:...", "part_of": + "UBERON:..."}`. **Both columns should be populated when applicable.** + - Set `is_a` only (omit `part_of`) for classification subtypes that don't have a + containing structure (e.g. `dominant antral follicle is_a antral follicle` — no + additional part_of needed beyond what the genus class implies). + - Set `part_of` only (omit `is_a` or use a very generic genus) when the term is + purely a subdivision and no specific genus class is available. + +5. The legacy `resolved_relationships` + `resolved_parents` keys are still accepted as + a fallback but `leaf_template_rows` is preferred — it expresses both axes + simultaneously. + +**Worked examples:** + +- `clavicular head of pectoralis major muscle`: + - Look up similar: UBERON:0007168 (long head of biceps brachii), UBERON:0007169 (short + head of biceps brachii) → both use `is_a: UBERON:0011906 ! muscle head` and + `relationship: part_of `. + - Emit: `{"is_a": "UBERON:0011906", "part_of": "UBERON:0002381"}` + +- `articularis genu muscle`: + - Look up similar: vastus lateralis (UBERON:0001379) uses + `is_a: UBERON:0001630 ! muscle organ` + `part_of UBERON:0001377 ! quadriceps femoris`. + - For articularis genu, the analogous part_of would be the thigh region (or anterior + compartment of thigh if a UBERON term exists for it). Emit: + `{"is_a": "UBERON:0001630", "part_of": "UBERON:0004252"}` (or more specific). + +- `costal part of respiratory diaphragm muscle`: similar UBERON pattern is to use a + domain part as `part_of` plus a generic genus. Already a confirmed match in this + case (UBERON:0035831), so this term is excluded from the leaf template. + +- `dominant antral follicle` (a stage/subtype, no spatial part_of beyond the parent): + emit `{"is_a": "UBERON:0000035"}` only — omit `part_of`. + +**Important — DO NOT just take the supplied source parent and assign it to one column.** +Look at similar UBERON terms first; the source parent is often too broad (a grouping class) +to serve as the genus, and a more specific genus may be obvious (muscle head, muscle +organ, etc.). ## Step 8: Group term equivalent class — genus + part_of some Y (GROUP terms only) @@ -288,6 +329,12 @@ Save to: `bulk_ntr_workflow/outputs/definitions/{group_name}.json` "def_xrefs_to_add": { "term label": "PMID:12345678|PMID:87654321" }, + "leaf_template_rows": { + "leaf term label": { + "is_a": "UBERON:0011906", + "part_of": "UBERON:0002381" + } + }, "resolved_relationships": { "leaf term label": "is_a | part_of" }, @@ -361,17 +408,28 @@ Omit empty lists/dicts. Do NOT include a `fma_resolutions` key — use `resolved - Every confirmed match must have both a UBERON definition and Wikipedia/literature evidence. - Every new term must have at least one real PMID/DOI in `def_xrefs_to_add` or in the existing `def_xref` input field (ASCTB-TEMP placeholders do not count as real references). -- `resolved_relationships` values must be `"is_a"` or `"part_of"` only. -- `resolved_parents` values must be real UBERON IDs retrieved from OLS4 — never guessed. -- Layers, zones, heads, bellies, parts of named structures → must be `part_of`, never `is_a`. +- For LEAF terms: prefer emitting `leaf_template_rows[label]` with both `is_a` and + `part_of` populated. Look up similar UBERON terms via awk over uberon-edit.obo to + find the right genus class — do NOT just assign the source parent to one column. +- `leaf_template_rows[label].is_a` should be a genus class (e.g. UBERON:0001630 muscle + organ, UBERON:0011906 muscle head), not a regional grouping class. +- `leaf_template_rows[label].part_of` should be the containing structure (parent muscle, + body region, compartment). +- For backward compatibility, `resolved_relationships` (values `"is_a"` or `"part_of"`) + + `resolved_parents` may still be used; merge will fall back to these if + `leaf_template_rows` is absent. +- All UBERON ID values must be real UBERON IDs retrieved from OLS4 or uberon-edit.obo — + never guessed. +- Layers, zones, heads, bellies, parts of named structures → MUST have `part_of` + populated to the named parent structure. - Pathological/dysfunctional terms → must appear in `out_of_scope`. - Non-standard names → must appear in `name_corrections`. - **For `term_type: "group"` terms**: every term must end up in EITHER `group_template_rows` (with both `genus` and `location` populated as real UBERON IDs) OR `manual_curation` (with proposed definition + similar UBERON terms). No group term should be silently absent from both. -- `resolved_relationships` and `resolved_parents` apply to LEAF terms only — do not emit - these keys for group terms. +- `leaf_template_rows`, `resolved_relationships`, `resolved_parents` apply to LEAF terms + only — do not emit these keys for group terms. - Do NOT invent UBERON IDs. ## Tools Available diff --git a/bulk_ntr_workflow/scripts/merge_definitions.py b/bulk_ntr_workflow/scripts/merge_definitions.py index d24f97152..063834692 100644 --- a/bulk_ntr_workflow/scripts/merge_definitions.py +++ b/bulk_ntr_workflow/scripts/merge_definitions.py @@ -87,8 +87,9 @@ def load_subagent_outputs() -> dict: out = { "definitions": {}, "images": {}, - "relationships": {}, - "resolved_parents": {}, + "relationships": {}, # legacy fallback: label → "is_a" | "part_of" + "resolved_parents": {}, # legacy fallback: label → "UBERON:xxxxxxx" + "leaf_template_rows": {}, # label → {"is_a": "UBERON:...", "part_of": "UBERON:..."} "xrefs": {}, # label → pipe-sep xref (Wikipedia URL + FMA ID) "def_xrefs_extra": {}, # label → PMIDs/DOIs to append to def_xref column "group_template_rows": {}, # label → {"genus": "...", "location": "..."} @@ -110,6 +111,7 @@ def load_subagent_outputs() -> dict: out["images"].update(data.get("wikipedia_images", {})) out["relationships"].update(data.get("resolved_relationships", {})) out["resolved_parents"].update(data.get("resolved_parents", {})) + out["leaf_template_rows"].update(data.get("leaf_template_rows", {})) out["xrefs"].update(data.get("xrefs", {})) out["def_xrefs_extra"].update(data.get("def_xrefs_to_add", {})) out["group_template_rows"].update(data.get("group_template_rows", {})) @@ -192,10 +194,16 @@ def get(d: dict): def merge_leaf_template(input_tsv: Path, final_tsv: Path, sub: dict, excluded_labels: set, out_of_scope_labels: set, name_correction_map: dict, manual_curation_labels: set) -> dict: - """Merge subagent outputs into the leaf template. Returns a counters dict.""" + """Merge subagent outputs into the leaf template. Returns a counters dict. + + Resolution priority for is_a / part_of columns: + 1. leaf_template_rows[label] = {is_a, part_of} — preferred (both axes) + 2. resolved_relationships + resolved_parents — legacy single-column form + 3. INFER:/UNRESOLVABLE:/NEEDS_MAPPING: — fall back to blank + curator review + """ counters = {"defs": 0, "images": 0, "xrefs": 0, "def_xrefs": 0, - "rels": 0, "relabelled": 0, "pending": 0, "infer": 0, - "unknown_rel": []} + "rels": 0, "leaf_rows_used": 0, "relabelled": 0, + "pending": 0, "infer": 0, "unknown_rel": []} rows = [] with open(input_tsv, newline="", encoding="utf-8") as f: reader = csv.reader(f, delimiter="\t") @@ -212,8 +220,6 @@ def merge_leaf_template(input_tsv: Path, final_tsv: Path, sub: dict, if label in excluded_labels or label in out_of_scope_labels: continue if label in manual_curation_labels: - # Should not happen for leaf (manual_curation only applies to group), - # but guard defensively. continue if label in name_correction_map: @@ -225,27 +231,36 @@ def merge_leaf_template(input_tsv: Path, final_tsv: Path, sub: dict, is_a_val = row[COL_IS_A].strip() part_of_val = row[COL_PART_OF].strip() - parent_id = (sub["resolved_parents"].get(lookup_label) - or sub["resolved_parents"].get(label) - or extract_parent_id(is_a_val) - or extract_parent_id(part_of_val)) - - rel = (sub["relationships"].get(lookup_label) - or sub["relationships"].get(label)) - if rel and parent_id: - if rel == "is_a": - row[COL_IS_A] = parent_id - row[COL_PART_OF] = "" - elif rel == "part_of": + + # Priority 1: leaf_template_rows — preferred, populates both columns + ltr = (sub["leaf_template_rows"].get(lookup_label) + or sub["leaf_template_rows"].get(label)) + if ltr: + row[COL_IS_A] = (ltr.get("is_a") or "").strip() + row[COL_PART_OF] = (ltr.get("part_of") or "").strip() + counters["leaf_rows_used"] += 1 + else: + # Priority 2: legacy resolved_relationships + resolved_parents + parent_id = (sub["resolved_parents"].get(lookup_label) + or sub["resolved_parents"].get(label) + or extract_parent_id(is_a_val) + or extract_parent_id(part_of_val)) + rel = (sub["relationships"].get(lookup_label) + or sub["relationships"].get(label)) + if rel and parent_id: + if rel == "is_a": + row[COL_IS_A] = parent_id + row[COL_PART_OF] = "" + elif rel == "part_of": + row[COL_IS_A] = "" + row[COL_PART_OF] = parent_id + counters["rels"] += 1 + elif parent_id and (is_a_val.startswith("INFER:") or + is_a_val.startswith("UNRESOLVABLE:") or + is_a_val.startswith("NEEDS_MAPPING:")): row[COL_IS_A] = "" - row[COL_PART_OF] = parent_id - counters["rels"] += 1 - elif parent_id and (is_a_val.startswith("INFER:") or - is_a_val.startswith("UNRESOLVABLE:") or - is_a_val.startswith("NEEDS_MAPPING:")): - row[COL_IS_A] = "" - row[COL_PART_OF] = "" - counters["unknown_rel"].append(row[COL_LABEL].strip()) + row[COL_PART_OF] = "" + counters["unknown_rel"].append(row[COL_LABEL].strip()) if PENDING_PATTERN.match(row[COL_DEF].strip()): counters["pending"] += 1 @@ -371,7 +386,8 @@ def process(name: str) -> None: print(f" Xrefs added: {leaf_counters['xrefs']}") print(f" def_xref refs appended: {leaf_counters['def_xrefs']}") print(f" Labels corrected: {leaf_counters['relabelled']}") - print(f" Relationships resolved: {leaf_counters['rels']}") + print(f" leaf_template_rows used:{leaf_counters['leaf_rows_used']}") + print(f" Relationships resolved (legacy): {leaf_counters['rels']}") print(f" Still [PENDING] defs: {leaf_counters['pending']}") print(f" Still INFER: {leaf_counters['infer']}") print(f" Relationship unresolved:{len(leaf_counters['unknown_rel'])}") From 7385dbfd1a2a4b9384e1147c81797373c27f3e4e Mon Sep 17 00:00:00 2001 From: David Osumi-Sutherland Date: Tue, 28 Apr 2026 11:22:21 +0100 Subject: [PATCH 03/22] Re-test leaf flow with leaf_template_rows: both is_a AND part_of populated MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After updating Step 7 of the agent spec to require obo-grep lookup of similar UBERON terms before assigning the parent, re-ran the 4 leaf-term agents on the muscular-system test set. All 4 now populate both is_a and part_of columns: | Term | is_a | part_of | |-----------------------------------------------------|--------------------|-------------------| | anterior cervical intertransversarii muscle | muscle organ | neck | | articularis genu muscle | muscle organ | hindlimb stylopod | | clavicular head of pectoralis major muscle | muscle head | pectoralis major | | dorsal part of intertransversarii laterales lumborum| muscle organ | lower back muscle | Notable: clavicular head correctly resolved to is_a UBERON:0011906 (muscle head) — matching the long head of biceps brachii (UBERON:0007168) precedent. articularis genu correctly distinguished UBERON:0004252 (sibling grouping class, not container) from UBERON:0000376 (the actual containing region) by following the pectineus precedent. Stage 4 reports leaf_template_rows used=4, legacy resolved_relationships=0 — confirms the new path is exercising the proper genus+location lookup rather than the legacy single-column assignment. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../definitions/needs_mapping_fma_22424.json | 30 +++++++++++++------ .../outputs/definitions/uberon_0002381.json | 13 ++++---- ...nresolvable_meningohypophyseal_artery.json | 14 ++++++--- .../unresolvable_segmental_back_muscle.json | 20 ++++++------- .../hra-muscular-reports/candidates.tsv | 6 ++++ src/templates/hra-muscular.template.tsv | 8 ++--- 6 files changed, 59 insertions(+), 32 deletions(-) diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json index 9f29eb6ef..959379bc5 100644 --- a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json @@ -1,27 +1,39 @@ { "definitions": { - "articularis genu muscle": "A skeletal muscle of the anterior compartment of the thigh that arises from the anterior surface of the lower body of the femur, deep to the vastus intermedius, and inserts onto the synovial membrane of the knee joint, retracting the suprapatellar bursa superiorly during knee extension and preventing impingement of the synovium between the patella and femur." + "articularis genu muscle": "A muscle organ of the anterior compartment of the thigh, lying deep to the vastus intermedius, that originates from the anterior surface of the distal femur and inserts into the suprapatellar bursa and synovial membrane of the knee joint, retracting the bursa superiorly during knee extension to prevent its impingement between the patella and femur." }, "wikipedia_images": { - "articularis genu muscle": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Gray244.png/512px-Gray244.png" + "articularis genu muscle": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Gray244.png" }, "xrefs": { - "articularis genu muscle": "Wikipedia:Articularis_genus_muscle|FMA:22437" + "articularis genu muscle": "Wikipedia:Articularis_genus_muscle|FMA:22441" }, "def_xrefs_to_add": { "articularis genu muscle": "PMID:30229230|PMID:33215156" }, - "resolved_relationships": { - "articularis genu muscle": "is_a" + "leaf_template_rows": { + "articularis genu muscle": { + "is_a": "UBERON:0001630", + "part_of": "UBERON:0000376" + } }, "resolved_parents": { - "articularis genu muscle": "UBERON:0004252" + "articularis genu muscle": { + "source_parent": "NEEDS_MAPPING:FMA:22424", + "source_parent_label": "muscle of anterior compartment of thigh", + "resolved_uberon_parent_for_part_of": "UBERON:0000376", + "resolved_uberon_parent_label": "hindlimb stylopod (thigh)", + "note": "FMA:22424 (muscle of anterior compartment of thigh) has no direct UBERON equivalent. Closest UBERON grouping is UBERON:0004252 (hindlimb stylopod muscle / muscle of thigh, FMA:22470), one level broader. For part_of we use UBERON:0000376 (hindlimb stylopod / thigh) following the precedent of pectineus (UBERON:0001382), since articularis genu is a separate muscle (not anatomically a part of quadriceps femoris), though it lies deep to vastus intermedius." + } + }, + "resolved_relationships": { + "articularis genu muscle": "is_a" }, "unresolvable": [ { - "label": "parent FMA:22424 (muscle of anterior compartment of thigh)", - "reason": "No UBERON term exists with FMA:22424 as xref or with 'anterior compartment of thigh' in label/synonyms. OLS4 searches for the FMA ID and for the label text return no hits. Closest UBERON grouping for the anterior thigh compartment specifically is UBERON:0001377 (quadriceps femoris), but articularis genu is anatomically discrete from the quadriceps (sometimes referred to as the 'fifth quadriceps muscle' but not part of the named quadriceps complex).", - "suggestion": "Fell back to UBERON:0004252 (hindlimb stylopod muscle; synonyms 'muscle of thigh', 'thigh muscle') as parent per workflow instructions. Curator may consider creating a new UBERON term 'muscle of anterior compartment of thigh' (FMA:22424) as an intermediate parent in a future batch." + "label": "FMA:22424 muscle of anterior compartment of thigh", + "reason": "No UBERON term exists for the anterior compartment of thigh muscle grouping. Closest existing term is UBERON:0004252 (hindlimb stylopod muscle, FMA:22470), which is the next level up.", + "suggestion": "Curator may consider creating a UBERON term for 'muscle of anterior compartment of thigh' (FMA:22424) as a child of UBERON:0004252; for now, the leaf term uses part_of UBERON:0000376 (thigh)." } ] } diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json b/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json index 6279c09b3..bff4da36c 100644 --- a/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json @@ -1,12 +1,15 @@ { "definitions": { - "clavicular head of pectoralis major muscle": "A muscle head that is part of the pectoralis major muscle, originating from the anterior surface of the medial half of the clavicle. Its fibres pass obliquely downward and laterally to converge with those of the sternocostal head, contributing the anterior lamina of the broad flat tendon that inserts onto the lateral lip of the intertubercular groove of the humerus, and is innervated by the lateral pectoral nerve (C5-C6)." - }, - "xrefs": { - "clavicular head of pectoralis major muscle": "FMA:34687" + "clavicular head of pectoralis major muscle": "A muscle head that is the superior portion of the pectoralis major, originating from the anterior surface of the medial half of the clavicle and converging with the sternocostal head into a flat tendon inserted on the lateral lip of the intertubercular groove of the humerus; it is innervated by the lateral pectoral nerve (C5-C6) and acts to flex the humerus." }, "def_xrefs_to_add": { - "clavicular head of pectoralis major muscle": "PMID:30252247|PMID:31061824" + "clavicular head of pectoralis major muscle": "PMID:30252247|PMID:25345076" + }, + "leaf_template_rows": { + "clavicular head of pectoralis major muscle": { + "is_a": "UBERON:0011906", + "part_of": "UBERON:0002381" + } }, "resolved_relationships": { "clavicular head of pectoralis major muscle": "part_of" diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json index 87072a1b1..77f1a7b1d 100644 --- a/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json @@ -1,12 +1,18 @@ { "definitions": { - "dorsal part of intertransversarii laterales lumborum muscle": "A skeletal muscle bundle that is the posterior (dorsal) portion of the lateral intertransversarii muscles of the lumbar region, connecting the accessory processes of one lumbar vertebra to the transverse process of the adjacent vertebra; it acts to stabilise the lumbar vertebral column and assist lateral flexion." + "dorsal part of intertransversarii laterales lumborum muscle": "A muscle organ that is the posterior (dorsal) subdivision of the lateral intertransversarii lumborum, originating from the accessory process of one lumbar vertebra and inserting onto the transverse process of the consecutive lumbar vertebra; together with the ventral part it acts in ipsilateral lateral flexion and stabilisation of the lumbar spine and is innervated by the anterior rami of the lumbar spinal nerves." }, "xrefs": { "dorsal part of intertransversarii laterales lumborum muscle": "Wikipedia:Intertransversarii" }, "def_xrefs_to_add": { - "dorsal part of intertransversarii laterales lumborum muscle": "doi:10.1007/BF00518810" + "dorsal part of intertransversarii laterales lumborum muscle": "PMID:6226119" + }, + "leaf_template_rows": { + "dorsal part of intertransversarii laterales lumborum muscle": { + "is_a": "UBERON:0001630", + "part_of": "UBERON:0008242" + } }, "resolved_relationships": { "dorsal part of intertransversarii laterales lumborum muscle": "part_of" @@ -17,8 +23,8 @@ "unresolvable": [ { "label": "dorsal part of intertransversarii laterales lumborum muscle", - "reason": "Source-supplied parent 'meningohypophyseal artery' is wrong-domain (an artery cannot be parent of a muscle subdivision). No UBERON term exists for the parent muscle 'intertransversarii laterales lumborum muscle' itself - the most specific available ancestor is UBERON:0008242 (lower back muscle). Ideally a parent term 'lateral intertransversarii lumborum muscle' should be added first, with this term as its dorsal subdivision (part_of).", - "suggestion": "Use UBERON:0008242 (lower back muscle) as the part_of parent for now. Curator should consider adding intermediate parent term 'lateral intertransversarii lumborum muscle' (FMA:32576 if available) and re-parenting this term as part_of that intermediate term. Note that 'dorsal part of' implies a subdivision, hence part_of relationship rather than is_a." + "reason": "The source-supplied parent label 'meningohypophyseal artery' is wrong-domain (it is a cranial artery, not a back muscle) and clearly a data-entry error in the source mapping. The true direct parent muscle 'intertransversarii laterales lumborum muscle' (a.k.a. 'lateral intertransversarii lumborum muscles') does not exist in UBERON; the only related UBERON terms are amphibian neck intertransversarii (UBERON:3010664, UBERON:3010667).", + "suggestion": "Curator may wish to add the parent term 'lateral intertransversarii lumborum muscle' (and possibly its sibling 'medial intertransversarii lumborum muscle' and grouping 'intertransversarii lumborum') as intermediate UBERON terms, with part_of UBERON:0008242 (lower back muscle) or UBERON:0002378 (muscle of abdomen) and is_a UBERON:0001630 (muscle organ). The current row uses UBERON:0001630 as genus and UBERON:0008242 (lower back muscle) as part_of as the closest available containing structure; this should be retargeted to the new 'lateral intertransversarii lumborum muscle' term once it is created." } ] } diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json index 00bf00c32..b4d3bf83d 100644 --- a/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json @@ -1,24 +1,24 @@ { "definitions": { - "anterior cervical intertransversarii muscle": "A small segmental back muscle that arises from the anterior tubercle of the transverse process of one cervical vertebra and inserts on the anterior tubercle of the transverse process of the adjacent cervical vertebra, contributing to lateral flexion and proprioceptive stabilisation of the cervical spine." + "anterior cervical intertransversarii muscle": "A muscle organ that is one of the small, paired segmental muscles of the neck connecting the anterior tubercles of the transverse processes of two adjacent cervical vertebrae. These muscles span from C1-C2 (or C2-C3) through C7-T1, lying lateral to the longus colli muscle, are innervated by the anterior rami of the cervical spinal nerves, and contribute to lateral flexion and proprioceptive stabilisation of the cervical spine." }, "xrefs": { - "anterior cervical intertransversarii muscle": "Wikipedia:Intertransversarii|FMA:71442" + "anterior cervical intertransversarii muscle": "Wikipedia:Intertransversarii|FMA:32530" }, "def_xrefs_to_add": { - "anterior cervical intertransversarii muscle": "PMID:12650404" + "anterior cervical intertransversarii muscle": "PMID:7076562" }, - "resolved_relationships": { - "anterior cervical intertransversarii muscle": "is_a" - }, - "resolved_parents": { - "anterior cervical intertransversarii muscle": "UBERON:0002324" + "leaf_template_rows": { + "anterior cervical intertransversarii muscle": { + "is_a": "UBERON:0001630", + "part_of": "UBERON:0000974" + } }, "unresolvable": [ { "label": "segmental back muscle", - "reason": "Source parent label 'segmental back muscle' is not present in UBERON as a distinct class. The anterior cervical intertransversarii muscles span the transverse processes of adjacent cervical vertebrae and are classified as deep (segmental) back muscles in standard anatomy; the closest existing UBERON parent is UBERON:0002324 (muscle of back).", - "suggestion": "Use UBERON:0002324 (muscle of back) as the is_a parent. A more specific intermediate class such as 'segmental muscle of back' or 'deep muscle of back' could be added in future curation; 'musculature of neck' (UBERON:0004465) would be an alternative grouping for the cervical-region member but the source intent points to back musculature." + "reason": "Source ASCTB-TEMP parent label 'segmental back muscle' has no direct UBERON equivalent. The closest UBERON groupings are 'muscle of vertebral column' (UBERON:0004518), 'muscle of back' (UBERON:0002324), and 'muscle of neck' (UBERON:0002377). Since the anterior cervical intertransversarii are anteriorly located paravertebral muscles in the neck (not part of the dorsum), 'muscle of back' is anatomically inappropriate; UBERON convention for similar small named neck muscles (e.g. longus colli UBERON:0001121, rectus capitis anterior UBERON:0008453) uses is_a UBERON:0001630 (muscle organ) plus part_of UBERON:0000974 (neck).", + "suggestion": "Use is_a UBERON:0001630 (muscle organ) and part_of UBERON:0000974 (neck) as captured in leaf_template_rows. Curator may optionally re-parent under UBERON:0008549 (prevertebral muscle) or UBERON:0004518 (muscle of vertebral column) if a more specific genus is preferred." } ] } diff --git a/src/templates/hra-muscular-reports/candidates.tsv b/src/templates/hra-muscular-reports/candidates.tsv index 84e6f1102..6f5d859bd 100644 --- a/src/templates/hra-muscular-reports/candidates.tsv +++ b/src/templates/hra-muscular-reports/candidates.tsv @@ -5,3 +5,9 @@ costal part of respiratory diaphragm muscle UBERON:0035831 confirmed_match (con ceratoglossus of hyoglossus muscle UBERON:0008428 confirmed_match (confidence: high) chondroglossus of hyoglossus muscle UBERON:0011535 confirmed_match (confidence: high) anterior vertebral muscle UBERON:0008549 possible_match (UBERON:0008549 'prevertebral muscle' has the same definition (one of the muscles deep to the prevertebral fascia... including the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis). Synonym 'flexor muscle of vertebral column'. The TA2 term 'anterior vertebral muscle' is a synonymous regional grouping. Curator should confirm whether to map directly to UBERON:0008549, to its child UBERON:0017647 'prevertebral muscle of neck', or add as RELATED synonym. Definition uses attaches_to + innervated_by axioms (multi-axiom pattern), not the simple genus + part_of pattern, so this would be out of scope for the EC template even if added as a new term.) +circular pharyngeal muscle UBERON:0001569 confirmed_match (confidence: high) +aryepiglottic part of oblique arytenoid muscle UBERON:0011025 confirmed_match (confidence: high) +costal part of respiratory diaphragm muscle UBERON:0035831 confirmed_match (confidence: high) +ceratoglossus of hyoglossus muscle UBERON:0008428 confirmed_match (confidence: high) +chondroglossus of hyoglossus muscle UBERON:0011535 confirmed_match (confidence: high) +anterior vertebral muscle UBERON:0008549 possible_match (UBERON:0008549 'prevertebral muscle' has the same definition (one of the muscles deep to the prevertebral fascia... including the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis). Synonym 'flexor muscle of vertebral column'. The TA2 term 'anterior vertebral muscle' is a synonymous regional grouping. Curator should confirm whether to map directly to UBERON:0008549, to its child UBERON:0017647 'prevertebral muscle of neck', or add as RELATED synonym. Definition uses attaches_to + innervated_by axioms (multi-axiom pattern), not the simple genus + part_of pattern, so this would be out of scope for the EC template even if added as a new term.) diff --git a/src/templates/hra-muscular.template.tsv b/src/templates/hra-muscular.template.tsv index 4bd25c3ea..625fd33b5 100644 --- a/src/templates/hra-muscular.template.tsv +++ b/src/templates/hra-muscular.template.tsv @@ -1,6 +1,6 @@ ID LABEL Definition def_xref is_a part_of In_subset Date Contributor Present_in_taxon Wikipedia_image xref ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| SC % SC BFO:0000050 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| -http://purl.obolibrary.org/obo/UBERON_9900001 anterior cervical intertransversarii muscle A small segmental back muscle that arises from the anterior tubercle of the transverse process of one cervical vertebra and inserts on the anterior tubercle of the transverse process of the adjacent cervical vertebra, contributing to lateral flexion and proprioceptive stabilisation of the cervical spine. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle|PMID:12650404 UBERON:0002324 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii|FMA:71442 -http://purl.obolibrary.org/obo/UBERON_9900003 articularis genu muscle A skeletal muscle of the anterior compartment of the thigh that arises from the anterior surface of the lower body of the femur, deep to the vastus intermedius, and inserts onto the synovial membrane of the knee joint, retracting the suprapatellar bursa superiorly during knee extension and preventing impingement of the synovium between the patella and femur. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle|PMID:30229230|PMID:33215156 UBERON:0004252 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Gray244.png/512px-Gray244.png Wikipedia:Articularis_genus_muscle|FMA:22437 -http://purl.obolibrary.org/obo/UBERON_9900008 clavicular head of pectoralis major muscle A muscle head that is part of the pectoralis major muscle, originating from the anterior surface of the medial half of the clavicle. Its fibres pass obliquely downward and laterally to converge with those of the sternocostal head, contributing the anterior lamina of the broad flat tendon that inserts onto the lateral lip of the intertubercular groove of the humerus, and is innervated by the lateral pectoral nerve (C5-C6). https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle|PMID:30252247|PMID:31061824 UBERON:0002381 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 FMA:34687 -http://purl.obolibrary.org/obo/UBERON_9900010 dorsal part of intertransversarii laterales lumborum muscle A skeletal muscle bundle that is the posterior (dorsal) portion of the lateral intertransversarii muscles of the lumbar region, connecting the accessory processes of one lumbar vertebra to the transverse process of the adjacent vertebra; it acts to stabilise the lumbar vertebral column and assist lateral flexion. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle|doi:10.1007/BF00518810 UBERON:0008242 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii +http://purl.obolibrary.org/obo/UBERON_9900001 anterior cervical intertransversarii muscle A muscle organ that is one of the small, paired segmental muscles of the neck connecting the anterior tubercles of the transverse processes of two adjacent cervical vertebrae. These muscles span from C1-C2 (or C2-C3) through C7-T1, lying lateral to the longus colli muscle, are innervated by the anterior rami of the cervical spinal nerves, and contribute to lateral flexion and proprioceptive stabilisation of the cervical spine. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle|PMID:7076562 UBERON:0001630 UBERON:0000974 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii|FMA:32530 +http://purl.obolibrary.org/obo/UBERON_9900003 articularis genu muscle A muscle organ of the anterior compartment of the thigh, lying deep to the vastus intermedius, that originates from the anterior surface of the distal femur and inserts into the suprapatellar bursa and synovial membrane of the knee joint, retracting the bursa superiorly during knee extension to prevent its impingement between the patella and femur. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle|PMID:30229230|PMID:33215156 UBERON:0001630 UBERON:0000376 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 https://upload.wikimedia.org/wikipedia/commons/2/2b/Gray244.png Wikipedia:Articularis_genus_muscle|FMA:22441 +http://purl.obolibrary.org/obo/UBERON_9900008 clavicular head of pectoralis major muscle A muscle head that is the superior portion of the pectoralis major, originating from the anterior surface of the medial half of the clavicle and converging with the sternocostal head into a flat tendon inserted on the lateral lip of the intertubercular groove of the humerus; it is innervated by the lateral pectoral nerve (C5-C6) and acts to flex the humerus. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle|PMID:30252247|PMID:25345076 UBERON:0011906 UBERON:0002381 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900010 dorsal part of intertransversarii laterales lumborum muscle A muscle organ that is the posterior (dorsal) subdivision of the lateral intertransversarii lumborum, originating from the accessory process of one lumbar vertebra and inserting onto the transverse process of the consecutive lumbar vertebra; together with the ventral part it acts in ipsilateral lateral flexion and stabilisation of the lumbar spine and is innervated by the anterior rami of the lumbar spinal nerves. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle|PMID:6226119 UBERON:0001630 UBERON:0008242 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii From 8229a6e892d9f6fc7914fd4a02a4f26a85f8de25 Mon Sep 17 00:00:00 2001 From: David Osumi-Sutherland Date: Tue, 28 Apr 2026 12:06:07 +0100 Subject: [PATCH 04/22] Enrichment experiment: 6 muscle terms across difficulty gradient MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Standalone experiment in bulk_ntr_workflow/experiments/. Workflow scripts NOT modified. Tests whether an agent can extract origin/insertion/ innervation/action from Wikipedia + uberon-edit.obo with UBERON ID resolution and verbatim evidence quotes per field. Test set (well-known whole muscle → obscure sub-part): - internal abdominal oblique muscle (existing UBERON:0005454) - tensor fascia latae muscle (existing UBERON:0001376) - iliocostalis cervicalis muscle (existing UBERON:0008546) - articularis genu muscle (NEW) - clavicular head of pectoralis major muscle (NEW, muscle head) - dorsal part of intertransversarii laterales lumborum (NEW, obscure) Findings (full report in SUMMARY.md): 1. All 6 terms got 5-6 of 6 enrichment fields populated. Where UBERON IDs couldn't be resolved (named attachments, specific nerves, specific bone landmarks), the agent gracefully fell back to free-text quotes plus parent-class UBERON IDs. 2. The hypothesis that 'muscle parts are poorly axiomatised' is partly confirmed: parent muscle classes for sub-parts are missing (intertransversarii laterales lumborum), but the bigger gap is in UBERON's coverage of related anatomical entities — superior gluteal nerve, lateral pectoral nerve, iliotibial tract, suprapatellar bursa, ilioinguinal nerve, linea alba, accessory process of lumbar vertebra are all missing. A famous muscle like tensor fasciae latae has 2 such gaps; the obscure dorsal sub-part has 3 — gaps are not strongly correlated with term obscurity. 3. The verbatim-quote design works well for review. Each enrichment field carries 1-3 sentences of evidence + a source URL, making the enrichment auditable in seconds per field. 4. 3 of 6 picks turned out to be already in UBERON despite being plausible NTR candidates — Step 2 (existing-term check) continues to do real work. Existing UBERON stanzas often have surprisingly light axiomatisation (tensor fasciae latae has only 1 origin axiom), so enrichment could also improve existing terms, not just new ones. No workflow changes; results are reference material for a future enrichment phase. Roadmap candidates: (a) system-specific templates with pre-extracted fields per system, (b) standardised evidence-quote design across all fields, (c) cascade detection — flag missing UBERON entities as candidate NTRs. Co-Authored-By: Claude Opus 4.7 (1M context) --- bulk_ntr_workflow/experiments/SUMMARY.md | 82 +++++++++++++++++++ .../enriched_articularis_genu.json | 40 +++++++++ .../enriched_clavicular_head_pectoralis.json | 41 ++++++++++ .../enriched_dorsal_part_lumborum.json | 46 +++++++++++ .../enriched_iliocostalis_cervicalis.json | 38 +++++++++ .../enriched_internal_abdominal_oblique.json | 40 +++++++++ .../enriched_tensor_fascia_latae.json | 43 ++++++++++ 7 files changed, 330 insertions(+) create mode 100644 bulk_ntr_workflow/experiments/SUMMARY.md create mode 100644 bulk_ntr_workflow/experiments/enriched_articularis_genu.json create mode 100644 bulk_ntr_workflow/experiments/enriched_clavicular_head_pectoralis.json create mode 100644 bulk_ntr_workflow/experiments/enriched_dorsal_part_lumborum.json create mode 100644 bulk_ntr_workflow/experiments/enriched_iliocostalis_cervicalis.json create mode 100644 bulk_ntr_workflow/experiments/enriched_internal_abdominal_oblique.json create mode 100644 bulk_ntr_workflow/experiments/enriched_tensor_fascia_latae.json diff --git a/bulk_ntr_workflow/experiments/SUMMARY.md b/bulk_ntr_workflow/experiments/SUMMARY.md new file mode 100644 index 000000000..d3cf05afa --- /dev/null +++ b/bulk_ntr_workflow/experiments/SUMMARY.md @@ -0,0 +1,82 @@ +# Enrichment experiment: muscle origin/insertion/innervation/action + +**Run date:** 2026-04-28 +**Branch:** `add-hra-muscular-ntr` +**Scope:** standalone — no workflow scripts modified. + +## Goals + +1. Test whether an agent can extract origin/insertion/innervation/action from Wikipedia + similar UBERON terms, with UBERON ID resolution and a verbatim evidence quote per field. +2. Find out how coverage varies across the muscle-term-type gradient (well-known whole muscle → obscure muscle sub-part) — testing the hypothesis that muscle parts are poorly axiomatised. +3. Verify that the "supporting quote" design is feasible without overhauling the workflow. + +## Method + +6 muscle terms picked across difficulty gradient. Each routed to a separate general-purpose agent with instructions to: +- Populate 6 fields (`is_a`, `part_of`, `has_muscle_origin`, `has_muscle_insertion`, `innervated_by`, `has_muscle_action`). +- Each field has `value` (UBERON ID), `label`, `evidence` (verbatim quote), `source` (URL/PMID). +- All fields optional — emit empty `value` with evidence quote if no UBERON term exists for the entity. +- Output JSON to `bulk_ntr_workflow/experiments/enriched_.json`. + +## Results + +| Term | Type | Existing UBERON? | Fields populated | UBERON IDs | Free-text | +|---|---|---|---:|---:|---:| +| internal abdominal oblique muscle | well-known whole | yes (UBERON:0005454) | 6/6 | 5 | 1 | +| tensor fascia latae muscle | well-known whole | yes (UBERON:0001376) | 6/6 | 4 | 2 | +| iliocostalis cervicalis muscle | segmental whole | yes (UBERON:0008546) | 5/6 | 5 | 0 | +| articularis genu muscle | less-famous whole | NEW | 6/6 | 5 | 1 | +| clavicular head of pectoralis major muscle | muscle head | NEW | 6/6 | 5 | 1 | +| dorsal part of intertransversarii laterales lumborum | obscure sub-part | NEW | 6/6 | 3 | 3 | + +(*"Free-text"* = field had a value/quote but couldn't resolve to a UBERON ID.) + +## Coverage findings + +**Hypothesis confirmed (partly).** Muscle parts ARE more poorly served — but not in the way expected: +- The **target term** lacked a UBERON ID in 3 of 6 cases (all the new ones), as expected. +- The **anatomical entities they relate to** (origin bone, insertion attachment, innervating nerve) failed to resolve to UBERON IDs in unexpected places, even for famous muscles: + - **superior gluteal nerve** (tensor fascia latae innervation) — not in UBERON + - **lateral pectoral nerve** (clavicular head innervation) — not in UBERON + - **iliotibial tract** (tensor fascia latae insertion) — not in UBERON + - **ilioinguinal nerve, iliohypogastric nerve** (internal abdominal oblique innervation) — not in UBERON + - **linea alba** (internal abdominal oblique insertion) — not in UBERON + - **suprapatellar bursa** (articularis genu insertion) — not in UBERON + - **accessory process of lumbar vertebra** (dorsal lumborum origin) — not in UBERON + +The agent fell back to **a more general parent** in each case (e.g. `humerus` instead of `lateral lip of intertubercular groove of humerus`; `thoracic nerve` instead of `lateral pectoral nerve`). These generalisations are correct but lose specificity. + +For the obscure sub-part (`dorsal part of intertransversarii laterales lumborum`): +- Direct genus class missing (parent muscle `intertransversarii laterales lumborum muscle` not in UBERON) +- Origin attachment missing (`accessory process` not in UBERON) +- 3 of 6 fields had evidence but no UBERON ID — agent emitted `value: ""` with a clear `notes` field + +**Coverage is not strongly correlated with term obscurity.** A famous muscle like tensor fascia latae has 2 unresolvable entities; the obscure dorsal sub-part has 3. The bottleneck is **UBERON's coverage of fine-grained anatomical attachments and named nerves**, not Wikipedia's coverage of the muscle itself. + +## Quote-as-evidence findings + +The verbatim quote design works well in practice: +- Quotes range 1–3 sentences, easy to scan +- Where a quote spans multiple fields (e.g. "originates from X and inserts onto Y"), the same passage is reused — no problem +- For obscure terms, the agent often had to rely on Kenhub or anatomy textbooks rather than Wikipedia — the `source` URL captures this naturally +- When evidence is absent (no source describes the field for this specific term), the agent leaves the field out cleanly + +A curator reviewing the JSON could process each enrichment in seconds: read the quote, check the source matches, accept the UBERON ID resolution. **This makes the enrichment auditable in a way the current free-text definitions are not.** + +## Surprises + +1. **3 of 6 picks were already in UBERON.** Even moderately obscure terms (iliocostalis cervicalis) turned out to exist. Step 2 (existing-term check) is doing real work — we saw this with the group flow too. For HRA-ASCTB inputs, the agent should always run Step 2 first; enrichment is most valuable when the term is genuinely new. + +2. **Existing UBERON terms have surprisingly LIGHT axiomatisation.** Tensor fascia latae's existing UBERON stanza had just `is_a` + 1 origin axiom. The enrichment added insertion + innervation + action that were missing. So the enrichment workflow could **also** improve existing terms, not just new ones. + +3. **The hard problem is the relata, not the relations.** Identifying that a muscle is `innervated_by some nerve` is easy. Resolving "lateral pectoral nerve" to a UBERON ID is hard because UBERON doesn't have that nerve. A future enrichment workflow might want to flag missing UBERON terms it encounters as candidates for new term requests of their own (a kind of cascade — adding a muscle reveals the nerve it's innervated by also needs to be added). + +## Implications for future work (NOT acted on) + +If a richer NTR workflow is built: +- Make all enrichment fields **optional** (validated here — gracefully degrades). +- Capture **evidence quote + source URL** as a standard pattern for every populated field. Curator review would benefit substantially. +- Pre-extract **system-specific patterns** (skeletal muscle, bone, vasculature, etc.) so the agent knows which fields to look for rather than guessing per term. +- Detect and report **missing related entities** (e.g. lateral pectoral nerve) as a side-output, feeding into the next NTR batch. + +For now the existing workflow is unchanged; this experiment documents the shape of the result. diff --git a/bulk_ntr_workflow/experiments/enriched_articularis_genu.json b/bulk_ntr_workflow/experiments/enriched_articularis_genu.json new file mode 100644 index 000000000..2e1ac509e --- /dev/null +++ b/bulk_ntr_workflow/experiments/enriched_articularis_genu.json @@ -0,0 +1,40 @@ +{ + "label": "articularis genu muscle", + "is_a": { + "value": "UBERON:0001630", + "label": "muscle organ", + "evidence": "The articularis genus (also known as the subcrureus muscle) is a small skeletal muscle located anteriorly on the thigh just above the knee.", + "source": "https://en.wikipedia.org/wiki/Articularis_genus_muscle" + }, + "part_of": { + "value": "UBERON:0000376", + "label": "hindlimb stylopod", + "evidence": "The articularis genus (also known as the subcrureus muscle) is a small skeletal muscle located anteriorly on the thigh just above the knee.", + "source": "https://en.wikipedia.org/wiki/Articularis_genus_muscle" + }, + "has_muscle_origin": { + "value": "UBERON:0000981", + "label": "femur", + "evidence": "It arises from the anterior surface of the lower part of the body of the femur, deep to the vastus intermedius, close to the knee and from the deep fibers of the vastus intermedius.", + "source": "https://en.wikipedia.org/wiki/Articularis_genus_muscle" + }, + "has_muscle_insertion": { + "value": null, + "label": "suprapatellar bursa / synovial membrane of knee joint", + "evidence": "Its insertion is on the synovial membrane of the knee-joint. [Infobox: Insertion: Suprapatellar bursa]", + "source": "https://en.wikipedia.org/wiki/Articularis_genus_muscle", + "notes": "No clear UBERON term resolved for suprapatellar bursa; left unresolved." + }, + "innervated_by": { + "value": "UBERON:0001267", + "label": "femoral nerve", + "evidence": "It is innervated by branches of the femoral nerve (L2-L4).", + "source": "https://en.wikipedia.org/wiki/Articularis_genus_muscle" + }, + "has_muscle_action": { + "value": "pulls the suprapatellar bursa superiorly during extension of the knee, preventing impingement of the synovial membrane between the patella and the femur", + "evidence": "Articularis genus pulls the suprapatellar bursa superiorly during extension of the knee, and prevents impingement of the synovial membrane between the patella and the femur.", + "source": "https://en.wikipedia.org/wiki/Articularis_genus_muscle" + }, + "notes": "Articularis genus is a distinct small skeletal muscle of the anterior thigh, often described as separated from but closely associated with vastus intermedius (UBERON:0014847). Insertion field has no resolved UBERON ID because suprapatellar bursa / knee synovial membrane was not found as a discrete UBERON class in OLS lookup; left as a free-text label with evidence quote. Wikipedia evidence is sourced from Grant's Atlas of Anatomy (Agur & Dalley 2009) and Gray's Anatomy (1918) per the article's references." +} diff --git a/bulk_ntr_workflow/experiments/enriched_clavicular_head_pectoralis.json b/bulk_ntr_workflow/experiments/enriched_clavicular_head_pectoralis.json new file mode 100644 index 000000000..7171ba861 --- /dev/null +++ b/bulk_ntr_workflow/experiments/enriched_clavicular_head_pectoralis.json @@ -0,0 +1,41 @@ +{ + "label": "clavicular head of pectoralis major muscle", + "is_a": { + "value": "UBERON:0011906", + "label": "muscle head", + "evidence": "The pectoralis major has two heads, the clavicular and the sternocostal, which differ in origin and function but share a common insertion. The clavicular head originates from the anterior surface of the medial half of the clavicle.", + "source": "https://en.wikipedia.org/wiki/Pectoralis_major" + }, + "part_of": { + "value": "UBERON:0002381", + "label": "pectoralis major", + "evidence": "The pectoralis major has two heads, the clavicular and the sternocostal... The clavicular head, which arises from the front surface of about half of the clavicle is part of pectoralis major.", + "source": "https://en.wikipedia.org/wiki/Pectoralis_major" + }, + "has_muscle_origin": { + "value": "UBERON:0001105", + "label": "clavicle bone", + "evidence": "The clavicular head originates from the anterior surface of the medial half of the clavicle.", + "source": "https://en.wikipedia.org/wiki/Pectoralis_major" + }, + "has_muscle_insertion": { + "value": "UBERON:0000976", + "label": "humerus", + "evidence": "Lateral lip of the bicipital groove of the humerus (anteromedial proximal humerus).", + "source": "https://en.wikipedia.org/wiki/Pectoralis_major", + "notes": "Insertion is on the lateral lip of the bicipital (intertubercular) groove of the humerus; no discrete UBERON term for that subpart exists, so resolved at the humerus (UBERON:0000976) level. This matches the precedent on the parent term UBERON:0002381 pectoralis major." + }, + "innervated_by": { + "value": "UBERON:0003726", + "label": "thoracic nerve", + "evidence": "C5 and C6 nerve roots via the upper trunk and lateral cord of the brachial plexus, which gives off the lateral pectoral nerve.", + "source": "https://en.wikipedia.org/wiki/Pectoralis_major", + "notes": "Wikipedia specifies the lateral pectoral nerve (C5-C6) for the clavicular head, but UBERON has no discrete term for 'lateral pectoral nerve'. Resolved to UBERON:0003726 (thoracic nerve), which is the precedent used on the parent UBERON:0002381 pectoralis major (where the existing axiom carries an explanatory note 'lateral pectoral nerve and medial pectoral nerve...')." + }, + "has_muscle_action": { + "value": "flexion of the humerus", + "evidence": "The clavicular head flexes the humerus.", + "source": "https://en.wikipedia.org/wiki/Pectoralis_major" + }, + "notes": "The clavicular head of pectoralis major is a muscle PART, not a whole muscle. It is one of two heads of the pectoralis major (the other being the sternocostal head). Precedent for the genus class 'muscle head' (UBERON:0011906) follows long head of biceps brachii (UBERON:0008529) and short head of biceps brachii (UBERON:0008530). Origin/insertion/innervation precedents on whole-muscle parent UBERON:0002381 pectoralis major were used to anchor resolution choices where Wikipedia's specificity exceeded UBERON's granularity (humeral bicipital groove -> humerus; lateral pectoral nerve -> thoracic nerve)." +} diff --git a/bulk_ntr_workflow/experiments/enriched_dorsal_part_lumborum.json b/bulk_ntr_workflow/experiments/enriched_dorsal_part_lumborum.json new file mode 100644 index 000000000..deac6fc90 --- /dev/null +++ b/bulk_ntr_workflow/experiments/enriched_dorsal_part_lumborum.json @@ -0,0 +1,46 @@ +{ + "label": "dorsal part of intertransversarii laterales lumborum muscle", + "notes": "Very obscure sub-part of a sub-part. No dedicated Wikipedia article; the parent 'Intertransversarii' Wikipedia article only briefly mentions the lumborum subdivision and does not separately describe the dorsal part. Best primary source online is Kenhub's article on intertransversarii laterales lumborum, which distinguishes the ventral (anterior) and dorsal (posterior) parts. No UBERON term currently exists for the parent muscle 'intertransversarii laterales lumborum' itself, nor for the dorsal subdivision; obo-grep over uberon-edit.obo returned no matches for 'intertransversarii' or 'transversarii'. Likewise no UBERON term exists for 'accessory process of lumbar vertebra' (only the transverse process: UBERON:0018146). is_a (genus = the parent intertransversarii laterales lumborum muscle) is therefore left unpopulated for UBERON ID. part_of falls back to UBERON:0008242 'lower back muscle' as the most specific available containing region. Action could not be sourced separately for the dorsal part — sources describe action only for intertransversarii laterales lumborum (or intertransversarii) collectively.", + "is_a": { + "value": "", + "label": "intertransversarii laterales lumborum muscle", + "evidence": "The lateral muscles, intertransversarii laterales lumborum, consist of two parts; anterior (ventral) and posterior (dorsal), referred to as intertransversarii laterales ventrales and intertransversarii laterales dorsales, respectively.", + "source": "https://www.kenhub.com/en/library/anatomy/intertransversarii-laterales-lumborum-muscles", + "rationale": "Genus is the parent muscle (intertransversarii laterales lumborum), of which the dorsal part is one of two named subdivisions. No UBERON ID exists for this parent." + }, + "part_of": { + "value": "UBERON:0008242", + "label": "lower back muscle", + "evidence": "The lateral muscles, intertransversarii laterales lumborum, consist of two parts; anterior (ventral) and posterior (dorsal) ... originate from the accessory process of one lumbar vertebra and insert onto the transverse process of the consecutive lumbar vertebra.", + "source": "https://www.kenhub.com/en/library/anatomy/intertransversarii-laterales-lumborum-muscles", + "rationale": "Located between adjacent lumbar vertebrae and forms part of the deep musculature of the lower back; UBERON:0008242 (lower back muscle) is the most specific containing region currently available in UBERON." + }, + "has_muscle_origin": { + "value": "", + "label": "accessory process of lumbar vertebra", + "evidence": "The posterior parts originate from the accessory process of one lumbar vertebra and insert onto the transverse process of the consecutive lumbar vertebra.", + "source": "https://www.kenhub.com/en/library/anatomy/intertransversarii-laterales-lumborum-muscles", + "notes": "No UBERON term exists for 'accessory process of lumbar vertebra' (verified by grep over uberon-edit.obo). Closest related term is UBERON:0018146 'transverse process of lumbar vertebra', which is anatomically distinct." + }, + "has_muscle_insertion": { + "value": "UBERON:0018146", + "label": "transverse process of lumbar vertebra", + "evidence": "The posterior parts originate from the accessory process of one lumbar vertebra and insert onto the transverse process of the consecutive lumbar vertebra.", + "source": "https://www.kenhub.com/en/library/anatomy/intertransversarii-laterales-lumborum-muscles", + "notes": "Specifically the medial third of the transverse process of the consecutive (caudal) lumbar vertebra: 'inserts proximally to the accessory process and distally to the medial third of the adjacent transverse process below.'" + }, + "innervated_by": { + "value": "UBERON:0006838", + "label": "ventral ramus of spinal nerve", + "evidence": "Intertransversarii laterales lumborum are supplied by the anterior rami of spinal nerves, in contrast to intertransversarii mediales lumborum which are innervated by posterior rami.", + "source": "https://www.kenhub.com/en/library/anatomy/intertransversarii-laterales-lumborum-muscles", + "notes": "Innervation stated for the parent intertransversarii laterales lumborum (covering both ventral and dorsal parts). UBERON:0006838 'ventral ramus of spinal nerve' is the equivalent term to 'anterior ramus of spinal nerve'. The relevant nerves are the anterior rami of the lumbar spinal nerves (UBERON:0009624 'lumbar nerve'). Some sources note mixed innervation, with dorsal-ramus contributions also reported for the dorsal part specifically." + }, + "has_muscle_action": { + "value": "", + "label": "lateral flexion / stabilization of lumbar spine", + "evidence": "assist lateral flexion of the spine; Stabilizes spine.", + "source": "https://www.kenhub.com/en/library/anatomy/intertransversarii-laterales-lumborum-muscles", + "notes": "Action is described only for intertransversarii (or intertransversarii laterales lumborum collectively); no source distinguishes the action of the dorsal part from the ventral part. No UBERON ID applies (action, not anatomical entity)." + } +} diff --git a/bulk_ntr_workflow/experiments/enriched_iliocostalis_cervicalis.json b/bulk_ntr_workflow/experiments/enriched_iliocostalis_cervicalis.json new file mode 100644 index 000000000..8086febfd --- /dev/null +++ b/bulk_ntr_workflow/experiments/enriched_iliocostalis_cervicalis.json @@ -0,0 +1,38 @@ +{ + "label": "iliocostalis cervicalis muscle", + "notes": "Existing UBERON term: UBERON:0008546 'iliocostalis cervicis muscle' (cervicalis ascendens). 'Iliocostalis cervicalis' is treated here as a label variant of 'iliocostalis cervicis'. Source quotes are taken verbatim from Wikipedia, which derives this passage from Gray's Anatomy (1918). Origin and insertion are clearly stated; innervation is not stated for the cervicis subdivision in the Wikipedia article itself but the parent iliocostalis muscle and erector spinae are innervated by dorsal rami of the spinal nerves (already encoded on UBERON:0002251 and UBERON:0008546). Action is not given a clear single-sentence quote in the cervicis subsection, so left unpopulated.", + "is_a": { + "value": "UBERON:0002251", + "label": "iliocostalis muscle", + "evidence": "The iliocostalis cervicis (cervicalis ascendens) arises from the angles of the third, fourth, fifth, and sixth ribs, and is inserted into the posterior tubercles of the transverse processes of the fourth, fifth, and sixth cervical vertebrae.", + "source": "https://en.wikipedia.org/wiki/Iliocostalis#Iliocostalis_cervicis" + }, + "part_of": { + "value": "UBERON:0002251", + "label": "iliocostalis muscle", + "evidence": "Iliocostalis cervicis ... The iliocostalis is composed of three parts: iliocostalis lumborum, iliocostalis thoracis, and iliocostalis cervicis. The iliocostalis is the most lateral muscle of the erector spinae.", + "source": "https://en.wikipedia.org/wiki/Iliocostalis", + "rationale": "The cervicis subdivision is one of three named parts of the iliocostalis muscle (UBERON:0002251), which itself is part_of the erector spinae muscle group (UBERON:0002462). The iliocostalis muscle is the more specific containing region for the cervicis subdivision." + }, + "has_muscle_origin": { + "value": "UBERON:0002228", + "label": "rib", + "evidence": "The iliocostalis cervicis (cervicalis ascendens) arises from the angles of the third, fourth, fifth, and sixth ribs, and is inserted into the posterior tubercles of the transverse processes of the fourth, fifth, and sixth cervical vertebrae.", + "source": "https://en.wikipedia.org/wiki/Iliocostalis#Iliocostalis_cervicis", + "notes": "Specifically the angles of the third through sixth ribs." + }, + "has_muscle_insertion": { + "value": "UBERON:0001077", + "label": "transverse process of vertebra", + "evidence": "The iliocostalis cervicis (cervicalis ascendens) arises from the angles of the third, fourth, fifth, and sixth ribs, and is inserted into the posterior tubercles of the transverse processes of the fourth, fifth, and sixth cervical vertebrae.", + "source": "https://en.wikipedia.org/wiki/Iliocostalis#Iliocostalis_cervicis", + "notes": "Specifically the posterior tubercles of the transverse processes of cervical vertebrae C4-C6." + }, + "innervated_by": { + "value": "UBERON:0006839", + "label": "dorsal ramus of spinal nerve", + "evidence": "The muscles of the back are innervated by the dorsal rami of the spinal nerves whilst the abdominals are innervated by the ventral rami.", + "source": "https://en.wikipedia.org/wiki/Erector_spinae_muscles", + "notes": "Innervation stated for erector spinae group as a whole; iliocostalis cervicis as a constituent muscle is innervated by dorsal rami of (cervical) spinal nerves. Already asserted on UBERON:0008546 with source=dbpedia." + } +} diff --git a/bulk_ntr_workflow/experiments/enriched_internal_abdominal_oblique.json b/bulk_ntr_workflow/experiments/enriched_internal_abdominal_oblique.json new file mode 100644 index 000000000..3d810102b --- /dev/null +++ b/bulk_ntr_workflow/experiments/enriched_internal_abdominal_oblique.json @@ -0,0 +1,40 @@ +{ + "label": "internal abdominal oblique muscle", + "is_a": { + "value": "UBERON:0035032", + "label": "abdominal oblique muscle", + "evidence": "The internal abdominal oblique muscle, also internal oblique muscle or interior oblique or musculus obliquus abdominis internus, is an abdominal muscle in the abdominal wall that lies below the external abdominal oblique muscle and just above the transversus abdominis muscle.", + "source": "https://en.wikipedia.org/wiki/Abdominal_internal_oblique_muscle" + }, + "part_of": { + "value": "UBERON:0003697", + "label": "abdominal wall", + "evidence": "The internal abdominal oblique muscle ... is an abdominal muscle in the abdominal wall that lies below the external abdominal oblique muscle and just above the transversus abdominis muscle.", + "source": "https://en.wikipedia.org/wiki/Abdominal_internal_oblique_muscle" + }, + "has_muscle_origin": { + "value": "UBERON:0014437", + "label": "iliac crest", + "evidence": "Its fibers run perpendicular to the external oblique muscle, beginning in the thoracolumbar fascia of the lower back, the anterior 2/3 of the iliac crest (upper part of hip bone) and the lateral half of the inguinal ligament.", + "source": "https://en.wikipedia.org/wiki/Abdominal_internal_oblique_muscle" + }, + "has_muscle_insertion": { + "value": "UBERON:0002228", + "label": "rib", + "evidence": "The muscle fibers run from these points superomedially (up and towards midline) to the muscle's insertions on the inferior borders of the 10th through 12th ribs and the linea alba.", + "source": "https://en.wikipedia.org/wiki/Abdominal_internal_oblique_muscle" + }, + "innervated_by": { + "value": "UBERON:0003727", + "label": "intercostal nerve", + "evidence": "The internal oblique is supplied by the lower intercostal nerves, as well as the iliohypogastric nerve and the ilioinguinal nerve.", + "source": "https://en.wikipedia.org/wiki/Abdominal_internal_oblique_muscle" + }, + "has_muscle_action": { + "value": "compresses abdomen; ipsilateral trunk rotation and side-bending; accessory muscle of expiration", + "label": "abdominal compression and ipsilateral trunk rotation", + "evidence": "Bilateral: Compresses abdomen. Unilateral: Ipsilateral trunk rotation. ... Firstly as an accessory muscle of respiration, it acts as an antagonist (opponent) to the diaphragm, helping to reduce the volume of the chest cavity during exhalation. ... Secondly, its contraction causes ipsilateral rotation and side-bending.", + "source": "https://en.wikipedia.org/wiki/Abdominal_internal_oblique_muscle" + }, + "notes": "Origin field has multiple attachments per Wikipedia (thoracolumbar fascia, iliac crest, lateral inguinal ligament); only iliac crest was selected as it is well-resolved in UBERON (UBERON:0014437). Inguinal ligament (UBERON:0006204) is also a valid origin. No exact UBERON term was found for 'thoracolumbar fascia' or 'linea alba'. Insertion uses 'rib' (UBERON:0002228) as a generic anchor since the muscle inserts on ribs 10-12 and the linea alba (no UBERON term for linea alba). Innervation: 'intercostal nerve' (UBERON:0003727) covers the thoracoabdominal/subcostal contribution; iliohypogastric and ilioinguinal nerves did not resolve to UBERON IDs. UBERON ID for the term itself is UBERON:0005454 (label in Uberon: 'abdominal internal oblique muscle')." +} diff --git a/bulk_ntr_workflow/experiments/enriched_tensor_fascia_latae.json b/bulk_ntr_workflow/experiments/enriched_tensor_fascia_latae.json new file mode 100644 index 000000000..cc5e51986 --- /dev/null +++ b/bulk_ntr_workflow/experiments/enriched_tensor_fascia_latae.json @@ -0,0 +1,43 @@ +{ + "label": "tensor fascia latae muscle", + "existing_uberon_id": "UBERON:0001376", + "is_a": { + "value": "UBERON:0001630", + "label": "muscle organ", + "evidence": "The tensor fasciae latae (or tensor fasciae latae or, formerly, tensor vaginae femoris) is a muscle of the thigh.", + "source": "https://en.wikipedia.org/wiki/Tensor_fasciae_latae_muscle" + }, + "part_of": { + "value": "UBERON:0000376", + "label": "hindlimb stylopod", + "evidence": "The tensor fasciae latae (or tensor fasciae latae or, formerly, tensor vaginae femoris) is a muscle of the thigh.", + "source": "https://en.wikipedia.org/wiki/Tensor_fasciae_latae_muscle", + "notes": "UBERON:0000376 (hindlimb stylopod) is the OLS4 exact match for 'thigh'." + }, + "has_muscle_origin": { + "value": "UBERON:0014437", + "label": "iliac crest", + "evidence": "The tensor fasciae latae arises from the anterior part of the outer lip of the iliac crest; from the outer surface of the anterior superior iliac spine, and part of the outer border of the notch below it, between the gluteus medius and sartorius; and from the deep surface of the fascia lata.", + "source": "https://en.wikipedia.org/wiki/Tensor_fasciae_latae_muscle" + }, + "has_muscle_insertion": { + "value": null, + "label": "iliotibial tract (of the fascia lata)", + "evidence": "The tensor fasciae latae is inserted between the two layers of the iliotibial tract of the fascia lata about the junction of the middle and upper thirds of the thigh. ... The terminal insertion point lies on the lateral condyle of the tibia.", + "source": "https://en.wikipedia.org/wiki/Tensor_fasciae_latae_muscle", + "notes": "No UBERON class found for 'iliotibial tract' / 'iliotibial band' (OLS4 exact and partial searches returned no match). Left unresolved as free text." + }, + "innervated_by": { + "value": null, + "label": "superior gluteal nerve", + "evidence": "Tensor fasciae latae is innervated by the superior gluteal nerve, L5 and S1.", + "source": "https://en.wikipedia.org/wiki/Tensor_fasciae_latae_muscle", + "notes": "No UBERON class found for 'superior gluteal nerve' (OLS4 exact search returned no match; only superior gluteal artery UBERON:0001315 and superior gluteal lymph node UBERON:0037548 exist). Left unresolved as free text." + }, + "has_muscle_action": { + "value": "Hip flexion, medial rotation, and abduction; lateral rotation of the knee/tibia; tautens the iliotibial tract and braces the knee; stabilizes the pelvis when standing, walking, or running.", + "evidence": "Actions: Hip - flexion, medial rotation, abduction, knee - lateral rotation, torso - stabilization. ... It tautens the iliotibial tract and braces the knee, especially when the opposite foot is lifted. ... The muscle assists in keeping the balance of the pelvis while standing, walking, or running.", + "source": "https://en.wikipedia.org/wiki/Tensor_fasciae_latae_muscle" + }, + "notes": "Tensor fasciae latae already exists in UBERON as UBERON:0001376 with is_a UBERON:0002000 (gluteal muscle) and an existing has_muscle_origin to UBERON:0010746 (iliac blade). The current iliac-blade origin is consistent with but less specific than the Wikipedia 'iliac crest' (UBERON:0014437) origin description; consider refining. Two key Wikipedia-described relations (insertion onto iliotibial tract, innervation by superior gluteal nerve) cannot be encoded with UBERON IDs because those classes do not currently exist in UBERON (verified via OLS4 exact-match search). 'Thigh' resolved to UBERON:0000376 (hindlimb stylopod) per the OLS4 exact-match alias, matching the precedent set in enriched_articularis_genu.json." +} From 4ce9a098e0c854b801e55a399305a660a82254ba Mon Sep 17 00:00:00 2001 From: David Osumi-Sutherland Date: Tue, 28 Apr 2026 13:35:15 +0100 Subject: [PATCH 05/22] =?UTF-8?q?Ovary=20enrichment=20experiment=20?= =?UTF-8?q?=E2=80=94=20hypothesis=20disproven?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User hypothesis: simple is_a + part_of would be sufficient for ovary terms (unlike muscles where origin/insertion/innervation are needed). Result: hypothesis NOT confirmed. 5 of 6 ovary terms tested require relations beyond is_a + part_of: - Layers (corona radiata, CL granulosa lutein, CL theca): need composed_primarily_of (CL:cell type) and/or bounding_layer_of, has_part - Compositional complex (cumulus oophorus oocyte complex): needs has_part to distinguish from cumulus oophorus alone - Follicle stages (early antral, transitional primary): need develops_from PLUS has_component with cardinality constraints PLUS has_potential_to_develop_into — UBERON's existing precedent (UBERON:0000035/36/37) uses all of these Why ovary is harder for simple is_a + part_of than expected: - Sibling layers share part_of (both lutein + theca layers part_of corpus luteum) — part_of alone doesn't differentiate - Sibling follicle stages share is_a (all primary/secondary/tertiary is_a ovarian follicle AND part_of ovary) — neither relation distinguishes - The defining property is cellular composition or developmental position, neither captured by spatial part_of Cross-experiment comparison: - Muscle group: simple genus + part_of EC sufficient (74% precedent) - Muscle individual: needs muscle origin/insertion/innervation - Muscle head/sub-part: simple is_a + part_of works (sparse precedent) - Ovary layer/complex/stage: needs composed_primarily_of, has_part, develops_from, cardinality Conclusion: per-system templates are warranted. A single one-size-fits-all leaf template either over-fits one domain or under-serves both. The evidence-quote JSON design transferred cleanly between domains — confirming it as a generalisable pattern. Output: bulk_ntr_workflow/experiments/SUMMARY_OVARY.md and 6 enriched JSONs. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../experiments/SUMMARY_OVARY.md | 96 +++++++++++++++++++ .../experiments/enriched_coc.json | 40 ++++++++ .../experiments/enriched_corona_radiata.json | 49 ++++++++++ ...riched_corpus_luteum_granulosa_lutein.json | 35 +++++++ .../enriched_corpus_luteum_theca.json | 41 ++++++++ .../enriched_early_antral_follicle.json | 43 +++++++++ ...nriched_transitional_primary_follicle.json | 37 +++++++ 7 files changed, 341 insertions(+) create mode 100644 bulk_ntr_workflow/experiments/SUMMARY_OVARY.md create mode 100644 bulk_ntr_workflow/experiments/enriched_coc.json create mode 100644 bulk_ntr_workflow/experiments/enriched_corona_radiata.json create mode 100644 bulk_ntr_workflow/experiments/enriched_corpus_luteum_granulosa_lutein.json create mode 100644 bulk_ntr_workflow/experiments/enriched_corpus_luteum_theca.json create mode 100644 bulk_ntr_workflow/experiments/enriched_early_antral_follicle.json create mode 100644 bulk_ntr_workflow/experiments/enriched_transitional_primary_follicle.json diff --git a/bulk_ntr_workflow/experiments/SUMMARY_OVARY.md b/bulk_ntr_workflow/experiments/SUMMARY_OVARY.md new file mode 100644 index 000000000..d69216a7d --- /dev/null +++ b/bulk_ntr_workflow/experiments/SUMMARY_OVARY.md @@ -0,0 +1,96 @@ +# Enrichment experiment: ovary terms + +**Run date:** 2026-04-28 +**Branch:** `add-hra-muscular-ntr` (ovary terms read from `add-hra-ovary-ntr` via git show) +**Scope:** standalone — no workflow scripts modified. + +## Goals + +Test the hypothesis: **for ovary terms, simple `is_a + part_of` should be sufficient** (i.e. the rich relations needed for muscles — origin/insertion/innervation — won't apply, and ovary structures should be cleanly modelled with just genus + container). + +## Method + +6 ovary terms picked across types: +- 3 layers/parts (corona radiata, corpus luteum granulosa lutein layer, corpus luteum granulosa theca layer) +- 1 compositional complex (cumulus oophorus oocyte complex) +- 2 follicle stages (early antral follicle, transitional primary ovarian follicle) + +Each routed to a separate agent with the same evidence-quote enrichment design used for muscles. Fields tested: `is_a`, `part_of`, `composed_primarily_of`, `has_part`, `bounding_layer_of`, `develops_from`, `has_component` (with cardinality), `has_potential_to_develop_into`, `has_function`, `has_quality`. + +## Results — hypothesis NOT confirmed + +| Term | Type | Fields populated with UBERON IDs | Simple is_a+part_of sufficient? | +|---|---|---|---| +| corona radiata | layer | is_a, part_of, composed_primarily_of, **bounding_layer_of**, develops_from | NO — bounding_layer_of distinguishes it from generic granulosa cell layer | +| CL granulosa lutein layer | layer | is_a, part_of, **composed_primarily_of**, has_function | NO — composed_primarily_of CL:0000592 is the load-bearing differentiator vs sibling theca layer | +| CL granulosa theca layer | layer | is_a, part_of, **has_part** (CL:0000592 + CL:0000590), composed_primarily_of | NO — without has_part axioms, can't distinguish from generic CL layer | +| cumulus oophorus oocyte complex | complex | is_a, part_of, **has_part** (oocyte + cumulus + zona pellucida) | NO — without has_part, logically indistinguishable from cumulus oophorus alone | +| early antral follicle | stage | is_a, **has_part** (antrum), **has_component** w/ cardinality, **develops_from**, has_potential_to_develop_into | NO — UBERON's existing follicle-stage pattern requires all four mechanisms | +| transitional primary ovarian follicle | stage | is_a, has_part, **develops_from**, has_potential_to_develop_into | PARTIALLY — develops_from is essential; cardinality inherits from primary parent | + +**Result: 5 of 6 ovary terms genuinely require relations beyond `is_a + part_of`.** Only the transitional primary follicle is borderline (develops_from is needed but cardinality can be inherited from the parent class). + +## Why this is different from muscles + +| Aspect | Muscle leaf terms | Ovary leaf terms | +|---|---|---| +| Defining relation | Spatial (where the muscle is, what it attaches to) | **Compositional** (what cells/parts it contains) and **temporal** (developmental sequence) | +| Common relations needed | has_muscle_origin, has_muscle_insertion, innervated_by | composed_primarily_of, has_part (CL:cell types), develops_from, has_component cardinality | +| Sibling distinguishability with is_a + part_of | Workable (different muscles → different containers/origins) | **Often fails** (sibling layers share container; sibling stages share genus) | +| External entities relied on | Bones, nerves (mostly UBERON) | Cell types (CL ontology — generally well-covered) | + +The ovary case is in some ways **harder** for is_a + part_of than the muscle case: +- Multiple sibling structures within the same parent (e.g. lutein vs theca layer of the same corpus luteum) — they share `part_of UBERON:0002512`, so `part_of` alone doesn't differentiate them. +- Follicle stages share `is_a ovarian follicle` AND `part_of ovary` — neither relation distinguishes stages. +- The defining property is in the cellular composition or the developmental position, neither of which is captured by spatial part_of. + +## UBERON precedent confirms the pattern + +Existing UBERON follicle stage terms use sophisticated logical definitions: + +``` +UBERON:0000036 secondary ovarian follicle + intersection_of: UBERON:0001305 ! ovarian follicle + intersection_of: has_component UBERON:0005170 {minCardinality="2"} ! granulosa cell layer + intersection_of: has_potential_to_develop_into UBERON:0000037 ! tertiary ovarian follicle + relationship: develops_from UBERON:0000035 ! primary ovarian follicle +``` + +Existing CL layer terms use: +``` +UBERON:0000155 theca cell layer + intersection_of: UBERON:0000119 ! cell layer + intersection_of: composed_primarily_of CL:... ! theca cell + intersection_of: part_of UBERON:0001305 ! ovarian follicle +``` + +UBERON convention itself **rejects the simple is_a + part_of pattern** for these structure types — the workflow's leaf template is missing exactly what UBERON considers necessary. + +## Cross-experiment comparison + +| Domain | Sufficient: is_a + part_of? | Most-needed extra relations | Pattern complexity | +|---|---|---|---| +| Muscle individual | partially | has_muscle_origin, has_muscle_insertion, innervated_by | Asserted relationships | +| Muscle group | yes (≥74% per Phase 2) | (none — simple is_a + part_of EC works) | EquivalentClass with single differentia | +| Muscle head/sub-part | yes (sparse precedent — only 2 terms in UBERON) | (parent muscle as part_of) | Asserted relationships | +| Ovary layer | NO | composed_primarily_of (CL:cell type), has_part (CL:cell types), bounding_layer_of | EquivalentClass with multi-differentia | +| Ovary compositional complex | NO | has_part (multiple CL+UBERON entities) | EquivalentClass with multiple has_part | +| Ovary stage | NO | develops_from, has_component with cardinality, has_potential_to_develop_into | Multi-axiom intersection_of with cardinality constraints | + +**System-specific templates would help substantially.** The muscle and ovary domains need different fields, and within ovary the layers vs stages need different patterns. A single one-size-fits-all template either over-fits one domain or under-serves both. + +## Implications + +1. The user's intuition that ovary would need less than muscles was **wrong**, but the underlying point — that anatomical-system templates should be tailored — is more strongly supported, not less. + +2. **Per-system templates** become important: + - Muscle template: + `has_muscle_origin`, `has_muscle_insertion`, `innervated_by` + - Ovary layer template: + `composed_primarily_of`, optionally `bounding_layer_of` + - Ovary compositional complex template: + `has_part` (multi-valued) + - Follicle stage template: + `develops_from`, `has_component` with cardinality, `has_potential_to_develop_into` + +3. **The cardinality-constrained `has_component` is interesting.** ROBOT templates support this via the `>EC` directive (sub-axiom annotation), or via more elaborate column structures. Worth investigating if a stage-specific template is built. + +4. **The agent's tool use was efficient.** All 6 ovary agents finished in 50–80s each, mostly using awk over `uberon-edit.obo` to find precedent stanzas and OLS4 only when needed for cell-type lookups in CL. obo-grep would not have been more efficient here. + +5. **The evidence-quote design transferred cleanly.** Same JSON shape, same per-field quote+source — no schema changes needed across domains. Confirms it as a generalisable pattern. diff --git a/bulk_ntr_workflow/experiments/enriched_coc.json b/bulk_ntr_workflow/experiments/enriched_coc.json new file mode 100644 index 000000000..d613fa54c --- /dev/null +++ b/bulk_ntr_workflow/experiments/enriched_coc.json @@ -0,0 +1,40 @@ +{ + "label": "cumulus oophorus oocyte complex", + "is_a": { + "value": "UBERON:0034922", + "label": "cell cluster", + "evidence": "The cumulus oophorus itself is classified as a cell cluster: 'is_a: UBERON:0034922 ! cell cluster'. The COC, defined as 'A cluster of cells that project into the cavity of the mature ovarian follicle ... released with the embedded oocyte during ovulation', is likewise a cluster of cells largely surrounded by a morphological boundary, matching cell cluster def: 'A cluster of cells, largely surrounded by a morphological boundary.' [CARO:0020002]", + "source": "src/ontology/uberon-edit.obo (UBERON:0001306, UBERON:0034922)" + }, + "part_of": { + "value": "UBERON:0000037", + "label": "tertiary ovarian follicle", + "evidence": "The COC is the structure within an antral follicle. Tertiary ovarian follicle is defined as 'A follicle that has reached the most mature stage of folliculogenesis, characterized by the presence of the antrum.' The cumulus oophorus def states the cells 'project into the cavity of the mature ovarian follicle' (i.e. the antrum of the tertiary follicle), so the COC is part_of the antral/tertiary follicle.", + "source": "src/ontology/uberon-edit.obo (UBERON:0000037, UBERON:0001306)" + }, + "has_part_oocyte": { + "value": "CL:0000023", + "label": "oocyte", + "evidence": "The cumulus oophorus 'is released with the embedded oocyte during ovulation' (UBERON:0001306 def). The zona pellucida term explicitly relates to the oocyte: 'relationship: bounding_layer_of CL:0000023 ! oocyte'. The COC is by definition the cumulus cells PLUS the embedded oocyte.", + "source": "src/ontology/uberon-edit.obo (UBERON:0001306, UBERON:0000086)" + }, + "has_part_cumulus": { + "value": "UBERON:0001306", + "label": "cumulus oophorus", + "evidence": "Cumulus oophorus def: 'A cluster of cells that project into the cavity of the mature ovarian follicle. It is released with the embedded oocyte during ovulation.' The COC name itself denotes cumulus oophorus + oocyte, so cumulus oophorus is a constituent part.", + "source": "src/ontology/uberon-edit.obo (UBERON:0001306)" + }, + "has_part_zona_pellucida": { + "value": "UBERON:0000086", + "label": "zona pellucida", + "evidence": "Zona pellucida is 'A glycoprotein membrane surrounding the plasma membrane of an oocyte ... external but not extraneous to it' and is the 'bounding_layer_of CL:0000023 ! oocyte'. Since the oocyte in the COC carries its zona pellucida (which sperm must penetrate at fertilisation: 'In order for fertilization to occur this layer must be penetrated by the spermatocyte' — UBERON:0001306 def), the zona pellucida is a part of the COC.", + "source": "src/ontology/uberon-edit.obo (UBERON:0000086, UBERON:0001306)" + }, + "has_function": { + "value": null, + "label": "oocyte maturation / cumulus-oocyte signaling", + "evidence": "No has_function quote-grade evidence in the precedent stanzas examined (UBERON:0001306, UBERON:0000086, UBERON:0000037, UBERON:0034922). UBERON:0001306 describes ovulation release and the requirement that sperm penetrate the cumulus to reach the oocyte, but UBERON does not assert a has_function relationship on these terms — function-class enrichment would need GO term sourcing not present in the inspected stanzas.", + "source": "src/ontology/uberon-edit.obo (no has_function asserted on precedent terms)" + }, + "notes": "Simple is_a (UBERON:0034922 cell cluster) + part_of (UBERON:0000037 tertiary ovarian follicle) is INSUFFICIENT to capture this term's compositional nature. The defining feature of a COC versus the cumulus oophorus alone (UBERON:0001306) is that the COC includes the oocyte and its zona pellucida — i.e. it is precisely the cumulus oophorus PLUS oocyte (with zona pellucida) released as a unit at ovulation. Without has_part axioms (oocyte CL:0000023, cumulus oophorus UBERON:0001306, zona pellucida UBERON:0000086), the COC class is logically indistinguishable from cumulus oophorus. So has_part is essential here. A logical definition could be: 'cell cluster' and (has_part some oocyte) and (has_part some cumulus oophorus) and (part_of some tertiary ovarian follicle). Note also UBERON:0001306 has two part_of parents (ovarian follicle, granulosa cell layer); the COC, because it includes the oocyte (which is not part of the granulosa cell layer), should be part_of the follicle/antral follicle but NOT part_of the granulosa cell layer." +} diff --git a/bulk_ntr_workflow/experiments/enriched_corona_radiata.json b/bulk_ntr_workflow/experiments/enriched_corona_radiata.json new file mode 100644 index 000000000..9145144fe --- /dev/null +++ b/bulk_ntr_workflow/experiments/enriched_corona_radiata.json @@ -0,0 +1,49 @@ +{ + "label": "corona radiata", + "sense": "embryology/oogenesis - the innermost granulosa cell layer of the cumulus oophorus, immediately surrounding the zona pellucida of the oocyte. NOT the brain corona radiata (UBERON:0004682).", + "is_a": { + "value": "UBERON:0000119", + "label": "cell layer", + "evidence": "The corona radiata is the innermost layer of the cells of the cumulus oophorus and is directly adjacent to the zona pellucida", + "source": "https://en.wikipedia.org/wiki/Corona_radiata_(embryology)" + }, + "part_of": { + "value": "UBERON:0001306", + "label": "cumulus oophorus", + "evidence": "The corona radiata is the innermost layer of the cells of the cumulus oophorus and is directly adjacent to the zona pellucida", + "source": "https://en.wikipedia.org/wiki/Corona_radiata_(embryology)" + }, + "composed_primarily_of": { + "value": "CL:0000501", + "label": "granulosa cell", + "evidence": "These cuboidal granulosa cells, also known as the granulosa radiata, form more layers throughout the maturation process", + "source": "https://en.wikipedia.org/wiki/Corona_radiata_(embryology)" + }, + "bounding_layer_of": { + "value": "UBERON:0000086", + "label": "zona pellucida", + "evidence": "directly adjacent to the zona pellucida, the inner protective glycoprotein layer of the ovum", + "source": "https://en.wikipedia.org/wiki/Corona_radiata_(embryology)", + "caveat": "The corona radiata is the innermost cell layer immediately external to the zona pellucida; whether 'bounding_layer_of' fits as cleanly here as for zona pellucida->oocyte is debatable. Mirrors the precedent at UBERON:0000086 (relationship: bounding_layer_of CL:0000023 ! oocyte). Could alternatively be modeled as surrounds zona pellucida." + }, + "develops_from": { + "value": "UBERON:0005170", + "label": "granulosa cell layer", + "evidence": "It is formed by follicle cells adhering to the oocyte before it leaves the ovarian follicle, and originates from the squamous granulosa cells present at the primordial stage", + "source": "https://en.wikipedia.org/wiki/Corona_radiata_(embryology)" + }, + "has_function": { + "value": null, + "label": "supply of proteins to the oocyte", + "evidence": "Its main purpose in many animals is to supply vital proteins to the cell", + "source": "https://en.wikipedia.org/wiki/Corona_radiata_(embryology)" + }, + "candidate_xrefs": [ + {"xref": "FMA:18674", "note": "FMA has a corona radiata of oocyte concept; verify exact ID before use"}, + {"xref": "Wikipedia:Corona_radiata_(embryology)"} + ], + "candidate_synonyms": [ + {"synonym": "granulosa radiata", "scope": "RELATED", "evidence": "These cuboidal granulosa cells, also known as the granulosa radiata"} + ], + "notes": "Simple is_a (cell layer) + part_of (cumulus oophorus) + composed_primarily_of (granulosa cell) covers the core. The bounding_layer_of zona pellucida and develops_from granulosa cell layer enrichments are well supported by the Wikipedia source but a primary anatomical/embryology textbook citation (e.g. Gray's Anatomy or a PMID review) would be preferable before commit. Disambiguation from UBERON:0004682 (corona radiata of neuraxis) is essential — the brain term already carries 'corona radiata' as an EXACT synonym at NLXANAT:090903, so any new ovarian term should likely use 'corona radiata of oocyte' or 'corona radiata (ovary)' as the primary label to avoid label collisions." +} diff --git a/bulk_ntr_workflow/experiments/enriched_corpus_luteum_granulosa_lutein.json b/bulk_ntr_workflow/experiments/enriched_corpus_luteum_granulosa_lutein.json new file mode 100644 index 000000000..2500e70d4 --- /dev/null +++ b/bulk_ntr_workflow/experiments/enriched_corpus_luteum_granulosa_lutein.json @@ -0,0 +1,35 @@ +{ + "label": "corpus luteum granulosa lutein layer", + "is_a": { + "value": "UBERON:0000119", + "label": "cell layer", + "evidence": "Cell layer: 'Portion of tissue, that consists of single layer of cells connected to each other by cell junctions. Examples: layer of glial cells; epithelium.' Sibling ovarian-follicle layer terms 'granulosa cell layer' (UBERON:0005170) and 'theca cell layer' (UBERON:0000155) both use UBERON:0000119 as their genus via intersection_of, with composed_primarily_of pointing to the constituent cell type.", + "source": "src/ontology/uberon-edit.obo (UBERON:0000119, UBERON:0005170, UBERON:0000155)" + }, + "part_of": { + "value": "UBERON:0002512", + "label": "corpus luteum", + "evidence": "The granulosa lutein layer is the inner cellular layer of the corpus luteum, derived from the granulosa cells of the ovulated follicle. Corpus luteum stanza: 'A transient endocrine gland that develops from the postovulatory or atretic follicles and secretes progesterone' with relationship: has_part CL:0000175 ! luteal cell.", + "source": "src/ontology/uberon-edit.obo (UBERON:0002512); user prompt" + }, + "composed_primarily_of": { + "value": "CL:0000592", + "label": "large luteal cell", + "evidence": "CL:0000592 large luteal cell is defined as 'A large, progesterone secreting cell in the corpus luteum that develops from the granulosa cells.' This is the granulosa-derived luteal cell population (granulosa-lutein cells); CL has no separately named 'granulosa-lutein cell' class. CL:0000175 luteal cell is the broader parent already used by UBERON:0002512.", + "source": "OLS4 CL:0000592 (https://www.ebi.ac.uk/ols4/ontologies/cl/classes/http%253A%252F%252Fpurl.obolibrary.org%252Fobo%252FCL_0000592)", + "notes": "CL:0000592 corresponds to granulosa-lutein cells in human/primate corpus luteum. If a curator wants stricter parent semantics, CL:0000175 (luteal cell) is the conservative fallback already used by the parent corpus luteum term." + }, + "has_part": { + "value": null, + "label": null, + "evidence": "No additional has_part component cleanly resolves; composed_primarily_of CL:0000592 already captures the dominant cellular constituent. Sibling layer terms (granulosa cell layer UBERON:0005170, theca cell layer UBERON:0000155) do not assert has_part beyond their composed_primarily_of cell type.", + "source": "src/ontology/uberon-edit.obo (UBERON:0005170, UBERON:0000155)" + }, + "has_function": { + "value": "estrogen biosynthesis / steroidogenesis (granulosa-lutein cells of the corpus luteum produce estrogens; large luteal cells also secrete progesterone)", + "evidence": "CL:0000592 large luteal cell definition: 'A large, progesterone secreting cell in the corpus luteum that develops from the granulosa cells.' User prompt: '...produces estrogens'. Theca cell layer function_notes (UBERON:0000155) corroborate the substrate-handoff model: 'theca folliculi are responsible for the production of testosterone from androstenedione in females, and indirectly the production of estrogens by supplying the neighboring granulosa cells with androstenedione that can then be used as a substrate for aromatase.'", + "source": "OLS4 CL:0000592 description; src/ontology/uberon-edit.obo (UBERON:0000155 function_notes); user prompt", + "notes": "Free-text only — no GO term resolved here. Candidate GO terms for a future curator pass: GO:0006703 (estrogen biosynthetic process) and GO:0006700 (C21-steroid hormone biosynthetic process)." + }, + "notes": "is_a (UBERON:0000119 cell layer) + part_of (UBERON:0002512 corpus luteum) + composed_primarily_of (CL:0000592 large luteal cell) is sufficient to give this term a clean Aristotelian logical definition that mirrors the sibling pattern used by UBERON:0005170 (granulosa cell layer) and UBERON:0000155 (theca cell layer), both of which use intersection_of: cell layer / composed_primarily_of / part_of . So a parallel intersection_of axiomatisation works here: cell layer AND composed_primarily_of some 'large luteal cell' AND part_of some 'corpus luteum'. The is_a + part_of pair alone (without composed_primarily_of) would NOT distinguish this layer from the theca-lutein layer of the same corpus luteum, so composed_primarily_of is load-bearing. No CL term named 'granulosa-lutein cell' exists; CL:0000592 large luteal cell is the closest match by definition (granulosa-derived, progesterone-secreting). The corpus luteum is a transient gland and is_a endocrine gland — but for the LAYER term, cell layer is the correct genus, not gland." +} diff --git a/bulk_ntr_workflow/experiments/enriched_corpus_luteum_theca.json b/bulk_ntr_workflow/experiments/enriched_corpus_luteum_theca.json new file mode 100644 index 000000000..22ad425f5 --- /dev/null +++ b/bulk_ntr_workflow/experiments/enriched_corpus_luteum_theca.json @@ -0,0 +1,41 @@ +{ + "label": "corpus luteum granulosa theca layer", + "is_a": { + "value": "UBERON:0000119", + "label": "cell layer", + "evidence": "Sibling layered ovarian structures use 'cell layer' as genus: UBERON:0005170 'granulosa cell layer' has intersection_of: UBERON:0000119 ! cell layer; UBERON:0000155 'theca cell layer' has intersection_of: UBERON:0000119 ! cell layer.", + "source": "src/ontology/uberon-edit.obo (UBERON:0005170, UBERON:0000155)" + }, + "part_of": { + "value": "UBERON:0002512", + "label": "corpus luteum", + "evidence": "The HRA source describes this as a layer of the corpus luteum. UBERON:0002512 corpus luteum is defined as 'A transient endocrine gland that develops from the postovulatory or atretic follicles and secretes progesterone'.", + "source": "src/ontology/uberon-edit.obo (UBERON:0002512); HRA ASCTB ovary table" + }, + "has_part_granulosa_lutein": { + "value": "CL:0000592", + "label": "large luteal cell (granulosa-lutein cell)", + "evidence": "OLS4 search for 'granulosa lutein cell' in CL returns CL:0000592 'large luteal cell' as the top match; granulosa-lutein cells are the large luteal cells derived from granulosa cells of the ruptured follicle.", + "source": "https://www.ebi.ac.uk/ols4/api/search?q=granulosa+lutein+cell&ontology=cl" + }, + "has_part_theca_lutein": { + "value": "CL:0000590", + "label": "small luteal cell (theca-lutein cell)", + "evidence": "OLS4 search for 'theca lutein cell' in CL returns CL:0000590 'small luteal cell' as the top match; theca-lutein cells are the small luteal cells derived from theca interna cells of the ruptured follicle.", + "source": "https://www.ebi.ac.uk/ols4/api/search?q=theca+lutein+cell&ontology=cl" + }, + "composed_primarily_of": { + "value": "CL:0000175", + "label": "luteal cell", + "evidence": "Sibling layered ovarian structures use composed_primarily_of for the dominant cell type (UBERON:0000155 theca cell layer: composed_primarily_of CL:0000503 ! theca cell; UBERON:0005170 granulosa cell layer is composed primarily of granulosa cells). The HRA term combines both luteinized cell types, whose common parent is CL:0000175 luteal cell.", + "source": "src/ontology/uberon-edit.obo (UBERON:0000155 pattern); CL:0000175 is the luteal cell parent of CL:0000590 and CL:0000592" + }, + "has_function": { + "value": null, + "label": "steroidogenesis (progesterone and estrogen synthesis)", + "evidence": "UBERON:0002512 corpus luteum def: 'A transient endocrine gland that develops from the postovulatory or atretic follicles and secretes progesterone'. UBERON:0000155 theca cell layer function_notes: 'The theca folliculi are responsible for the production of testosterone from androstenedione in females, and indirectly the production of estrogens by supplying the neighboring granulosa cells with androstenedione that can then be used as a substrate for aromatase.' UBERON:0000157 theca interna def notes: 'Androstenedione ultimately gives the granulosa cells the precursor substrate for estrogen manufacturing.'", + "source": "src/ontology/uberon-edit.obo (UBERON:0002512, UBERON:0000155, UBERON:0000157)", + "notes": "No GO term ID resolved here; steroidogenesis is the recognised function of luteal cells but a specific GO function ID was not looked up in this enrichment." + }, + "notes": "This term is unusual: HRA defines it as a SINGLE layer of the corpus luteum that contains BOTH granulosa-lutein and theca-lutein cells. The standard textbook view of the mature corpus luteum is that granulosa-lutein cells form the bulk of the parenchyma (centrally), while theca-lutein cells are smaller, peripheral cells often interspersed at the margins / along septa rather than forming a discrete second layer. So HRA's 'combined' layer is anatomically defensible but conflicts with the binary split modelled for follicles in UBERON (separate granulosa cell layer UBERON:0005170 and theca cell layer UBERON:0000155). Simple is_a (cell layer) + part_of (corpus luteum) is INSUFFICIENT to capture the term's distinguishing feature — that it co-contains two specific luteinized cell types. Recommended axiomatisation: is_a UBERON:0000119 cell layer; part_of UBERON:0002512 corpus luteum; has_part CL:0000592 (granulosa-lutein/large luteal cell); has_part CL:0000590 (theca-lutein/small luteal cell); composed_primarily_of CL:0000175 luteal cell. The has_part axioms are what give this term its specific identity vs a hypothetical 'cell layer of corpus luteum' grouping class. Curator may wish to consider whether HRA actually means the entire luteal parenchyma rather than a discrete layer — in which case 'parenchyma of corpus luteum' might be a better label. Note also the CL mappings: granulosa-lutein cell = CL:0000592 large luteal cell; theca-lutein cell = CL:0000590 small luteal cell — these synonyms should be confirmed against the CL stanzas before finalising." +} diff --git a/bulk_ntr_workflow/experiments/enriched_early_antral_follicle.json b/bulk_ntr_workflow/experiments/enriched_early_antral_follicle.json new file mode 100644 index 000000000..85a8c47e3 --- /dev/null +++ b/bulk_ntr_workflow/experiments/enriched_early_antral_follicle.json @@ -0,0 +1,43 @@ +{ + "term": "early antral follicle", + "description": "A follicle stage between secondary follicle and full antral (tertiary) follicle, characterized by the initial formation of an antrum; sometimes called 'secondary follicle with antrum' or 'early tertiary follicle'.", + "fields": { + "is_a": { + "value": "UBERON:0000037", + "label": "tertiary ovarian follicle", + "evidence": "UBERON:0000037 (tertiary ovarian follicle) is defined as 'A follicle that has reached the most mature stage of folliculogenesis, characterized by the presence of the antrum.' Since 'early antral' is defined by the *initial formation of an antrum*, it sits within the antral (tertiary) class as a sub-stage. UBERON:0000036 (secondary) is explicitly described as 'up to the onset of antrum formation' — i.e. pre-antral — so an early antral follicle is no longer secondary. Tertiary therefore is the appropriate genus.", + "source": "src/ontology/uberon-edit.obo (UBERON:0000037 def: 'A follicle that has reached the most mature stage of folliculogenesis, characterized by the presence of the antrum.'; UBERON:0000036 def: '...up to the onset of antrum formation.')" + }, + "has_part": { + "value": "UBERON:0000039", + "label": "follicular antrum", + "evidence": "Tertiary ovarian follicle uses 'intersection_of: has_part UBERON:0000039 ! follicular antrum' as its defining differentia. An early antral follicle, by definition, has a (newly forming) antrum, so the same has_part relation applies. The 'early' qualifier modifies maturity/size of the antrum, not its presence.", + "source": "src/ontology/uberon-edit.obo UBERON:0000037 stanza: 'intersection_of: has_part UBERON:0000039 ! follicular antrum'" + }, + "has_component": { + "value": "UBERON:0005170", + "label": "granulosa cell layer", + "evidence": "Both UBERON:0000036 (secondary) and UBERON:0000037 (tertiary) carry 'intersection_of: has_component UBERON:0005170 {minCardinality=\"2\"} ! granulosa cell layer'. An early antral follicle, derived from a secondary follicle that already has multiple granulosa layers, also has multilayered granulosa, so the same minCardinality=2 has_component constraint applies.", + "source": "src/ontology/uberon-edit.obo UBERON:0000036 and UBERON:0000037: 'intersection_of: has_component UBERON:0005170 {minCardinality=\"2\"} ! granulosa cell layer'" + }, + "develops_from": { + "value": "UBERON:0000036", + "label": "secondary ovarian follicle", + "evidence": "Existing chain in uberon-edit.obo: primary -> secondary -> tertiary uses 'relationship: develops_from' at each step. UBERON:0000037 (tertiary) has 'relationship: develops_from UBERON:0000036 ! secondary ovarian follicle'. An early antral follicle, as the entry sub-stage of the tertiary/antral phase, develops directly from a secondary (pre-antral) follicle, mirroring the existing developmental edge.", + "source": "src/ontology/uberon-edit.obo UBERON:0000037: 'relationship: develops_from UBERON:0000036 ! secondary ovarian follicle'; UBERON:0000036: 'relationship: develops_from UBERON:0000035 ! primary ovarian follicle'" + }, + "has_potential_to_develop_into": { + "value": "UBERON:0000037", + "label": "tertiary ovarian follicle", + "evidence": "UBERON:0000036 already uses 'intersection_of: has_potential_to_develop_into UBERON:0000037 ! tertiary ovarian follicle' to express progression. If 'early antral' is modeled as a sub-stage *within* tertiary (is_a UBERON:0000037), this field is not needed (it would be tautological — a thing has potential to develop into itself). If instead the term were modeled as a separate class between secondary and tertiary, then has_potential_to_develop_into UBERON:0000037 would mirror the secondary->tertiary pattern. Including conditionally; preferred modeling (is_a tertiary) makes this redundant.", + "source": "src/ontology/uberon-edit.obo UBERON:0000036: 'intersection_of: has_potential_to_develop_into UBERON:0000037 ! tertiary ovarian follicle'" + }, + "has_quality": { + "value": null, + "label": null, + "evidence": "No PATO/quality term is used on UBERON:0000035/0036/0037 stanzas to denote the 'early/late' stage descriptor — staging is encoded structurally via has_part (antrum present/absent) and has_component cardinality on granulosa layers, plus develops_from chains. There is no in-file quoted evidence supporting a has_quality axiom for follicle stages, so this field is left empty.", + "source": "src/ontology/uberon-edit.obo UBERON:0000035, UBERON:0000036, UBERON:0000037 stanzas (no relationship: has_quality ... present)" + } + }, + "notes": "Simple is_a + part_of is INSUFFICIENT to express ovarian follicle staging in a logically coherent way. The existing UBERON pattern for primary/secondary/tertiary follicles relies on three coordinated axiom types: (1) has_component UBERON:0005170 (granulosa cell layer) with cardinality / minCardinality constraints (1 for primary, >=2 for secondary and tertiary) to capture cellular maturity; (2) has_part UBERON:0000039 (follicular antrum) to mark the categorical jump into the antral phase (only tertiary has this); and (3) develops_from chains tying the stages into a developmental sequence (primordial -> primary -> secondary -> tertiary), with optional has_potential_to_develop_into projecting the next stage. For 'early antral follicle' specifically, the antrum is the defining feature (so has_part UBERON:0000039 is essential — distinguishing it from secondary), while granulosa multilayering is inherited from secondary (so has_component minCardinality=2 is essential — distinguishing it from primary). Modeling as is_a UBERON:0000037 (tertiary) with develops_from UBERON:0000036 (secondary) is the cleanest fit; an additional qualifier (e.g. 'early' as a stage subset, comment, or PATO quality) would be needed to discriminate early antral from later/Graafian antral stages, since the existing axioms alone do not separate antral sub-stages. No PATO has_quality pattern is currently used by sibling follicle terms, so introducing one would be a modeling extension rather than mirroring existing practice." +} diff --git a/bulk_ntr_workflow/experiments/enriched_transitional_primary_follicle.json b/bulk_ntr_workflow/experiments/enriched_transitional_primary_follicle.json new file mode 100644 index 000000000..1d14210ac --- /dev/null +++ b/bulk_ntr_workflow/experiments/enriched_transitional_primary_follicle.json @@ -0,0 +1,37 @@ +{ + "label": "transitional primary ovarian follicle", + "is_a": { + "value": "UBERON:0000035", + "label": "primary ovarian follicle", + "evidence": "A follicle in transition between primordial and primary stages, with cuboidal granulosa cells appearing among the flat squamous cells of the primordial stage. UBERON:0000035 (primary ovarian follicle) is defined as 'An ovarian follicle that has one layer of granulosa cells.' Existing follicle stage terms (primordial, primary, secondary, tertiary) are subclasses of UBERON:0001305 ovarian follicle directly; however, transitional primary is best treated as a developmental sub-stage of the primary stage because the appearance of cuboidal granulosa cells (the defining hallmark of the primary follicle) has begun.", + "source": "UBERON:0000035 def + task brief" + }, + "has_part": { + "value": "UBERON:0005170", + "label": "granulosa cell layer", + "evidence": "UBERON:0000035 (primary) has axiom 'has_component UBERON:0005170 {cardinality=\"1\"}'; UBERON:0000036 (secondary) has 'has_component UBERON:0005170 {minCardinality=\"2\"}'. The transitional primary follicle by definition still has a single granulosa cell layer, but with a mixed flat-squamous and cuboidal population of granulosa cells.", + "source": "uberon-edit.obo (UBERON:0000035, UBERON:0000036)", + "notes": "Could be encoded as 'has_component UBERON:0005170 {cardinality=\"1\"}' to mirror the primary follicle pattern. The mixed squamous/cuboidal cell composition is a quality of the granulosa cells, not a separable part." + }, + "develops_from": { + "value": "UBERON:0003981", + "label": "primordial ovarian follicle", + "evidence": "Primordial follicles 'develop to primary, secondary, and finally mature vesicular follicles' (UBERON:0003981 def). UBERON:0000035 (primary) carries 'relationship: develops_from UBERON:0003981'. The transitional primary follicle sits on the primordial->primary trajectory and inherits this develops_from from its primary-stage genus.", + "source": "uberon-edit.obo (UBERON:0003981 def; UBERON:0000035 develops_from)" + }, + "has_potential_to_develop_into": { + "value": "UBERON:0000035", + "label": "primary ovarian follicle", + "evidence": "By definition the transitional primary follicle is on its way to becoming a fully primary follicle (a single complete layer of cuboidal granulosa cells). This mirrors UBERON:0000036 (secondary) which uses 'intersection_of: has_potential_to_develop_into UBERON:0000037 ! tertiary ovarian follicle'.", + "source": "task brief; UBERON:0000036 axiom pattern", + "notes": "Only meaningful if the term is treated as a sub-stage distinct from the (fully) primary follicle. If is_a UBERON:0000035 is asserted, has_potential_to_develop_into UBERON:0000035 becomes self-referential via the genus and may be redundant or inconsistent." + }, + "has_quality": { + "value": null, + "label": "transitional / mixed granulosa cell morphology", + "evidence": "Defining feature: 'with cuboidal granulosa cells appearing among the flat squamous cells of the primordial stage' - granulosa cells are heterogeneous in shape (mix of squamous and cuboidal). No clear PATO quality term resolved without an OLS4 lookup.", + "source": "task brief", + "notes": "Left unresolved; this could be captured with PATO 'mixed' / 'heterogeneous' qualities applied to the granulosa cell layer, but is probably best left implicit in the textual definition." + }, + "notes": "A simple is_a UBERON:0000035 (primary ovarian follicle) plus develops_from UBERON:0003981 (primordial ovarian follicle) is likely sufficient and follows the pattern used for the existing follicle-stage terms in UBERON. The 'has_component UBERON:0005170 {cardinality=\"1\"}' axiom is inherited from primary follicle and need not be re-asserted. The distinguishing feature (mixed flat/cuboidal granulosa cells) is hard to capture as a clean logical axiom without a PATO quality, and is best left in the textual definition. has_potential_to_develop_into UBERON:0000035 only makes sense if the transitional class is taxonomically separated from primary follicle - probably better to drop it and rely on is_a + develops_from. Existing stage terms (primordial, primary, secondary, tertiary) are direct subclasses of UBERON:0001305 ovarian follicle, but treating transitional primary as is_a primary follicle (per task brief) better reflects that cuboidal granulosa cells - the hallmark of the primary stage - have already appeared." +} From c544244be7298986e2206469992d955f2dd79c7f Mon Sep 17 00:00:00 2001 From: David Osumi-Sutherland Date: Tue, 28 Apr 2026 18:53:37 +0100 Subject: [PATCH 06/22] Phase 6 + Phase 7 (skeletal-muscle): system overlays + develops_from MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stage 1 now partitions input rows by source `tables` value into system overlays. Each overlay produces its own clean leaf template with system-specific columns; unmapped tables go to the default template. Phase 6 — develops_from on default leaf template - New optional column with directive `SC RO:0002202 some %` - Empty cell → no axiom (standard ROBOT pattern; do NOT alter directive to work around empty cells) - Populated by agent for stage series (follicle stages, embryonic stages, etc.) Phase 7 — skeletal-muscle overlay - New muscle template variant: -muscle.template.tsv - Adds has_muscle_origin (RO:0002372), has_muscle_insertion (RO:0002373), innervated_by (RO:0002005) - All optional; populated by agent only with evidence-quoted UBERON IDs - Triggered by source table value `muscular-system` (SYSTEM_OVERLAYS map) Implementation notes: - generate_template.py: SYSTEM_OVERLAYS, classify_system(), overlay_paths(); per-row routing builds leaf_rows_by_overlay dict; one template TSV written per overlay - group_terms_by_parent.py: reads ALL leaf templates (default + system overlays) via discover_leaf_templates(); each per-term JSON entry now carries `system` field - merge_definitions.py: REFACTORED to use header-name lookup (header_indices()) instead of hardcoded column indices. Each leaf template variant's columns are looked up at merge time. Optional logic columns (develops_from, has_muscle_*) populate from leaf_template_rows[label] when both column and value exist. - agent spec: documents system field, develops_from + muscle-overlay guidance; output JSON example shows the optional fields - CLAUDE.md: column reference splits leaf table into default + muscle overlay; new partitioning subsection Smoke-tested with --table muscular-system --limit 10: - Step 0 routing correctly outputs muscle=8, group=2 (no default partition since all 10 rows are muscular-system) - Output template has 16 columns with the 6 expected logic relations (is_a + part_of + develops_from + 3 muscle) - Merge with existing leaf_template_rows from previous run still works via legacy is_a + part_of fallback (Optional cols filled: 0 because agents haven't been re-run with new spec) Phase 8 (term promotion) and overlays for skeleton/vasculature/nervous documented in ROADMAP only — not implemented. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/agents/ntr-term-researcher.md | 50 +++- bulk_ntr_workflow/CLAUDE.md | 29 ++ bulk_ntr_workflow/ROADMAP.md | 99 ++++++ .../scripts/generate_template.py | 112 +++++-- .../scripts/group_terms_by_parent.py | 137 +++++---- .../scripts/merge_definitions.py | 283 +++++++++++------- 6 files changed, 528 insertions(+), 182 deletions(-) diff --git a/.claude/agents/ntr-term-researcher.md b/.claude/agents/ntr-term-researcher.md index 0ef799ce9..90344eb93 100644 --- a/.claude/agents/ntr-term-researcher.md +++ b/.claude/agents/ntr-term-researcher.md @@ -46,6 +46,7 @@ The file contains: "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900001", "label": "term label", "term_type": "leaf", + "system": "default | muscle", "is_a": "INFER:UBERON:xxxxxxx | NEEDS_MAPPING:FMA:nnnnn | UNRESOLVABLE:...", "part_of": "INFER:UBERON:xxxxxxx | ...", "def_xref": "ref1|ref2|..." @@ -232,6 +233,49 @@ convention typically populates both for specific named anatomical entities — e a fallback but `leaf_template_rows` is preferred — it expresses both axes simultaneously. +**Optional fields in `leaf_template_rows` (Phase 6 + 7):** + +The default leaf template has an OPTIONAL `develops_from` column. The muscular-system +overlay also has `has_muscle_origin`, `has_muscle_insertion`, `innervated_by` columns. +Populate any of these in `leaf_template_rows[label]` when you have evidence: + +```json +"leaf_template_rows": { + "early antral follicle": { + "is_a": "UBERON:0000037", + "develops_from": "UBERON:0000036" + }, + "articularis genu muscle": { + "is_a": "UBERON:0001630", + "part_of": "UBERON:0000376", + "has_muscle_origin": "UBERON:0000981", + "has_muscle_insertion": "UBERON:0000976", + "innervated_by": "UBERON:0001267" + } +} +``` + +The merge step writes any of these to the corresponding column IF the column exists in +the current template variant. Unknown fields are silently dropped — you don't need to +know which template the row belongs to. Just emit whatever you can populate with +evidence. + +**Stage-series guidance for `develops_from`:** + +For terms in a developmental sequence (follicle stages, embryonic stages, hematopoietic +differentiation), look up the precursor stage via OLS4 / awk and emit `develops_from`. +Example: `early antral follicle` develops_from `secondary ovarian follicle` +(UBERON:0000036). + +**Muscle-overlay guidance for `has_muscle_origin`/`has_muscle_insertion`/`innervated_by`:** + +For `system: "muscle"` terms (the per-group JSON contains a `system` field per term), +extract origin/insertion/innervation from Wikipedia + UBERON precedent. The bone or +nerve labels in Wikipedia text typically need OLS4 lookup to resolve to UBERON IDs +(e.g. "femur" → UBERON:0000981, "femoral nerve" → UBERON:0001267). If a UBERON ID +cannot be resolved (named bone landmark, specific nerve branch missing from UBERON), +omit that field rather than guess. + **Worked examples:** - `clavicular head of pectoralis major muscle`: @@ -332,7 +376,11 @@ Save to: `bulk_ntr_workflow/outputs/definitions/{group_name}.json` "leaf_template_rows": { "leaf term label": { "is_a": "UBERON:0011906", - "part_of": "UBERON:0002381" + "part_of": "UBERON:0002381", + "develops_from": "UBERON:0000036", + "has_muscle_origin": "UBERON:0001105", + "has_muscle_insertion": "UBERON:0000976", + "innervated_by": "UBERON:0003726" } }, "resolved_relationships": { diff --git a/bulk_ntr_workflow/CLAUDE.md b/bulk_ntr_workflow/CLAUDE.md index 64177d969..137ebef3b 100644 --- a/bulk_ntr_workflow/CLAUDE.md +++ b/bulk_ntr_workflow/CLAUDE.md @@ -206,6 +206,7 @@ After QC, both templates need to be registered with ODK. | def_xref | >A oboInOwl:hasDbXref SPLIT=\| | References + ASCTB-TEMP IRI | | is_a | SC % | Genus class (structural type or classification parent) | | part_of | SC BFO:0000050 some % | Containing structure | +| develops_from | SC RO:0002202 some % | Optional. Developmental precursor (stage series) | | In_subset | AI oboInOwl:inSubset | `added_by_HRA` subset IRI | | Date | AT dcterms:date^^xsd:dateTime | ISO timestamp | | Contributor | AI dcterms:contributor | ORCID IRI | @@ -213,6 +214,34 @@ After QC, both templates need to be registered with ODK. | Wikipedia_image | A foaf:depiction | Wikipedia image URL | | xref | A oboInOwl:hasDbXref SPLIT=\| | Direct term xrefs: Wikipedia article + FMA ID | +### Muscle leaf template (`-muscle.template.tsv`) — Phase 7 overlay + +Used automatically when the source `tables` value is `muscular-system`. Adds three +columns between `develops_from` and `In_subset`: + +| Header | ROBOT directive | Notes | +|---|---|---| +| has_muscle_origin | SC RO:0002372 some % | Bone/structure the muscle arises from | +| has_muscle_insertion | SC RO:0002373 some % | Bone/structure the muscle inserts onto | +| innervated_by | SC RO:0002005 some % | Motor nerve | + +All three are OPTIONAL — empty cell ⇒ no axiom. Populate only when Wikipedia + +UBERON precedent provide a resolvable UBERON ID for the related entity. + +### Template variants and partitioning + +Stage 1 partitions input rows by source `tables` column → system overlay map: + +| Source table value | Overlay | Output template | +|---|---|---| +| `muscular-system` | `muscle` | `-muscle.template.tsv` | +| (anything else) | `default` | `.template.tsv` | + +A single Stage 1 run can produce multiple leaf templates if the input has rows from +mixed tables (each system gets its own clean template — no muscle-specific empty +columns appear in non-muscle templates). The routing decision is printed at the start +of Stage 1 as `Step 0 routing: muscle=N, default=M, group=K`. + ### Groups template (`-groups.template.tsv`) — equivalent class Same as leaf, with `is_a` / `part_of` replaced by `genus` / `location`: diff --git a/bulk_ntr_workflow/ROADMAP.md b/bulk_ntr_workflow/ROADMAP.md index 6729b575f..00a39267f 100644 --- a/bulk_ntr_workflow/ROADMAP.md +++ b/bulk_ntr_workflow/ROADMAP.md @@ -302,3 +302,102 @@ Once Phase 2 is implemented, run the complete 75-term muscular-system table. Exp Generalise to other ASCTB tables (nervous system, vasculature, etc.). The grouping vs leaf distinction will apply across systems (e.g. "artery of X" vs "X artery", "region of cortex" vs "X gyrus"). + +--- + +## Phase 6: Optional `develops_from` column on default leaf template ✅ + +**Status:** complete. + +Added an optional `develops_from` column with directive `SC RO:0002202 some %` to the +default leaf template. Empty cell → no axiom emitted by ROBOT. Populated by the agent +when Wikipedia + UBERON precedent indicate a developmental precursor (stage series: +follicle stages, embryonic stages, hematopoietic differentiation, etc.). + +Agent emits via `leaf_template_rows[label].develops_from` in its JSON output. Merge +silently drops the field if the column is absent in the current template variant. + +--- + +## Phase 7: System overlays + +The default leaf template captures only `is_a`, `part_of`, and (optional) `develops_from`. +Some anatomical systems benefit substantially from additional axiomatic richness (origin, +insertion, innervation for muscles; arterial supply / drainage for vasculature; etc.). +Phase 7 implements per-system template overlays — a system overlay is a leaf template +variant with extra columns covering system-specific connectivity relations. + +Stage 1 routes input rows to the appropriate overlay based on the source `tables` +column. Per-system separation keeps each output template clean (no muscle-specific +empty columns in non-muscle templates). + +### Phase 7 — Skeletal muscle overlay ✅ + +**Status:** complete. + +For inputs with `tables == muscular-system`, Stage 1 produces +`-muscle.template.tsv` instead of (or alongside) the default leaf template, +adding three columns: + +| Column | ROBOT directive | Relation | +|---|---|---| +| has_muscle_origin | SC RO:0002372 some % | bone/structure muscle arises from | +| has_muscle_insertion | SC RO:0002373 some % | bone/structure muscle inserts onto | +| innervated_by | SC RO:0002005 some % | motor nerve | + +All three OPTIONAL — populated only with evidence-quoted UBERON IDs. Coverage gaps +(e.g. "lateral pectoral nerve" not in UBERON) are captured as free-text notes in the +agent's output rather than guessed UBERON IDs. + +### Phase 7 — Future overlays (NOT IMPLEMENTED) + +| System | Source table | Suggested fields | Notes | +|---|---|---|---| +| Skeletal | `skeletal-system`? | `articulates_with`, `ossifies_via`, `composed_primarily_of` (bone tissue) | Bones often have rich articulation patterns | +| Vasculature | `vasculature` | `arterial_supply_to`, `drains_into`, `branch_of` | Connectivity is central to vasculature semantics | +| Nervous system | `nervous-system`, `allen-brain` | `innervates`, `synapsed_to`, `axon_in` | Cell-type heavy; CL ontology integration matters | + +Each overlay should be added only when there's a real bulk NTR batch that would benefit +from it. The skeletal-muscle overlay was justified by the muscle enrichment experiment +(see `bulk_ntr_workflow/experiments/SUMMARY.md`); future overlays should similarly +follow an enrichment-experiment validation step before code commits. + +--- + +## Phase 8: Term promotion to direct editing + +**Status:** roadmap only. + +When a templated term needs richer axiomatisation than its template supports — e.g. a +follicle stage that requires `has_component UBERON:0005170 minCardinality=2` (cardinality- +constrained intersection_of), or a complex term needing multiple `has_part` axioms with +CL: cell-type fillers — the templating system becomes a constraint rather than a help. + +The proposed remedy: a "promote to direct editing" agent that: + +1. Takes a term ID (or list) plus the desired richer axiom set. +2. Reads the current template TSV row for that ID. +3. Converts the row to OBO stanza form (mapping ROBOT directives back to OBO syntax: + `SC %` → `is_a`, `SC BFO:0000050 some %` → `relationship: part_of`, etc.). +4. Augments the stanza with the new axioms (intersection_of, cardinality, additional + relationship axioms). +5. Uses the standard checkout/checkin flow: writes to `terms/UBERON_NNNNNNN.obo`, then + `obo-checkin.pl` to merge into `uberon-edit.obo`. +6. Removes the row from the template TSV. +7. Runs the reasoner to confirm the new axiomatisation produces the expected + classification (no unsatisfiable, no unexpected new is_a). + +This solves the templating lock-in concern: any term can be promoted to direct editing +later without losing its UBERON ID or history. + +UX sketch: +```bash +bulk_ntr_workflow/scripts/promote_term.py UBERON:9900037 \ + --add 'intersection_of: UBERON:0001305' \ + --add 'intersection_of: has_component UBERON:0005170 {minCardinality="2"}' \ + --add 'relationship: develops_from UBERON:0000035' +``` + +Or for batches, a YAML/TSV input listing which terms to promote with which axiom sets. +The agent should handle is_a-inheritance carefully (the inferred is_a after +intersection_of must still resolve to the previous genus + the new differentia). diff --git a/bulk_ntr_workflow/scripts/generate_template.py b/bulk_ntr_workflow/scripts/generate_template.py index e2943789d..52b0e9373 100644 --- a/bulk_ntr_workflow/scripts/generate_template.py +++ b/bulk_ntr_workflow/scripts/generate_template.py @@ -41,24 +41,66 @@ WORK_DIR = NTR_ROOT / "outputs" WORK_DIR.mkdir(parents=True, exist_ok=True) -WORK_TSV = WORK_DIR / "template_initial.tsv" -WORK_GROUPS_TSV = WORK_DIR / "template_groups_initial.tsv" +WORK_TSV = WORK_DIR / "template_initial.tsv" # default leaf +WORK_GROUPS_TSV = WORK_DIR / "template_groups_initial.tsv" # groups +# System overlay working files: outputs/template__initial.tsv (created on demand) -# ROBOT template column headers and directives — LEAF template (asserted SC) +# ROBOT template column headers and directives — DEFAULT LEAF template (asserted SC) +# Phase 6: develops_from is OPTIONAL — empty cell ⇒ no axiom emitted by ROBOT TEMPLATE_HEADERS = [ "ID", "LABEL", "Definition", "def_xref", - "is_a", "part_of", + "is_a", "part_of", "develops_from", "In_subset", "Date", "Contributor", "Present_in_taxon", "Wikipedia_image", "xref", ] TEMPLATE_DIRECTIVES = [ "ID", "LABEL", "A IAO:0000115", ">A oboInOwl:hasDbXref SPLIT=|", - "SC %", "SC BFO:0000050 some %", + "SC %", "SC BFO:0000050 some %", "SC RO:0002202 some %", "AI oboInOwl:inSubset", "AT dcterms:date^^xsd:dateTime", "AI dcterms:contributor", "AI RO:0002175", "A foaf:depiction", "A oboInOwl:hasDbXref SPLIT=|", ] +# Phase 7: MUSCLE LEAF template overlay — adds muscle-specific relations. +# RO IDs: has_muscle_origin=RO:0002372, has_muscle_insertion=RO:0002373, innervated_by=RO:0002005 +# Inserted between develops_from and In_subset (positions 7-9). +MUSCLE_TEMPLATE_HEADERS = TEMPLATE_HEADERS[:7] + [ + "has_muscle_origin", "has_muscle_insertion", "innervated_by", +] + TEMPLATE_HEADERS[7:] +MUSCLE_TEMPLATE_DIRECTIVES = TEMPLATE_DIRECTIVES[:7] + [ + "SC RO:0002372 some %", "SC RO:0002373 some %", "SC RO:0002005 some %", +] + TEMPLATE_DIRECTIVES[7:] + +# Map source-table value to a system overlay name. Unmapped tables → 'default'. +# Future overlays for skeleton, vasculature, nervous-system go here (see ROADMAP). +SYSTEM_OVERLAYS = { + "muscular-system": "muscle", +} + +# Per-overlay header/directive sets +OVERLAY_TEMPLATES = { + "default": (TEMPLATE_HEADERS, TEMPLATE_DIRECTIVES), + "muscle": (MUSCLE_TEMPLATE_HEADERS, MUSCLE_TEMPLATE_DIRECTIVES), +} + + +def classify_system(record: dict) -> str: + """Return the system overlay name for a row; 'default' if no overlay applies.""" + return SYSTEM_OVERLAYS.get(record.get("table", ""), "default") + + +def overlay_paths(overlay: str, name: str) -> tuple[Path, Path]: + """Return (working_tsv, final_tsv) paths for a given overlay name.""" + templates_dir = REPO_ROOT / "src" / "templates" + if overlay == "default": + work = WORK_DIR / "template_initial.tsv" + final = templates_dir / f"{name}.template.tsv" + else: + work = WORK_DIR / f"template_{overlay}_initial.tsv" + final = templates_dir / f"{name}-{overlay}.template.tsv" + return work, final + + # ROBOT template — GROUPS template (equivalent class: genus + part_of some Y) GROUPS_TEMPLATE_HEADERS = [ "ID", "LABEL", "Definition", "def_xref", @@ -291,14 +333,15 @@ def process(input_path: Path, table_filter: str | None, start_id: int, name: str # Output paths templates_dir = REPO_ROOT / "src" / "templates" reports_dir = templates_dir / f"{name}-reports" - final_tsv = templates_dir / f"{name}.template.tsv" final_groups_tsv = templates_dir / f"{name}-groups.template.tsv" input_tsv = reports_dir / "input.tsv" errors_tsv = reports_dir / "errors.tsv" candidates_tsv = reports_dir / "candidates.tsv" reports_dir.mkdir(parents=True, exist_ok=True) - leaf_rows = [] + # Step 0: rows are partitioned by system overlay (default vs muscle vs ...). + # leaf_rows_by_overlay[overlay] holds the rows destined for that overlay's template. + leaf_rows_by_overlay: dict[str, list] = {} group_rows = [] error_rows = [] candidate_rows = [] @@ -383,29 +426,41 @@ def process(input_path: Path, table_filter: str | None, start_id: int, name: str own_fma, # xref — FMA from source IRI; subagent appends ]) else: - leaf_rows.append([ + overlay = classify_system(rec) + base_row = [ f"http://purl.obolibrary.org/obo/UBERON_{counter}", label, "[PENDING]", def_xref, is_a_val, part_of_val, + "", # develops_from — filled by subagent if applicable + ] + if overlay == "muscle": + base_row += ["", "", ""] # has_muscle_origin, has_muscle_insertion, innervated_by + base_row += [ SUBSET_IRI, CREATION_DATE, contributor_iri, TAXON_IRI, "", # Wikipedia_image — filled by subagent own_fma, - ]) + ] + leaf_rows_by_overlay.setdefault(overlay, []).append(base_row) counter += 1 - # Write LEAF working + final templates - for path in (WORK_TSV, final_tsv): - with open(path, "w", newline="", encoding="utf-8") as f: - writer = csv.writer(f, delimiter="\t") - writer.writerow(TEMPLATE_HEADERS) - writer.writerow(TEMPLATE_DIRECTIVES) - writer.writerows(leaf_rows) + # Write per-overlay LEAF working + final templates + overlay_summary = [] + for overlay, rows in sorted(leaf_rows_by_overlay.items()): + headers, directives = OVERLAY_TEMPLATES[overlay] + work_path, final_path = overlay_paths(overlay, name) + for path in (work_path, final_path): + with open(path, "w", newline="", encoding="utf-8") as f: + writer = csv.writer(f, delimiter="\t") + writer.writerow(headers) + writer.writerow(directives) + writer.writerows(rows) + overlay_summary.append((overlay, len(rows), final_path)) # Write GROUPS working + final templates for path in (WORK_GROUPS_TSV, final_groups_tsv): @@ -420,19 +475,24 @@ def process(input_path: Path, table_filter: str | None, start_id: int, name: str write_tsv(errors_tsv, ERROR_HEADERS, error_rows) write_tsv(candidates_tsv, CANDIDATE_HEADERS, candidate_rows) - print(f"Leaf template (working) → {WORK_TSV}") - print(f"Leaf template (final) → {final_tsv} ({len(leaf_rows)} rows)") - print(f"Groups template (working) → {WORK_GROUPS_TSV}") - print(f"Groups template (final) → {final_groups_tsv} ({len(group_rows)} rows)") - print(f"Reports → {reports_dir}/") - print(f" input.tsv {len(input_rows)} rows") - print(f" errors.tsv {len(error_rows)} rows") - print(f" candidates.tsv {len(candidate_rows)} rows") - + # Routing summary (Step 0) + parts = ", ".join(f"{ov}={n}" for ov, n, _ in overlay_summary) or "(none)" + print(f"Step 0 routing: {parts}, group={len(group_rows)}") + print() + for overlay, n, final_path in overlay_summary: + work_path, _ = overlay_paths(overlay, name) + print(f"Leaf template [{overlay}] → {final_path} ({n} rows)") + print(f"Groups template → {final_groups_tsv} ({len(group_rows)} rows)") + print(f"Reports → {reports_dir}/") + print(f" input.tsv {len(input_rows)} rows") + print(f" errors.tsv {len(error_rows)} rows") + print(f" candidates.tsv {len(candidate_rows)} rows") + + total_leaf = sum(len(r) for r in leaf_rows_by_overlay.values()) uberon_p = sum(1 for r in records if classify_parent(r["parent_id"]) == "uberon") fma_p = sum(1 for r in records if classify_parent(r["parent_id"]) == "fma") asctb_p = sum(1 for r in records if classify_parent(r["parent_id"]) == "asctb_temp") - print(f"\nTemplate rows: leaf={len(leaf_rows)} group={len(group_rows)} | " + print(f"\nTemplate rows: leaf={total_leaf} group={len(group_rows)} | " f"Parents: UBERON={uberon_p} FMA={fma_p} ASCTB-TEMP={asctb_p}") if asctb_p: print(f" ⚠ {asctb_p} terms have ASCTB-TEMP parents — " diff --git a/bulk_ntr_workflow/scripts/group_terms_by_parent.py b/bulk_ntr_workflow/scripts/group_terms_by_parent.py index 060c3b83b..26f56f356 100644 --- a/bulk_ntr_workflow/scripts/group_terms_by_parent.py +++ b/bulk_ntr_workflow/scripts/group_terms_by_parent.py @@ -23,29 +23,43 @@ from pathlib import Path ROOT = Path(__file__).resolve().parent.parent -INPUT_LEAF_TSV = ROOT / "outputs" / "template_initial.tsv" -INPUT_GROUPS_TSV = ROOT / "outputs" / "template_groups_initial.tsv" OUTPUT_DIR = ROOT / "outputs" / "definitions" / "input" OUTPUT_DIR.mkdir(parents=True, exist_ok=True) -# Leaf template column indices (after the 2 header rows) -# ID | LABEL | Definition | def_xref | is_a | part_of | ... -COL_ID = 0 -COL_LABEL = 1 -COL_DEF = 2 -COL_XREF = 3 -COL_IS_A = 4 -COL_PART_OF = 5 +# Discovered at runtime via glob over outputs/template_*_initial.tsv +LEAF_DEFAULT_TSV = ROOT / "outputs" / "template_initial.tsv" +INPUT_GROUPS_TSV = ROOT / "outputs" / "template_groups_initial.tsv" + +# Header column names — looked up per-template via header_indices() +H_ID, H_LABEL, H_DEF, H_DEFXREF = "ID", "LABEL", "Definition", "def_xref" +H_IS_A, H_PART_OF = "is_a", "part_of" +H_GENUS, H_LOCATION = "genus", "location" + -# Groups template column indices — same first 4, then genus + location -COL_GENUS = 4 -COL_LOCATION = 5 +def header_indices(header_row: list[str]) -> dict[str, int]: + return {h.strip(): i for i, h in enumerate(header_row)} -def extract_parent_info(row: list[str]) -> tuple[str, str]: +def discover_leaf_templates() -> list[Path]: + """Return all leaf template working files (default + system overlays). + + Convention: outputs/template_initial.tsv (default), outputs/template__initial.tsv. + """ + out_dir = ROOT / "outputs" + paths = [] + if LEAF_DEFAULT_TSV.exists(): + paths.append(LEAF_DEFAULT_TSV) + for p in sorted(out_dir.glob("template_*_initial.tsv")): + if p.name in ("template_initial.tsv", "template_groups_initial.tsv"): + continue + paths.append(p) + return paths + + +def extract_parent_info(row: list[str], idx: dict[str, int]) -> tuple[str, str]: """Return (parent_id, parent_label) from a leaf template's is_a/part_of cells.""" - is_a = row[COL_IS_A].strip() - part_of = row[COL_PART_OF].strip() + is_a = row[idx[H_IS_A]].strip() if H_IS_A in idx else "" + part_of = row[idx[H_PART_OF]].strip() if H_PART_OF in idx else "" for val in (is_a, part_of): m = re.match(r'^(UBERON:\d{7})$', val) @@ -72,58 +86,75 @@ def make_group_name(parent_id: str, parent_label: str) -> str: def process() -> None: - if not INPUT_LEAF_TSV.exists(): - raise FileNotFoundError(f"Input not found: {INPUT_LEAF_TSV}\nRun generate_template.py first.") + leaf_paths = discover_leaf_templates() + if not leaf_paths: + raise FileNotFoundError( + f"No leaf templates found in {ROOT/'outputs'}. Run generate_template.py first." + ) groups: dict[str, dict] = {} - # --- Leaf template: group by parent --- - with open(INPUT_LEAF_TSV, newline="", encoding="utf-8") as f: - reader = csv.reader(f, delimiter="\t") - next(reader) # header row - next(reader) # directive row - for row in reader: - if not row or not row[COL_LABEL].strip(): - continue - label = row[COL_LABEL].strip() - ntr_id = row[COL_ID].strip() - - parent_id, _ = extract_parent_info(row) - group_key = parent_id - - if group_key not in groups: - groups[group_key] = { - "parent_id": parent_id, - "parent_label": "", - "terms": [], - } + # --- Leaf templates (default + system overlays): group by parent --- + # Each row carries the `system` overlay it came from, derived from filename: + # template_initial.tsv → system='default' + # template__initial.tsv → system='' + for leaf_path in leaf_paths: + if leaf_path.name == "template_initial.tsv": + system = "default" + else: + # template_muscle_initial.tsv → muscle + system = leaf_path.stem[len("template_"):-len("_initial")] + + with open(leaf_path, newline="", encoding="utf-8") as f: + reader = csv.reader(f, delimiter="\t") + header_row = next(reader) + next(reader) # directive row + idx = header_indices(header_row) - groups[group_key]["terms"].append({ - "ntr_id": ntr_id, - "label": label, - "term_type": "leaf", - "is_a": row[COL_IS_A].strip(), - "part_of": row[COL_PART_OF].strip(), - "def_xref": row[COL_XREF].strip() if len(row) > COL_XREF else "", - }) + for row in reader: + if not row or len(row) <= idx[H_LABEL] or not row[idx[H_LABEL]].strip(): + continue + label = row[idx[H_LABEL]].strip() + ntr_id = row[idx[H_ID]].strip() + + parent_id, _ = extract_parent_info(row, idx) + group_key = parent_id + + if group_key not in groups: + groups[group_key] = { + "parent_id": parent_id, + "parent_label": "", + "terms": [], + } + + groups[group_key]["terms"].append({ + "ntr_id": ntr_id, + "label": label, + "term_type": "leaf", + "system": system, + "is_a": row[idx[H_IS_A]].strip() if H_IS_A in idx else "", + "part_of": row[idx[H_PART_OF]].strip() if H_PART_OF in idx else "", + "def_xref": row[idx[H_DEFXREF]].strip() if H_DEFXREF in idx and len(row) > idx[H_DEFXREF] else "", + }) # --- Groups template: all into one bucket; agent determines genus + location per term --- if INPUT_GROUPS_TSV.exists(): with open(INPUT_GROUPS_TSV, newline="", encoding="utf-8") as f: reader = csv.reader(f, delimiter="\t") - next(reader) # header row + header_row = next(reader) next(reader) # directive row + idx = header_indices(header_row) grouping_terms = [] for row in reader: - if not row or not row[COL_LABEL].strip(): + if not row or len(row) <= idx[H_LABEL] or not row[idx[H_LABEL]].strip(): continue grouping_terms.append({ - "ntr_id": row[COL_ID].strip(), - "label": row[COL_LABEL].strip(), + "ntr_id": row[idx[H_ID]].strip(), + "label": row[idx[H_LABEL]].strip(), "term_type": "group", - "genus": row[COL_GENUS].strip() if len(row) > COL_GENUS else "", - "location": row[COL_LOCATION].strip() if len(row) > COL_LOCATION else "", - "def_xref": row[COL_XREF].strip() if len(row) > COL_XREF else "", + "genus": row[idx[H_GENUS]].strip() if H_GENUS in idx and len(row) > idx[H_GENUS] else "", + "location": row[idx[H_LOCATION]].strip() if H_LOCATION in idx and len(row) > idx[H_LOCATION] else "", + "def_xref": row[idx[H_DEFXREF]].strip() if H_DEFXREF in idx and len(row) > idx[H_DEFXREF] else "", }) if grouping_terms: groups["__grouping_terms__"] = { diff --git a/bulk_ntr_workflow/scripts/merge_definitions.py b/bulk_ntr_workflow/scripts/merge_definitions.py index 063834692..084885440 100644 --- a/bulk_ntr_workflow/scripts/merge_definitions.py +++ b/bulk_ntr_workflow/scripts/merge_definitions.py @@ -50,21 +50,37 @@ PENDING_PATTERN = re.compile(r'^\[PENDING\]$') INFER_PATTERN = re.compile(r'^INFER') -# Shared column indices for both templates (first 4 + last 2 columns are aligned) -COL_ID = 0 -COL_LABEL = 1 -COL_DEF = 2 -COL_XREF = 3 -COL_IMAGE = 10 # Wikipedia_image -COL_TERMREF = 11 # xref (direct oboInOwl:hasDbXref on term) - +# Header column names. Indices are looked up per-template via header_indices() below +# so the merge step is robust to additional columns (e.g. develops_from, has_muscle_origin) +# without having to update hardcoded positions. +H_ID = "ID" +H_LABEL = "LABEL" +H_DEF = "Definition" +H_DEFXREF = "def_xref" +H_IMAGE = "Wikipedia_image" +H_TERMREF = "xref" # Leaf template logic columns -COL_IS_A = 4 -COL_PART_OF = 5 - +H_IS_A = "is_a" +H_PART_OF = "part_of" +H_DEVELOPS_FROM = "develops_from" +# Optional muscle-overlay logic columns (Phase 7) +H_MUSCLE_ORIGIN = "has_muscle_origin" +H_MUSCLE_INSERTION = "has_muscle_insertion" +H_INNERVATED_BY = "innervated_by" # Groups template logic columns (EC genus, EC part_of some location) -COL_GENUS = 4 -COL_LOCATION = 5 +H_GENUS = "genus" +H_LOCATION = "location" + + +def header_indices(header_row: list[str]) -> dict[str, int]: + """Return {column_name: index} for a template header row.""" + return {h.strip(): i for i, h in enumerate(header_row)} + + +def ensure_width(row: list[str], width: int) -> None: + """Extend row in-place to at least `width` cells with empty strings.""" + while len(row) < width: + row.append("") def _normalise_matches(raw: list) -> list: @@ -152,70 +168,87 @@ def extract_parent_id(cell_val: str) -> str: def _apply_common_fields(row: list[str], label: str, lookup_label: str, - sub: dict, counters: dict) -> None: - """Update definition / image / xref / def_xref columns. Used for both templates.""" - while len(row) <= COL_TERMREF: - row.append("") + sub: dict, counters: dict, idx: dict[str, int]) -> None: + """Update definition / image / xref / def_xref columns. Used for both templates. + + idx is the header→index map for the current template (different leaf variants + have different positions for these columns).""" + ensure_width(row, max(idx.values()) + 1) def get(d: dict): return d.get(lookup_label) or d.get(label) new_def = get(sub["definitions"]) if new_def and new_def.strip(): - row[COL_DEF] = new_def.strip() + row[idx[H_DEF]] = new_def.strip() counters["defs"] += 1 - new_img = get(sub["images"]) - if new_img and new_img.strip(): - row[COL_IMAGE] = new_img.strip() - counters["images"] += 1 - - new_xref = get(sub["xrefs"]) - if new_xref and new_xref.strip(): - existing = row[COL_TERMREF].strip() - parts = [p for p in existing.split("|") if p] if existing else [] - for p in new_xref.strip().split("|"): - if p and p not in parts: - parts.append(p) - row[COL_TERMREF] = "|".join(parts) - counters["xrefs"] += 1 - - extra_def_xref = get(sub["def_xrefs_extra"]) - if extra_def_xref and extra_def_xref.strip(): - existing = row[COL_XREF].strip() - parts = [p for p in existing.split("|") if p] if existing else [] - for p in extra_def_xref.strip().split("|"): - if p and p not in parts: - parts.append(p) - row[COL_XREF] = "|".join(parts) - counters["def_xrefs"] += 1 + if H_IMAGE in idx: + new_img = get(sub["images"]) + if new_img and new_img.strip(): + row[idx[H_IMAGE]] = new_img.strip() + counters["images"] += 1 + + if H_TERMREF in idx: + new_xref = get(sub["xrefs"]) + if new_xref and new_xref.strip(): + col = idx[H_TERMREF] + existing = row[col].strip() + parts = [p for p in existing.split("|") if p] if existing else [] + for p in new_xref.strip().split("|"): + if p and p not in parts: + parts.append(p) + row[col] = "|".join(parts) + counters["xrefs"] += 1 + + if H_DEFXREF in idx: + extra_def_xref = get(sub["def_xrefs_extra"]) + if extra_def_xref and extra_def_xref.strip(): + col = idx[H_DEFXREF] + existing = row[col].strip() + parts = [p for p in existing.split("|") if p] if existing else [] + for p in extra_def_xref.strip().split("|"): + if p and p not in parts: + parts.append(p) + row[col] = "|".join(parts) + counters["def_xrefs"] += 1 def merge_leaf_template(input_tsv: Path, final_tsv: Path, sub: dict, excluded_labels: set, out_of_scope_labels: set, name_correction_map: dict, manual_curation_labels: set) -> dict: - """Merge subagent outputs into the leaf template. Returns a counters dict. + """Merge subagent outputs into a leaf template (default OR system overlay). + + Uses header-name lookup so the function works with any leaf template variant + (default 13 columns, muscle 16 columns, future overlays). Resolution priority for is_a / part_of columns: - 1. leaf_template_rows[label] = {is_a, part_of} — preferred (both axes) - 2. resolved_relationships + resolved_parents — legacy single-column form + 1. leaf_template_rows[label] = {is_a, part_of, develops_from?, has_muscle_*?} + 2. resolved_relationships + resolved_parents — legacy single-column form 3. INFER:/UNRESOLVABLE:/NEEDS_MAPPING: — fall back to blank + curator review """ + # Optional logic columns; populated only if the column exists in this template + OPTIONAL_LEAF_COLS = [H_DEVELOPS_FROM, H_MUSCLE_ORIGIN, + H_MUSCLE_INSERTION, H_INNERVATED_BY] counters = {"defs": 0, "images": 0, "xrefs": 0, "def_xrefs": 0, "rels": 0, "leaf_rows_used": 0, "relabelled": 0, - "pending": 0, "infer": 0, "unknown_rel": []} + "pending": 0, "infer": 0, "unknown_rel": [], + "optional_filled": 0} rows = [] with open(input_tsv, newline="", encoding="utf-8") as f: reader = csv.reader(f, delimiter="\t") - rows.append(next(reader)) # header row - rows.append(next(reader)) # directive row + header_row = next(reader) + directive_row = next(reader) + rows.append(header_row) + rows.append(directive_row) + idx = header_indices(header_row) + width = max(idx.values()) + 1 for row in reader: if not row: rows.append(row) continue - while len(row) <= COL_IMAGE: - row.append("") - label = row[COL_LABEL].strip() + ensure_width(row, width) + label = row[idx[H_LABEL]].strip() if label in excluded_labels or label in out_of_scope_labels: continue @@ -223,21 +256,27 @@ def merge_leaf_template(input_tsv: Path, final_tsv: Path, sub: dict, continue if label in name_correction_map: - row[COL_LABEL] = name_correction_map[label] + row[idx[H_LABEL]] = name_correction_map[label] counters["relabelled"] += 1 lookup_label = name_correction_map.get(label, label) - _apply_common_fields(row, label, lookup_label, sub, counters) + _apply_common_fields(row, label, lookup_label, sub, counters, idx) - is_a_val = row[COL_IS_A].strip() - part_of_val = row[COL_PART_OF].strip() + is_a_val = row[idx[H_IS_A]].strip() + part_of_val = row[idx[H_PART_OF]].strip() - # Priority 1: leaf_template_rows — preferred, populates both columns + # Priority 1: leaf_template_rows — preferred, populates both axes + optional cols ltr = (sub["leaf_template_rows"].get(lookup_label) or sub["leaf_template_rows"].get(label)) if ltr: - row[COL_IS_A] = (ltr.get("is_a") or "").strip() - row[COL_PART_OF] = (ltr.get("part_of") or "").strip() + row[idx[H_IS_A]] = (ltr.get("is_a") or "").strip() + row[idx[H_PART_OF]] = (ltr.get("part_of") or "").strip() + # Optional columns — only populate if both the column exists in this + # template AND the agent emitted a value + for col_name in OPTIONAL_LEAF_COLS: + if col_name in idx and ltr.get(col_name): + row[idx[col_name]] = ltr[col_name].strip() + counters["optional_filled"] += 1 counters["leaf_rows_used"] += 1 else: # Priority 2: legacy resolved_relationships + resolved_parents @@ -249,23 +288,23 @@ def merge_leaf_template(input_tsv: Path, final_tsv: Path, sub: dict, or sub["relationships"].get(label)) if rel and parent_id: if rel == "is_a": - row[COL_IS_A] = parent_id - row[COL_PART_OF] = "" + row[idx[H_IS_A]] = parent_id + row[idx[H_PART_OF]] = "" elif rel == "part_of": - row[COL_IS_A] = "" - row[COL_PART_OF] = parent_id + row[idx[H_IS_A]] = "" + row[idx[H_PART_OF]] = parent_id counters["rels"] += 1 elif parent_id and (is_a_val.startswith("INFER:") or is_a_val.startswith("UNRESOLVABLE:") or is_a_val.startswith("NEEDS_MAPPING:")): - row[COL_IS_A] = "" - row[COL_PART_OF] = "" - counters["unknown_rel"].append(row[COL_LABEL].strip()) + row[idx[H_IS_A]] = "" + row[idx[H_PART_OF]] = "" + counters["unknown_rel"].append(row[idx[H_LABEL]].strip()) - if PENDING_PATTERN.match(row[COL_DEF].strip()): + if PENDING_PATTERN.match(row[idx[H_DEF]].strip()): counters["pending"] += 1 - if INFER_PATTERN.match(row[COL_IS_A].strip()) or \ - INFER_PATTERN.match(row[COL_PART_OF].strip()): + if INFER_PATTERN.match(row[idx[H_IS_A]].strip()) or \ + INFER_PATTERN.match(row[idx[H_PART_OF]].strip()): counters["infer"] += 1 rows.append(row) @@ -293,15 +332,18 @@ def merge_groups_template(input_tsv: Path, final_tsv: Path, sub: dict, rows = [] with open(input_tsv, newline="", encoding="utf-8") as f: reader = csv.reader(f, delimiter="\t") - rows.append(next(reader)) - rows.append(next(reader)) + header_row = next(reader) + directive_row = next(reader) + rows.append(header_row) + rows.append(directive_row) + idx = header_indices(header_row) + width = max(idx.values()) + 1 for row in reader: if not row: rows.append(row) continue - while len(row) <= COL_IMAGE: - row.append("") - label = row[COL_LABEL].strip() + ensure_width(row, width) + label = row[idx[H_LABEL]].strip() if label in excluded_labels or label in out_of_scope_labels: continue @@ -310,24 +352,24 @@ def merge_groups_template(input_tsv: Path, final_tsv: Path, sub: dict, continue if label in name_correction_map: - row[COL_LABEL] = name_correction_map[label] + row[idx[H_LABEL]] = name_correction_map[label] counters["relabelled"] += 1 lookup_label = name_correction_map.get(label, label) - _apply_common_fields(row, label, lookup_label, sub, counters) + _apply_common_fields(row, label, lookup_label, sub, counters, idx) # Populate genus + location from the agent ec = (sub["group_template_rows"].get(lookup_label) or sub["group_template_rows"].get(label)) if ec and ec.get("genus") and ec.get("location"): - row[COL_GENUS] = ec["genus"].strip() - row[COL_LOCATION] = ec["location"].strip() + row[idx[H_GENUS]] = ec["genus"].strip() + row[idx[H_LOCATION]] = ec["location"].strip() counters["ec_resolved"] += 1 else: # Incomplete EC — agent didn't produce both columns; flag for curator - counters["ec_incomplete"].append(row[COL_LABEL].strip()) + counters["ec_incomplete"].append(row[idx[H_LABEL]].strip()) - if PENDING_PATTERN.match(row[COL_DEF].strip()): + if PENDING_PATTERN.match(row[idx[H_DEF]].strip()): counters["pending"] += 1 rows.append(row) @@ -339,9 +381,44 @@ def merge_groups_template(input_tsv: Path, final_tsv: Path, sub: dict, return counters +def discover_leaf_partitions(name: str, ntr_root: Path, repo_root: Path) -> list[tuple[str, Path, Path]]: + """Find all leaf-template partitions for a given name. + + Returns a list of (partition_label, working_tsv, final_tsv) tuples for every + partition that has both a working and final template on disk. Partition_label is + 'default' for the base template, or the overlay name (e.g. 'muscle') for system + overlays. + + Convention: + default → outputs/template_initial.tsv + src/templates/.template.tsv + → outputs/template__initial.tsv + src/templates/-.template.tsv + """ + out_dir = ntr_root / "outputs" + templates_dir = repo_root / "src" / "templates" + partitions = [] + + # Default partition + work = out_dir / "template_initial.tsv" + final = templates_dir / f"{name}.template.tsv" + if work.exists() and final.exists(): + partitions.append(("default", work, final)) + + # System overlay partitions — discover by looking for outputs/template__initial.tsv + for work_path in sorted(out_dir.glob("template_*_initial.tsv")): + stem = work_path.stem # 'template_muscle_initial' + if stem in ("template_initial", "template_groups_initial"): + continue + # Extract overlay name from 'template__initial' + overlay = stem[len("template_"):-len("_initial")] + final = templates_dir / f"{name}-{overlay}.template.tsv" + if final.exists(): + partitions.append((overlay, work_path, final)) + + return partitions + + def process(name: str) -> None: templates_dir = REPO_ROOT / "src" / "templates" - final_tsv = templates_dir / f"{name}.template.tsv" final_groups_tsv = templates_dir / f"{name}-groups.template.tsv" reports_dir = templates_dir / f"{name}-reports" candidates_tsv = reports_dir / "candidates.tsv" @@ -349,17 +426,17 @@ def process(name: str) -> None: name_corrections_tsv = reports_dir / "name_corrections.tsv" manual_curation_tsv = reports_dir / "manual_curation.tsv" - if not INPUT_TSV.exists(): - raise FileNotFoundError(f"Input not found: {INPUT_TSV}\nRun generate_template.py first.") - if not final_tsv.exists(): + leaf_partitions = discover_leaf_partitions(name, NTR_ROOT, REPO_ROOT) + if not leaf_partitions: raise FileNotFoundError( - f"Template not found: {final_tsv}\nRun generate_template.py --name {name} first." + f"No leaf templates found for '{name}'. Run generate_template.py --name {name} first." ) sub = load_subagent_outputs() print(f"Loaded: {len(sub['definitions'])} definitions, {len(sub['images'])} images, " f"{len(sub['relationships'])} resolved relationships, " f"{len(sub['resolved_parents'])} resolved parents, " + f"{len(sub['leaf_template_rows'])} leaf rows, " f"{len(sub['group_template_rows'])} group EC rows, " f"{len(sub['xrefs'])} xrefs, {len(sub['def_xrefs_extra'])} extra def_xrefs, " f"{len(sub['confirmed'])} confirmed, {len(sub['possible'])} possible, " @@ -375,24 +452,26 @@ def process(name: str) -> None: out_of_scope_labels = {o["label"] for o in sub["out_of_scope"]} manual_curation_labels = {mc["label"] for mc in sub["manual_curation"]} - leaf_counters = merge_leaf_template( - INPUT_TSV, final_tsv, sub, - excluded_labels, out_of_scope_labels, name_correction_map, - manual_curation_labels, - ) - print(f"\nLeaf template → {final_tsv} ({leaf_counters['data_rows']} rows)") - print(f" Definitions updated: {leaf_counters['defs']}") - print(f" Images added: {leaf_counters['images']}") - print(f" Xrefs added: {leaf_counters['xrefs']}") - print(f" def_xref refs appended: {leaf_counters['def_xrefs']}") - print(f" Labels corrected: {leaf_counters['relabelled']}") - print(f" leaf_template_rows used:{leaf_counters['leaf_rows_used']}") - print(f" Relationships resolved (legacy): {leaf_counters['rels']}") - print(f" Still [PENDING] defs: {leaf_counters['pending']}") - print(f" Still INFER: {leaf_counters['infer']}") - print(f" Relationship unresolved:{len(leaf_counters['unknown_rel'])}") - for lbl in leaf_counters["unknown_rel"]: - print(f" ⚠ {lbl}") + for partition_label, work_tsv, final_tsv in leaf_partitions: + leaf_counters = merge_leaf_template( + work_tsv, final_tsv, sub, + excluded_labels, out_of_scope_labels, name_correction_map, + manual_curation_labels, + ) + print(f"\nLeaf template [{partition_label}] → {final_tsv} ({leaf_counters['data_rows']} rows)") + print(f" Definitions updated: {leaf_counters['defs']}") + print(f" Images added: {leaf_counters['images']}") + print(f" Xrefs added: {leaf_counters['xrefs']}") + print(f" def_xref refs appended: {leaf_counters['def_xrefs']}") + print(f" Labels corrected: {leaf_counters['relabelled']}") + print(f" leaf_template_rows used:{leaf_counters['leaf_rows_used']}") + print(f" Optional cols filled: {leaf_counters['optional_filled']}") + print(f" Relationships resolved (legacy): {leaf_counters['rels']}") + print(f" Still [PENDING] defs: {leaf_counters['pending']}") + print(f" Still INFER: {leaf_counters['infer']}") + print(f" Relationship unresolved:{len(leaf_counters['unknown_rel'])}") + for lbl in leaf_counters["unknown_rel"]: + print(f" ⚠ {lbl}") if INPUT_GROUPS_TSV.exists() and final_groups_tsv.exists(): groups_counters = merge_groups_template( From 42738e6c5465f6caecd467e0b26afd43cdf6c24b Mon Sep 17 00:00:00 2001 From: David Osumi-Sutherland Date: Tue, 28 Apr 2026 18:56:38 +0100 Subject: [PATCH 07/22] Validate Phase 6 + Phase 7 muscle overlay end-to-end on muscular-system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-ran Stage 1 with --table muscular-system --limit 10. Output: - Step 0 routing: muscle=8, group=2 (correctly partitioned by source table) - -muscle.template.tsv has 16 columns: 6 logic relations (is_a, part_of, develops_from, has_muscle_origin, has_muscle_insertion, innervated_by) + 10 metadata - Default leaf template absent (no rows for it — all are muscular-system) Re-ran one agent (articularis genu) with the updated spec. Agent emitted leaf_template_rows with the new optional muscle-overlay fields: is_a=UBERON:0001630 (muscle organ), part_of=UBERON:0000376 (thigh), has_muscle_origin=UBERON:0000981 (femur), innervated_by=UBERON:0001267 (femoral nerve). has_muscle_insertion correctly omitted (suprapatellar bursa not in UBERON). Merge correctly populated all 4 columns from leaf_template_rows (Optional cols filled: 2 in summary). The other 3 leaf JSONs were generated under the older agent spec — they fall back to legacy resolved_relationships and only get is_a OR part_of. To populate their muscle-overlay fields, those agents would need to be re-run. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../input/needs_mapping_fma_22424.json | 1 + .../input/needs_mapping_fma_46583.json | 1 + .../definitions/input/uberon_0000975.json | 1 + .../definitions/input/uberon_0001572.json | 2 ++ .../definitions/input/uberon_0002381.json | 1 + ...nresolvable_meningohypophyseal_artery.json | 1 + .../unresolvable_segmental_back_muscle.json | 1 + .../definitions/needs_mapping_fma_22424.json | 30 ++++++++----------- .../outputs/definitions/uberon_0002381.json | 13 ++++---- ...nresolvable_meningohypophyseal_artery.json | 14 +++------ .../unresolvable_segmental_back_muscle.json | 20 ++++++------- .../outputs/template_groups_initial.tsv | 4 +-- ...nitial.tsv => template_muscle_initial.tsv} | 20 ++++++------- .../hra-muscular-muscle.template.tsv | 6 ++++ .../hra-muscular-reports/candidates.tsv | 6 ---- 15 files changed, 58 insertions(+), 63 deletions(-) rename bulk_ntr_workflow/outputs/{template_initial.tsv => template_muscle_initial.tsv} (50%) create mode 100644 src/templates/hra-muscular-muscle.template.tsv diff --git a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22424.json b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22424.json index 53d301b5a..688e52026 100644 --- a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22424.json +++ b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22424.json @@ -12,6 +12,7 @@ "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900003", "label": "articularis genu muscle", "term_type": "leaf", + "system": "muscle", "is_a": "NEEDS_MAPPING:FMA:22424", "part_of": "NEEDS_MAPPING:FMA:22424", "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle" diff --git a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46583.json b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46583.json index 81708cef8..39a1552a9 100644 --- a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46583.json +++ b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46583.json @@ -12,6 +12,7 @@ "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900004", "label": "aryepiglottic part of oblique arytenoid muscle", "term_type": "leaf", + "system": "muscle", "is_a": "NEEDS_MAPPING:FMA:46583", "part_of": "NEEDS_MAPPING:FMA:46583", "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_aryepiglottic-part-of-oblique-arytenoid-muscle" diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0000975.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0000975.json index 02b17ac95..ca03efc79 100644 --- a/bulk_ntr_workflow/outputs/definitions/input/uberon_0000975.json +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0000975.json @@ -12,6 +12,7 @@ "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900009", "label": "costal part of respiratory diaphragm muscle", "term_type": "leaf", + "system": "muscle", "is_a": "INFER:UBERON:0000975", "part_of": "INFER:UBERON:0000975", "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_costal-part-of-respiratory-diaphragm-muscle" diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0001572.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001572.json index c31829dab..99bf93266 100644 --- a/bulk_ntr_workflow/outputs/definitions/input/uberon_0001572.json +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001572.json @@ -12,6 +12,7 @@ "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900005", "label": "ceratoglossus of hyoglossus muscle", "term_type": "leaf", + "system": "muscle", "is_a": "INFER:UBERON:0001572", "part_of": "INFER:UBERON:0001572", "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_ceratoglossus-of-hyoglossus-muscle" @@ -20,6 +21,7 @@ "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900006", "label": "chondroglossus of hyoglossus muscle", "term_type": "leaf", + "system": "muscle", "is_a": "INFER:UBERON:0001572", "part_of": "INFER:UBERON:0001572", "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_chondroglossus-of-hyoglossus-muscle" diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0002381.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002381.json index e1755163a..6266502bd 100644 --- a/bulk_ntr_workflow/outputs/definitions/input/uberon_0002381.json +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002381.json @@ -12,6 +12,7 @@ "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900008", "label": "clavicular head of pectoralis major muscle", "term_type": "leaf", + "system": "muscle", "is_a": "INFER:UBERON:0002381", "part_of": "INFER:UBERON:0002381", "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle" diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_meningohypophyseal_artery.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_meningohypophyseal_artery.json index 11afa6779..9ed9175d2 100644 --- a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_meningohypophyseal_artery.json +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_meningohypophyseal_artery.json @@ -12,6 +12,7 @@ "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900010", "label": "dorsal part of intertransversarii laterales lumborum muscle", "term_type": "leaf", + "system": "muscle", "is_a": "UNRESOLVABLE:meningohypophyseal artery", "part_of": "UNRESOLVABLE:meningohypophyseal artery", "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle" diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_segmental_back_muscle.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_segmental_back_muscle.json index 9a654509d..f6d71de2e 100644 --- a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_segmental_back_muscle.json +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_segmental_back_muscle.json @@ -12,6 +12,7 @@ "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900001", "label": "anterior cervical intertransversarii muscle", "term_type": "leaf", + "system": "muscle", "is_a": "UNRESOLVABLE:segmental back muscle", "part_of": "UNRESOLVABLE:segmental back muscle", "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle" diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json index 959379bc5..35c5d8e89 100644 --- a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json @@ -1,39 +1,35 @@ { "definitions": { - "articularis genu muscle": "A muscle organ of the anterior compartment of the thigh, lying deep to the vastus intermedius, that originates from the anterior surface of the distal femur and inserts into the suprapatellar bursa and synovial membrane of the knee joint, retracting the bursa superiorly during knee extension to prevent its impingement between the patella and femur." + "articularis genu muscle": "A muscle organ of the anterior thigh, often described as a deep, flat, variable accessory of the quadriceps femoris that arises from the anterior surface of the distal femur and inserts onto the suprapatellar bursa and synovial membrane of the knee joint, retracting the joint capsule during knee extension." }, "wikipedia_images": { - "articularis genu muscle": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Gray244.png" + "articularis genu muscle": "https://upload.wikimedia.org/wikipedia/commons/0/06/Gray434.png" }, "xrefs": { - "articularis genu muscle": "Wikipedia:Articularis_genus_muscle|FMA:22441" + "articularis genu muscle": "Wikipedia:Articularis_genus_muscle|FMA:22424" }, "def_xrefs_to_add": { - "articularis genu muscle": "PMID:30229230|PMID:33215156" + "articularis genu muscle": "PMID:30229230" }, "leaf_template_rows": { "articularis genu muscle": { "is_a": "UBERON:0001630", - "part_of": "UBERON:0000376" - } - }, - "resolved_parents": { - "articularis genu muscle": { - "source_parent": "NEEDS_MAPPING:FMA:22424", - "source_parent_label": "muscle of anterior compartment of thigh", - "resolved_uberon_parent_for_part_of": "UBERON:0000376", - "resolved_uberon_parent_label": "hindlimb stylopod (thigh)", - "note": "FMA:22424 (muscle of anterior compartment of thigh) has no direct UBERON equivalent. Closest UBERON grouping is UBERON:0004252 (hindlimb stylopod muscle / muscle of thigh, FMA:22470), one level broader. For part_of we use UBERON:0000376 (hindlimb stylopod / thigh) following the precedent of pectineus (UBERON:0001382), since articularis genu is a separate muscle (not anatomically a part of quadriceps femoris), though it lies deep to vastus intermedius." + "part_of": "UBERON:0000376", + "has_muscle_origin": "UBERON:0000981", + "innervated_by": "UBERON:0001267" } }, "resolved_relationships": { "articularis genu muscle": "is_a" }, + "resolved_parents": { + "articularis genu muscle": "UBERON:0001630" + }, "unresolvable": [ { - "label": "FMA:22424 muscle of anterior compartment of thigh", - "reason": "No UBERON term exists for the anterior compartment of thigh muscle grouping. Closest existing term is UBERON:0004252 (hindlimb stylopod muscle, FMA:22470), which is the next level up.", - "suggestion": "Curator may consider creating a UBERON term for 'muscle of anterior compartment of thigh' (FMA:22424) as a child of UBERON:0004252; for now, the leaf term uses part_of UBERON:0000376 (thigh)." + "label": "articularis genu muscle", + "reason": "has_muscle_insertion omitted: the muscle inserts onto the suprapatellar bursa / synovial membrane of the knee joint; suprapatellar bursa is not in UBERON, and a more specific UBERON ID for that insertion target could not be resolved.", + "suggestion": "Curator may add has_muscle_insertion UBERON:0002446 (patella) or a knee-joint synovial membrane term if appropriate, or leave unset." } ] } diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json b/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json index bff4da36c..6279c09b3 100644 --- a/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json @@ -1,15 +1,12 @@ { "definitions": { - "clavicular head of pectoralis major muscle": "A muscle head that is the superior portion of the pectoralis major, originating from the anterior surface of the medial half of the clavicle and converging with the sternocostal head into a flat tendon inserted on the lateral lip of the intertubercular groove of the humerus; it is innervated by the lateral pectoral nerve (C5-C6) and acts to flex the humerus." + "clavicular head of pectoralis major muscle": "A muscle head that is part of the pectoralis major muscle, originating from the anterior surface of the medial half of the clavicle. Its fibres pass obliquely downward and laterally to converge with those of the sternocostal head, contributing the anterior lamina of the broad flat tendon that inserts onto the lateral lip of the intertubercular groove of the humerus, and is innervated by the lateral pectoral nerve (C5-C6)." }, - "def_xrefs_to_add": { - "clavicular head of pectoralis major muscle": "PMID:30252247|PMID:25345076" + "xrefs": { + "clavicular head of pectoralis major muscle": "FMA:34687" }, - "leaf_template_rows": { - "clavicular head of pectoralis major muscle": { - "is_a": "UBERON:0011906", - "part_of": "UBERON:0002381" - } + "def_xrefs_to_add": { + "clavicular head of pectoralis major muscle": "PMID:30252247|PMID:31061824" }, "resolved_relationships": { "clavicular head of pectoralis major muscle": "part_of" diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json index 77f1a7b1d..87072a1b1 100644 --- a/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json @@ -1,18 +1,12 @@ { "definitions": { - "dorsal part of intertransversarii laterales lumborum muscle": "A muscle organ that is the posterior (dorsal) subdivision of the lateral intertransversarii lumborum, originating from the accessory process of one lumbar vertebra and inserting onto the transverse process of the consecutive lumbar vertebra; together with the ventral part it acts in ipsilateral lateral flexion and stabilisation of the lumbar spine and is innervated by the anterior rami of the lumbar spinal nerves." + "dorsal part of intertransversarii laterales lumborum muscle": "A skeletal muscle bundle that is the posterior (dorsal) portion of the lateral intertransversarii muscles of the lumbar region, connecting the accessory processes of one lumbar vertebra to the transverse process of the adjacent vertebra; it acts to stabilise the lumbar vertebral column and assist lateral flexion." }, "xrefs": { "dorsal part of intertransversarii laterales lumborum muscle": "Wikipedia:Intertransversarii" }, "def_xrefs_to_add": { - "dorsal part of intertransversarii laterales lumborum muscle": "PMID:6226119" - }, - "leaf_template_rows": { - "dorsal part of intertransversarii laterales lumborum muscle": { - "is_a": "UBERON:0001630", - "part_of": "UBERON:0008242" - } + "dorsal part of intertransversarii laterales lumborum muscle": "doi:10.1007/BF00518810" }, "resolved_relationships": { "dorsal part of intertransversarii laterales lumborum muscle": "part_of" @@ -23,8 +17,8 @@ "unresolvable": [ { "label": "dorsal part of intertransversarii laterales lumborum muscle", - "reason": "The source-supplied parent label 'meningohypophyseal artery' is wrong-domain (it is a cranial artery, not a back muscle) and clearly a data-entry error in the source mapping. The true direct parent muscle 'intertransversarii laterales lumborum muscle' (a.k.a. 'lateral intertransversarii lumborum muscles') does not exist in UBERON; the only related UBERON terms are amphibian neck intertransversarii (UBERON:3010664, UBERON:3010667).", - "suggestion": "Curator may wish to add the parent term 'lateral intertransversarii lumborum muscle' (and possibly its sibling 'medial intertransversarii lumborum muscle' and grouping 'intertransversarii lumborum') as intermediate UBERON terms, with part_of UBERON:0008242 (lower back muscle) or UBERON:0002378 (muscle of abdomen) and is_a UBERON:0001630 (muscle organ). The current row uses UBERON:0001630 as genus and UBERON:0008242 (lower back muscle) as part_of as the closest available containing structure; this should be retargeted to the new 'lateral intertransversarii lumborum muscle' term once it is created." + "reason": "Source-supplied parent 'meningohypophyseal artery' is wrong-domain (an artery cannot be parent of a muscle subdivision). No UBERON term exists for the parent muscle 'intertransversarii laterales lumborum muscle' itself - the most specific available ancestor is UBERON:0008242 (lower back muscle). Ideally a parent term 'lateral intertransversarii lumborum muscle' should be added first, with this term as its dorsal subdivision (part_of).", + "suggestion": "Use UBERON:0008242 (lower back muscle) as the part_of parent for now. Curator should consider adding intermediate parent term 'lateral intertransversarii lumborum muscle' (FMA:32576 if available) and re-parenting this term as part_of that intermediate term. Note that 'dorsal part of' implies a subdivision, hence part_of relationship rather than is_a." } ] } diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json index b4d3bf83d..00bf00c32 100644 --- a/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json @@ -1,24 +1,24 @@ { "definitions": { - "anterior cervical intertransversarii muscle": "A muscle organ that is one of the small, paired segmental muscles of the neck connecting the anterior tubercles of the transverse processes of two adjacent cervical vertebrae. These muscles span from C1-C2 (or C2-C3) through C7-T1, lying lateral to the longus colli muscle, are innervated by the anterior rami of the cervical spinal nerves, and contribute to lateral flexion and proprioceptive stabilisation of the cervical spine." + "anterior cervical intertransversarii muscle": "A small segmental back muscle that arises from the anterior tubercle of the transverse process of one cervical vertebra and inserts on the anterior tubercle of the transverse process of the adjacent cervical vertebra, contributing to lateral flexion and proprioceptive stabilisation of the cervical spine." }, "xrefs": { - "anterior cervical intertransversarii muscle": "Wikipedia:Intertransversarii|FMA:32530" + "anterior cervical intertransversarii muscle": "Wikipedia:Intertransversarii|FMA:71442" }, "def_xrefs_to_add": { - "anterior cervical intertransversarii muscle": "PMID:7076562" + "anterior cervical intertransversarii muscle": "PMID:12650404" }, - "leaf_template_rows": { - "anterior cervical intertransversarii muscle": { - "is_a": "UBERON:0001630", - "part_of": "UBERON:0000974" - } + "resolved_relationships": { + "anterior cervical intertransversarii muscle": "is_a" + }, + "resolved_parents": { + "anterior cervical intertransversarii muscle": "UBERON:0002324" }, "unresolvable": [ { "label": "segmental back muscle", - "reason": "Source ASCTB-TEMP parent label 'segmental back muscle' has no direct UBERON equivalent. The closest UBERON groupings are 'muscle of vertebral column' (UBERON:0004518), 'muscle of back' (UBERON:0002324), and 'muscle of neck' (UBERON:0002377). Since the anterior cervical intertransversarii are anteriorly located paravertebral muscles in the neck (not part of the dorsum), 'muscle of back' is anatomically inappropriate; UBERON convention for similar small named neck muscles (e.g. longus colli UBERON:0001121, rectus capitis anterior UBERON:0008453) uses is_a UBERON:0001630 (muscle organ) plus part_of UBERON:0000974 (neck).", - "suggestion": "Use is_a UBERON:0001630 (muscle organ) and part_of UBERON:0000974 (neck) as captured in leaf_template_rows. Curator may optionally re-parent under UBERON:0008549 (prevertebral muscle) or UBERON:0004518 (muscle of vertebral column) if a more specific genus is preferred." + "reason": "Source parent label 'segmental back muscle' is not present in UBERON as a distinct class. The anterior cervical intertransversarii muscles span the transverse processes of adjacent cervical vertebrae and are classified as deep (segmental) back muscles in standard anatomy; the closest existing UBERON parent is UBERON:0002324 (muscle of back).", + "suggestion": "Use UBERON:0002324 (muscle of back) as the is_a parent. A more specific intermediate class such as 'segmental muscle of back' or 'deep muscle of back' could be added in future curation; 'musculature of neck' (UBERON:0004465) would be an alternative grouping for the cervical-region member but the source intent points to back musculature." } ] } diff --git a/bulk_ntr_workflow/outputs/template_groups_initial.tsv b/bulk_ntr_workflow/outputs/template_groups_initial.tsv index 1b6fe7e77..21d9b10f9 100644 --- a/bulk_ntr_workflow/outputs/template_groups_initial.tsv +++ b/bulk_ntr_workflow/outputs/template_groups_initial.tsv @@ -1,4 +1,4 @@ ID LABEL Definition def_xref genus location In_subset Date Contributor Present_in_taxon Wikipedia_image xref ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| EC % EC BFO:0000050 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| -http://purl.obolibrary.org/obo/UBERON_9900002 anterior vertebral muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-vertebral-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900007 circular pharyngeal muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_circular-pharyngeal-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900002 anterior vertebral muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-vertebral-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900007 circular pharyngeal muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_circular-pharyngeal-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 diff --git a/bulk_ntr_workflow/outputs/template_initial.tsv b/bulk_ntr_workflow/outputs/template_muscle_initial.tsv similarity index 50% rename from bulk_ntr_workflow/outputs/template_initial.tsv rename to bulk_ntr_workflow/outputs/template_muscle_initial.tsv index d8cb71843..7864acba9 100644 --- a/bulk_ntr_workflow/outputs/template_initial.tsv +++ b/bulk_ntr_workflow/outputs/template_muscle_initial.tsv @@ -1,10 +1,10 @@ -ID LABEL Definition def_xref is_a part_of In_subset Date Contributor Present_in_taxon Wikipedia_image xref -ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| SC % SC BFO:0000050 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| -http://purl.obolibrary.org/obo/UBERON_9900001 anterior cervical intertransversarii muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle UNRESOLVABLE:segmental back muscle UNRESOLVABLE:segmental back muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900003 articularis genu muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle NEEDS_MAPPING:FMA:22424 NEEDS_MAPPING:FMA:22424 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900004 aryepiglottic part of oblique arytenoid muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_aryepiglottic-part-of-oblique-arytenoid-muscle NEEDS_MAPPING:FMA:46583 NEEDS_MAPPING:FMA:46583 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900005 ceratoglossus of hyoglossus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_ceratoglossus-of-hyoglossus-muscle INFER:UBERON:0001572 INFER:UBERON:0001572 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900006 chondroglossus of hyoglossus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_chondroglossus-of-hyoglossus-muscle INFER:UBERON:0001572 INFER:UBERON:0001572 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900008 clavicular head of pectoralis major muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle INFER:UBERON:0002381 INFER:UBERON:0002381 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900009 costal part of respiratory diaphragm muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_costal-part-of-respiratory-diaphragm-muscle INFER:UBERON:0000975 INFER:UBERON:0000975 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900010 dorsal part of intertransversarii laterales lumborum muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle UNRESOLVABLE:meningohypophyseal artery UNRESOLVABLE:meningohypophyseal artery http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +ID LABEL Definition def_xref is_a part_of develops_from has_muscle_origin has_muscle_insertion innervated_by In_subset Date Contributor Present_in_taxon Wikipedia_image xref +ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| SC % SC BFO:0000050 some % SC RO:0002202 some % SC RO:0002372 some % SC RO:0002373 some % SC RO:0002005 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| +http://purl.obolibrary.org/obo/UBERON_9900001 anterior cervical intertransversarii muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle UNRESOLVABLE:segmental back muscle UNRESOLVABLE:segmental back muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900003 articularis genu muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle NEEDS_MAPPING:FMA:22424 NEEDS_MAPPING:FMA:22424 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900004 aryepiglottic part of oblique arytenoid muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_aryepiglottic-part-of-oblique-arytenoid-muscle NEEDS_MAPPING:FMA:46583 NEEDS_MAPPING:FMA:46583 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900005 ceratoglossus of hyoglossus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_ceratoglossus-of-hyoglossus-muscle INFER:UBERON:0001572 INFER:UBERON:0001572 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900006 chondroglossus of hyoglossus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_chondroglossus-of-hyoglossus-muscle INFER:UBERON:0001572 INFER:UBERON:0001572 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900008 clavicular head of pectoralis major muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle INFER:UBERON:0002381 INFER:UBERON:0002381 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900009 costal part of respiratory diaphragm muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_costal-part-of-respiratory-diaphragm-muscle INFER:UBERON:0000975 INFER:UBERON:0000975 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900010 dorsal part of intertransversarii laterales lumborum muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle UNRESOLVABLE:meningohypophyseal artery UNRESOLVABLE:meningohypophyseal artery http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 diff --git a/src/templates/hra-muscular-muscle.template.tsv b/src/templates/hra-muscular-muscle.template.tsv new file mode 100644 index 000000000..75fb27996 --- /dev/null +++ b/src/templates/hra-muscular-muscle.template.tsv @@ -0,0 +1,6 @@ +ID LABEL Definition def_xref is_a part_of develops_from has_muscle_origin has_muscle_insertion innervated_by In_subset Date Contributor Present_in_taxon Wikipedia_image xref +ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| SC % SC BFO:0000050 some % SC RO:0002202 some % SC RO:0002372 some % SC RO:0002373 some % SC RO:0002005 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| +http://purl.obolibrary.org/obo/UBERON_9900001 anterior cervical intertransversarii muscle A small segmental back muscle that arises from the anterior tubercle of the transverse process of one cervical vertebra and inserts on the anterior tubercle of the transverse process of the adjacent cervical vertebra, contributing to lateral flexion and proprioceptive stabilisation of the cervical spine. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle|PMID:12650404 UBERON:0002324 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii|FMA:71442 +http://purl.obolibrary.org/obo/UBERON_9900003 articularis genu muscle A muscle organ of the anterior thigh, often described as a deep, flat, variable accessory of the quadriceps femoris that arises from the anterior surface of the distal femur and inserts onto the suprapatellar bursa and synovial membrane of the knee joint, retracting the joint capsule during knee extension. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle|PMID:30229230 UBERON:0001630 UBERON:0000376 UBERON:0000981 UBERON:0001267 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 https://upload.wikimedia.org/wikipedia/commons/0/06/Gray434.png Wikipedia:Articularis_genus_muscle|FMA:22424 +http://purl.obolibrary.org/obo/UBERON_9900008 clavicular head of pectoralis major muscle A muscle head that is part of the pectoralis major muscle, originating from the anterior surface of the medial half of the clavicle. Its fibres pass obliquely downward and laterally to converge with those of the sternocostal head, contributing the anterior lamina of the broad flat tendon that inserts onto the lateral lip of the intertubercular groove of the humerus, and is innervated by the lateral pectoral nerve (C5-C6). https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle|PMID:30252247|PMID:31061824 UBERON:0002381 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 FMA:34687 +http://purl.obolibrary.org/obo/UBERON_9900010 dorsal part of intertransversarii laterales lumborum muscle A skeletal muscle bundle that is the posterior (dorsal) portion of the lateral intertransversarii muscles of the lumbar region, connecting the accessory processes of one lumbar vertebra to the transverse process of the adjacent vertebra; it acts to stabilise the lumbar vertebral column and assist lateral flexion. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle|doi:10.1007/BF00518810 UBERON:0008242 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii diff --git a/src/templates/hra-muscular-reports/candidates.tsv b/src/templates/hra-muscular-reports/candidates.tsv index 6f5d859bd..84e6f1102 100644 --- a/src/templates/hra-muscular-reports/candidates.tsv +++ b/src/templates/hra-muscular-reports/candidates.tsv @@ -5,9 +5,3 @@ costal part of respiratory diaphragm muscle UBERON:0035831 confirmed_match (con ceratoglossus of hyoglossus muscle UBERON:0008428 confirmed_match (confidence: high) chondroglossus of hyoglossus muscle UBERON:0011535 confirmed_match (confidence: high) anterior vertebral muscle UBERON:0008549 possible_match (UBERON:0008549 'prevertebral muscle' has the same definition (one of the muscles deep to the prevertebral fascia... including the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis). Synonym 'flexor muscle of vertebral column'. The TA2 term 'anterior vertebral muscle' is a synonymous regional grouping. Curator should confirm whether to map directly to UBERON:0008549, to its child UBERON:0017647 'prevertebral muscle of neck', or add as RELATED synonym. Definition uses attaches_to + innervated_by axioms (multi-axiom pattern), not the simple genus + part_of pattern, so this would be out of scope for the EC template even if added as a new term.) -circular pharyngeal muscle UBERON:0001569 confirmed_match (confidence: high) -aryepiglottic part of oblique arytenoid muscle UBERON:0011025 confirmed_match (confidence: high) -costal part of respiratory diaphragm muscle UBERON:0035831 confirmed_match (confidence: high) -ceratoglossus of hyoglossus muscle UBERON:0008428 confirmed_match (confidence: high) -chondroglossus of hyoglossus muscle UBERON:0011535 confirmed_match (confidence: high) -anterior vertebral muscle UBERON:0008549 possible_match (UBERON:0008549 'prevertebral muscle' has the same definition (one of the muscles deep to the prevertebral fascia... including the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis). Synonym 'flexor muscle of vertebral column'. The TA2 term 'anterior vertebral muscle' is a synonymous regional grouping. Curator should confirm whether to map directly to UBERON:0008549, to its child UBERON:0017647 'prevertebral muscle of neck', or add as RELATED synonym. Definition uses attaches_to + innervated_by axioms (multi-axiom pattern), not the simple genus + part_of pattern, so this would be out of scope for the EC template even if added as a new term.) From db5d64b647d30191b855ba18706c9fe1cac7719d Mon Sep 17 00:00:00 2001 From: David Osumi-Sutherland Date: Mon, 11 May 2026 15:38:29 +0100 Subject: [PATCH 08/22] Full muscular-system run: 75 input terms processed end-to-end MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stage 1 partitioning: muscle=55, group=20 (no default partition) Stage 2 grouping: 45 groups (44 leaf + 1 grouping_terms bucket of 20 group terms) Stage 3: 45 agents in 6 parallel batches; all completed without API timeouts Stage 4 merge results: Leaf template -muscle.template.tsv (25 new terms): - Phase 7 muscle overlay populated: 68 optional column values across 25 rows (avg 2.7 muscle-specific columns per term — origin/insertion/innervated_by) - All 25 use leaf_template_rows (no legacy fallback path triggered) - 0 PENDING definitions, 0 INFER relationships, 0 unresolved - 24 of 25 have real PMID/DOI/ISBN def_xrefs added Groups template -groups.template.tsv (8 new terms): - All 8 fit the simple genus + part_of some Y EC pattern - Genus is UBERON:0014892 (skeletal muscle organ, vertebrate) for all 8 - Locations: thoracic cavity, sole of pes, dorsum, external/middle ear, etc. Reports: - candidates.tsv: 39 confirmed_matches (existing UBERON terms) Notable: 9 of 20 grouping_terms already existed (prevertebral muscle, constrictor muscle of pharynx, scalene, hypothenar, palmar/plantar interosseous, splenius, facial muscle, intra-ocular muscle) - manual_curation.tsv: 3 group terms not fitting simple part_of pattern (pelvic floor, dorsum of foot, longitudinal pharyngeal — all need new region/orientation terms OR has_part/membership-based modelling) - name_corrections.tsv: 17 entries (typos like 'capitus' → 'capitis', Latin variants like 'fascia' → 'fasciae', 'tibalis' → 'tibialis') Wrong-domain parent issues flagged by agents (data quality in HRA source): - sternum→diaphragm (costal/sternal parts) - splenic artery→intrinsic muscle of tongue (inferior longitudinal) - innominate bone→pharyngeal muscle (pterygopharyngeus) - tip of renal papilla→hand muscle (palmar interosseous) - meningohypophyseal artery→lumbar back muscle (dorsal intertransversarii) - and many more — captured in individual JSON unresolvable notes NOT merged to main. Branch retains everything for review. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../outputs/definitions/grouping_terms.json | 216 ++++++++++++++---- .../definitions/input/grouping_terms.json | 146 +++++++++++- .../input/needs_mapping_fma_12252.json | 21 ++ .../input/needs_mapping_fma_22472.json | 21 ++ .../input/needs_mapping_fma_22474.json | 21 ++ .../input/needs_mapping_fma_323951.json | 21 ++ .../input/needs_mapping_fma_46588.json | 21 ++ .../input/needs_mapping_fma_46623.json | 21 ++ .../input/needs_mapping_fma_5841.json | 21 ++ .../definitions/input/uberon_0000979.json | 21 ++ .../definitions/input/uberon_0001092.json | 21 ++ .../definitions/input/uberon_0001194.json | 21 ++ .../definitions/input/uberon_0001272.json | 30 +++ .../definitions/input/uberon_0001537.json | 21 ++ .../definitions/input/uberon_0001546.json | 21 ++ .../definitions/input/uberon_0001576.json | 39 ++++ .../definitions/input/uberon_0001624.json | 21 ++ .../definitions/input/uberon_0001677.json | 21 ++ .../definitions/input/uberon_0001876.json | 21 ++ .../definitions/input/uberon_0002000.json | 21 ++ .../definitions/input/uberon_0002377.json | 21 ++ .../definitions/input/uberon_0002378.json | 21 ++ .../definitions/input/uberon_0002379.json | 21 ++ .../definitions/input/uberon_0002381.json | 11 +- .../definitions/input/uberon_0003682.json | 21 ++ .../definitions/input/uberon_0003690.json | 21 ++ .../definitions/input/uberon_0005893.json | 21 ++ .../definitions/input/uberon_0006719.json | 21 ++ .../definitions/input/uberon_0010990.json | 39 ++++ .../definitions/input/uberon_0015173.json | 21 ++ .../definitions/input/uberon_8600052.json | 21 ++ .../outputs/definitions/input/unknown.json | 21 ++ ...intertransversarii_laterales_lumborum.json | 21 ++ .../unresolvable_levator_costarum_muscle.json | 21 ++ .../unresolvable_neuromeningeal_trunk.json | 21 ++ ...solvable_respiratory_diaphragm_muscle.json | 21 ++ .../unresolvable_segmental_back_muscle.json | 38 ++- ...nresolvable_spinotransversales_muscle.json | 21 ++ ...resolvable_submucosal_artery_of_colon.json | 21 ++ ...nresolvable_supraperiosteal_arteriole.json | 21 ++ .../unresolvable_thoracic_wall_muscle.json | 21 ++ .../definitions/needs_mapping_fma_12252.json | 23 ++ .../definitions/needs_mapping_fma_22424.json | 15 +- .../definitions/needs_mapping_fma_22472.json | 22 ++ .../definitions/needs_mapping_fma_22474.json | 23 ++ .../definitions/needs_mapping_fma_323951.json | 25 ++ .../definitions/needs_mapping_fma_46583.json | 8 +- .../definitions/needs_mapping_fma_46588.json | 16 ++ .../definitions/needs_mapping_fma_46623.json | 18 ++ .../definitions/needs_mapping_fma_5841.json | 18 ++ .../outputs/definitions/uberon_0000975.json | 17 +- .../outputs/definitions/uberon_0000979.json | 40 ++++ .../outputs/definitions/uberon_0001092.json | 33 +++ .../outputs/definitions/uberon_0001194.json | 43 ++++ .../outputs/definitions/uberon_0001272.json | 39 ++++ .../outputs/definitions/uberon_0001537.json | 38 +++ .../outputs/definitions/uberon_0001546.json | 30 +++ .../outputs/definitions/uberon_0001572.json | 22 +- .../outputs/definitions/uberon_0001576.json | 48 ++++ .../outputs/definitions/uberon_0001624.json | 22 ++ .../outputs/definitions/uberon_0001677.json | 18 ++ .../outputs/definitions/uberon_0001876.json | 22 ++ .../outputs/definitions/uberon_0002000.json | 20 ++ .../outputs/definitions/uberon_0002377.json | 19 ++ .../outputs/definitions/uberon_0002378.json | 13 ++ .../outputs/definitions/uberon_0002379.json | 12 + .../outputs/definitions/uberon_0002381.json | 31 ++- .../outputs/definitions/uberon_0003682.json | 15 ++ .../outputs/definitions/uberon_0003690.json | 22 ++ .../outputs/definitions/uberon_0005893.json | 19 ++ .../outputs/definitions/uberon_0006719.json | 26 +++ .../outputs/definitions/uberon_0010990.json | 50 ++++ .../outputs/definitions/uberon_0015173.json | 39 ++++ .../outputs/definitions/uberon_8600052.json | 33 +++ .../outputs/definitions/unknown.json | 19 ++ ...intertransversarii_laterales_lumborum.json | 33 +++ .../unresolvable_levator_costarum_muscle.json | 33 +++ ...nresolvable_meningohypophyseal_artery.json | 19 +- .../unresolvable_neuromeningeal_trunk.json | 22 ++ ...solvable_respiratory_diaphragm_muscle.json | 40 ++++ .../unresolvable_segmental_back_muscle.json | 64 +++++- ...nresolvable_spinotransversales_muscle.json | 19 ++ ...resolvable_submucosal_artery_of_colon.json | 26 +++ ...nresolvable_supraperiosteal_arteriole.json | 33 +++ .../unresolvable_thoracic_wall_muscle.json | 33 +++ .../outputs/template_groups_initial.tsv | 22 +- .../outputs/template_muscle_initial.tsv | 63 ++++- .../hra-muscular-groups.template.tsv | 8 + .../hra-muscular-muscle.template.tsv | 29 ++- .../hra-muscular-reports/candidates.tsv | 35 ++- src/templates/hra-muscular-reports/errors.tsv | 26 +++ src/templates/hra-muscular-reports/input.tsv | 65 ++++++ .../hra-muscular-reports/manual_curation.tsv | 4 +- .../hra-muscular-reports/name_corrections.tsv | 18 ++ 94 files changed, 2566 insertions(+), 117 deletions(-) create mode 100644 bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_12252.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22472.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22474.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_323951.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46588.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46623.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_5841.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0000979.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0001092.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0001194.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0001272.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0001537.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0001546.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0001576.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0001624.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0001677.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0001876.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0002000.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0002377.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0002378.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0002379.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0003682.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0003690.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0005893.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0006719.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0010990.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_0015173.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/uberon_8600052.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/unknown.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/unresolvable_intertransversarii_laterales_lumborum.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/unresolvable_levator_costarum_muscle.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/unresolvable_neuromeningeal_trunk.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/unresolvable_respiratory_diaphragm_muscle.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/unresolvable_spinotransversales_muscle.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/unresolvable_submucosal_artery_of_colon.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/unresolvable_supraperiosteal_arteriole.json create mode 100644 bulk_ntr_workflow/outputs/definitions/input/unresolvable_thoracic_wall_muscle.json create mode 100644 bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_12252.json create mode 100644 bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22472.json create mode 100644 bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22474.json create mode 100644 bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_323951.json create mode 100644 bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46588.json create mode 100644 bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46623.json create mode 100644 bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_5841.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0000979.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0001092.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0001194.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0001272.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0001537.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0001546.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0001576.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0001624.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0001677.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0001876.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0002000.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0002377.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0002378.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0002379.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0003682.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0003690.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0005893.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0006719.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0010990.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_0015173.json create mode 100644 bulk_ntr_workflow/outputs/definitions/uberon_8600052.json create mode 100644 bulk_ntr_workflow/outputs/definitions/unknown.json create mode 100644 bulk_ntr_workflow/outputs/definitions/unresolvable_intertransversarii_laterales_lumborum.json create mode 100644 bulk_ntr_workflow/outputs/definitions/unresolvable_levator_costarum_muscle.json create mode 100644 bulk_ntr_workflow/outputs/definitions/unresolvable_neuromeningeal_trunk.json create mode 100644 bulk_ntr_workflow/outputs/definitions/unresolvable_respiratory_diaphragm_muscle.json create mode 100644 bulk_ntr_workflow/outputs/definitions/unresolvable_spinotransversales_muscle.json create mode 100644 bulk_ntr_workflow/outputs/definitions/unresolvable_submucosal_artery_of_colon.json create mode 100644 bulk_ntr_workflow/outputs/definitions/unresolvable_supraperiosteal_arteriole.json create mode 100644 bulk_ntr_workflow/outputs/definitions/unresolvable_thoracic_wall_muscle.json create mode 100644 src/templates/hra-muscular-reports/name_corrections.tsv diff --git a/bulk_ntr_workflow/outputs/definitions/grouping_terms.json b/bulk_ntr_workflow/outputs/definitions/grouping_terms.json index ae6de6c3c..0b75c5b28 100644 --- a/bulk_ntr_workflow/outputs/definitions/grouping_terms.json +++ b/bulk_ntr_workflow/outputs/definitions/grouping_terms.json @@ -1,56 +1,180 @@ { - "confirmed_matches": [ + "definitions": { + "dorsum of foot muscle": "A group of skeletal muscles located on the dorsal aspect of the foot, comprising the extensor digitorum brevis and extensor hallucis brevis, which act to extend the toes.", + "longitudinal pharyngeal muscle": "A group of skeletal muscles oriented longitudinally in the pharyngeal wall that act to elevate the pharynx and larynx during swallowing, comprising the stylopharyngeus, palatopharyngeus, and salpingopharyngeus muscles.", + "middle ear muscle": "A group of skeletal muscles located within the middle ear cavity that attenuate sound transmission through the auditory ossicles, comprising the tensor tympani and stapedius muscles.", + "pelvic floor muscle": "A group of skeletal muscles that form the floor of the pelvic cavity, supporting the pelvic viscera and surrounding the urogenital and anal openings, comprising the levator ani and coccygeus muscles.", + "posterior abdominal wall muscle": "A group of skeletal muscles located in the posterior part of the abdominal wall that support the lumbar spine and act on the trunk and hip, comprising the psoas major, psoas minor, iliacus, and quadratus lumborum muscles.", + "segmental back muscle": "A group of small skeletal muscles of the deep back that span individual vertebral segments, comprising the interspinales, intertransversarii, and levatores costarum, which produce minor movements of the vertebral column.", + "superficial back muscle": "A group of skeletal muscles forming the superficial layer of the back, which attach the upper limb to the trunk and act on the shoulder girdle, comprising the trapezius, latissimus dorsi, levator scapulae, and rhomboid muscles.", + "intermediate back muscle": "A group of skeletal muscles forming the intermediate layer of the back that act as accessory muscles of respiration, comprising the serratus posterior superior and serratus posterior inferior muscles.", + "thoracic wall muscle": "A group of skeletal muscles that are part of the thoracic wall and act on the ribs to produce respiratory movements, comprising the external, internal and innermost intercostals, subcostales and transversus thoracis.", + "external ear muscle": "A group of skeletal muscles attached to the auricular cartilage that act to move the pinna, comprising the auricularis anterior, auricularis superior, and auricularis posterior.", + "intrinsic eye muscle": "A group of smooth muscles located within the eyeball that control pupil diameter and lens accommodation, comprising the ciliary muscle, sphincter pupillae, and dilator pupillae.", + "sole of foot muscle": "A group of skeletal muscles located in the plantar part of the foot that act on the toes and support the longitudinal arch, comprising the four layers of plantar intrinsic muscles including the abductor hallucis, flexor digitorum brevis, lumbricals, quadratus plantae, flexor digiti minimi brevis, adductor hallucis, and plantar/dorsal interossei." + }, + "xrefs": { + "dorsum of foot muscle": "Wikipedia:Dorsum_of_foot", + "longitudinal pharyngeal muscle": "Wikipedia:Pharyngeal_muscles", + "middle ear muscle": "Wikipedia:Middle_ear", + "pelvic floor muscle": "Wikipedia:Pelvic_floor", + "posterior abdominal wall muscle": "Wikipedia:Abdominal_wall", + "segmental back muscle": "Wikipedia:Human_back", + "superficial back muscle": "Wikipedia:Human_back", + "intermediate back muscle": "Wikipedia:Human_back", + "thoracic wall muscle": "Wikipedia:Thoracic_wall", + "sole of foot muscle": "Wikipedia:Sole_(foot)" + }, + "def_xrefs_to_add": { + "dorsum of foot muscle": "PMID:30855843", + "longitudinal pharyngeal muscle": "PMID:25821538", + "middle ear muscle": "PMID:24379725", + "pelvic floor muscle": "PMID:28920577", + "posterior abdominal wall muscle": "PMID:30855915", + "segmental back muscle": "PMID:30571022", + "superficial back muscle": "PMID:30571022", + "intermediate back muscle": "PMID:30571022", + "thoracic wall muscle": "PMID:30855894", + "sole of foot muscle": "PMID:30571022" + }, + "group_template_rows": { + "superficial back muscle": { + "genus": "UBERON:0014892", + "location": "UBERON:0001137" + }, + "intermediate back muscle": { + "genus": "UBERON:0014892", + "location": "UBERON:0001137" + }, + "segmental back muscle": { + "genus": "UBERON:0014892", + "location": "UBERON:0001137" + }, + "thoracic wall muscle": { + "genus": "UBERON:0014892", + "location": "UBERON:0016403" + }, + "posterior abdominal wall muscle": { + "genus": "UBERON:0014892", + "location": "UBERON:0003697" + }, + "external ear muscle": { + "genus": "UBERON:0014892", + "location": "UBERON:0001691" + }, + "middle ear muscle": { + "genus": "UBERON:0014892", + "location": "UBERON:0001756" + }, + "sole of foot muscle": { + "genus": "UBERON:0014892", + "location": "UBERON:0008338" + } + }, + "manual_curation": [ { - "label": "circular pharyngeal muscle", - "uberon_id": "UBERON:0001569", - "confidence": "high", - "uberon_definition": "Pharyngeal constrictor refers to one of the muscles that serves to constrict the pharynx. They include: Superior pharyngeal constrictor muscle Middle pharyngeal constrictor muscle Inferior pharyngeal constrictor muscle.", - "wikipedia_summary": "Pharyngeal constrictor / circular pharyngeal muscle is the outer circular layer of pharyngeal musculature comprising the superior, middle, and inferior constrictors; functions to constrict the pharyngeal lumen during swallowing.", - "note": "UBERON:0001569 has EXACT synonym 'pharyngeal constrictor muscle' and xref Wikipedia:Pharyngeal_constrictor. The TA2 'circular pharyngeal muscle' refers to the same circular layer collective. UBERON:0001569 is a parent class with members superior/middle/inferior pharyngeal constrictor (UBERON:0006329, UBERON:0010749, UBERON:0001570). Recommend adding 'circular pharyngeal muscle' as RELATED synonym to UBERON:0001569." + "label": "pelvic floor muscle", + "definition": "A group of skeletal muscles that form the floor of the pelvic cavity, supporting the pelvic viscera and surrounding the urogenital and anal openings, comprising the levator ani and coccygeus muscles.", + "reason": "No UBERON term currently exists for 'pelvic floor' or 'pelvic diaphragm' as an anatomical region — only the constituent muscles (levator ani UBERON:0001326, coccygeus UBERON:0001327) and the broader pelvic region (UBERON:0002355) are represented. The simple genus + part_of pattern needs a target term for the pelvic floor itself.", + "similar_terms": [ + {"id": "UBERON:0001325", "label": "muscle of pelvis", "intersection_of": ["UBERON:0014892 ! skeletal muscle organ, vertebrate", "part_of UBERON:0002355 ! pelvic region of trunk"]}, + {"id": "UBERON:0001326", "label": "levator ani muscle", "intersection_of": ["is_a UBERON:0001325 ! muscle of pelvis"]}, + {"id": "UBERON:0001327", "label": "coccygeus muscle", "intersection_of": ["is_a UBERON:0001325 ! muscle of pelvis"]} + ], + "suggestion": "Either (a) add a new region term 'pelvic floor' / 'pelvic diaphragm' and define this group as skeletal muscle organ part_of that, or (b) define as has_part levator_ani and has_part coccygeus, or (c) treat as a subclass of muscle of pelvis (UBERON:0001325) without an EC definition." + }, + { + "label": "dorsum of foot muscle", + "definition": "A group of skeletal muscles located on the dorsal aspect of the foot, comprising the extensor digitorum brevis and extensor hallucis brevis, which act to extend the toes.", + "reason": "No UBERON term exists for 'dorsum of foot' / 'dorsal region of pes' as a region. The only dorsal pes term found is UBERON:0006499 dorsal pes interosseous muscle (a specific muscle, not a region). Simple genus + part_of pattern cannot be applied without a region target.", + "similar_terms": [ + {"id": "UBERON:0008338", "label": "plantar part of pes", "intersection_of": ["UBERON:0008837 ! palmar/plantar part of autopod", "part_of UBERON:0002387 ! pes"]} + ], + "suggestion": "Add a new region term 'dorsal part of pes' (analogous to UBERON:0008338 plantar part of pes) and define this group as skeletal muscle organ part_of that region. Alternatively define by membership (has_part extensor digitorum brevis, has_part extensor hallucis brevis)." + }, + { + "label": "longitudinal pharyngeal muscle", + "definition": "A group of skeletal muscles oriented longitudinally in the pharyngeal wall that act to elevate the pharynx and larynx during swallowing, comprising the stylopharyngeus, palatopharyngeus, and salpingopharyngeus muscles.", + "reason": "This is a sub-grouping of pharyngeal muscles defined by fibre orientation (longitudinal) within the pharyngeal wall — not a simple part_of-defined subset. UBERON's circular counterpart (UBERON:0001569 constrictor muscle of pharynx) is is_a UBERON:0000933 chordate pharyngeal muscle without an EC axiom on orientation. The simple genus + part_of pattern cannot express fibre orientation.", + "similar_terms": [ + {"id": "UBERON:0001569", "label": "constrictor muscle of pharynx", "intersection_of": ["is_a UBERON:0000933 ! chordate pharyngeal muscle (no EC axiom)"]}, + {"id": "UBERON:0000933", "label": "chordate pharyngeal muscle", "intersection_of": ["UBERON:0001630 ! muscle organ", "part_of UBERON:0004467 ! musculature of pharynx"]} + ], + "suggestion": "Either model as subclass of chordate pharyngeal muscle (UBERON:0000933) without an EC, mirroring how UBERON:0001569 is handled, or add a new relation/property for muscle fibre orientation. Note that circular pharyngeal muscle (the sibling) maps directly to UBERON:0001569 — see confirmed_matches." } ], - "possible_matches": [ + "confirmed_matches": [ { "label": "anterior vertebral muscle", "uberon_id": "UBERON:0008549", - "confidence": "medium", - "note": "UBERON:0008549 'prevertebral muscle' has the same definition (one of the muscles deep to the prevertebral fascia... including the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis). Synonym 'flexor muscle of vertebral column'. The TA2 term 'anterior vertebral muscle' is a synonymous regional grouping. Curator should confirm whether to map directly to UBERON:0008549, to its child UBERON:0017647 'prevertebral muscle of neck', or add as RELATED synonym. Definition uses attaches_to + innervated_by axioms (multi-axiom pattern), not the simple genus + part_of pattern, so this would be out of scope for the EC template even if added as a new term." - } - ], - "manual_curation": [ + "confidence": "high", + "uberon_definition": "One of the muscles deep to the prevertebral fascia on the anterior surface of the cervical and superior three thoracic vertebrae, symmetrically placed on each side of the median plane, including the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis muscles.", + "wikipedia_summary": "The prevertebral muscles (also called anterior vertebral muscles in TA2) are a group of muscles anterior to the vertebral column comprising longus colli, longus capitis, rectus capitis anterior and rectus capitis lateralis. 'flexor muscle of vertebral column' is already an EXACT synonym (FMA:32514).", + "synonym_addition_suggested": "Add 'anterior vertebral muscle' as an EXACT synonym (TA2 terminology)." + }, { - "label": "anterior vertebral muscle", - "definition": "A group of muscles deep to the prevertebral fascia on the anterior surface of the cervical and superior thoracic vertebrae, comprising the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis muscles; innervated by anterior rami of cervical spinal nerves; functions in flexion of the head and neck.", - "reason": "The closest existing UBERON term is UBERON:0008549 (prevertebral muscle) which uses 'is_a + attaches_to + innervated_by' axioms — NOT the simple genus + part_of pattern supported by the groups template. If treated as a confirmed/possible match instead, no new term is needed. Curator should decide between mapping to UBERON:0008549 vs creating 'anterior vertebral muscle' as a synonym.", - "similar_terms": [ - { - "id": "UBERON:0008549", - "label": "prevertebral muscle", - "intersection_of": ["(none — uses is_a + attaches_to UBERON:0002412 vertebra + innervated_by UBERON:0006838 ventral ramus of spinal nerve)"] - }, - { - "id": "UBERON:0017647", - "label": "prevertebral muscle of neck", - "intersection_of": ["UBERON:0008549 prevertebral muscle", "part_of UBERON:0000974 neck"] - } - ], - "suggestion": "Most likely outcome: add 'anterior vertebral muscle' as RELATED synonym to UBERON:0008549, no new term needed." + "label": "circular pharyngeal muscle", + "uberon_id": "UBERON:0001569", + "confidence": "high", + "uberon_definition": "Pharyngeal constrictor refers to one of the muscles that serves to constrict the pharynx. They include: Superior, Middle, and Inferior pharyngeal constrictor muscle.", + "wikipedia_summary": "The three pharyngeal constrictor muscles (superior, middle, inferior) are the circularly-oriented muscles of the pharynx; the longitudinal pharyngeal muscles (stylopharyngeus, palatopharyngeus, salpingopharyngeus) form the complementary group. TA2 names them 'circular pharyngeal muscles'.", + "synonym_addition_suggested": "Add 'circular pharyngeal muscle' as an EXACT synonym (TA2 terminology)." + }, + { + "label": "lateral vertebral muscle", + "uberon_id": "UBERON:0008611", + "confidence": "high", + "uberon_definition": "Any of the three pairs of muscles in the lateral neck, namely the scalenus anterior, scalenus medius, and scalenus posterior. They are innervated by the spinal nerves C4-C8.", + "wikipedia_summary": "The scalene muscles (TA2 'lateral vertebral muscles') are the three paired muscles of the lateral neck. 'lateral vertebral muscle' is already listed as a RELATED synonym on UBERON:0008611.", + "synonym_addition_suggested": "Promote existing RELATED synonym 'lateral vertebral muscle' to EXACT (TA2 terminology)." + }, + { + "label": "hypothenar hand muscle", + "uberon_id": "UBERON:0014377", + "confidence": "high", + "uberon_definition": "Any of three muscles of the palm that control the motion of the little finger.", + "wikipedia_summary": "The hypothenar muscles are the three intrinsic muscles of the hand (abductor digiti minimi, flexor digiti minimi brevis, opponens digiti minimi) controlling the little finger. The TA2 name 'hypothenar hand muscle' is essentially the existing UBERON term.", + "synonym_addition_suggested": "Add 'hypothenar hand muscle' as an EXACT synonym." + }, + { + "label": "palmar interosseous muscle", + "uberon_id": "UBERON:0006505", + "confidence": "high", + "uberon_definition": "Any of three muscles, the first with its origin from the second metacarpal, and the second and the third with origin from the fourth and fifth metacarpals; adducts the fingers toward the axis of the middle finger.", + "wikipedia_summary": "The palmar interossei are three small unipennate hand muscles between the metacarpals. TA2 'palmar interosseous muscle' is the same as UBERON's 'palmar interosseous muscle of manus'.", + "synonym_addition_suggested": "Add 'palmar interosseous muscle' as an EXACT synonym." + }, + { + "label": "plantar interosseous muscle", + "uberon_id": "UBERON:0006502", + "confidence": "high", + "uberon_definition": "Any of three muscles with origin from the third, fourth, and fifth metatarsal bones, with insertion to the proximal phalanx of the same toes, with nerve supply from the lateral plantar nerve, and whose action adducts the three lateral toes.", + "wikipedia_summary": "The plantar interossei are three unipennate muscles of the foot between the metatarsals. TA2 'plantar interosseous muscle' is the same as UBERON's 'plantar interosseous muscle of pes'.", + "synonym_addition_suggested": "Add 'plantar interosseous muscle' as an EXACT synonym." + }, + { + "label": "spinotransversales muscle", + "uberon_id": "UBERON:0002252", + "confidence": "high", + "uberon_definition": "A superficial postvertebral muscle innervated by the posterior ramus of the cervical spinal nerve with origins in the upper thoracic and lower cervical spinous processes whose actions are to extend and ipsilaterally rotate the head and neck. Examples: splenius capitis, splenius cervicis.", + "wikipedia_summary": "The spinotransversales group consists of the two splenius muscles (splenius capitis and splenius cervicis) — origin on spinous processes, insertion on transverse processes — hence the name. Identical scope to UBERON 'splenius'.", + "synonym_addition_suggested": "Add 'spinotransversales muscle' and 'spinotransversales muscles' as EXACT synonyms." + }, + { + "label": "muscle of facial expression", + "uberon_id": "UBERON:0001577", + "confidence": "high", + "uberon_definition": "A muscle innervated by a facial nerve.", + "wikipedia_summary": "The muscles of facial expression are the subcutaneous muscles innervated by the facial nerve (CN VII). UBERON:0001577 already lists 'muscles of facial expression' (RELATED) and 'muscle of facil expression' as synonyms; same scope.", + "synonym_addition_suggested": "Add 'muscle of facial expression' as an EXACT synonym (TA2 form)." + }, + { + "label": "intrinsic eye muscle", + "uberon_id": "UBERON:0011222", + "confidence": "high", + "uberon_definition": "Muscles within the eye (bulbus oculi). Comprises ciliary muscle and the pupillary muscles.", + "wikipedia_summary": "Intrinsic ocular muscles are the smooth muscles within the eyeball: ciliary muscle, sphincter pupillae, dilator pupillae — controlling accommodation and pupil size. Existing synonym 'intrinsic ocular muscle' EXACT.", + "synonym_addition_suggested": "Add 'intrinsic eye muscle' as an EXACT synonym." } - ], - "definitions": { - "circular pharyngeal muscle": "A group of pharyngeal muscles forming the outer circular layer of the pharyngeal wall, comprising the superior, middle, and inferior pharyngeal constrictors, which encircle the pharynx and contract sequentially during swallowing to propel the food bolus into the esophagus; innervated chiefly by the pharyngeal branch of the vagus nerve (CN X).", - "anterior vertebral muscle": "A group of muscles deep to the prevertebral fascia on the anterior surface of the cervical and superior thoracic vertebrae, comprising the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis muscles, innervated by anterior rami of cervical spinal nerves and acting to flex and stabilize the head and neck." - }, - "wikipedia_images": { - "circular pharyngeal muscle": "http://upload.wikimedia.org/wikipedia/commons/a/ac/Musculusconstrictorpharyngissuperior.png", - "anterior vertebral muscle": "https://upload.wikimedia.org/wikipedia/commons/b/b0/Prevertebral_muscles.png" - }, - "xrefs": { - "circular pharyngeal muscle": "Wikipedia:Pharyngeal_constrictor|FMA:46620", - "anterior vertebral muscle": "Wikipedia:Prevertebral_muscles|FMA:32514" - }, - "def_xrefs_to_add": { - "circular pharyngeal muscle": "Wikipedia:Pharyngeal_constrictor", - "anterior vertebral muscle": "Wikipedia:Prevertebral_muscles" - } + ] } diff --git a/bulk_ntr_workflow/outputs/definitions/input/grouping_terms.json b/bulk_ntr_workflow/outputs/definitions/input/grouping_terms.json index 4616b0efe..d0f9676be 100644 --- a/bulk_ntr_workflow/outputs/definitions/input/grouping_terms.json +++ b/bulk_ntr_workflow/outputs/definitions/input/grouping_terms.json @@ -4,7 +4,7 @@ "parent_label": "(grouping terms \u2014 agent determines genus + part_of differentiator per term)", "term_counts": { "leaf": 0, - "group": 2 + "group": 20 }, "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", "terms": [ @@ -23,6 +23,150 @@ "genus": "", "location": "", "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_circular-pharyngeal-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900011", + "label": "dorsum of foot muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsum-of-foot-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900013", + "label": "external ear muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|https://purl.org/ccf/ASCTB-TEMP_external-ear-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900016", + "label": "hypothenar hand muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_hypothenar-hand-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900020", + "label": "intermediate back muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_intermediate-back-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900024", + "label": "intrinsic eye muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_intrinsic-eye-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900027", + "label": "lateral vertebral muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_lateral-vertebral-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900032", + "label": "longitudinal pharyngeal muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_longitudinal-pharyngeal-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900036", + "label": "middle ear muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_middle-ear-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900040", + "label": "muscle of facial expression", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|https://purl.org/ccf/ASCTB-TEMP_muscle-of-facial-expression" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900044", + "label": "palmar interosseous muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_palmar-interosseous-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900045", + "label": "pelvic floor muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|https://purl.org/ccf/ASCTB-TEMP_pelvic-floor-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900046", + "label": "plantar interosseous muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_plantar-interosseous-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900047", + "label": "posterior abdominal wall muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_posterior-abdominal-wall-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900055", + "label": "segmental back muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900056", + "label": "sole of foot muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_sole-of-foot-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900059", + "label": "spinotransversales muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_spinotransversales-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900063", + "label": "superficial back muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_superficial-back-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900068", + "label": "thoracic wall muscle", + "term_type": "group", + "genus": "", + "location": "", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_thoracic-wall-muscle" } ] } \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_12252.json b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_12252.json new file mode 100644 index 000000000..15d8bebab --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_12252.json @@ -0,0 +1,21 @@ +{ + "group_name": "needs_mapping_fma_12252", + "parent_id": "NEEDS_MAPPING:FMA:12252", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900053", + "label": "respiratory diaphragm muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "NEEDS_MAPPING:FMA:12252", + "part_of": "NEEDS_MAPPING:FMA:12252", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_respiratory-diaphragm-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22472.json b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22472.json new file mode 100644 index 000000000..2f93570f6 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22472.json @@ -0,0 +1,21 @@ +{ + "group_name": "needs_mapping_fma_22472", + "parent_id": "NEEDS_MAPPING:FMA:22472", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900071", + "label": "tibalis anterior muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "NEEDS_MAPPING:FMA:22472", + "part_of": "NEEDS_MAPPING:FMA:22472", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_tibalis-anterior-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22474.json b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22474.json new file mode 100644 index 000000000..eaa4b55e0 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_22474.json @@ -0,0 +1,21 @@ +{ + "group_name": "needs_mapping_fma_22474", + "parent_id": "NEEDS_MAPPING:FMA:22474", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900072", + "label": "tibalis posterior muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "NEEDS_MAPPING:FMA:22474", + "part_of": "NEEDS_MAPPING:FMA:22474", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_tibalis-posterior-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_323951.json b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_323951.json new file mode 100644 index 000000000..e0f508cbc --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_323951.json @@ -0,0 +1,21 @@ +{ + "group_name": "needs_mapping_fma_323951", + "parent_id": "NEEDS_MAPPING:FMA:323951", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900028", + "label": "left crus of lumbar part of respiratory diaphragm muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "NEEDS_MAPPING:FMA:323951", + "part_of": "NEEDS_MAPPING:FMA:323951", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_left-crus-of-lumbar-part-of-respiratory-diaphragm-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46588.json b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46588.json new file mode 100644 index 000000000..111b5af29 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46588.json @@ -0,0 +1,21 @@ +{ + "group_name": "needs_mapping_fma_46588", + "parent_id": "NEEDS_MAPPING:FMA:46588", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900069", + "label": "thyroepiglottic part of thyroarytenoid muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "NEEDS_MAPPING:FMA:46588", + "part_of": "NEEDS_MAPPING:FMA:46588", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_thyroepiglottic-part-of-thyroarytenoid-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46623.json b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46623.json new file mode 100644 index 000000000..3168843ab --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_46623.json @@ -0,0 +1,21 @@ +{ + "group_name": "needs_mapping_fma_46623", + "parent_id": "NEEDS_MAPPING:FMA:46623", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900070", + "label": "thyropharyngeal part of inferior pharyngeal constrictor muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "NEEDS_MAPPING:FMA:46623", + "part_of": "NEEDS_MAPPING:FMA:46623", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_thyropharyngeal-part-of-inferior-pharyngeal-constrictor-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_5841.json b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_5841.json new file mode 100644 index 000000000..6cceb0265 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/needs_mapping_fma_5841.json @@ -0,0 +1,21 @@ +{ + "group_name": "needs_mapping_fma_5841", + "parent_id": "NEEDS_MAPPING:FMA:5841", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900054", + "label": "right crus of lumbar part of respiratory diaphragm muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "NEEDS_MAPPING:FMA:5841", + "part_of": "NEEDS_MAPPING:FMA:5841", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_right-crus-of-lumbar-part-of-respiratory-diaphragm-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0000979.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0000979.json new file mode 100644 index 000000000..93a22a2ab --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0000979.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0000979", + "parent_id": "UBERON:0000979", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900022", + "label": "interspinales cervicalis muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0000979", + "part_of": "INFER:UBERON:0000979", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_interspinales-cervicalis-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0001092.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001092.json new file mode 100644 index 000000000..a7f17d791 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001092.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0001092", + "parent_id": "UBERON:0001092", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900015", + "label": "hamstring portion of adductor magnus muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0001092", + "part_of": "INFER:UBERON:0001092", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_hamstring-portion-of-adductor-magnus-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0001194.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001194.json new file mode 100644 index 000000000..e79cce694 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001194.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0001194", + "parent_id": "UBERON:0001194", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900019", + "label": "inferior longitudinal lingual muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0001194", + "part_of": "INFER:UBERON:0001194", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_inferior-longitudinal-lingual-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0001272.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001272.json new file mode 100644 index 000000000..d6c3ee345 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001272.json @@ -0,0 +1,30 @@ +{ + "group_name": "uberon_0001272", + "parent_id": "UBERON:0001272", + "parent_label": "", + "term_counts": { + "leaf": 2, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900017", + "label": "iliocostalis cervicalis muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0001272", + "part_of": "INFER:UBERON:0001272", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_iliocostalis-cervicalis-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900048", + "label": "pteryopharyngeal part of superior pharyngeal constrictor muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0001272", + "part_of": "INFER:UBERON:0001272", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_pteryopharyngeal-part-of-superior-pharyngeal-constrictor-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0001537.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001537.json new file mode 100644 index 000000000..e927a4d6d --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001537.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0001537", + "parent_id": "UBERON:0001537", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900025", + "label": "lateral compartmet of leg muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0001537", + "part_of": "INFER:UBERON:0001537", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_lateral-compartmet-of-leg-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0001546.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001546.json new file mode 100644 index 000000000..9f9a0e698 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001546.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0001546", + "parent_id": "UBERON:0001546", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900026", + "label": "lateral posterior cervical intertransversarii muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0001546", + "part_of": "INFER:UBERON:0001546", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_lateral-posterior-cervical-intertransversarii-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0001576.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001576.json new file mode 100644 index 000000000..74e5cb590 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001576.json @@ -0,0 +1,39 @@ +{ + "group_name": "uberon_0001576", + "parent_id": "UBERON:0001576", + "parent_label": "", + "term_counts": { + "leaf": 3, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900065", + "label": "superior longitudinal lingual muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0001576", + "part_of": "INFER:UBERON:0001576", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_superior-longitudinal-lingual-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900073", + "label": "transverse muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0001576", + "part_of": "INFER:UBERON:0001576", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_transverse-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900075", + "label": "vertical muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0001576", + "part_of": "INFER:UBERON:0001576", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_vertical-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0001624.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001624.json new file mode 100644 index 000000000..be2962bbb --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001624.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0001624", + "parent_id": "UBERON:0001624", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900043", + "label": "opponens digiti minimi muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0001624", + "part_of": "INFER:UBERON:0001624", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_opponens-digiti-minimi-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0001677.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001677.json new file mode 100644 index 000000000..925d3ff69 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001677.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0001677", + "parent_id": "UBERON:0001677", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900029", + "label": "levator costarum muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0001677", + "part_of": "INFER:UBERON:0001677", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_levator-costarum-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0001876.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001876.json new file mode 100644 index 000000000..7d7b0d537 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0001876.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0001876", + "parent_id": "UBERON:0001876", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900012", + "label": "external anal sphincter muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0001876", + "part_of": "INFER:UBERON:0001876", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_external-anal-sphincter-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0002000.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002000.json new file mode 100644 index 000000000..305d5d4b2 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002000.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0002000", + "parent_id": "UBERON:0002000", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900066", + "label": "tensor fascia latae muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0002000", + "part_of": "INFER:UBERON:0002000", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_tensor-fascia-latae-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0002377.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002377.json new file mode 100644 index 000000000..2069e2467 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002377.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0002377", + "parent_id": "UBERON:0002377", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900033", + "label": "longus capitus muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0002377", + "part_of": "INFER:UBERON:0002377", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_longus-capitus-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0002378.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002378.json new file mode 100644 index 000000000..5dad9d0e8 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002378.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0002378", + "parent_id": "UBERON:0002378", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900057", + "label": "spermatic cord muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0002378", + "part_of": "INFER:UBERON:0002378", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_spermatic-cord-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0002379.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002379.json new file mode 100644 index 000000000..f21ddef7b --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002379.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0002379", + "parent_id": "UBERON:0002379", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900058", + "label": "sphincter urethrae muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0002379", + "part_of": "INFER:UBERON:0002379", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_sphincter-urethrae-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0002381.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002381.json index 6266502bd..59240426f 100644 --- a/bulk_ntr_workflow/outputs/definitions/input/uberon_0002381.json +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0002381.json @@ -3,7 +3,7 @@ "parent_id": "UBERON:0002381", "parent_label": "", "term_counts": { - "leaf": 1, + "leaf": 2, "group": 0 }, "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", @@ -16,6 +16,15 @@ "is_a": "INFER:UBERON:0002381", "part_of": "INFER:UBERON:0002381", "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900062", + "label": "sternocostal head of pectoralis major muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0002381", + "part_of": "INFER:UBERON:0002381", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_sternocostal-head-of-pectoralis-major-muscle" } ] } \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0003682.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0003682.json new file mode 100644 index 000000000..a3d348ffb --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0003682.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0003682", + "parent_id": "UBERON:0003682", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900041", + "label": "musculus uvulae muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0003682", + "part_of": "INFER:UBERON:0003682", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_musculus-uvulae-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0003690.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0003690.json new file mode 100644 index 000000000..351828072 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0003690.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0003690", + "parent_id": "UBERON:0003690", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900021", + "label": "internal abdominal oblique muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0003690", + "part_of": "INFER:UBERON:0003690", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_internal-abdominal-oblique-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0005893.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0005893.json new file mode 100644 index 000000000..a7285588b --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0005893.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0005893", + "parent_id": "UBERON:0005893", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900014", + "label": "frontal belly of occipitofrontalis muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0005893", + "part_of": "INFER:UBERON:0005893", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_frontal-belly-of-occipitofrontalis-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0006719.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0006719.json new file mode 100644 index 000000000..4120d7f7c --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0006719.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0006719", + "parent_id": "UBERON:0006719", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900064", + "label": "superior head of lateral pterygoid muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0006719", + "part_of": "INFER:UBERON:0006719", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_superior-head-of-lateral-pterygoid-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0010990.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0010990.json new file mode 100644 index 000000000..e47a6a33c --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0010990.json @@ -0,0 +1,39 @@ +{ + "group_name": "uberon_0010990", + "parent_id": "UBERON:0010990", + "parent_label": "", + "term_counts": { + "leaf": 3, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900037", + "label": "multifidus cervicis muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0010990", + "part_of": "INFER:UBERON:0010990", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_multifidus-cervicis-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900038", + "label": "multifidus lumborum muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0010990", + "part_of": "INFER:UBERON:0010990", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_multifidus-lumborum-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900039", + "label": "multifidus thoracis muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0010990", + "part_of": "INFER:UBERON:0010990", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_multifidus-thoracis-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_0015173.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_0015173.json new file mode 100644 index 000000000..40ba829df --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_0015173.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_0015173", + "parent_id": "UBERON:0015173", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900050", + "label": "puboperineales muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:0015173", + "part_of": "INFER:UBERON:0015173", + "def_xref": "https://fipat.library.dal.ca/ta2/|https://purl.org/ccf/ASCTB-TEMP_puboperineales-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/uberon_8600052.json b/bulk_ntr_workflow/outputs/definitions/input/uberon_8600052.json new file mode 100644 index 000000000..0fecdf596 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/uberon_8600052.json @@ -0,0 +1,21 @@ +{ + "group_name": "uberon_8600052", + "parent_id": "UBERON:8600052", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900049", + "label": "puboanalis muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "INFER:UBERON:8600052", + "part_of": "INFER:UBERON:8600052", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_puboanalis-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/unknown.json b/bulk_ntr_workflow/outputs/definitions/input/unknown.json new file mode 100644 index 000000000..53b10bf7c --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/unknown.json @@ -0,0 +1,21 @@ +{ + "group_name": "unknown", + "parent_id": "UNKNOWN", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900052", + "label": "rectus capitus anterior muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNKNOWN", + "part_of": "UNKNOWN", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_rectus-capitus-anterior-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_intertransversarii_laterales_lumborum.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_intertransversarii_laterales_lumborum.json new file mode 100644 index 000000000..f00d788f1 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_intertransversarii_laterales_lumborum.json @@ -0,0 +1,21 @@ +{ + "group_name": "unresolvable_intertransversarii_laterales_lumborum", + "parent_id": "UNRESOLVABLE:intertransversarii laterales lumborum muscle", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900074", + "label": "ventral part of intertransversarii laterales lumborum muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNRESOLVABLE:intertransversarii laterales lumborum muscle", + "part_of": "UNRESOLVABLE:intertransversarii laterales lumborum muscle", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_ventral-part-of-intertransversarii-laterales-lumborum-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_levator_costarum_muscle.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_levator_costarum_muscle.json new file mode 100644 index 000000000..c9e7c71ae --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_levator_costarum_muscle.json @@ -0,0 +1,21 @@ +{ + "group_name": "unresolvable_levator_costarum_muscle", + "parent_id": "UNRESOLVABLE:levator costarum muscle", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900031", + "label": "levatores costarum longi of levator costarum muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNRESOLVABLE:levator costarum muscle", + "part_of": "UNRESOLVABLE:levator costarum muscle", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_levatores-costarum-longi-of-levator-costarum-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_neuromeningeal_trunk.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_neuromeningeal_trunk.json new file mode 100644 index 000000000..ec547c049 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_neuromeningeal_trunk.json @@ -0,0 +1,21 @@ +{ + "group_name": "unresolvable_neuromeningeal_trunk", + "parent_id": "UNRESOLVABLE:neuromeningeal trunk", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900042", + "label": "occipital belly of occipitofrontalis muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNRESOLVABLE:neuromeningeal trunk", + "part_of": "UNRESOLVABLE:neuromeningeal trunk", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_occipital-belly-of-occipitofrontalis-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_respiratory_diaphragm_muscle.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_respiratory_diaphragm_muscle.json new file mode 100644 index 000000000..31ae3f98d --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_respiratory_diaphragm_muscle.json @@ -0,0 +1,21 @@ +{ + "group_name": "unresolvable_respiratory_diaphragm_muscle", + "parent_id": "UNRESOLVABLE:respiratory diaphragm muscle", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900061", + "label": "sternal part of respiratory diaphragm muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNRESOLVABLE:respiratory diaphragm muscle", + "part_of": "UNRESOLVABLE:respiratory diaphragm muscle", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_sternal-part-of-respiratory-diaphragm-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_segmental_back_muscle.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_segmental_back_muscle.json index f6d71de2e..bcd1185a4 100644 --- a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_segmental_back_muscle.json +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_segmental_back_muscle.json @@ -3,7 +3,7 @@ "parent_id": "UNRESOLVABLE:segmental back muscle", "parent_label": "", "term_counts": { - "leaf": 1, + "leaf": 5, "group": 0 }, "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", @@ -16,6 +16,42 @@ "is_a": "UNRESOLVABLE:segmental back muscle", "part_of": "UNRESOLVABLE:segmental back muscle", "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900023", + "label": "intertransversarii laterales lumborum muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNRESOLVABLE:segmental back muscle", + "part_of": "UNRESOLVABLE:segmental back muscle", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_intertransversarii-laterales-lumborum-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900034", + "label": "medial lumbar intertransversarii muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNRESOLVABLE:segmental back muscle", + "part_of": "UNRESOLVABLE:segmental back muscle", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_medial-lumbar-intertransversarii-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900035", + "label": "medial posterior cervical intertransversarii muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNRESOLVABLE:segmental back muscle", + "part_of": "UNRESOLVABLE:segmental back muscle", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_medial-posterior-cervical-intertransversarii-muscle" + }, + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900067", + "label": "thoracic intertransversarii muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNRESOLVABLE:segmental back muscle", + "part_of": "UNRESOLVABLE:segmental back muscle", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_thoracic-intertransversarii-muscle" } ] } \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_spinotransversales_muscle.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_spinotransversales_muscle.json new file mode 100644 index 000000000..23ba1b50b --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_spinotransversales_muscle.json @@ -0,0 +1,21 @@ +{ + "group_name": "unresolvable_spinotransversales_muscle", + "parent_id": "UNRESOLVABLE:spinotransversales muscle", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900060", + "label": "splenius capitus muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNRESOLVABLE:spinotransversales muscle", + "part_of": "UNRESOLVABLE:spinotransversales muscle", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_splenius-capitus-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_submucosal_artery_of_colon.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_submucosal_artery_of_colon.json new file mode 100644 index 000000000..9d31f15b8 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_submucosal_artery_of_colon.json @@ -0,0 +1,21 @@ +{ + "group_name": "unresolvable_submucosal_artery_of_colon", + "parent_id": "UNRESOLVABLE:submucosal artery of colon", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900051", + "label": "rectus capitius posterior minor muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNRESOLVABLE:submucosal artery of colon", + "part_of": "UNRESOLVABLE:submucosal artery of colon", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_rectus-capitius-posterior-minor-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_supraperiosteal_arteriole.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_supraperiosteal_arteriole.json new file mode 100644 index 000000000..fbd31954d --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_supraperiosteal_arteriole.json @@ -0,0 +1,21 @@ +{ + "group_name": "unresolvable_supraperiosteal_arteriole", + "parent_id": "UNRESOLVABLE:supraperiosteal arteriole", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900018", + "label": "inferior head of lateral pterygoid muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNRESOLVABLE:supraperiosteal arteriole", + "part_of": "UNRESOLVABLE:supraperiosteal arteriole", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_inferior-head-of-lateral-pterygoid-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/input/unresolvable_thoracic_wall_muscle.json b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_thoracic_wall_muscle.json new file mode 100644 index 000000000..e3ab79284 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/input/unresolvable_thoracic_wall_muscle.json @@ -0,0 +1,21 @@ +{ + "group_name": "unresolvable_thoracic_wall_muscle", + "parent_id": "UNRESOLVABLE:thoracic wall muscle", + "parent_label": "", + "term_counts": { + "leaf": 1, + "group": 0 + }, + "note": "parent_label is best-effort; subagent should resolve via OLS4. For term_type='group' terms: use obo-grep on uberon-edit.obo to find similar UBERON groupings, identify the genus + part_of pattern, and fill genus + location. If pattern doesn't fit, route to manual_curation.", + "terms": [ + { + "ntr_id": "http://purl.obolibrary.org/obo/UBERON_9900030", + "label": "levatores costarum breves of levator costarum muscle", + "term_type": "leaf", + "system": "muscle", + "is_a": "UNRESOLVABLE:thoracic wall muscle", + "part_of": "UNRESOLVABLE:thoracic wall muscle", + "def_xref": "https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_levatores-costarum-breves-of-levator-costarum-muscle" + } + ] +} \ No newline at end of file diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_12252.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_12252.json new file mode 100644 index 000000000..52070bf2b --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_12252.json @@ -0,0 +1,23 @@ +{ + "confirmed_matches": [ + { + "label": "respiratory diaphragm muscle", + "uberon_id": "UBERON:0001103", + "confidence": "high", + "uberon_definition": "A thin musculomembranous barrier that separates the abdominal and thoracic cavities. Often used for breathing control.", + "wikipedia_summary": "The thoracic diaphragm, or simply the diaphragm, is a sheet of internal skeletal muscle in mammals that extends across the bottom of the thoracic cavity. The diaphragm separates the thoracic cavity, containing the heart and lungs, from the abdominal cavity and performs an important function in respiration: as the diaphragm contracts, the volume of the thoracic cavity increases, creating a negative pressure there, which draws air into the lungs.", + "match_evidence": [ + "UBERON:0001103 has EXACT synonym 'diaphragm muscle' (BTO:0000341).", + "UBERON:0001103 is_a UBERON:0014892 (skeletal muscle organ, vertebrate); part_of UBERON:0001004 (respiratory system); innervated_by UBERON:0001884 (phrenic nerve).", + "FMA xref on UBERON:0001103 is FMA:13295 (label 'Diaphragm'). The source 'NEEDS_MAPPING:FMA:12252' appears to be an erroneous FMA ID — FMA:12252 resolves to 'Subclavian lymphatic trunk', which is unrelated to the term label 'respiratory diaphragm muscle'. The term label itself is a direct synonym of UBERON:0001103." + ] + } + ], + "unresolvable": [ + { + "label": "NEEDS_MAPPING:FMA:12252 (parent)", + "reason": "The supplied FMA parent ID FMA:12252 resolves to 'Subclavian lymphatic trunk' in FMA, which is not anatomically a parent of a diaphragm muscle. Likely an input data error; the correct FMA ID for diaphragm is FMA:13295.", + "suggestion": "Treat as input error. The term itself is a confirmed match for UBERON:0001103, so the parent mapping question is moot — exclude from template." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json index 35c5d8e89..b2e44e504 100644 --- a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22424.json @@ -1,9 +1,9 @@ { "definitions": { - "articularis genu muscle": "A muscle organ of the anterior thigh, often described as a deep, flat, variable accessory of the quadriceps femoris that arises from the anterior surface of the distal femur and inserts onto the suprapatellar bursa and synovial membrane of the knee joint, retracting the joint capsule during knee extension." + "articularis genu muscle": "A small skeletal muscle organ of the anterior thigh, lying deep to the vastus intermedius, that arises from the anterior surface of the distal shaft of the femur and inserts onto the proximal wall of the suprapatellar bursa and the synovial membrane of the knee joint, where it retracts the bursa superiorly during knee extension." }, "wikipedia_images": { - "articularis genu muscle": "https://upload.wikimedia.org/wikipedia/commons/0/06/Gray434.png" + "articularis genu muscle": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Gray244.png" }, "xrefs": { "articularis genu muscle": "Wikipedia:Articularis_genus_muscle|FMA:22424" @@ -27,9 +27,14 @@ }, "unresolvable": [ { - "label": "articularis genu muscle", - "reason": "has_muscle_insertion omitted: the muscle inserts onto the suprapatellar bursa / synovial membrane of the knee joint; suprapatellar bursa is not in UBERON, and a more specific UBERON ID for that insertion target could not be resolved.", - "suggestion": "Curator may add has_muscle_insertion UBERON:0002446 (patella) or a knee-joint synovial membrane term if appropriate, or leave unset." + "label": "articularis genu muscle (parent FMA:22424)", + "reason": "Source parent FMA:22424 is the articularis genus muscle itself (self-referential mapping in the ASCTB input). No UBERON equivalent exists for this term — it is the new term being created. Genus resolved to UBERON:0001630 (muscle organ) and part_of to UBERON:0000376 (hindlimb stylopod / thigh) by analogy with UBERON:0001379 (vastus lateralis).", + "suggestion": "Accept the leaf_template_rows mapping; no further FMA→UBERON parent lookup is needed." + }, + { + "label": "articularis genu muscle has_muscle_insertion", + "reason": "Anatomical insertion is on the suprapatellar bursa / synovial membrane of the knee joint. UBERON currently lacks specific terms for 'suprapatellar bursa' or 'synovial membrane of knee joint capsule'.", + "suggestion": "Omit has_muscle_insertion for now; curator may add later if/when those structures are added to UBERON." } ] } diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22472.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22472.json new file mode 100644 index 000000000..3a5c835f7 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22472.json @@ -0,0 +1,22 @@ +{ + "confirmed_matches": [ + { + "label": "tibalis anterior muscle", + "uberon_id": "UBERON:0001385", + "confidence": "high", + "uberon_definition": "A muscle that originates in the upper two-thirds of the lateral surface of the tibia and inserts into the medial cuneiform and first metatarsal bones of the foot. Its acts to invert the foot. It is situated on the lateral side of the tibia; it is thick and fleshy above, tendinous below.", + "wikipedia_summary": "The tibialis anterior muscle is a muscle of the anterior compartment of the leg that originates from the upper two-thirds of the lateral surface of the tibia and inserts into the medial cuneiform and base of the first metatarsal. It dorsiflexes and inverts the foot. Innervated by the deep fibular (peroneal) nerve.", + "note": "Source label 'tibalis anterior muscle' is a typo of 'tibialis anterior muscle', which is recorded as an EXACT synonym of UBERON:0001385 'tibialis anterior'. UBERON:0001385 carries FMA:22532 as xref; the input's parent FMA:22472 does not appear in UBERON and is likely a data error in the source row (the same FMA was assigned to both is_a and part_of, suggesting placeholder/self-reference). Term should be excluded from the template as already present in UBERON." + } + ], + "name_corrections": [ + { + "label": "tibalis anterior muscle", + "suggested": "tibialis anterior muscle", + "reason": "Typo: 'tibalis' should be 'tibialis'. The corrected form is the standard TA2 name and is already recorded as an EXACT synonym of UBERON:0001385." + } + ], + "xrefs": { + "tibalis anterior muscle": "Wikipedia:Tibialis_anterior_muscle|FMA:22532" + } +} diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22474.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22474.json new file mode 100644 index 000000000..f9a286576 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_22474.json @@ -0,0 +1,23 @@ +{ + "confirmed_matches": [ + { + "label": "tibalis posterior muscle", + "uberon_id": "UBERON:0001667", + "confidence": "high", + "uberon_definition": "The Tibialis posterior is the most central of all the leg muscles, and is located in the posterior compartment of the leg. It is the key stabilizing muscle of the lower leg.", + "wikipedia_summary": "The tibialis posterior muscle is the most central of all the leg muscles, located in the deep posterior compartment of the leg. It originates from the inner posterior border of the fibula and the posterior surface of the tibia (and interosseous membrane), and inserts into the navicular tuberosity and the medial cuneiform of the foot. It is innervated by the tibial nerve and is the key stabilising muscle of the lower leg, supporting the medial longitudinal arch of the foot.", + "note": "Source label 'tibalis posterior muscle' is a misspelling of 'tibialis posterior muscle' (already present as a synonym of UBERON:0001667). FMA:22474 in the input is actually the parent class 'Muscle of posterior compartment of leg', not this term; the correct FMA xref for tibialis posterior is FMA:51099 (already on UBERON:0001667)." + } + ], + "name_corrections": [ + { + "label": "tibalis posterior muscle", + "suggested": "tibialis posterior muscle", + "reason": "Spelling error — missing 'i'. Standard anatomical term is 'tibialis posterior muscle' (already a related synonym on UBERON:0001667). Term is a confirmed existing match so no new term is needed; record correction for the candidates/QC report." + } + ], + "resolved_parents": { + "_parent_group": "UBERON:0011139" + }, + "unresolvable": [] +} diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_323951.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_323951.json new file mode 100644 index 000000000..2dbb10765 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_323951.json @@ -0,0 +1,25 @@ +{ + "confirmed_matches": [ + { + "label": "left crus of lumbar part of respiratory diaphragm muscle", + "uberon_id": "UBERON:0014767", + "confidence": "high", + "uberon_definition": "A crus of diaphragm that is in_the_left_side_of a diaphragm.", + "wikipedia_summary": "The left crus of the diaphragm is a tendinous structure that arises from the anterolateral surfaces of the bodies and intervertebral discs of the upper two lumbar vertebrae. Together with the right crus it forms the lumbar (vertebral) part of the diaphragm and surrounds the aortic and esophageal hiatuses.", + "note": "UBERON:0014767 explicitly carries the synonym 'left crus of lumbar part of diaphragm' (EXACT, FMA:58287). The input label adds 'respiratory ... muscle' but refers to the same anatomical structure. FMA:323951 was not directly xref'd in UBERON but UBERON:0014767 carries FMA:58287 for the same structure." + } + ], + "xrefs": { + "left crus of lumbar part of respiratory diaphragm muscle": "FMA:58287|Wikipedia:Crus_of_diaphragm" + }, + "resolved_parents": { + "_parent_FMA:323951": "UBERON:0014765" + }, + "unresolvable": [ + { + "label": "_parent_FMA:323951", + "reason": "FMA:323951 (lumbar part of diaphragm) is not directly xref'd in UBERON. The closest UBERON concept is UBERON:0014765 'crus of diaphragm' (which is the lumbar/vertebral part of the diaphragm). Not needed here because the child term itself matches an existing UBERON term.", + "suggestion": "If a separate UBERON term for the lumbar part of the diaphragm is desired, it could be added with FMA:323951 as xref; otherwise treat UBERON:0014765 as functionally equivalent." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46583.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46583.json index 2871c01d5..6b0a69ad0 100644 --- a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46583.json +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46583.json @@ -2,17 +2,15 @@ "resolved_parents": { "_parent_FMA:46583": "UBERON:0008575" }, - "xrefs": { - "aryepiglottic part of oblique arytenoid muscle": "FMA:46602|Wikipedia:Aryepiglottic_muscle" - }, "confirmed_matches": [ { "label": "aryepiglottic part of oblique arytenoid muscle", "uberon_id": "UBERON:0011025", "confidence": "high", "uberon_definition": "The aryepiglotticus is a muscle of the larynx running in the aryepiglottic fold from the arytenoid cartilage to the epiglottis.", - "wikipedia_summary": "The aryepiglotticus muscle (aryepiglottic muscle) is a muscle of the larynx that runs within the aryepiglottic fold, from the arytenoid cartilage to the epiglottis. It is sometimes described as a separate muscle but is often considered the most superficial fibres of the oblique arytenoid muscle that are prolonged into the aryepiglottic fold. Together with the transverse arytenoid and thyroarytenoid muscles it acts as a sphincter to close the larynx during swallowing or coughing.", - "note": "UBERON:0011025 already carries the FMA:46602 xref and the exact synonym 'ary-epiglottic part of oblique arytenoid' [FMA:46602]. It is asserted as part_of UBERON:0008575 (oblique arytenoid), which is precisely the relationship the NTR requested. The proposed NTR label is a near-identical variant of the existing FMA-sourced synonym; this is a confirmed exact-structure match. The proposed parent FMA:46583 (oblique arytenoid muscle) maps to UBERON:0008575 (oblique arytenoid), confirmed via xref FMA:46583 on that UBERON term." + "wikipedia_summary": "The aryepiglotticus (aryepiglottic muscle) is a muscle of the larynx; it is often described as the aryepiglottic part of the oblique arytenoid muscle (pars aryepiglottica musculi arytenoidei obliqui, FMA:46602). It runs in the aryepiglottic fold from the apex of the arytenoid cartilage to the lateral margin of the epiglottis and helps close the laryngeal inlet during swallowing.", + "note": "UBERON:0011025 'aryepiglotticus muscle' already records the exact synonym 'ary-epiglottic part of oblique arytenoid' with xref FMA:46602, and is asserted part_of UBERON:0008575 (oblique arytenoid, FMA:46583). The source FMA parent FMA:46583 maps to UBERON:0008575. No new term required.", + "xrefs_on_matched_term": "FMA:46602|Wikipedia:Aryepiglottic_muscle|NCIT:C32146|SCTID:244818009" } ] } diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46588.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46588.json new file mode 100644 index 000000000..f3e67eba3 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46588.json @@ -0,0 +1,16 @@ +{ + "resolved_parents": { + "_parent_FMA:46588": "UBERON:0008576" + }, + "confirmed_matches": [ + { + "label": "thyroepiglottic part of thyroarytenoid muscle", + "uberon_id": "UBERON:0010927", + "confidence": "high", + "uberon_definition": "Fibers of the thyroarytenoid muscle that continue to the margin of the epiglottis; it closes the inlet to the larynx.", + "wikipedia_summary": "The thyroepiglottic muscle (pars thyroepiglottica musculi thyroarytenoidei) is a fasciculus of the thyroarytenoid muscle whose fibers prolong backward and upward to the lateral margin of the epiglottis; some of its fibers spread out on the anterior surface of the arytenoid cartilage. It depresses the epiglottis and helps close the laryngeal inlet during swallowing.", + "match_notes": "Source label 'thyroepiglottic part of thyroarytenoid muscle' matches UBERON:0010927 ('thyroepiglotticus muscle') exactly — UBERON synonyms include 'thyro-epiglottic part of thyro-arytenoid' (FMA:46594), 'thyroepiglottic muscle', 'pars thyroepiglottica musculus thyroarytenoidei'. UBERON xrefs FMA:46594 (the more specific TA2 ID for this sub-part). The source FMA:46588 cited in the input is the parent FMA term (thyroarytenoid muscle as a whole = UBERON:0008576), not the part itself.", + "xrefs": "FMA:46594|Wikipedia:Thyroepiglottic_muscle" + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46623.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46623.json new file mode 100644 index 000000000..22b08bf13 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_46623.json @@ -0,0 +1,18 @@ +{ + "confirmed_matches": [ + { + "label": "thyropharyngeal part of inferior pharyngeal constrictor muscle", + "uberon_id": "UBERON:0010936", + "confidence": "high", + "uberon_definition": "(no text def in UBERON; comment: 'muscle belly'). UBERON:0010936 'thyropharyngeus muscle' carries the exact synonyms 'thyropharyngeal part of inferior pharyngeal constrictor' and 'thyropharyngeal part of inferior constrictor pharyngeus muscle' (FMA:46658); is_a muscle organ + muscle belly; part_of UBERON:0001570 inferior pharyngeal constrictor; has_muscle_origin thyroid cartilage.", + "wikipedia_summary": "The thyropharyngeus is the upper, larger portion of the inferior pharyngeal constrictor muscle, originating from the oblique line of the thyroid cartilage and inserting into the pharyngeal raphe; together with the lower cricopharyngeus part it forms the inferior pharyngeal constrictor.", + "note": "Source parent FMA:46623 is the inferior pharyngeal constrictor as a whole (= UBERON:0001570). The NTR label is a thyropharyngeal subdivision/part of that muscle, which is already represented in UBERON as UBERON:0010936 (thyropharyngeus muscle) with the requested label present as an EXACT synonym (FMA:46658). Exclude from new-term template." + } + ], + "resolved_parents": { + "_parent_FMA:46623": "UBERON:0001570" + }, + "xrefs": { + "thyropharyngeal part of inferior pharyngeal constrictor muscle": "FMA:46658" + } +} diff --git a/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_5841.json b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_5841.json new file mode 100644 index 000000000..d03df68be --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/needs_mapping_fma_5841.json @@ -0,0 +1,18 @@ +{ + "confirmed_matches": [ + { + "label": "right crus of lumbar part of respiratory diaphragm muscle", + "uberon_id": "UBERON:0014766", + "confidence": "high", + "uberon_definition": "A crus of diaphragm that is in_the_right_side_of a diaphragm.", + "wikipedia_summary": "The right crus of the diaphragm is the larger and longer of the two crura, arising from the anterolateral surfaces of the bodies and intervertebral discs of the upper three or four lumbar vertebrae. It forms part of the lumbar portion of the diaphragm and surrounds the esophageal and aortic hiatuses, contributing to crural sphincter function at the gastro-esophageal junction.", + "note": "UBERON:0014766 lists 'right crus of lumbar part of diaphragm' as an EXACT synonym, with xref FMA:58286. The source label 'right crus of lumbar part of respiratory diaphragm muscle' is a verbose HRA/ASCTB rendering of the same structure. The source parent FMA:5841 (lumbar part of diaphragm) is the broader region; UBERON:0014766 is the appropriate existing UBERON equivalent for the right crus itself." + } + ], + "resolved_parents": { + "right crus of lumbar part of respiratory diaphragm muscle": "UBERON:0014765" + }, + "xrefs": { + "right crus of lumbar part of respiratory diaphragm muscle": "FMA:58286|Wikipedia:Crus_of_diaphragm" + } +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0000975.json b/bulk_ntr_workflow/outputs/definitions/uberon_0000975.json index dff80823b..9ee1f924c 100644 --- a/bulk_ntr_workflow/outputs/definitions/uberon_0000975.json +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0000975.json @@ -5,21 +5,18 @@ "uberon_id": "UBERON:0035831", "confidence": "high", "uberon_definition": "The domain of the diaphragm that is a thin domed sheet of muscle composed of a radial array of myofibers extending laterally from the ribs and medially to a central tendon.", - "wikipedia_summary": "The costal part of the diaphragm originates from the inner surfaces of the lower six ribs and their costal cartilages and inserts into the central tendon of the diaphragm. Its radial myofibers converge towards the central tendon and are responsible for the primary movement of the diaphragm during respiration.", - "uberon_label": "costal diaphragm", - "matched_via_synonym": "costal part of diaphragm (EXACT, FMA:58277)", - "fma_xref": "FMA:58277", - "note": "The requested label 'costal part of respiratory diaphragm muscle' is the TA2-style fuller name for the same structure. UBERON's term 'costal diaphragm' (UBERON:0035831) carries 'costal part of diaphragm' as an EXACT synonym with FMA:58277, and the diaphragm itself (UBERON:0001103) carries 'diaphragm muscle' as an EXACT synonym. Definitions describe identical structure (radial myofibers from ribs to central tendon)." + "wikipedia_summary": "The costal part of the diaphragm is the lateral muscular portion of the thoracic diaphragm that arises from the inner surfaces of the lower six ribs and their costal cartilages on each side, interdigitating with the transversus abdominis, and converging onto the central tendon. It contributes the majority of the diaphragm's contractile force during quiet inspiration.", + "match_evidence": "UBERON:0035831 has EXACT synonym 'costal part of diaphragm' (FMA:58277). The source label 'respiratory diaphragm muscle' resolves to UBERON:0001103 (diaphragm), which has 'diaphragm muscle' as an EXACT synonym. Therefore 'costal part of respiratory diaphragm muscle' = 'costal part of diaphragm' = UBERON:0035831. FMA xref also aligns (FMA:58277)." } ], - "resolved_parents": { - "costal part of respiratory diaphragm muscle": "UBERON:0001103" + "xrefs": { + "costal part of respiratory diaphragm muscle": "FMA:58277" }, "unresolvable": [ { - "label": "costal part of respiratory diaphragm muscle", - "reason": "Source-supplied parent UBERON:0000975 is 'sternum' (an endochondral skeletal element, is_a 'endochondral element'), which is the wrong anatomical domain for a part of the diaphragm muscle. The correct parent is UBERON:0001103 'diaphragm' (a skeletal muscle organ, with synonym 'diaphragm muscle').", - "suggestion": "Term already exists as UBERON:0035831 'costal diaphragm' (synonym: 'costal part of diaphragm', FMA:58277), part_of UBERON:0001103. Exclude from the template via confirmed_matches; no NTR needed. Curator should note the upstream HRA ASCT+B parent mapping error (UBERON:0000975 sternum) for feedback." + "label": "__parent_id__", + "reason": "Supplied parent UBERON:0000975 is 'sternum' — wrong anatomical domain for a part of the diaphragm. The correct parent for a costal-diaphragm subdivision is UBERON:0001103 (diaphragm). The existing UBERON term UBERON:0035831 (costal diaphragm) already has 'part_of UBERON:0001103'.", + "suggestion": "Use UBERON:0001103 (diaphragm) as the parent. No new term needed: confirmed match to UBERON:0035831 makes this term ineligible for the leaf template." } ] } diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0000979.json b/bulk_ntr_workflow/outputs/definitions/uberon_0000979.json new file mode 100644 index 000000000..47362c991 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0000979.json @@ -0,0 +1,40 @@ +{ + "definitions": { + "interspinales cervicalis muscle": "A muscle of the vertebral column consisting of short paired fascicles that span between the spinous processes of contiguous cervical vertebrae (typically C2 through T1), lying on either side of the interspinous ligament. It assists in extension of the cervical spine and contributes to segmental stabilisation and proprioception of the neck." + }, + "xrefs": { + "interspinales cervicalis muscle": "Wikipedia:Interspinales_muscles|FMA:32519" + }, + "def_xrefs_to_add": { + "interspinales cervicalis muscle": "Wikipedia:Interspinales_muscles" + }, + "leaf_template_rows": { + "interspinales cervicalis muscle": { + "is_a": "UBERON:0004518", + "part_of": "UBERON:0000974", + "has_muscle_origin": "UBERON:0001076", + "has_muscle_insertion": "UBERON:0001076", + "innervated_by": "UBERON:0006839" + } + }, + "resolved_relationships": { + "interspinales cervicalis muscle": "is_a" + }, + "resolved_parents": { + "interspinales cervicalis muscle": "UBERON:0004518" + }, + "name_corrections": [ + { + "label": "interspinales cervicalis muscle", + "suggested": "interspinales cervicis muscle", + "reason": "TA2 / standard anatomical nomenclature uses 'musculi interspinales cervicis' (genitive 'cervicis', not 'cervicalis'). 'Cervicalis' is grammatically the adjective form, but the established TA term is 'interspinales cervicis'. Keep 'interspinales cervicalis muscle' as a related synonym." + } + ], + "unresolvable": [ + { + "label": "interspinales cervicalis muscle", + "reason": "Source-supplied parent_id UBERON:0000979 resolves to 'tibia', which is clearly an upstream data error (interspinales cervicis is a deep neck muscle, not a leg bone). Used anatomical knowledge and similar UBERON deep neck muscles (rectus capitis posterior major UBERON:0008454, longus colli UBERON:0001121, semispinalis cervicis precedent) to determine the appropriate genus and part_of.", + "suggestion": "Curator should ignore the source UBERON:0000979 parent assignment. The chosen genus 'muscle of vertebral column' (UBERON:0004518) is consistent with other named vertebral-column muscles in UBERON; part_of 'neck' (UBERON:0000974) follows the precedent of rectus capitis posterior major. has_muscle_origin and has_muscle_insertion are both set to UBERON:0001076 (neural spine / spinous process of vertebra) because the muscle spans between adjacent cervical spinous processes; UBERON does not currently have a more specific 'spinous process of cervical vertebra' class. innervated_by is the dorsal ramus of spinal nerve (UBERON:0006839); a more specific 'medial branch of dorsal ramus of cervical spinal nerve' class does not exist in UBERON." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0001092.json b/bulk_ntr_workflow/outputs/definitions/uberon_0001092.json new file mode 100644 index 000000000..5bd2bdebb --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0001092.json @@ -0,0 +1,33 @@ +{ + "definitions": { + "hamstring portion of adductor magnus muscle": "A muscle head that originates from the ischial tuberosity and descends almost vertically through the posterior compartment of the thigh to insert by a rounded tendon onto the adductor tubercle of the medial femoral condyle. It is the ischiocondylar division of the adductor magnus, is innervated by the tibial division of the sciatic nerve, and acts to extend the hip joint." + }, + "xrefs": { + "hamstring portion of adductor magnus muscle": "Wikipedia:Adductor_magnus_muscle" + }, + "def_xrefs_to_add": { + "hamstring portion of adductor magnus muscle": "PMID:23813615" + }, + "leaf_template_rows": { + "hamstring portion of adductor magnus muscle": { + "is_a": "UBERON:0011906", + "part_of": "UBERON:0000370", + "has_muscle_origin": "UBERON:0034983", + "has_muscle_insertion": "UBERON:0000981", + "innervated_by": "UBERON:0001323" + } + }, + "resolved_relationships": { + "hamstring portion of adductor magnus muscle": "part_of" + }, + "resolved_parents": { + "hamstring portion of adductor magnus muscle": "UBERON:0000370" + }, + "unresolvable": [ + { + "label": "hamstring portion of adductor magnus muscle", + "reason": "Source parent UBERON:0001092 (vertebral bone 1 / atlas vertebra) is anatomically incorrect for a thigh muscle subdivision. Refined parent is UBERON:0000370 (adductor magnus), with the term modelled as a muscle head (UBERON:0011906) part_of adductor magnus.", + "suggestion": "Use UBERON:0000370 as the part_of parent. UBERON:0000370's own definition explicitly describes this 'hamstring portion' as the part arising from the ischial tuberosity." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0001194.json b/bulk_ntr_workflow/outputs/definitions/uberon_0001194.json new file mode 100644 index 000000000..61eb17c0b --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0001194.json @@ -0,0 +1,43 @@ +{ + "definitions": { + "inferior longitudinal lingual muscle": "An intrinsic muscle of the tongue that consists of a narrow band of longitudinal fibers running along the inferior surface of the tongue between the genioglossus and hyoglossus muscles, extending from the root to the apex of the tongue, and innervated by the hypoglossal nerve." + }, + "wikipedia_images": { + "inferior longitudinal lingual muscle": "https://upload.wikimedia.org/wikipedia/commons/3/30/Musculuslongitudinalissuperiorlinguae.png" + }, + "xrefs": { + "inferior longitudinal lingual muscle": "Wikipedia:Inferior_longitudinal_muscle_of_tongue|FMA:46694" + }, + "def_xrefs_to_add": { + "inferior longitudinal lingual muscle": "PMID:30855883" + }, + "leaf_template_rows": { + "inferior longitudinal lingual muscle": { + "is_a": "UBERON:0001576", + "part_of": "UBERON:0001723", + "has_muscle_origin": "UBERON:0001685", + "has_muscle_insertion": "UBERON:0001723", + "innervated_by": "UBERON:0001650" + } + }, + "resolved_relationships": { + "inferior longitudinal lingual muscle": "is_a" + }, + "resolved_parents": { + "inferior longitudinal lingual muscle": "UBERON:0001576" + }, + "name_corrections": [ + { + "label": "inferior longitudinal lingual muscle", + "suggested": "inferior longitudinal muscle of tongue", + "reason": "UBERON convention (see UBERON:0008582 'superior longitudinal muscle of tongue', UBERON:0008583 'transverse muscle of tongue', UBERON:0008584 'vertical muscle of tongue') uses 'X muscle of tongue' rather than 'X lingual muscle'. Keep source name as EXACT synonym." + } + ], + "unresolvable": [ + { + "label": "inferior longitudinal lingual muscle", + "reason": "Input parent_id UBERON:0001194 resolves to 'splenic artery' — clearly wrong for this term. Correct parent assigned from anatomical context: UBERON:0001576 'intrinsic muscle of tongue' (genus), mirroring sibling intrinsic tongue muscles (UBERON:0008582 superior longitudinal, UBERON:0008583 transverse, UBERON:0008584 vertical).", + "suggestion": "Verify upstream parent ID assignment; the source row likely intended UBERON:0001576 (intrinsic muscle of tongue) or UBERON:0000378 (tongue muscle)." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0001272.json b/bulk_ntr_workflow/outputs/definitions/uberon_0001272.json new file mode 100644 index 000000000..886dc8830 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0001272.json @@ -0,0 +1,39 @@ +{ + "confirmed_matches": [ + { + "label": "iliocostalis cervicalis muscle", + "uberon_id": "UBERON:0008546", + "confidence": "high", + "uberon_definition": "The iliocostalis cervicis (cervicalis ascendens) arises from the angles of the third, fourth, fifth, and sixth ribs, and is inserted into the posterior tubercles of the transverse processes of the fourth, fifth, and sixth cervical vertebrae.", + "wikipedia_summary": "Iliocostalis cervicis (cervicalis ascendens) is the cervical division of the iliocostalis component of the erector spinae; arises from the angles of the 3rd-6th ribs and inserts on the posterior tubercles of the transverse processes of C4-C6.", + "note": "Source label 'iliocostalis cervicalis muscle' is a spelling variant of the standard TA2 form 'iliocostalis cervicis muscle' (UBERON:0008546, FMA:22704). Same anatomical structure. Curator should consider adding 'iliocostalis cervicalis muscle' as a RELATED synonym." + }, + { + "label": "pteryopharyngeal part of superior pharyngeal constrictor muscle", + "uberon_id": "UBERON:0010956", + "confidence": "high", + "uberon_definition": "Pterygopharyngeal part of superior pharyngeal constrictor (UBERON:0010956); FMA:46638. The pterygopharyngeal part (pars pterygopharyngea) is a subdivision of the superior pharyngeal constrictor muscle arising from the pterygoid hamulus.", + "wikipedia_summary": "The superior pharyngeal constrictor has four named parts: pterygopharyngeus, buccopharyngeus, mylopharyngeus, and glossopharyngeus; the pterygopharyngeal part originates from the pterygoid hamulus of the medial pterygoid plate.", + "note": "Source label 'pteryopharyngeal' is a typographical variant (missing 'g') of the standard TA2/FMA form 'pterygopharyngeal' (UBERON:0010956, FMA:46638). Same anatomical structure. Curator should consider adding the source spelling as a RELATED synonym." + } + ], + "xrefs": { + "iliocostalis cervicalis muscle": "FMA:22704|Wikipedia:Iliocostalis#Iliocostalis_cervicis", + "pteryopharyngeal part of superior pharyngeal constrictor muscle": "FMA:46638" + }, + "name_corrections": [ + { + "label": "iliocostalis cervicalis muscle", + "suggested": "iliocostalis cervicis muscle", + "reason": "Standard TA2 form uses Latin genitive 'cervicis' (of the neck), not adjectival 'cervicalis'. UBERON:0008546 uses 'iliocostalis cervicis muscle'. Source spelling could be retained as RELATED synonym." + }, + { + "label": "pteryopharyngeal part of superior pharyngeal constrictor muscle", + "suggested": "pterygopharyngeal part of superior pharyngeal constrictor muscle", + "reason": "Source spelling 'pteryopharyngeal' is missing the 'g' from the Greek root 'pteryg-' (wing, referring to the pterygoid process). Standard TA2/FMA/UBERON form is 'pterygopharyngeal' (UBERON:0010956, FMA:46638). Source spelling could be retained as RELATED synonym." + } + ], + "resolved_parents": { + "_note": "Source parent_id UBERON:0001272 (innominate bone) is an artifact and is unrelated to either muscle term in this group. Both terms are confirmed matches to existing UBERON terms (UBERON:0008546 and UBERON:0010956) and therefore excluded from the template; no new parent assignment is needed." + } +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0001537.json b/bulk_ntr_workflow/outputs/definitions/uberon_0001537.json new file mode 100644 index 000000000..c969c4e28 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0001537.json @@ -0,0 +1,38 @@ +{ + "definitions": { + "lateral compartment of leg muscle": "A skeletal muscle organ that is part of the lateral (fibular) fascial compartment of the leg, comprising the fibularis longus and fibularis brevis muscles, both arising from the lateral surface of the fibula and innervated by the superficial fibular nerve, acting to evert and weakly plantarflex the foot." + }, + "xrefs": { + "lateral compartment of leg muscle": "Wikipedia:Lateral_compartment_of_leg" + }, + "def_xrefs_to_add": { + "lateral compartment of leg muscle": "PMID:30137811" + }, + "leaf_template_rows": { + "lateral compartment of leg muscle": { + "is_a": "UBERON:0014892", + "has_muscle_origin": "UBERON:0001446", + "innervated_by": "UBERON:0035526" + } + }, + "resolved_relationships": { + "lateral compartment of leg muscle": "is_a" + }, + "resolved_parents": { + "lateral compartment of leg muscle": "UBERON:0014892" + }, + "name_corrections": [ + { + "label": "lateral compartmet of leg muscle", + "suggested": "lateral compartment of leg muscle", + "reason": "Typo in source label: 'compartmet' -> 'compartment'. Keep source name as related synonym." + } + ], + "unresolvable": [ + { + "label": "lateral compartment of leg muscle", + "reason": "Source-supplied parent UBERON:0001537 refers to 'anterior tibial artery', not an anatomical region containing leg muscles — clearly a wrong mapping in the input. No existing UBERON class for 'lateral compartment of leg' (the fascial compartment) was found via awk over uberon-edit.obo, so no part_of target could be populated. Closest precedent term is UBERON:0002463 'muscle of posterior compartment of hindlimb stylopod' which uses is_a UBERON:0014892 (skeletal muscle organ, vertebrate) plus muscle-overlay relations; this term follows that pattern. Conceptually this is a collective/group class (fibularis longus + fibularis brevis); curator may wish to (a) reroute to the groups template and/or (b) first add a new UBERON term for 'lateral compartment of leg' (subdivision of leg) to serve as a proper part_of target.", + "suggestion": "Curator: confirm name correction; consider creating UBERON term for 'lateral compartment of leg' (fascial compartment) before finalising, then add relationship: part_of . Alternatively, reclassify as group term with genus UBERON:0014892 and location set to the new compartment term." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0001546.json b/bulk_ntr_workflow/outputs/definitions/uberon_0001546.json new file mode 100644 index 000000000..cc396e4fc --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0001546.json @@ -0,0 +1,30 @@ +{ + "definitions": { + "lateral posterior cervical intertransversarii muscle": "A muscle organ of the neck that arises from and inserts onto the posterior tubercles of the transverse processes of adjacent cervical vertebrae, lying lateral to the medial posterior cervical intertransversarii; together with its segmental fellows it laterally flexes the cervical vertebral column and is innervated by the ventral rami of the cervical spinal nerves." + }, + "xrefs": { + "lateral posterior cervical intertransversarii muscle": "Wikipedia:Intertransversarii" + }, + "leaf_template_rows": { + "lateral posterior cervical intertransversarii muscle": { + "is_a": "UBERON:0001630", + "part_of": "UBERON:0000974", + "has_muscle_origin": "UBERON:0018143", + "has_muscle_insertion": "UBERON:0018143", + "innervated_by": "UBERON:0006838" + } + }, + "resolved_relationships": { + "lateral posterior cervical intertransversarii muscle": "is_a" + }, + "resolved_parents": { + "lateral posterior cervical intertransversarii muscle": "UBERON:0001630" + }, + "unresolvable": [ + { + "label": "lateral posterior cervical intertransversarii muscle", + "reason": "Source parent_id UBERON:0001546 resolves to 'posterior tibial vein', which is anatomically incorrect for a cervical paraspinal muscle. No specific UBERON term currently exists for this muscle; closest existing classes are UBERON:0001630 (muscle organ) as genus and UBERON:0004465 (musculature of neck) as collective. Existing 'm. intertransversarius capitis' classes (UBERON:3010664, UBERON:3010667) are amphibian-sourced and not equivalent.", + "suggestion": "Use UBERON:0001630 (muscle organ) as is_a and UBERON:0000974 (neck) as part_of, with has_muscle_origin/insertion = UBERON:0018143 (transverse process of cervical vertebra) and innervated_by = UBERON:0006838 (ventral ramus of spinal nerve). No real PMID located; rely on existing def_xref (FIPAT TA2 + ISBN:9780323393225 Drake Gray's Anatomy + ASCTB-TEMP placeholder); curator may wish to add a primary anatomical reference such as Standring Gray's Anatomy." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0001572.json b/bulk_ntr_workflow/outputs/definitions/uberon_0001572.json index 2295003bb..febbb6b8d 100644 --- a/bulk_ntr_workflow/outputs/definitions/uberon_0001572.json +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0001572.json @@ -5,24 +5,20 @@ "uberon_id": "UBERON:0008428", "confidence": "high", "uberon_definition": "Main, posterior part of hyoglossus muscle (vs. chondroglossus) arising from the greater horn of the hyoid bone.", - "wikipedia_summary": "The ceratoglossus is the main posterior portion of the hyoglossus muscle, arising from the greater horn (cornu) of the hyoid bone and inserting into the side of the tongue. It is described in standard anatomy references as the principal component of the hyoglossus, distinguished from the chondroglossus which arises from the lesser horn.", - "uberon_label": "ceratoglossus", - "uberon_synonyms": ["ceratoglossus muscle", "musculus ceratoglossus"], - "uberon_xrefs": ["FMA:46720"], - "uberon_relationship": "part_of UBERON:0001572 (hyoglossus muscle)", - "note": "Existing UBERON term ceratoglossus (UBERON:0008428) is part_of hyoglossus muscle (UBERON:0001572) with FMA:46720 xref, exactly matching the source term 'ceratoglossus of hyoglossus muscle'. Source label is effectively a verbose synonym of the existing UBERON term; curator may consider adding the source label as a related synonym." + "wikipedia_summary": "Ceratoglossus is the main, posterior portion of the hyoglossus muscle, arising from the greater horn (cornu) of the hyoid bone. Source UBERON term carries synonyms 'ceratoglossus muscle' and 'musculus ceratoglossus', xref FMA:46720, and relationship part_of UBERON:0001572 (hyoglossus muscle) — the exact parent supplied in the input.", + "note": "Source label 'ceratoglossus of hyoglossus muscle' is a longer descriptive variant of the UBERON primary label 'ceratoglossus' (synonym 'ceratoglossus muscle'). Same structure: a named subdivision of the hyoglossus muscle. Excluded from new-term template; the source label could optionally be added as a RELATED synonym to UBERON:0008428." }, { "label": "chondroglossus of hyoglossus muscle", "uberon_id": "UBERON:0011535", "confidence": "high", "uberon_definition": "The Chondroglossus is sometimes described as a part of the Hyoglossus, but is separated from it by fibers of the Genioglossus, which pass to the side of the pharynx. It is about 2 cm. long, and arises from the medial side and base of the lesser cornu and contiguous portion of the body of the hyoid bone, and passes directly upward to blend with the intrinsic muscular fibers of the tongue, between the Hyoglossus and Genioglossus.", - "wikipedia_summary": "The chondroglossus is a small (~2 cm) tongue muscle that arises from the medial side and base of the lesser cornu of the hyoid bone and ascends to blend with the intrinsic muscular fibres of the tongue. It is sometimes described as a part of the hyoglossus but is separated from it by fibres of the genioglossus.", - "uberon_label": "chondroglossus muscle", - "uberon_synonyms": ["chondroglossal", "chondroglossal muscle", "chondroglossus", "musculus chondroglossus"], - "uberon_xrefs": ["FMA:46700", "SCTID:244787000", "Wikipedia:Chondroglossus"], - "uberon_relationship": "part_of UBERON:0001572 (hyoglossus muscle)", - "note": "Existing UBERON term chondroglossus muscle (UBERON:0011535) is part_of hyoglossus muscle (UBERON:0001572) with FMA:46700 xref, exactly matching the source term 'chondroglossus of hyoglossus muscle'. Source label is effectively a verbose synonym; curator may consider adding the source label as a related synonym." + "wikipedia_summary": "Chondroglossus is a small (~2 cm) muscle slip, sometimes considered a part of the hyoglossus, arising from the lesser cornu and body of the hyoid bone and blending with the intrinsic muscular fibers of the tongue. Source UBERON term carries xref FMA:46700, Wikipedia:Chondroglossus, and relationship part_of UBERON:0001572 (hyoglossus muscle) — the exact parent supplied in the input.", + "note": "Source label 'chondroglossus of hyoglossus muscle' is a descriptive variant of the UBERON primary label 'chondroglossus muscle'. Same structure: a subdivision of (or muscle slip associated with) the hyoglossus. Excluded from new-term template; the source label could optionally be added as a RELATED synonym to UBERON:0011535." } - ] + ], + "xrefs": { + "ceratoglossus of hyoglossus muscle": "FMA:46720", + "chondroglossus of hyoglossus muscle": "FMA:46700|Wikipedia:Chondroglossus" + } } diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0001576.json b/bulk_ntr_workflow/outputs/definitions/uberon_0001576.json new file mode 100644 index 000000000..691461105 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0001576.json @@ -0,0 +1,48 @@ +{ + "confirmed_matches": [ + { + "label": "superior longitudinal lingual muscle", + "uberon_id": "UBERON:0008582", + "confidence": "high", + "uberon_definition": "A muscle of the tongue that consists of a thin stratum of oblique and longitudinal fibers immediately underlying the mucous membrane on the dorsum of the tongue.", + "wikipedia_summary": "The superior longitudinal muscle of the tongue (longitudinalis linguae superior / superior lingualis) is one of the four intrinsic tongue muscles. It is a thin stratum of oblique and longitudinal fibres directly beneath the mucous membrane on the dorsum of the tongue, innervated by the hypoglossal nerve.", + "note": "Input term is the same structure under the synonymous label 'superior longitudinal lingual muscle' / 'superior lingualis'. UBERON:0008582 is_a UBERON:0001576 (intrinsic muscle of tongue) — the parent matches the input group exactly. FMA:46693 matches the typical FMA assignment for this structure." + }, + { + "label": "transverse muscle", + "uberon_id": "UBERON:0008583", + "confidence": "high", + "uberon_definition": "A muscle of the tongue that consists of fibers which arise from the median fibrous septum and pass lateralward to be inserted into the submucous fibrous tissue at the sides of the tongue.", + "wikipedia_summary": "The transverse muscle of the tongue (transversus linguae) is one of the four intrinsic tongue muscles. Its fibres arise from the median fibrous (lingual) septum and pass laterally to insert into submucous fibrous tissue at the sides of the tongue. Innervated by the hypoglossal nerve.", + "note": "Input term 'transverse muscle' under parent UBERON:0001576 (intrinsic muscle of tongue) unambiguously refers to the transverse muscle of tongue. UBERON:0008583 already carries 'transverse muscle' as a RELATED synonym (from Wikipedia) and 'intrinsic tongue muscle transverse component' (MA:0002328) as an EXACT synonym. FMA:46695." + }, + { + "label": "vertical muscle", + "uberon_id": "UBERON:0008584", + "confidence": "high", + "uberon_definition": "A muscle of the tongue that is found only at the borders of the forepart of the tongue. Its fibers extend from the upper to the under surface of the organ.", + "wikipedia_summary": "The vertical muscle of the tongue (verticalis linguae) is one of the four intrinsic tongue muscles. It is found at the borders of the forepart of the tongue, with fibres extending from the upper to the under surface. Innervated by the hypoglossal nerve.", + "note": "Input term 'vertical muscle' under parent UBERON:0001576 (intrinsic muscle of tongue) unambiguously refers to the vertical muscle of tongue. UBERON:0008584 already carries 'vertical muscle' as a RELATED synonym and 'intrinsic tongue muscle vertical component' (MA:0002329) as an EXACT synonym. FMA:46696." + } + ], + "resolved_parents": { + "_parent_group": "UBERON:0001576 ! intrinsic muscle of tongue (confirmed via OBO lookup; label 'intrinsic muscle of tongue')." + }, + "name_corrections": [ + { + "label": "transverse muscle", + "suggested": "transverse muscle of tongue", + "reason": "Source label 'transverse muscle' is ambiguous outside the lingual context. UBERON's canonical label is 'transverse muscle of tongue' (UBERON:0008583). Already carries 'transverse muscle' as a RELATED synonym, so no synonym addition is needed." + }, + { + "label": "vertical muscle", + "suggested": "vertical muscle of tongue", + "reason": "Source label 'vertical muscle' is ambiguous outside the lingual context. UBERON's canonical label is 'vertical muscle of tongue' (UBERON:0008584). Already carries 'vertical muscle' as a RELATED synonym, so no synonym addition is needed." + }, + { + "label": "superior longitudinal lingual muscle", + "suggested": "superior longitudinal muscle of tongue", + "reason": "Source label uses 'lingual muscle' word order; UBERON's canonical label is 'superior longitudinal muscle of tongue' (UBERON:0008582). Consider adding 'superior longitudinal lingual muscle' as an EXACT synonym to aid matching from HRA/ASCTB sources." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0001624.json b/bulk_ntr_workflow/outputs/definitions/uberon_0001624.json new file mode 100644 index 000000000..086d3cc9f --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0001624.json @@ -0,0 +1,22 @@ +{ + "confirmed_matches": [ + { + "label": "opponens digiti minimi muscle", + "uberon_id": "UBERON:0036176", + "confidence": "high", + "uberon_definition": "The opponens minimi digiti (opponens digiti quinti in older texts) is a muscle in the hand. It is of a triangular form, and placed immediately beneath the palmaris brevis, abductor minimi digiti, and flexor brevis minimi digiti. It arises from the convexity of the hamulus of the hamate bone, and contiguous portion of the transverse carpal ligament; it is inserted into the whole length of the metacarpal bone of the little finger, along its ulnar margin.", + "wikipedia_summary": "The opponens digiti minimi is a hypothenar muscle of the hand which originates from the hook of hamate and the flexor retinaculum, inserts along the medial border of the fifth metacarpal, and acts to rotate the little finger toward the thumb in opposition. Innervated by the deep branch of the ulnar nerve (C8, T1).", + "note": "The label 'opponens digiti minimi muscle' is the standard anatomical name for the hand muscle (TA2 / Wikipedia). UBERON:0036176 carries 'opponens digiti minimi' and 'opponens digiti minimi (hand)' as synonyms, with xrefs FMA:37384, Wikipedia:Opponens_digiti_minimi_muscle. The source parent UBERON:0001624 (anterior cerebral artery) is clearly an upstream error and unrelated — confirmed match relies on label/synonym evidence, not the supplied parent." + } + ], + "xrefs": { + "opponens digiti minimi muscle": "FMA:37384" + }, + "unresolvable": [ + { + "label": "opponens digiti minimi muscle", + "reason": "Source-supplied parent_id UBERON:0001624 resolves to 'anterior cerebral artery', which is anatomically unrelated to a hand muscle. This appears to be an upstream parent-mapping error in the HRA ASCTB input.", + "suggestion": "Curator should report/correct the source parent assignment. The term itself already exists as UBERON:0036176 and is excluded from the new-term template." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0001677.json b/bulk_ntr_workflow/outputs/definitions/uberon_0001677.json new file mode 100644 index 000000000..ec3979755 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0001677.json @@ -0,0 +1,18 @@ +{ + "confirmed_matches": [ + { + "label": "levator costarum muscle", + "uberon_id": "UBERON:8410070", + "confidence": "high", + "uberon_definition": "A chest muscle with a role in forceful inspiration. In human, there are twelve levatores costarum on either side of the chest; they are small tendinous and fleshy bundles arising from the ends of the transverse processes of the seventh cervical and upper eleven thoracic vertebrae. They pass obliquely downward and laterally, like the fibers of the intercostales externi, and each is inserted into the outer surface of the rib immediately below the vertebra from which it takes origin, between the tubercle and the angle (levatores costarum breves). Each of the four lower muscles divides into two fasciculi, one of which is inserted as above described; the other passes down to the second rib below its origin (levatores costarum longi).", + "wikipedia_summary": "Levatores costarum muscles are twelve paired small tendinous/fleshy bundles arising from transverse processes of C7-T11 and inserting on the rib below; they elevate the ribs and assist in forceful inspiration. Innervated by dorsal rami of C8-T11. Origin: transverse processes of vertebrae; insertion: ribs." + } + ], + "unresolvable": [ + { + "label": "source parent UBERON:0001677", + "reason": "Source-assigned parent UBERON:0001677 is 'sphenoid bone', which is anatomically incorrect for levator costarum muscle (a chest/back muscle). The correct parent in UBERON is UBERON:0002426 'chest muscle' (already used by the existing match UBERON:8410070).", + "suggestion": "Curator should review the upstream ASCTB mapping that produced UBERON:0001677 as a parent here; the existing UBERON:8410070 (levator costarum) supersedes this NTR." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0001876.json b/bulk_ntr_workflow/outputs/definitions/uberon_0001876.json new file mode 100644 index 000000000..7ff2c12b2 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0001876.json @@ -0,0 +1,22 @@ +{ + "confirmed_matches": [ + { + "label": "external anal sphincter muscle", + "uberon_id": "UBERON:0001367", + "confidence": "high", + "uberon_definition": "The Sphincter ani externus (external anal sphincter) is a flat plane of muscular fibers, elliptical in shape and intimately adherent to the integument surrounding the margin of the anus.", + "wikipedia_summary": "The external anal sphincter (or sphincter ani externus) is a flat plane of skeletal muscle fibers, elliptical in shape and intimately adherent to the skin surrounding the margin of the anus. It is a voluntary muscle that surrounds the anus and keeps it closed, opening during defecation. It is innervated by the inferior rectal branch of the pudendal nerve (S2-S4).", + "note": "Source label 'external anal sphincter muscle' is the same structure as UBERON:0001367 'external anal sphincter' (synonyms include 'musculus sphincter ani externus'). UBERON:0001367 has FMA:21930, MA:0001531, Wikipedia:Sphincter_ani_externus_muscle. Source ASCTB-TEMP IRI should be added as a synonym/xref on UBERON:0001367 rather than a new term being created. Source parent UBERON:0001876 (amygdala) is clearly a spurious/erroneous mapping in the input — the intended parent is a sphincter muscle / anal region skeletal muscle class, which UBERON:0001367 already has (is_a UBERON:0004590 sphincter muscle; is_a UBERON:0004832 anal region skeletal muscle; part_of UBERON:0006867 anal part of perineum; surrounds UBERON:0001245 anus)." + } + ], + "xrefs": { + "external anal sphincter muscle": "Wikipedia:Sphincter_ani_externus_muscle|FMA:21930" + }, + "unresolvable": [ + { + "label": "external anal sphincter muscle", + "reason": "Source parent_id UBERON:0001876 resolves to 'amygdala' — a brain region, evidently a data-entry error in the ASCTB-TEMP input. Not an issue for output (term is a confirmed_match excluded from template), but flagged for curator awareness.", + "suggestion": "Curator should add ASCTB-TEMP source IRI (https://purl.org/ccf/ASCTB-TEMP_external-anal-sphincter-muscle) and 'external anal sphincter muscle' as a synonym to UBERON:0001367. No new term needed." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0002000.json b/bulk_ntr_workflow/outputs/definitions/uberon_0002000.json new file mode 100644 index 000000000..4fc9fbbd2 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0002000.json @@ -0,0 +1,20 @@ +{ + "confirmed_matches": [ + { + "label": "tensor fascia latae muscle", + "uberon_id": "UBERON:0001376", + "confidence": "high", + "uberon_definition": "The tensor fasciae latae or tensor fasciæ latæ is a muscle of the thigh.", + "wikipedia_summary": "The tensor fasciae latae is a muscle of the thigh. It arises from the anterior part of the outer lip of the iliac crest, the anterior superior iliac spine, and the deep fascia. It inserts via the iliotibial tract onto the lateral condyle of the tibia. It is innervated by the superior gluteal nerve.", + "note": "Source label 'tensor fascia latae muscle' is a spelling variant (singular fascia) of the standard 'tensor fasciae latae muscle' (UBERON:0001376). The existing UBERON term already includes 'tensor fasciae lata' and 'tensor fasciae lata muscle' as EXACT synonyms. FMA:22423 matches in both. Confirmed match — exclude from template.", + "xrefs": "FMA:22423|Wikipedia:Tensor_fasciae_latae_muscle" + } + ], + "name_corrections": [ + { + "label": "tensor fascia latae muscle", + "suggested": "tensor fasciae latae muscle", + "reason": "Standard anatomical Latin uses the genitive 'fasciae' (of the fascia), not nominative 'fascia'. UBERON:0001376 already carries 'tensor fasciae lata muscle' as an EXACT synonym; the source variant 'tensor fascia latae muscle' could be added as an additional synonym if not already covered." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0002377.json b/bulk_ntr_workflow/outputs/definitions/uberon_0002377.json new file mode 100644 index 000000000..b93695522 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0002377.json @@ -0,0 +1,19 @@ +{ + "confirmed_matches": [ + { + "label": "longus capitus muscle", + "uberon_id": "UBERON:0001563", + "confidence": "high", + "uberon_definition": "A muscle that arises by four tendinous slips from the transverse processes of the third, fourth, fifth, and sixth cervical vertebrae and inserts into the inferior surface of the basilar part of the occipital bone.", + "wikipedia_summary": "The longus capitis muscle (rectus capitis anticus major) arises by four tendinous slips from the anterior tubercles of the transverse processes of C3-C6 cervical vertebrae and inserts on the inferior surface of the basilar part of the occipital bone; it flexes the head at the atlanto-occipital joint and is innervated by branches of the cervical plexus (C1-C3).", + "note": "Source label 'longus capitus muscle' is a misspelling of 'longus capitis muscle'. UBERON:0001563 already lists 'longus capitus muscle' as a RELATED synonym (xref Wikipedia:Longus_capitis_muscle), confirming the match. Existing UBERON term already has has_muscle_origin (UBERON:0001077 transverse process of vertebra), has_muscle_insertion (UBERON:0001692 basioccipital bone), innervated_by (UBERON:0000962 nerve of cervical vertebra), depiction image, and FMA:46308 xref. No new term needed." + } + ], + "name_corrections": [ + { + "label": "longus capitus muscle", + "suggested": "longus capitis muscle", + "reason": "'capitus' is a misspelling of the Latin genitive 'capitis' (of the head). Standard anatomical term is 'longus capitis muscle' (TA2). Already present in UBERON as UBERON:0001563 with the misspelled form already captured as a RELATED synonym." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0002378.json b/bulk_ntr_workflow/outputs/definitions/uberon_0002378.json new file mode 100644 index 000000000..972c04672 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0002378.json @@ -0,0 +1,13 @@ +{ + "confirmed_matches": [ + { + "label": "spermatic cord muscle", + "uberon_id": "UBERON:0008488", + "confidence": "high", + "uberon_definition": "A thin layer of skeletal muscle that envelops the spermatic cord and testis of most male mammals in a series of loops; it is a continuation of the obliquus internus, arising from the inguinal ligament and inserting into the crest of the pubis and into the sheath of the rectus abdominis; it is innervated by the genital branch of the genitofemoral nerve and functions to draw the testis up toward the superficial inguinal ring in response to cold or to stimulation of the nerve.", + "wikipedia_summary": "The cremaster muscle is a paired structure made of thin layers of striated and smooth muscle that covers the testes and the spermatic cord in human males. It is continuous with the internal oblique muscle and originates from the inguinal ligament; the cremaster muscle envelops the spermatic cord and testis. Its primary function is to raise and lower the scrotum to regulate the temperature of the testes.", + "note": "The cremaster muscle is the muscle of the spermatic cord — its defining feature is enveloping the spermatic cord and testis. FMA:21531 is mapped to UBERON:0008488. 'spermatic cord muscle' is an alternative descriptive label for this same structure.", + "fma_xref": "FMA:21531" + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0002379.json b/bulk_ntr_workflow/outputs/definitions/uberon_0002379.json new file mode 100644 index 000000000..af979e74e --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0002379.json @@ -0,0 +1,12 @@ +{ + "confirmed_matches": [ + { + "label": "sphincter urethrae muscle", + "uberon_id": "UBERON:0004917", + "confidence": "high", + "uberon_definition": "A sphincter muscle surrounding the urethra.", + "wikipedia_summary": "The urethral sphincters are two muscles used to control the exit of urine from the urinary bladder through the urethra. The two muscles are the internal urethral sphincter and the external urethral sphincter. Latin name 'sphincter urethrae' refers to this structure.", + "note": "UBERON:0004917 'urethral sphincter' has 'sphincter urethrae' and 'urethral sphincter muscle' listed as EXACT synonyms. The source term 'sphincter urethrae muscle' is a direct synonym variant of this existing term. Parent UBERON:0002379 'perineal muscle' (muscle organ part_of perineum) is consistent with the urethral sphincter, which lies within the perineum (urogenital triangle). xref MA:0002650, EMAPA:37789, SCTID:277855007." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json b/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json index 6279c09b3..95ff9da9f 100644 --- a/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0002381.json @@ -1,17 +1,38 @@ { "definitions": { - "clavicular head of pectoralis major muscle": "A muscle head that is part of the pectoralis major muscle, originating from the anterior surface of the medial half of the clavicle. Its fibres pass obliquely downward and laterally to converge with those of the sternocostal head, contributing the anterior lamina of the broad flat tendon that inserts onto the lateral lip of the intertubercular groove of the humerus, and is innervated by the lateral pectoral nerve (C5-C6)." + "clavicular head of pectoralis major muscle": "A muscle head that forms the superior portion of the pectoralis major, originating from the anterior surface of the medial half of the clavicle and converging with the sternocostal head to insert via a common tendon onto the lateral lip of the intertubercular groove of the humerus.", + "sternocostal head of pectoralis major muscle": "A muscle head that forms the larger inferior portion of the pectoralis major, originating from the anterior surface of the sternum, the superior six costal cartilages, and the aponeurosis of the external oblique muscle, and inserting together with the clavicular head onto the lateral lip of the intertubercular groove of the humerus." }, "xrefs": { - "clavicular head of pectoralis major muscle": "FMA:34687" + "clavicular head of pectoralis major muscle": "Wikipedia:Pectoralis_major_muscle|FMA:32519", + "sternocostal head of pectoralis major muscle": "Wikipedia:Pectoralis_major_muscle|FMA:32521" }, "def_xrefs_to_add": { - "clavicular head of pectoralis major muscle": "PMID:30252247|PMID:31061824" + "clavicular head of pectoralis major muscle": "Wikipedia:Pectoralis_major_muscle", + "sternocostal head of pectoralis major muscle": "Wikipedia:Pectoralis_major_muscle" + }, + "leaf_template_rows": { + "clavicular head of pectoralis major muscle": { + "is_a": "UBERON:0011906", + "part_of": "UBERON:0002381", + "has_muscle_origin": "UBERON:0001105", + "has_muscle_insertion": "UBERON:0000976", + "innervated_by": "UBERON:0003726" + }, + "sternocostal head of pectoralis major muscle": { + "is_a": "UBERON:0011906", + "part_of": "UBERON:0002381", + "has_muscle_origin": "UBERON:0000975", + "has_muscle_insertion": "UBERON:0000976", + "innervated_by": "UBERON:0003726" + } }, "resolved_relationships": { - "clavicular head of pectoralis major muscle": "part_of" + "clavicular head of pectoralis major muscle": "part_of", + "sternocostal head of pectoralis major muscle": "part_of" }, "resolved_parents": { - "clavicular head of pectoralis major muscle": "UBERON:0002381" + "clavicular head of pectoralis major muscle": "UBERON:0002381", + "sternocostal head of pectoralis major muscle": "UBERON:0002381" } } diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0003682.json b/bulk_ntr_workflow/outputs/definitions/uberon_0003682.json new file mode 100644 index 000000000..9f4baf295 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0003682.json @@ -0,0 +1,15 @@ +{ + "confirmed_matches": [ + { + "label": "musculus uvulae muscle", + "uberon_id": "UBERON:0010235", + "confidence": "high", + "uberon_definition": "The musculus uvulae (azygos uvulae) is a muscle of the soft palate. It arises from the posterior nasal spine of the palatine bones and from the palatine aponeurosis. It descends to be inserted into the uvula and functions to move and shape it. It is innervated by the pharyngeal branch of the vagus nerve via the pharyngeal plexus[WP].", + "wikipedia_summary": "The musculus uvulae (uvular muscle) is a small paired skeletal muscle of the soft palate that originates from the posterior nasal spine of the palatine bone and the palatine aponeurosis and inserts into the mucous membrane of the uvula, acting to shorten and broaden the uvula; innervated by the pharyngeal branch of the vagus nerve via the pharyngeal plexus.", + "note": "UBERON:0010235 'uvular muscle' has 'musculus uvulae muscle' as a RELATED synonym (Wikipedia:Musculus_uvulae) and xref FMA:46733. Same structure; existing UBERON term should be reused. Parent UBERON:0003682 palatal muscle already matches the source-supplied parent. Existing UBERON term already encodes has_muscle_origin (hard palate), has_muscle_insertion (palatine uvula, palatine aponeurosis), and innervated_by (pharyngeal branch of vagus nerve)." + } + ], + "xrefs": { + "musculus uvulae muscle": "Wikipedia:Musculus_uvulae|FMA:46733" + } +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0003690.json b/bulk_ntr_workflow/outputs/definitions/uberon_0003690.json new file mode 100644 index 000000000..aeede4ecc --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0003690.json @@ -0,0 +1,22 @@ +{ + "confirmed_matches": [ + { + "label": "internal abdominal oblique muscle", + "uberon_id": "UBERON:0005454", + "confidence": "high", + "uberon_definition": "The lateral abdominal wall muscle that is deep to the external oblique and superficial to the transversus.", + "wikipedia_summary": "The abdominal internal oblique muscle, also internal oblique muscle or interior oblique, is an abdominal muscle in the abdominal wall that lies below the external oblique muscle and just above the transverse abdominal muscle. It is broad and thin, and forms the intermediate layer of the lateral abdominal wall.", + "note": "Source label 'internal abdominal oblique muscle' is an existing RELATED synonym of UBERON:0005454 (primary label: 'abdominal internal oblique muscle'). FMA:13891. The input parent UBERON:0003690 ('fused sacrum') is clearly incorrect for a muscle term; the genuine UBERON parent is UBERON:0035032 (abdominal oblique muscle)." + } + ], + "xrefs": { + "internal abdominal oblique muscle": "FMA:13891|Wikipedia:Abdominal_internal_oblique_muscle" + }, + "unresolvable": [ + { + "label": "input parent UBERON:0003690", + "reason": "Source parent UBERON:0003690 resolves to 'fused sacrum' (a bone), which cannot be a parent of a muscle. This appears to be an upstream mapping error in the ASCTB-TEMP source data.", + "suggestion": "No action required — term already exists in UBERON as UBERON:0005454 and is auto-excluded from the template via confirmed_matches." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0005893.json b/bulk_ntr_workflow/outputs/definitions/uberon_0005893.json new file mode 100644 index 000000000..0b25cb5f3 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0005893.json @@ -0,0 +1,19 @@ +{ + "confirmed_matches": [ + { + "label": "frontal belly of occipitofrontalis muscle", + "uberon_id": "UBERON:0010952", + "confidence": "high", + "uberon_definition": "A belly of the occipitofrontalis muscle that is near the frontal bone.", + "wikipedia_summary": "The frontalis muscle (frontal belly of the occipitofrontalis) is a muscle that covers parts of the forehead; it has no bony attachments and inserts into the epicranial aponeurosis. It is innervated by the temporal branches of the facial nerve and raises the eyebrows.", + "note": "UBERON:0010952 'frontalis muscle belly' carries the exact synonym 'frontal belly of occipitofrontalis' (FMA:46757) and the related synonym 'frontal belly of occipitofrontalis muscle' (Wikipedia:Frontalis_muscle). Source parent UBERON:0005893 'leg bone' is clearly an erroneous parent assignment in the HRA input (likely a data alignment error) — the term itself is a well-established existing UBERON class. Exclude from template." + } + ], + "unresolvable": [ + { + "label": "frontal belly of occipitofrontalis muscle", + "reason": "Source parent UBERON:0005893 is 'leg bone' — clearly an incorrect parent for a facial muscle belly. Flag for curator review of the input row, but no action needed in template since the term is a confirmed existing match.", + "suggestion": "Curator: verify HRA source row; the term itself already exists as UBERON:0010952." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0006719.json b/bulk_ntr_workflow/outputs/definitions/uberon_0006719.json new file mode 100644 index 000000000..6ff9899bb --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0006719.json @@ -0,0 +1,26 @@ +{ + "definitions": { + "superior head of lateral pterygoid muscle": "A muscle head that constitutes the smaller, upper portion of the lateral pterygoid muscle, arising from the infratemporal surface of the greater wing of the sphenoid bone and inserting predominantly onto the articular disc and capsule of the temporomandibular joint; it acts mainly during closing and stabilises the disc during jaw movement." + }, + "xrefs": { + "superior head of lateral pterygoid muscle": "Wikipedia:Lateral_pterygoid_muscle" + }, + "def_xrefs_to_add": { + "superior head of lateral pterygoid muscle": "PMID:9656947|PMID:7798474" + }, + "leaf_template_rows": { + "superior head of lateral pterygoid muscle": { + "is_a": "UBERON:0011906", + "part_of": "UBERON:0006719", + "has_muscle_origin": "UBERON:0006721", + "has_muscle_insertion": "UBERON:0011319", + "innervated_by": "UBERON:0013647" + } + }, + "resolved_relationships": { + "superior head of lateral pterygoid muscle": "part_of" + }, + "resolved_parents": { + "superior head of lateral pterygoid muscle": "UBERON:0006719" + } +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0010990.json b/bulk_ntr_workflow/outputs/definitions/uberon_0010990.json new file mode 100644 index 000000000..25b3782c5 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0010990.json @@ -0,0 +1,50 @@ +{ + "definitions": { + "multifidus cervicis muscle": "A skeletal muscle of the deep layer of the back, forming the cervical portion of the multifidus and part of the transversospinales muscle group. It arises from the superior articular processes of the lower cervical vertebrae (C4-C7) and ascends superomedially to insert into the spinous processes of vertebrae two to five segments above (C2-C5), acting in extension, ipsilateral lateral flexion and contralateral rotation of the cervical vertebral column.", + "multifidus lumborum muscle": "A skeletal muscle of the deep layer of the back, forming the lumbar portion of the multifidus and part of the transversospinales muscle group. It arises from the mammillary processes of the lumbar vertebrae and the posterior surface of the sacrum, and its fascicles ascend superomedially to insert into the spinous processes of vertebrae two to five segments above their origin, contributing to extension and segmental stabilisation of the lumbar vertebral column.", + "multifidus thoracis muscle": "A skeletal muscle of the deep layer of the back, forming the thoracic portion of the multifidus and part of the transversospinales muscle group. It arises from the transverse processes of the thoracic vertebrae and ascends superomedially to insert into the spinous processes of vertebrae two to five segments above its origin, producing extension, ipsilateral lateral flexion and contralateral rotation of the thoracic vertebral column." + }, + "xrefs": { + "multifidus cervicis muscle": "Wikipedia:Multifidus_muscle", + "multifidus lumborum muscle": "Wikipedia:Multifidus_muscle", + "multifidus thoracis muscle": "Wikipedia:Multifidus_muscle" + }, + "def_xrefs_to_add": { + "multifidus cervicis muscle": "PMID:15706328", + "multifidus lumborum muscle": "PMID:23915550|PMID:23915551", + "multifidus thoracis muscle": "PMID:23915550" + }, + "leaf_template_rows": { + "multifidus cervicis muscle": { + "is_a": "UBERON:0010990", + "part_of": "UBERON:0006072", + "has_muscle_origin": "UBERON:0001077", + "has_muscle_insertion": "UBERON:0001076", + "innervated_by": "UBERON:0006839" + }, + "multifidus lumborum muscle": { + "is_a": "UBERON:0010990", + "part_of": "UBERON:0006074", + "has_muscle_origin": "UBERON:0001077", + "has_muscle_insertion": "UBERON:0001076", + "innervated_by": "UBERON:0006839" + }, + "multifidus thoracis muscle": { + "is_a": "UBERON:0010990", + "part_of": "UBERON:0006073", + "has_muscle_origin": "UBERON:0001077", + "has_muscle_insertion": "UBERON:0001076", + "innervated_by": "UBERON:0006839" + } + }, + "resolved_relationships": { + "multifidus cervicis muscle": "is_a", + "multifidus lumborum muscle": "is_a", + "multifidus thoracis muscle": "is_a" + }, + "resolved_parents": { + "multifidus cervicis muscle": "UBERON:0010990", + "multifidus lumborum muscle": "UBERON:0010990", + "multifidus thoracis muscle": "UBERON:0010990" + } +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_0015173.json b/bulk_ntr_workflow/outputs/definitions/uberon_0015173.json new file mode 100644 index 000000000..7ec920dbb --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_0015173.json @@ -0,0 +1,39 @@ +{ + "definitions": { + "puboperineales muscle": "A muscle of the pelvis that arises from the inner surface of the pubic bone and inserts into the perineal body, forming part of the pubovisceral component of the levator ani muscle and contributing to support of the pelvic floor and elevation of the perineal body." + }, + "xrefs": { + "puboperineales muscle": "FMA:74028" + }, + "def_xrefs_to_add": { + "puboperineales muscle": "PMID:14990415" + }, + "leaf_template_rows": { + "puboperineales muscle": { + "is_a": "UBERON:0001325", + "part_of": "UBERON:0001326", + "has_muscle_origin": "UBERON:0001275", + "has_muscle_insertion": "UBERON:0006654" + } + }, + "resolved_relationships": { + "puboperineales muscle": "part_of" + }, + "resolved_parents": { + "puboperineales muscle": "UBERON:0001326" + }, + "name_corrections": [ + { + "label": "puboperineales muscle", + "suggested": "puboperinealis muscle", + "reason": "TA2 Latin form is 'musculus puboperinealis' (singular); 'puboperineales' is the plural Latin adjective form used inconsistently. The standard English label is 'puboperinealis muscle' or 'puboperineal muscle'. Keep source name as a synonym." + } + ], + "unresolvable": [ + { + "label": "puboperineales muscle", + "reason": "Source parent UBERON:0015173 ('helicine branch of uterine artery') is clearly a misalignment in the input data — it is an artery, not a muscle. Resolved to the anatomically correct parent levator ani muscle (UBERON:0001326) following the precedent of puborectalis (UBERON:0011512) and pubococcygeus (UBERON:0011528), which are also slips of the levator ani with the same is_a/part_of pattern.", + "suggestion": "Curator should ignore the source parent_id and use UBERON:0001326 (levator ani muscle) as part_of, UBERON:0001325 (muscle of pelvis) as is_a." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/uberon_8600052.json b/bulk_ntr_workflow/outputs/definitions/uberon_8600052.json new file mode 100644 index 000000000..267b64e43 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/uberon_8600052.json @@ -0,0 +1,33 @@ +{ + "definitions": { + "puboanalis muscle": "A skeletal muscle of the pelvis that arises from the body of the pubis and descends to interdigitate with the longitudinal muscle of the anal canal, blending with fibres at the intersphincteric groove and perineal body. It forms the most medial component of the puborectalis sling of the levator ani and contributes to maintenance of the anorectal angle and faecal continence." + }, + "xrefs": { + "puboanalis muscle": "Wikipedia:Levator_ani" + }, + "def_xrefs_to_add": { + "puboanalis muscle": "PMID:21801920|PMID:18256862" + }, + "leaf_template_rows": { + "puboanalis muscle": { + "is_a": "UBERON:0001325", + "part_of": "UBERON:0001326", + "has_muscle_origin": "UBERON:0001275", + "has_muscle_insertion": "UBERON:0006654", + "innervated_by": "UBERON:0011390" + } + }, + "resolved_relationships": { + "puboanalis muscle": "part_of" + }, + "resolved_parents": { + "puboanalis muscle": "UBERON:0001326" + }, + "unresolvable": [ + { + "label": "puboanalis muscle", + "reason": "Source parent UBERON:8600052 not present in uberon-edit.obo (presumably a recently minted grouping class). Followed the precedent of sibling levator ani components (puborectalis UBERON:0011512, pubococcygeus UBERON:0011528, iliococcygeus UBERON:0011398) which all use is_a muscle of pelvis (UBERON:0001325) and part_of levator ani muscle (UBERON:0001326).", + "suggestion": "Curator: confirm whether UBERON:8600052 is intended as the parent and, if so, verify its placement in the hierarchy; otherwise leave is_a/part_of as written." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/unknown.json b/bulk_ntr_workflow/outputs/definitions/unknown.json new file mode 100644 index 000000000..177218cfa --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/unknown.json @@ -0,0 +1,19 @@ +{ + "confirmed_matches": [ + { + "label": "rectus capitus anterior muscle", + "uberon_id": "UBERON:0008453", + "confidence": "high", + "uberon_definition": "A muscle situated immediately behind the upper part of the Longus capitis that arises from the anterior surface of the lateral mass of the atlas, and from the root of its transverse process that inserts into the inferior surface of the basilar part of the occipital bone immediately in front of the foramen magnum.", + "wikipedia_summary": "The rectus capitis anterior is a small muscle of the anterior vertebral group, situated immediately behind the upper part of the longus capitis; arises from the anterior surface of the lateral mass of the atlas and inserts into the inferior surface of the basilar part of the occipital bone, acting in flexion of the head at the atlanto-occipital joint.", + "note": "Source label 'rectus capitus anterior muscle' is an alternate spelling (capitus vs capitis) and is explicitly listed as a RELATED synonym on UBERON:0008453. FMA:46312, Wikipedia:Rectus_capitis_anterior_muscle. Excluded from template." + } + ], + "name_corrections": [ + { + "label": "rectus capitus anterior muscle", + "suggested": "rectus capitis anterior muscle", + "reason": "Standard anatomical Latin is 'capitis' (genitive of caput), not 'capitus'. The source variant is already captured as a RELATED synonym on UBERON:0008453." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_intertransversarii_laterales_lumborum.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_intertransversarii_laterales_lumborum.json new file mode 100644 index 000000000..f8367764b --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_intertransversarii_laterales_lumborum.json @@ -0,0 +1,33 @@ +{ + "definitions": { + "ventral part of intertransversarii laterales lumborum muscle": "A skeletal muscle that is the anterior (ventral) division of the lateral lumbar intertransverse muscles, passing between the transverse processes of contiguous lumbar vertebrae in the lower back. Together with the dorsal part, it stabilises adjacent lumbar vertebrae and contributes to ipsilateral lateral flexion of the trunk; it is innervated by the ventral (anterior) rami of the lumbar spinal nerves." + }, + "xrefs": { + "ventral part of intertransversarii laterales lumborum muscle": "Wikipedia:Intertransversarii" + }, + "def_xrefs_to_add": { + "ventral part of intertransversarii laterales lumborum muscle": "PMID:6226119|PMID:7076562" + }, + "leaf_template_rows": { + "ventral part of intertransversarii laterales lumborum muscle": { + "is_a": "UBERON:0014892", + "part_of": "UBERON:0008242", + "has_muscle_origin": "UBERON:0018146", + "has_muscle_insertion": "UBERON:0018146", + "innervated_by": "UBERON:0009624" + } + }, + "resolved_relationships": { + "ventral part of intertransversarii laterales lumborum muscle": "part_of" + }, + "resolved_parents": { + "ventral part of intertransversarii laterales lumborum muscle": "UBERON:0008242" + }, + "unresolvable": [ + { + "label": "intertransversarii laterales lumborum muscle (source parent)", + "reason": "The source-assigned parent 'intertransversarii laterales lumborum muscle' is not present in UBERON. OLS4 returns no UBERON term for this label or for FMA:32544 (intertransversarii laterales lumborum). The closest UBERON terms are UBERON:3010664 / UBERON:3010667 (amphibian m. intertransversarius capitis sup./inf., not equivalent) and UBERON:0008242 (lower back muscle), which is a broader regional grouping.", + "suggestion": "As an interim solution this term has been placed part_of UBERON:0008242 (lower back muscle) with genus UBERON:0014892 (skeletal muscle organ, vertebrate). Curator should consider creating the parent muscle 'intertransversarii laterales lumborum (muscle)' (FMA:32544) as a sibling NTR and then re-parenting this ventral part as part_of that new term. A matching 'dorsal part of intertransversarii laterales lumborum muscle' (FMA:32546) will also be needed." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_levator_costarum_muscle.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_levator_costarum_muscle.json new file mode 100644 index 000000000..0e41b6de5 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_levator_costarum_muscle.json @@ -0,0 +1,33 @@ +{ + "definitions": { + "levatores costarum longi of levator costarum muscle": "A muscle fasciculus that constitutes the longer subdivision of the four lower levatores costarum, arising from the tip of the transverse process of a thoracic vertebra (typically T8-T11) and passing obliquely downward and laterally to insert on the outer surface of the second rib below its vertebra of origin, between the tubercle and the angle." + }, + "xrefs": { + "levatores costarum longi of levator costarum muscle": "Wikipedia:Levatores_costarum_muscles" + }, + "def_xrefs_to_add": { + "levatores costarum longi of levator costarum muscle": "PMID:13129167" + }, + "leaf_template_rows": { + "levatores costarum longi of levator costarum muscle": { + "is_a": "UBERON:0014892", + "part_of": "UBERON:8410070", + "has_muscle_origin": "UBERON:0001077", + "has_muscle_insertion": "UBERON:0002228", + "innervated_by": "UBERON:0006839" + } + }, + "resolved_relationships": { + "levatores costarum longi of levator costarum muscle": "part_of" + }, + "resolved_parents": { + "levatores costarum longi of levator costarum muscle": "UBERON:8410070" + }, + "unresolvable": [ + { + "label": "levatores costarum longi of levator costarum muscle", + "reason": "Parent 'levator costarum muscle' resolves to UBERON:8410070 (levator costarum). The source label suggests these are a named sub-component (the long fasciculi of the four lower levatores costarum). UBERON has no specific class for this sub-component, but the parent UBERON:8410070 itself already covers the levatores costarum collectively (its definition explicitly references both 'levatores costarum breves' and 'levatores costarum longi' as the two fasciculi of each muscle).", + "suggestion": "Curator decision needed: (a) accept this NTR as a part_of subdivision of UBERON:8410070 with genus 'skeletal muscle organ, vertebrate' (UBERON:0014892), as encoded in leaf_template_rows; OR (b) drop the NTR and instead add 'levatores costarum longi' as an EXACT synonym (with a clarifying scope) on UBERON:8410070, since the parent term's textual definition already enumerates the longi/breves fasciculi. Option (b) is more parsimonious if HRA only needs name-level findability. Option (a) is preferred if the longi fasciculus must be addressable as a distinct entity (e.g. for downstream attachment/innervation annotation). Innervation set to dorsal ramus of spinal nerve (UBERON:0006839) following Morrison 1953 (PMID:13129167)." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json index 87072a1b1..f700153c1 100644 --- a/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_meningohypophyseal_artery.json @@ -1,24 +1,33 @@ { "definitions": { - "dorsal part of intertransversarii laterales lumborum muscle": "A skeletal muscle bundle that is the posterior (dorsal) portion of the lateral intertransversarii muscles of the lumbar region, connecting the accessory processes of one lumbar vertebra to the transverse process of the adjacent vertebra; it acts to stabilise the lumbar vertebral column and assist lateral flexion." + "dorsal part of intertransversarii laterales lumborum muscle": "A small skeletal back muscle that originates from the accessory process of one lumbar vertebra and inserts onto the transverse process of the adjacent (next inferior) lumbar vertebra, forming the posterior (dorsal) component of the lateral intertransverse muscles of the lumbar region; it contributes to lateral flexion and segmental stabilisation of the lumbar vertebral column." }, "xrefs": { "dorsal part of intertransversarii laterales lumborum muscle": "Wikipedia:Intertransversarii" }, "def_xrefs_to_add": { - "dorsal part of intertransversarii laterales lumborum muscle": "doi:10.1007/BF00518810" + "dorsal part of intertransversarii laterales lumborum muscle": "ISBN:9780323393225" + }, + "leaf_template_rows": { + "dorsal part of intertransversarii laterales lumborum muscle": { + "is_a": "UBERON:0001630", + "part_of": "UBERON:0001137", + "has_muscle_origin": "UBERON:0001077", + "has_muscle_insertion": "UBERON:0001077", + "innervated_by": "UBERON:0006839" + } }, "resolved_relationships": { "dorsal part of intertransversarii laterales lumborum muscle": "part_of" }, "resolved_parents": { - "dorsal part of intertransversarii laterales lumborum muscle": "UBERON:0008242" + "dorsal part of intertransversarii laterales lumborum muscle": "UBERON:0001137" }, "unresolvable": [ { "label": "dorsal part of intertransversarii laterales lumborum muscle", - "reason": "Source-supplied parent 'meningohypophyseal artery' is wrong-domain (an artery cannot be parent of a muscle subdivision). No UBERON term exists for the parent muscle 'intertransversarii laterales lumborum muscle' itself - the most specific available ancestor is UBERON:0008242 (lower back muscle). Ideally a parent term 'lateral intertransversarii lumborum muscle' should be added first, with this term as its dorsal subdivision (part_of).", - "suggestion": "Use UBERON:0008242 (lower back muscle) as the part_of parent for now. Curator should consider adding intermediate parent term 'lateral intertransversarii lumborum muscle' (FMA:32576 if available) and re-parenting this term as part_of that intermediate term. Note that 'dorsal part of' implies a subdivision, hence part_of relationship rather than is_a." + "reason": "Source-supplied parent label 'meningohypophyseal artery' is wrong-domain (a cranial artery cannot parent a lumbar back muscle) and is clearly a data-entry error in the input. The parent muscle 'intertransversarii laterales lumborum' (FMA:32576 / FMA:32577) and the higher class 'intertransversarii lumborum' do not yet exist in UBERON, so no exact named-muscle parent is available; the dorsal part has been placed under genus UBERON:0001630 (muscle organ) and part_of UBERON:0001137 (dorsum/back) by analogy with other deep back muscles such as longissimus, spinalis, and rotator muscle of the vertebral column. The bone-landmark 'accessory process of lumbar vertebra' is not in UBERON, so the more general UBERON:0001077 (transverse process of vertebra) is used for has_muscle_origin (the accessory process is a small projection on the posterior aspect of the transverse process region).", + "suggestion": "Curator should: (1) consider adding parent terms 'intertransversarii lumborum muscle group' and 'intertransversarii laterales lumborum muscle' to UBERON (FMA:32576, FMA:32577) so this dorsal part can be made part_of its true named-muscle parent; (2) optionally add 'accessory process of lumbar vertebra' (FMA:34047) for a more precise has_muscle_origin; (3) consider whether a 'muscle of vertebral column' is_a (UBERON:0004518) is preferable to the generic muscle organ once the parent muscle exists." } ] } diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_neuromeningeal_trunk.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_neuromeningeal_trunk.json new file mode 100644 index 000000000..59a8747f7 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_neuromeningeal_trunk.json @@ -0,0 +1,22 @@ +{ + "confirmed_matches": [ + { + "label": "occipital belly of occipitofrontalis muscle", + "uberon_id": "UBERON:0010947", + "confidence": "high", + "uberon_definition": "A belly of the occipitofrontalis muscle that is near the occipital bone.", + "wikipedia_summary": "The occipitalis muscle (occipital belly of the occipitofrontalis) is a thin, quadrilateral muscle attached to the highest nuchal lines of the occipital bone and the mastoid part of the temporal bone, inserting into the epicranial aponeurosis; it draws back the scalp and is innervated by the posterior auricular branch of the facial nerve.", + "note": "UBERON:0010947 'occipitalis' carries the EXACT synonym 'occipital belly of occipitofrontalis' (FMA:46758) and 'occipital part of occipitofrontalis'. Same FMA ID confirms identity. The source-supplied parent 'neuromeningeal trunk' is a wrong-domain (nerve trunk) label; the correct parent context is UBERON:0010946 occipitofrontalis muscle (the term already has is_a UBERON:0010938 muscle belly and part_of UBERON:0010946)." + } + ], + "xrefs": { + "occipital belly of occipitofrontalis muscle": "FMA:46758|Wikipedia:Occipitalis_muscle" + }, + "unresolvable": [ + { + "label": "source parent 'neuromeningeal trunk'", + "reason": "Wrong-domain parent label supplied by source. 'Neuromeningeal trunk' refers to a nerve trunk (a branch arrangement of the glossopharyngeal/vagus or ascending pharyngeal artery's neuromeningeal trunk), not to any muscle structure. It cannot serve as a parent for a muscle belly.", + "suggestion": "Discard the source parent label. The child term 'occipital belly of occipitofrontalis muscle' is already represented as UBERON:0010947 (occipitalis), with is_a UBERON:0010938 (muscle belly) and part_of UBERON:0010946 (occipitofrontalis muscle). Exclude this row from the NTR template; add 'occipital belly of occipitofrontalis muscle' as an EXACT synonym on UBERON:0010947 if not already exhaustively covered (current EXACT synonym is 'occipital belly of occipitofrontalis' — adding the trailing 'muscle' variant may be useful)." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_respiratory_diaphragm_muscle.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_respiratory_diaphragm_muscle.json new file mode 100644 index 000000000..065509964 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_respiratory_diaphragm_muscle.json @@ -0,0 +1,40 @@ +{ + "definitions": { + "sternal part of respiratory diaphragm muscle": "An organ subunit of the diaphragm consisting of two small muscular slips that arise from the posterior aspect of the xiphoid process of the sternum and insert into the anterior margin of the central tendon, contributing the anterior portion of the diaphragmatic musculature." + }, + "xrefs": { + "sternal part of respiratory diaphragm muscle": "FMA:58278" + }, + "def_xrefs_to_add": { + "sternal part of respiratory diaphragm muscle": "PMID:23586979" + }, + "leaf_template_rows": { + "sternal part of respiratory diaphragm muscle": { + "is_a": "UBERON:0000063", + "part_of": "UBERON:0001103", + "has_muscle_origin": "UBERON:0002207", + "has_muscle_insertion": "UBERON:0006670", + "innervated_by": "UBERON:0001884" + } + }, + "resolved_relationships": { + "sternal part of respiratory diaphragm muscle": "part_of" + }, + "resolved_parents": { + "sternal part of respiratory diaphragm muscle": "UBERON:0001103" + }, + "name_corrections": [ + { + "label": "sternal part of respiratory diaphragm muscle", + "suggested": "sternal part of diaphragm", + "reason": "UBERON uses 'diaphragm' (UBERON:0001103) as the standard label; FMA and TA2 use 'sternal part of diaphragm' (FMA:58278, 'pars sternalis diaphragmatis'). The source 'respiratory diaphragm muscle' phrasing is non-standard. Keep source name as RELATED synonym." + } + ], + "unresolvable": [ + { + "label": "sternal part of respiratory diaphragm muscle", + "reason": "Source parent label 'respiratory diaphragm muscle' has no exact UBERON match but maps to UBERON:0001103 (diaphragm) which has synonym 'diaphragm muscle' (BTO:0000341).", + "suggestion": "Resolved to UBERON:0001103 (diaphragm). Precedent: sibling term 'costal diaphragm' (UBERON:0035831, FMA:58277) uses is_a UBERON:0000063 (organ subunit) + part_of UBERON:0001103. Same pattern applied here." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json index 00bf00c32..cf930a9a3 100644 --- a/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_segmental_back_muscle.json @@ -1,24 +1,70 @@ { "definitions": { - "anterior cervical intertransversarii muscle": "A small segmental back muscle that arises from the anterior tubercle of the transverse process of one cervical vertebra and inserts on the anterior tubercle of the transverse process of the adjacent cervical vertebra, contributing to lateral flexion and proprioceptive stabilisation of the cervical spine." + "anterior cervical intertransversarii muscle": "A skeletal muscle organ that is one of a paired series of short segmental muscles connecting the anterior tubercles of adjacent cervical vertebrae, lying anterior to the ventral rami of the cervical spinal nerves and acting to bend the cervical spine laterally.", + "intertransversarii laterales lumborum muscle": "A skeletal muscle organ that is one of a paired series of short segmental muscles connecting the transverse processes of adjacent lumbar vertebrae along their lateral aspect, innervated by ventral rami of the lumbar spinal nerves and acting to flex the lumbar spine laterally.", + "medial lumbar intertransversarii muscle": "A skeletal muscle organ that is one of a paired series of short segmental muscles passing from the accessory process of one lumbar vertebra to the mammillary process of the vertebra below, innervated by dorsal rami of the lumbar spinal nerves and acting to stabilise and laterally flex the lumbar spine.", + "medial posterior cervical intertransversarii muscle": "A skeletal muscle organ that is the medial part of the posterior cervical intertransversarius, lying medial to the dorsal ramus of the cervical spinal nerve which pierces it, connecting the posterior tubercles of adjacent cervical vertebrae and acting to laterally flex the cervical spine.", + "thoracic intertransversarii muscle": "A skeletal muscle organ that is one of a series of small segmental muscles, typically present only between the lower thoracic vertebrae and between the last thoracic and first lumbar vertebra, connecting adjacent transverse processes and innervated by the dorsal rami of the thoracic spinal nerves." }, "xrefs": { - "anterior cervical intertransversarii muscle": "Wikipedia:Intertransversarii|FMA:71442" + "anterior cervical intertransversarii muscle": "Wikipedia:Intertransversarii", + "intertransversarii laterales lumborum muscle": "Wikipedia:Intertransversarii", + "medial lumbar intertransversarii muscle": "Wikipedia:Intertransversarii", + "medial posterior cervical intertransversarii muscle": "Wikipedia:Intertransversarii", + "thoracic intertransversarii muscle": "Wikipedia:Intertransversarii" }, "def_xrefs_to_add": { - "anterior cervical intertransversarii muscle": "PMID:12650404" + "anterior cervical intertransversarii muscle": "PMID:7076562", + "intertransversarii laterales lumborum muscle": "PMID:7076562", + "medial lumbar intertransversarii muscle": "PMID:7076562", + "medial posterior cervical intertransversarii muscle": "PMID:7076562", + "thoracic intertransversarii muscle": "PMID:7076562" }, - "resolved_relationships": { - "anterior cervical intertransversarii muscle": "is_a" + "leaf_template_rows": { + "anterior cervical intertransversarii muscle": { + "is_a": "UBERON:0014892", + "part_of": "UBERON:0006072", + "has_muscle_origin": "UBERON:0002413", + "has_muscle_insertion": "UBERON:0002413", + "innervated_by": "UBERON:0001780" + }, + "intertransversarii laterales lumborum muscle": { + "is_a": "UBERON:0014892", + "part_of": "UBERON:0006074", + "innervated_by": "UBERON:0001780" + }, + "medial lumbar intertransversarii muscle": { + "is_a": "UBERON:0014892", + "part_of": "UBERON:0006074", + "innervated_by": "UBERON:0001780" + }, + "medial posterior cervical intertransversarii muscle": { + "is_a": "UBERON:0014892", + "part_of": "UBERON:0006072", + "has_muscle_origin": "UBERON:0002413", + "has_muscle_insertion": "UBERON:0002413", + "innervated_by": "UBERON:0001780" + }, + "thoracic intertransversarii muscle": { + "is_a": "UBERON:0014892", + "part_of": "UBERON:0006073", + "has_muscle_origin": "UBERON:0002347", + "has_muscle_insertion": "UBERON:0002347", + "innervated_by": "UBERON:0001780" + } }, "resolved_parents": { - "anterior cervical intertransversarii muscle": "UBERON:0002324" + "anterior cervical intertransversarii muscle": "UBERON:0002324", + "intertransversarii laterales lumborum muscle": "UBERON:0002324", + "medial lumbar intertransversarii muscle": "UBERON:0002324", + "medial posterior cervical intertransversarii muscle": "UBERON:0002324", + "thoracic intertransversarii muscle": "UBERON:0002324" }, "unresolvable": [ { - "label": "segmental back muscle", - "reason": "Source parent label 'segmental back muscle' is not present in UBERON as a distinct class. The anterior cervical intertransversarii muscles span the transverse processes of adjacent cervical vertebrae and are classified as deep (segmental) back muscles in standard anatomy; the closest existing UBERON parent is UBERON:0002324 (muscle of back).", - "suggestion": "Use UBERON:0002324 (muscle of back) as the is_a parent. A more specific intermediate class such as 'segmental muscle of back' or 'deep muscle of back' could be added in future curation; 'musculature of neck' (UBERON:0004465) would be an alternative grouping for the cervical-region member but the source intent points to back musculature." + "label": "segmental back muscle (ASCTB-TEMP parent label)", + "reason": "No UBERON class for 'segmental back muscle' as a grouping; OLS4 search found no muscle-level intertransversarii classes in UBERON (only AAO-derived amphibian terms UBERON:3010664/3010667 for m. intertransversarius capitis). Used UBERON:0014892 (skeletal muscle organ, vertebrate) as genus and the specific vertebral-column region (UBERON:0006072/0006073/0006074) as part_of differentiator, with UBERON:0002324 'muscle of back' retained in resolved_parents as the recommended fallback structural parent.", + "suggestion": "Curator may add a grouping class 'segmental back muscle' (a subclass of UBERON:0002324 muscle of back, has_part some intertransversarius/interspinalis/rotator) in a future iteration; not required for these leaf terms." } ] } diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_spinotransversales_muscle.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_spinotransversales_muscle.json new file mode 100644 index 000000000..49e54af78 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_spinotransversales_muscle.json @@ -0,0 +1,19 @@ +{ + "confirmed_matches": [ + { + "label": "splenius capitus muscle", + "uberon_id": "UBERON:0000711", + "confidence": "high", + "uberon_definition": "A muscle that arises from the lower half of the ligamentum nuchae, from the spinous process of the seventh cervical vertebra, and from the spinous processes of the upper three or four thoracic vertebrae and inserts the mastoid process of the temporal bone, and into the rough surface on the occipital bone just below the lateral third of the superior nuchal line.", + "wikipedia_summary": "The splenius capitis is a broad, strap-like muscle in the back of the neck. It pulls on the base of the skull from the vertebrae in the neck and upper thorax. It is involved in movements such as shaking and nodding the head.", + "note": "Source label 'splenius capitus muscle' is a misspelling of 'splenius capitis'. UBERON:0000711 already has 'splenius capitis muscle' as an EXACT synonym (xref Wikipedia:Splenius_capitis_muscle, FMA:22653). Parent of the source group ('spinotransversales muscle') was previously resolved to UBERON:0002252 splenius, which is the is_a parent of UBERON:0000711 — consistent with this match." + } + ], + "name_corrections": [ + { + "label": "splenius capitus muscle", + "suggested": "splenius capitis", + "reason": "'capitus' is a misspelling of the Latin genitive 'capitis' (of the head). Standard anatomical nomenclature (TA2, FMA:22653) uses 'splenius capitis'. The existing UBERON:0000711 already carries 'splenius capitis muscle' as an EXACT synonym. Source label should be treated as a typographical variant; no new term required." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_submucosal_artery_of_colon.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_submucosal_artery_of_colon.json new file mode 100644 index 000000000..591efe6ab --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_submucosal_artery_of_colon.json @@ -0,0 +1,26 @@ +{ + "confirmed_matches": [ + { + "label": "rectus capitius posterior minor muscle", + "uberon_id": "UBERON:0008455", + "confidence": "high", + "uberon_definition": "A muscle that arise from the tubercle on the posterior arch of the and is inserted into the medial part of the inferior nuchal line of the occipital bone and the surface between it and the foramen magnum, and also takes some attachment to the spinal dura.", + "wikipedia_summary": "The rectus capitis posterior minor is a small muscle of the suboccipital region; it arises from the tubercle on the posterior arch of the atlas (C1) and inserts on the medial inferior nuchal line of the occipital bone; innervated by the suboccipital nerve (dorsal ramus of C1); part of the suboccipital triangle group; extends the head at the atlanto-occipital joint.", + "match_evidence": "UBERON:0008455 'rectus capitis posterior minor' already lists 'rectus capitus posterior minor muscle' and 'rectus capitus posterior minor' as RELATED synonyms (Wikipedia:Rectus_capitis_posterior_minor_muscle). The input label is a typo variant ('capitius'/'capitus' for 'capitis') of the same anatomical structure. Confirmed match — exclude from template." + } + ], + "name_corrections": [ + { + "label": "rectus capitius posterior minor muscle", + "suggested": "rectus capitis posterior minor", + "reason": "Input contains a misspelling: 'capitius' is a typo for 'capitis' (genitive of Latin caput, head). The correctly spelled term already exists in UBERON as UBERON:0008455. The variant 'rectus capitus posterior minor muscle' is already registered there as a RELATED synonym; the input form 'rectus capitius posterior minor muscle' could also be added as an additional misspelling synonym if desired." + } + ], + "unresolvable": [ + { + "label": "rectus capitius posterior minor muscle", + "reason": "Input file was named 'unresolvable_submucosal_artery_of_colon.json' and listed parent_id UNRESOLVABLE:'submucosal artery of colon' for both is_a and part_of. That parent is wrong-domain (a colonic artery) for a suboccipital skeletal muscle and appears to be a pipeline mislabel.", + "suggestion": "Disregard the bogus 'submucosal artery of colon' parent. The term itself is a confirmed match to UBERON:0008455 (rectus capitis posterior minor); no new term is needed. Had a new term been required, the correct parents would have been: is_a UBERON:0004518 (muscle of vertebral column) and part_of UBERON:0000974 (neck), mirroring the other rectus capitis muscles." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_supraperiosteal_arteriole.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_supraperiosteal_arteriole.json new file mode 100644 index 000000000..485495cf7 --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_supraperiosteal_arteriole.json @@ -0,0 +1,33 @@ +{ + "definitions": { + "inferior head of lateral pterygoid muscle": "A muscle head that is the larger, lower division of the lateral pterygoid muscle, arising from the lateral surface of the lateral pterygoid plate of the sphenoid bone and inserting onto the pterygoid fovea on the neck of the mandibular condyle; it acts on the inferior compartment of the temporomandibular joint to depress, protrude, and laterally deviate the mandible." + }, + "xrefs": { + "inferior head of lateral pterygoid muscle": "Wikipedia:Lateral_pterygoid_muscle" + }, + "def_xrefs_to_add": { + "inferior head of lateral pterygoid muscle": "PMID:15104127|PMID:12446184" + }, + "leaf_template_rows": { + "inferior head of lateral pterygoid muscle": { + "is_a": "UBERON:0011906", + "part_of": "UBERON:0006719", + "has_muscle_origin": "UBERON:0004649", + "has_muscle_insertion": "UBERON:0004657", + "innervated_by": "UBERON:0013647" + } + }, + "resolved_relationships": { + "inferior head of lateral pterygoid muscle": "part_of" + }, + "resolved_parents": { + "inferior head of lateral pterygoid muscle": "UBERON:0006719" + }, + "unresolvable": [ + { + "label": "inferior head of lateral pterygoid muscle", + "reason": "Source parent label 'supraperiosteal arteriole' is wrong-domain (a vascular structure) for this masticatory muscle head; the parent was overridden based on the child term itself.", + "suggestion": "Use UBERON:0011906 (muscle head) as genus and UBERON:0006719 (lateral pterygoid muscle) as part_of; this mirrors the UBERON pattern for UBERON:0007168 (long head of biceps brachii) and similar muscle-head terms." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/definitions/unresolvable_thoracic_wall_muscle.json b/bulk_ntr_workflow/outputs/definitions/unresolvable_thoracic_wall_muscle.json new file mode 100644 index 000000000..df19708cf --- /dev/null +++ b/bulk_ntr_workflow/outputs/definitions/unresolvable_thoracic_wall_muscle.json @@ -0,0 +1,33 @@ +{ + "definitions": { + "levatores costarum breves of levator costarum muscle": "Short skeletal muscle fasciculi of the levator costarum muscle that arise from the tips of the transverse processes of the seventh cervical and upper eleven thoracic vertebrae and insert obliquely inferolaterally onto the external aspect of the superior border of the rib immediately below their origin, between the tubercle and the angle, elevating the ribs during forceful inspiration." + }, + "xrefs": { + "levatores costarum breves of levator costarum muscle": "Wikipedia:Levatores_costarum_muscles|FMA:71437" + }, + "def_xrefs_to_add": { + "levatores costarum breves of levator costarum muscle": "PMID:4972578|PMID:3630603" + }, + "leaf_template_rows": { + "levatores costarum breves of levator costarum muscle": { + "is_a": "UBERON:0014892", + "part_of": "UBERON:8410070", + "has_muscle_origin": "UBERON:0001077", + "has_muscle_insertion": "UBERON:0002228", + "innervated_by": "UBERON:0006839" + } + }, + "resolved_relationships": { + "levatores costarum breves of levator costarum muscle": "part_of" + }, + "resolved_parents": { + "levatores costarum breves of levator costarum muscle": "UBERON:8410070" + }, + "unresolvable": [ + { + "label": "parent: thoracic wall muscle", + "reason": "Source-assigned grouping parent 'thoracic wall muscle' has no exact UBERON equivalent. The closest grouping classes in UBERON are UBERON:0002426 (chest muscle) and UBERON:0016403 (thoracic wall, anatomical region). However, the specific parent muscle 'levator costarum' (UBERON:8410070) already exists in UBERON and is itself is_a UBERON:0002426 ! chest muscle, so the chain is preserved.", + "suggestion": "Use part_of UBERON:8410070 (levator costarum) as the immediate containing structure; is_a UBERON:0014892 (skeletal muscle organ, vertebrate) supplies the genus class. The thoracic-wall-muscle grouping is implicit via the parent muscle's own is_a chain. No new grouping term is required." + } + ] +} diff --git a/bulk_ntr_workflow/outputs/template_groups_initial.tsv b/bulk_ntr_workflow/outputs/template_groups_initial.tsv index 21d9b10f9..caa71451f 100644 --- a/bulk_ntr_workflow/outputs/template_groups_initial.tsv +++ b/bulk_ntr_workflow/outputs/template_groups_initial.tsv @@ -1,4 +1,22 @@ ID LABEL Definition def_xref genus location In_subset Date Contributor Present_in_taxon Wikipedia_image xref ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| EC % EC BFO:0000050 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| -http://purl.obolibrary.org/obo/UBERON_9900002 anterior vertebral muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-vertebral-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900007 circular pharyngeal muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_circular-pharyngeal-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900002 anterior vertebral muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-vertebral-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900007 circular pharyngeal muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_circular-pharyngeal-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900011 dorsum of foot muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsum-of-foot-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900013 external ear muscle [PENDING] https://fipat.library.dal.ca/ta2/|https://purl.org/ccf/ASCTB-TEMP_external-ear-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900016 hypothenar hand muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_hypothenar-hand-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900020 intermediate back muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_intermediate-back-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900024 intrinsic eye muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_intrinsic-eye-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900027 lateral vertebral muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_lateral-vertebral-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900032 longitudinal pharyngeal muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_longitudinal-pharyngeal-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900036 middle ear muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_middle-ear-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900040 muscle of facial expression [PENDING] https://fipat.library.dal.ca/ta2/|https://purl.org/ccf/ASCTB-TEMP_muscle-of-facial-expression http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900044 palmar interosseous muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_palmar-interosseous-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900045 pelvic floor muscle [PENDING] https://fipat.library.dal.ca/ta2/|https://purl.org/ccf/ASCTB-TEMP_pelvic-floor-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900046 plantar interosseous muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_plantar-interosseous-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900047 posterior abdominal wall muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_posterior-abdominal-wall-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900055 segmental back muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900056 sole of foot muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_sole-of-foot-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900059 spinotransversales muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_spinotransversales-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900063 superficial back muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_superficial-back-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900068 thoracic wall muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_thoracic-wall-muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 diff --git a/bulk_ntr_workflow/outputs/template_muscle_initial.tsv b/bulk_ntr_workflow/outputs/template_muscle_initial.tsv index 7864acba9..df03486bb 100644 --- a/bulk_ntr_workflow/outputs/template_muscle_initial.tsv +++ b/bulk_ntr_workflow/outputs/template_muscle_initial.tsv @@ -1,10 +1,57 @@ ID LABEL Definition def_xref is_a part_of develops_from has_muscle_origin has_muscle_insertion innervated_by In_subset Date Contributor Present_in_taxon Wikipedia_image xref ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| SC % SC BFO:0000050 some % SC RO:0002202 some % SC RO:0002372 some % SC RO:0002373 some % SC RO:0002005 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| -http://purl.obolibrary.org/obo/UBERON_9900001 anterior cervical intertransversarii muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle UNRESOLVABLE:segmental back muscle UNRESOLVABLE:segmental back muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900003 articularis genu muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle NEEDS_MAPPING:FMA:22424 NEEDS_MAPPING:FMA:22424 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900004 aryepiglottic part of oblique arytenoid muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_aryepiglottic-part-of-oblique-arytenoid-muscle NEEDS_MAPPING:FMA:46583 NEEDS_MAPPING:FMA:46583 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900005 ceratoglossus of hyoglossus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_ceratoglossus-of-hyoglossus-muscle INFER:UBERON:0001572 INFER:UBERON:0001572 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900006 chondroglossus of hyoglossus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_chondroglossus-of-hyoglossus-muscle INFER:UBERON:0001572 INFER:UBERON:0001572 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900008 clavicular head of pectoralis major muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle INFER:UBERON:0002381 INFER:UBERON:0002381 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900009 costal part of respiratory diaphragm muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_costal-part-of-respiratory-diaphragm-muscle INFER:UBERON:0000975 INFER:UBERON:0000975 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900010 dorsal part of intertransversarii laterales lumborum muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle UNRESOLVABLE:meningohypophyseal artery UNRESOLVABLE:meningohypophyseal artery http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900001 anterior cervical intertransversarii muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle UNRESOLVABLE:segmental back muscle UNRESOLVABLE:segmental back muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900003 articularis genu muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle NEEDS_MAPPING:FMA:22424 NEEDS_MAPPING:FMA:22424 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900004 aryepiglottic part of oblique arytenoid muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_aryepiglottic-part-of-oblique-arytenoid-muscle NEEDS_MAPPING:FMA:46583 NEEDS_MAPPING:FMA:46583 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900005 ceratoglossus of hyoglossus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_ceratoglossus-of-hyoglossus-muscle INFER:UBERON:0001572 INFER:UBERON:0001572 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900006 chondroglossus of hyoglossus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_chondroglossus-of-hyoglossus-muscle INFER:UBERON:0001572 INFER:UBERON:0001572 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900008 clavicular head of pectoralis major muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle INFER:UBERON:0002381 INFER:UBERON:0002381 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900009 costal part of respiratory diaphragm muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_costal-part-of-respiratory-diaphragm-muscle INFER:UBERON:0000975 INFER:UBERON:0000975 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900010 dorsal part of intertransversarii laterales lumborum muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle UNRESOLVABLE:meningohypophyseal artery UNRESOLVABLE:meningohypophyseal artery http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900012 external anal sphincter muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_external-anal-sphincter-muscle INFER:UBERON:0001876 INFER:UBERON:0001876 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900014 frontal belly of occipitofrontalis muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_frontal-belly-of-occipitofrontalis-muscle INFER:UBERON:0005893 INFER:UBERON:0005893 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900015 hamstring portion of adductor magnus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_hamstring-portion-of-adductor-magnus-muscle INFER:UBERON:0001092 INFER:UBERON:0001092 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900017 iliocostalis cervicalis muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_iliocostalis-cervicalis-muscle INFER:UBERON:0001272 INFER:UBERON:0001272 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900018 inferior head of lateral pterygoid muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_inferior-head-of-lateral-pterygoid-muscle UNRESOLVABLE:supraperiosteal arteriole UNRESOLVABLE:supraperiosteal arteriole http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900019 inferior longitudinal lingual muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_inferior-longitudinal-lingual-muscle INFER:UBERON:0001194 INFER:UBERON:0001194 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900021 internal abdominal oblique muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_internal-abdominal-oblique-muscle INFER:UBERON:0003690 INFER:UBERON:0003690 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900022 interspinales cervicalis muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_interspinales-cervicalis-muscle INFER:UBERON:0000979 INFER:UBERON:0000979 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900023 intertransversarii laterales lumborum muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_intertransversarii-laterales-lumborum-muscle UNRESOLVABLE:segmental back muscle UNRESOLVABLE:segmental back muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900025 lateral compartmet of leg muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_lateral-compartmet-of-leg-muscle INFER:UBERON:0001537 INFER:UBERON:0001537 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900026 lateral posterior cervical intertransversarii muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_lateral-posterior-cervical-intertransversarii-muscle INFER:UBERON:0001546 INFER:UBERON:0001546 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900028 left crus of lumbar part of respiratory diaphragm muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_left-crus-of-lumbar-part-of-respiratory-diaphragm-muscle NEEDS_MAPPING:FMA:323951 NEEDS_MAPPING:FMA:323951 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900029 levator costarum muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_levator-costarum-muscle INFER:UBERON:0001677 INFER:UBERON:0001677 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900030 levatores costarum breves of levator costarum muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_levatores-costarum-breves-of-levator-costarum-muscle UNRESOLVABLE:thoracic wall muscle UNRESOLVABLE:thoracic wall muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900031 levatores costarum longi of levator costarum muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_levatores-costarum-longi-of-levator-costarum-muscle UNRESOLVABLE:levator costarum muscle UNRESOLVABLE:levator costarum muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900033 longus capitus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_longus-capitus-muscle INFER:UBERON:0002377 INFER:UBERON:0002377 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900034 medial lumbar intertransversarii muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_medial-lumbar-intertransversarii-muscle UNRESOLVABLE:segmental back muscle UNRESOLVABLE:segmental back muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900035 medial posterior cervical intertransversarii muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_medial-posterior-cervical-intertransversarii-muscle UNRESOLVABLE:segmental back muscle UNRESOLVABLE:segmental back muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900037 multifidus cervicis muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_multifidus-cervicis-muscle INFER:UBERON:0010990 INFER:UBERON:0010990 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900038 multifidus lumborum muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_multifidus-lumborum-muscle INFER:UBERON:0010990 INFER:UBERON:0010990 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900039 multifidus thoracis muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_multifidus-thoracis-muscle INFER:UBERON:0010990 INFER:UBERON:0010990 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900041 musculus uvulae muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_musculus-uvulae-muscle INFER:UBERON:0003682 INFER:UBERON:0003682 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900042 occipital belly of occipitofrontalis muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_occipital-belly-of-occipitofrontalis-muscle UNRESOLVABLE:neuromeningeal trunk UNRESOLVABLE:neuromeningeal trunk http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900043 opponens digiti minimi muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_opponens-digiti-minimi-muscle INFER:UBERON:0001624 INFER:UBERON:0001624 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900048 pteryopharyngeal part of superior pharyngeal constrictor muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_pteryopharyngeal-part-of-superior-pharyngeal-constrictor-muscle INFER:UBERON:0001272 INFER:UBERON:0001272 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900049 puboanalis muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_puboanalis-muscle INFER:UBERON:8600052 INFER:UBERON:8600052 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900050 puboperineales muscle [PENDING] https://fipat.library.dal.ca/ta2/|https://purl.org/ccf/ASCTB-TEMP_puboperineales-muscle INFER:UBERON:0015173 INFER:UBERON:0015173 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900051 rectus capitius posterior minor muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_rectus-capitius-posterior-minor-muscle UNRESOLVABLE:submucosal artery of colon UNRESOLVABLE:submucosal artery of colon http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900052 rectus capitus anterior muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_rectus-capitus-anterior-muscle UNKNOWN UNKNOWN http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900053 respiratory diaphragm muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_respiratory-diaphragm-muscle NEEDS_MAPPING:FMA:12252 NEEDS_MAPPING:FMA:12252 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900054 right crus of lumbar part of respiratory diaphragm muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_right-crus-of-lumbar-part-of-respiratory-diaphragm-muscle NEEDS_MAPPING:FMA:5841 NEEDS_MAPPING:FMA:5841 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900057 spermatic cord muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_spermatic-cord-muscle INFER:UBERON:0002378 INFER:UBERON:0002378 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900058 sphincter urethrae muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_sphincter-urethrae-muscle INFER:UBERON:0002379 INFER:UBERON:0002379 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900060 splenius capitus muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_splenius-capitus-muscle UNRESOLVABLE:spinotransversales muscle UNRESOLVABLE:spinotransversales muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900061 sternal part of respiratory diaphragm muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_sternal-part-of-respiratory-diaphragm-muscle UNRESOLVABLE:respiratory diaphragm muscle UNRESOLVABLE:respiratory diaphragm muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900062 sternocostal head of pectoralis major muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_sternocostal-head-of-pectoralis-major-muscle INFER:UBERON:0002381 INFER:UBERON:0002381 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900064 superior head of lateral pterygoid muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_superior-head-of-lateral-pterygoid-muscle INFER:UBERON:0006719 INFER:UBERON:0006719 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900065 superior longitudinal lingual muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_superior-longitudinal-lingual-muscle INFER:UBERON:0001576 INFER:UBERON:0001576 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900066 tensor fascia latae muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_tensor-fascia-latae-muscle INFER:UBERON:0002000 INFER:UBERON:0002000 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900067 thoracic intertransversarii muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_thoracic-intertransversarii-muscle UNRESOLVABLE:segmental back muscle UNRESOLVABLE:segmental back muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900069 thyroepiglottic part of thyroarytenoid muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_thyroepiglottic-part-of-thyroarytenoid-muscle NEEDS_MAPPING:FMA:46588 NEEDS_MAPPING:FMA:46588 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900070 thyropharyngeal part of inferior pharyngeal constrictor muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_thyropharyngeal-part-of-inferior-pharyngeal-constrictor-muscle NEEDS_MAPPING:FMA:46623 NEEDS_MAPPING:FMA:46623 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900071 tibalis anterior muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_tibalis-anterior-muscle NEEDS_MAPPING:FMA:22472 NEEDS_MAPPING:FMA:22472 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900072 tibalis posterior muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_tibalis-posterior-muscle NEEDS_MAPPING:FMA:22474 NEEDS_MAPPING:FMA:22474 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900073 transverse muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_transverse-muscle INFER:UBERON:0001576 INFER:UBERON:0001576 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900074 ventral part of intertransversarii laterales lumborum muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_ventral-part-of-intertransversarii-laterales-lumborum-muscle UNRESOLVABLE:intertransversarii laterales lumborum muscle UNRESOLVABLE:intertransversarii laterales lumborum muscle http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900075 vertical muscle [PENDING] https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_vertical-muscle INFER:UBERON:0001576 INFER:UBERON:0001576 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 diff --git a/src/templates/hra-muscular-groups.template.tsv b/src/templates/hra-muscular-groups.template.tsv index dff359c07..a355c9c1c 100644 --- a/src/templates/hra-muscular-groups.template.tsv +++ b/src/templates/hra-muscular-groups.template.tsv @@ -1,2 +1,10 @@ ID LABEL Definition def_xref genus location In_subset Date Contributor Present_in_taxon Wikipedia_image xref ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| EC % EC BFO:0000050 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| +http://purl.obolibrary.org/obo/UBERON_9900013 external ear muscle A group of skeletal muscles attached to the auricular cartilage that act to move the pinna, comprising the auricularis anterior, auricularis superior, and auricularis posterior. https://fipat.library.dal.ca/ta2/|https://purl.org/ccf/ASCTB-TEMP_external-ear-muscle UBERON:0014892 UBERON:0001691 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 +http://purl.obolibrary.org/obo/UBERON_9900020 intermediate back muscle A group of skeletal muscles forming the intermediate layer of the back that act as accessory muscles of respiration, comprising the serratus posterior superior and serratus posterior inferior muscles. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_intermediate-back-muscle|PMID:30571022 UBERON:0014892 UBERON:0001137 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Human_back +http://purl.obolibrary.org/obo/UBERON_9900036 middle ear muscle A group of skeletal muscles located within the middle ear cavity that attenuate sound transmission through the auditory ossicles, comprising the tensor tympani and stapedius muscles. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_middle-ear-muscle|PMID:24379725 UBERON:0014892 UBERON:0001756 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Middle_ear +http://purl.obolibrary.org/obo/UBERON_9900047 posterior abdominal wall muscle A group of skeletal muscles located in the posterior part of the abdominal wall that support the lumbar spine and act on the trunk and hip, comprising the psoas major, psoas minor, iliacus, and quadratus lumborum muscles. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_posterior-abdominal-wall-muscle|PMID:30855915 UBERON:0014892 UBERON:0003697 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Abdominal_wall +http://purl.obolibrary.org/obo/UBERON_9900055 segmental back muscle A group of small skeletal muscles of the deep back that span individual vertebral segments, comprising the interspinales, intertransversarii, and levatores costarum, which produce minor movements of the vertebral column. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle|PMID:30571022 UBERON:0014892 UBERON:0001137 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Human_back +http://purl.obolibrary.org/obo/UBERON_9900056 sole of foot muscle A group of skeletal muscles located in the plantar part of the foot that act on the toes and support the longitudinal arch, comprising the four layers of plantar intrinsic muscles including the abductor hallucis, flexor digitorum brevis, lumbricals, quadratus plantae, flexor digiti minimi brevis, adductor hallucis, and plantar/dorsal interossei. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_sole-of-foot-muscle|PMID:30571022 UBERON:0014892 UBERON:0008338 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Sole_(foot) +http://purl.obolibrary.org/obo/UBERON_9900063 superficial back muscle A group of skeletal muscles forming the superficial layer of the back, which attach the upper limb to the trunk and act on the shoulder girdle, comprising the trapezius, latissimus dorsi, levator scapulae, and rhomboid muscles. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_superficial-back-muscle|PMID:30571022 UBERON:0014892 UBERON:0001137 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Human_back +http://purl.obolibrary.org/obo/UBERON_9900068 thoracic wall muscle A group of skeletal muscles that are part of the thoracic wall and act on the ribs to produce respiratory movements, comprising the external, internal and innermost intercostals, subcostales and transversus thoracis. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_thoracic-wall-muscle|PMID:30855894 UBERON:0014892 UBERON:0016403 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Thoracic_wall diff --git a/src/templates/hra-muscular-muscle.template.tsv b/src/templates/hra-muscular-muscle.template.tsv index 75fb27996..9600f1ec0 100644 --- a/src/templates/hra-muscular-muscle.template.tsv +++ b/src/templates/hra-muscular-muscle.template.tsv @@ -1,6 +1,27 @@ ID LABEL Definition def_xref is_a part_of develops_from has_muscle_origin has_muscle_insertion innervated_by In_subset Date Contributor Present_in_taxon Wikipedia_image xref ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| SC % SC BFO:0000050 some % SC RO:0002202 some % SC RO:0002372 some % SC RO:0002373 some % SC RO:0002005 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| -http://purl.obolibrary.org/obo/UBERON_9900001 anterior cervical intertransversarii muscle A small segmental back muscle that arises from the anterior tubercle of the transverse process of one cervical vertebra and inserts on the anterior tubercle of the transverse process of the adjacent cervical vertebra, contributing to lateral flexion and proprioceptive stabilisation of the cervical spine. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle|PMID:12650404 UBERON:0002324 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii|FMA:71442 -http://purl.obolibrary.org/obo/UBERON_9900003 articularis genu muscle A muscle organ of the anterior thigh, often described as a deep, flat, variable accessory of the quadriceps femoris that arises from the anterior surface of the distal femur and inserts onto the suprapatellar bursa and synovial membrane of the knee joint, retracting the joint capsule during knee extension. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle|PMID:30229230 UBERON:0001630 UBERON:0000376 UBERON:0000981 UBERON:0001267 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 https://upload.wikimedia.org/wikipedia/commons/0/06/Gray434.png Wikipedia:Articularis_genus_muscle|FMA:22424 -http://purl.obolibrary.org/obo/UBERON_9900008 clavicular head of pectoralis major muscle A muscle head that is part of the pectoralis major muscle, originating from the anterior surface of the medial half of the clavicle. Its fibres pass obliquely downward and laterally to converge with those of the sternocostal head, contributing the anterior lamina of the broad flat tendon that inserts onto the lateral lip of the intertubercular groove of the humerus, and is innervated by the lateral pectoral nerve (C5-C6). https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle|PMID:30252247|PMID:31061824 UBERON:0002381 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 FMA:34687 -http://purl.obolibrary.org/obo/UBERON_9900010 dorsal part of intertransversarii laterales lumborum muscle A skeletal muscle bundle that is the posterior (dorsal) portion of the lateral intertransversarii muscles of the lumbar region, connecting the accessory processes of one lumbar vertebra to the transverse process of the adjacent vertebra; it acts to stabilise the lumbar vertebral column and assist lateral flexion. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle|doi:10.1007/BF00518810 UBERON:0008242 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-28T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii +http://purl.obolibrary.org/obo/UBERON_9900001 anterior cervical intertransversarii muscle A skeletal muscle organ that is one of a paired series of short segmental muscles connecting the anterior tubercles of adjacent cervical vertebrae, lying anterior to the ventral rami of the cervical spinal nerves and acting to bend the cervical spine laterally. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle|PMID:7076562 UBERON:0014892 UBERON:0006072 UBERON:0002413 UBERON:0002413 UBERON:0001780 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii +http://purl.obolibrary.org/obo/UBERON_9900003 articularis genu muscle A small skeletal muscle organ of the anterior thigh, lying deep to the vastus intermedius, that arises from the anterior surface of the distal shaft of the femur and inserts onto the proximal wall of the suprapatellar bursa and the synovial membrane of the knee joint, where it retracts the bursa superiorly during knee extension. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle|PMID:30229230 UBERON:0001630 UBERON:0000376 UBERON:0000981 UBERON:0001267 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 https://upload.wikimedia.org/wikipedia/commons/2/2b/Gray244.png Wikipedia:Articularis_genus_muscle|FMA:22424 +http://purl.obolibrary.org/obo/UBERON_9900008 clavicular head of pectoralis major muscle A muscle head that forms the superior portion of the pectoralis major, originating from the anterior surface of the medial half of the clavicle and converging with the sternocostal head to insert via a common tendon onto the lateral lip of the intertubercular groove of the humerus. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle|Wikipedia:Pectoralis_major_muscle UBERON:0011906 UBERON:0002381 UBERON:0001105 UBERON:0000976 UBERON:0003726 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Pectoralis_major_muscle|FMA:32519 +http://purl.obolibrary.org/obo/UBERON_9900010 dorsal part of intertransversarii laterales lumborum muscle A small skeletal back muscle that originates from the accessory process of one lumbar vertebra and inserts onto the transverse process of the adjacent (next inferior) lumbar vertebra, forming the posterior (dorsal) component of the lateral intertransverse muscles of the lumbar region; it contributes to lateral flexion and segmental stabilisation of the lumbar vertebral column. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle UBERON:0001630 UBERON:0001137 UBERON:0001077 UBERON:0001077 UBERON:0006839 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii +http://purl.obolibrary.org/obo/UBERON_9900015 hamstring portion of adductor magnus muscle A muscle head that originates from the ischial tuberosity and descends almost vertically through the posterior compartment of the thigh to insert by a rounded tendon onto the adductor tubercle of the medial femoral condyle. It is the ischiocondylar division of the adductor magnus, is innervated by the tibial division of the sciatic nerve, and acts to extend the hip joint. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_hamstring-portion-of-adductor-magnus-muscle|PMID:23813615 UBERON:0011906 UBERON:0000370 UBERON:0034983 UBERON:0000981 UBERON:0001323 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Adductor_magnus_muscle +http://purl.obolibrary.org/obo/UBERON_9900018 inferior head of lateral pterygoid muscle A muscle head that is the larger, lower division of the lateral pterygoid muscle, arising from the lateral surface of the lateral pterygoid plate of the sphenoid bone and inserting onto the pterygoid fovea on the neck of the mandibular condyle; it acts on the inferior compartment of the temporomandibular joint to depress, protrude, and laterally deviate the mandible. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_inferior-head-of-lateral-pterygoid-muscle|PMID:15104127|PMID:12446184 UBERON:0011906 UBERON:0006719 UBERON:0004649 UBERON:0004657 UBERON:0013647 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Lateral_pterygoid_muscle +http://purl.obolibrary.org/obo/UBERON_9900019 inferior longitudinal muscle of tongue An intrinsic muscle of the tongue that consists of a narrow band of longitudinal fibers running along the inferior surface of the tongue between the genioglossus and hyoglossus muscles, extending from the root to the apex of the tongue, and innervated by the hypoglossal nerve. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_inferior-longitudinal-lingual-muscle|PMID:30855883 UBERON:0001576 UBERON:0001723 UBERON:0001685 UBERON:0001723 UBERON:0001650 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 https://upload.wikimedia.org/wikipedia/commons/3/30/Musculuslongitudinalissuperiorlinguae.png Wikipedia:Inferior_longitudinal_muscle_of_tongue|FMA:46694 +http://purl.obolibrary.org/obo/UBERON_9900022 interspinales cervicis muscle A muscle of the vertebral column consisting of short paired fascicles that span between the spinous processes of contiguous cervical vertebrae (typically C2 through T1), lying on either side of the interspinous ligament. It assists in extension of the cervical spine and contributes to segmental stabilisation and proprioception of the neck. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_interspinales-cervicalis-muscle|Wikipedia:Interspinales_muscles UBERON:0004518 UBERON:0000974 UBERON:0001076 UBERON:0001076 UBERON:0006839 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Interspinales_muscles|FMA:32519 +http://purl.obolibrary.org/obo/UBERON_9900023 intertransversarii laterales lumborum muscle A skeletal muscle organ that is one of a paired series of short segmental muscles connecting the transverse processes of adjacent lumbar vertebrae along their lateral aspect, innervated by ventral rami of the lumbar spinal nerves and acting to flex the lumbar spine laterally. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_intertransversarii-laterales-lumborum-muscle|PMID:7076562 UBERON:0014892 UBERON:0006074 UBERON:0001780 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii +http://purl.obolibrary.org/obo/UBERON_9900025 lateral compartment of leg muscle A skeletal muscle organ that is part of the lateral (fibular) fascial compartment of the leg, comprising the fibularis longus and fibularis brevis muscles, both arising from the lateral surface of the fibula and innervated by the superficial fibular nerve, acting to evert and weakly plantarflex the foot. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_lateral-compartmet-of-leg-muscle|PMID:30137811 UBERON:0014892 UBERON:0001446 UBERON:0035526 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Lateral_compartment_of_leg +http://purl.obolibrary.org/obo/UBERON_9900026 lateral posterior cervical intertransversarii muscle A muscle organ of the neck that arises from and inserts onto the posterior tubercles of the transverse processes of adjacent cervical vertebrae, lying lateral to the medial posterior cervical intertransversarii; together with its segmental fellows it laterally flexes the cervical vertebral column and is innervated by the ventral rami of the cervical spinal nerves. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_lateral-posterior-cervical-intertransversarii-muscle UBERON:0001630 UBERON:0000974 UBERON:0018143 UBERON:0018143 UBERON:0006838 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii +http://purl.obolibrary.org/obo/UBERON_9900030 levatores costarum breves of levator costarum muscle Short skeletal muscle fasciculi of the levator costarum muscle that arise from the tips of the transverse processes of the seventh cervical and upper eleven thoracic vertebrae and insert obliquely inferolaterally onto the external aspect of the superior border of the rib immediately below their origin, between the tubercle and the angle, elevating the ribs during forceful inspiration. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_levatores-costarum-breves-of-levator-costarum-muscle|PMID:4972578|PMID:3630603 UBERON:0014892 UBERON:8410070 UBERON:0001077 UBERON:0002228 UBERON:0006839 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Levatores_costarum_muscles|FMA:71437 +http://purl.obolibrary.org/obo/UBERON_9900031 levatores costarum longi of levator costarum muscle A muscle fasciculus that constitutes the longer subdivision of the four lower levatores costarum, arising from the tip of the transverse process of a thoracic vertebra (typically T8-T11) and passing obliquely downward and laterally to insert on the outer surface of the second rib below its vertebra of origin, between the tubercle and the angle. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_levatores-costarum-longi-of-levator-costarum-muscle|PMID:13129167 UBERON:0014892 UBERON:8410070 UBERON:0001077 UBERON:0002228 UBERON:0006839 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Levatores_costarum_muscles +http://purl.obolibrary.org/obo/UBERON_9900034 medial lumbar intertransversarii muscle A skeletal muscle organ that is one of a paired series of short segmental muscles passing from the accessory process of one lumbar vertebra to the mammillary process of the vertebra below, innervated by dorsal rami of the lumbar spinal nerves and acting to stabilise and laterally flex the lumbar spine. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_medial-lumbar-intertransversarii-muscle|PMID:7076562 UBERON:0014892 UBERON:0006074 UBERON:0001780 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii +http://purl.obolibrary.org/obo/UBERON_9900035 medial posterior cervical intertransversarii muscle A skeletal muscle organ that is the medial part of the posterior cervical intertransversarius, lying medial to the dorsal ramus of the cervical spinal nerve which pierces it, connecting the posterior tubercles of adjacent cervical vertebrae and acting to laterally flex the cervical spine. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_medial-posterior-cervical-intertransversarii-muscle|PMID:7076562 UBERON:0014892 UBERON:0006072 UBERON:0002413 UBERON:0002413 UBERON:0001780 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii +http://purl.obolibrary.org/obo/UBERON_9900037 multifidus cervicis muscle A skeletal muscle of the deep layer of the back, forming the cervical portion of the multifidus and part of the transversospinales muscle group. It arises from the superior articular processes of the lower cervical vertebrae (C4-C7) and ascends superomedially to insert into the spinous processes of vertebrae two to five segments above (C2-C5), acting in extension, ipsilateral lateral flexion and contralateral rotation of the cervical vertebral column. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_multifidus-cervicis-muscle|PMID:15706328 UBERON:0010990 UBERON:0006072 UBERON:0001077 UBERON:0001076 UBERON:0006839 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Multifidus_muscle +http://purl.obolibrary.org/obo/UBERON_9900038 multifidus lumborum muscle A skeletal muscle of the deep layer of the back, forming the lumbar portion of the multifidus and part of the transversospinales muscle group. It arises from the mammillary processes of the lumbar vertebrae and the posterior surface of the sacrum, and its fascicles ascend superomedially to insert into the spinous processes of vertebrae two to five segments above their origin, contributing to extension and segmental stabilisation of the lumbar vertebral column. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_multifidus-lumborum-muscle|PMID:23915550|PMID:23915551 UBERON:0010990 UBERON:0006074 UBERON:0001077 UBERON:0001076 UBERON:0006839 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Multifidus_muscle +http://purl.obolibrary.org/obo/UBERON_9900039 multifidus thoracis muscle A skeletal muscle of the deep layer of the back, forming the thoracic portion of the multifidus and part of the transversospinales muscle group. It arises from the transverse processes of the thoracic vertebrae and ascends superomedially to insert into the spinous processes of vertebrae two to five segments above its origin, producing extension, ipsilateral lateral flexion and contralateral rotation of the thoracic vertebral column. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_multifidus-thoracis-muscle|PMID:23915550 UBERON:0010990 UBERON:0006073 UBERON:0001077 UBERON:0001076 UBERON:0006839 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Multifidus_muscle +http://purl.obolibrary.org/obo/UBERON_9900049 puboanalis muscle A skeletal muscle of the pelvis that arises from the body of the pubis and descends to interdigitate with the longitudinal muscle of the anal canal, blending with fibres at the intersphincteric groove and perineal body. It forms the most medial component of the puborectalis sling of the levator ani and contributes to maintenance of the anorectal angle and faecal continence. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_puboanalis-muscle|PMID:21801920|PMID:18256862 UBERON:0001325 UBERON:0001326 UBERON:0001275 UBERON:0006654 UBERON:0011390 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Levator_ani +http://purl.obolibrary.org/obo/UBERON_9900050 puboperinealis muscle A muscle of the pelvis that arises from the inner surface of the pubic bone and inserts into the perineal body, forming part of the pubovisceral component of the levator ani muscle and contributing to support of the pelvic floor and elevation of the perineal body. https://fipat.library.dal.ca/ta2/|https://purl.org/ccf/ASCTB-TEMP_puboperineales-muscle|PMID:14990415 UBERON:0001325 UBERON:0001326 UBERON:0001275 UBERON:0006654 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 FMA:74028 +http://purl.obolibrary.org/obo/UBERON_9900061 sternal part of diaphragm An organ subunit of the diaphragm consisting of two small muscular slips that arise from the posterior aspect of the xiphoid process of the sternum and insert into the anterior margin of the central tendon, contributing the anterior portion of the diaphragmatic musculature. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_sternal-part-of-respiratory-diaphragm-muscle|PMID:23586979 UBERON:0000063 UBERON:0001103 UBERON:0002207 UBERON:0006670 UBERON:0001884 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 FMA:58278 +http://purl.obolibrary.org/obo/UBERON_9900062 sternocostal head of pectoralis major muscle A muscle head that forms the larger inferior portion of the pectoralis major, originating from the anterior surface of the sternum, the superior six costal cartilages, and the aponeurosis of the external oblique muscle, and inserting together with the clavicular head onto the lateral lip of the intertubercular groove of the humerus. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_sternocostal-head-of-pectoralis-major-muscle|Wikipedia:Pectoralis_major_muscle UBERON:0011906 UBERON:0002381 UBERON:0000975 UBERON:0000976 UBERON:0003726 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Pectoralis_major_muscle|FMA:32521 +http://purl.obolibrary.org/obo/UBERON_9900064 superior head of lateral pterygoid muscle A muscle head that constitutes the smaller, upper portion of the lateral pterygoid muscle, arising from the infratemporal surface of the greater wing of the sphenoid bone and inserting predominantly onto the articular disc and capsule of the temporomandibular joint; it acts mainly during closing and stabilises the disc during jaw movement. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_superior-head-of-lateral-pterygoid-muscle|PMID:9656947|PMID:7798474 UBERON:0011906 UBERON:0006719 UBERON:0006721 UBERON:0011319 UBERON:0013647 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Lateral_pterygoid_muscle +http://purl.obolibrary.org/obo/UBERON_9900067 thoracic intertransversarii muscle A skeletal muscle organ that is one of a series of small segmental muscles, typically present only between the lower thoracic vertebrae and between the last thoracic and first lumbar vertebra, connecting adjacent transverse processes and innervated by the dorsal rami of the thoracic spinal nerves. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_thoracic-intertransversarii-muscle|PMID:7076562 UBERON:0014892 UBERON:0006073 UBERON:0002347 UBERON:0002347 UBERON:0001780 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii +http://purl.obolibrary.org/obo/UBERON_9900074 ventral part of intertransversarii laterales lumborum muscle A skeletal muscle that is the anterior (ventral) division of the lateral lumbar intertransverse muscles, passing between the transverse processes of contiguous lumbar vertebrae in the lower back. Together with the dorsal part, it stabilises adjacent lumbar vertebrae and contributes to ipsilateral lateral flexion of the trunk; it is innervated by the ventral (anterior) rami of the lumbar spinal nerves. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_ventral-part-of-intertransversarii-laterales-lumborum-muscle|PMID:6226119|PMID:7076562 UBERON:0014892 UBERON:0008242 UBERON:0018146 UBERON:0018146 UBERON:0009624 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-05-11T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii diff --git a/src/templates/hra-muscular-reports/candidates.tsv b/src/templates/hra-muscular-reports/candidates.tsv index 84e6f1102..9342d6524 100644 --- a/src/templates/hra-muscular-reports/candidates.tsv +++ b/src/templates/hra-muscular-reports/candidates.tsv @@ -1,7 +1,40 @@ label as_iri uberon_id note +anterior vertebral muscle UBERON:0008549 confirmed_match (confidence: high) circular pharyngeal muscle UBERON:0001569 confirmed_match (confidence: high) +lateral vertebral muscle UBERON:0008611 confirmed_match (confidence: high) +hypothenar hand muscle UBERON:0014377 confirmed_match (confidence: high) +palmar interosseous muscle UBERON:0006505 confirmed_match (confidence: high) +plantar interosseous muscle UBERON:0006502 confirmed_match (confidence: high) +spinotransversales muscle UBERON:0002252 confirmed_match (confidence: high) +muscle of facial expression UBERON:0001577 confirmed_match (confidence: high) +intrinsic eye muscle UBERON:0011222 confirmed_match (confidence: high) +respiratory diaphragm muscle UBERON:0001103 confirmed_match (confidence: high) +tibalis anterior muscle UBERON:0001385 confirmed_match (confidence: high) +tibalis posterior muscle UBERON:0001667 confirmed_match (confidence: high) +left crus of lumbar part of respiratory diaphragm muscle UBERON:0014767 confirmed_match (confidence: high) aryepiglottic part of oblique arytenoid muscle UBERON:0011025 confirmed_match (confidence: high) +thyroepiglottic part of thyroarytenoid muscle UBERON:0010927 confirmed_match (confidence: high) +thyropharyngeal part of inferior pharyngeal constrictor muscle UBERON:0010936 confirmed_match (confidence: high) +right crus of lumbar part of respiratory diaphragm muscle UBERON:0014766 confirmed_match (confidence: high) costal part of respiratory diaphragm muscle UBERON:0035831 confirmed_match (confidence: high) +iliocostalis cervicalis muscle UBERON:0008546 confirmed_match (confidence: high) +pteryopharyngeal part of superior pharyngeal constrictor muscle UBERON:0010956 confirmed_match (confidence: high) ceratoglossus of hyoglossus muscle UBERON:0008428 confirmed_match (confidence: high) chondroglossus of hyoglossus muscle UBERON:0011535 confirmed_match (confidence: high) -anterior vertebral muscle UBERON:0008549 possible_match (UBERON:0008549 'prevertebral muscle' has the same definition (one of the muscles deep to the prevertebral fascia... including the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis). Synonym 'flexor muscle of vertebral column'. The TA2 term 'anterior vertebral muscle' is a synonymous regional grouping. Curator should confirm whether to map directly to UBERON:0008549, to its child UBERON:0017647 'prevertebral muscle of neck', or add as RELATED synonym. Definition uses attaches_to + innervated_by axioms (multi-axiom pattern), not the simple genus + part_of pattern, so this would be out of scope for the EC template even if added as a new term.) +superior longitudinal lingual muscle UBERON:0008582 confirmed_match (confidence: high) +transverse muscle UBERON:0008583 confirmed_match (confidence: high) +vertical muscle UBERON:0008584 confirmed_match (confidence: high) +opponens digiti minimi muscle UBERON:0036176 confirmed_match (confidence: high) +levator costarum muscle UBERON:8410070 confirmed_match (confidence: high) +external anal sphincter muscle UBERON:0001367 confirmed_match (confidence: high) +tensor fascia latae muscle UBERON:0001376 confirmed_match (confidence: high) +longus capitus muscle UBERON:0001563 confirmed_match (confidence: high) +spermatic cord muscle UBERON:0008488 confirmed_match (confidence: high) +sphincter urethrae muscle UBERON:0004917 confirmed_match (confidence: high) +musculus uvulae muscle UBERON:0010235 confirmed_match (confidence: high) +internal abdominal oblique muscle UBERON:0005454 confirmed_match (confidence: high) +frontal belly of occipitofrontalis muscle UBERON:0010952 confirmed_match (confidence: high) +rectus capitus anterior muscle UBERON:0008453 confirmed_match (confidence: high) +occipital belly of occipitofrontalis muscle UBERON:0010947 confirmed_match (confidence: high) +splenius capitus muscle UBERON:0000711 confirmed_match (confidence: high) +rectus capitius posterior minor muscle UBERON:0008455 confirmed_match (confidence: high) diff --git a/src/templates/hra-muscular-reports/errors.tsv b/src/templates/hra-muscular-reports/errors.tsv index 7717647e6..fbe56f1eb 100644 --- a/src/templates/hra-muscular-reports/errors.tsv +++ b/src/templates/hra-muscular-reports/errors.tsv @@ -3,3 +3,29 @@ anterior cervical intertransversarii muscle https://purl.org/ccf/ASCTB-TEMP_ante articularis genu muscle https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle fma_parent FMA:22424 Muscle of anterior compartment of thigh Subagent should resolve FMA→UBERON via OLS4 aryepiglottic part of oblique arytenoid muscle https://purl.org/ccf/ASCTB-TEMP_aryepiglottic-part-of-oblique-arytenoid-muscle fma_parent FMA:46583 Oblique arytenoid Subagent should resolve FMA→UBERON via OLS4 dorsal part of intertransversarii laterales lumborum muscle https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_meningohypophyseal-artery meningohypophyseal artery Parent not yet in UBERON; subagent should search OLS4 for correct parent +dorsum of foot muscle https://purl.org/ccf/ASCTB-TEMP_dorsum-of-foot-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_intertransversarii-laterales-lumborum-muscle intertransversarii laterales lumborum muscle Parent not yet in UBERON; subagent should search OLS4 for correct parent +inferior head of lateral pterygoid muscle https://purl.org/ccf/ASCTB-TEMP_inferior-head-of-lateral-pterygoid-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_supraperiosteal-arteriole supraperiosteal arteriole Parent not yet in UBERON; subagent should search OLS4 for correct parent +intertransversarii laterales lumborum muscle https://purl.org/ccf/ASCTB-TEMP_intertransversarii-laterales-lumborum-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle Parent not yet in UBERON; subagent should search OLS4 for correct parent +intrinsic eye muscle https://purl.org/ccf/ASCTB-TEMP_intrinsic-eye-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_posterolateral-spinal-vein posterolateral spinal vein Parent not yet in UBERON; subagent should search OLS4 for correct parent +left crus of lumbar part of respiratory diaphragm muscle https://purl.org/ccf/ASCTB-TEMP_left-crus-of-lumbar-part-of-respiratory-diaphragm-muscle fma_parent FMA:323951 Pre-aortic thoracic lymph node group Subagent should resolve FMA→UBERON via OLS4 +levatores costarum breves of levator costarum muscle https://purl.org/ccf/ASCTB-TEMP_levatores-costarum-breves-of-levator-costarum-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_thoracic-wall-muscle thoracic wall muscle Parent not yet in UBERON; subagent should search OLS4 for correct parent +levatores costarum longi of levator costarum muscle https://purl.org/ccf/ASCTB-TEMP_levatores-costarum-longi-of-levator-costarum-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_levator-costarum-muscle levator costarum muscle Parent not yet in UBERON; subagent should search OLS4 for correct parent +longitudinal pharyngeal muscle https://purl.org/ccf/ASCTB-TEMP_longitudinal-pharyngeal-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_vasa-recta-of-colon vasa recta of colon Parent not yet in UBERON; subagent should search OLS4 for correct parent +medial lumbar intertransversarii muscle https://purl.org/ccf/ASCTB-TEMP_medial-lumbar-intertransversarii-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle Parent not yet in UBERON; subagent should search OLS4 for correct parent +medial posterior cervical intertransversarii muscle https://purl.org/ccf/ASCTB-TEMP_medial-posterior-cervical-intertransversarii-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle Parent not yet in UBERON; subagent should search OLS4 for correct parent +occipital belly of occipitofrontalis muscle https://purl.org/ccf/ASCTB-TEMP_occipital-belly-of-occipitofrontalis-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_neuromeningeal-trunk neuromeningeal trunk Parent not yet in UBERON; subagent should search OLS4 for correct parent +pelvic floor muscle https://purl.org/ccf/ASCTB-TEMP_pelvic-floor-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_periductal-branch-of-lobular-artery-of-pancreas periductal branch of lobular artery of pancreas Parent not yet in UBERON; subagent should search OLS4 for correct parent +plantar interosseous muscle https://purl.org/ccf/ASCTB-TEMP_plantar-interosseous-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_sheathed-capillary-of-spleen sheathed capillary of spleen, Sheathed capillary of spleen Parent not yet in UBERON; subagent should search OLS4 for correct parent +rectus capitius posterior minor muscle https://purl.org/ccf/ASCTB-TEMP_rectus-capitius-posterior-minor-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_submucosal-artery-of-colon submucosal artery of colon Parent not yet in UBERON; subagent should search OLS4 for correct parent +rectus capitus anterior muscle https://purl.org/ccf/ASCTB-TEMP_rectus-capitus-anterior-muscle unknown_parent UBERON:0001250, UBERON:0010400 red pulp of spleen, spleen trabecular vein Unrecognised parent ID format +respiratory diaphragm muscle https://purl.org/ccf/ASCTB-TEMP_respiratory-diaphragm-muscle fma_parent FMA:12252 Subclavian lymphatic trunk Subagent should resolve FMA→UBERON via OLS4 +right crus of lumbar part of respiratory diaphragm muscle https://purl.org/ccf/ASCTB-TEMP_right-crus-of-lumbar-part-of-respiratory-diaphragm-muscle fma_parent FMA:5841 Left lumbar lymphatic trunk Subagent should resolve FMA→UBERON via OLS4 +segmental back muscle https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_lobar-artery-of-spleen lobar artery of spleen Parent not yet in UBERON; subagent should search OLS4 for correct parent +splenius capitus muscle https://purl.org/ccf/ASCTB-TEMP_splenius-capitus-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_spinotransversales-muscle spinotransversales muscle Parent not yet in UBERON; subagent should search OLS4 for correct parent +sternal part of respiratory diaphragm muscle https://purl.org/ccf/ASCTB-TEMP_sternal-part-of-respiratory-diaphragm-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_respiratory-diaphragm-muscle respiratory diaphragm muscle Parent not yet in UBERON; subagent should search OLS4 for correct parent +thoracic intertransversarii muscle https://purl.org/ccf/ASCTB-TEMP_thoracic-intertransversarii-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle Parent not yet in UBERON; subagent should search OLS4 for correct parent +thyroepiglottic part of thyroarytenoid muscle https://purl.org/ccf/ASCTB-TEMP_thyroepiglottic-part-of-thyroarytenoid-muscle fma_parent FMA:46588 Thyro-arytenoid Subagent should resolve FMA→UBERON via OLS4 +thyropharyngeal part of inferior pharyngeal constrictor muscle https://purl.org/ccf/ASCTB-TEMP_thyropharyngeal-part-of-inferior-pharyngeal-constrictor-muscle fma_parent FMA:46623 Inferior pharyngeal constrictor Subagent should resolve FMA→UBERON via OLS4 +tibalis anterior muscle https://purl.org/ccf/ASCTB-TEMP_tibalis-anterior-muscle fma_parent FMA:22472 Muscle of anterior compartment of leg Subagent should resolve FMA→UBERON via OLS4 +tibalis posterior muscle https://purl.org/ccf/ASCTB-TEMP_tibalis-posterior-muscle fma_parent FMA:22474 Muscle of posterior compartment of leg Subagent should resolve FMA→UBERON via OLS4 +ventral part of intertransversarii laterales lumborum muscle https://purl.org/ccf/ASCTB-TEMP_ventral-part-of-intertransversarii-laterales-lumborum-muscle asctb_temp_parent https://purl.org/ccf/ASCTB-TEMP_intertransversarii-laterales-lumborum-muscle intertransversarii laterales lumborum muscle Parent not yet in UBERON; subagent should search OLS4 for correct parent diff --git a/src/templates/hra-muscular-reports/input.tsv b/src/templates/hra-muscular-reports/input.tsv index ef5a62910..488ac52f7 100644 --- a/src/templates/hra-muscular-reports/input.tsv +++ b/src/templates/hra-muscular-reports/input.tsv @@ -9,3 +9,68 @@ muscular-system https://purl.org/ccf/ASCTB-TEMP_circular-pharyngeal-muscle circu muscular-system https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle clavicular head of pectoralis major muscle UBERON:0002381 pectoralis major https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf muscular-system https://purl.org/ccf/ASCTB-TEMP_costal-part-of-respiratory-diaphragm-muscle costal part of respiratory diaphragm muscle UBERON:0000975 sternum https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf muscular-system https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle dorsal part of intertransversarii laterales lumborum muscle https://purl.org/ccf/ASCTB-TEMP_meningohypophyseal-artery meningohypophyseal artery https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_dorsum-of-foot-muscle dorsum of foot muscle https://purl.org/ccf/ASCTB-TEMP_intertransversarii-laterales-lumborum-muscle intertransversarii laterales lumborum muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_external-anal-sphincter-muscle external anal sphincter muscle UBERON:0001876 amygdala https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_external-ear-muscle external ear muscle UBERON:0001678 temporal bone https://fipat.library.dal.ca/ta2/ group +muscular-system https://purl.org/ccf/ASCTB-TEMP_frontal-belly-of-occipitofrontalis-muscle frontal belly of occipitofrontalis muscle UBERON:0005893 leg bone https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_hamstring-portion-of-adductor-magnus-muscle hamstring portion of adductor magnus muscle UBERON:0001092 vertebral bone 1 https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_hypothenar-hand-muscle hypothenar hand muscle UBERON:0001677 sphenoid bone https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_iliocostalis-cervicalis-muscle iliocostalis cervicalis muscle UBERON:0001272 innominate bone https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_inferior-head-of-lateral-pterygoid-muscle inferior head of lateral pterygoid muscle https://purl.org/ccf/ASCTB-TEMP_supraperiosteal-arteriole supraperiosteal arteriole https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_inferior-longitudinal-lingual-muscle inferior longitudinal lingual muscle UBERON:0001194 splenic artery https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_intermediate-back-muscle intermediate back muscle UBERON:0002397 maxilla https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_internal-abdominal-oblique-muscle internal abdominal oblique muscle UBERON:0003690 fused sacrum https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_interspinales-cervicalis-muscle interspinales cervicalis muscle UBERON:0000979 tibia https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_intertransversarii-laterales-lumborum-muscle intertransversarii laterales lumborum muscle https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_intrinsic-eye-muscle intrinsic eye muscle https://purl.org/ccf/ASCTB-TEMP_posterolateral-spinal-vein posterolateral spinal vein https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_lateral-compartmet-of-leg-muscle lateral compartmet of leg muscle UBERON:0001537 anterior tibial artery https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_lateral-posterior-cervical-intertransversarii-muscle lateral posterior cervical intertransversarii muscle UBERON:0001546 posterior tibial vein https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_lateral-vertebral-muscle lateral vertebral muscle UBERON:0002250 popliteal artery https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_left-crus-of-lumbar-part-of-respiratory-diaphragm-muscle left crus of lumbar part of respiratory diaphragm muscle http://purl.org/sig/ont/fma/fma323951 Pre-aortic thoracic lymph node group https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_levator-costarum-muscle levator costarum muscle UBERON:0001677 sphenoid bone https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_levatores-costarum-breves-of-levator-costarum-muscle levatores costarum breves of levator costarum muscle https://purl.org/ccf/ASCTB-TEMP_thoracic-wall-muscle thoracic wall muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_levatores-costarum-longi-of-levator-costarum-muscle levatores costarum longi of levator costarum muscle https://purl.org/ccf/ASCTB-TEMP_levator-costarum-muscle levator costarum muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_longitudinal-pharyngeal-muscle longitudinal pharyngeal muscle https://purl.org/ccf/ASCTB-TEMP_vasa-recta-of-colon vasa recta of colon https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_longus-capitus-muscle longus capitus muscle UBERON:0002377 muscle of neck https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_medial-lumbar-intertransversarii-muscle medial lumbar intertransversarii muscle https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_medial-posterior-cervical-intertransversarii-muscle medial posterior cervical intertransversarii muscle https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_middle-ear-muscle middle ear muscle UBERON:0002376 cranial muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_multifidus-cervicis-muscle multifidus cervicis muscle UBERON:0010990 transversospinales muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_multifidus-lumborum-muscle multifidus lumborum muscle UBERON:0010990 transversospinales muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_multifidus-thoracis-muscle multifidus thoracis muscle UBERON:0010990 transversospinales muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_muscle-of-facial-expression muscle of facial expression UBERON:0002376 cranial muscle https://fipat.library.dal.ca/ta2/ group +muscular-system https://purl.org/ccf/ASCTB-TEMP_musculus-uvulae-muscle musculus uvulae muscle UBERON:0003682 palatal muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_occipital-belly-of-occipitofrontalis-muscle occipital belly of occipitofrontalis muscle https://purl.org/ccf/ASCTB-TEMP_neuromeningeal-trunk neuromeningeal trunk https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_opponens-digiti-minimi-muscle opponens digiti minimi muscle UBERON:0001624 anterior cerebral artery https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_palmar-interosseous-muscle palmar interosseous muscle UBERON:0009095 tip of renal papilla https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_pelvic-floor-muscle pelvic floor muscle https://purl.org/ccf/ASCTB-TEMP_periductal-branch-of-lobular-artery-of-pancreas periductal branch of lobular artery of pancreas https://fipat.library.dal.ca/ta2/ group +muscular-system https://purl.org/ccf/ASCTB-TEMP_plantar-interosseous-muscle plantar interosseous muscle https://purl.org/ccf/ASCTB-TEMP_sheathed-capillary-of-spleen sheathed capillary of spleen, Sheathed capillary of spleen https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_posterior-abdominal-wall-muscle posterior abdominal wall muscle UBERON:0001092 vertebral bone 1 https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_pteryopharyngeal-part-of-superior-pharyngeal-constrictor-muscle pteryopharyngeal part of superior pharyngeal constrictor muscle UBERON:0001272 innominate bone https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_puboanalis-muscle puboanalis muscle UBERON:8600052 subsegmental pulmonary vein https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_puboperineales-muscle puboperineales muscle UBERON:0015173 helicine branch of uterine artery https://fipat.library.dal.ca/ta2/ leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_rectus-capitius-posterior-minor-muscle rectus capitius posterior minor muscle https://purl.org/ccf/ASCTB-TEMP_submucosal-artery-of-colon submucosal artery of colon https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_rectus-capitus-anterior-muscle rectus capitus anterior muscle UBERON:0001250, UBERON:0010400 red pulp of spleen, spleen trabecular vein https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_respiratory-diaphragm-muscle respiratory diaphragm muscle http://purl.org/sig/ont/fma/fma12252 Subclavian lymphatic trunk https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_right-crus-of-lumbar-part-of-respiratory-diaphragm-muscle right crus of lumbar part of respiratory diaphragm muscle http://purl.org/sig/ont/fma/fma5841 Left lumbar lymphatic trunk https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle https://purl.org/ccf/ASCTB-TEMP_lobar-artery-of-spleen lobar artery of spleen https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_sole-of-foot-muscle sole of foot muscle UBERON:0001383 muscle of leg https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_spermatic-cord-muscle spermatic cord muscle UBERON:0002378 muscle of abdomen https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_sphincter-urethrae-muscle sphincter urethrae muscle UBERON:0002379 perineal muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_spinotransversales-muscle spinotransversales muscle UBERON:0002324 muscle of back https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_splenius-capitus-muscle splenius capitus muscle https://purl.org/ccf/ASCTB-TEMP_spinotransversales-muscle spinotransversales muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_sternal-part-of-respiratory-diaphragm-muscle sternal part of respiratory diaphragm muscle https://purl.org/ccf/ASCTB-TEMP_respiratory-diaphragm-muscle respiratory diaphragm muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_sternocostal-head-of-pectoralis-major-muscle sternocostal head of pectoralis major muscle UBERON:0002381 pectoralis major https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_superficial-back-muscle superficial back muscle UBERON:0002324 muscle of back https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_superior-head-of-lateral-pterygoid-muscle superior head of lateral pterygoid muscle UBERON:0006719 lateral pterygoid muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_superior-longitudinal-lingual-muscle superior longitudinal lingual muscle UBERON:0001576 intrinsic muscle of tongue https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_tensor-fascia-latae-muscle tensor fascia latae muscle UBERON:0002000 gluteal muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_thoracic-intertransversarii-muscle thoracic intertransversarii muscle https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_thoracic-wall-muscle thoracic wall muscle UBERON:0002426 chest muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 group +muscular-system https://purl.org/ccf/ASCTB-TEMP_thyroepiglottic-part-of-thyroarytenoid-muscle thyroepiglottic part of thyroarytenoid muscle http://purl.org/sig/ont/fma/fma46588 Thyro-arytenoid https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_thyropharyngeal-part-of-inferior-pharyngeal-constrictor-muscle thyropharyngeal part of inferior pharyngeal constrictor muscle http://purl.org/sig/ont/fma/fma46623 Inferior pharyngeal constrictor https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_tibalis-anterior-muscle tibalis anterior muscle http://purl.org/sig/ont/fma/fma22472 Muscle of anterior compartment of leg https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_tibalis-posterior-muscle tibalis posterior muscle http://purl.org/sig/ont/fma/fma22474 Muscle of posterior compartment of leg https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_transverse-muscle transverse muscle UBERON:0001576 intrinsic muscle of tongue https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_ventral-part-of-intertransversarii-laterales-lumborum-muscle ventral part of intertransversarii laterales lumborum muscle https://purl.org/ccf/ASCTB-TEMP_intertransversarii-laterales-lumborum-muscle intertransversarii laterales lumborum muscle https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf +muscular-system https://purl.org/ccf/ASCTB-TEMP_vertical-muscle vertical muscle UBERON:0001576 intrinsic muscle of tongue https://fipat.library.dal.ca/ta2/, ISBN:9780323393225 leaf diff --git a/src/templates/hra-muscular-reports/manual_curation.tsv b/src/templates/hra-muscular-reports/manual_curation.tsv index b55e48338..62faa3b81 100644 --- a/src/templates/hra-muscular-reports/manual_curation.tsv +++ b/src/templates/hra-muscular-reports/manual_curation.tsv @@ -1,2 +1,4 @@ label definition reason similar_terms suggestion -anterior vertebral muscle A group of muscles deep to the prevertebral fascia on the anterior surface of the cervical and superior thoracic vertebrae, comprising the longus colli, longus capitis, rectus capitis anterior, and rectus capitis lateralis muscles; innervated by anterior rami of cervical spinal nerves; functions in flexion of the head and neck. The closest existing UBERON term is UBERON:0008549 (prevertebral muscle) which uses 'is_a + attaches_to + innervated_by' axioms — NOT the simple genus + part_of pattern supported by the groups template. If treated as a confirmed/possible match instead, no new term is needed. Curator should decide between mapping to UBERON:0008549 vs creating 'anterior vertebral muscle' as a synonym. UBERON:0008549=prevertebral muscle; UBERON:0017647=prevertebral muscle of neck Most likely outcome: add 'anterior vertebral muscle' as RELATED synonym to UBERON:0008549, no new term needed. +pelvic floor muscle A group of skeletal muscles that form the floor of the pelvic cavity, supporting the pelvic viscera and surrounding the urogenital and anal openings, comprising the levator ani and coccygeus muscles. No UBERON term currently exists for 'pelvic floor' or 'pelvic diaphragm' as an anatomical region — only the constituent muscles (levator ani UBERON:0001326, coccygeus UBERON:0001327) and the broader pelvic region (UBERON:0002355) are represented. The simple genus + part_of pattern needs a target term for the pelvic floor itself. UBERON:0001325=muscle of pelvis; UBERON:0001326=levator ani muscle; UBERON:0001327=coccygeus muscle Either (a) add a new region term 'pelvic floor' / 'pelvic diaphragm' and define this group as skeletal muscle organ part_of that, or (b) define as has_part levator_ani and has_part coccygeus, or (c) treat as a subclass of muscle of pelvis (UBERON:0001325) without an EC definition. +dorsum of foot muscle A group of skeletal muscles located on the dorsal aspect of the foot, comprising the extensor digitorum brevis and extensor hallucis brevis, which act to extend the toes. No UBERON term exists for 'dorsum of foot' / 'dorsal region of pes' as a region. The only dorsal pes term found is UBERON:0006499 dorsal pes interosseous muscle (a specific muscle, not a region). Simple genus + part_of pattern cannot be applied without a region target. UBERON:0008338=plantar part of pes Add a new region term 'dorsal part of pes' (analogous to UBERON:0008338 plantar part of pes) and define this group as skeletal muscle organ part_of that region. Alternatively define by membership (has_part extensor digitorum brevis, has_part extensor hallucis brevis). +longitudinal pharyngeal muscle A group of skeletal muscles oriented longitudinally in the pharyngeal wall that act to elevate the pharynx and larynx during swallowing, comprising the stylopharyngeus, palatopharyngeus, and salpingopharyngeus muscles. This is a sub-grouping of pharyngeal muscles defined by fibre orientation (longitudinal) within the pharyngeal wall — not a simple part_of-defined subset. UBERON's circular counterpart (UBERON:0001569 constrictor muscle of pharynx) is is_a UBERON:0000933 chordate pharyngeal muscle without an EC axiom on orientation. The simple genus + part_of pattern cannot express fibre orientation. UBERON:0001569=constrictor muscle of pharynx; UBERON:0000933=chordate pharyngeal muscle Either model as subclass of chordate pharyngeal muscle (UBERON:0000933) without an EC, mirroring how UBERON:0001569 is handled, or add a new relation/property for muscle fibre orientation. Note that circular pharyngeal muscle (the sibling) maps directly to UBERON:0001569 — see confirmed_matches. diff --git a/src/templates/hra-muscular-reports/name_corrections.tsv b/src/templates/hra-muscular-reports/name_corrections.tsv new file mode 100644 index 000000000..0e3de9fd2 --- /dev/null +++ b/src/templates/hra-muscular-reports/name_corrections.tsv @@ -0,0 +1,18 @@ +source_label corrected_label reason +tibalis anterior muscle tibialis anterior muscle Typo: 'tibalis' should be 'tibialis'. The corrected form is the standard TA2 name and is already recorded as an EXACT synonym of UBERON:0001385. +tibalis posterior muscle tibialis posterior muscle Spelling error — missing 'i'. Standard anatomical term is 'tibialis posterior muscle' (already a related synonym on UBERON:0001667). Term is a confirmed existing match so no new term is needed; record correction for the candidates/QC report. +interspinales cervicalis muscle interspinales cervicis muscle TA2 / standard anatomical nomenclature uses 'musculi interspinales cervicis' (genitive 'cervicis', not 'cervicalis'). 'Cervicalis' is grammatically the adjective form, but the established TA term is 'interspinales cervicis'. Keep 'interspinales cervicalis muscle' as a related synonym. +inferior longitudinal lingual muscle inferior longitudinal muscle of tongue UBERON convention (see UBERON:0008582 'superior longitudinal muscle of tongue', UBERON:0008583 'transverse muscle of tongue', UBERON:0008584 'vertical muscle of tongue') uses 'X muscle of tongue' rather than 'X lingual muscle'. Keep source name as EXACT synonym. +iliocostalis cervicalis muscle iliocostalis cervicis muscle Standard TA2 form uses Latin genitive 'cervicis' (of the neck), not adjectival 'cervicalis'. UBERON:0008546 uses 'iliocostalis cervicis muscle'. Source spelling could be retained as RELATED synonym. +pteryopharyngeal part of superior pharyngeal constrictor muscle pterygopharyngeal part of superior pharyngeal constrictor muscle Source spelling 'pteryopharyngeal' is missing the 'g' from the Greek root 'pteryg-' (wing, referring to the pterygoid process). Standard TA2/FMA/UBERON form is 'pterygopharyngeal' (UBERON:0010956, FMA:46638). Source spelling could be retained as RELATED synonym. +lateral compartmet of leg muscle lateral compartment of leg muscle Typo in source label: 'compartmet' -> 'compartment'. Keep source name as related synonym. +transverse muscle transverse muscle of tongue Source label 'transverse muscle' is ambiguous outside the lingual context. UBERON's canonical label is 'transverse muscle of tongue' (UBERON:0008583). Already carries 'transverse muscle' as a RELATED synonym, so no synonym addition is needed. +vertical muscle vertical muscle of tongue Source label 'vertical muscle' is ambiguous outside the lingual context. UBERON's canonical label is 'vertical muscle of tongue' (UBERON:0008584). Already carries 'vertical muscle' as a RELATED synonym, so no synonym addition is needed. +superior longitudinal lingual muscle superior longitudinal muscle of tongue Source label uses 'lingual muscle' word order; UBERON's canonical label is 'superior longitudinal muscle of tongue' (UBERON:0008582). Consider adding 'superior longitudinal lingual muscle' as an EXACT synonym to aid matching from HRA/ASCTB sources. +tensor fascia latae muscle tensor fasciae latae muscle Standard anatomical Latin uses the genitive 'fasciae' (of the fascia), not nominative 'fascia'. UBERON:0001376 already carries 'tensor fasciae lata muscle' as an EXACT synonym; the source variant 'tensor fascia latae muscle' could be added as an additional synonym if not already covered. +longus capitus muscle longus capitis muscle 'capitus' is a misspelling of the Latin genitive 'capitis' (of the head). Standard anatomical term is 'longus capitis muscle' (TA2). Already present in UBERON as UBERON:0001563 with the misspelled form already captured as a RELATED synonym. +puboperineales muscle puboperinealis muscle TA2 Latin form is 'musculus puboperinealis' (singular); 'puboperineales' is the plural Latin adjective form used inconsistently. The standard English label is 'puboperinealis muscle' or 'puboperineal muscle'. Keep source name as a synonym. +rectus capitus anterior muscle rectus capitis anterior muscle Standard anatomical Latin is 'capitis' (genitive of caput), not 'capitus'. The source variant is already captured as a RELATED synonym on UBERON:0008453. +sternal part of respiratory diaphragm muscle sternal part of diaphragm UBERON uses 'diaphragm' (UBERON:0001103) as the standard label; FMA and TA2 use 'sternal part of diaphragm' (FMA:58278, 'pars sternalis diaphragmatis'). The source 'respiratory diaphragm muscle' phrasing is non-standard. Keep source name as RELATED synonym. +splenius capitus muscle splenius capitis 'capitus' is a misspelling of the Latin genitive 'capitis' (of the head). Standard anatomical nomenclature (TA2, FMA:22653) uses 'splenius capitis'. The existing UBERON:0000711 already carries 'splenius capitis muscle' as an EXACT synonym. Source label should be treated as a typographical variant; no new term required. +rectus capitius posterior minor muscle rectus capitis posterior minor Input contains a misspelling: 'capitius' is a typo for 'capitis' (genitive of Latin caput, head). The correctly spelled term already exists in UBERON as UBERON:0008455. The variant 'rectus capitus posterior minor muscle' is already registered there as a RELATED synonym; the input form 'rectus capitius posterior minor muscle' could also be added as an additional misspelling synonym if desired. From 0f2984b892ab714f196c18a78c8422f85080089b Mon Sep 17 00:00:00 2001 From: David Osumi-Sutherland Date: Mon, 11 May 2026 17:12:54 +0100 Subject: [PATCH 09/22] Delete hra-muscular.template.tsv --- src/templates/hra-muscular.template.tsv | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 src/templates/hra-muscular.template.tsv diff --git a/src/templates/hra-muscular.template.tsv b/src/templates/hra-muscular.template.tsv deleted file mode 100644 index 625fd33b5..000000000 --- a/src/templates/hra-muscular.template.tsv +++ /dev/null @@ -1,6 +0,0 @@ -ID LABEL Definition def_xref is_a part_of In_subset Date Contributor Present_in_taxon Wikipedia_image xref -ID LABEL A IAO:0000115 >A oboInOwl:hasDbXref SPLIT=| SC % SC BFO:0000050 some % AI oboInOwl:inSubset AT dcterms:date^^xsd:dateTime AI dcterms:contributor AI RO:0002175 A foaf:depiction A oboInOwl:hasDbXref SPLIT=| -http://purl.obolibrary.org/obo/UBERON_9900001 anterior cervical intertransversarii muscle A muscle organ that is one of the small, paired segmental muscles of the neck connecting the anterior tubercles of the transverse processes of two adjacent cervical vertebrae. These muscles span from C1-C2 (or C2-C3) through C7-T1, lying lateral to the longus colli muscle, are innervated by the anterior rami of the cervical spinal nerves, and contribute to lateral flexion and proprioceptive stabilisation of the cervical spine. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle|PMID:7076562 UBERON:0001630 UBERON:0000974 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii|FMA:32530 -http://purl.obolibrary.org/obo/UBERON_9900003 articularis genu muscle A muscle organ of the anterior compartment of the thigh, lying deep to the vastus intermedius, that originates from the anterior surface of the distal femur and inserts into the suprapatellar bursa and synovial membrane of the knee joint, retracting the bursa superiorly during knee extension to prevent its impingement between the patella and femur. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle|PMID:30229230|PMID:33215156 UBERON:0001630 UBERON:0000376 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 https://upload.wikimedia.org/wikipedia/commons/2/2b/Gray244.png Wikipedia:Articularis_genus_muscle|FMA:22441 -http://purl.obolibrary.org/obo/UBERON_9900008 clavicular head of pectoralis major muscle A muscle head that is the superior portion of the pectoralis major, originating from the anterior surface of the medial half of the clavicle and converging with the sternocostal head into a flat tendon inserted on the lateral lip of the intertubercular groove of the humerus; it is innervated by the lateral pectoral nerve (C5-C6) and acts to flex the humerus. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle|PMID:30252247|PMID:25345076 UBERON:0011906 UBERON:0002381 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 -http://purl.obolibrary.org/obo/UBERON_9900010 dorsal part of intertransversarii laterales lumborum muscle A muscle organ that is the posterior (dorsal) subdivision of the lateral intertransversarii lumborum, originating from the accessory process of one lumbar vertebra and inserting onto the transverse process of the consecutive lumbar vertebra; together with the ventral part it acts in ipsilateral lateral flexion and stabilisation of the lumbar spine and is innervated by the anterior rami of the lumbar spinal nerves. https://fipat.library.dal.ca/ta2/|ISBN:9780323393225|https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle|PMID:6226119 UBERON:0001630 UBERON:0008242 http://purl.obolibrary.org/obo/uberon/core#added_by_HRA 2026-04-27T00:00:00Z https://orcid.org/0000-0002-7073-9172 http://purl.obolibrary.org/obo/NCBITaxon_9606 Wikipedia:Intertransversarii From 0fdd84db64f5e1d55b4799f9065ca981a2129572 Mon Sep 17 00:00:00 2001 From: David Osumi-Sutherland Date: Mon, 11 May 2026 17:35:00 +0100 Subject: [PATCH 10/22] Add consolidated unresolvable.tsv report from the full muscular-system run MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 26 unresolvable notes extracted from per-term JSON outputs in bulk_ntr_workflow/outputs/definitions/. Most are wrong-domain parent issues in HRA source data (sternum→diaphragm, splenic artery→tongue muscle, innominate bone→pharyngeal muscle, meningohypophyseal artery→ lumbar muscle, anterior cerebral artery→hand muscle, fused sacrum→ abdominal muscle, etc.). Workflow gap noted: merge_definitions.py currently writes aggregated reports for confirmed_matches, name_corrections, out_of_scope, and manual_curation, but NOT for unresolvable. Adding this aggregation to the merge script would surface these systematically without manual extraction. Tracked for follow-up. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../hra-muscular-reports/unresolvable.tsv | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/templates/hra-muscular-reports/unresolvable.tsv diff --git a/src/templates/hra-muscular-reports/unresolvable.tsv b/src/templates/hra-muscular-reports/unresolvable.tsv new file mode 100644 index 000000000..bd5827917 --- /dev/null +++ b/src/templates/hra-muscular-reports/unresolvable.tsv @@ -0,0 +1,27 @@ +source_group label_or_field reason suggestion +needs_mapping_fma_12252 NEEDS_MAPPING:FMA:12252 (parent) The supplied FMA parent ID FMA:12252 resolves to 'Subclavian lymphatic trunk' in FMA, which is not anatomically a parent of a diaphragm muscle. Likely an input data error; the correct FMA ID for diaphragm is FMA:13295. Treat as input error. The term itself is a confirmed match for UBERON:0001103, so the parent mapping question is moot — exclude from template. +needs_mapping_fma_22424 articularis genu muscle (parent FMA:22424) Source parent FMA:22424 is the articularis genus muscle itself (self-referential mapping in the ASCTB input). No UBERON equivalent exists for this term — it is the new term being created. Genus resolved to UBERON:0001630 (muscle organ) and part_of to UBERON:0000376 (hindlimb stylopod / thigh) by analogy with UBERON:0001379 (vastus lateralis). Accept the leaf_template_rows mapping; no further FMA→UBERON parent lookup is needed. +needs_mapping_fma_22424 articularis genu muscle has_muscle_insertion Anatomical insertion is on the suprapatellar bursa / synovial membrane of the knee joint. UBERON currently lacks specific terms for 'suprapatellar bursa' or 'synovial membrane of knee joint capsule'. Omit has_muscle_insertion for now; curator may add later if/when those structures are added to UBERON. +needs_mapping_fma_323951 _parent_FMA:323951 FMA:323951 (lumbar part of diaphragm) is not directly xref'd in UBERON. The closest UBERON concept is UBERON:0014765 'crus of diaphragm' (which is the lumbar/vertebral part of the diaphragm). Not needed here because the child term itself matches an existing UBERON term. If a separate UBERON term for the lumbar part of the diaphragm is desired, it could be added with FMA:323951 as xref; otherwise treat UBERON:0014765 as functionally equivalent. +uberon_0000975 __parent_id__ Supplied parent UBERON:0000975 is 'sternum' — wrong anatomical domain for a part of the diaphragm. The correct parent for a costal-diaphragm subdivision is UBERON:0001103 (diaphragm). The existing UBERON term UBERON:0035831 (costal diaphragm) already has 'part_of UBERON:0001103'. Use UBERON:0001103 (diaphragm) as the parent. No new term needed: confirmed match to UBERON:0035831 makes this term ineligible for the leaf template. +uberon_0000979 interspinales cervicalis muscle Source-supplied parent_id UBERON:0000979 resolves to 'tibia', which is clearly an upstream data error (interspinales cervicis is a deep neck muscle, not a leg bone). Used anatomical knowledge and similar UBERON deep neck muscles (rectus capitis posterior major UBERON:0008454, longus colli UBERON:0001121, semispinalis cervicis precedent) to determine the appropriate genus and part_of. Curator should ignore the source UBERON:0000979 parent assignment. The chosen genus 'muscle of vertebral column' (UBERON:0004518) is consistent with other named vertebral-column muscles in UBERON; part_of 'neck' (UBERON:0000974) follows the precedent of rectus capitis posterior major. has_muscle_origin and has_muscle_insertion are both set to UBERON:0001076 (neural spine / spinous process of vertebra) because the muscle spans between adjacent cervical spinous processes; UBERON does not currently have a more specific 'spinous process of cervical vertebra' class. innervated_by is the dorsal ramus of spinal nerve (UBERON:0006839); a more specific 'medial branch of dorsal ramus of cervical spinal nerve' class does not exist in UBERON. +uberon_0001092 hamstring portion of adductor magnus muscle Source parent UBERON:0001092 (vertebral bone 1 / atlas vertebra) is anatomically incorrect for a thigh muscle subdivision. Refined parent is UBERON:0000370 (adductor magnus), with the term modelled as a muscle head (UBERON:0011906) part_of adductor magnus. Use UBERON:0000370 as the part_of parent. UBERON:0000370's own definition explicitly describes this 'hamstring portion' as the part arising from the ischial tuberosity. +uberon_0001194 inferior longitudinal lingual muscle Input parent_id UBERON:0001194 resolves to 'splenic artery' — clearly wrong for this term. Correct parent assigned from anatomical context: UBERON:0001576 'intrinsic muscle of tongue' (genus), mirroring sibling intrinsic tongue muscles (UBERON:0008582 superior longitudinal, UBERON:0008583 transverse, UBERON:0008584 vertical). Verify upstream parent ID assignment; the source row likely intended UBERON:0001576 (intrinsic muscle of tongue) or UBERON:0000378 (tongue muscle). +uberon_0001537 lateral compartment of leg muscle Source-supplied parent UBERON:0001537 refers to 'anterior tibial artery', not an anatomical region containing leg muscles — clearly a wrong mapping in the input. No existing UBERON class for 'lateral compartment of leg' (the fascial compartment) was found via awk over uberon-edit.obo, so no part_of target could be populated. Closest precedent term is UBERON:0002463 'muscle of posterior compartment of hindlimb stylopod' which uses is_a UBERON:0014892 (skeletal muscle organ, vertebrate) plus muscle-overlay relations; this term follows that pattern. Conceptually this is a collective/group class (fibularis longus + fibularis brevis); curator may wish to (a) reroute to the groups template and/or (b) first add a new UBERON term for 'lateral compartment of leg' (subdivision of leg) to serve as a proper part_of target. Curator: confirm name correction; consider creating UBERON term for 'lateral compartment of leg' (fascial compartment) before finalising, then add relationship: part_of . Alternatively, reclassify as group term with genus UBERON:0014892 and location set to the new compartment term. +uberon_0001546 lateral posterior cervical intertransversarii muscle Source parent_id UBERON:0001546 resolves to 'posterior tibial vein', which is anatomically incorrect for a cervical paraspinal muscle. No specific UBERON term currently exists for this muscle; closest existing classes are UBERON:0001630 (muscle organ) as genus and UBERON:0004465 (musculature of neck) as collective. Existing 'm. intertransversarius capitis' classes (UBERON:3010664, UBERON:3010667) are amphibian-sourced and not equivalent. Use UBERON:0001630 (muscle organ) as is_a and UBERON:0000974 (neck) as part_of, with has_muscle_origin/insertion = UBERON:0018143 (transverse process of cervical vertebra) and innervated_by = UBERON:0006838 (ventral ramus of spinal nerve). No real PMID located; rely on existing def_xref (FIPAT TA2 + ISBN:9780323393225 Drake Gray's Anatomy + ASCTB-TEMP placeholder); curator may wish to add a primary anatomical reference such as Standring Gray's Anatomy. +uberon_0001624 opponens digiti minimi muscle Source-supplied parent_id UBERON:0001624 resolves to 'anterior cerebral artery', which is anatomically unrelated to a hand muscle. This appears to be an upstream parent-mapping error in the HRA ASCTB input. Curator should report/correct the source parent assignment. The term itself already exists as UBERON:0036176 and is excluded from the new-term template. +uberon_0001677 source parent UBERON:0001677 Source-assigned parent UBERON:0001677 is 'sphenoid bone', which is anatomically incorrect for levator costarum muscle (a chest/back muscle). The correct parent in UBERON is UBERON:0002426 'chest muscle' (already used by the existing match UBERON:8410070). Curator should review the upstream ASCTB mapping that produced UBERON:0001677 as a parent here; the existing UBERON:8410070 (levator costarum) supersedes this NTR. +uberon_0001876 external anal sphincter muscle Source parent_id UBERON:0001876 resolves to 'amygdala' — a brain region, evidently a data-entry error in the ASCTB-TEMP input. Not an issue for output (term is a confirmed_match excluded from template), but flagged for curator awareness. Curator should add ASCTB-TEMP source IRI (https://purl.org/ccf/ASCTB-TEMP_external-anal-sphincter-muscle) and 'external anal sphincter muscle' as a synonym to UBERON:0001367. No new term needed. +uberon_0003690 input parent UBERON:0003690 Source parent UBERON:0003690 resolves to 'fused sacrum' (a bone), which cannot be a parent of a muscle. This appears to be an upstream mapping error in the ASCTB-TEMP source data. No action required — term already exists in UBERON as UBERON:0005454 and is auto-excluded from the template via confirmed_matches. +uberon_0005893 frontal belly of occipitofrontalis muscle Source parent UBERON:0005893 is 'leg bone' — clearly an incorrect parent for a facial muscle belly. Flag for curator review of the input row, but no action needed in template since the term is a confirmed existing match. Curator: verify HRA source row; the term itself already exists as UBERON:0010952. +uberon_0015173 puboperineales muscle Source parent UBERON:0015173 ('helicine branch of uterine artery') is clearly a misalignment in the input data — it is an artery, not a muscle. Resolved to the anatomically correct parent levator ani muscle (UBERON:0001326) following the precedent of puborectalis (UBERON:0011512) and pubococcygeus (UBERON:0011528), which are also slips of the levator ani with the same is_a/part_of pattern. Curator should ignore the source parent_id and use UBERON:0001326 (levator ani muscle) as part_of, UBERON:0001325 (muscle of pelvis) as is_a. +uberon_8600052 puboanalis muscle Source parent UBERON:8600052 not present in uberon-edit.obo (presumably a recently minted grouping class). Followed the precedent of sibling levator ani components (puborectalis UBERON:0011512, pubococcygeus UBERON:0011528, iliococcygeus UBERON:0011398) which all use is_a muscle of pelvis (UBERON:0001325) and part_of levator ani muscle (UBERON:0001326). Curator: confirm whether UBERON:8600052 is intended as the parent and, if so, verify its placement in the hierarchy; otherwise leave is_a/part_of as written. +unresolvable_intertransversarii_laterales_lumborum intertransversarii laterales lumborum muscle (source parent) The source-assigned parent 'intertransversarii laterales lumborum muscle' is not present in UBERON. OLS4 returns no UBERON term for this label or for FMA:32544 (intertransversarii laterales lumborum). The closest UBERON terms are UBERON:3010664 / UBERON:3010667 (amphibian m. intertransversarius capitis sup./inf., not equivalent) and UBERON:0008242 (lower back muscle), which is a broader regional grouping. As an interim solution this term has been placed part_of UBERON:0008242 (lower back muscle) with genus UBERON:0014892 (skeletal muscle organ, vertebrate). Curator should consider creating the parent muscle 'intertransversarii laterales lumborum (muscle)' (FMA:32544) as a sibling NTR and then re-parenting this ventral part as part_of that new term. A matching 'dorsal part of intertransversarii laterales lumborum muscle' (FMA:32546) will also be needed. +unresolvable_levator_costarum_muscle levatores costarum longi of levator costarum muscle Parent 'levator costarum muscle' resolves to UBERON:8410070 (levator costarum). The source label suggests these are a named sub-component (the long fasciculi of the four lower levatores costarum). UBERON has no specific class for this sub-component, but the parent UBERON:8410070 itself already covers the levatores costarum collectively (its definition explicitly references both 'levatores costarum breves' and 'levatores costarum longi' as the two fasciculi of each muscle). Curator decision needed: (a) accept this NTR as a part_of subdivision of UBERON:8410070 with genus 'skeletal muscle organ, vertebrate' (UBERON:0014892), as encoded in leaf_template_rows; OR (b) drop the NTR and instead add 'levatores costarum longi' as an EXACT synonym (with a clarifying scope) on UBERON:8410070, since the parent term's textual definition already enumerates the longi/breves fasciculi. Option (b) is more parsimonious if HRA only needs name-level findability. Option (a) is preferred if the longi fasciculus must be addressable as a distinct entity (e.g. for downstream attachment/innervation annotation). Innervation set to dorsal ramus of spinal nerve (UBERON:0006839) following Morrison 1953 (PMID:13129167). +unresolvable_meningohypophyseal_artery dorsal part of intertransversarii laterales lumborum muscle Source-supplied parent label 'meningohypophyseal artery' is wrong-domain (a cranial artery cannot parent a lumbar back muscle) and is clearly a data-entry error in the input. The parent muscle 'intertransversarii laterales lumborum' (FMA:32576 / FMA:32577) and the higher class 'intertransversarii lumborum' do not yet exist in UBERON, so no exact named-muscle parent is available; the dorsal part has been placed under genus UBERON:0001630 (muscle organ) and part_of UBERON:0001137 (dorsum/back) by analogy with other deep back muscles such as longissimus, spinalis, and rotator muscle of the vertebral column. The bone-landmark 'accessory process of lumbar vertebra' is not in UBERON, so the more general UBERON:0001077 (transverse process of vertebra) is used for has_muscle_origin (the accessory process is a small projection on the posterior aspect of the transverse process region). Curator should: (1) consider adding parent terms 'intertransversarii lumborum muscle group' and 'intertransversarii laterales lumborum muscle' to UBERON (FMA:32576, FMA:32577) so this dorsal part can be made part_of its true named-muscle parent; (2) optionally add 'accessory process of lumbar vertebra' (FMA:34047) for a more precise has_muscle_origin; (3) consider whether a 'muscle of vertebral column' is_a (UBERON:0004518) is preferable to the generic muscle organ once the parent muscle exists. +unresolvable_neuromeningeal_trunk source parent 'neuromeningeal trunk' Wrong-domain parent label supplied by source. 'Neuromeningeal trunk' refers to a nerve trunk (a branch arrangement of the glossopharyngeal/vagus or ascending pharyngeal artery's neuromeningeal trunk), not to any muscle structure. It cannot serve as a parent for a muscle belly. Discard the source parent label. The child term 'occipital belly of occipitofrontalis muscle' is already represented as UBERON:0010947 (occipitalis), with is_a UBERON:0010938 (muscle belly) and part_of UBERON:0010946 (occipitofrontalis muscle). Exclude this row from the NTR template; add 'occipital belly of occipitofrontalis muscle' as an EXACT synonym on UBERON:0010947 if not already exhaustively covered (current EXACT synonym is 'occipital belly of occipitofrontalis' — adding the trailing 'muscle' variant may be useful). +unresolvable_respiratory_diaphragm_muscle sternal part of respiratory diaphragm muscle Source parent label 'respiratory diaphragm muscle' has no exact UBERON match but maps to UBERON:0001103 (diaphragm) which has synonym 'diaphragm muscle' (BTO:0000341). Resolved to UBERON:0001103 (diaphragm). Precedent: sibling term 'costal diaphragm' (UBERON:0035831, FMA:58277) uses is_a UBERON:0000063 (organ subunit) + part_of UBERON:0001103. Same pattern applied here. +unresolvable_segmental_back_muscle segmental back muscle (ASCTB-TEMP parent label) No UBERON class for 'segmental back muscle' as a grouping; OLS4 search found no muscle-level intertransversarii classes in UBERON (only AAO-derived amphibian terms UBERON:3010664/3010667 for m. intertransversarius capitis). Used UBERON:0014892 (skeletal muscle organ, vertebrate) as genus and the specific vertebral-column region (UBERON:0006072/0006073/0006074) as part_of differentiator, with UBERON:0002324 'muscle of back' retained in resolved_parents as the recommended fallback structural parent. Curator may add a grouping class 'segmental back muscle' (a subclass of UBERON:0002324 muscle of back, has_part some intertransversarius/interspinalis/rotator) in a future iteration; not required for these leaf terms. +unresolvable_submucosal_artery_of_colon rectus capitius posterior minor muscle Input file was named 'unresolvable_submucosal_artery_of_colon.json' and listed parent_id UNRESOLVABLE:'submucosal artery of colon' for both is_a and part_of. That parent is wrong-domain (a colonic artery) for a suboccipital skeletal muscle and appears to be a pipeline mislabel. Disregard the bogus 'submucosal artery of colon' parent. The term itself is a confirmed match to UBERON:0008455 (rectus capitis posterior minor); no new term is needed. Had a new term been required, the correct parents would have been: is_a UBERON:0004518 (muscle of vertebral column) and part_of UBERON:0000974 (neck), mirroring the other rectus capitis muscles. +unresolvable_supraperiosteal_arteriole inferior head of lateral pterygoid muscle Source parent label 'supraperiosteal arteriole' is wrong-domain (a vascular structure) for this masticatory muscle head; the parent was overridden based on the child term itself. Use UBERON:0011906 (muscle head) as genus and UBERON:0006719 (lateral pterygoid muscle) as part_of; this mirrors the UBERON pattern for UBERON:0007168 (long head of biceps brachii) and similar muscle-head terms. +unresolvable_thoracic_wall_muscle parent: thoracic wall muscle Source-assigned grouping parent 'thoracic wall muscle' has no exact UBERON equivalent. The closest grouping classes in UBERON are UBERON:0002426 (chest muscle) and UBERON:0016403 (thoracic wall, anatomical region). However, the specific parent muscle 'levator costarum' (UBERON:8410070) already exists in UBERON and is itself is_a UBERON:0002426 ! chest muscle, so the chain is preserved. Use part_of UBERON:8410070 (levator costarum) as the immediate containing structure; is_a UBERON:0014892 (skeletal muscle organ, vertebrate) supplies the genus class. The thoracic-wall-muscle grouping is implicit via the parent muscle's own is_a chain. No new grouping term is required. From 77fd1289e6f5bda11c3af25528ed21d6e76b72a3 Mon Sep 17 00:00:00 2001 From: David Osumi-Sutherland Date: Mon, 11 May 2026 18:37:19 +0100 Subject: [PATCH 11/22] Add consolidated review.tsv: input rows joined with all findings per row MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces standalone unresolvable.tsv with a single curator-facing review file. Each row of the original input gets: | Column | Purpose | |-------------------------|-----------------------------------------------| | table, as_iri, label | Input source identifiers | | term_type | leaf | group | | source_parent_id | Parent ID from source data | | source_parent_label | Parent label from source | | status | confirmed_match | new_term_leaf | | | | new_term_group | manual_curation | | mapped_uberon_id | Either existing UBERON ID (if confirmed) | | | OR new UBERON:99xxxxx ID (if new term) | | label_correction | Suggested corrected label (typos etc.) | | label_correction_reason | Why the label was corrected | | parent_correction | Corrected parent UBERON ID (when source was | | | wrong-domain or missing) | | curator_notes | Pipe-separated unresolvable notes from agents | | | (wrong-domain parents, missing UBERON | | | entities, modelling caveats) | Aggregated stats for the muscular-system run: - 75 input rows - Status: 39 confirmed_match, 25 new_term_leaf, 8 new_term_group, 3 manual_curation - 17 with label corrections - 34 with parent corrections (parent_correction populated) - 20 with curator notes (mostly wrong-domain source parents) This is the file curators should review first — one row per input term, all findings consolidated, no need to dig into per-term JSONs. Built one-off via Python script joining input.tsv + candidates.tsv + name_corrections.tsv + manual_curation.tsv + per-term unresolvable notes from outputs/definitions/*.json. Should be moved into merge_definitions.py as an aggregated report writer (follow-up). Co-Authored-By: Claude Opus 4.7 (1M context) --- src/templates/hra-muscular-reports/review.tsv | 76 +++++++++++++++++++ .../hra-muscular-reports/unresolvable.tsv | 27 ------- 2 files changed, 76 insertions(+), 27 deletions(-) create mode 100644 src/templates/hra-muscular-reports/review.tsv delete mode 100644 src/templates/hra-muscular-reports/unresolvable.tsv diff --git a/src/templates/hra-muscular-reports/review.tsv b/src/templates/hra-muscular-reports/review.tsv new file mode 100644 index 000000000..c2bbaf462 --- /dev/null +++ b/src/templates/hra-muscular-reports/review.tsv @@ -0,0 +1,76 @@ +table as_iri label term_type source_parent_id source_parent_label status mapped_uberon_id label_correction label_correction_reason parent_correction curator_notes +muscular-system https://purl.org/ccf/ASCTB-TEMP_anterior-cervical-intertransversarii-muscle anterior cervical intertransversarii muscle leaf https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle new_term_leaf UBERON:9900001 UBERON:0006072 +muscular-system https://purl.org/ccf/ASCTB-TEMP_anterior-vertebral-muscle anterior vertebral muscle group UBERON:0002377 muscle of neck confirmed_match UBERON:0008549 +muscular-system https://purl.org/ccf/ASCTB-TEMP_articularis-genu-muscle articularis genu muscle leaf http://purl.org/sig/ont/fma/fma22424 Muscle of anterior compartment of thigh new_term_leaf UBERON:9900003 UBERON:0000376 +muscular-system https://purl.org/ccf/ASCTB-TEMP_aryepiglottic-part-of-oblique-arytenoid-muscle aryepiglottic part of oblique arytenoid muscle leaf http://purl.org/sig/ont/fma/fma46583 Oblique arytenoid confirmed_match UBERON:0011025 +muscular-system https://purl.org/ccf/ASCTB-TEMP_ceratoglossus-of-hyoglossus-muscle ceratoglossus of hyoglossus muscle leaf UBERON:0001572 hyoglossus muscle confirmed_match UBERON:0008428 +muscular-system https://purl.org/ccf/ASCTB-TEMP_chondroglossus-of-hyoglossus-muscle chondroglossus of hyoglossus muscle leaf UBERON:0001572 hyoglossus muscle confirmed_match UBERON:0011535 +muscular-system https://purl.org/ccf/ASCTB-TEMP_circular-pharyngeal-muscle circular pharyngeal muscle group UBERON:0002377 muscle of neck confirmed_match UBERON:0001569 +muscular-system https://purl.org/ccf/ASCTB-TEMP_clavicular-head-of-pectoralis-major-muscle clavicular head of pectoralis major muscle leaf UBERON:0002381 pectoralis major new_term_leaf UBERON:9900008 UBERON:0002381 +muscular-system https://purl.org/ccf/ASCTB-TEMP_costal-part-of-respiratory-diaphragm-muscle costal part of respiratory diaphragm muscle leaf UBERON:0000975 sternum confirmed_match UBERON:0035831 Supplied parent UBERON:0000975 is 'sternum' — wrong anatomical domain for a part of the diaphragm. The correct parent for a costal-diaphragm subdivision is UBERON:0001103 (diaphragm). The existing UBERON term UBERON:0035831 (costal diaphragm) already has 'part_of UBERON:0001103'. || SUGGESTION: Use UBERON:0001103 (diaphragm) as the parent. No new term needed: confirmed match to UBERON:0035831 makes this term ineligible for the leaf template. +muscular-system https://purl.org/ccf/ASCTB-TEMP_dorsal-part-of-intertransversarii-laterales-lumborum-muscle dorsal part of intertransversarii laterales lumborum muscle leaf https://purl.org/ccf/ASCTB-TEMP_meningohypophyseal-artery meningohypophyseal artery new_term_leaf UBERON:9900010 UBERON:0001137 Source-supplied parent label 'meningohypophyseal artery' is wrong-domain (a cranial artery cannot parent a lumbar back muscle) and is clearly a data-entry error in the input. The parent muscle 'intertransversarii laterales lumborum' (FMA:32576 / FMA:32577) and the higher class 'intertransversarii lumborum' do not yet exist in UBERON, so no exact named-muscle parent is available; the dorsal part has been placed under genus UBERON:0001630 (muscle organ) and part_of UBERON:0001137 (dorsum/back) by analogy with other deep back muscles such as longissimus, spinalis, and rotator muscle of the vertebral column. The bone-landmark 'accessory process of lumbar vertebra' is not in UBERON, so the more general UBERON:0001077 (transverse process of vertebra) is used for has_muscle_origin (the accessory process is a small projection on the posterior aspect of the transverse process region). || SUGGESTION: Curator should: (1) consider adding parent terms 'intertransversarii lumborum muscle group' and 'intertransversarii laterales lumborum muscle' to UBERON (FMA:32576, FMA:32577) so this dorsal part can be made part_of its true named-muscle parent; (2) optionally add 'accessory process of lumbar vertebra' (FMA:34047) for a more precise has_muscle_origin; (3) consider whether a 'muscle of vertebral column' is_a (UBERON:0004518) is preferable to the generic muscle organ once the parent muscle exists. +muscular-system https://purl.org/ccf/ASCTB-TEMP_dorsum-of-foot-muscle dorsum of foot muscle group https://purl.org/ccf/ASCTB-TEMP_intertransversarii-laterales-lumborum-muscle intertransversarii laterales lumborum muscle manual_curation MANUAL_CURATION: No UBERON term exists for 'dorsum of foot' / 'dorsal region of pes' as a region. The only dorsal pes term found is UBERON:0006499 dorsal pes interosseous muscle (a specific muscle, not a region). Simple genus + part_of pattern cannot be applied without a region target. +muscular-system https://purl.org/ccf/ASCTB-TEMP_external-anal-sphincter-muscle external anal sphincter muscle leaf UBERON:0001876 amygdala confirmed_match UBERON:0001367 Source parent_id UBERON:0001876 resolves to 'amygdala' — a brain region, evidently a data-entry error in the ASCTB-TEMP input. Not an issue for output (term is a confirmed_match excluded from template), but flagged for curator awareness. || SUGGESTION: Curator should add ASCTB-TEMP source IRI (https://purl.org/ccf/ASCTB-TEMP_external-anal-sphincter-muscle) and 'external anal sphincter muscle' as a synonym to UBERON:0001367. No new term needed. +muscular-system https://purl.org/ccf/ASCTB-TEMP_external-ear-muscle external ear muscle group UBERON:0001678 temporal bone new_term_group UBERON:9900013 UBERON:0001691 +muscular-system https://purl.org/ccf/ASCTB-TEMP_frontal-belly-of-occipitofrontalis-muscle frontal belly of occipitofrontalis muscle leaf UBERON:0005893 leg bone confirmed_match UBERON:0010952 Source parent UBERON:0005893 is 'leg bone' — clearly an incorrect parent for a facial muscle belly. Flag for curator review of the input row, but no action needed in template since the term is a confirmed existing match. || SUGGESTION: Curator: verify HRA source row; the term itself already exists as UBERON:0010952. +muscular-system https://purl.org/ccf/ASCTB-TEMP_hamstring-portion-of-adductor-magnus-muscle hamstring portion of adductor magnus muscle leaf UBERON:0001092 vertebral bone 1 new_term_leaf UBERON:9900015 UBERON:0000370 Source parent UBERON:0001092 (vertebral bone 1 / atlas vertebra) is anatomically incorrect for a thigh muscle subdivision. Refined parent is UBERON:0000370 (adductor magnus), with the term modelled as a muscle head (UBERON:0011906) part_of adductor magnus. || SUGGESTION: Use UBERON:0000370 as the part_of parent. UBERON:0000370's own definition explicitly describes this 'hamstring portion' as the part arising from the ischial tuberosity. +muscular-system https://purl.org/ccf/ASCTB-TEMP_hypothenar-hand-muscle hypothenar hand muscle group UBERON:0001677 sphenoid bone confirmed_match UBERON:0014377 +muscular-system https://purl.org/ccf/ASCTB-TEMP_iliocostalis-cervicalis-muscle iliocostalis cervicalis muscle leaf UBERON:0001272 innominate bone confirmed_match UBERON:0008546 iliocostalis cervicis muscle Standard TA2 form uses Latin genitive 'cervicis' (of the neck), not adjectival 'cervicalis'. UBERON:0008546 uses 'iliocostalis cervicis muscle'. Source spelling could be retained as RELATED synonym. +muscular-system https://purl.org/ccf/ASCTB-TEMP_inferior-head-of-lateral-pterygoid-muscle inferior head of lateral pterygoid muscle leaf https://purl.org/ccf/ASCTB-TEMP_supraperiosteal-arteriole supraperiosteal arteriole new_term_leaf UBERON:9900018 UBERON:0006719 Source parent label 'supraperiosteal arteriole' is wrong-domain (a vascular structure) for this masticatory muscle head; the parent was overridden based on the child term itself. || SUGGESTION: Use UBERON:0011906 (muscle head) as genus and UBERON:0006719 (lateral pterygoid muscle) as part_of; this mirrors the UBERON pattern for UBERON:0007168 (long head of biceps brachii) and similar muscle-head terms. +muscular-system https://purl.org/ccf/ASCTB-TEMP_inferior-longitudinal-lingual-muscle inferior longitudinal lingual muscle leaf UBERON:0001194 splenic artery new_term_leaf UBERON:9900019 inferior longitudinal muscle of tongue UBERON convention (see UBERON:0008582 'superior longitudinal muscle of tongue', UBERON:0008583 'transverse muscle of tongue', UBERON:0008584 'vertical muscle of tongue') uses 'X muscle of tongue' rather than 'X lingual muscle'. Keep source name as EXACT synonym. UBERON:0001723 Input parent_id UBERON:0001194 resolves to 'splenic artery' — clearly wrong for this term. Correct parent assigned from anatomical context: UBERON:0001576 'intrinsic muscle of tongue' (genus), mirroring sibling intrinsic tongue muscles (UBERON:0008582 superior longitudinal, UBERON:0008583 transverse, UBERON:0008584 vertical). || SUGGESTION: Verify upstream parent ID assignment; the source row likely intended UBERON:0001576 (intrinsic muscle of tongue) or UBERON:0000378 (tongue muscle). +muscular-system https://purl.org/ccf/ASCTB-TEMP_intermediate-back-muscle intermediate back muscle group UBERON:0002397 maxilla new_term_group UBERON:9900020 UBERON:0001137 +muscular-system https://purl.org/ccf/ASCTB-TEMP_internal-abdominal-oblique-muscle internal abdominal oblique muscle leaf UBERON:0003690 fused sacrum confirmed_match UBERON:0005454 +muscular-system https://purl.org/ccf/ASCTB-TEMP_interspinales-cervicalis-muscle interspinales cervicalis muscle leaf UBERON:0000979 tibia new_term_leaf UBERON:9900022 interspinales cervicis muscle TA2 / standard anatomical nomenclature uses 'musculi interspinales cervicis' (genitive 'cervicis', not 'cervicalis'). 'Cervicalis' is grammatically the adjective form, but the established TA term is 'interspinales cervicis'. Keep 'interspinales cervicalis muscle' as a related synonym. UBERON:0000974 Source-supplied parent_id UBERON:0000979 resolves to 'tibia', which is clearly an upstream data error (interspinales cervicis is a deep neck muscle, not a leg bone). Used anatomical knowledge and similar UBERON deep neck muscles (rectus capitis posterior major UBERON:0008454, longus colli UBERON:0001121, semispinalis cervicis precedent) to determine the appropriate genus and part_of. || SUGGESTION: Curator should ignore the source UBERON:0000979 parent assignment. The chosen genus 'muscle of vertebral column' (UBERON:0004518) is consistent with other named vertebral-column muscles in UBERON; part_of 'neck' (UBERON:0000974) follows the precedent of rectus capitis posterior major. has_muscle_origin and has_muscle_insertion are both set to UBERON:0001076 (neural spine / spinous process of vertebra) because the muscle spans between adjacent cervical spinous processes; UBERON does not currently have a more specific 'spinous process of cervical vertebra' class. innervated_by is the dorsal ramus of spinal nerve (UBERON:0006839); a more specific 'medial branch of dorsal ramus of cervical spinal nerve' class does not exist in UBERON. +muscular-system https://purl.org/ccf/ASCTB-TEMP_intertransversarii-laterales-lumborum-muscle intertransversarii laterales lumborum muscle leaf https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle new_term_leaf UBERON:9900023 UBERON:0006074 +muscular-system https://purl.org/ccf/ASCTB-TEMP_intrinsic-eye-muscle intrinsic eye muscle group https://purl.org/ccf/ASCTB-TEMP_posterolateral-spinal-vein posterolateral spinal vein confirmed_match UBERON:0011222 +muscular-system https://purl.org/ccf/ASCTB-TEMP_lateral-compartmet-of-leg-muscle lateral compartmet of leg muscle leaf UBERON:0001537 anterior tibial artery new_term_leaf UBERON:9900025 lateral compartment of leg muscle Typo in source label: 'compartmet' -> 'compartment'. Keep source name as related synonym. UBERON:0014892 +muscular-system https://purl.org/ccf/ASCTB-TEMP_lateral-posterior-cervical-intertransversarii-muscle lateral posterior cervical intertransversarii muscle leaf UBERON:0001546 posterior tibial vein new_term_leaf UBERON:9900026 UBERON:0000974 Source parent_id UBERON:0001546 resolves to 'posterior tibial vein', which is anatomically incorrect for a cervical paraspinal muscle. No specific UBERON term currently exists for this muscle; closest existing classes are UBERON:0001630 (muscle organ) as genus and UBERON:0004465 (musculature of neck) as collective. Existing 'm. intertransversarius capitis' classes (UBERON:3010664, UBERON:3010667) are amphibian-sourced and not equivalent. || SUGGESTION: Use UBERON:0001630 (muscle organ) as is_a and UBERON:0000974 (neck) as part_of, with has_muscle_origin/insertion = UBERON:0018143 (transverse process of cervical vertebra) and innervated_by = UBERON:0006838 (ventral ramus of spinal nerve). No real PMID located; rely on existing def_xref (FIPAT TA2 + ISBN:9780323393225 Drake Gray's Anatomy + ASCTB-TEMP placeholder); curator may wish to add a primary anatomical reference such as Standring Gray's Anatomy. +muscular-system https://purl.org/ccf/ASCTB-TEMP_lateral-vertebral-muscle lateral vertebral muscle group UBERON:0002250 popliteal artery confirmed_match UBERON:0008611 +muscular-system https://purl.org/ccf/ASCTB-TEMP_left-crus-of-lumbar-part-of-respiratory-diaphragm-muscle left crus of lumbar part of respiratory diaphragm muscle leaf http://purl.org/sig/ont/fma/fma323951 Pre-aortic thoracic lymph node group confirmed_match UBERON:0014767 FMA:323951 (lumbar part of diaphragm) is not directly xref'd in UBERON. The closest UBERON concept is UBERON:0014765 'crus of diaphragm' (which is the lumbar/vertebral part of the diaphragm). Not needed here because the child term itself matches an existing UBERON term. || SUGGESTION: If a separate UBERON term for the lumbar part of the diaphragm is desired, it could be added with FMA:323951 as xref; otherwise treat UBERON:0014765 as functionally equivalent. +muscular-system https://purl.org/ccf/ASCTB-TEMP_levator-costarum-muscle levator costarum muscle leaf UBERON:0001677 sphenoid bone confirmed_match UBERON:8410070 +muscular-system https://purl.org/ccf/ASCTB-TEMP_levatores-costarum-breves-of-levator-costarum-muscle levatores costarum breves of levator costarum muscle leaf https://purl.org/ccf/ASCTB-TEMP_thoracic-wall-muscle thoracic wall muscle new_term_leaf UBERON:9900030 UBERON:8410070 Source-assigned grouping parent 'thoracic wall muscle' has no exact UBERON equivalent. The closest grouping classes in UBERON are UBERON:0002426 (chest muscle) and UBERON:0016403 (thoracic wall, anatomical region). However, the specific parent muscle 'levator costarum' (UBERON:8410070) already exists in UBERON and is itself is_a UBERON:0002426 ! chest muscle, so the chain is preserved. || SUGGESTION: Use part_of UBERON:8410070 (levator costarum) as the immediate containing structure; is_a UBERON:0014892 (skeletal muscle organ, vertebrate) supplies the genus class. The thoracic-wall-muscle grouping is implicit via the parent muscle's own is_a chain. No new grouping term is required. +muscular-system https://purl.org/ccf/ASCTB-TEMP_levatores-costarum-longi-of-levator-costarum-muscle levatores costarum longi of levator costarum muscle leaf https://purl.org/ccf/ASCTB-TEMP_levator-costarum-muscle levator costarum muscle new_term_leaf UBERON:9900031 UBERON:8410070 Parent 'levator costarum muscle' resolves to UBERON:8410070 (levator costarum). The source label suggests these are a named sub-component (the long fasciculi of the four lower levatores costarum). UBERON has no specific class for this sub-component, but the parent UBERON:8410070 itself already covers the levatores costarum collectively (its definition explicitly references both 'levatores costarum breves' and 'levatores costarum longi' as the two fasciculi of each muscle). || SUGGESTION: Curator decision needed: (a) accept this NTR as a part_of subdivision of UBERON:8410070 with genus 'skeletal muscle organ, vertebrate' (UBERON:0014892), as encoded in leaf_template_rows; OR (b) drop the NTR and instead add 'levatores costarum longi' as an EXACT synonym (with a clarifying scope) on UBERON:8410070, since the parent term's textual definition already enumerates the longi/breves fasciculi. Option (b) is more parsimonious if HRA only needs name-level findability. Option (a) is preferred if the longi fasciculus must be addressable as a distinct entity (e.g. for downstream attachment/innervation annotation). Innervation set to dorsal ramus of spinal nerve (UBERON:0006839) following Morrison 1953 (PMID:13129167). +muscular-system https://purl.org/ccf/ASCTB-TEMP_longitudinal-pharyngeal-muscle longitudinal pharyngeal muscle group https://purl.org/ccf/ASCTB-TEMP_vasa-recta-of-colon vasa recta of colon manual_curation MANUAL_CURATION: This is a sub-grouping of pharyngeal muscles defined by fibre orientation (longitudinal) within the pharyngeal wall — not a simple part_of-defined subset. UBERON's circular counterpart (UBERON:0001569 constrictor muscle of pharynx) is is_a UBERON:0000933 chordate pharyngeal muscle without an EC axiom on orientation. The simple genus + part_of pattern cannot express fibre orientation. +muscular-system https://purl.org/ccf/ASCTB-TEMP_longus-capitus-muscle longus capitus muscle leaf UBERON:0002377 muscle of neck confirmed_match UBERON:0001563 longus capitis muscle 'capitus' is a misspelling of the Latin genitive 'capitis' (of the head). Standard anatomical term is 'longus capitis muscle' (TA2). Already present in UBERON as UBERON:0001563 with the misspelled form already captured as a RELATED synonym. +muscular-system https://purl.org/ccf/ASCTB-TEMP_medial-lumbar-intertransversarii-muscle medial lumbar intertransversarii muscle leaf https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle new_term_leaf UBERON:9900034 UBERON:0006074 +muscular-system https://purl.org/ccf/ASCTB-TEMP_medial-posterior-cervical-intertransversarii-muscle medial posterior cervical intertransversarii muscle leaf https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle new_term_leaf UBERON:9900035 UBERON:0006072 +muscular-system https://purl.org/ccf/ASCTB-TEMP_middle-ear-muscle middle ear muscle group UBERON:0002376 cranial muscle new_term_group UBERON:9900036 UBERON:0001756 +muscular-system https://purl.org/ccf/ASCTB-TEMP_multifidus-cervicis-muscle multifidus cervicis muscle leaf UBERON:0010990 transversospinales muscle new_term_leaf UBERON:9900037 UBERON:0006072 +muscular-system https://purl.org/ccf/ASCTB-TEMP_multifidus-lumborum-muscle multifidus lumborum muscle leaf UBERON:0010990 transversospinales muscle new_term_leaf UBERON:9900038 UBERON:0006074 +muscular-system https://purl.org/ccf/ASCTB-TEMP_multifidus-thoracis-muscle multifidus thoracis muscle leaf UBERON:0010990 transversospinales muscle new_term_leaf UBERON:9900039 UBERON:0006073 +muscular-system https://purl.org/ccf/ASCTB-TEMP_muscle-of-facial-expression muscle of facial expression group UBERON:0002376 cranial muscle confirmed_match UBERON:0001577 +muscular-system https://purl.org/ccf/ASCTB-TEMP_musculus-uvulae-muscle musculus uvulae muscle leaf UBERON:0003682 palatal muscle confirmed_match UBERON:0010235 +muscular-system https://purl.org/ccf/ASCTB-TEMP_occipital-belly-of-occipitofrontalis-muscle occipital belly of occipitofrontalis muscle leaf https://purl.org/ccf/ASCTB-TEMP_neuromeningeal-trunk neuromeningeal trunk confirmed_match UBERON:0010947 +muscular-system https://purl.org/ccf/ASCTB-TEMP_opponens-digiti-minimi-muscle opponens digiti minimi muscle leaf UBERON:0001624 anterior cerebral artery confirmed_match UBERON:0036176 Source-supplied parent_id UBERON:0001624 resolves to 'anterior cerebral artery', which is anatomically unrelated to a hand muscle. This appears to be an upstream parent-mapping error in the HRA ASCTB input. || SUGGESTION: Curator should report/correct the source parent assignment. The term itself already exists as UBERON:0036176 and is excluded from the new-term template. +muscular-system https://purl.org/ccf/ASCTB-TEMP_palmar-interosseous-muscle palmar interosseous muscle group UBERON:0009095 tip of renal papilla confirmed_match UBERON:0006505 +muscular-system https://purl.org/ccf/ASCTB-TEMP_pelvic-floor-muscle pelvic floor muscle group https://purl.org/ccf/ASCTB-TEMP_periductal-branch-of-lobular-artery-of-pancreas periductal branch of lobular artery of pancreas manual_curation MANUAL_CURATION: No UBERON term currently exists for 'pelvic floor' or 'pelvic diaphragm' as an anatomical region — only the constituent muscles (levator ani UBERON:0001326, coccygeus UBERON:0001327) and the broader pelvic region (UBERON:0002355) are represented. The simple genus + part_of pattern needs a target term for the pelvic floor itself. +muscular-system https://purl.org/ccf/ASCTB-TEMP_plantar-interosseous-muscle plantar interosseous muscle group https://purl.org/ccf/ASCTB-TEMP_sheathed-capillary-of-spleen sheathed capillary of spleen, Sheathed capillary of spleen confirmed_match UBERON:0006502 +muscular-system https://purl.org/ccf/ASCTB-TEMP_posterior-abdominal-wall-muscle posterior abdominal wall muscle group UBERON:0001092 vertebral bone 1 new_term_group UBERON:9900047 UBERON:0003697 +muscular-system https://purl.org/ccf/ASCTB-TEMP_pteryopharyngeal-part-of-superior-pharyngeal-constrictor-muscle pteryopharyngeal part of superior pharyngeal constrictor muscle leaf UBERON:0001272 innominate bone confirmed_match UBERON:0010956 pterygopharyngeal part of superior pharyngeal constrictor muscle Source spelling 'pteryopharyngeal' is missing the 'g' from the Greek root 'pteryg-' (wing, referring to the pterygoid process). Standard TA2/FMA/UBERON form is 'pterygopharyngeal' (UBERON:0010956, FMA:46638). Source spelling could be retained as RELATED synonym. +muscular-system https://purl.org/ccf/ASCTB-TEMP_puboanalis-muscle puboanalis muscle leaf UBERON:8600052 subsegmental pulmonary vein new_term_leaf UBERON:9900049 UBERON:0001326 Source parent UBERON:8600052 not present in uberon-edit.obo (presumably a recently minted grouping class). Followed the precedent of sibling levator ani components (puborectalis UBERON:0011512, pubococcygeus UBERON:0011528, iliococcygeus UBERON:0011398) which all use is_a muscle of pelvis (UBERON:0001325) and part_of levator ani muscle (UBERON:0001326). || SUGGESTION: Curator: confirm whether UBERON:8600052 is intended as the parent and, if so, verify its placement in the hierarchy; otherwise leave is_a/part_of as written. +muscular-system https://purl.org/ccf/ASCTB-TEMP_puboperineales-muscle puboperineales muscle leaf UBERON:0015173 helicine branch of uterine artery new_term_leaf UBERON:9900050 puboperinealis muscle TA2 Latin form is 'musculus puboperinealis' (singular); 'puboperineales' is the plural Latin adjective form used inconsistently. The standard English label is 'puboperinealis muscle' or 'puboperineal muscle'. Keep source name as a synonym. UBERON:0001326 Source parent UBERON:0015173 ('helicine branch of uterine artery') is clearly a misalignment in the input data — it is an artery, not a muscle. Resolved to the anatomically correct parent levator ani muscle (UBERON:0001326) following the precedent of puborectalis (UBERON:0011512) and pubococcygeus (UBERON:0011528), which are also slips of the levator ani with the same is_a/part_of pattern. || SUGGESTION: Curator should ignore the source parent_id and use UBERON:0001326 (levator ani muscle) as part_of, UBERON:0001325 (muscle of pelvis) as is_a. +muscular-system https://purl.org/ccf/ASCTB-TEMP_rectus-capitius-posterior-minor-muscle rectus capitius posterior minor muscle leaf https://purl.org/ccf/ASCTB-TEMP_submucosal-artery-of-colon submucosal artery of colon confirmed_match UBERON:0008455 rectus capitis posterior minor Input contains a misspelling: 'capitius' is a typo for 'capitis' (genitive of Latin caput, head). The correctly spelled term already exists in UBERON as UBERON:0008455. The variant 'rectus capitus posterior minor muscle' is already registered there as a RELATED synonym; the input form 'rectus capitius posterior minor muscle' could also be added as an additional misspelling synonym if desired. Input file was named 'unresolvable_submucosal_artery_of_colon.json' and listed parent_id UNRESOLVABLE:'submucosal artery of colon' for both is_a and part_of. That parent is wrong-domain (a colonic artery) for a suboccipital skeletal muscle and appears to be a pipeline mislabel. || SUGGESTION: Disregard the bogus 'submucosal artery of colon' parent. The term itself is a confirmed match to UBERON:0008455 (rectus capitis posterior minor); no new term is needed. Had a new term been required, the correct parents would have been: is_a UBERON:0004518 (muscle of vertebral column) and part_of UBERON:0000974 (neck), mirroring the other rectus capitis muscles. +muscular-system https://purl.org/ccf/ASCTB-TEMP_rectus-capitus-anterior-muscle rectus capitus anterior muscle leaf UBERON:0001250, UBERON:0010400 red pulp of spleen, spleen trabecular vein confirmed_match UBERON:0008453 rectus capitis anterior muscle Standard anatomical Latin is 'capitis' (genitive of caput), not 'capitus'. The source variant is already captured as a RELATED synonym on UBERON:0008453. +muscular-system https://purl.org/ccf/ASCTB-TEMP_respiratory-diaphragm-muscle respiratory diaphragm muscle leaf http://purl.org/sig/ont/fma/fma12252 Subclavian lymphatic trunk confirmed_match UBERON:0001103 +muscular-system https://purl.org/ccf/ASCTB-TEMP_right-crus-of-lumbar-part-of-respiratory-diaphragm-muscle right crus of lumbar part of respiratory diaphragm muscle leaf http://purl.org/sig/ont/fma/fma5841 Left lumbar lymphatic trunk confirmed_match UBERON:0014766 UBERON:0014765 +muscular-system https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle group https://purl.org/ccf/ASCTB-TEMP_lobar-artery-of-spleen lobar artery of spleen new_term_group UBERON:9900055 UBERON:0001137 +muscular-system https://purl.org/ccf/ASCTB-TEMP_sole-of-foot-muscle sole of foot muscle group UBERON:0001383 muscle of leg new_term_group UBERON:9900056 UBERON:0008338 +muscular-system https://purl.org/ccf/ASCTB-TEMP_spermatic-cord-muscle spermatic cord muscle leaf UBERON:0002378 muscle of abdomen confirmed_match UBERON:0008488 +muscular-system https://purl.org/ccf/ASCTB-TEMP_sphincter-urethrae-muscle sphincter urethrae muscle leaf UBERON:0002379 perineal muscle confirmed_match UBERON:0004917 +muscular-system https://purl.org/ccf/ASCTB-TEMP_spinotransversales-muscle spinotransversales muscle group UBERON:0002324 muscle of back confirmed_match UBERON:0002252 +muscular-system https://purl.org/ccf/ASCTB-TEMP_splenius-capitus-muscle splenius capitus muscle leaf https://purl.org/ccf/ASCTB-TEMP_spinotransversales-muscle spinotransversales muscle confirmed_match UBERON:0000711 splenius capitis 'capitus' is a misspelling of the Latin genitive 'capitis' (of the head). Standard anatomical nomenclature (TA2, FMA:22653) uses 'splenius capitis'. The existing UBERON:0000711 already carries 'splenius capitis muscle' as an EXACT synonym. Source label should be treated as a typographical variant; no new term required. +muscular-system https://purl.org/ccf/ASCTB-TEMP_sternal-part-of-respiratory-diaphragm-muscle sternal part of respiratory diaphragm muscle leaf https://purl.org/ccf/ASCTB-TEMP_respiratory-diaphragm-muscle respiratory diaphragm muscle new_term_leaf UBERON:9900061 sternal part of diaphragm UBERON uses 'diaphragm' (UBERON:0001103) as the standard label; FMA and TA2 use 'sternal part of diaphragm' (FMA:58278, 'pars sternalis diaphragmatis'). The source 'respiratory diaphragm muscle' phrasing is non-standard. Keep source name as RELATED synonym. UBERON:0001103 Source parent label 'respiratory diaphragm muscle' has no exact UBERON match but maps to UBERON:0001103 (diaphragm) which has synonym 'diaphragm muscle' (BTO:0000341). || SUGGESTION: Resolved to UBERON:0001103 (diaphragm). Precedent: sibling term 'costal diaphragm' (UBERON:0035831, FMA:58277) uses is_a UBERON:0000063 (organ subunit) + part_of UBERON:0001103. Same pattern applied here. +muscular-system https://purl.org/ccf/ASCTB-TEMP_sternocostal-head-of-pectoralis-major-muscle sternocostal head of pectoralis major muscle leaf UBERON:0002381 pectoralis major new_term_leaf UBERON:9900062 UBERON:0002381 +muscular-system https://purl.org/ccf/ASCTB-TEMP_superficial-back-muscle superficial back muscle group UBERON:0002324 muscle of back new_term_group UBERON:9900063 UBERON:0001137 +muscular-system https://purl.org/ccf/ASCTB-TEMP_superior-head-of-lateral-pterygoid-muscle superior head of lateral pterygoid muscle leaf UBERON:0006719 lateral pterygoid muscle new_term_leaf UBERON:9900064 UBERON:0006719 +muscular-system https://purl.org/ccf/ASCTB-TEMP_superior-longitudinal-lingual-muscle superior longitudinal lingual muscle leaf UBERON:0001576 intrinsic muscle of tongue confirmed_match UBERON:0008582 superior longitudinal muscle of tongue Source label uses 'lingual muscle' word order; UBERON's canonical label is 'superior longitudinal muscle of tongue' (UBERON:0008582). Consider adding 'superior longitudinal lingual muscle' as an EXACT synonym to aid matching from HRA/ASCTB sources. +muscular-system https://purl.org/ccf/ASCTB-TEMP_tensor-fascia-latae-muscle tensor fascia latae muscle leaf UBERON:0002000 gluteal muscle confirmed_match UBERON:0001376 tensor fasciae latae muscle Standard anatomical Latin uses the genitive 'fasciae' (of the fascia), not nominative 'fascia'. UBERON:0001376 already carries 'tensor fasciae lata muscle' as an EXACT synonym; the source variant 'tensor fascia latae muscle' could be added as an additional synonym if not already covered. +muscular-system https://purl.org/ccf/ASCTB-TEMP_thoracic-intertransversarii-muscle thoracic intertransversarii muscle leaf https://purl.org/ccf/ASCTB-TEMP_segmental-back-muscle segmental back muscle new_term_leaf UBERON:9900067 UBERON:0006073 +muscular-system https://purl.org/ccf/ASCTB-TEMP_thoracic-wall-muscle thoracic wall muscle group UBERON:0002426 chest muscle new_term_group UBERON:9900068 UBERON:0016403 +muscular-system https://purl.org/ccf/ASCTB-TEMP_thyroepiglottic-part-of-thyroarytenoid-muscle thyroepiglottic part of thyroarytenoid muscle leaf http://purl.org/sig/ont/fma/fma46588 Thyro-arytenoid confirmed_match UBERON:0010927 +muscular-system https://purl.org/ccf/ASCTB-TEMP_thyropharyngeal-part-of-inferior-pharyngeal-constrictor-muscle thyropharyngeal part of inferior pharyngeal constrictor muscle leaf http://purl.org/sig/ont/fma/fma46623 Inferior pharyngeal constrictor confirmed_match UBERON:0010936 +muscular-system https://purl.org/ccf/ASCTB-TEMP_tibalis-anterior-muscle tibalis anterior muscle leaf http://purl.org/sig/ont/fma/fma22472 Muscle of anterior compartment of leg confirmed_match UBERON:0001385 tibialis anterior muscle Typo: 'tibalis' should be 'tibialis'. The corrected form is the standard TA2 name and is already recorded as an EXACT synonym of UBERON:0001385. +muscular-system https://purl.org/ccf/ASCTB-TEMP_tibalis-posterior-muscle tibalis posterior muscle leaf http://purl.org/sig/ont/fma/fma22474 Muscle of posterior compartment of leg confirmed_match UBERON:0001667 tibialis posterior muscle Spelling error — missing 'i'. Standard anatomical term is 'tibialis posterior muscle' (already a related synonym on UBERON:0001667). Term is a confirmed existing match so no new term is needed; record correction for the candidates/QC report. +muscular-system https://purl.org/ccf/ASCTB-TEMP_transverse-muscle transverse muscle leaf UBERON:0001576 intrinsic muscle of tongue confirmed_match UBERON:0008583 transverse muscle of tongue Source label 'transverse muscle' is ambiguous outside the lingual context. UBERON's canonical label is 'transverse muscle of tongue' (UBERON:0008583). Already carries 'transverse muscle' as a RELATED synonym, so no synonym addition is needed. +muscular-system https://purl.org/ccf/ASCTB-TEMP_ventral-part-of-intertransversarii-laterales-lumborum-muscle ventral part of intertransversarii laterales lumborum muscle leaf https://purl.org/ccf/ASCTB-TEMP_intertransversarii-laterales-lumborum-muscle intertransversarii laterales lumborum muscle new_term_leaf UBERON:9900074 UBERON:0008242 +muscular-system https://purl.org/ccf/ASCTB-TEMP_vertical-muscle vertical muscle leaf UBERON:0001576 intrinsic muscle of tongue confirmed_match UBERON:0008584 vertical muscle of tongue Source label 'vertical muscle' is ambiguous outside the lingual context. UBERON's canonical label is 'vertical muscle of tongue' (UBERON:0008584). Already carries 'vertical muscle' as a RELATED synonym, so no synonym addition is needed. diff --git a/src/templates/hra-muscular-reports/unresolvable.tsv b/src/templates/hra-muscular-reports/unresolvable.tsv deleted file mode 100644 index bd5827917..000000000 --- a/src/templates/hra-muscular-reports/unresolvable.tsv +++ /dev/null @@ -1,27 +0,0 @@ -source_group label_or_field reason suggestion -needs_mapping_fma_12252 NEEDS_MAPPING:FMA:12252 (parent) The supplied FMA parent ID FMA:12252 resolves to 'Subclavian lymphatic trunk' in FMA, which is not anatomically a parent of a diaphragm muscle. Likely an input data error; the correct FMA ID for diaphragm is FMA:13295. Treat as input error. The term itself is a confirmed match for UBERON:0001103, so the parent mapping question is moot — exclude from template. -needs_mapping_fma_22424 articularis genu muscle (parent FMA:22424) Source parent FMA:22424 is the articularis genus muscle itself (self-referential mapping in the ASCTB input). No UBERON equivalent exists for this term — it is the new term being created. Genus resolved to UBERON:0001630 (muscle organ) and part_of to UBERON:0000376 (hindlimb stylopod / thigh) by analogy with UBERON:0001379 (vastus lateralis). Accept the leaf_template_rows mapping; no further FMA→UBERON parent lookup is needed. -needs_mapping_fma_22424 articularis genu muscle has_muscle_insertion Anatomical insertion is on the suprapatellar bursa / synovial membrane of the knee joint. UBERON currently lacks specific terms for 'suprapatellar bursa' or 'synovial membrane of knee joint capsule'. Omit has_muscle_insertion for now; curator may add later if/when those structures are added to UBERON. -needs_mapping_fma_323951 _parent_FMA:323951 FMA:323951 (lumbar part of diaphragm) is not directly xref'd in UBERON. The closest UBERON concept is UBERON:0014765 'crus of diaphragm' (which is the lumbar/vertebral part of the diaphragm). Not needed here because the child term itself matches an existing UBERON term. If a separate UBERON term for the lumbar part of the diaphragm is desired, it could be added with FMA:323951 as xref; otherwise treat UBERON:0014765 as functionally equivalent. -uberon_0000975 __parent_id__ Supplied parent UBERON:0000975 is 'sternum' — wrong anatomical domain for a part of the diaphragm. The correct parent for a costal-diaphragm subdivision is UBERON:0001103 (diaphragm). The existing UBERON term UBERON:0035831 (costal diaphragm) already has 'part_of UBERON:0001103'. Use UBERON:0001103 (diaphragm) as the parent. No new term needed: confirmed match to UBERON:0035831 makes this term ineligible for the leaf template. -uberon_0000979 interspinales cervicalis muscle Source-supplied parent_id UBERON:0000979 resolves to 'tibia', which is clearly an upstream data error (interspinales cervicis is a deep neck muscle, not a leg bone). Used anatomical knowledge and similar UBERON deep neck muscles (rectus capitis posterior major UBERON:0008454, longus colli UBERON:0001121, semispinalis cervicis precedent) to determine the appropriate genus and part_of. Curator should ignore the source UBERON:0000979 parent assignment. The chosen genus 'muscle of vertebral column' (UBERON:0004518) is consistent with other named vertebral-column muscles in UBERON; part_of 'neck' (UBERON:0000974) follows the precedent of rectus capitis posterior major. has_muscle_origin and has_muscle_insertion are both set to UBERON:0001076 (neural spine / spinous process of vertebra) because the muscle spans between adjacent cervical spinous processes; UBERON does not currently have a more specific 'spinous process of cervical vertebra' class. innervated_by is the dorsal ramus of spinal nerve (UBERON:0006839); a more specific 'medial branch of dorsal ramus of cervical spinal nerve' class does not exist in UBERON. -uberon_0001092 hamstring portion of adductor magnus muscle Source parent UBERON:0001092 (vertebral bone 1 / atlas vertebra) is anatomically incorrect for a thigh muscle subdivision. Refined parent is UBERON:0000370 (adductor magnus), with the term modelled as a muscle head (UBERON:0011906) part_of adductor magnus. Use UBERON:0000370 as the part_of parent. UBERON:0000370's own definition explicitly describes this 'hamstring portion' as the part arising from the ischial tuberosity. -uberon_0001194 inferior longitudinal lingual muscle Input parent_id UBERON:0001194 resolves to 'splenic artery' — clearly wrong for this term. Correct parent assigned from anatomical context: UBERON:0001576 'intrinsic muscle of tongue' (genus), mirroring sibling intrinsic tongue muscles (UBERON:0008582 superior longitudinal, UBERON:0008583 transverse, UBERON:0008584 vertical). Verify upstream parent ID assignment; the source row likely intended UBERON:0001576 (intrinsic muscle of tongue) or UBERON:0000378 (tongue muscle). -uberon_0001537 lateral compartment of leg muscle Source-supplied parent UBERON:0001537 refers to 'anterior tibial artery', not an anatomical region containing leg muscles — clearly a wrong mapping in the input. No existing UBERON class for 'lateral compartment of leg' (the fascial compartment) was found via awk over uberon-edit.obo, so no part_of target could be populated. Closest precedent term is UBERON:0002463 'muscle of posterior compartment of hindlimb stylopod' which uses is_a UBERON:0014892 (skeletal muscle organ, vertebrate) plus muscle-overlay relations; this term follows that pattern. Conceptually this is a collective/group class (fibularis longus + fibularis brevis); curator may wish to (a) reroute to the groups template and/or (b) first add a new UBERON term for 'lateral compartment of leg' (subdivision of leg) to serve as a proper part_of target. Curator: confirm name correction; consider creating UBERON term for 'lateral compartment of leg' (fascial compartment) before finalising, then add relationship: part_of . Alternatively, reclassify as group term with genus UBERON:0014892 and location set to the new compartment term. -uberon_0001546 lateral posterior cervical intertransversarii muscle Source parent_id UBERON:0001546 resolves to 'posterior tibial vein', which is anatomically incorrect for a cervical paraspinal muscle. No specific UBERON term currently exists for this muscle; closest existing classes are UBERON:0001630 (muscle organ) as genus and UBERON:0004465 (musculature of neck) as collective. Existing 'm. intertransversarius capitis' classes (UBERON:3010664, UBERON:3010667) are amphibian-sourced and not equivalent. Use UBERON:0001630 (muscle organ) as is_a and UBERON:0000974 (neck) as part_of, with has_muscle_origin/insertion = UBERON:0018143 (transverse process of cervical vertebra) and innervated_by = UBERON:0006838 (ventral ramus of spinal nerve). No real PMID located; rely on existing def_xref (FIPAT TA2 + ISBN:9780323393225 Drake Gray's Anatomy + ASCTB-TEMP placeholder); curator may wish to add a primary anatomical reference such as Standring Gray's Anatomy. -uberon_0001624 opponens digiti minimi muscle Source-supplied parent_id UBERON:0001624 resolves to 'anterior cerebral artery', which is anatomically unrelated to a hand muscle. This appears to be an upstream parent-mapping error in the HRA ASCTB input. Curator should report/correct the source parent assignment. The term itself already exists as UBERON:0036176 and is excluded from the new-term template. -uberon_0001677 source parent UBERON:0001677 Source-assigned parent UBERON:0001677 is 'sphenoid bone', which is anatomically incorrect for levator costarum muscle (a chest/back muscle). The correct parent in UBERON is UBERON:0002426 'chest muscle' (already used by the existing match UBERON:8410070). Curator should review the upstream ASCTB mapping that produced UBERON:0001677 as a parent here; the existing UBERON:8410070 (levator costarum) supersedes this NTR. -uberon_0001876 external anal sphincter muscle Source parent_id UBERON:0001876 resolves to 'amygdala' — a brain region, evidently a data-entry error in the ASCTB-TEMP input. Not an issue for output (term is a confirmed_match excluded from template), but flagged for curator awareness. Curator should add ASCTB-TEMP source IRI (https://purl.org/ccf/ASCTB-TEMP_external-anal-sphincter-muscle) and 'external anal sphincter muscle' as a synonym to UBERON:0001367. No new term needed. -uberon_0003690 input parent UBERON:0003690 Source parent UBERON:0003690 resolves to 'fused sacrum' (a bone), which cannot be a parent of a muscle. This appears to be an upstream mapping error in the ASCTB-TEMP source data. No action required — term already exists in UBERON as UBERON:0005454 and is auto-excluded from the template via confirmed_matches. -uberon_0005893 frontal belly of occipitofrontalis muscle Source parent UBERON:0005893 is 'leg bone' — clearly an incorrect parent for a facial muscle belly. Flag for curator review of the input row, but no action needed in template since the term is a confirmed existing match. Curator: verify HRA source row; the term itself already exists as UBERON:0010952. -uberon_0015173 puboperineales muscle Source parent UBERON:0015173 ('helicine branch of uterine artery') is clearly a misalignment in the input data — it is an artery, not a muscle. Resolved to the anatomically correct parent levator ani muscle (UBERON:0001326) following the precedent of puborectalis (UBERON:0011512) and pubococcygeus (UBERON:0011528), which are also slips of the levator ani with the same is_a/part_of pattern. Curator should ignore the source parent_id and use UBERON:0001326 (levator ani muscle) as part_of, UBERON:0001325 (muscle of pelvis) as is_a. -uberon_8600052 puboanalis muscle Source parent UBERON:8600052 not present in uberon-edit.obo (presumably a recently minted grouping class). Followed the precedent of sibling levator ani components (puborectalis UBERON:0011512, pubococcygeus UBERON:0011528, iliococcygeus UBERON:0011398) which all use is_a muscle of pelvis (UBERON:0001325) and part_of levator ani muscle (UBERON:0001326). Curator: confirm whether UBERON:8600052 is intended as the parent and, if so, verify its placement in the hierarchy; otherwise leave is_a/part_of as written. -unresolvable_intertransversarii_laterales_lumborum intertransversarii laterales lumborum muscle (source parent) The source-assigned parent 'intertransversarii laterales lumborum muscle' is not present in UBERON. OLS4 returns no UBERON term for this label or for FMA:32544 (intertransversarii laterales lumborum). The closest UBERON terms are UBERON:3010664 / UBERON:3010667 (amphibian m. intertransversarius capitis sup./inf., not equivalent) and UBERON:0008242 (lower back muscle), which is a broader regional grouping. As an interim solution this term has been placed part_of UBERON:0008242 (lower back muscle) with genus UBERON:0014892 (skeletal muscle organ, vertebrate). Curator should consider creating the parent muscle 'intertransversarii laterales lumborum (muscle)' (FMA:32544) as a sibling NTR and then re-parenting this ventral part as part_of that new term. A matching 'dorsal part of intertransversarii laterales lumborum muscle' (FMA:32546) will also be needed. -unresolvable_levator_costarum_muscle levatores costarum longi of levator costarum muscle Parent 'levator costarum muscle' resolves to UBERON:8410070 (levator costarum). The source label suggests these are a named sub-component (the long fasciculi of the four lower levatores costarum). UBERON has no specific class for this sub-component, but the parent UBERON:8410070 itself already covers the levatores costarum collectively (its definition explicitly references both 'levatores costarum breves' and 'levatores costarum longi' as the two fasciculi of each muscle). Curator decision needed: (a) accept this NTR as a part_of subdivision of UBERON:8410070 with genus 'skeletal muscle organ, vertebrate' (UBERON:0014892), as encoded in leaf_template_rows; OR (b) drop the NTR and instead add 'levatores costarum longi' as an EXACT synonym (with a clarifying scope) on UBERON:8410070, since the parent term's textual definition already enumerates the longi/breves fasciculi. Option (b) is more parsimonious if HRA only needs name-level findability. Option (a) is preferred if the longi fasciculus must be addressable as a distinct entity (e.g. for downstream attachment/innervation annotation). Innervation set to dorsal ramus of spinal nerve (UBERON:0006839) following Morrison 1953 (PMID:13129167). -unresolvable_meningohypophyseal_artery dorsal part of intertransversarii laterales lumborum muscle Source-supplied parent label 'meningohypophyseal artery' is wrong-domain (a cranial artery cannot parent a lumbar back muscle) and is clearly a data-entry error in the input. The parent muscle 'intertransversarii laterales lumborum' (FMA:32576 / FMA:32577) and the higher class 'intertransversarii lumborum' do not yet exist in UBERON, so no exact named-muscle parent is available; the dorsal part has been placed under genus UBERON:0001630 (muscle organ) and part_of UBERON:0001137 (dorsum/back) by analogy with other deep back muscles such as longissimus, spinalis, and rotator muscle of the vertebral column. The bone-landmark 'accessory process of lumbar vertebra' is not in UBERON, so the more general UBERON:0001077 (transverse process of vertebra) is used for has_muscle_origin (the accessory process is a small projection on the posterior aspect of the transverse process region). Curator should: (1) consider adding parent terms 'intertransversarii lumborum muscle group' and 'intertransversarii laterales lumborum muscle' to UBERON (FMA:32576, FMA:32577) so this dorsal part can be made part_of its true named-muscle parent; (2) optionally add 'accessory process of lumbar vertebra' (FMA:34047) for a more precise has_muscle_origin; (3) consider whether a 'muscle of vertebral column' is_a (UBERON:0004518) is preferable to the generic muscle organ once the parent muscle exists. -unresolvable_neuromeningeal_trunk source parent 'neuromeningeal trunk' Wrong-domain parent label supplied by source. 'Neuromeningeal trunk' refers to a nerve trunk (a branch arrangement of the glossopharyngeal/vagus or ascending pharyngeal artery's neuromeningeal trunk), not to any muscle structure. It cannot serve as a parent for a muscle belly. Discard the source parent label. The child term 'occipital belly of occipitofrontalis muscle' is already represented as UBERON:0010947 (occipitalis), with is_a UBERON:0010938 (muscle belly) and part_of UBERON:0010946 (occipitofrontalis muscle). Exclude this row from the NTR template; add 'occipital belly of occipitofrontalis muscle' as an EXACT synonym on UBERON:0010947 if not already exhaustively covered (current EXACT synonym is 'occipital belly of occipitofrontalis' — adding the trailing 'muscle' variant may be useful). -unresolvable_respiratory_diaphragm_muscle sternal part of respiratory diaphragm muscle Source parent label 'respiratory diaphragm muscle' has no exact UBERON match but maps to UBERON:0001103 (diaphragm) which has synonym 'diaphragm muscle' (BTO:0000341). Resolved to UBERON:0001103 (diaphragm). Precedent: sibling term 'costal diaphragm' (UBERON:0035831, FMA:58277) uses is_a UBERON:0000063 (organ subunit) + part_of UBERON:0001103. Same pattern applied here. -unresolvable_segmental_back_muscle segmental back muscle (ASCTB-TEMP parent label) No UBERON class for 'segmental back muscle' as a grouping; OLS4 search found no muscle-level intertransversarii classes in UBERON (only AAO-derived amphibian terms UBERON:3010664/3010667 for m. intertransversarius capitis). Used UBERON:0014892 (skeletal muscle organ, vertebrate) as genus and the specific vertebral-column region (UBERON:0006072/0006073/0006074) as part_of differentiator, with UBERON:0002324 'muscle of back' retained in resolved_parents as the recommended fallback structural parent. Curator may add a grouping class 'segmental back muscle' (a subclass of UBERON:0002324 muscle of back, has_part some intertransversarius/interspinalis/rotator) in a future iteration; not required for these leaf terms. -unresolvable_submucosal_artery_of_colon rectus capitius posterior minor muscle Input file was named 'unresolvable_submucosal_artery_of_colon.json' and listed parent_id UNRESOLVABLE:'submucosal artery of colon' for both is_a and part_of. That parent is wrong-domain (a colonic artery) for a suboccipital skeletal muscle and appears to be a pipeline mislabel. Disregard the bogus 'submucosal artery of colon' parent. The term itself is a confirmed match to UBERON:0008455 (rectus capitis posterior minor); no new term is needed. Had a new term been required, the correct parents would have been: is_a UBERON:0004518 (muscle of vertebral column) and part_of UBERON:0000974 (neck), mirroring the other rectus capitis muscles. -unresolvable_supraperiosteal_arteriole inferior head of lateral pterygoid muscle Source parent label 'supraperiosteal arteriole' is wrong-domain (a vascular structure) for this masticatory muscle head; the parent was overridden based on the child term itself. Use UBERON:0011906 (muscle head) as genus and UBERON:0006719 (lateral pterygoid muscle) as part_of; this mirrors the UBERON pattern for UBERON:0007168 (long head of biceps brachii) and similar muscle-head terms. -unresolvable_thoracic_wall_muscle parent: thoracic wall muscle Source-assigned grouping parent 'thoracic wall muscle' has no exact UBERON equivalent. The closest grouping classes in UBERON are UBERON:0002426 (chest muscle) and UBERON:0016403 (thoracic wall, anatomical region). However, the specific parent muscle 'levator costarum' (UBERON:8410070) already exists in UBERON and is itself is_a UBERON:0002426 ! chest muscle, so the chain is preserved. Use part_of UBERON:8410070 (levator costarum) as the immediate containing structure; is_a UBERON:0014892 (skeletal muscle organ, vertebrate) supplies the genus class. The thoracic-wall-muscle grouping is implicit via the parent muscle's own is_a chain. No new grouping term is required. From bb73ff67cfb5877945b6b9e15541d501b4d56574 Mon Sep 17 00:00:00 2001 From: David Osumi-Sutherland Date: Mon, 11 May 2026 18:52:35 +0100 Subject: [PATCH 12/22] review.tsv: add mapped_label, parent_correction_label, mapping_evidence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three new columns make curator review substantially faster: - mapped_label: human-readable label of the mapped UBERON term (looked up from src/ontology/uberon-edit.obo). For new terms, shows '(new term: