Two questions

Laterality is decided twice in OIDM, and the rules are different. Curation decides how a sided structure is represented in the anatomic location set. Coding decides which of those records a given finding in a given report gets. The first half of this document is the curation convention, migrated from the finding model repository’s curation skill.1 The second half is the assignment rule from the extraction platform.2

Compound identifier pattern

Lateralized locations use RadLex modifier identifiers appended to the base identifier.

ModifierRIDCompound identifier pattern
LeftRID5824{base_RID}_RID5824
RightRID5825{base_RID}_RID5825

For the pulmonary hilum, RID34566: generic RID34566, left RID34566_RID5824, right RID34566_RID5825.

The three-entry pattern

For every lateralized structure, create three entries. The wrapper libraries state the same convention from the consumer’s side: “for cases where the body part is sided, the index contains three versions: an unsided version, a left-sided version, and a right-sided version. All of these are aware of each other.”34

Generic, unsided entry

Has both leftRef and rightRef pointing to the lateralized variants.

{
  "_id": "RID34566",
  "description": "pulmonary hilum",
  "snomedId": "46750007",
  "snomedDisplay": "Structure of hilum of lung",
  "containedByRef": {"id": "RID1301", "display": "lung"},
  "leftRef": {"id": "RID34566_RID5824", "display": "left pulmonary hilum"},
  "rightRef": {"id": "RID34566_RID5825", "display": "right pulmonary hilum"},
  "synonyms": ["hilum", "lung hilum", "hilum of lung"]
}

Left entry

Identifier {base}_RID5824. Has rightRef, its counterpart, and unsidedRef, back to the generic. containedByRef points to the left version of the container when one exists.

{
  "_id": "RID34566_RID5824",
  "description": "left pulmonary hilum",
  "snomedId": "1650005",
  "snomedDisplay": "Structure of hilum of left lung",
  "containedByRef": {"id": "RID1326", "display": "left lung"},
  "rightRef": {"id": "RID34566_RID5825", "display": "right pulmonary hilum"},
  "unsidedRef": {"id": "RID34566", "display": "pulmonary hilum"},
  "synonyms": ["left hilum", "left lung hilum", "hilum of left lung"]
}

Right entry

Identifier {base}_RID5825. Has leftRef, its counterpart, and unsidedRef. containedByRef points to the right version of the container, here RID1302, right lung.

How the build system reads laterality

References presentLaterality valueExplanation
leftRef and rightRefgenericHas both sides, so it is the generic form
leftRef onlyrightPoints at its left counterpart, so this is the right variant
rightRef onlyleftPoints at its right counterpart, so this is the left variant
unsidedRef onlygenericMaps to generic
NonenonlateralNot a lateralized structure

The key insight is that a reference points at the counterpart, not at itself. A left entry has rightRef and unsidedRef. It does not have leftRef, because it is the left variant.

This inversion is easy to get wrong, and it has been got wrong: open issue 39 in the finding model repository reports that the build’s determine_laterality() assigns left and right backwards.5

Containment and synonyms for sided entries

When the containing structure is itself lateralized, each variant points to the matching side. Generic to the generic container, left to the left container, right to the right container. When the container is not lateralized, the mediastinum for example, all three entries point to the same container.

Synonyms follow a consistent pattern. Generic ["hilum", "lung hilum", "hilum of lung"], left ["left hilum", "left lung hilum", "hilum of left lung"], right the same with “right.”

Assigning a side to a finding

Curation says which records exist. Assignment says which one a given observation gets. The precedence is stated as explicit text side, then sided-exam side, then generic unsided.2

  • A non-sided exam never introduces a side. On a CT abdomen, “adrenal glands unremarkable” resolves to the generic adrenal gland, not to a left one. “No hydronephrosis” with no side stated resolves to the generic kidney.
  • A sided exam sides the finding. A left shoulder radiograph plus “humerus fracture” resolves to the left humerus.
  • Resolve laterality against the full report section, not the finding’s isolated quote. A finding’s report text is one verbatim snippet, and the side is often stated only in a section header or an earlier sentence. When a section establishes a side it applies to every finding in that section unless a later sentence contradicts it. Coding from the isolated snippet silently drops section laterality and under-calls findings to the generic structure.
  • Never infer a side across exams or from clinical priors. If this report’s section gives no side, the finding stays generic even when a prior exam localized the same problem.

Bilateral findings

CaseResult
Positive bilateral, separable, meaning discrete independent lesions per sideSplit into two findings, one left and one right, each duplicating the original attributes and report text
Positive bilateral, inseparable, meaning a single diffuse entity named as oneGeneric unsided structure, not split
Spatially contiguous finding crossing the midlineSingle finding, unsided structure
Generic absent, as in “no adrenal nodule” on a paired organ with no sideGeneric organ, never a side

The operational test for separable against inseparable: if you could meaningfully say “the left one is larger or newer,” it is separable; if it is a named diffuse entity, it is inseparable.2

The full ladder, including the specificity and exam-region rules that surround these laterality rules, is in anatomic location assignment rules.

Known limitation

Generic and specific location pairs for the same finding code across exams, “kidney” against “left kidney” for instance, still produce separate Imaging Problem List groups. Deciding whether such observations are the same problem is recorded as an unresolved anatomic-compatibility reconciliation step.2

Footnotes

  1. Laterality conventions, manage-anatomic-locations skill reference, findingmodel ↩

  2. Anatomic location assignment rules, imaging-problem-list dev ↩ ↩2 ↩3 ↩4

  3. BodyPartIndex.py README ↩

  4. BodyPartIndex.ts README ↩

  5. findingmodel issue 39 ↩