orfdata 0.32.0__tar.gz → 0.34.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 (278) hide show
  1. {orfdata-0.32.0/orfdata.egg-info → orfdata-0.34.0}/PKG-INFO +9 -4
  2. {orfdata-0.32.0 → orfdata-0.34.0}/README.md +8 -3
  3. orfdata-0.34.0/docs/viral.md +77 -0
  4. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/__init__.py +12 -1
  5. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/viral/NOTICE.md +11 -0
  6. orfdata-0.34.0/orfdata/data/viral/hpv16-refseq-CDS.json.gz +0 -0
  7. orfdata-0.34.0/orfdata/version.py +1 -0
  8. orfdata-0.34.0/orfdata/viral.py +242 -0
  9. {orfdata-0.32.0 → orfdata-0.34.0/orfdata.egg-info}/PKG-INFO +9 -4
  10. orfdata-0.34.0/tests/test_viral.py +199 -0
  11. {orfdata-0.32.0 → orfdata-0.34.0}/tools/build_hpv16_cds.py +8 -2
  12. orfdata-0.32.0/docs/viral.md +0 -45
  13. orfdata-0.32.0/orfdata/data/viral/hpv16-refseq-CDS.json.gz +0 -0
  14. orfdata-0.32.0/orfdata/version.py +0 -1
  15. orfdata-0.32.0/orfdata/viral.py +0 -111
  16. orfdata-0.32.0/tests/test_viral.py +0 -110
  17. {orfdata-0.32.0 → orfdata-0.34.0}/LICENSE +0 -0
  18. {orfdata-0.32.0 → orfdata-0.34.0}/MANIFEST.in +0 -0
  19. {orfdata-0.32.0 → orfdata-0.34.0}/deploy.sh +0 -0
  20. {orfdata-0.32.0 → orfdata-0.34.0}/docs/catalogs.md +0 -0
  21. {orfdata-0.32.0 → orfdata-0.34.0}/docs/copy-yeast.md +0 -0
  22. {orfdata-0.32.0 → orfdata-0.34.0}/docs/coverage.md +0 -0
  23. {orfdata-0.32.0 → orfdata-0.34.0}/docs/dog-peptides.md +0 -0
  24. {orfdata-0.32.0 → orfdata-0.34.0}/docs/examples.md +0 -0
  25. {orfdata-0.32.0 → orfdata-0.34.0}/docs/human-tissue.md +0 -0
  26. {orfdata-0.32.0 → orfdata-0.34.0}/docs/index.md +0 -0
  27. {orfdata-0.32.0 → orfdata-0.34.0}/docs/ingolia-yeast.md +0 -0
  28. {orfdata-0.32.0 → orfdata-0.34.0}/docs/measurements.md +0 -0
  29. {orfdata-0.32.0 → orfdata-0.34.0}/docs/pairing.md +0 -0
  30. {orfdata-0.32.0 → orfdata-0.34.0}/docs/pfizer-protein.md +0 -0
  31. {orfdata-0.32.0 → orfdata-0.34.0}/docs/pfizer-rna.md +0 -0
  32. {orfdata-0.32.0 → orfdata-0.34.0}/docs/proteome.md +0 -0
  33. {orfdata-0.32.0 → orfdata-0.34.0}/docs/reference.md +0 -0
  34. {orfdata-0.32.0 → orfdata-0.34.0}/docs/search-references.md +0 -0
  35. {orfdata-0.32.0 → orfdata-0.34.0}/docs/source-references.md +0 -0
  36. {orfdata-0.32.0 → orfdata-0.34.0}/docs/species.md +0 -0
  37. {orfdata-0.32.0 → orfdata-0.34.0}/docs/storage.md +0 -0
  38. {orfdata-0.32.0 → orfdata-0.34.0}/docs/stylesheets/docs.css +0 -0
  39. {orfdata-0.32.0 → orfdata-0.34.0}/docs.sh +0 -0
  40. {orfdata-0.32.0 → orfdata-0.34.0}/lint.sh +0 -0
  41. {orfdata-0.32.0 → orfdata-0.34.0}/mkdocs.yml +0 -0
  42. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/_pinned_genome.py +0 -0
  43. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/_structure.py +0 -0
  44. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/build.py +0 -0
  45. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/catalog.py +0 -0
  46. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/catalog_cli.py +0 -0
  47. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/catalog_manifest.py +0 -0
  48. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/catalogs.py +0 -0
  49. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/cli.py +0 -0
  50. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/catalogs.json +0 -0
  51. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/chains.json +0 -0
  52. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/datasets.json +0 -0
  53. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/genomes.json +0 -0
  54. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/ires/rfam-15.1-human-ires.json +0 -0
  55. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/orf-evidence/AUTHOR-LICENSE.txt +0 -0
  56. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/orf-evidence/NOTICE.txt +0 -0
  57. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/orf-evidence/catalog.json.gz +0 -0
  58. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/orf-evidence/manifest.json +0 -0
  59. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/uorf-evidence/AUTHOR-LICENSE.txt +0 -0
  60. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/uorf-evidence/NOTICE.txt +0 -0
  61. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/uorf-evidence/catalog.json.gz +0 -0
  62. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/uorf-evidence/manifest.json +0 -0
  63. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/dataset.py +0 -0
  64. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/dataset_cli.py +0 -0
  65. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/datasets.py +0 -0
  66. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/evidence.py +0 -0
  67. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/evidence_summary.py +0 -0
  68. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/genomes.py +0 -0
  69. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/genomes_cli.py +0 -0
  70. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/initiation_context.py +0 -0
  71. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/install.py +0 -0
  72. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/liftover.py +0 -0
  73. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/liftover_cli.py +0 -0
  74. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/measurements.py +0 -0
  75. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/model.py +0 -0
  76. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/pairing.py +0 -0
  77. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/proteome.py +0 -0
  78. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/proteome_cli.py +0 -0
  79. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/reference.py +0 -0
  80. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/reference_mapping.py +0 -0
  81. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/refseq.py +0 -0
  82. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/rna.py +0 -0
  83. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/search_reference.py +0 -0
  84. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sequence.py +0 -0
  85. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/__init__.py +0 -0
  86. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/copy.py +0 -0
  87. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/ingolia.py +0 -0
  88. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/kaabinejadian.py +0 -0
  89. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/ncorf_mammals.py +0 -0
  90. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/openprot.py +0 -0
  91. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/peptideatlas.py +0 -0
  92. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/pfizer.py +0 -0
  93. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/pfizer_rna.py +0 -0
  94. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/riborf.py +0 -0
  95. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/wang.py +0 -0
  96. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata.egg-info/SOURCES.txt +0 -0
  97. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata.egg-info/dependency_links.txt +0 -0
  98. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata.egg-info/entry_points.txt +0 -0
  99. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata.egg-info/requires.txt +0 -0
  100. {orfdata-0.32.0 → orfdata-0.34.0}/orfdata.egg-info/top_level.txt +0 -0
  101. {orfdata-0.32.0 → orfdata-0.34.0}/pyproject.toml +0 -0
  102. {orfdata-0.32.0 → orfdata-0.34.0}/setup.cfg +0 -0
  103. {orfdata-0.32.0 → orfdata-0.34.0}/test.sh +0 -0
  104. {orfdata-0.32.0 → orfdata-0.34.0}/tests/conftest.py +0 -0
  105. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/aggregate_evidence.json +0 -0
  106. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905474.soft +0 -0
  107. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905474_KL9_fpkm.txt.gz +0 -0
  108. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905476.soft +0 -0
  109. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905476_KL10_fpkm.txt.gz +0 -0
  110. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905478.soft +0 -0
  111. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905478_KL11_fpkm.txt.gz +0 -0
  112. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905479.soft +0 -0
  113. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905479_KL12_fpkm.txt.gz +0 -0
  114. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/NOTICE.md +0 -0
  115. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/expected.json +0 -0
  116. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/geo-series.soft +0 -0
  117. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/manifest.json +0 -0
  118. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/methods.pdf +0 -0
  119. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/paper.xml +0 -0
  120. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/pmc-metadata.json +0 -0
  121. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/qconcat.fasta +0 -0
  122. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/workbook.xlsx +0 -0
  123. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346111.metadata.txt +0 -0
  124. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346111.quant.txt.gz +0 -0
  125. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346114.metadata.txt +0 -0
  126. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346114.quant.txt.gz +0 -0
  127. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346115.metadata.txt +0 -0
  128. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346115.quant.txt.gz +0 -0
  129. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346116.metadata.txt +0 -0
  130. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346116.quant.txt.gz +0 -0
  131. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346117.metadata.txt +0 -0
  132. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346117.quant.txt.gz +0 -0
  133. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346118.metadata.txt +0 -0
  134. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346118.quant.txt.gz +0 -0
  135. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346120.metadata.txt +0 -0
  136. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346120.quant.txt.gz +0 -0
  137. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346122.metadata.txt +0 -0
  138. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346122.quant.txt.gz +0 -0
  139. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/NOTICE.md +0 -0
  140. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/expected.json +0 -0
  141. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/manifest.json +0 -0
  142. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/readMe.txt.gz +0 -0
  143. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/kaabinejadian/README.md +0 -0
  144. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/kaabinejadian/Results.zip +0 -0
  145. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/kaabinejadian/manifest.json +0 -0
  146. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/kaabinejadian/sdrf.tsv +0 -0
  147. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/README.md +0 -0
  148. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/S3.xlsx +0 -0
  149. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/ensembl107.cdna.fa.gz +0 -0
  150. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/ensembl107.gtf.gz +0 -0
  151. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/human-ensembl107.gtf.gz +0 -0
  152. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/human.bed +0 -0
  153. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/human.pep.fa +0 -0
  154. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/mouse.bed +0 -0
  155. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/mouse.pep.fa +0 -0
  156. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/openprot/README.md +0 -0
  157. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/openprot/ensembl106.cdna.fa.gz +0 -0
  158. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/openprot/ensembl106.gtf.gz +0 -0
  159. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/openprot/mouse-openprot-2_2-altprots+isoforms-min_2_pep-GRCm39.106.bed.zip +0 -0
  160. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/openprot/mouse-openprot-2_2-altprots+isoforms-min_2_pep-GRCm39.106.fasta.zip +0 -0
  161. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/openprot/mouse-openprot-2_2-altprots+isoforms-min_2_pep-GRCm39.106.tsv.zip +0 -0
  162. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/peptideatlas/README.md +0 -0
  163. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/peptideatlas/atlas_build.tsv.zip +0 -0
  164. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/peptideatlas/ensembl.pep.fa.gz +0 -0
  165. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/peptideatlas/manifest.json +0 -0
  166. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/NOTICE.md +0 -0
  167. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/dog/expected.json +0 -0
  168. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/dog/manifest.json +0 -0
  169. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/dog/protein.tsv +0 -0
  170. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/dog/search.fasta +0 -0
  171. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/human/expected.json +0 -0
  172. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/human/manifest.json +0 -0
  173. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/human/protein.tsv +0 -0
  174. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/human/search.fasta +0 -0
  175. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/mouse/expected.json +0 -0
  176. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/mouse/manifest.json +0 -0
  177. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/mouse/protein.tsv +0 -0
  178. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/mouse/search.fasta +0 -0
  179. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/GSE325522_family.soft.gz +0 -0
  180. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/GSE325523_family.soft.gz +0 -0
  181. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/GSE325525_family.soft.gz +0 -0
  182. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/NOTICE.md +0 -0
  183. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/counts.csv.gz +0 -0
  184. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/dog-annotation.gtf.gz +0 -0
  185. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/dog-expected.json +0 -0
  186. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/dog-manifest.json +0 -0
  187. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/mouse-annotation.gtf.gz +0 -0
  188. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/mouse-expected.json +0 -0
  189. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/mouse-manifest.json +0 -0
  190. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/samples.xlsx +0 -0
  191. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/README.md +0 -0
  192. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/canis_lupus_familiaris.json +0 -0
  193. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/context-keys-v0.4.json +0 -0
  194. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/ensembl115.json +0 -0
  195. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/homo_sapiens.json +0 -0
  196. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/mitochondrial.json +0 -0
  197. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/mus_musculus.json +0 -0
  198. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/saccharomyces_cerevisiae.json +0 -0
  199. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/uniprot_literature.json +0 -0
  200. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/regions/NOTICE.md +0 -0
  201. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/regions/ingolia.json +0 -0
  202. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/README.md +0 -0
  203. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/SD3.xlsx +0 -0
  204. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/ensembl107.cdna.fa.gz +0 -0
  205. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/ensembl107.gtf.gz +0 -0
  206. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/ensembl107.ncrna.fa.gz +0 -0
  207. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/human-ensembl105.cdna.fa.gz +0 -0
  208. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/human-ensembl105.gtf.gz +0 -0
  209. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/human-ensembl105.ncrna.fa.gz +0 -0
  210. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/worm-ensembl105.cdna.fa.gz +0 -0
  211. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/worm-ensembl105.gtf.gz +0 -0
  212. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/worm-ensembl105.ncrna.fa.gz +0 -0
  213. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/yeast-ensembl115.cdna.fa.gz +0 -0
  214. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/yeast-ensembl115.dna.fa.gz +0 -0
  215. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/yeast-ensembl115.gtf.gz +0 -0
  216. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/zebrafish-ensembl115.cdna.fa.gz +0 -0
  217. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/zebrafish-ensembl115.gtf.gz +0 -0
  218. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/zebrafish-ensembl115.ncrna.fa.gz +0 -0
  219. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/search_reference/NOTICE.md +0 -0
  220. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/search_reference/dog.fasta +0 -0
  221. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/search_reference/ensembl83-expected.json +0 -0
  222. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/search_reference/ensembl83-human.fasta.gz +0 -0
  223. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/search_reference/expected.json +0 -0
  224. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/README.md +0 -0
  225. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/generate.py +0 -0
  226. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v1.json +0 -0
  227. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v1.sqlite +0 -0
  228. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v2.json +0 -0
  229. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v2.sqlite +0 -0
  230. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v3.json +0 -0
  231. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v3.sqlite +0 -0
  232. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v4.json +0 -0
  233. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v4.sqlite +0 -0
  234. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/viral/NC_001526.4.gb.gz +0 -0
  235. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/NOTICE.md +0 -0
  236. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/annotation.gtf.gz +0 -0
  237. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/copies.zip +0 -0
  238. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/expected.json +0 -0
  239. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/manifest.json +0 -0
  240. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/protein.zip +0 -0
  241. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/rna.zip +0 -0
  242. {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/search.fasta.gz +0 -0
  243. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_catalog_registry.py +0 -0
  244. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_copy.py +0 -0
  245. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_cross_reference_pairing.py +0 -0
  246. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_dog_peptides.py +0 -0
  247. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_ensembl_search_reference.py +0 -0
  248. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_evidence_rules.py +0 -0
  249. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_evidence_summary.py +0 -0
  250. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_genetic_codes.py +0 -0
  251. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_genomes.py +0 -0
  252. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_ingolia.py +0 -0
  253. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_initiation_context.py +0 -0
  254. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_liftover.py +0 -0
  255. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_local_build_queries.py +0 -0
  256. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_measurements.py +0 -0
  257. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_merge_catalogs.py +0 -0
  258. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_more_species.py +0 -0
  259. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_ncorf_mammals.py +0 -0
  260. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_openprot.py +0 -0
  261. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_orf_cases.py +0 -0
  262. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_paired_selectors.py +0 -0
  263. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_pairing.py +0 -0
  264. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_pfizer.py +0 -0
  265. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_pfizer_rna.py +0 -0
  266. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_proteome.py +0 -0
  267. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_reference_context.py +0 -0
  268. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_reference_mapping.py +0 -0
  269. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_reference_orf.py +0 -0
  270. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_refseq.py +0 -0
  271. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_region_targets.py +0 -0
  272. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_riborf.py +0 -0
  273. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_search_reference.py +0 -0
  274. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_selectors.py +0 -0
  275. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_storage.py +0 -0
  276. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_uorf_catalog.py +0 -0
  277. {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_wang.py +0 -0
  278. {orfdata-0.32.0 → orfdata-0.34.0}/tools/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orfdata
3
- Version: 0.32.0
3
+ Version: 0.34.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
@@ -113,11 +113,16 @@ Human evidence is never transferred to another species. Viral proteomes can be a
113
113
  orfdata also provides [RNA, ribosome and protein measurements](https://openvax.github.io/orfdata/measurements/)
114
114
  for human, mouse, dog and yeast.
115
115
 
116
- `viral_orfs(reference_dna, contig="HPV16")` loads source-defined viral CDSs as
117
- existing RNA/ORF models, offline and qualified by exact reference sequence.
116
+ `viral_references(host="human", group="HPV", virus_type="HPV16")` finds
117
+ source-qualified `ViralReference` objects. Choose a stable ID with
118
+ `viral_reference("NC_001526.4")`, then use `.dna` and `.orfs` to load its
119
+ packaged bases and coding paths. The functional loaders remain available.
120
+ When annotating an existing alignment, `viral_orfs(reference_dna,
121
+ contig="HPV16")` checks its actual reference sequence before applying the same
122
+ models.
118
123
  The first [coding reference](https://openvax.github.io/orfdata/viral/) contains
119
124
  the nine RefSeq NC_001526.4 HPV16 CDSs, with native and GDC placements;
120
- `viral_references()` lists the available identities and coverage. Broader
125
+ the host association is distinct from the virus's own taxon. Broader
121
126
  imports remain in [the viral roadmap](https://github.com/openvax/orfdata/issues/91).
122
127
 
123
128
  ## Measurement datasets
@@ -81,11 +81,16 @@ Human evidence is never transferred to another species. Viral proteomes can be a
81
81
  orfdata also provides [RNA, ribosome and protein measurements](https://openvax.github.io/orfdata/measurements/)
82
82
  for human, mouse, dog and yeast.
83
83
 
84
- `viral_orfs(reference_dna, contig="HPV16")` loads source-defined viral CDSs as
85
- existing RNA/ORF models, offline and qualified by exact reference sequence.
84
+ `viral_references(host="human", group="HPV", virus_type="HPV16")` finds
85
+ source-qualified `ViralReference` objects. Choose a stable ID with
86
+ `viral_reference("NC_001526.4")`, then use `.dna` and `.orfs` to load its
87
+ packaged bases and coding paths. The functional loaders remain available.
88
+ When annotating an existing alignment, `viral_orfs(reference_dna,
89
+ contig="HPV16")` checks its actual reference sequence before applying the same
90
+ models.
86
91
  The first [coding reference](https://openvax.github.io/orfdata/viral/) contains
87
92
  the nine RefSeq NC_001526.4 HPV16 CDSs, with native and GDC placements;
88
- `viral_references()` lists the available identities and coverage. Broader
93
+ the host association is distinct from the virus's own taxon. Broader
89
94
  imports remain in [the viral roadmap](https://github.com/openvax/orfdata/issues/91).
90
95
 
91
96
  ## Measurement datasets
@@ -0,0 +1,77 @@
1
+ # Viral coding references
2
+
3
+ Browse the packaged viral references by host, convenience group and virus type,
4
+ then load their source-annotated coding paths without fetching the genome:
5
+
6
+ ```python
7
+ from orfdata import viral_orfs, viral_reference, viral_references
8
+
9
+ references = viral_references(host="human", group="HPV", virus_type="HPV16")
10
+ print([(r.id, r.coding_models) for r in references])
11
+ # [('NC_001526.4', 9), ('GRCh38.d1.vd1:HPV16', 9)]
12
+
13
+ ref = viral_reference("NC_001526.4") # choose the native RefSeq placement
14
+ reference_dna = ref.dna
15
+ for orf in ref.orfs:
16
+ print(orf.orf_id, orf.gene_name, orf.coding_blocks, orf.protein_sequence)
17
+ ```
18
+
19
+ The small bundled catalogue loads offline without PyEnsembl, Biopython or a
20
+ human genome. It supplies the complete DNA for the native RefSeq NC_001526.4
21
+ and GDC HPV16 placements; both map to the same nine source CDSs. The two DNA
22
+ strings differ by a verified circular rotation. `viral_reference_sequence(id)`
23
+ returns the exact forward FASTA bases, with T rather than U. A missing ID raises
24
+ `ValueError`. `viral_references()` returns immutable `ViralReference` data
25
+ classes; `.dna` and `.orfs` load only on access, so browsing does not copy
26
+ genome bases or construct ORF models for every result. Choose by reference ID,
27
+ not by result position: the native and GDC sequences have different coordinates.
28
+ Use `ref.to_dict()` when serializing reference metadata to JSON; it does not
29
+ load DNA or ORF models.
30
+
31
+ `host` accepts a known species name such as `"human"` or an NCBI taxon ID such
32
+ as `9606`. The released HPV16 reference objects have viral `taxon_id=333760`
33
+ and `host_taxon_ids=(9606,)`; these are different identities. Their documented
34
+ human host association is sourced to PaVE. `ref.group == "HPV"`
35
+ is a convenient selection label, not a formal taxonomic rank. The
36
+ `ref.virus_type == "HPV16"` label is the virus
37
+ type; ICTV places it in the species *Alphapapillomavirus 9*. Each reference also
38
+ retains the association and taxonomy source URLs. Host associations can cover
39
+ several host taxa as new references are curated; an unlisted host is unknown,
40
+ not proof that infection is impossible. NCBI Virus's isolation-host metadata is
41
+ not an exhaustive host-range list. `ref.host_taxon_ids` and `ref.host_source` have the
42
+ same meaning as in [ViralProteome](proteome.md#viral-proteomes).
43
+
44
+ When annotating an existing BAM, continue to bind against its **actual** full
45
+ alignment-reference DNA:
46
+
47
+ ```python
48
+ orfs = viral_orfs(alignment_reference_dna, contig="HPV16")
49
+ ```
50
+
51
+ This checks the sequence hash and its qualified coordinates. A contig name or
52
+ related strain cannot transfer CDS annotations to mismatching DNA. It raises
53
+ `ValueError` for an unavailable reference rather than returning an empty ORF
54
+ set. `viral_references()` reports coverage and source checksums, and
55
+ `viral_orfs()` returns the existing `SourceRNA`/`TranscriptORF` models.
56
+
57
+ Each model uses a `SourceRNA` containing only the available CDS, including
58
+ ordered splice blocks. Full transcript ends are not asserted. The existing
59
+ `TranscriptORF.at()` validates its source protein and coding boundaries.
60
+ These models have `orf_type="reference_CDS"`. Their internal kind `extra_orf`
61
+ describes a source-defined ORF outside a loaded PyEnsembl annotation, not a
62
+ claim that a RefSeq CDS is biologically noncanonical. No Ribo-seq or MS
63
+ support is inferred from the reference annotation.
64
+
65
+ The nine annotations are not an exhaustive HPV16 ORF catalogue. Other HPV
66
+ types/lineages, EBV/KSHV, CMV, hepatitis viruses including HDV, HTLV-1/HIV,
67
+ and polyomaviruses remain explicit coverage work in
68
+ [issues #91–98](https://github.com/openvax/orfdata/issues/91).
69
+
70
+ Isovar owns reconstructed sample RNA and read evidence. It can use these
71
+ coding paths to anchor a frame on observed sequence, preserving variants
72
+ and incomplete starts/stops. ORFdata does not assemble sample RNA, replace
73
+ missing bases, infer protein abundance or establish viral tumor causality.
74
+ RNA and coding-reference matches are not direct protein evidence.
75
+
76
+ Source attribution and rebuilding instructions are in
77
+ [`orfdata/data/viral/NOTICE.md`](https://github.com/openvax/orfdata/blob/main/orfdata/data/viral/NOTICE.md).
@@ -70,10 +70,21 @@ from .rna import IRES, ProteinProduct, RNAFeature, SourceRNA, products_from_unip
70
70
  from .search_reference import SearchMembership, SearchReference, SearchReferenceSpec, SearchSequence
71
71
  from .sequence import GeneticCode, genetic_code
72
72
  from .version import __version__
73
- from .viral import viral_orfs, viral_references
73
+ from .viral import (
74
+ ViralProduct,
75
+ ViralReference,
76
+ viral_orfs,
77
+ viral_reference,
78
+ viral_reference_sequence,
79
+ viral_references,
80
+ )
74
81
 
75
82
  __all__ = [
83
+ "ViralProduct",
84
+ "ViralReference",
76
85
  "viral_orfs",
86
+ "viral_reference",
87
+ "viral_reference_sequence",
77
88
  "viral_references",
78
89
  "__version__",
79
90
  "Proteome",
@@ -13,6 +13,17 @@ The catalogue contains nine source-annotated CDSs, including two joined paths.
13
13
  It does not claim all reported HPV16 ORFs or complete transcript models.
14
14
  RNA support does not establish translation or protein expression.
15
15
 
16
+ The released catalogue also contains the full forward reference bases for both
17
+ qualified placements. HPV16's documented human host is sourced from PaVE's
18
+ HPV16REF record (`/host="Human (Homo sapiens)"`):
19
+ https://pave.niaid.nih.gov/locus_viewer?feature_id=HPV16_E7&seq_id=HPV16REF .
20
+ This host association applies to HPV16 as a type, not to all papillomaviruses,
21
+ and does not claim an exhaustive host range. ICTV lists HPV16 in the species
22
+ *Alphapapillomavirus 9*:
23
+ https://ictv.global/report/chapter/papillomaviridae/taxonomy/papillomaviridae .
24
+ These are distinct from the RefSeq DNA/CDS source and the GDC coordinate
25
+ placement. Consulted 2026-10-16.
26
+
16
27
  Native DNA MD5: `08d2b3849496d12cc45fd4df713d5c2f`.
17
28
  GDC GRCh38.d1.vd1 HPV16 DNA MD5: `f2463721818c29998ef5ab917e6df74a`.
18
29
  GDC DNA is the source circle rotated by 864 bases. Both placements retain
@@ -0,0 +1 @@
1
+ __version__ = "0.34.0"
@@ -0,0 +1,242 @@
1
+ """Offline, sequence-qualified viral CDSs bound to the existing RNA/ORF models."""
2
+
3
+ import gzip
4
+ import hashlib
5
+ import json
6
+ from dataclasses import asdict, dataclass
7
+ from functools import cached_property, lru_cache
8
+ from importlib.resources import files
9
+
10
+ from .model import TranscriptORF
11
+ from .reference import ReferenceContext, species_taxon
12
+ from .rna import SourceRNA
13
+
14
+ _CATALOG_SHA256 = "aca0c72948d4cda896d14b32203981bce4759e0c70212c05dca6f3d0e16ed4b4"
15
+ _COMPLEMENT = str.maketrans("ACGT", "TGCA")
16
+
17
+
18
+ @dataclass(frozen=True)
19
+ class ViralProduct:
20
+ """One source-labelled protein product in a viral coding reference."""
21
+
22
+ protein_id: str
23
+ gene: str
24
+ product: str
25
+
26
+
27
+ @dataclass(frozen=True)
28
+ class ViralReference:
29
+ """One exact, bundled viral reference and its source-defined coding paths.
30
+
31
+ ``dna`` and ``orfs`` load only when accessed. Host associations describe
32
+ documented hosts, not an exhaustive host range.
33
+ """
34
+
35
+ id: str
36
+ species: str
37
+ taxon_id: int
38
+ host_taxon_ids: tuple[int, ...]
39
+ host_source: str
40
+ group: str
41
+ virus_type: str
42
+ ictv_species: str
43
+ taxonomy_source: str
44
+ length: int
45
+ sequence_md5: str
46
+ sequence_sha256: str
47
+ native_to_reference_rotation: int
48
+ source_accession: str
49
+ source_sha256: str
50
+ source_url: str
51
+ coding_models: int
52
+ products: tuple[ViralProduct, ...]
53
+ scope: str
54
+ catalogue_sha256: str
55
+
56
+ @cached_property
57
+ def dna(self):
58
+ """Complete, checksum-verified forward FASTA bases for this reference."""
59
+ return viral_reference_sequence(self.id)
60
+
61
+ @cached_property
62
+ def orfs(self):
63
+ """Source-defined CDS paths placed on this exact reference."""
64
+ return viral_orfs(reference_id=self.id)
65
+
66
+ def to_dict(self):
67
+ """Return serializable metadata without loading DNA or ORF models."""
68
+ row = asdict(self)
69
+ row["host_taxon_ids"] = list(self.host_taxon_ids)
70
+ row["products"] = list(row["products"])
71
+ row["virus"] = dict(group=row.pop("group"), type=row.pop("virus_type"),
72
+ ictv_species=row.pop("ictv_species"),
73
+ taxonomy_source=row.pop("taxonomy_source"))
74
+ row["source"] = dict(accession=row.pop("source_accession"),
75
+ sha256=row.pop("source_sha256"), url=row.pop("source_url"))
76
+ return row
77
+
78
+
79
+ @lru_cache(maxsize=1)
80
+ def _catalog():
81
+ raw = files("orfdata").joinpath("data/viral/hpv16-refseq-CDS.json.gz").read_bytes()
82
+ if hashlib.sha256(raw).hexdigest() != _CATALOG_SHA256:
83
+ raise ValueError("Bundled viral CDS catalogue checksum mismatch")
84
+ data = json.loads(gzip.decompress(raw))
85
+ if data["schema"] != "orfdata.viral_cds.v2":
86
+ raise ValueError("Unsupported viral CDS catalogue schema")
87
+ return data
88
+
89
+
90
+ def _reference(row, data):
91
+ virus = row["virus"]
92
+ source = row["source"]
93
+ return ViralReference(
94
+ id=row["id"], species=row["species"], taxon_id=row["taxon_id"],
95
+ host_taxon_ids=tuple(row["host_taxon_ids"]), host_source=row["host_source"],
96
+ group=virus["group"], virus_type=virus["type"],
97
+ ictv_species=virus["ictv_species"], taxonomy_source=virus["taxonomy_source"],
98
+ length=row["length"], sequence_md5=row["sequence_md5"],
99
+ sequence_sha256=row["sequence_sha256"],
100
+ native_to_reference_rotation=row["native_to_reference_rotation"],
101
+ source_accession=source["accession"], source_sha256=source["sha256"],
102
+ source_url=source["url"], coding_models=len(row["coding_blocks"]),
103
+ products=tuple(ViralProduct(cds["protein_id"], cds["gene"], cds["product"])
104
+ for cds in data["cds"]),
105
+ scope=data["scope"], catalogue_sha256=_CATALOG_SHA256)
106
+
107
+
108
+ def viral_references(*, host=None, group=None, virus_type=None):
109
+ """Find released viral references by documented host, group and type.
110
+
111
+ Parameters
112
+ ----------
113
+ host : str or int, optional
114
+ Known host name such as ``"human"``, or an NCBI host taxon ID. A host
115
+ association is source-attributed and is not a complete host range.
116
+ group : str, optional
117
+ Convenience group label, such as ``"HPV"``; not a taxonomy rank.
118
+ virus_type : str, optional
119
+ Named virus type, such as ``"HPV16"``; distinct from ICTV species.
120
+
121
+ Returns
122
+ -------
123
+ tuple of ViralReference
124
+ Exact sequence hashes, source/host pins, virus identity and coverage.
125
+ A listed reference is not a complete transcript or exhaustive ORF
126
+ catalogue. DNA and ORFs load only when their properties are accessed.
127
+ """
128
+ if host is None:
129
+ host_taxon_id = None
130
+ elif type(host) is int and host > 0:
131
+ host_taxon_id = host
132
+ elif isinstance(host, str) and species_taxon(host) is not None:
133
+ host_taxon_id = species_taxon(host)
134
+ else:
135
+ raise ValueError("host must be a known species name or positive NCBI taxon ID")
136
+ if any(value is not None and (not isinstance(value, str) or not value)
137
+ for value in (group, virus_type)):
138
+ raise ValueError("group and virus_type must be nonempty names")
139
+ data = _catalog()
140
+ return tuple(_reference(row, data)
141
+ for row in data["references"]
142
+ if (host_taxon_id is None or host_taxon_id in row["host_taxon_ids"])
143
+ and (group is None or row["virus"]["group"].casefold() == group.casefold())
144
+ and (virus_type is None or row["virus"]["type"].casefold() == virus_type.casefold()))
145
+
146
+
147
+ def viral_reference(reference_id):
148
+ """Return one exact viral reference by stable ID, without positional selection."""
149
+ data = _catalog()
150
+ matches = [row for row in data["references"] if row["id"] == reference_id]
151
+ if len(matches) != 1:
152
+ raise ValueError("No unique released viral reference ID matches this name")
153
+ return _reference(matches[0], data)
154
+
155
+
156
+ def viral_reference_sequence(reference_id):
157
+ """Return bundled, checksum-verified reference bases for one exact ID.
158
+
159
+ The sequence uses the forward FASTA alphabet (T rather than U) and may
160
+ represent a virus whose biological genome is RNA. No network is accessed.
161
+ """
162
+ matches = [row for row in _catalog()["references"] if row["id"] == reference_id]
163
+ if len(matches) != 1:
164
+ raise ValueError("No unique released viral reference ID matches this name")
165
+ row = matches[0]
166
+ sequence = row["reference_sequence"]
167
+ if (len(sequence) != row["length"] or
168
+ hashlib.sha256(sequence.encode("ascii")).hexdigest() != row["sequence_sha256"]):
169
+ raise ValueError("Bundled viral reference sequence checksum mismatch")
170
+ return sequence
171
+
172
+
173
+ def viral_orfs(reference_sequence=None, *, reference_id=None, contig=None):
174
+ """Load source-defined CDSs for one exactly matching viral DNA reference.
175
+
176
+ Parameters
177
+ ----------
178
+ reference_sequence : str, optional
179
+ Complete forward reference DNA from an alignment. This checks actual
180
+ sequence identity rather than transferring annotation by contig name.
181
+ reference_id : str, optional
182
+ Bundled reference ID from ``viral_references()``. Use this to load the
183
+ reference ORFs without obtaining DNA separately. Supply exactly one
184
+ of ``reference_sequence`` or ``reference_id``.
185
+ contig : str, optional
186
+ The caller's name for this exact DNA in an alignment reference. The
187
+ original versioned source identity remains on every ORF's context.
188
+
189
+ Returns
190
+ -------
191
+ tuple of TranscriptORF
192
+ Source CDS fragments represented with SourceRNA and TranscriptORF.at.
193
+ Their genomic blocks are 1-based inclusive and their RNA sequence is
194
+ only the available CDS. Full transcript boundaries are not asserted.
195
+ No ribosome, peptide or sample protein-expression evidence is inferred.
196
+
197
+ Raises
198
+ ------
199
+ ValueError
200
+ No released coding reference matches, or a source model fails to bind
201
+ and translate exactly. Discovery is available through viral_references.
202
+ """
203
+ if (reference_sequence is None) == (reference_id is None):
204
+ raise ValueError("Provide exactly one of reference_sequence or reference_id")
205
+ sequence = (viral_reference_sequence(reference_id) if reference_id is not None
206
+ else str(reference_sequence).upper())
207
+ fingerprint = hashlib.sha256(sequence.encode("ascii")).hexdigest()
208
+ data = _catalog()
209
+ matches = [row for row in data["references"] if row["sequence_sha256"] == fingerprint
210
+ and row["length"] == len(sequence)]
211
+ if len(matches) != 1:
212
+ raise ValueError("No unique released viral coding reference matches this DNA; "
213
+ "inspect viral_references() for available sequence identities")
214
+ reference = matches[0]
215
+ source = reference["source"]
216
+ label = contig if contig is not None else reference["id"]
217
+ if not isinstance(label, str) or not label:
218
+ raise ValueError("contig must be a nonempty name")
219
+ context = ReferenceContext(
220
+ taxon_id=reference["taxon_id"], species=reference["species"],
221
+ genome_build=reference["id"], annotation_name="NCBI RefSeq",
222
+ annotation_version=source["accession"], sequence_sha256=fingerprint,
223
+ source_sha256=source["sha256"])
224
+ result = []
225
+ for cds in data["cds"]:
226
+ protein_id = cds["protein_id"]
227
+ blocks = reference["coding_blocks"][protein_id]
228
+ coding = "".join(sequence[a - 1:b] if cds["strand"] == "+" else
229
+ sequence[a - 1:b].translate(_COMPLEMENT)[::-1] for a, b in blocks)
230
+ if cds["phase"] != 0:
231
+ raise ValueError(f"Unsupported partial source codon: {protein_id}")
232
+ rna = SourceRNA(
233
+ id=f"{source['accession']}:CDS:{protein_id}", sequence=coding, reference=context,
234
+ source=f"NCBI RefSeq {source['accession']}", contig=label, strand=cds["strand"],
235
+ exons=blocks, gene_name=cds["gene"], biotype="source_CDS_fragment")
236
+ orf = TranscriptORF.at(rna, 0, orf_id=protein_id, source=rna.source,
237
+ protein=cds["protein_sequence"], translation_table=cds["translation_table"],
238
+ orf_type="reference_CDS", start_complete=cds["start_complete"])
239
+ if orf.coding_sequence != coding or orf.stop_complete != cds["stop_complete"]:
240
+ raise ValueError(f"Source coding boundaries do not translate exactly: {protein_id}")
241
+ result.append(orf)
242
+ return tuple(result)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orfdata
3
- Version: 0.32.0
3
+ Version: 0.34.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
@@ -113,11 +113,16 @@ Human evidence is never transferred to another species. Viral proteomes can be a
113
113
  orfdata also provides [RNA, ribosome and protein measurements](https://openvax.github.io/orfdata/measurements/)
114
114
  for human, mouse, dog and yeast.
115
115
 
116
- `viral_orfs(reference_dna, contig="HPV16")` loads source-defined viral CDSs as
117
- existing RNA/ORF models, offline and qualified by exact reference sequence.
116
+ `viral_references(host="human", group="HPV", virus_type="HPV16")` finds
117
+ source-qualified `ViralReference` objects. Choose a stable ID with
118
+ `viral_reference("NC_001526.4")`, then use `.dna` and `.orfs` to load its
119
+ packaged bases and coding paths. The functional loaders remain available.
120
+ When annotating an existing alignment, `viral_orfs(reference_dna,
121
+ contig="HPV16")` checks its actual reference sequence before applying the same
122
+ models.
118
123
  The first [coding reference](https://openvax.github.io/orfdata/viral/) contains
119
124
  the nine RefSeq NC_001526.4 HPV16 CDSs, with native and GDC placements;
120
- `viral_references()` lists the available identities and coverage. Broader
125
+ the host association is distinct from the virus's own taxon. Broader
121
126
  imports remain in [the viral roadmap](https://github.com/openvax/orfdata/issues/91).
122
127
 
123
128
  ## Measurement datasets
@@ -0,0 +1,199 @@
1
+ """Qualify real, versioned viral CDS paths independently of sample assembly."""
2
+
3
+ import gzip
4
+ import hashlib
5
+ import io
6
+ import json
7
+ from copy import deepcopy
8
+ from dataclasses import FrozenInstanceError
9
+ from importlib.resources import files
10
+ from pathlib import Path
11
+
12
+ import pytest
13
+ from Bio import SeqIO
14
+
15
+ import orfdata.viral as viral_module
16
+ from orfdata import (
17
+ SourceRNA,
18
+ ViralReference,
19
+ viral_orfs,
20
+ viral_reference,
21
+ viral_reference_sequence,
22
+ viral_references,
23
+ )
24
+ from tools.build_hpv16_cds import build
25
+
26
+ FIXTURE = Path(__file__).parent / "data/viral/NC_001526.4.gb.gz"
27
+ EXPECTED = {
28
+ "YP_009268708.1": 92, "NP_041327.2": 649, "NP_041328.1": 365,
29
+ "NP_041330.2": 83, "NP_041331.2": 473, "NP_041332.2": 505,
30
+ "NP_041325.1": 158, "YP_009268707.1": 50, "NP_041326.1": 98,
31
+ }
32
+
33
+
34
+ @pytest.fixture
35
+ def source():
36
+ raw = gzip.decompress(FIXTURE.read_bytes())
37
+ assert hashlib.sha256(raw).hexdigest() == "282be442f226cc809fefbda616ac136b8d20dfde23fad09558f3f653a3de96a4"
38
+ return raw, SeqIO.read(io.StringIO(raw.decode()), "genbank")
39
+
40
+
41
+ def test_catalogue_rebuilds_from_the_pinned_public_annotation(source):
42
+ raw, _ = source
43
+ packaged = json.loads(gzip.decompress(files("orfdata").joinpath(
44
+ "data/viral/hpv16-refseq-CDS.json.gz").read_bytes()))
45
+ assert build(raw) == packaged
46
+ assert len(packaged["cds"]) == 9
47
+
48
+
49
+ def test_native_source_paths_match_all_nine_source_proteins(source):
50
+ _, record = source
51
+ orfs = viral_orfs(str(record.seq))
52
+ definitions = {f.qualifiers["protein_id"][0]: f for f in record.features if f.type == "CDS"}
53
+ assert {orf.orf_id: len(orf.protein_sequence) for orf in orfs} == EXPECTED
54
+ for orf in orfs:
55
+ feature = definitions[orf.orf_id]
56
+ assert isinstance(orf.transcript, SourceRNA)
57
+ assert orf.transcript.biotype == "source_CDS_fragment"
58
+ assert orf.transcript.genome is None
59
+ assert orf.protein_sequence == feature.qualifiers["translation"][0]
60
+ assert orf.coding_sequence == str(feature.extract(record.seq))
61
+ assert orf.start_complete and orf.stop_complete
62
+ assert orf.context.annotation_version == "NC_001526.4"
63
+ assert orf.context.taxon_id == 333760
64
+ assert not orf.evidence.has_evidence("ms")
65
+ assert not orf.evidence.has_evidence("ribosome")
66
+
67
+
68
+ def test_gdc_rotation_is_exact_and_retains_spliced_coding_positions(source):
69
+ _, record = source
70
+ native = str(record.seq)
71
+ gdc = native[-864:] + native[:-864]
72
+ assert hashlib.md5(gdc.encode()).hexdigest() == "f2463721818c29998ef5ab917e6df74a"
73
+ orfs = {orf.orf_id: orf for orf in viral_orfs(gdc, contig="HPV16")}
74
+ assert orfs["YP_009268708.1"].coding_blocks == ((865, 880), (3358, 3620))
75
+ assert orfs["YP_009268707.1"].coding_blocks == ((83, 226), (409, 417))
76
+ assert orfs["NP_041326.1"].coding_blocks == ((562, 858),)
77
+ for orf in orfs.values():
78
+ assert orf.transcript.contig == "HPV16"
79
+ assert orf.context.genome_build == "GRCh38.d1.vd1:HPV16"
80
+ assert orf.protein_sequence == next(o.protein_sequence for o in viral_orfs(native)
81
+ if o.orf_id == orf.orf_id)
82
+
83
+
84
+ def test_mutated_same_name_reference_and_partial_dna_are_not_qualified(source):
85
+ _, record = source
86
+ native = str(record.seq)
87
+ changed = ("A" if native[0] != "A" else "C") + native[1:]
88
+ for sequence in (changed, native[1:], native[::-1]):
89
+ with pytest.raises(ValueError, match="No unique released"):
90
+ viral_orfs(sequence, contig="HPV16")
91
+
92
+
93
+ def test_discovery_is_offline_and_reference_objects_are_immutable(source, monkeypatch):
94
+ _, record = source
95
+ references = viral_references()
96
+ assert all(isinstance(ref, ViralReference) for ref in references)
97
+ assert {ref.id for ref in references} == {"NC_001526.4", "GRCh38.d1.vd1:HPV16"}
98
+ assert all(ref.coding_models == 9 for ref in references)
99
+ assert all(ref.catalogue_sha256 and ref.source_sha256 for ref in references)
100
+ native = viral_reference("NC_001526.4")
101
+ assert native == next(ref for ref in references if ref.id == native.id)
102
+ with pytest.raises(FrozenInstanceError):
103
+ native.source_accession = "changed"
104
+ with pytest.raises(AttributeError):
105
+ native.host_taxon_ids.clear()
106
+ assert viral_reference("NC_001526.4").source_accession == "NC_001526.4"
107
+ assert native.host_taxon_ids == (9606,)
108
+ payload = native.to_dict()
109
+ assert payload["virus"]["type"] == "HPV16"
110
+ assert payload["source"]["accession"] == "NC_001526.4"
111
+ assert payload["host_taxon_ids"] == [9606]
112
+ assert len(payload["products"]) == 9
113
+ assert "dna" not in payload and "orfs" not in payload
114
+ json.dumps(payload)
115
+ payload["host_taxon_ids"].clear()
116
+ assert native.host_taxon_ids == (9606,)
117
+ with monkeypatch.context() as patch:
118
+ patch.setattr(viral_module, "viral_orfs", lambda **kwargs: 1 / 0)
119
+ patch.setattr(viral_module, "viral_reference_sequence", lambda reference_id: 1 / 0)
120
+ assert viral_references(host="human") == references
121
+ assert viral_orfs(str(record.seq))[0].context.annotation_version == "NC_001526.4"
122
+
123
+
124
+ def test_host_group_and_type_select_exact_references_with_distinct_taxa():
125
+ references = viral_references(host="human", group="HPV", virus_type="HPV16")
126
+ assert {ref.id for ref in references} == {"NC_001526.4", "GRCh38.d1.vd1:HPV16"}
127
+ assert viral_references(host=9606, group="hpv", virus_type="hpv16") == references
128
+ assert viral_references(host="mouse") == viral_references(host=10090) == ()
129
+ assert viral_references(host="human", virus_type="HPV18") == ()
130
+ for ref in references:
131
+ assert ref.taxon_id == 333760 and ref.host_taxon_ids == (9606,)
132
+ assert "PaVE HPV16REF" in ref.host_source
133
+ assert ref.ictv_species == "Alphapapillomavirus 9"
134
+ assert ref.group == "HPV" and ref.virus_type == "HPV16"
135
+ assert ref.taxonomy_source.startswith("https://ictv.global/")
136
+ for invalid in ("not_a_host", 0, True):
137
+ with pytest.raises(ValueError, match="host"):
138
+ viral_references(host=invalid)
139
+
140
+
141
+ def test_explicit_multiple_host_associations_can_select_one_reference_from_each_host(monkeypatch):
142
+ # Synthetic metadata checks selection only; it makes no HPV16 mouse-host claim.
143
+ catalog = deepcopy(viral_module._catalog())
144
+ catalog["references"][0]["host_taxon_ids"].append(10090)
145
+ catalog["references"][0]["host_source"] = "synthetic multiple-host fixture"
146
+ monkeypatch.setattr(viral_module, "_catalog", lambda: catalog)
147
+ assert {ref.id for ref in viral_references(host="human")} == {
148
+ "NC_001526.4", "GRCh38.d1.vd1:HPV16"}
149
+ mouse, = viral_references(host="mouse", virus_type="HPV16")
150
+ assert mouse.id == "NC_001526.4" and mouse.taxon_id == 333760
151
+
152
+
153
+ def test_bundled_reference_sequences_and_named_orfs_match_both_source_placements(source):
154
+ _, record = source
155
+ native = str(record.seq)
156
+ gdc = native[-864:] + native[:-864]
157
+ for reference_id, expected in (("NC_001526.4", native),
158
+ ("GRCh38.d1.vd1:HPV16", gdc)):
159
+ ref = viral_reference(reference_id)
160
+ sequence = ref.dna
161
+ assert sequence == expected
162
+ assert ref.dna is sequence
163
+ assert sequence == viral_reference_sequence(reference_id)
164
+ assert hashlib.sha256(sequence.encode()).hexdigest() == ref.sequence_sha256
165
+ assert {orf.orf_id for orf in ref.orfs} == {product.protein_id for product in ref.products}
166
+ assert ref.orfs is ref.orfs
167
+ assert {orf.transcript.contig for orf in ref.orfs} == {reference_id}
168
+ by_name = viral_orfs(reference_id=reference_id, contig="selected")
169
+ by_dna = viral_orfs(sequence, contig="selected")
170
+ assert [(o.orf_id, o.coding_blocks, o.protein_sequence) for o in by_name] == [
171
+ (o.orf_id, o.coding_blocks, o.protein_sequence) for o in by_dna]
172
+ assert {o.transcript.contig for o in by_name} == {"selected"}
173
+ with pytest.raises(ValueError, match="reference ID"):
174
+ viral_reference_sequence("unknown")
175
+ with pytest.raises(ValueError, match="reference ID"):
176
+ viral_reference("unknown")
177
+ with pytest.raises(ValueError, match="exactly one"):
178
+ viral_orfs()
179
+ with pytest.raises(ValueError, match="exactly one"):
180
+ viral_orfs(native, reference_id="NC_001526.4")
181
+
182
+
183
+ def test_corrupt_packaged_catalogue_fails_before_returning_models(monkeypatch):
184
+ import orfdata.viral as module
185
+
186
+ class CorruptResource:
187
+ def joinpath(self, path):
188
+ return self
189
+
190
+ def read_bytes(self):
191
+ return b"corrupt catalogue"
192
+
193
+ module._catalog.cache_clear()
194
+ try:
195
+ monkeypatch.setattr(module, "files", lambda name: CorruptResource())
196
+ with pytest.raises(ValueError, match="checksum mismatch"):
197
+ viral_references()
198
+ finally:
199
+ module._catalog.cache_clear()