All of it is synthetic

Every patient, identifier, date, and line of report text in this data set is written test data. The names, medical record numbers, and birth dates do not belong to real people, and the reports were authored for the project. Counts below were read at commit 06f64a7 on main and 36fa30c on dev.

The three sample sets

SetPatientsContentsPurpose
example1one, Jane Smith, MRN0000002, born 1985-06-15two Exam Finding Lists with 6 and 7 findings, one Imaging Problem List with 10 entries, and the two source FHIR DiagnosticReports they were derived fromshows the transformation end to end, including the FHIR input
example2one, John Doe, MRN0000001, born 1961-01-01ten exams, ten Exam Finding Lists, ten source reports in markdown, one Imaging Problem List, and a working spreadsheetthe main longitudinal data set
example3 (development branch only)none, unattributed reports31 plain-text radiology reportsextraction input for the batch pipeline and evaluation harness, not Exam Finding Lists

example2 in detail

Ten exams over four and a half years, from 2021-05-22 to 2025-10-07, across seven distinct LOINC exam types.

DateExamLOINC
2021-05-22XR Shoulder, left26158-6
2021-06-14XR Chest30745-4
2021-08-26CT Abdomen and Pelvis WO contrast36952-0
2022-02-08US Abdomen24558-9
2022-03-15XR Chest30745-4
2022-09-22CT Chest WO contrast29252-4
2022-11-03CT Abdomen and Pelvis W contrast IV36813-4
2023-01-18CT Abdomen and Pelvis W contrast IV36813-4
2023-01-25MR Brain WO and W contrast IV24587-8
2025-10-07CT Abdomen and Pelvis WO contrast36952-0

Findings per exam range from 9 on the shoulder radiograph to 48 on the January 2023 abdominal computed tomography. The presence values that occur are present, absent, and indeterminate.

What the branches differ on

The two branches hold the same exams and very nearly the same findings. What changed on dev is the anatomic enrichment and the regrouping that followed it.

Measuremaindev
Exam Finding Lists in example21010
Total observations across them275276
Observations carrying an anatomicLocation0274
Entries in the example2 Imaging Problem List98123
Observations in that problem list275276

The two observations without a location are in the brain magnetic resonance study, where the assignment rules require leaving a structure unassigned rather than forcing a wrong code when the ontology has no entry for it. The jump from 98 entries to 123 is the grouping key change, from finding code alone to finding code and location identifier; the observations did not multiply, the groups got finer. Both are explained in Imaging Problem List.

File layout

sample_data/ follows a flat naming convention, with one Exam Finding List per exam named after the exam and date.

sample_data/
  example1/
    sample_efl.json          CT abdomen and pelvis, 6 findings
    chest_ct_efl.json        CT chest, 7 findings
    sample_ipl.json          the two aggregated, 10 entries
    powerscribe-fhir.json    the source FHIR DiagnosticReport for the first
    chest-ct-fhir.json       the source FHIR DiagnosticReport for the second
  example2/
    xr_shoulder_20210522.md          the synthetic report
    xr_shoulder_20210522_efl.json    its Exam Finding List
    ... eight more pairs ...
    MRN0000001_ipl.json              all ten aggregated
    findings_with_oifm_ids.xlsx      the working spreadsheet
  example3/                          31 .txt reports, dev branch only

The viewer reads a different, nested layout, documented in the repository’s own notes.1

viewer/data/
  patients.json                            manifest of all patients
  patients/<patient-id>/
    patient.json                           demographics and exam count
    ipl.json                               the Imaging Problem List
    exams/<report-id>/
      efl.json                             the Exam Finding List
      report.txt                           raw report text
  exam_type_mappings.json                  short display names for exam types
  finding_region_mappings.json             98 finding-to-body-region entries

Its bundle covers both synthetic patients: patient-mrn0000001 with 10 exams and 98 problem list entries, and patient-mrn0000002 with 2 exams and 10 entries. This bundle was not re-enriched. On both main and dev it holds the 98-entry, location-free problem list, so the deployed first-generation viewer shows the pre-anatomy data.

The second-generation viewer has its own bundle under viewer_v2/public/data/, built from sample_data/example2, carrying the 123-entry anatomy-grouped list for the one patient, with reports as markdown rather than text and extra files for the anatomy index, anatomy clusters, and finding display information. Its manifest is stamped viewer-v2-data.1 and records its own source paths and warnings.

The spreadsheet

findings_with_oifm_ids.xlsx is the human working sheet the whole example2 set was built from. It is one row per finding per exam, with columns Exam Date, Exam Type, Exam Code, Finding, OIDM Finding Model Name, OIDM FMID, Presence OIFMA_ID, Present/Absent, and Text.2 It records where the finding model and attribute identifiers were assigned by hand, which is why it is worth keeping alongside the generated JSON.

Regenerating

Four scripts produce the data, in this order.

ScriptWhat it does
generate_efl_from_excel.pyreads the spreadsheet, groups rows by exam, writes one *_efl.json per exam with a fresh UUID diagnosticReportId2
enrich_efl_anatomy.pyruns each finding through the production coding pipeline to attach an anatomicLocation, and writes a review CSV of every location decision with candidates and unresolved reasons. The pass is additive and idempotent: re-running recomputes and overwrites.3
generate_ipl_from_efls.pyreads a directory of *_efl.json files sorted by filename, groups by finding code and location identifier, writes one ipl.json4
build_viewer_v2_data.pybuilds the static JSON bundle the second-generation viewer serves5

Only the enrichment step calls a language model. The other three are deterministic. Exact invocation belongs with the code and is not repeated here; see the repository.

Footnotes

  1. imaging-problem-list domain model notes, main branch ↩

  2. generate_efl_from_excel.py ↩ ↩2

  3. enrich_efl_anatomy.py ↩

  4. generate_ipl_from_efls.py ↩

  5. build_viewer_v2_data.py ↩