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.
Files changed (36) hide show
  1. gem_mapping_studio-0.2.4/PKG-INFO +291 -0
  2. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/README.md +40 -10
  3. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/pyproject.toml +4 -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
  5. gem_mapping_studio-0.2.4/src/python/main/gem_mapping_studio.egg-info/PKG-INFO +291 -0
  6. gem_mapping_studio-0.2.2/PKG-INFO +0 -465
  7. gem_mapping_studio-0.2.2/src/python/main/gem_mapping_studio.egg-info/PKG-INFO +0 -465
  8. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/LICENSE-code.txt +0 -0
  9. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/LICENSE.txt +0 -0
  10. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/setup.cfg +0 -0
  11. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/_reference/__init__.py +0 -0
  12. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/_reference/dimensions.md +0 -0
  13. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/_reference/genetic_evidence.shacl.ttl +0 -0
  14. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/_reference/semantic_types.yaml +0 -0
  15. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/extraction/__init__.py +0 -0
  16. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/extraction/extract_annotations.py +0 -0
  17. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/extraction/extract_annotations_pypdf.py +0 -0
  18. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/extraction/yaml_to_rdf.py +0 -0
  19. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/__init__.py +0 -0
  20. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/_paths.py +0 -0
  21. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/build_umls_crosswalk.py +0 -0
  22. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/classify_credibility_sweep.py +0 -0
  23. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/fetch_semantic_network.py +0 -0
  24. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/local_umls.py +0 -0
  25. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/render_crosswalk_tex.py +0 -0
  26. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/semantic_types.py +0 -0
  27. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/sweep.py +0 -0
  28. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/umls/uts_client.py +0 -0
  29. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/validation/__init__.py +0 -0
  30. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/validation/compute_coverage.py +0 -0
  31. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/forome/gem/validation/validate_annotations.py +0 -0
  32. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/gem_mapping_studio.egg-info/SOURCES.txt +0 -0
  33. {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
  34. {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
  35. {gem_mapping_studio-0.2.2 → gem_mapping_studio-0.2.4}/src/python/main/gem_mapping_studio.egg-info/requires.txt +0 -0
  36. {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
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.22260686.svg)](https://doi.org/10.5281/zenodo.22260686)
38
+ [![PyPI](https://img.shields.io/pypi/v/gem-mapping-studio.svg)](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
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.22260686.svg)](https://doi.org/10.5281/zenodo.22260686)
4
+ [![PyPI](https://img.shields.io/pypi/v/gem-mapping-studio.svg)](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
- ├── extraction/ Scripts that extract highlights and callouts from annotated PDFs
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
- └── .github/ CI configuration validating annotations against the schema
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 scripts in `extraction/` read a PDF with highlights and callouts and emit
162
- a structured JSON record of every annotation, including the text covered by
163
- each highlight (extracted via coordinate lookup) and the free-text notes
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/extract_annotations.py paper.pdf out.json
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`. A DOI is minted via the Zenodo–GitHub integration at
216
- each tagged release (record metadata in `.zenodo.json`); the concept DOI
217
- will be added to `CITATION.cff` after the first release.
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>=68", "wheel"]
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.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 = { file = "LICENSE-code.txt" }
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",