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