gem-mapping-studio 0.2.2__tar.gz → 0.2.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gem_mapping_studio-0.2.4/PKG-INFO +291 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/README.md +40 -10
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/pyproject.toml +4 -4
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/adjudicate_ui.py +618 -86
- gem_mapping_studio-0.2.4/src/python/main/gem_mapping_studio.egg-info/PKG-INFO +291 -0
- gem_mapping_studio-0.2.2/PKG-INFO +0 -465
- gem_mapping_studio-0.2.2/src/python/main/gem_mapping_studio.egg-info/PKG-INFO +0 -465
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/LICENSE-code.txt +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/LICENSE.txt +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/setup.cfg +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/_reference/__init__.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/_reference/dimensions.md +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/_reference/genetic_evidence.shacl.ttl +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/_reference/semantic_types.yaml +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/extraction/__init__.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/extraction/extract_annotations.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/extraction/extract_annotations_pypdf.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/extraction/yaml_to_rdf.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/__init__.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/_paths.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/build_umls_crosswalk.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/classify_credibility_sweep.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/fetch_semantic_network.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/local_umls.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/render_crosswalk_tex.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/semantic_types.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/sweep.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/uts_client.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/validation/__init__.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/validation/compute_coverage.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/validation/validate_annotations.py +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/gem_mapping_studio.egg-info/SOURCES.txt +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/gem_mapping_studio.egg-info/dependency_links.txt +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/gem_mapping_studio.egg-info/entry_points.txt +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/gem_mapping_studio.egg-info/requires.txt +0 -0
- {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/gem_mapping_studio.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: gem-mapping-studio
|
|
3
|
+
Version: 0.2.4
|
|
4
|
+
Summary: Forome Genetic Evidence Model: a reference data model, UMLS/OMOP crosswalk tooling, and SHACL validation for basic-science genetic evidence
|
|
5
|
+
Author-email: Michael Bouzinier <michael.bouzinier@forome.org>
|
|
6
|
+
License-Expression: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://w3id.org/genetic-evidence-model/
|
|
8
|
+
Project-URL: Repository, https://github.com/ForomePlatform/genetic-evidence-model
|
|
9
|
+
Keywords: genetic evidence,semantic model,UMLS,crosswalk,SHACL,biomedical informatics,variant interpretation,curation
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Intended Audience :: Science/Research
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
|
|
19
|
+
Requires-Python: >=3.10
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE-code.txt
|
|
22
|
+
Requires-Dist: pyyaml>=6.0
|
|
23
|
+
Requires-Dist: ruamel.yaml>=0.18
|
|
24
|
+
Requires-Dist: rdflib>=7.0
|
|
25
|
+
Requires-Dist: pyshacl>=0.27
|
|
26
|
+
Requires-Dist: requests>=2.28
|
|
27
|
+
Requires-Dist: PyMuPDF>=1.23
|
|
28
|
+
Requires-Dist: pypdf>=4.0
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: pytest>=7; extra == "dev"
|
|
31
|
+
Provides-Extra: local
|
|
32
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "local"
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
|
|
35
|
+
# A Semantic Model of Genetic Evidence
|
|
36
|
+
|
|
37
|
+
[](https://doi.org/10.5281/zenodo.22260686)
|
|
38
|
+
[](https://pypi.org/project/gem-mapping-studio/)
|
|
39
|
+
|
|
40
|
+
A conceptual framework for representing scientific and genetic evidence from
|
|
41
|
+
the biomedical literature in a form suitable for variant interpretation,
|
|
42
|
+
automated reasoning, and AI-ready clinical infrastructure.
|
|
43
|
+
|
|
44
|
+
This repository accompanies a manuscript in preparation: an extended
|
|
45
|
+
version to be deposited on arXiv and a condensed version intended for
|
|
46
|
+
journal submission.
|
|
47
|
+
|
|
48
|
+
## What this repository contains
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
.
|
|
52
|
+
├── paper/ LaTeX source for the manuscript (main.tex, references.bib)
|
|
53
|
+
├── schema/ SHACL shapes + supporting definitions
|
|
54
|
+
├── annotations/ One YAML file per annotated publication + raw PDF extractions
|
|
55
|
+
├── case-reports/ Per-paper case reports (one for each of the six annotations)
|
|
56
|
+
├── protocols/ Annotation protocol documents (canonical rules + per-mode workflows)
|
|
57
|
+
├── skills/ Two Claude skills (annotation, review) that operationalise the protocols
|
|
58
|
+
├── data/umls/ UMLS crosswalk of the dimensional vocabulary + decision log (DECISIONS.md)
|
|
59
|
+
├── src/python/ The `gem-mapping-studio` package: Mapping Studio, crosswalk harness,
|
|
60
|
+
│ validators, PDF highlight/callout extraction (`forome.gem.*`)
|
|
61
|
+
├── figures/ Source files for figures used in the paper
|
|
62
|
+
├── docs/ Usage guides (STUDIO.md: the Mapping Studio)
|
|
63
|
+
├── .github/ CI configuration validating annotations against the schema
|
|
64
|
+
├── CHANGELOG.md What changed in each tagged release
|
|
65
|
+
└── KNOWN_LIMITATIONS.md What the model, schema, corpus, and tooling do not yet do
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## The annotation corpus
|
|
69
|
+
|
|
70
|
+
Six publications, chosen to span the major epistemic shapes of genetic
|
|
71
|
+
evidence encountered in literature-based variant interpretation:
|
|
72
|
+
|
|
73
|
+
| Annotation | Role in the paper | Source |
|
|
74
|
+
| ------------------------------- | ------------------------------------ | ---------------------------- |
|
|
75
|
+
| `jossin2017.yaml` (Llgl1) | molecular mechanism | manual (ground truth) |
|
|
76
|
+
| `davis2011.yaml` (TTC21B) | breadth exemplar | manual (ground truth) |
|
|
77
|
+
| `nelson1992.yaml` (CD18) | classical molecular genetics | manual (ground truth) |
|
|
78
|
+
| `gupta2015.yaml` (ATP6AP2) | low-credibility edge case | manual (ground truth) |
|
|
79
|
+
| `v0/duerr2006.yaml` (IL23R) | clean GWAS exemplar | AI-drafted, expert-reviewed |
|
|
80
|
+
| `v1/inouye2018.yaml` (metaGRS) | polygenic-score model-extension case | AI-drafted, expert-reviewed |
|
|
81
|
+
|
|
82
|
+
The four manual annotations live at the top of `annotations/`. The two
|
|
83
|
+
AI-drafted annotations are versioned: `annotations/v0/` holds the
|
|
84
|
+
original protocol-v0 drafts (curator-reviewed), and `annotations/v1/`
|
|
85
|
+
holds their re-annotation under the current protocol. The paper
|
|
86
|
+
documents **Duerr `v0`** and **Inouye `v1`** (the protocol matured on
|
|
87
|
+
the Duerr review and was then applied to Inouye); the other version of
|
|
88
|
+
each is retained for comparison.
|
|
89
|
+
|
|
90
|
+
For manually annotated papers, PDF highlights and sticky-note callouts are the
|
|
91
|
+
authoritative ground truth. The YAML is a structured transformation of those
|
|
92
|
+
artifacts, with every assertion carrying a `source_span` pointing back to the
|
|
93
|
+
specific page and quoted passage. Disagreements between the annotator and the
|
|
94
|
+
AI reviewer are not silently resolved: they are captured as `reviewer_query`,
|
|
95
|
+
`reviewer_suggestion`, or `reviewer_disagreement` fields so they remain
|
|
96
|
+
auditable.
|
|
97
|
+
|
|
98
|
+
For AI-drafted annotations, the same `source_span` anchoring is used, and
|
|
99
|
+
curator review is the evaluation signal.
|
|
100
|
+
|
|
101
|
+
Per-paper case reports are in `case-reports/`. Each report summarizes the
|
|
102
|
+
paper's role in the corpus, the decomposition into `GeneticEvidence` items,
|
|
103
|
+
the candidate extensions surfaced, the reviewer flags, and notes for
|
|
104
|
+
downstream consumers.
|
|
105
|
+
|
|
106
|
+
## Annotation protocols
|
|
107
|
+
|
|
108
|
+
The `protocols/` directory documents how annotations are produced, separately
|
|
109
|
+
from what they describe (the schema) and what they contain (the corpus). The
|
|
110
|
+
intent is that an annotation under this schema is reproducible and citable
|
|
111
|
+
under a versioned protocol, not an artifact of a particular annotator's
|
|
112
|
+
unwritten conventions.
|
|
113
|
+
|
|
114
|
+
- `protocols/PROTOCOL.md`: the canonical, mode-agnostic rules. Covers
|
|
115
|
+
decomposition principles (the lumper default), dimension assignment,
|
|
116
|
+
source-anchoring requirements, flag taxonomy, candidate-extension
|
|
117
|
+
promotion, normalization handling. Current version: 1.0.
|
|
118
|
+
- `protocols/PROTOCOL_AUTONOMOUS.md`: the operational workflow for autonomous
|
|
119
|
+
AI annotation (single pass, no curator in the loop). Specifies input
|
|
120
|
+
quality gating, self-consistency checks, mandatory confidence-summary
|
|
121
|
+
emission, and failure handling.
|
|
122
|
+
- `protocols/REVIEW_PROTOCOL.md` and
|
|
123
|
+
`protocols/REVIEW_PROTOCOL_INTERACTIVE.md`: the assertion-by-assertion
|
|
124
|
+
review protocol and its interactive, curator-in-the-loop variant, used
|
|
125
|
+
to adjudicate the AI-drafted annotations. Current version: 1.0.
|
|
126
|
+
- `protocols/LABELING_EXAMPLES.md`: worked cases for the recurring
|
|
127
|
+
judgment calls referenced by the protocols above.
|
|
128
|
+
|
|
129
|
+
A staged interactive *annotation* protocol (curator review of the
|
|
130
|
+
decomposition before dimension filling) is planned but not yet
|
|
131
|
+
specified.
|
|
132
|
+
|
|
133
|
+
The two AI-drafted annotations in the corpus (Duerr 2006, Inouye 2018) were
|
|
134
|
+
produced under what became `PROTOCOL_AUTONOMOUS.md` v1.0; their `provenance`
|
|
135
|
+
blocks record the protocol version retroactively.
|
|
136
|
+
|
|
137
|
+
## Skills
|
|
138
|
+
|
|
139
|
+
Two Claude skills in `skills/` operationalise the protocols:
|
|
140
|
+
|
|
141
|
+
- **`genetic-evidence-annotation/`** — autonomous drafting of a YAML annotation
|
|
142
|
+
for a paper (the autonomous protocol). Triggers on requests like "annotate
|
|
143
|
+
this paper under the genetic-evidence model" or "produce a GEM YAML annotation
|
|
144
|
+
for paper X".
|
|
145
|
+
- **`genetic-evidence-review/`** — interactive, curator-in-the-loop review of an
|
|
146
|
+
existing annotation (the review protocol). Triggers on "review this GEM
|
|
147
|
+
annotation", "audit this annotation against the paper", and similar; it emits
|
|
148
|
+
a review log, a review report, and the updated annotation.
|
|
149
|
+
|
|
150
|
+
Both follow the Agent Skills open standard and are portable across agents that
|
|
151
|
+
support it (Claude Code, Cursor, Copilot, and others), not Claude-specific.
|
|
152
|
+
Each skill references shared material **outside** its own folder, the protocols
|
|
153
|
+
in `protocols/`, the schema in `schema/`, and exemplar annotations in
|
|
154
|
+
`annotations/`, so it has to be installed together with that material.
|
|
155
|
+
|
|
156
|
+
### Installing in Claude Code (or another in-repo agent)
|
|
157
|
+
|
|
158
|
+
Run the agent inside a checkout of this repository and copy or symlink the
|
|
159
|
+
skill folder into your skills directory (project-local `.claude/skills/` or
|
|
160
|
+
user-global `~/.claude/skills/`), for example:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
ln -s "$PWD/skills/genetic-evidence-annotation" .claude/skills/
|
|
164
|
+
ln -s "$PWD/skills/genetic-evidence-review" .claude/skills/
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
The skills' repo-relative references (`protocols/...`, `schema/...`,
|
|
168
|
+
`annotations/...`) resolve because the agent runs at the repository root.
|
|
169
|
+
|
|
170
|
+
### Installing on Claude.ai (web / mobile / desktop)
|
|
171
|
+
|
|
172
|
+
Do **not** zip the `skills/<name>/` folder directly: the skill depends on files
|
|
173
|
+
outside that folder (protocols, schema, exemplars) that a bare zip would miss.
|
|
174
|
+
Instead build a self-contained bundle with the provided script:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
./build_skill_bundle.sh --skill annotation # -> genetic-evidence-annotation-skill.zip
|
|
178
|
+
./build_skill_bundle.sh --skill review # -> genetic-evidence-review-skill.zip
|
|
179
|
+
# add --check for an input-validation dry run
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
The script gathers `SKILL.md`, the relevant protocols, the schema, and (for the
|
|
183
|
+
annotation skill) the four curator-led exemplar annotations into one zip,
|
|
184
|
+
rewriting the paths for the flat bundle layout. Upload the resulting zip via
|
|
185
|
+
Customize > Skills > + Create skill (the bundle's top-level folder must be the
|
|
186
|
+
root of the zip, which the script ensures).
|
|
187
|
+
|
|
188
|
+
### Using the skills
|
|
189
|
+
|
|
190
|
+
Once installed, ask in natural language, for example:
|
|
191
|
+
|
|
192
|
+
> Annotate `papers/smith2024.pdf` under the genetic-evidence model.
|
|
193
|
+
|
|
194
|
+
> Review the GEM annotation in `annotations/smith2024.yaml` against the paper.
|
|
195
|
+
|
|
196
|
+
The annotation skill confirms the input paper, output path, and schema location,
|
|
197
|
+
then produces a single YAML file matching the existing annotations. The review
|
|
198
|
+
skill walks the annotation item by item with the curator and emits its three
|
|
199
|
+
artifacts (review log, review report, and the updated annotation).
|
|
200
|
+
|
|
201
|
+
## Extraction pipeline
|
|
202
|
+
|
|
203
|
+
The `forome.gem.extraction` modules read a PDF with highlights and callouts
|
|
204
|
+
and emit a structured JSON record of every annotation, including the text
|
|
205
|
+
covered by each highlight (extracted via coordinate lookup) and the free-text
|
|
206
|
+
notes attached to callouts.
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
python3 -m forome.gem.extraction.extract_annotations paper.pdf out.json
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Two extractors are provided. `extract_annotations.py` uses PyMuPDF and is the
|
|
213
|
+
recommended one: it reliably recovers the text under each highlight.
|
|
214
|
+
`extract_annotations_pypdf.py` uses pypdf and is provided as a fallback.
|
|
215
|
+
|
|
216
|
+
Dependencies:
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
pip install pymupdf pypdf pyyaml
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Schema
|
|
223
|
+
|
|
224
|
+
Two complementary representations:
|
|
225
|
+
|
|
226
|
+
- `schema/genetic_evidence.shacl.ttl`: SHACL shapes encoding the class
|
|
227
|
+
hierarchy, dimension types, cardinalities, and conditional activation
|
|
228
|
+
rules. This is the machine-checkable validation layer.
|
|
229
|
+
- `schema/dimensions.md`: the human-readable enumeration reference for all
|
|
230
|
+
categorical value types (knowledge domain, method, target type, etc.).
|
|
231
|
+
- `schema/EXTENSIONS.md`: the authoritative log of all candidate extensions
|
|
232
|
+
surfaced during corpus annotation, including their promotion or
|
|
233
|
+
retraction status.
|
|
234
|
+
|
|
235
|
+
Annotations in `annotations/` are validated by the CI workflow in
|
|
236
|
+
`.github/workflows/validate.yml`, which runs on every push and pull request
|
|
237
|
+
and blocks merges on failure:
|
|
238
|
+
|
|
239
|
+
- **`parse-yaml`** — every annotation YAML parses cleanly.
|
|
240
|
+
- **`shacl-validate`** — `scripts/validate_annotations.py` converts each
|
|
241
|
+
annotation to RDF (`extraction/yaml_to_rdf.py`) and runs `pyshacl` against
|
|
242
|
+
`schema/genetic_evidence.shacl.ttl`. The shapes enforce the always-required
|
|
243
|
+
dimensions, the value enumerations, the implemented conditional-activation
|
|
244
|
+
rules (variant ascertainment, mode of inheritance, organism), and a
|
|
245
|
+
mandatory `source_span` on every assertion; an annotation that violates any
|
|
246
|
+
of these is rejected. Remaining conditional-presence and reviewer-flag
|
|
247
|
+
shapes are open work (see `schema/examples.md`).
|
|
248
|
+
- **`coverage`** — `scripts/compute_coverage.py` regenerates the
|
|
249
|
+
dimension-coverage table from the YAML annotations (the source of the
|
|
250
|
+
paper's Supplementary Note SN7 and `annotations/coverage.md`).
|
|
251
|
+
|
|
252
|
+
Run the same checks locally with `python3 scripts/validate_annotations.py`
|
|
253
|
+
and `python3 scripts/compute_coverage.py` (requires `pyshacl rdflib pyyaml`).
|
|
254
|
+
|
|
255
|
+
## UMLS crosswalk and the GEM Mapping Studio
|
|
256
|
+
|
|
257
|
+
`data/umls/` holds the term-level crosswalk of the dimensional vocabulary to
|
|
258
|
+
UMLS (`umls_crosswalk.yaml`), the curator adjudications behind it, and the
|
|
259
|
+
public decision log `DECISIONS.md`. The crosswalk was produced with the
|
|
260
|
+
**GEM Mapping Studio**, a standalone, model-agnostic curation tool for
|
|
261
|
+
defining mapping axes and adjudicating value-level mappings against UMLS:
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
pip install gem-mapping-studio # PyPI; console scripts gem-mapping-studio, gem-validate, gem-coverage, ...
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Usage guide: **[`docs/STUDIO.md`](docs/STUDIO.md)** — how to build a new
|
|
268
|
+
mapping from scratch in any domain, and how to work on the GEM mapping in
|
|
269
|
+
this repository (from a checkout with `pip install -e .`, or with the
|
|
270
|
+
released tool pointed at `data/umls`). The package also ships `gem-validate`
|
|
271
|
+
and `gem-coverage`, which reproduce the corpus validation and the coverage
|
|
272
|
+
table reported in the paper from a clean checkout.
|
|
273
|
+
|
|
274
|
+
## Citing this work
|
|
275
|
+
|
|
276
|
+
See `CITATION.cff`. Concept DOI (all versions):
|
|
277
|
+
[10.5281/zenodo.22260686](https://doi.org/10.5281/zenodo.22260686);
|
|
278
|
+
the release described in the manuscript is v0.2.2,
|
|
279
|
+
[10.5281/zenodo.22260773](https://doi.org/10.5281/zenodo.22260773).
|
|
280
|
+
A new version DOI is minted via the Zenodo–GitHub integration at each
|
|
281
|
+
tagged release (record metadata in `.zenodo.json`).
|
|
282
|
+
|
|
283
|
+
## License
|
|
284
|
+
|
|
285
|
+
Content (annotations, documentation, the paper sources) is licensed
|
|
286
|
+
CC-BY-4.0 (`LICENSE.txt`). Code — `src/`, `scripts/`, and the extraction
|
|
287
|
+
tooling — is licensed Apache-2.0 (`LICENSE-code.txt`).
|
|
288
|
+
|
|
289
|
+
## Contact
|
|
290
|
+
|
|
291
|
+
See the corresponding-author block on the paper's title page.
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# A Semantic Model of Genetic Evidence
|
|
2
2
|
|
|
3
|
+
[](https://doi.org/10.5281/zenodo.22260686)
|
|
4
|
+
[](https://pypi.org/project/gem-mapping-studio/)
|
|
5
|
+
|
|
3
6
|
A conceptual framework for representing scientific and genetic evidence from
|
|
4
7
|
the biomedical literature in a form suitable for variant interpretation,
|
|
5
8
|
automated reasoning, and AI-ready clinical infrastructure.
|
|
@@ -18,9 +21,14 @@ journal submission.
|
|
|
18
21
|
├── case-reports/ Per-paper case reports (one for each of the six annotations)
|
|
19
22
|
├── protocols/ Annotation protocol documents (canonical rules + per-mode workflows)
|
|
20
23
|
├── skills/ Two Claude skills (annotation, review) that operationalise the protocols
|
|
21
|
-
├──
|
|
24
|
+
├── data/umls/ UMLS crosswalk of the dimensional vocabulary + decision log (DECISIONS.md)
|
|
25
|
+
├── src/python/ The `gem-mapping-studio` package: Mapping Studio, crosswalk harness,
|
|
26
|
+
│ validators, PDF highlight/callout extraction (`forome.gem.*`)
|
|
22
27
|
├── figures/ Source files for figures used in the paper
|
|
23
|
-
|
|
28
|
+
├── docs/ Usage guides (STUDIO.md: the Mapping Studio)
|
|
29
|
+
├── .github/ CI configuration validating annotations against the schema
|
|
30
|
+
├── CHANGELOG.md What changed in each tagged release
|
|
31
|
+
└── KNOWN_LIMITATIONS.md What the model, schema, corpus, and tooling do not yet do
|
|
24
32
|
```
|
|
25
33
|
|
|
26
34
|
## The annotation corpus
|
|
@@ -158,13 +166,13 @@ artifacts (review log, review report, and the updated annotation).
|
|
|
158
166
|
|
|
159
167
|
## Extraction pipeline
|
|
160
168
|
|
|
161
|
-
The
|
|
162
|
-
a structured JSON record of every annotation, including the text
|
|
163
|
-
each highlight (extracted via coordinate lookup) and the free-text
|
|
164
|
-
attached to callouts.
|
|
169
|
+
The `forome.gem.extraction` modules read a PDF with highlights and callouts
|
|
170
|
+
and emit a structured JSON record of every annotation, including the text
|
|
171
|
+
covered by each highlight (extracted via coordinate lookup) and the free-text
|
|
172
|
+
notes attached to callouts.
|
|
165
173
|
|
|
166
174
|
```bash
|
|
167
|
-
python3 extraction
|
|
175
|
+
python3 -m forome.gem.extraction.extract_annotations paper.pdf out.json
|
|
168
176
|
```
|
|
169
177
|
|
|
170
178
|
Two extractors are provided. `extract_annotations.py` uses PyMuPDF and is the
|
|
@@ -210,11 +218,33 @@ and blocks merges on failure:
|
|
|
210
218
|
Run the same checks locally with `python3 scripts/validate_annotations.py`
|
|
211
219
|
and `python3 scripts/compute_coverage.py` (requires `pyshacl rdflib pyyaml`).
|
|
212
220
|
|
|
221
|
+
## UMLS crosswalk and the GEM Mapping Studio
|
|
222
|
+
|
|
223
|
+
`data/umls/` holds the term-level crosswalk of the dimensional vocabulary to
|
|
224
|
+
UMLS (`umls_crosswalk.yaml`), the curator adjudications behind it, and the
|
|
225
|
+
public decision log `DECISIONS.md`. The crosswalk was produced with the
|
|
226
|
+
**GEM Mapping Studio**, a standalone, model-agnostic curation tool for
|
|
227
|
+
defining mapping axes and adjudicating value-level mappings against UMLS:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
pip install gem-mapping-studio # PyPI; console scripts gem-mapping-studio, gem-validate, gem-coverage, ...
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Usage guide: **[`docs/STUDIO.md`](docs/STUDIO.md)** — how to build a new
|
|
234
|
+
mapping from scratch in any domain, and how to work on the GEM mapping in
|
|
235
|
+
this repository (from a checkout with `pip install -e .`, or with the
|
|
236
|
+
released tool pointed at `data/umls`). The package also ships `gem-validate`
|
|
237
|
+
and `gem-coverage`, which reproduce the corpus validation and the coverage
|
|
238
|
+
table reported in the paper from a clean checkout.
|
|
239
|
+
|
|
213
240
|
## Citing this work
|
|
214
241
|
|
|
215
|
-
See `CITATION.cff`.
|
|
216
|
-
|
|
217
|
-
|
|
242
|
+
See `CITATION.cff`. Concept DOI (all versions):
|
|
243
|
+
[10.5281/zenodo.22260686](https://doi.org/10.5281/zenodo.22260686);
|
|
244
|
+
the release described in the manuscript is v0.2.2,
|
|
245
|
+
[10.5281/zenodo.22260773](https://doi.org/10.5281/zenodo.22260773).
|
|
246
|
+
A new version DOI is minted via the Zenodo–GitHub integration at each
|
|
247
|
+
tagged release (record metadata in `.zenodo.json`).
|
|
218
248
|
|
|
219
249
|
## License
|
|
220
250
|
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["setuptools>=
|
|
2
|
+
requires = ["setuptools>=77"]
|
|
3
3
|
build-backend = "setuptools.build_meta"
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "gem-mapping-studio"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.4"
|
|
8
8
|
description = "Forome Genetic Evidence Model: a reference data model, UMLS/OMOP crosswalk tooling, and SHACL validation for basic-science genetic evidence"
|
|
9
9
|
readme = "README.md"
|
|
10
|
-
license =
|
|
10
|
+
license = "Apache-2.0"
|
|
11
|
+
license-files = ["LICENSE-code.txt"]
|
|
11
12
|
requires-python = ">=3.10"
|
|
12
13
|
authors = [
|
|
13
14
|
{ name = "Michael Bouzinier", email = "michael.bouzinier@forome.org" },
|
|
@@ -19,7 +20,6 @@ keywords = [
|
|
|
19
20
|
classifiers = [
|
|
20
21
|
"Development Status :: 4 - Beta",
|
|
21
22
|
"Intended Audience :: Science/Research",
|
|
22
|
-
"License :: OSI Approved :: Apache Software License",
|
|
23
23
|
"Operating System :: OS Independent",
|
|
24
24
|
"Programming Language :: Python :: 3",
|
|
25
25
|
"Programming Language :: Python :: 3.10",
|