Scope

This document describes the record: what an anatomic location carries and what each field means. The verbatim JSON Schema and the full runtime field list live in the anatomic location record format reference. Two datasets exist and are not reconciled with each other, so both are described here; lineage and current implementation says which is current and why.

DatasetRecordsVersionField naming
body_parts.json, the original curated set2,8901.0.0-rc.1radlexId, containedById, leftId
anatomic_locations_noembed.json, the current curated set2,926undeclared_id, containedByRef, leftRef

The identifier

Every record is keyed by a RadLex identifier. The original schema constrains it to the pattern ^RID\d+(_RID\d+)*$, which admits both a plain identifier and a composite one.1

A composite identifier is how a sided variant is named. RadLex has modifier concepts for left (RID5824) and right (RID5825), and a sided structure joins the base to the modifier with an underscore. The left uterine adnexa is RID294_RID5824; the right is RID294_RID5825. Of the 2,926 current records, 1,910 carry a plain RadLex identifier and 1,016 are composite. The original set has 1,880 plain identifiers among its 2,890 records.

Composite identifiers are a local convention, not RadLex content. The next-generation vocabulary work records them as “the exception the RadLex track will remove by minting real ids.”2

Descriptive fields

FieldBoth lineagesMeaning
descriptionrequiredLowercase display name, one per record
synonymsoptionalClinical shorthand; 1,126 records in the original set, 1,156 in the current one
definitioncurrent set onlyA brief definition with its source in brackets, on 278 records
sexSpecificoptionalMale or Female; 110 records in both sets

sexSpecific is present in the current data but absent from that lineage’s field reference, along with a stray anatomicLocationsId on a single record.

The two hierarchies

Every record carries a containment parent. The distinction between the two hierarchies is stated on the original project’s code page: the contained-by hierarchy is “physically contained in,” as a kidney is in the retroperitoneum, and the part-of hierarchy is “a component of a larger structure or system,” as the adnexa are part of the female genital system.3 See contained by and part of.

RelationOriginal fieldCurrent fieldCoverage in the current set
Spatial parentcontainedById (required)containedByRef2,926, every record
Spatial childrennot storedcontainsRefs186
Mereological parentpartOfIdpartOfRef1,123
Mereological childrennot storedhasPartsRefs334

The original set stores parent pointers only and lets a library derive children. The current set stores both directions as {id, display} reference objects, so a consumer can read a node’s children without indexing the whole file. Containment is a rooted tree from RID39569, whole body. The part-of relation covers fewer than half the records and is not a tree.

Two data defects are visible in the current file and are worth knowing before traversing it. 111 records carry a partOfRef pointing at themselves, and one carries a self-referential leftRef. The build process already expects self-referential containment at the root, which is legitimate, but self-referential part-of on 111 nodes is not.4

Laterality triads

A sided structure is represented by three records, not by a flag on one. The generic record carries leftRef and rightRef; each sided record carries unsidedRef back to the generic one and a reference to its counterpart. The full convention, including the containment and synonym rules for sided entries, is in laterality conventions. See also laterality.

FieldOriginal setCurrent set
Left variantleftId, 1,611leftRef, 1,625
Right variantrightId, 1,611rightRef, 1,625
Generic variantunsidedId, 1,584unsidedRef, 1,597

Classification

The current set adds a region to every record, one of nine values. The runtime model exposes it as an AnatomicRegion enumeration with exactly those nine members.5

RegionRecordsRegionRecords
Head869Abdomen212
Upper Extremity582Pelvis152
Lower Extremity579Breast46
Neck235Body25
Thorax226

The field reference for the curation format lists "Spine" among the common region values, but no record uses it and the runtime enumeration has no spine member.

Three further classification fields exist on the runtime model and are empty in the data: location_type (structure, space, region, body part, system, group), body_system (ten systems), and structure_type (roughly forty finer types, set only when the location type is structure).6 The next-generation vocabulary analysis confirms this, recording that “the package’s structure-type, body-system, and location-type fields exist but are empty in this data,” and names the absence of a type relation over locations as “the major shortcoming” for scope statements of the form “applies to tendons.”2 See anatomic scope.

External codes

Both sets cross-reference other terminologies. The original set puts every code in one codes array of {system, code}. The current set promotes SNOMED CT to its own pair of fields with a display name, adds an ACR Common identifier, and leaves the rest in codes.

CodeOriginal setCurrent set
SNOMED CT1,732 in codes1,782 as snomedId with snomedDisplay
FMA1,6431,649
UMLS578580
MeSH232233
ACR Commonabsent2,025 as acrCommonId
Any code at all2,282 of 2,8902,318 of 2,926

SNOMED coding follows one rule without exception: of the Structure, Entire, and Part concepts in a SNOMED anatomy triad, use the “Structure of” concept, because that is what SNOMED intends for finding sites and procedure sites.7

A real record

The current format, unchanged from the data file. It shows containment, part-of, a synonym, three codes, and a definition with its source.

{
  "_id": "RID10021",
  "acrCommonId": "4013944",
  "snomedId": "81502006",
  "snomedDisplay": "Hypopharyngeal structure",
  "description": "hypopharynx",
  "region": "Neck",
  "containedByRef": { "id": "RID7488", "display": "neck" },
  "synonyms": ["laryngopharynx"],
  "partOfRef": { "id": "RID13211", "display": "pharynx" },
  "codes": [
    { "system": "FMA", "code": "54880" },
    { "system": "MESH", "code": "A14.724.490" },
    { "system": "UMLS", "code": "C0014540" }
  ],
  "definition": "The portion of the pharynx between the inferior portion of the oropharynx and the larynx. [MeSH]"
}

From record to usable object

The curation format is what an editor changes. The package that consumes it normalizes each record into an AnatomicLocation object, resolves the reference objects, adds a laterality enum, and precomputes a materialized containment path and part-of path so that ancestry, descendants, and the “is X inside Y” test are string comparisons rather than recursive walks.4 A location converts to an index code with system anatomic_locations, its RadLex identifier as the code, and its description as the display, which is the form it takes when attached to a finding model.6

Footnotes

  1. body_parts_schema.json, anatomiclocations.org ↩

  2. The anatomy axis, current state, ACR-RSNA-CDEs next-gen-2026 ↩ ↩2

  3. anatomiclocations.org data file description ↩

  4. Rich anatomic location DuckDB with relationships ↩ ↩2

  5. Anatomic location enumerations, anatomic-locations package ↩

  6. AnatomicLocation runtime model, anatomic-locations package ↩ ↩2

  7. Anatomic Locations source JSON field reference, findingmodel ↩