orfdata 0.27.1__tar.gz → 0.28.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 (235) hide show
  1. {orfdata-0.27.1 → orfdata-0.28.0}/MANIFEST.in +2 -0
  2. {orfdata-0.27.1/orfdata.egg-info → orfdata-0.28.0}/PKG-INFO +10 -7
  3. {orfdata-0.27.1 → orfdata-0.28.0}/README.md +9 -6
  4. {orfdata-0.27.1 → orfdata-0.28.0}/docs/catalogs.md +181 -38
  5. {orfdata-0.27.1 → orfdata-0.28.0}/docs/coverage.md +4 -3
  6. {orfdata-0.27.1 → orfdata-0.28.0}/docs/index.md +8 -7
  7. {orfdata-0.27.1 → orfdata-0.28.0}/docs/proteome.md +37 -23
  8. {orfdata-0.27.1 → orfdata-0.28.0}/docs/reference.md +16 -14
  9. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/__init__.py +7 -0
  10. orfdata-0.28.0/orfdata/_pinned_genome.py +18 -0
  11. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/build.py +4 -4
  12. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/catalog.py +97 -58
  13. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/catalog_cli.py +8 -2
  14. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/catalogs.py +16 -0
  15. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/cli.py +65 -7
  16. orfdata-0.28.0/orfdata/data/catalogs.json +307 -0
  17. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/data/chains.json +24 -0
  18. orfdata-0.28.0/orfdata/data/genomes.json +30 -0
  19. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/evidence.py +85 -18
  20. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/evidence_summary.py +3 -3
  21. orfdata-0.28.0/orfdata/genomes.py +146 -0
  22. orfdata-0.28.0/orfdata/genomes_cli.py +39 -0
  23. orfdata-0.28.0/orfdata/install.py +137 -0
  24. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/liftover.py +3 -2
  25. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/proteome.py +39 -19
  26. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/proteome_cli.py +26 -11
  27. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/reference.py +2 -1
  28. orfdata-0.28.0/orfdata/sources/ncorf_mammals.py +176 -0
  29. orfdata-0.28.0/orfdata/sources/riborf.py +163 -0
  30. orfdata-0.28.0/orfdata/version.py +1 -0
  31. {orfdata-0.27.1 → orfdata-0.28.0/orfdata.egg-info}/PKG-INFO +10 -7
  32. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata.egg-info/SOURCES.txt +21 -0
  33. {orfdata-0.27.1 → orfdata-0.28.0}/pyproject.toml +1 -1
  34. orfdata-0.28.0/tests/data/ncorf_mammals/README.md +20 -0
  35. orfdata-0.28.0/tests/data/ncorf_mammals/S3.xlsx +0 -0
  36. orfdata-0.28.0/tests/data/ncorf_mammals/ensembl107.cdna.fa.gz +0 -0
  37. orfdata-0.28.0/tests/data/ncorf_mammals/ensembl107.gtf.gz +0 -0
  38. orfdata-0.28.0/tests/data/ncorf_mammals/mouse.bed +6 -0
  39. orfdata-0.28.0/tests/data/ncorf_mammals/mouse.pep.fa +12 -0
  40. orfdata-0.28.0/tests/data/riborf/README.md +21 -0
  41. orfdata-0.28.0/tests/data/riborf/SD3.xlsx +0 -0
  42. orfdata-0.28.0/tests/data/riborf/ensembl107.cdna.fa.gz +0 -0
  43. orfdata-0.28.0/tests/data/riborf/ensembl107.gtf.gz +0 -0
  44. orfdata-0.28.0/tests/data/riborf/ensembl107.ncrna.fa.gz +0 -0
  45. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_catalog_registry.py +24 -7
  46. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_evidence_rules.py +139 -28
  47. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_evidence_summary.py +8 -8
  48. orfdata-0.28.0/tests/test_genomes.py +102 -0
  49. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_initiation_context.py +1 -1
  50. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_liftover.py +38 -10
  51. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_merge_catalogs.py +10 -1
  52. orfdata-0.28.0/tests/test_ncorf_mammals.py +170 -0
  53. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_openprot.py +4 -2
  54. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_proteome.py +14 -6
  55. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_reference_orf.py +9 -6
  56. orfdata-0.28.0/tests/test_riborf.py +107 -0
  57. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_uorf_catalog.py +16 -16
  58. orfdata-0.27.1/orfdata/data/catalogs.json +0 -105
  59. orfdata-0.27.1/orfdata/version.py +0 -1
  60. {orfdata-0.27.1 → orfdata-0.28.0}/LICENSE +0 -0
  61. {orfdata-0.27.1 → orfdata-0.28.0}/deploy.sh +0 -0
  62. {orfdata-0.27.1 → orfdata-0.28.0}/docs/copy-yeast.md +0 -0
  63. {orfdata-0.27.1 → orfdata-0.28.0}/docs/examples.md +0 -0
  64. {orfdata-0.27.1 → orfdata-0.28.0}/docs/human-tissue.md +0 -0
  65. {orfdata-0.27.1 → orfdata-0.28.0}/docs/ingolia-yeast.md +0 -0
  66. {orfdata-0.27.1 → orfdata-0.28.0}/docs/measurements.md +0 -0
  67. {orfdata-0.27.1 → orfdata-0.28.0}/docs/pairing.md +0 -0
  68. {orfdata-0.27.1 → orfdata-0.28.0}/docs/pfizer-protein.md +0 -0
  69. {orfdata-0.27.1 → orfdata-0.28.0}/docs/pfizer-rna.md +0 -0
  70. {orfdata-0.27.1 → orfdata-0.28.0}/docs/search-references.md +0 -0
  71. {orfdata-0.27.1 → orfdata-0.28.0}/docs/source-references.md +0 -0
  72. {orfdata-0.27.1 → orfdata-0.28.0}/docs/species.md +0 -0
  73. {orfdata-0.27.1 → orfdata-0.28.0}/docs/storage.md +0 -0
  74. {orfdata-0.27.1 → orfdata-0.28.0}/docs/stylesheets/docs.css +0 -0
  75. {orfdata-0.27.1 → orfdata-0.28.0}/docs.sh +0 -0
  76. {orfdata-0.27.1 → orfdata-0.28.0}/lint.sh +0 -0
  77. {orfdata-0.27.1 → orfdata-0.28.0}/mkdocs.yml +0 -0
  78. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/_structure.py +0 -0
  79. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/catalog_manifest.py +0 -0
  80. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/data/datasets.json +0 -0
  81. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/data/ires/rfam-15.1-human-ires.json +0 -0
  82. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/data/orf-evidence/AUTHOR-LICENSE.txt +0 -0
  83. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/data/orf-evidence/NOTICE.txt +0 -0
  84. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/data/orf-evidence/catalog.json.gz +0 -0
  85. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/data/orf-evidence/manifest.json +0 -0
  86. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/data/uorf-evidence/AUTHOR-LICENSE.txt +0 -0
  87. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/data/uorf-evidence/NOTICE.txt +0 -0
  88. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/data/uorf-evidence/catalog.json.gz +0 -0
  89. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/data/uorf-evidence/manifest.json +0 -0
  90. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/dataset.py +0 -0
  91. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/dataset_cli.py +0 -0
  92. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/datasets.py +0 -0
  93. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/initiation_context.py +0 -0
  94. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/liftover_cli.py +0 -0
  95. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/measurements.py +0 -0
  96. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/model.py +0 -0
  97. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/pairing.py +0 -0
  98. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/reference_mapping.py +0 -0
  99. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/rna.py +0 -0
  100. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/search_reference.py +0 -0
  101. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/sequence.py +0 -0
  102. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/sources/__init__.py +0 -0
  103. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/sources/copy.py +0 -0
  104. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/sources/ingolia.py +0 -0
  105. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/sources/openprot.py +0 -0
  106. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/sources/pfizer.py +0 -0
  107. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/sources/pfizer_rna.py +0 -0
  108. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata/sources/wang.py +0 -0
  109. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata.egg-info/dependency_links.txt +0 -0
  110. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata.egg-info/entry_points.txt +0 -0
  111. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata.egg-info/requires.txt +0 -0
  112. {orfdata-0.27.1 → orfdata-0.28.0}/orfdata.egg-info/top_level.txt +0 -0
  113. {orfdata-0.27.1 → orfdata-0.28.0}/setup.cfg +0 -0
  114. {orfdata-0.27.1 → orfdata-0.28.0}/test.sh +0 -0
  115. {orfdata-0.27.1 → orfdata-0.28.0}/tests/conftest.py +0 -0
  116. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/aggregate_evidence.json +0 -0
  117. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/GSM1905474.soft +0 -0
  118. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/GSM1905474_KL9_fpkm.txt.gz +0 -0
  119. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/GSM1905476.soft +0 -0
  120. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/GSM1905476_KL10_fpkm.txt.gz +0 -0
  121. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/GSM1905478.soft +0 -0
  122. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/GSM1905478_KL11_fpkm.txt.gz +0 -0
  123. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/GSM1905479.soft +0 -0
  124. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/GSM1905479_KL12_fpkm.txt.gz +0 -0
  125. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/NOTICE.md +0 -0
  126. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/expected.json +0 -0
  127. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/geo-series.soft +0 -0
  128. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/manifest.json +0 -0
  129. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/methods.pdf +0 -0
  130. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/paper.xml +0 -0
  131. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/pmc-metadata.json +0 -0
  132. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/qconcat.fasta +0 -0
  133. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/copy/workbook.xlsx +0 -0
  134. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346111.metadata.txt +0 -0
  135. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346111.quant.txt.gz +0 -0
  136. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346114.metadata.txt +0 -0
  137. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346114.quant.txt.gz +0 -0
  138. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346115.metadata.txt +0 -0
  139. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346115.quant.txt.gz +0 -0
  140. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346116.metadata.txt +0 -0
  141. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346116.quant.txt.gz +0 -0
  142. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346117.metadata.txt +0 -0
  143. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346117.quant.txt.gz +0 -0
  144. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346118.metadata.txt +0 -0
  145. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346118.quant.txt.gz +0 -0
  146. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346120.metadata.txt +0 -0
  147. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346120.quant.txt.gz +0 -0
  148. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346122.metadata.txt +0 -0
  149. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/GSM346122.quant.txt.gz +0 -0
  150. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/NOTICE.md +0 -0
  151. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/expected.json +0 -0
  152. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/manifest.json +0 -0
  153. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/ingolia/readMe.txt.gz +0 -0
  154. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/openprot/README.md +0 -0
  155. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/openprot/ensembl106.cdna.fa.gz +0 -0
  156. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/openprot/ensembl106.gtf.gz +0 -0
  157. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/openprot/mouse-openprot-2_2-altprots+isoforms-min_2_pep-GRCm39.106.bed.zip +0 -0
  158. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/openprot/mouse-openprot-2_2-altprots+isoforms-min_2_pep-GRCm39.106.fasta.zip +0 -0
  159. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/openprot/mouse-openprot-2_2-altprots+isoforms-min_2_pep-GRCm39.106.tsv.zip +0 -0
  160. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/NOTICE.md +0 -0
  161. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/dog/expected.json +0 -0
  162. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/dog/manifest.json +0 -0
  163. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/dog/protein.tsv +0 -0
  164. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/dog/search.fasta +0 -0
  165. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/human/expected.json +0 -0
  166. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/human/manifest.json +0 -0
  167. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/human/protein.tsv +0 -0
  168. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/human/search.fasta +0 -0
  169. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/mouse/expected.json +0 -0
  170. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/mouse/manifest.json +0 -0
  171. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/mouse/protein.tsv +0 -0
  172. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer/mouse/search.fasta +0 -0
  173. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer_rna/GSE325522_family.soft.gz +0 -0
  174. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer_rna/GSE325523_family.soft.gz +0 -0
  175. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer_rna/GSE325525_family.soft.gz +0 -0
  176. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer_rna/NOTICE.md +0 -0
  177. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer_rna/counts.csv.gz +0 -0
  178. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer_rna/dog-annotation.gtf.gz +0 -0
  179. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer_rna/dog-expected.json +0 -0
  180. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer_rna/dog-manifest.json +0 -0
  181. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer_rna/mouse-annotation.gtf.gz +0 -0
  182. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer_rna/mouse-expected.json +0 -0
  183. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer_rna/mouse-manifest.json +0 -0
  184. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/pfizer_rna/samples.xlsx +0 -0
  185. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/references/README.md +0 -0
  186. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/references/canis_lupus_familiaris.json +0 -0
  187. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/references/context-keys-v0.4.json +0 -0
  188. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/references/ensembl115.json +0 -0
  189. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/references/homo_sapiens.json +0 -0
  190. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/references/mitochondrial.json +0 -0
  191. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/references/mus_musculus.json +0 -0
  192. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/references/saccharomyces_cerevisiae.json +0 -0
  193. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/references/uniprot_literature.json +0 -0
  194. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/regions/NOTICE.md +0 -0
  195. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/regions/ingolia.json +0 -0
  196. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/search_reference/NOTICE.md +0 -0
  197. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/search_reference/dog.fasta +0 -0
  198. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/search_reference/ensembl83-expected.json +0 -0
  199. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/search_reference/ensembl83-human.fasta.gz +0 -0
  200. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/search_reference/expected.json +0 -0
  201. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/storage/README.md +0 -0
  202. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/storage/generate.py +0 -0
  203. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/storage/v1.json +0 -0
  204. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/storage/v1.sqlite +0 -0
  205. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/storage/v2.json +0 -0
  206. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/storage/v2.sqlite +0 -0
  207. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/storage/v3.json +0 -0
  208. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/storage/v3.sqlite +0 -0
  209. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/wang/NOTICE.md +0 -0
  210. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/wang/annotation.gtf.gz +0 -0
  211. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/wang/copies.zip +0 -0
  212. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/wang/expected.json +0 -0
  213. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/wang/manifest.json +0 -0
  214. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/wang/protein.zip +0 -0
  215. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/wang/rna.zip +0 -0
  216. {orfdata-0.27.1 → orfdata-0.28.0}/tests/data/wang/search.fasta.gz +0 -0
  217. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_copy.py +0 -0
  218. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_cross_reference_pairing.py +0 -0
  219. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_ensembl_search_reference.py +0 -0
  220. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_genetic_codes.py +0 -0
  221. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_ingolia.py +0 -0
  222. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_local_build_queries.py +0 -0
  223. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_measurements.py +0 -0
  224. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_orf_cases.py +0 -0
  225. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_paired_selectors.py +0 -0
  226. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_pairing.py +0 -0
  227. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_pfizer.py +0 -0
  228. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_pfizer_rna.py +0 -0
  229. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_reference_context.py +0 -0
  230. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_reference_mapping.py +0 -0
  231. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_region_targets.py +0 -0
  232. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_search_reference.py +0 -0
  233. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_selectors.py +0 -0
  234. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_storage.py +0 -0
  235. {orfdata-0.27.1 → orfdata-0.28.0}/tests/test_wang.py +0 -0
