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.
Files changed (147) hide show
  1. {orfdata-0.12.0 → orfdata-0.13.0}/MANIFEST.in +2 -0
  2. {orfdata-0.12.0/orfdata.egg-info → orfdata-0.13.0}/PKG-INFO +3 -2
  3. {orfdata-0.12.0 → orfdata-0.13.0}/README.md +2 -1
  4. {orfdata-0.12.0 → orfdata-0.13.0}/docs/coverage.md +10 -5
  5. orfdata-0.13.0/docs/human-tissue.md +79 -0
  6. {orfdata-0.12.0 → orfdata-0.13.0}/docs/measurements.md +3 -2
  7. {orfdata-0.12.0 → orfdata-0.13.0}/docs/search-references.md +10 -0
  8. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/datasets.json +212 -0
  9. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/search_reference.py +40 -17
  10. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/sources/__init__.py +8 -0
  11. orfdata-0.13.0/orfdata/sources/wang.py +360 -0
  12. orfdata-0.13.0/orfdata/version.py +1 -0
  13. {orfdata-0.12.0 → orfdata-0.13.0/orfdata.egg-info}/PKG-INFO +3 -2
  14. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata.egg-info/SOURCES.txt +15 -1
  15. orfdata-0.13.0/tests/data/search_reference/NOTICE.md +19 -0
  16. orfdata-0.13.0/tests/data/search_reference/ensembl83-expected.json +23 -0
  17. orfdata-0.13.0/tests/data/search_reference/ensembl83-human.fasta.gz +0 -0
  18. orfdata-0.13.0/tests/data/wang/NOTICE.md +24 -0
  19. orfdata-0.13.0/tests/data/wang/annotation.gtf.gz +0 -0
  20. orfdata-0.13.0/tests/data/wang/copies.zip +0 -0
  21. orfdata-0.13.0/tests/data/wang/expected.json +1496 -0
  22. orfdata-0.13.0/tests/data/wang/manifest.json +188 -0
  23. orfdata-0.13.0/tests/data/wang/protein.zip +0 -0
  24. orfdata-0.13.0/tests/data/wang/rna.zip +0 -0
  25. orfdata-0.13.0/tests/data/wang/search.fasta.gz +0 -0
  26. orfdata-0.13.0/tests/test_ensembl_search_reference.py +85 -0
  27. orfdata-0.13.0/tests/test_wang.py +224 -0
  28. orfdata-0.12.0/orfdata/version.py +0 -1
  29. orfdata-0.12.0/tests/data/search_reference/NOTICE.md +0 -8
  30. {orfdata-0.12.0 → orfdata-0.13.0}/LICENSE +0 -0
  31. {orfdata-0.12.0 → orfdata-0.13.0}/deploy.sh +0 -0
  32. {orfdata-0.12.0 → orfdata-0.13.0}/docs/copy-yeast.md +0 -0
  33. {orfdata-0.12.0 → orfdata-0.13.0}/docs/design.md +0 -0
  34. {orfdata-0.12.0 → orfdata-0.13.0}/docs/pairing.md +0 -0
  35. {orfdata-0.12.0 → orfdata-0.13.0}/docs/pfizer-protein.md +0 -0
  36. {orfdata-0.12.0 → orfdata-0.13.0}/docs/pfizer-rna.md +0 -0
  37. {orfdata-0.12.0 → orfdata-0.13.0}/docs/reference.md +0 -0
  38. {orfdata-0.12.0 → orfdata-0.13.0}/docs/source-references.md +0 -0
  39. {orfdata-0.12.0 → orfdata-0.13.0}/docs/species.md +0 -0
  40. {orfdata-0.12.0 → orfdata-0.13.0}/docs/storage.md +0 -0
  41. {orfdata-0.12.0 → orfdata-0.13.0}/lint.sh +0 -0
  42. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/__init__.py +0 -0
  43. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/build.py +0 -0
  44. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/catalog.py +0 -0
  45. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/cli.py +0 -0
  46. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/orf-evidence/AUTHOR-LICENSE.txt +0 -0
  47. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/orf-evidence/NOTICE.txt +0 -0
  48. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/orf-evidence/catalog.json.gz +0 -0
  49. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/orf-evidence/manifest.json +0 -0
  50. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/uorf-evidence/AUTHOR-LICENSE.txt +0 -0
  51. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/uorf-evidence/NOTICE.txt +0 -0
  52. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/uorf-evidence/catalog.json.gz +0 -0
  53. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/data/uorf-evidence/manifest.json +0 -0
  54. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/dataset.py +0 -0
  55. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/dataset_cli.py +0 -0
  56. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/datasets.py +0 -0
  57. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/initiation_context.py +0 -0
  58. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/measurements.py +0 -0
  59. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/model.py +0 -0
  60. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/pairing.py +0 -0
  61. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/reference.py +0 -0
  62. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/reference_mapping.py +0 -0
  63. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/sequence.py +0 -0
  64. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/sources/copy.py +0 -0
  65. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/sources/pfizer.py +0 -0
  66. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata/sources/pfizer_rna.py +0 -0
  67. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata.egg-info/dependency_links.txt +0 -0
  68. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata.egg-info/entry_points.txt +0 -0
  69. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata.egg-info/requires.txt +0 -0
  70. {orfdata-0.12.0 → orfdata-0.13.0}/orfdata.egg-info/top_level.txt +0 -0
  71. {orfdata-0.12.0 → orfdata-0.13.0}/pyproject.toml +0 -0
  72. {orfdata-0.12.0 → orfdata-0.13.0}/setup.cfg +0 -0
  73. {orfdata-0.12.0 → orfdata-0.13.0}/test.sh +0 -0
  74. {orfdata-0.12.0 → orfdata-0.13.0}/tests/conftest.py +0 -0
  75. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905474.soft +0 -0
  76. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905474_KL9_fpkm.txt.gz +0 -0
  77. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905476.soft +0 -0
  78. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905476_KL10_fpkm.txt.gz +0 -0
  79. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905478.soft +0 -0
  80. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905478_KL11_fpkm.txt.gz +0 -0
  81. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905479.soft +0 -0
  82. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/GSM1905479_KL12_fpkm.txt.gz +0 -0
  83. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/NOTICE.md +0 -0
  84. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/expected.json +0 -0
  85. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/geo-series.soft +0 -0
  86. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/manifest.json +0 -0
  87. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/methods.pdf +0 -0
  88. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/paper.xml +0 -0
  89. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/pmc-metadata.json +0 -0
  90. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/qconcat.fasta +0 -0
  91. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/copy/workbook.xlsx +0 -0
  92. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/NOTICE.md +0 -0
  93. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/dog/expected.json +0 -0
  94. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/dog/manifest.json +0 -0
  95. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/dog/protein.tsv +0 -0
  96. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/dog/search.fasta +0 -0
  97. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/human/expected.json +0 -0
  98. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/human/manifest.json +0 -0
  99. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/human/protein.tsv +0 -0
  100. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/human/search.fasta +0 -0
  101. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/mouse/expected.json +0 -0
  102. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/mouse/manifest.json +0 -0
  103. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/mouse/protein.tsv +0 -0
  104. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer/mouse/search.fasta +0 -0
  105. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/GSE325522_family.soft.gz +0 -0
  106. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/GSE325523_family.soft.gz +0 -0
  107. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/GSE325525_family.soft.gz +0 -0
  108. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/NOTICE.md +0 -0
  109. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/counts.csv.gz +0 -0
  110. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/dog-annotation.gtf.gz +0 -0
  111. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/dog-expected.json +0 -0
  112. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/dog-manifest.json +0 -0
  113. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/mouse-annotation.gtf.gz +0 -0
  114. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/mouse-expected.json +0 -0
  115. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/mouse-manifest.json +0 -0
  116. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/pfizer_rna/samples.xlsx +0 -0
  117. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/references/README.md +0 -0
  118. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/references/canis_lupus_familiaris.json +0 -0
  119. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/references/context-keys-v0.4.json +0 -0
  120. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/references/homo_sapiens.json +0 -0
  121. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/references/mus_musculus.json +0 -0
  122. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/references/saccharomyces_cerevisiae.json +0 -0
  123. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/search_reference/dog.fasta +0 -0
  124. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/search_reference/expected.json +0 -0
  125. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/README.md +0 -0
  126. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/generate.py +0 -0
  127. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/v1.json +0 -0
  128. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/v1.sqlite +0 -0
  129. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/v2.json +0 -0
  130. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/v2.sqlite +0 -0
  131. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/v3.json +0 -0
  132. {orfdata-0.12.0 → orfdata-0.13.0}/tests/data/storage/v3.sqlite +0 -0
  133. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_copy.py +0 -0
  134. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_cross_reference_pairing.py +0 -0
  135. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_initiation_context.py +0 -0
  136. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_local_build_queries.py +0 -0
  137. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_measurements.py +0 -0
  138. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_pairing.py +0 -0
  139. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_pfizer.py +0 -0
  140. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_pfizer_rna.py +0 -0
  141. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_reference_context.py +0 -0
  142. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_reference_mapping.py +0 -0
  143. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_reference_orf.py +0 -0
  144. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_search_reference.py +0 -0
  145. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_selectors.py +0 -0
  146. {orfdata-0.12.0 → orfdata-0.13.0}/tests/test_storage.py +0 -0
  147. {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.12.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 | Native Pfizer counts missing from the deposit | Pfizer: 10,352 groups, 37 channels, iBAQ/rIBAQ | Unresolved |
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 [protein measurements](pfizer-protein.md),
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 matched human
31
- comparators, quantitative Ribo-seq, further ncORF evidence and additional species.
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) and [yeast RNA/protein calibration](copy-yeast.md)
12
- use the same objects. See [released coverage and gaps](coverage.md);
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 != "uniprot-fasta":
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
- if not re.fullmatch("[A-Z]+", self.sequence):
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 != self.target.reference.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
- fields = fasta_id.split("|")
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
- if identifier in entries or not sequence or not re.fullmatch("[A-Z]+", sequence):
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(), int(taxon.group(1)),
193
- gene.group(1) if gene else None, fields[0], source_line,
190
+ sequence, hashlib.sha256(sequence.encode("ascii")).hexdigest(), taxon,
191
+ gene, database, source_line,
194
192
  )
195
193
 
196
- with self.path.open(encoding="utf-8") as handle:
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 ()