orfdata 0.12.0__tar.gz → 0.13.0__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.
- {orfdata-0.12.0 → orfdata-0.13.0}/MANIFEST.in +2 -0
- {orfdata-0.12.0/orfdata.egg-info → orfdata-0.13.0}/PKG-INFO +3 -2
- {orfdata-0.12.0 → orfdata-0.13.0}/README.md +2 -1
- {orfdata-0.12.0 → orfdata-0.13.0}/docs/coverage.md +10 -5
- orfdata-0.13.0/docs/human-tissue.md +79 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/docs/measurements.md +3 -2
- {orfdata-0.12.0 → orfdata-0.13.0}/docs/search-references.md +10 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/datasets.json +212 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/search_reference.py +40 -17
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/sources/__init__.py +8 -0
- orfdata-0.13.0/orfdata/sources/wang.py +360 -0
- orfdata-0.13.0/orfdata/version.py +1 -0
- {orfdata-0.12.0 → orfdata-0.13.0/orfdata.egg-info}/PKG-INFO +3 -2
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata.egg-info/SOURCES.txt +15 -1
- orfdata-0.13.0/tests/data/search_reference/NOTICE.md +19 -0
- orfdata-0.13.0/tests/data/search_reference/ensembl83-expected.json +23 -0
- orfdata-0.13.0/tests/data/search_reference/ensembl83-human.fasta.gz +0 -0
- orfdata-0.13.0/tests/data/wang/NOTICE.md +24 -0
- orfdata-0.13.0/tests/data/wang/annotation.gtf.gz +0 -0
- orfdata-0.13.0/tests/data/wang/copies.zip +0 -0
- orfdata-0.13.0/tests/data/wang/expected.json +1496 -0
- orfdata-0.13.0/tests/data/wang/manifest.json +188 -0
- orfdata-0.13.0/tests/data/wang/protein.zip +0 -0
- orfdata-0.13.0/tests/data/wang/rna.zip +0 -0
- orfdata-0.13.0/tests/data/wang/search.fasta.gz +0 -0
- orfdata-0.13.0/tests/test_ensembl_search_reference.py +85 -0
- orfdata-0.13.0/tests/test_wang.py +224 -0
- orfdata-0.12.0/orfdata/version.py +0 -1
- orfdata-0.12.0/tests/data/search_reference/NOTICE.md +0 -8
- {orfdata-0.12.0 → orfdata-0.13.0}/LICENSE +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/deploy.sh +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/docs/copy-yeast.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/docs/design.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/docs/pairing.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/docs/pfizer-protein.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/docs/pfizer-rna.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/docs/reference.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/docs/source-references.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/docs/species.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/docs/storage.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/lint.sh +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/__init__.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/build.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/catalog.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/cli.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/orf-evidence/AUTHOR-LICENSE.txt +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/orf-evidence/NOTICE.txt +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/orf-evidence/catalog.json.gz +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/orf-evidence/manifest.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/uorf-evidence/AUTHOR-LICENSE.txt +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/uorf-evidence/NOTICE.txt +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/uorf-evidence/catalog.json.gz +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/uorf-evidence/manifest.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/dataset.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/dataset_cli.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/datasets.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/initiation_context.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/measurements.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/model.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/pairing.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/reference.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/reference_mapping.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/sequence.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/sources/copy.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/sources/pfizer.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/sources/pfizer_rna.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata.egg-info/dependency_links.txt +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata.egg-info/entry_points.txt +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata.egg-info/requires.txt +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/orfdata.egg-info/top_level.txt +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/pyproject.toml +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/setup.cfg +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/test.sh +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/conftest.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905474.soft +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905474_KL9_fpkm.txt.gz +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905476.soft +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905476_KL10_fpkm.txt.gz +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905478.soft +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905478_KL11_fpkm.txt.gz +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905479.soft +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905479_KL12_fpkm.txt.gz +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/NOTICE.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/expected.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/geo-series.soft +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/manifest.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/methods.pdf +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/paper.xml +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/pmc-metadata.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/qconcat.fasta +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/workbook.xlsx +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/NOTICE.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/dog/expected.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/dog/manifest.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/dog/protein.tsv +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/dog/search.fasta +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/human/expected.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/human/manifest.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/human/protein.tsv +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/human/search.fasta +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/mouse/expected.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/mouse/manifest.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/mouse/protein.tsv +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/mouse/search.fasta +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/GSE325522_family.soft.gz +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/GSE325523_family.soft.gz +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/GSE325525_family.soft.gz +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/NOTICE.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/counts.csv.gz +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/dog-annotation.gtf.gz +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/dog-expected.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/dog-manifest.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/mouse-annotation.gtf.gz +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/mouse-expected.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/mouse-manifest.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/samples.xlsx +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/references/README.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/references/canis_lupus_familiaris.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/references/context-keys-v0.4.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/references/homo_sapiens.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/references/mus_musculus.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/references/saccharomyces_cerevisiae.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/search_reference/dog.fasta +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/search_reference/expected.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/README.md +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/generate.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/v1.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/v1.sqlite +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/v2.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/v2.sqlite +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/v3.json +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/v3.sqlite +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_copy.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_cross_reference_pairing.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_initiation_context.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_local_build_queries.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_measurements.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_pairing.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_pfizer.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_pfizer_rna.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_reference_context.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_reference_mapping.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_reference_orf.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_search_reference.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_selectors.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_storage.py +0 -0
- {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_uorf_catalog.py +0 -0
|
@@ -4,3 +4,5 @@ recursive-include tests *.py *.json *.md *.tsv *.fasta
|
|
|
4
4
|
recursive-include tests/data/copy *.xlsx *.gz *.soft *.xml *.pdf
|
|
5
5
|
recursive-include tests/data/storage *.sqlite
|
|
6
6
|
recursive-include tests/data/pfizer_rna *.gz *.xlsx
|
|
7
|
+
recursive-include tests/data/search_reference *.gz
|
|
8
|
+
recursive-include tests/data/wang *.zip *.gz
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: orfdata
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.13.0
|
|
4
4
|
Summary: Reference open reading frames and experimental translation evidence on annotated transcripts
|
|
5
5
|
Author: OpenVax
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -104,7 +104,8 @@ Install with `pip install orfdata[pyensembl]`. See the
|
|
|
104
104
|
assays, and DataCache-managed downloads. Downloadable
|
|
105
105
|
[human, mouse and dog protein abundance](docs/pfizer-protein.md) and
|
|
106
106
|
[yeast calibrated protein/RNA abundance](docs/copy-yeast.md) use the same
|
|
107
|
-
species-scoped API, as do [native dog and mouse RNA counts](docs/pfizer-rna.md)
|
|
107
|
+
species-scoped API, as do [native dog and mouse RNA counts](docs/pfizer-rna.md)
|
|
108
|
+
and [matched human tissue RNA/protein measurements](docs/human-tissue.md).
|
|
108
109
|
Gene RNA and canonical protein measurements do not establish
|
|
109
110
|
noncanonical ORF abundance. The [native search references](docs/search-references.md)
|
|
110
111
|
preserve complete deposited sequences, including unreported entries. The
|
|
@@ -77,7 +77,8 @@ Install with `pip install orfdata[pyensembl]`. See the
|
|
|
77
77
|
assays, and DataCache-managed downloads. Downloadable
|
|
78
78
|
[human, mouse and dog protein abundance](docs/pfizer-protein.md) and
|
|
79
79
|
[yeast calibrated protein/RNA abundance](docs/copy-yeast.md) use the same
|
|
80
|
-
species-scoped API, as do [native dog and mouse RNA counts](docs/pfizer-rna.md)
|
|
80
|
+
species-scoped API, as do [native dog and mouse RNA counts](docs/pfizer-rna.md)
|
|
81
|
+
and [matched human tissue RNA/protein measurements](docs/human-tissue.md).
|
|
81
82
|
Gene RNA and canonical protein measurements do not establish
|
|
82
83
|
noncanonical ORF abundance. The [native search references](docs/search-references.md)
|
|
83
84
|
preserve complete deposited sequences, including unreported entries. The
|
|
@@ -6,7 +6,7 @@ data coverage, independently of what the API can represent.
|
|
|
6
6
|
|
|
7
7
|
| Species | RNA abundance | Protein abundance | RNA/protein pairing |
|
|
8
8
|
| --- | --- | --- | --- |
|
|
9
|
-
| Human |
|
|
9
|
+
| Human | Wang: 29 specimens, gene/transcript FPKM and estimated copies/cell | Wang: 15,210 groups, iBAQ and estimated copies/cell; Pfizer: 10,352 groups, 37 channels, iBAQ/rIBAQ | Wang: adjacent cryosections; Pfizer: native RNA missing |
|
|
10
10
|
| Mouse | Pfizer: 606 libraries, 56,051 gene targets, counts | Pfizer: 12,124 groups, 63 channels, iBAQ/rIBAQ | Unresolved library-to-pool correspondence |
|
|
11
11
|
| Dog | Pfizer: 434 libraries, 30,941 gene targets, counts | Pfizer: 9,929 groups, 38 channels, iBAQ/rIBAQ | Unresolved library-to-pool correspondence |
|
|
12
12
|
| Budding yeast | CoPY: four RNA libraries plus a source aggregate, FPKM and estimated copies/cell | CoPY: calibrated SRM and separately calibrated label-free estimates | Explicit source-cohort pairing; individual cross-assay replicate matches unknown |
|
|
@@ -16,7 +16,11 @@ expression in every sample. Protein-group representatives do not establish
|
|
|
16
16
|
unique protein attribution. TMT channels are not independent donors. CoPY RNA
|
|
17
17
|
copies/cell assume 60,000 total mRNAs; its 1,903 SRM summaries contain 1,167 point
|
|
18
18
|
estimates, 668 upper bounds and 68 unquantifiable results. Calibration and
|
|
19
|
-
uncertainty remain attached to observations.
|
|
19
|
+
uncertainty remain attached to observations. Human Wang protein copies use the
|
|
20
|
+
proteomic-ruler estimate; RNA copies assume mRNA is 2% of total RNA mass. These
|
|
21
|
+
calibrations remain distinct from yeast isotope-standard measurements. Wang
|
|
22
|
+
processing views do not add specimens, and gene-level comparisons do not resolve
|
|
23
|
+
individual protein isoforms or noncanonical ORFs.
|
|
20
24
|
|
|
21
25
|
The separate existence-evidence catalogue contains 7,264 human noncanonical
|
|
22
26
|
ORFs, including 2,186 with reported MS support. It has no released mouse, dog or
|
|
@@ -24,11 +28,12 @@ yeast experimental ncORF catalogue yet. Its ribosome evidence and pooled PSM
|
|
|
24
28
|
counts are not sample-level ribosome occupancy or protein abundance. No species
|
|
25
29
|
currently has a released quantitative Ribo-seq dataset in this registry.
|
|
26
30
|
|
|
27
|
-
See the short guides for [
|
|
31
|
+
See the short guides for [matched human tissues](human-tissue.md),
|
|
32
|
+
[protein measurements](pfizer-protein.md),
|
|
28
33
|
[native dog/mouse RNA](pfizer-rna.md), [yeast RNA/protein calibration](copy-yeast.md)
|
|
29
34
|
and [complete search sequences](search-references.md). The
|
|
30
|
-
[roadmap](https://github.com/openvax/orfdata/issues/3) tracks
|
|
31
|
-
comparators, quantitative Ribo-seq,
|
|
35
|
+
[roadmap](https://github.com/openvax/orfdata/issues/3) tracks further human
|
|
36
|
+
comparators, quantitative Ribo-seq, ncORF evidence and additional species.
|
|
32
37
|
Cat, cattle, rat and other taxa use the same model when source datasets are
|
|
33
38
|
added. Orthology comparisons are explicit and never transfer observations or
|
|
34
39
|
protein-existence evidence between species.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Matched human tissue RNA and protein abundance
|
|
2
|
+
|
|
3
|
+
The [Wang et al. atlas](https://doi.org/10.15252/msb.20188503) measures adjacent
|
|
4
|
+
cryosections from 29 healthy human tissue specimens. `wang-human-tissue-abundance`
|
|
5
|
+
keeps six original table series in the same species-scoped API as dog, mouse and
|
|
6
|
+
yeast data.
|
|
7
|
+
|
|
8
|
+
| Source table | Targets | Native quantity |
|
|
9
|
+
| --- | ---: | --- |
|
|
10
|
+
| EV1 protein groups | 15,210 | iBAQ |
|
|
11
|
+
| EV1 genes | 13,640 | Author-normalized iBAQ |
|
|
12
|
+
| EV2 transcripts | 93,674 | FPKM |
|
|
13
|
+
| EV2 genes | 18,072 | Author-normalized FPKM |
|
|
14
|
+
| EV5 protein groups | 15,210 | Estimated copies/cell |
|
|
15
|
+
| EV5 transcripts | 60,519 | Estimated copies/cell |
|
|
16
|
+
|
|
17
|
+
There are 6,273,425 source cells. The same specimen has several processing views;
|
|
18
|
+
these are not additional biological replicates. Native specimen IDs, RNA/MS run
|
|
19
|
+
IDs, units, source cells and processing methods remain attached to the data.
|
|
20
|
+
Bone marrow has no matched RNA column and is outside the 29-tissue dataset.
|
|
21
|
+
The download is approximately 397 MB and installs to a 3.86 GB SQLite database.
|
|
22
|
+
Every source cell and RNA-copy input link was independently reconciled before
|
|
23
|
+
publication. Missing or censored cells remain explicit observations.
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
orfdata datasets download wang-human-tissue-abundance --version 2026-10-12.1
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
from orfdata import DatasetRegistry, ScopedTarget
|
|
31
|
+
|
|
32
|
+
registry = DatasetRegistry()
|
|
33
|
+
dataset = registry.open("wang-human-tissue-abundance", "2026-10-12.1")
|
|
34
|
+
reference, = dataset.manifest.references
|
|
35
|
+
gene = ScopedTarget(reference, "gene", "ENSG00000004059", "ensembl") # ARF5
|
|
36
|
+
for value in dataset.measurements(target=gene, sample_id="V122"):
|
|
37
|
+
print(value.quantity, value.value, value.unit, value.status)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
With Ensembl 83 already installed in PyEnsembl, the same target can be built with
|
|
41
|
+
`ScopedTarget.from_pyensembl(gene_object, kind="gene", namespace="ensembl",
|
|
42
|
+
context=reference)`. The context pins the historical GRCh38.p5 assembly accession,
|
|
43
|
+
GTF and complete Ensembl 83 protein FASTA. Alternate-reference protein entries
|
|
44
|
+
absent from the GTF remain in the native search set. Search lookups preserve
|
|
45
|
+
versioned FASTA IDs; they do not silently strip versions or imply detection.
|
|
46
|
+
|
|
47
|
+
Protein-group values remain group observations. Representative proteins and their
|
|
48
|
+
parent genes/transcripts are context, with unresolved individual attribution.
|
|
49
|
+
The source's gene-level summaries permit gene-level RNA/protein comparisons;
|
|
50
|
+
they do not quantify a particular isoform, uORF or ncORF. Pairings explicitly use
|
|
51
|
+
`adjacent_donor_tissue`, independently of the target relationship. See the
|
|
52
|
+
[comparison API](measurements.md) for selecting pairings and deriving ratios.
|
|
53
|
+
|
|
54
|
+
Protein copies are the authors' **proteomic-ruler estimates**, not isotope-standard
|
|
55
|
+
measurements. Raw intensity inputs and per-sample calibration constants are absent
|
|
56
|
+
from these tables; corresponding iBAQ observations are linked as associated data,
|
|
57
|
+
not falsely recorded as the ruler's inputs. RNA copies link their source FPKM
|
|
58
|
+
cells and retain the assumption that mRNA constitutes **2% of total RNA mass**.
|
|
59
|
+
Unreported calibration uncertainty stays unknown.
|
|
60
|
+
|
|
61
|
+
Protein zeros are unquantified values; gene-RNA and transcript-copy zeros retain
|
|
62
|
+
the source censoring semantics. They are not measurements of biological absence.
|
|
63
|
+
The methods state a 1-FPKM threshold, but gene values undergo median normalization;
|
|
64
|
+
2,677 positive gene values are below 1. Their values remain intact, and no numeric
|
|
65
|
+
detection limit is invented in normalized units.
|
|
66
|
+
Unfiltered transcript FPKM retains its native zeros and tiny numeric text values;
|
|
67
|
+
a nonzero estimate does not establish expression above the study's 1-FPKM cutoff.
|
|
68
|
+
Original numeric text and zero sentinels remain in provenance. Stable identifiers
|
|
69
|
+
join the source tables even when their display gene labels differ.
|
|
70
|
+
|
|
71
|
+
The [Eraslan reanalysis](https://doi.org/10.15252/msb.20188513) selects major
|
|
72
|
+
isoforms and normalizes exon/intron counts differently. It is a separate planned
|
|
73
|
+
view of the same specimens, not silently mixed into this release. These tables
|
|
74
|
+
cover canonical coding-gene expression; they add RNA/protein context without
|
|
75
|
+
expanding the experimental noncanonical-ORF catalogue.
|
|
76
|
+
|
|
77
|
+
Source supplements retain CC-BY-4.0 attribution, and Ensembl annotations retain
|
|
78
|
+
their source terms. Discovery and installed queries work offline; acquisition and
|
|
79
|
+
source rebuilding are explicit through DataCache.
|
|
@@ -8,8 +8,9 @@ it is not a separate measurement of each ORF in that gene.
|
|
|
8
8
|
|
|
9
9
|
Install `orfdata[data]` to manage datasets. The registry includes downloadable
|
|
10
10
|
[Pfizer/Oziolor human, mouse and dog protein summaries](pfizer-protein.md);
|
|
11
|
-
[native dog/mouse RNA](pfizer-rna.md)
|
|
12
|
-
|
|
11
|
+
[native dog/mouse RNA](pfizer-rna.md), [matched human tissues](human-tissue.md)
|
|
12
|
+
and [yeast RNA/protein calibration](copy-yeast.md) use the same objects.
|
|
13
|
+
See [released coverage and gaps](coverage.md);
|
|
13
14
|
the [data roadmap](https://github.com/openvax/orfdata/issues/3) tracks further
|
|
14
15
|
imports. The bundled human ORF evidence catalogue remains available offline.
|
|
15
16
|
Its pooled PSM counts describe spectra, not sample-level protein abundance.
|
|
@@ -73,3 +73,13 @@ Adapters must explicitly declare their native search sets and formats. The
|
|
|
73
73
|
initial parser supports deposited UniProt FASTAs. CoPY yeast's QconCAT FASTA is
|
|
74
74
|
synthetic calibration material, so it is not exposed as a native yeast proteome;
|
|
75
75
|
that historical search reference remains an explicit source gap.
|
|
76
|
+
|
|
77
|
+
## Historical Ensembl searches
|
|
78
|
+
|
|
79
|
+
Declared Ensembl peptide FASTAs retain exact versioned identifiers and native
|
|
80
|
+
headers, including alternate-reference entries and stop characters. Gzip source
|
|
81
|
+
hashes identify the original compressed bytes. An Ensembl header does not encode
|
|
82
|
+
taxonomy: `source_taxon_id` is `None`, while the explicit pinned reference retains
|
|
83
|
+
the source species. Gene labels use the native gene symbol when present, otherwise
|
|
84
|
+
the native versioned gene ID. No ID-version stripping or protein-detection claim
|
|
85
|
+
is implicit in a search lookup. See the [human tissue dataset](human-tissue.md).
|
|
@@ -1143,5 +1143,217 @@
|
|
|
1143
1143
|
}
|
|
1144
1144
|
}
|
|
1145
1145
|
}
|
|
1146
|
+
},
|
|
1147
|
+
"wang-human-tissue-abundance": {
|
|
1148
|
+
"default_version": "2026-10-12.1",
|
|
1149
|
+
"versions": {
|
|
1150
|
+
"2026-10-12.1": {
|
|
1151
|
+
"manifest": {
|
|
1152
|
+
"dataset_id": "wang-human-tissue-abundance",
|
|
1153
|
+
"version": "2026-10-12.1",
|
|
1154
|
+
"title": "Wang healthy human tissue RNA, protein and calibrated copy estimates",
|
|
1155
|
+
"references": [
|
|
1156
|
+
{
|
|
1157
|
+
"taxon_id": 9606,
|
|
1158
|
+
"species": "human",
|
|
1159
|
+
"genome_build": "GRCh38",
|
|
1160
|
+
"annotation_name": "ensembl",
|
|
1161
|
+
"annotation_version": "83",
|
|
1162
|
+
"assembly_accession": "GCA_000001405.20",
|
|
1163
|
+
"strain": null,
|
|
1164
|
+
"strain_taxon_id": null,
|
|
1165
|
+
"sequence_sha256": "5b7e60956435026d2588ed92a719e74f0b5b39f13f072638cefd634c7cfbc219",
|
|
1166
|
+
"taxonomy_version": "ncbi-2026-10-12",
|
|
1167
|
+
"source_sha256": "687f8b330bc6297fef833fcf3c48464e1ae46115fd706295238fdf51728cd017"
|
|
1168
|
+
}
|
|
1169
|
+
],
|
|
1170
|
+
"sources": [
|
|
1171
|
+
{
|
|
1172
|
+
"asset_id": "protein.zip",
|
|
1173
|
+
"url": "https://pmc-oa-opendata.s3.amazonaws.com/PMC6379049.1/MSB-15-e8503-s003.zip",
|
|
1174
|
+
"sha256": "b9b91d91319435f5ebbfb1d5c1f5bd22131e879f7872e767cd4f32a8b55b382e",
|
|
1175
|
+
"size": 9020300,
|
|
1176
|
+
"access_terms": "CC-BY-4.0; Wang et al. (2019)",
|
|
1177
|
+
"license_url": "https://creativecommons.org/licenses/by/4.0/",
|
|
1178
|
+
"redistributable": true,
|
|
1179
|
+
"metadata": {
|
|
1180
|
+
"attribution": "Wang et al. (2019)",
|
|
1181
|
+
"publication": "https://doi.org/10.15252/msb.20188503"
|
|
1182
|
+
}
|
|
1183
|
+
},
|
|
1184
|
+
{
|
|
1185
|
+
"asset_id": "rna.zip",
|
|
1186
|
+
"url": "https://pmc-oa-opendata.s3.amazonaws.com/PMC6379049.1/MSB-15-e8503-s004.zip",
|
|
1187
|
+
"sha256": "ee37aacff077892203db83d1736975745feacc33ba4a0ede7fe68470ca89ce95",
|
|
1188
|
+
"size": 35792466,
|
|
1189
|
+
"access_terms": "CC-BY-4.0; Wang et al. (2019)",
|
|
1190
|
+
"license_url": "https://creativecommons.org/licenses/by/4.0/",
|
|
1191
|
+
"redistributable": true,
|
|
1192
|
+
"metadata": {
|
|
1193
|
+
"attribution": "Wang et al. (2019)",
|
|
1194
|
+
"publication": "https://doi.org/10.15252/msb.20188503"
|
|
1195
|
+
}
|
|
1196
|
+
},
|
|
1197
|
+
{
|
|
1198
|
+
"asset_id": "copies.zip",
|
|
1199
|
+
"url": "https://pmc-oa-opendata.s3.amazonaws.com/PMC6379049.1/MSB-15-e8503-s007.zip",
|
|
1200
|
+
"sha256": "1c9aee1d3869874c9ed2343a43b976c9f7adfe040af50780fc61f1b712ab77b9",
|
|
1201
|
+
"size": 18746969,
|
|
1202
|
+
"access_terms": "CC-BY-4.0; Wang et al. (2019)",
|
|
1203
|
+
"license_url": "https://creativecommons.org/licenses/by/4.0/",
|
|
1204
|
+
"redistributable": true,
|
|
1205
|
+
"metadata": {
|
|
1206
|
+
"attribution": "Wang et al. (2019)",
|
|
1207
|
+
"publication": "https://doi.org/10.15252/msb.20188503"
|
|
1208
|
+
}
|
|
1209
|
+
},
|
|
1210
|
+
{
|
|
1211
|
+
"asset_id": "annotation.gtf.gz",
|
|
1212
|
+
"url": "https://ftp.ensembl.org/pub/release-83/gtf/homo_sapiens/Homo_sapiens.GRCh38.83.gtf.gz",
|
|
1213
|
+
"sha256": "687f8b330bc6297fef833fcf3c48464e1ae46115fd706295238fdf51728cd017",
|
|
1214
|
+
"size": 45686084,
|
|
1215
|
+
"access_terms": "Ensembl-generated data available without restriction; retain Ensembl/EMBL-EBI attribution",
|
|
1216
|
+
"license_url": "https://www.ensembl.org/info/about/legal/disclaimer.html",
|
|
1217
|
+
"redistributable": true,
|
|
1218
|
+
"metadata": {
|
|
1219
|
+
"ensembl_release": "83",
|
|
1220
|
+
"taxon_id": 9606
|
|
1221
|
+
}
|
|
1222
|
+
},
|
|
1223
|
+
{
|
|
1224
|
+
"asset_id": "search.fasta.gz",
|
|
1225
|
+
"url": "https://ftp.ensembl.org/pub/release-83/fasta/homo_sapiens/pep/Homo_sapiens.GRCh38.pep.all.fa.gz",
|
|
1226
|
+
"sha256": "5b7e60956435026d2588ed92a719e74f0b5b39f13f072638cefd634c7cfbc219",
|
|
1227
|
+
"size": 12726357,
|
|
1228
|
+
"access_terms": "Ensembl-generated data available without restriction; retain Ensembl/EMBL-EBI attribution",
|
|
1229
|
+
"license_url": "https://www.ensembl.org/info/about/legal/disclaimer.html",
|
|
1230
|
+
"redistributable": true,
|
|
1231
|
+
"metadata": {
|
|
1232
|
+
"ensembl_release": "83",
|
|
1233
|
+
"taxon_id": 9606
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
],
|
|
1237
|
+
"citations": [
|
|
1238
|
+
"https://doi.org/10.15252/msb.20188503"
|
|
1239
|
+
],
|
|
1240
|
+
"assay_kinds": [
|
|
1241
|
+
"rna_seq",
|
|
1242
|
+
"digest_ms"
|
|
1243
|
+
],
|
|
1244
|
+
"coverage": {
|
|
1245
|
+
"samples": 29,
|
|
1246
|
+
"quantitative_metadata_rows": 30,
|
|
1247
|
+
"series": {
|
|
1248
|
+
"protein_groups": {
|
|
1249
|
+
"rows": 15210,
|
|
1250
|
+
"empty_rows": 0,
|
|
1251
|
+
"zero_cells": 120028,
|
|
1252
|
+
"numeric_text_cells": 0
|
|
1253
|
+
},
|
|
1254
|
+
"protein_genes": {
|
|
1255
|
+
"rows": 13640,
|
|
1256
|
+
"empty_rows": 24,
|
|
1257
|
+
"zero_cells": 89861,
|
|
1258
|
+
"numeric_text_cells": 0
|
|
1259
|
+
},
|
|
1260
|
+
"rna_transcripts": {
|
|
1261
|
+
"rows": 93674,
|
|
1262
|
+
"empty_rows": 0,
|
|
1263
|
+
"zero_cells": 327059,
|
|
1264
|
+
"numeric_text_cells": 2353
|
|
1265
|
+
},
|
|
1266
|
+
"rna_genes": {
|
|
1267
|
+
"rows": 18072,
|
|
1268
|
+
"empty_rows": 0,
|
|
1269
|
+
"zero_cells": 168474,
|
|
1270
|
+
"numeric_text_cells": 0
|
|
1271
|
+
},
|
|
1272
|
+
"protein_copies": {
|
|
1273
|
+
"rows": 15210,
|
|
1274
|
+
"empty_rows": 0,
|
|
1275
|
+
"zero_cells": 120028,
|
|
1276
|
+
"numeric_text_cells": 0
|
|
1277
|
+
},
|
|
1278
|
+
"rna_copies": {
|
|
1279
|
+
"rows": 60519,
|
|
1280
|
+
"empty_rows": 0,
|
|
1281
|
+
"zero_cells": 1036469,
|
|
1282
|
+
"numeric_text_cells": 0
|
|
1283
|
+
}
|
|
1284
|
+
},
|
|
1285
|
+
"annotation_counts": {
|
|
1286
|
+
"genes": 60675,
|
|
1287
|
+
"transcripts": 199184,
|
|
1288
|
+
"proteins": 93892
|
|
1289
|
+
},
|
|
1290
|
+
"search_sequences": 102450,
|
|
1291
|
+
"orf_specific_abundance": false,
|
|
1292
|
+
"pairing": "adjacent cryosections of source tissue specimens; donor identity not inferred"
|
|
1293
|
+
},
|
|
1294
|
+
"processing": {
|
|
1295
|
+
"importer": "wang-human-tissue-v1",
|
|
1296
|
+
"software": "orfdata 0.13.0",
|
|
1297
|
+
"tissues": [
|
|
1298
|
+
"Adrenal gland",
|
|
1299
|
+
"Appendix",
|
|
1300
|
+
"Brain",
|
|
1301
|
+
"Colon",
|
|
1302
|
+
"Duodenum",
|
|
1303
|
+
"Endometrium",
|
|
1304
|
+
"Esophagus",
|
|
1305
|
+
"Fallopian tube",
|
|
1306
|
+
"Fat",
|
|
1307
|
+
"Gallbladder",
|
|
1308
|
+
"Heart",
|
|
1309
|
+
"Kidney",
|
|
1310
|
+
"Liver",
|
|
1311
|
+
"Lung",
|
|
1312
|
+
"Lymph node",
|
|
1313
|
+
"Ovary",
|
|
1314
|
+
"Pancreas",
|
|
1315
|
+
"Placenta",
|
|
1316
|
+
"Prostate",
|
|
1317
|
+
"Rectum",
|
|
1318
|
+
"Salivary gland",
|
|
1319
|
+
"Small intestine",
|
|
1320
|
+
"Smooth muscle",
|
|
1321
|
+
"Spleen",
|
|
1322
|
+
"Stomach",
|
|
1323
|
+
"Testis",
|
|
1324
|
+
"Thyroid",
|
|
1325
|
+
"Tonsil",
|
|
1326
|
+
"Urinary bladder"
|
|
1327
|
+
],
|
|
1328
|
+
"tissue_aliases": {
|
|
1329
|
+
"Gall bladder": "Gallbladder"
|
|
1330
|
+
},
|
|
1331
|
+
"source_assembly_header": "GRCh38.p5",
|
|
1332
|
+
"copy_estimates": "source-derived; proteomic ruler protein and assumed mRNA fraction 2%",
|
|
1333
|
+
"excluded_quantitative_tissues": {
|
|
1334
|
+
"Bone marrow": "no matching RNA sample or 29-tissue table column"
|
|
1335
|
+
},
|
|
1336
|
+
"source_views": "Eraslan reprocessing is a separate dataset, not additional biological replication"
|
|
1337
|
+
},
|
|
1338
|
+
"schema": "orfdata.measurements.v1"
|
|
1339
|
+
},
|
|
1340
|
+
"distribution": {
|
|
1341
|
+
"access_terms": "Wang et al. (2019) source supplements: CC-BY-4.0. Ensembl-generated annotations: available without restriction with attribution. ORFdata transformation code: Apache-2.0.",
|
|
1342
|
+
"redistributable": true,
|
|
1343
|
+
"download_size": 397221510,
|
|
1344
|
+
"download_sha256": "35a17065cdd27d01c1456b42202e3bb7caf0a7092fbbecdcc58805b297fcff74",
|
|
1345
|
+
"installed_size": 3861286912,
|
|
1346
|
+
"data_release": "data-wang-human-tissue-2026-10-12.1"
|
|
1347
|
+
},
|
|
1348
|
+
"assets": {
|
|
1349
|
+
"dataset.sqlite": {
|
|
1350
|
+
"url": "https://github.com/openvax/orfdata/releases/download/data-wang-human-tissue-2026-10-12.1/wang-human-tissue-abundance-2026-10-12.1.sqlite.gz",
|
|
1351
|
+
"sha256": "3b5b071e72efe5a2610ab9bc5c66b3309ed62a0c11a4ea4670c8809d2a788a7c",
|
|
1352
|
+
"size": 3861286912,
|
|
1353
|
+
"decompress": true
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1357
|
+
}
|
|
1146
1358
|
}
|
|
1147
1359
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Immutable native search sequences, separate from abundance and existence evidence."""
|
|
2
2
|
|
|
3
|
+
import gzip
|
|
3
4
|
import hashlib
|
|
4
5
|
import re
|
|
5
6
|
from collections.abc import Mapping
|
|
@@ -31,7 +32,7 @@ class SearchReferenceSpec(_Record):
|
|
|
31
32
|
raise TypeError("Search references require a context and pinned SourceAsset")
|
|
32
33
|
if self.reference.sequence_sha256 != self.source.sha256:
|
|
33
34
|
raise ValueError("Native search context must identify the exact source FASTA bytes")
|
|
34
|
-
if self.format
|
|
35
|
+
if self.format not in ("uniprot-fasta", "ensembl-pep-fasta", "ensembl-pep-fasta-gzip"):
|
|
35
36
|
raise ValueError("Unsupported declared search FASTA format")
|
|
36
37
|
if self.expected_sequences is not None and (type(self.expected_sequences) is not int or self.expected_sequences < 1):
|
|
37
38
|
raise ValueError("Expected sequence count must be positive or unknown")
|
|
@@ -53,7 +54,7 @@ class SearchSequence(_Record):
|
|
|
53
54
|
fasta_id: str
|
|
54
55
|
sequence: str
|
|
55
56
|
sequence_sha256: str
|
|
56
|
-
source_taxon_id: int
|
|
57
|
+
source_taxon_id: Optional[int]
|
|
57
58
|
gene_label: Optional[str]
|
|
58
59
|
database: str
|
|
59
60
|
source_line: int
|
|
@@ -65,13 +66,16 @@ class SearchSequence(_Record):
|
|
|
65
66
|
raise TypeError("Search sequence requires a native protein target")
|
|
66
67
|
for name in ("header", "fasta_id", "sequence"):
|
|
67
68
|
_identifier(getattr(self, name), name)
|
|
68
|
-
|
|
69
|
+
alphabet = "[A-Z*]+" if self.database == "ensembl" else "[A-Z]+"
|
|
70
|
+
if not re.fullmatch(alphabet, self.sequence):
|
|
69
71
|
raise ValueError("Invalid search sequence characters")
|
|
70
72
|
if hashlib.sha256(self.sequence.encode("ascii")).hexdigest() != self.sequence_sha256:
|
|
71
73
|
raise ValueError("Search sequence hash disagrees with its residues")
|
|
72
|
-
if self.source_taxon_id
|
|
74
|
+
if self.source_taxon_id is None and self.database != "ensembl":
|
|
75
|
+
raise ValueError("UniProt search sequences require their source taxon")
|
|
76
|
+
if self.source_taxon_id is not None and self.source_taxon_id != self.target.reference.taxon_id:
|
|
73
77
|
raise ValueError("Native search sequence taxon disagrees with its reference")
|
|
74
|
-
if self.database not in ("sp", "tr") or type(self.source_line) is not int or self.source_line < 1:
|
|
78
|
+
if self.database not in ("sp", "tr", "ensembl") or type(self.source_line) is not int or self.source_line < 1:
|
|
75
79
|
raise ValueError("Invalid search sequence source metadata")
|
|
76
80
|
if self.gene_label is not None:
|
|
77
81
|
_identifier(self.gene_label, "gene_label")
|
|
@@ -176,24 +180,19 @@ class SearchReference:
|
|
|
176
180
|
if header is None:
|
|
177
181
|
return
|
|
178
182
|
fasta_id = header.split()[0]
|
|
179
|
-
|
|
180
|
-
taxon = re.search(r"(?:^| )OX=(\d+)(?: |$)", header)
|
|
181
|
-
if len(fields) != 3 or fields[0] not in ("sp", "tr") or not all(fields[1:]) or taxon is None:
|
|
182
|
-
raise ValueError("Invalid declared UniProt search FASTA header")
|
|
183
|
-
if int(taxon.group(1)) != self.reference.taxon_id:
|
|
184
|
-
raise ValueError("Search entry taxon differs from the declared native reference")
|
|
185
|
-
identifier = fields[1]
|
|
183
|
+
identifier, database, taxon, gene = self._header(header, fasta_id)
|
|
186
184
|
sequence = "".join(pieces)
|
|
187
|
-
|
|
185
|
+
alphabet = "[A-Z*]+" if database == "ensembl" else "[A-Z]+"
|
|
186
|
+
if identifier in entries or not sequence or not re.fullmatch(alphabet, sequence):
|
|
188
187
|
raise ValueError("Duplicate/empty/invalid native search sequence")
|
|
189
|
-
gene = re.search(r"(?:^| )GN=(\S+)", header)
|
|
190
188
|
entries[identifier] = SearchSequence(
|
|
191
189
|
ScopedTarget(self.reference, "protein", identifier, self.spec.namespace), header, fasta_id,
|
|
192
|
-
sequence, hashlib.sha256(sequence.encode("ascii")).hexdigest(),
|
|
193
|
-
gene
|
|
190
|
+
sequence, hashlib.sha256(sequence.encode("ascii")).hexdigest(), taxon,
|
|
191
|
+
gene, database, source_line,
|
|
194
192
|
)
|
|
195
193
|
|
|
196
|
-
|
|
194
|
+
opener = gzip.open if self.spec.format == "ensembl-pep-fasta-gzip" else open
|
|
195
|
+
with opener(self.path, "rt", encoding="utf-8") as handle:
|
|
197
196
|
for line, text in enumerate(handle, 1):
|
|
198
197
|
text = text.rstrip("\r\n")
|
|
199
198
|
if not text.strip():
|
|
@@ -212,6 +211,30 @@ class SearchReference:
|
|
|
212
211
|
raise ValueError("Search FASTA sequence count disagrees with declared coverage")
|
|
213
212
|
return entries
|
|
214
213
|
|
|
214
|
+
def _header(self, header, fasta_id):
|
|
215
|
+
if self.spec.format == "uniprot-fasta":
|
|
216
|
+
fields = fasta_id.split("|")
|
|
217
|
+
taxon = re.search(r"(?:^| )OX=(\d+)(?: |$)", header)
|
|
218
|
+
if len(fields) != 3 or fields[0] not in ("sp", "tr") or not all(fields[1:]) or taxon is None:
|
|
219
|
+
raise ValueError("Invalid declared UniProt search FASTA header")
|
|
220
|
+
if int(taxon.group(1)) != self.reference.taxon_id:
|
|
221
|
+
raise ValueError("Search entry taxon differs from the declared native reference")
|
|
222
|
+
gene = re.search(r"(?:^| )GN=(\S+)", header)
|
|
223
|
+
return fields[1], fields[0], int(taxon.group(1)), gene.group(1) if gene else None
|
|
224
|
+
|
|
225
|
+
fields = header.split()
|
|
226
|
+
annotations = dict(field.split(":", 1) for field in fields[1:] if ":" in field)
|
|
227
|
+
location = next((annotations[k] for k in ("chromosome", "scaffold", "supercontig")
|
|
228
|
+
if k in annotations), None)
|
|
229
|
+
if (len(fields) < 2 or not (fields[1] == "pep" or fields[1].startswith("pep:"))
|
|
230
|
+
or not annotations.get("gene") or not annotations.get("transcript") or not location):
|
|
231
|
+
raise ValueError("Invalid declared Ensembl peptide FASTA header")
|
|
232
|
+
if location.split(":", 1)[0] != self.reference.genome_build:
|
|
233
|
+
raise ValueError("Ensembl search entry assembly differs from the declared reference")
|
|
234
|
+
# Ensembl headers have no taxonomy field. The pinned source/reference
|
|
235
|
+
# declares the species; do not invent a header-observed taxon or strip IDs.
|
|
236
|
+
return fasta_id, "ensembl", None, annotations.get("gene_symbol", annotations["gene"])
|
|
237
|
+
|
|
215
238
|
|
|
216
239
|
def reference_registry(spec, cache_root=None):
|
|
217
240
|
"""Use a separate immutable DataCache store without altering abundance caches."""
|
|
@@ -15,6 +15,10 @@ def importer(name):
|
|
|
15
15
|
from .pfizer_rna import import_rna
|
|
16
16
|
|
|
17
17
|
return import_rna
|
|
18
|
+
if name == "wang-human-tissue-v1":
|
|
19
|
+
from .wang import import_tissue
|
|
20
|
+
|
|
21
|
+
return import_tissue
|
|
18
22
|
raise ValueError(f"No packaged importer for {name!r}")
|
|
19
23
|
|
|
20
24
|
|
|
@@ -24,4 +28,8 @@ def search_references(manifest):
|
|
|
24
28
|
from .pfizer import search_references as pfizer_references
|
|
25
29
|
|
|
26
30
|
return pfizer_references(manifest)
|
|
31
|
+
if manifest.processing.get("importer") == "wang-human-tissue-v1":
|
|
32
|
+
from .wang import search_references as wang_references
|
|
33
|
+
|
|
34
|
+
return wang_references(manifest)
|
|
27
35
|
return ()
|