@@ -8,3 +8,5 @@ recursive-include tests/data/search_reference *.gz
8
8
  recursive-include tests/data/wang *.zip *.gz
9
9
  recursive-include tests/data/ingolia *.gz *.txt
10
10
  recursive-include tests/data/openprot *.zip *.gz
11
+ recursive-include tests/data/ncorf_mammals *.bed *.fa *.xlsx *.gz *.md
12
+ recursive-include tests/data/riborf *.xlsx *.gz *.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orfdata
3
- Version: 0.27.1
3
+ Version: 0.28.0
4
4
  Summary: Reference proteomes with evidence-backed noncanonical ORFs on PyEnsembl genomes
5
5
  Author: OpenVax
6
6
  License-Expression: Apache-2.0
@@ -81,16 +81,19 @@ orfdata proteome --species human --release 115 --output human-e115.fasta
81
81
  ```
82
82
 
83
83
  A translated ORF or a detected peptide does not by itself establish a stable,
84
- functional protein. Most MS support in the bundled catalogue comes from
85
- peptides presented by HLA molecules.
84
+ functional protein. Most MS support in the bundled human catalogue comes from
85
+ immunopeptidomics: peptides eluted from HLA molecules.
86
86
 
87
87
  ## Species
88
88
 
89
- The bundled noncanonical ORF catalogue is human GRCh38. Mouse ORFs come from
90
- OpenProt 2.2: `orfdata catalogs build openprot-mouse` builds that catalogue
91
- from OpenProt's own files. After `orfdata chains download` (add
89
+ The bundled noncanonical ORF catalogue is human GRCh38. Mouse has 48,805:
90
+ Ribo-seq ORFs of Chang et al. 2025 and Yang et al. 2024, and 2,976 MS-supported
91
+ ones from OpenProt 2.2;
92
+ `pip install "orfdata[data,build-data]"` then `orfdata setup --species mouse`
93
+ builds all three from their sources' own files. After `orfdata chains download` (add
92
94
  `--accept-terms` for UCSC's non-commercial mouse chains), older assemblies
93
- (GRCh37, NCBI36, GRCm38, NCBIM37) use these catalogues lifted to them. Dog and yeast proteomes contain their
95
+ (GRCh37, NCBI36, GRCm38, NCBIM37) and T2T-CHM13 use these catalogues lifted
96
+ to them; `orfdata genomes install t2t-chm13` installs a CHM13 annotation. Dog and yeast proteomes contain their
94
97
  PyEnsembl-annotated proteins. `load_catalog(species=...)` and
95
98
  `with_extra_orfs()` pick the catalogue for a species and raise when none is
96
99
  available or built.
@@ -51,16 +51,19 @@ orfdata proteome --species human --release 115 --output human-e115.fasta
51
51
  ```
52
52
 
53
53
  A translated ORF or a detected peptide does not by itself establish a stable,
54
- functional protein. Most MS support in the bundled catalogue comes from
55
- peptides presented by HLA molecules.
54
+ functional protein. Most MS support in the bundled human catalogue comes from
55
+ immunopeptidomics: peptides eluted from HLA molecules.
56
56
 
57
57
  ## Species
58
58
 
59
- The bundled noncanonical ORF catalogue is human GRCh38. Mouse ORFs come from
60
- OpenProt 2.2: `orfdata catalogs build openprot-mouse` builds that catalogue
61
- from OpenProt's own files. After `orfdata chains download` (add
59
+ The bundled noncanonical ORF catalogue is human GRCh38. Mouse has 48,805:
60
+ Ribo-seq ORFs of Chang et al. 2025 and Yang et al. 2024, and 2,976 MS-supported
61
+ ones from OpenProt 2.2;
62
+ `pip install "orfdata[data,build-data]"` then `orfdata setup --species mouse`
63
+ builds all three from their sources' own files. After `orfdata chains download` (add
62
64
  `--accept-terms` for UCSC's non-commercial mouse chains), older assemblies
63
- (GRCh37, NCBI36, GRCm38, NCBIM37) use these catalogues lifted to them. Dog and yeast proteomes contain their
65
+ (GRCh37, NCBI36, GRCm38, NCBIM37) and T2T-CHM13 use these catalogues lifted
66
+ to them; `orfdata genomes install t2t-chm13` installs a CHM13 annotation. Dog and yeast proteomes contain their
64
67
  PyEnsembl-annotated proteins. `load_catalog(species=...)` and
65
68
  `with_extra_orfs()` pick the catalogue for a species and raise when none is
66
69
  available or built.
@@ -7,19 +7,23 @@ the same explicit discovery, download, build and offline-open workflow as
7
7
  downloaded or built, `load_catalog(species=...)` opens it, so `extra_orfs(genome)` and
8
8
  `Proteome.with_extra_orfs()` use it without `catalog=`; pass
9
9
  `load_catalog(species=..., registry=...)` as `catalog=` for your own registry.
10
- A bundled catalogue is preferred, a catalogue's default release is opened
11
- unless only another release covers the assembly, and two registered catalogues
12
- for one species and assembly are never chosen between; open one by name
13
- instead. It returns the existing `ORFCatalog`; query results still bind to the
10
+ Every catalogue for the species is used, merged: those on the requested
11
+ assembly as they are, and those on another assembly the pinned chains reach,
12
+ lifted ([details](#every-assembly-of-a-species)). Each catalogue contributes its
13
+ release on the requested assembly if it has one, else its default release. It
14
+ returns the existing `ORFCatalog`; query results still bind to the
14
15
  original PyEnsembl transcript through `ReferenceORF`. To use several catalogues
15
16
  for one species together, see
16
17
  [merging catalogues](proteome.md#merging-catalogues).
17
18
 
18
- The packaged registry has one entry, the [OpenProt mouse catalogue](#mouse-orfs-from-openprot),
19
- which you build from OpenProt's own files. `orfdata catalogs status` (in Python,
20
- `catalog_status()`) lists every catalogue `load_catalog` can open, the bundled
21
- one included, with its species, assembly, record count, whether it is
22
- installed and which one is selected for each assembly:
19
+ The packaged registry has three mouse catalogues, each built from its sources'
20
+ own files: [OpenProt's MS-supported ORFs](#mouse-orfs-from-openprot),
21
+ [Chang et al.'s Ribo-seq ORFs](#mouse-ribo-seq-orfs-chang-et-al) and
22
+ [Yang et al.'s RibORF ORFs](#mouse-riborf-orfs-yang-et-al). `orfdata setup
23
+ --species mouse` installs all three, with the chain files. `orfdata catalogs status`
24
+ (in Python, `catalog_status()`) lists every catalogue `load_catalog` can open,
25
+ the bundled one included, with its species, assembly, record count, whether it
26
+ is installed and whether it is used:
23
27
 
24
28
  ```sh
25
29
  orfdata catalogs status
@@ -61,22 +65,119 @@ evidence filters, and JSON/TSV/FASTA exports. They cannot override the selected
61
65
  release with a local `--catalog` argument. Use `orfdata --catalog FILE` for the
62
66
  existing standalone local-file workflow.
63
67
 
68
+ ## Mouse
69
+
70
+ ```sh
71
+ pip install "orfdata[data,build-data]"
72
+ orfdata setup --species mouse --accept-terms # Three catalogues and the chains; about 130 MB of sources
73
+ ```
74
+
75
+ `orfdata setup` builds each registered mouse catalogue from its pinned sources
76
+ and downloads the chain files (`--accept-terms` for UCSC's non-commercial
77
+ GRCm38/GRCm39 chains). It prints what it did with each: built, downloaded,
78
+ already installed, repaired or skipped. If one fails, the rest are still
79
+ installed and it exits with status 1, naming each failure; in Python,
80
+ `install_species` raises `InstallError`, whose `result` holds the same
81
+ report. `load_catalog(species="mouse")` then merges the three,
82
+ in this order, into 48,805 ORFs: 2,976 MS-supported OpenProt ORFs, 16,484
83
+ Ribo-seq ORFs of Chang et al. and 40,089 of Yang et al. 10,448 of Chang's and
84
+ Yang's ORFs are the same ORF (28 of them also in OpenProt), and 296 OpenProt
85
+ ORFs have Ribo-seq support from one or both, 242 from Yang et al. alone. On
86
+ Ensembl 115 (GRCm39):
87
+
88
+ | Evidence | Selected | Added to the proteome |
89
+ | --- | ---: | ---: |
90
+ | `"ms"` (default) | 2,976 | 2,854 |
91
+ | `RiboSeq()` | 46,207 | 46,094 |
92
+ | `RiboSeq() & MS()` | 378 | 371 |
93
+ | `None` | 48,805 | 48,577 |
94
+
95
+ Loading the merged catalogue takes about 10 seconds and 0.9 GB of memory, once
96
+ per process, whichever evidence is selected. On GRCm38 and NCBIM37 all three
97
+ are [lifted automatically](#every-assembly-of-a-species). Dog has no
98
+ experimentally supported ORF catalogue from any source: OpenProt and the
99
+ Ribo-seq resources have no dog data, and dog MS studies searched only canonical
100
+ proteins.
101
+
102
+ ### Mouse Ribo-seq ORFs (Chang et al.)
103
+
104
+ `ncorf-mammals-mouse` holds the mouse ncORFs of Chang et al.
105
+ (eLife 2025, [doi:10.7554/eLife.109128](https://doi.org/10.7554/eLife.109128)):
106
+ 16,484 of the source's 16,485,
107
+ called with PRICE, RiboCode and Ribo-TISH on Ensembl 107: an ORF is kept when at
108
+ least two callers find it in a library, in at least two libraries, starting at
109
+ ATG, CTG, GTG or TTG. Its types are uORF (8,294), lncORF (3,576), uoORF
110
+ (1,950), iORF (1,749), dORF (741) and doORF (174).
111
+
112
+ - **Sources.** The authors' BED and protein FASTA (MIT, pinned commit), the
113
+ paper's Table S3 (CC BY 4.0) and Ensembl 107's GTF; about 40 MB. Building
114
+ needs `orfdata[build-data]` for the spreadsheet.
115
+ - **Coding paths.** The BED garbles multi-exon block sizes, so each ORF's
116
+ path comes from its representative transcript and transcript coordinates
117
+ in Ensembl 107, checked against its genomic start, stop, BED span and
118
+ protein length. 16,484 resolve; one without a stop codon is listed as
119
+ unresolved. All 16,484 bind to their Ensembl 107 transcript with their exact
120
+ coding path and protein; 16,470 place on Ensembl 115.
121
+ - **Starts.** The source writes GTG-initiated proteins with valine. A
122
+ near-cognate start is read by the initiator methionine, so these proteins
123
+ begin with M, and their records declare the GTG start (CTG and TTG are
124
+ already starts of the standard code).
125
+ - **Evidence.** Each ORF's library and caller counts become aggregate
126
+ Ribo-seq summaries, so `RiboSeq()` selects every ORF and `MS()` none.
127
+ The libraries aren't named per ORF, so `RiboSeq(min_studies=2)` selects
128
+ none.
129
+
130
+ ### Mouse RibORF ORFs (Yang et al.)
131
+
132
+ `riborf-mouse` holds the mouse ORFs that RibORF 2.0 identified as translated in
133
+ the Ribo-seq data of Yang et al. (Nat Commun 2024,
134
+ [doi:10.1038/s41467-024-46240-9](https://doi.org/10.1038/s41467-024-46240-9);
135
+ 224 samples in 26 GEO series), of at least 5 residues: uORF (20,399), lncORF
136
+ (6,954), dORF (4,075), uoORF (3,037), iORF (2,370), N-terminal truncation
137
+ (2,047) and extension (575), and doORF (632). The source's ouORF, odORF and
138
+ noncoding types take Chang et al.'s names, so `--biotype uoORF` finds both
139
+ sources' overlapping uORFs. Annotated CDSs, likely sequencing errors,
140
+ stop-codon readthrough and 12,222 ORFs shorter than Chang et al.'s shortest (5
141
+ residues; 4,505 are a bare start and stop) are not imported.
142
+
143
+ - **Placement.** The source gives mm10 / GENCODE vM25 transcript coordinates
144
+ (a 1-based start, an exclusive end) and no proteins. Rather than lift mm10
145
+ through a restricted chain, each ORF is placed on the same transcript in
146
+ Ensembl 107 GRCm39 and translated from that transcript's sequence. Of the
147
+ 41,906 rows long enough, 40,089 resolve. Listed as unresolved, with the
148
+ reason: 1,393 rows on 633 transcripts that changed length since GENCODE
149
+ vM25, 338 on 216 TEC transcripts that Ensembl 107 has in its GTF but in
150
+ neither FASTA, 85 on 51 transcripts that are gone, and one whose
151
+ transcript's sequence changed at the same length. Placing through the
152
+ transcript gives the same coding path as lifting the source's mm10 blocks
153
+ through UCSC's chain for all but 2, in a duplicated region of chr14 where
154
+ the chain is ambiguous. 39,983 place on Ensembl 115.
155
+ - **Sources.** Supplementary Data 3 (CC BY 4.0) and Ensembl 107's GTF, cDNA
156
+ and ncRNA FASTAs; about 115 MB, of which the 32 MB GTF is the one Chang et
157
+ al.'s catalogue uses, so `orfdata setup` downloads it once. Building needs
158
+ `orfdata[build-data]`.
159
+ - **Evidence.** Presence in the source's set is aggregate Ribo-seq support:
160
+ `RiboSeq()` selects every ORF, `RiboSeq(min_studies=2)` none.
161
+ - **IDs.** `riborf_` and the GRCm39 start and stop, such as
162
+ `riborf_4_120262600_120262620_+`, never a name Chang et al. use. Two paths
163
+ with the same start and stop add their transcript (`…@ENSMUST00000226495.2`),
164
+ and a lookup by the shared name lists both, as for OpenProt's split
165
+ accessions. An ORF in both sets merges by its coding path and protein,
166
+ whatever its name, and keeps Chang et al.'s ID; its `riborf_` ID still
167
+ finds it.
168
+
64
169
  ## Mouse ORFs from OpenProt
65
170
 
66
171
  `openprot-mouse` holds the alternative proteins (AltProts) and novel isoforms
67
172
  that [OpenProt 2.2](https://openprot.org) reports for mouse with at least two
68
173
  unique MS peptides, on Ensembl 106 GRCm39 transcripts. orfdata does not
69
174
  redistribute OpenProt's files, and OpenProt states no licence for them. You
70
- build the catalogue from OpenProt's own downloads (3.4 MB, about 5 seconds);
71
- each file is checked against its pinned size and SHA-256:
72
-
73
- ```sh
74
- pip install "orfdata[data]"
75
- orfdata catalogs build openprot-mouse
76
- ```
77
-
78
- After that, `load_catalog(species="mouse")`, `extra_orfs(genome)` and
79
- `Proteome.build(genome)` use it for any GRCm39 Ensembl release:
175
+ build the catalogue from OpenProt's own downloads (3.4 MB, about 5 seconds),
176
+ each checked against its pinned size and SHA-256, with `orfdata setup --species
177
+ mouse` along with the Ribo-seq catalogue above, or alone with `orfdata catalogs
178
+ build openprot-mouse`. `load_catalog(species="mouse")`, `extra_orfs(genome)`
179
+ and `Proteome.build(genome)` use all three mouse catalogues, for any GRCm39
180
+ Ensembl release, so all must be installed. With only MS-supported ORFs selected, the default:
80
181
 
81
182
  ```python
82
183
  from pyensembl import EnsemblRelease
@@ -160,25 +261,26 @@ With evidence `None` (every catalogue ORF), each assembly gets:
160
261
  | Genome | ORF source | Records | Placed | Not placed: main reasons |
161
262
  | --- | --- | ---: | ---: | --- |
162
263
  | Human Ensembl 115, GRCh38 | bundled | 7,264 | 7,239 | 24 splice paths changed |
163
- | Human Ensembl 75, GRCh37 | lifted, 1 hop | 7,247 | 6,857 | 271 transcripts absent, 108 paths changed |
164
- | Human Ensembl 54, NCBI36 | lifted, 1 hop | 7,253 | 4,195 | 2,710 transcripts absent |
165
- | Mouse Ensembl 115, GRCm39 | OpenProt | 2,976 | 2,854 | 109 without sequence |
166
- | Mouse Ensembl 102, GRCm38 | lifted, 1 hop | 2,975 | 2,856 | 112 without sequence |
167
- | Mouse Ensembl 67, NCBIM37 | lifted, 2 hops | 2,922 | 1,620 | 1,187 transcripts absent |
264
+ | Human Ensembl 75, GRCh37 | lifted, 1 hop | 7,247 | 6,857 | 270 transcripts absent, 108 paths changed, 1 on a transcript with a different protein |
265
+ | Human Ensembl 54, NCBI36 | lifted, 1 hop | 7,253 | 4,195 | 2,708 transcripts absent, 2 on a transcript with a different protein |
266
+ | Human Ensembl rapid 2022_07, T2T-CHM13v2.0 | lifted, 1 hop | 7,208 | 6,767 | 383 on a transcript with a different protein, 58 on no transcript, 56 not lifted |
267
+ | Mouse Ensembl 115, GRCm39 | OpenProt, Chang et al. and Yang et al. | 48,805 | 48,577 | 110 transcripts absent, 109 without sequence |
268
+ | Mouse Ensembl 102, GRCm38 | all three lifted, 1 hop | 48,800 | 48,169 | 434 transcripts absent, 5 not lifted |
269
+ | Mouse Ensembl 67, NCBIM37 | all three lifted, 2 hops | 48,642 | 38,105 | 9,217 transcripts absent, 163 not lifted |
168
270
 
169
271
  Older annotations lack many of the transcripts the sources name, so fewer ORFs
170
272
  place; the rest, and any that didn't lift, are listed with the reason, never
171
273
  silently dropped.
172
274
 
173
- - **Which catalogues.** Each catalogue contributes one release: the one on the
174
- requested assembly if it has one, else its default, lifted. Each assembly
175
- the pinned chains reach contributes one catalogue (a bundled one if any);
176
- two candidates on one assembly raise rather than being chosen between.
177
- Catalogues from several assemblies are merged, the requested assembly's
178
- first, then by fewest hops. A source already used from a nearer assembly,
179
- such as one catalogue registered again under another name on another
180
- assembly, counts once. This depends only on the registry and the pinned
181
- chains, never on what happens to be installed.
275
+ - **Which catalogues.** Every catalogue for the species is used, merged: on
276
+ the requested assembly as is, on the others the pinned chains reach, lifted.
277
+ Each contributes one release: the one on the requested assembly if it has
278
+ one, else its default. The requested assembly's come first, then by fewest
279
+ hops; bundled first, then by the registry's priority, which decides whose ID
280
+ a shared ORF keeps, so a new catalogue never renames existing ORFs. A source already used from a nearer assembly, such as one catalogue
281
+ registered again under another name on another assembly, counts once. This
282
+ depends only on the registry and the pinned chains, never on what happens
283
+ to be installed.
182
284
  - **What's missing.** Missing catalogues and chain files are reported together,
183
285
  each with the command that installs it; nothing is downloaded while
184
286
  loading. `cache_root` (or `--cache-root`) is where both are looked for.
@@ -193,7 +295,44 @@ silently dropped.
193
295
  through GRCm38. `lift_to(catalog, build)` lifts through it.
194
296
  `catalog_status()` lists, for each catalogue, the assemblies it reaches and
195
297
  whether their chains are downloaded.
196
- - **Cost.** Lifting happens on each load: about 1.6 s for the human catalogue.
298
+ - **Cost.** Lifting takes a few seconds (about 2 s for the human catalogue to
299
+ GRCh37 or CHM13); a process reuses the result for the same installed
300
+ catalogues and chains.
301
+ - **Unlifted ORFs.** `ExtraORFs.unlifted` lists the ORFs the evidence rule
302
+ selects that a lift left out; proteomes count them as `unlifted` and list
303
+ them among their exclusions. `ExtraORFs.excluded` holds only records of its
304
+ catalogue, which is what Varcode looks up.
305
+
306
+ ### T2T-CHM13
307
+
308
+ PyEnsembl's `EnsemblRelease` has no T2T-CHM13 annotation, so orfdata pins
309
+ Ensembl's rapid-release one (2022_07) and installs it on request, checking each
310
+ file's size and SHA-256 (it needs `orfdata[pyensembl]`). The T2T Consortium's
311
+ GRCh38-to-CHM13 chain is public domain (CC0):
312
+
313
+ ```sh
314
+ orfdata genomes install t2t-chm13 # 143 MB of Ensembl files, plus about 1.1 GB of PyEnsembl index
315
+ orfdata chains download GRCh38 T2T-CHM13v2.0
316
+ orfdata proteome --genome t2t-chm13 --output chm13.fasta
317
+ ```
318
+
319
+ ```python
320
+ from orfdata import Proteome, load_genome
321
+
322
+ genome = load_genome("t2t-chm13") # A PyEnsembl Genome named T2T-CHM13v2.0, offline
323
+ proteome = Proteome.build(genome) # 104,957 annotated proteins + 2,039 MS-supported ORFs
324
+ ```
325
+
326
+ The bundled GRCh38 catalogue lifts automatically: 7,208 of 7,264 ORFs lift, and
327
+ 6,767 place on CHM13 transcripts with their exact coding path and protein.
328
+ Ensembl gave CHM13 transcripts new IDs, so placement is by path. Of the 441 that
329
+ don't place, 383 lie on a CHM13 transcript with their exact coding path whose
330
+ sequence, from CHM13's own alleles, encodes a different protein (in 15, the
331
+ start codon itself differs); the exclusion reason names that transcript. The
332
+ other 58 are on no CHM13 transcript. The genome keeps its species and assembly
333
+ accession when pickled, for multiprocessing and Varcode. Your own CHM13 genome
334
+ works too if its `reference_name` is `T2T-CHM13v2.0` and it has a `species`
335
+ (or you pass `context=`); `hs1` or `chm13` get an error saying so.
197
336
 
198
337
  ## Lifting a catalogue by hand
199
338
 
@@ -235,11 +374,12 @@ print(len(grch37.records), len(grch37.metadata["liftover"]["unmapped"]), grch37.
235
374
  7247 17 orfdata-catalog:2026-10-11.1@GRCh37
236
375
  ```
237
376
 
238
- - **Pinned chain files.** Ensembl's human GRCh38 to and from
377
+ - **Pinned chain files.** The T2T Consortium's GRCh38 to and from
378
+ [T2T-CHM13v2.0](https://github.com/marbl/CHM13) are public domain. Ensembl's human GRCh38 to and from
239
379
  [GRCh37 and NCBI36](https://ftp.ensembl.org/pub/assembly_mapping/homo_sapiens/),
240
380
  and mouse GRCm38 to and from
241
381
  [NCBIM37](https://ftp.ensembl.org/pub/assembly_mapping/mus_musculus/),
242
- have no usage restrictions. `orfdata chains list` shows all eight. UCSC's mouse
382
+ have no usage restrictions. `orfdata chains list` shows all ten. UCSC's mouse
243
383
  [`mm10ToMm39`](https://hgdownload.soe.ucsc.edu/goldenPath/mm10/liftOver/README.txt)
244
384
  and [`mm39ToMm10`](https://hgdownload.soe.ucsc.edu/goldenPath/mm39/liftOver/README.txt)
245
385
  (GRCm38 and GRCm39) are free only for non-commercial use, so downloading
@@ -285,7 +425,7 @@ print(len(grch37.records), len(grch37.metadata["liftover"]["unmapped"]), grch37.
285
425
  2,186 MS-supported ORFs: 2,097 place, and 3 of the 89 excluded didn't lift.
286
426
  - **Size.** Each lifted record carries its original, so a lifted catalogue is
287
427
  about twice the size of its input (33 MB for the bundled one as JSON).
288
- - **Errors.** When no pinned chains reach an assembly, such as T2T-CHM13,
428
+ - **Errors.** When no pinned chains reach an assembly, such as HG002,
289
429
  `load_catalog(species=..., genome_build=...)` gives the `orfdata lift
290
430
  --chain` command and the Python call that lifts with your own chain file.
291
431
 
@@ -306,7 +446,10 @@ use separate locations.
306
446
 
307
447
  ## Defining a release
308
448
 
309
- A registry definition maps a name to `default_version` and `versions`. Each
449
+ A registry definition maps a name to `default_version`, `versions` and an
450
+ optional integer `priority` (default 100): when catalogues are merged, lower
451
+ priorities come first, and the first catalogue's ID names an ORF several
452
+ share. Each
310
453
  version contains a `CatalogManifest`, `distribution` access terms and an
311
454
  `assets` entry for raw `catalog.json.gz` bytes, pinned by URL, SHA-256 and size.
312
455
  The manifest declares references, original `SourceAsset` inputs, citations,
@@ -31,9 +31,10 @@ Calibration and uncertainty remain attached to observations:
31
31
  ## ORF evidence and ribosome profiling
32
32
 
33
33
  The separate existence-evidence catalogue contains 7,264 human noncanonical
34
- ORFs, including 2,186 with reported MS support. Mouse has 2,976 OpenProt 2.2
35
- ORFs, each with at least two unique MS peptides, which you build from
36
- OpenProt's files; dog and yeast have no experimental ncORF catalogue yet. Its
34
+ ORFs, including 2,186 with reported MS support. Mouse has 48,805 ORFs: Ribo-seq ORFs
35
+ from Chang et al. and Yang et al., and 2,976 OpenProt 2.2 ORFs with at least
36
+ two unique MS peptides, built from their sources' files; dog and yeast have no experimental
37
+ ncORF catalogue yet. Its
37
38
  ribosome evidence and pooled PSM counts are not sample-level ribosome
38
39
  occupancy or protein abundance.
39
40
 
@@ -53,12 +53,13 @@ orfdata proteome --species human --release 115 --output human-e115.fasta
53
53
 
54
54
  | `evidence=` | Selects ORFs with | Human ORFs | Encoded in Ensembl 115 |
55
55
  | --- | --- | ---: | ---: |
56
- | `"ribosome"` | Ribosome profiling (all bundled ORFs) | 7,264 | 7,239 |
56
+ | `"ribosome"` or `"riboseq"` | Ribosome profiling (all bundled ORFs) | 7,264 | 7,239 |
57
57
  | `"ms"` (default) | Any supporting MS peptide | 2,186 | 2,181 |
58
- | `"hla"` | Peptides presented by HLA molecules | 1,881 | 1,879 |
59
- | `"shotgun"` | Peptides from protease-digest MS | 73 | 72 |
58
+ | `"immunopeptidomics"` | Peptides eluted from MHC (in human, HLA) molecules | 1,881 | 1,879 |
59
+ | `"proteomics"` | Peptides from digested cellular proteins | 73 | 72 |
60
+ | `"all"` | Every catalogue ORF | 7,264 | 7,239 |
60
61
 
61
- Most MS support in the bundled human catalogue comes from HLA
62
+ Most MS support in the bundled human catalogue comes from
62
63
  immunopeptidomics. A presented peptide shows that the ORF was translated; it
63
64
  does not establish a stable protein. See
64
65
  [building a reference proteome](proteome.md#choose-the-evidence) for
@@ -95,9 +96,9 @@ transcript alongside them.
95
96
 
96
97
  | Species | Annotated proteins | Noncanonical ORFs |
97
98
  | --- | --- | --- |
98
- | Human | From PyEnsembl | 7,264 GRCh38 ORFs, bundled; lifted to GRCh37 and NCBI36 |
99
- | Mouse | From PyEnsembl | 2,976 GRCm39 ORFs from OpenProt 2.2, [built locally](catalogs.md#mouse-orfs-from-openprot); lifted to GRCm38 and NCBIM37 |
100
- | Dog | From PyEnsembl | None released; no qualified source yet |
99
+ | Human | From PyEnsembl; T2T-CHM13 from a pinned Ensembl annotation | 7,264 GRCh38 ORFs, bundled; lifted to GRCh37, NCBI36 and [T2T-CHM13](catalogs.md#t2t-chm13) |
100
+ | Mouse | From PyEnsembl | 48,805 ORFs on GRCm39: Ribo-seq ORFs of Chang et al. and Yang et al., and 2,976 MS-supported ones (OpenProt 2.2), [built locally](catalogs.md#mouse) with `orfdata setup --species mouse`; lifted to GRCm38 and NCBIM37 |
101
+ | Dog | From PyEnsembl | None: no experimentally supported dog ORF set exists |
101
102
  | Budding yeast | From PyEnsembl | None released |
102
103
 
103
104
  Other assemblies use a catalogue lifted to them once `orfdata chains download`
@@ -52,11 +52,12 @@ the bundled human catalogue (dataset `2026-10-11.1`) and Ensembl 115:
52
52
 
53
53
  | Selection | Human ORFs | Encoded in Ensembl 115 |
54
54
  | --- | ---: | ---: |
55
- | `evidence=None` or `"ribosome"`: translated in ribosome profiling | 7,264 | 7,239 |
55
+ | `evidence=None` or `"all"`: every catalogue ORF | 7,264 | 7,239 |
56
+ | `evidence="ribosome"` or `"riboseq"`: translated in ribosome profiling | 7,264 | 7,239 |
56
57
  | `evidence="ms"` (default): any supporting MS peptide | 2,186 | 2,181 |
57
- | `evidence="hla"` or `"mhc"`: peptides presented by HLA | 1,881 | 1,879 |
58
+ | `evidence="immunopeptidomics"`: peptides eluted from MHC (in human, HLA) molecules | 1,881 | 1,879 |
58
59
  | `evidence="ms_unclassified"`: MS with an unreported assay type | 537 | 535 |
59
- | `evidence="shotgun"`: protease-digest MS | 73 | 72 |
60
+ | `evidence="proteomics"`: peptides from digested cellular proteins | 73 | 72 |
60
61
  | `"ms"` with `require_unique=True` | 1,623 | 1,621 |
61
62
  | `"ms"` with `require_reviewed=True` | 44 | 44 |
62
63
 
@@ -64,19 +65,28 @@ All bundled ORFs come from ribosome-profiling catalogues, so `"ribosome"`
64
65
  selects all of them. An MS-supported ORF can have peptides from several assay
65
66
  types. `require_unique` keeps peptides that map to one protein *within the MS
66
67
  source's search*, which is not uniqueness across every possible protein; in
67
- this catalogue only the author HLA mappings report it. `require_reviewed`
68
+ this catalogue only the author HLA ligand mappings report it. `require_reviewed`
68
69
  keeps peptides with convincing community spectrum reviews. Because those two
69
70
  properties come from different sources, no bundled peptide has both.
70
71
  `require_resolved` excludes support that consists only of aggregate counts.
71
72
  See [ORFs and evidence](reference.md#evidence) for the full definitions.
72
73
 
74
+ A list (or tuple or set) of names selects ORFs with any of them:
75
+ `evidence=["proteomics", "immunopeptidomics"]` keeps ORFs with either kind of
76
+ MS peptide, unlike `"ms"`, which also counts unclassified MS. For ORFs that
77
+ need two kinds of evidence at once, combine rules with `&`, below.
78
+
73
79
  ### Separate Ribo-seq and MS stringency
74
80
 
75
81
  For more control, pass a rule. `RiboSeq(min_studies=n)` needs ribosome
76
82
  profiling in at least `n` independent studies the source names, and
77
- `MS(min_peptides=n, unique=..., reviewed=..., methods=...)` needs at least `n`
78
- distinct supporting peptide sequences. `&` requires both rules and `|` accepts
79
- either:
83
+ `MS(min_peptides=n, unique=..., reviewed=..., mhc=...)` needs at least `n`
84
+ distinct supporting peptide sequences. `MS(mhc=True)` counts only peptides
85
+ eluted from MHC molecules (the immunopeptidome) and `MS(mhc=False)` only
86
+ peptides from digested cellular proteins (the whole proteome). `MS()` counts
87
+ both, and the MS peptides whose source doesn't say which. `methods=` names the
88
+ kinds directly, for combinations such as `("proteomics", "ms_unclassified")`.
89
+ `&` requires both rules and `|` accepts either:
80
90
 
81
91
  ```python
82
92
  from orfdata import MS, RiboSeq
@@ -84,7 +94,8 @@ from orfdata import MS, RiboSeq
84
94
  annotated.with_extra_orfs(RiboSeq(min_studies=2)) # replicated Ribo-seq
85
95
  annotated.with_extra_orfs(RiboSeq(min_studies=2) & MS()) # Ribo-seq and MS
86
96
  annotated.with_extra_orfs(RiboSeq(min_studies=2) | MS()) # either
87
- annotated.with_extra_orfs(MS(methods=("shotgun", "ms_unclassified"))) # not HLA-only
97
+ annotated.with_extra_orfs(RiboSeq() & MS(mhc=True)) # Ribo-seq and an MHC ligand
98
+ annotated.with_extra_orfs(MS(methods=("proteomics", "ms_unclassified"))) # not immunopeptidomics-only
88
99
  ```
89
100
 
90
101
  | Rule | Human ORFs | Encoded in Ensembl 115 |
@@ -92,23 +103,26 @@ annotated.with_extra_orfs(MS(methods=("shotgun", "ms_unclassified"))) # not
92
103
  | `RiboSeq(min_studies=2)` | 3,085 | 3,072 |
93
104
  | `RiboSeq(min_studies=3)` | 1,675 | 1,671 |
94
105
  | `MS(min_peptides=2)` | 682 | 681 |
95
- | `MS(methods=("shotgun", "ms_unclassified"))` | 610 | 607 |
106
+ | `MS(methods=("proteomics", "ms_unclassified"))` | 610 | 607 |
96
107
  | `RiboSeq(min_studies=2) & MS()` | 1,296 | 1,293 |
97
108
  | `RiboSeq(min_studies=2) & MS(min_peptides=2)` | 457 | 456 |
98
109
  | `RiboSeq(min_studies=2) \| MS()` | 3,975 | 3,960 |
99
110
 
100
111
  GENCODE's `c…riboseqorf…` IDs are the 3,085 ORFs seen in two or more studies.
101
- Each method name above is the simplest rule: `"ms"` is `MS()`, `"hla"` is
102
- `MS(methods=("hla",))` and `"ribosome"` is `RiboSeq()`. A peptide counts once
112
+ Each method name above is the simplest rule: `"ms"` is `MS()`,
113
+ `"immunopeptidomics"` is `MS(mhc=True)`, `"proteomics"` is `MS(mhc=False)` and
114
+ `"ribosome"` (or `"riboseq"`) is `RiboSeq()`. The names before 0.28.0 (`"shotgun"`, and `"mhc"` or `"hla"`)
115
+ still work, with a deprecation warning, and catalogues that use them still
116
+ load. A peptide counts once
103
117
  however many assay types report it, and so do peptides that differ only by I
104
- and L (equal in mass). Nested peptides, such as HLA length variants, count as
118
+ and L (equal in mass). Nested peptides, such as MHC ligand length variants, count as
105
119
  one: the count is the largest set of supporting peptides none of which lies
106
120
  inside another, so a long peptide never hides two shorter, separate ones, and
107
121
  a stricter rule always selects a subset of a looser one. Of the 916 ORFs with
108
122
  two or more distinct peptide sequences, 234 have fewer than two that aren't
109
123
  nested. Each rule in `&` is checked on its own:
110
- `MS(methods="shotgun") & MS(unique=True)` needs a shotgun peptide and a unique
111
- peptide, not one unique shotgun peptide. A source's aggregate count stands for one observation:
124
+ `MS(mhc=False) & MS(unique=True)` needs a proteomics peptide and a
125
+ unique peptide, not one unique proteomics peptide. A source's aggregate count stands for one observation:
112
126
  it satisfies `RiboSeq()` and `MS()` but never `min_studies` or `min_peptides`
113
127
  above 1, `unique`, `reviewed` or `resolved=True`. The layer stores the rule,
114
128
  so a snapshot records exactly how its ORFs were chosen; `EvidenceRule.from_dict`
@@ -154,8 +168,8 @@ identical sequences, for example before an exact peptide search.
154
168
 
155
169
  Without `catalog=`, `load_catalog` picks the catalogue for the genome's species
156
170
  and assembly: a bundled one, or else one installed through
157
- [`CatalogRegistry`](catalogs.md). Human GRCh38 has the bundled one, and mouse
158
- GRCm39 has OpenProt's once [built](catalogs.md#mouse-orfs-from-openprot); for
171
+ [`CatalogRegistry`](catalogs.md), several merged. Human GRCh38 has the bundled
172
+ one, and mouse GRCm39 three once [installed](catalogs.md#mouse); for
159
173
  other species the error names the catalogues that exist. Pass `catalog=` to use
160
174
  another, such as `load_catalog(path)`. A catalogue for a different species or
161
175
  assembly is rejected.
@@ -187,7 +201,7 @@ other.
187
201
  differently counts once when their `ribosome_study_pmids` metadata give it
188
202
  the same PMID, as the bundled catalogue's does; without PMIDs it counts
189
203
  twice toward `RiboSeq(min_studies=...)`.
190
- - **Lookups.** Queries by transcript or gene, `for_transcript` and
204
+ - **Lookups.** Queries by transcript, gene or biotype, `for_transcript` and
191
205
  `ExtraORFs.for_gene(..., source=True)` match every source's labels, and an
192
206
  ORF is on its source transcript when it is on any source's.
193
207
  - **Annotation pins.** Sources pinned to different annotation releases of the
@@ -288,15 +302,15 @@ protein ID. Fields that apply follow as `key=value`:
288
302
 
289
303
  ```text
290
304
  >ENSP00000269305.4 kind=annotated taxon=9606 source=ensembl:115 gene=ENSG00000141510 gene_name=TP53 transcript=ENST00000269305.9 contig=17 transcript_biotype=protein_coding
291
- >c7riboseqorf56 kind=extra_orf taxon=9606 source=orfdata-catalog:2026-10-11.1 gene=ENSG00000169902 gene_name=TPST1 transcript=ENST00000304842.6 contig=7 transcript_biotype=protein_coding orf_type=uORF evidence=ribosome,mhc transcripts=18
292
- >c10riboseqorf115 kind=extra_orf taxon=9606 source=orfdata-catalog:2026-10-11.1 gene=ENSG00000099204 gene_name=ABLIM1 transcript=ENST00000369253.6 contig=10 transcript_biotype=protein_coding orf_type=intORF evidence=ribosome,mhc source_transcript=ENST00000277895 transcripts=10
305
+ >c7riboseqorf56 kind=extra_orf taxon=9606 source=orfdata-catalog:2026-10-11.1 gene=ENSG00000169902 gene_name=TPST1 transcript=ENST00000304842.6 contig=7 transcript_biotype=protein_coding orf_type=uORF evidence=ribosome,immunopeptidomics transcripts=18
306
+ >c10riboseqorf115 kind=extra_orf taxon=9606 source=orfdata-catalog:2026-10-11.1 gene=ENSG00000099204 gene_name=ABLIM1 transcript=ENST00000369253.6 contig=10 transcript_biotype=protein_coding orf_type=intORF evidence=ribosome,immunopeptidomics source_transcript=ENST00000277895 transcripts=10
293
307
  ```
294
308
 
295
309
  For extra ORFs, the accession is the source ORF ID, `transcript` is its host
296
310
  transcript in this genome, and `gene`, `gene_name` and `transcript_biotype`
297
311
  describe that transcript in this genome. `orf_type` is the source's ORF
298
312
  category, kept verbatim; see [ORF categories](reference.md#orf-categories).
299
- `evidence` lists the supporting evidence types; `mhc` includes HLA.
313
+ `evidence` lists the supporting evidence types.
300
314
  `transcripts` counts the encoding transcripts when there are several, and
301
315
  `source_transcript` names the source's transcript when the header's transcript
302
316
  is a different one, as for ABLIM1 above, whose source transcript is gone. See
@@ -319,7 +333,7 @@ options. Rules have their own options:
319
333
  ```sh
320
334
  orfdata proteome --species human --release 115 --min-ribo-seq-studies 2 --min-ms-peptides 1
321
335
  orfdata proteome --species human --release 115 --min-ribo-seq-studies 3 --min-ms-peptides 2 --either
322
- orfdata proteome --species human --release 115 --min-ms-peptides 1 --ms-methods shotgun,ms_unclassified
336
+ orfdata proteome --species human --release 115 --min-ms-peptides 1 --ms-methods proteomics,ms_unclassified
323
337
  ```
324
338
 
325
339
  Given both a Ribo-seq and an MS requirement, an ORF needs both unless
@@ -332,8 +346,8 @@ JSON summary of the layers, identity and excluded ORFs goes to standard error.
332
346
 
333
347
  ## Not yet included
334
348
 
335
- Mouse noncanonical ORFs come from OpenProt once you build that catalogue; see
336
- [Mouse ORFs from OpenProt](catalogs.md#mouse-orfs-from-openprot). Dog
349
+ Mouse noncanonical ORFs come from Chang et al.'s and Yang et al.'s Ribo-seq and
350
+ OpenProt's MS catalogues once you install them; see [Mouse](catalogs.md#mouse). Dog
337
351
  noncanonical ORFs, and translated endogenous retrovirus (ERV) ORFs without
338
352
  annotated transcripts, need new source data; see the
339
353
  [data roadmap](https://github.com/openvax/orfdata/issues/3). Products from
@@ -167,10 +167,12 @@ The host is one of possibly several transcripts that carry the same ORF; see
167
167
 
168
168
  ## Evidence
169
169
 
170
- Use `orf.evidence.has_evidence("ribosome")`, `"shotgun"` (protease-digest MS),
171
- `"mhc"` (including human HLA), or `"ms"` (any supporting MS observation).
172
- `"hla"` selects human HLA observations specifically. Source observations whose
173
- MS assay type is unspecified remain labelled `"ms_unclassified"`.
170
+ Use `orf.evidence.has_evidence("ribosome")` (or `"riboseq"`), `"proteomics"` (peptides from
171
+ digested cellular proteins), `"immunopeptidomics"` (peptides eluted from MHC
172
+ molecules; HLA in human), or `"ms"` (any supporting MS observation). Source
173
+ observations whose MS assay type is unspecified remain labelled
174
+ `"ms_unclassified"`. Catalogues from before 0.28.0 say `"shotgun"`, `"mhc"`
175
+ and `"hla"`; they load with the current names.
174
176
 
175
177
  ```python
176
178
  orf.evidence.has_evidence("ms", require_unique=True, require_reviewed=True)
@@ -302,17 +304,18 @@ another annotation release of the same species, strain and assembly is also
302
304
  accepted. ORFs on another assembly can be
303
305
  [lifted over](catalogs.md#every-assembly-of-a-species).
304
306
 
305
- `load_catalog(species="mouse")` returns a species' catalogue: the bundled one,
306
- or else the one downloaded or built through [`CatalogRegistry`](catalogs.md),
307
- such as the [OpenProt mouse catalogue](catalogs.md#mouse-orfs-from-openprot).
308
- `genome_build=` chooses between assemblies. It never downloads, and for a
307
+ `load_catalog(species="mouse")` returns a species' ORFs: the bundled
308
+ catalogue, or those downloaded or built through
309
+ [`CatalogRegistry`](catalogs.md), merged when there are several, as mouse's
310
+ [three](catalogs.md#mouse) are. `genome_build=` chooses the assembly. It never downloads, and for a
309
311
  species without a catalogue the error lists the catalogues that exist.
310
312
 
311
313
  `load_catalog(path)` reads a custom versioned JSON catalogue. Each catalogue is
312
314
  scoped to one species and assembly; each model records its NCBI taxon, scientific
313
315
  name, assembly, translation table and source. Human evidence is never transferred
314
- to a mouse ortholog. Mouse ORFs come from OpenProt, and their bindings are
315
- tested with real OpenProt rows on real Ensembl 106 transcripts.
316
+ to a mouse ortholog. Mouse ORFs come from OpenProt, Chang et al. and Yang et
317
+ al., and each importer is tested with real source rows on real Ensembl
318
+ transcripts.
316
319
 
317
320
  To build a catalogue, create `ORFModel` objects from source coordinates and
318
321
  sequences, attach source observations with `ORFRecord.from_model(model, evidence)`,
@@ -320,10 +323,9 @@ and construct `ORFCatalog(records, metadata)`. Its `to_dict()` produces the
320
323
  `orfdata.catalog.v1` JSON representation. Genomic coding blocks are 1-based,
321
324
  inclusive, sorted by genomic position, and include the terminal stop codon.
322
325
 
323
- [OpenProt](https://openprot.org) supplies the mouse catalogue through a pinned
324
- importer that checks every row's coordinates and protein; see
325
- [Mouse ORFs from OpenProt](catalogs.md#mouse-orfs-from-openprot). Its human
326
- and yeast files are not imported yet.
326
+ The mouse catalogues come from pinned importers that check every row's
327
+ coordinates and protein; see [Mouse](catalogs.md#mouse). OpenProt's human and
328
+ yeast files are not imported yet.
327
329
 
328
330
  ## Rebuild and verify
329
331