orfdata 0.42.2__tar.gz → 0.42.4__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 (403) hide show
  1. {orfdata-0.42.2 → orfdata-0.42.4}/MANIFEST.in +1 -0
  2. {orfdata-0.42.2/orfdata.egg-info → orfdata-0.42.4}/PKG-INFO +1 -1
  3. {orfdata-0.42.2 → orfdata-0.42.4}/docs/catalogs.md +58 -61
  4. {orfdata-0.42.2 → orfdata-0.42.4}/docs/coverage.md +4 -3
  5. {orfdata-0.42.2 → orfdata-0.42.4}/docs/dog-data-sources.md +4 -2
  6. orfdata-0.42.4/docs/mammary-stroma.md +104 -0
  7. {orfdata-0.42.2 → orfdata-0.42.4}/docs/pairing.md +6 -1
  8. {orfdata-0.42.2 → orfdata-0.42.4}/mkdocs.yml +1 -0
  9. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/catalog.py +48 -7
  10. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/catalog_manifest.py +24 -1
  11. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/catalogs.py +9 -3
  12. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/cli.py +2 -2
  13. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/catalogs.json +146 -1
  14. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/datasets.json +255 -0
  15. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/liftover.py +5 -1
  16. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/pairing.py +1 -1
  17. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/proteome.py +3 -0
  18. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/__init__.py +4 -0
  19. orfdata-0.42.4/orfdata/sources/mammary_stroma.py +496 -0
  20. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/riborf.py +10 -2
  21. orfdata-0.42.4/orfdata/sources/riborf_native.py +430 -0
  22. orfdata-0.42.4/orfdata/version.py +1 -0
  23. {orfdata-0.42.2 → orfdata-0.42.4/orfdata.egg-info}/PKG-INFO +1 -1
  24. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata.egg-info/SOURCES.txt +18 -1
  25. orfdata-0.42.4/tests/data/mammary_stroma/NOTICE.md +34 -0
  26. orfdata-0.42.4/tests/data/mammary_stroma/geo.soft.gz +0 -0
  27. orfdata-0.42.4/tests/data/mammary_stroma/manifest.json +238 -0
  28. orfdata-0.42.4/tests/data/mammary_stroma/paper.xml +2 -0
  29. orfdata-0.42.4/tests/data/mammary_stroma/peptides.txt +5 -0
  30. orfdata-0.42.4/tests/data/mammary_stroma/project.json +1 -0
  31. orfdata-0.42.4/tests/data/mammary_stroma/proteinGroups.txt +9 -0
  32. orfdata-0.42.4/tests/data/mammary_stroma/rna.csv.gz +0 -0
  33. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/README.md +19 -17
  34. orfdata-0.42.4/tests/data/riborf/gencodeM25.gtf.gz +0 -0
  35. orfdata-0.42.4/tests/data/riborf/gencodeM25.rna.fa.gz +0 -0
  36. orfdata-0.42.4/tests/data/riborf/v3-manifest.json +131 -0
  37. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_catalog_registry.py +1 -0
  38. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_data_resources.py +1 -1
  39. orfdata-0.42.4/tests/test_mammary_stroma.py +213 -0
  40. orfdata-0.42.4/tests/test_riborf.py +489 -0
  41. orfdata-0.42.4/tools/verify_mammary_stroma.py +88 -0
  42. orfdata-0.42.4/tools/verify_riborf_native.py +161 -0
  43. orfdata-0.42.2/orfdata/version.py +0 -1
  44. orfdata-0.42.2/tests/test_riborf.py +0 -135
  45. {orfdata-0.42.2 → orfdata-0.42.4}/LICENSE +0 -0
  46. {orfdata-0.42.2 → orfdata-0.42.4}/README.md +0 -0
  47. {orfdata-0.42.2 → orfdata-0.42.4}/deploy.sh +0 -0
  48. {orfdata-0.42.2 → orfdata-0.42.4}/docs/copy-yeast.md +0 -0
  49. {orfdata-0.42.2 → orfdata-0.42.4}/docs/dog-peptides.md +0 -0
  50. {orfdata-0.42.2 → orfdata-0.42.4}/docs/downloads.md +0 -0
  51. {orfdata-0.42.2 → orfdata-0.42.4}/docs/downstream.md +0 -0
  52. {orfdata-0.42.2 → orfdata-0.42.4}/docs/examples.md +0 -0
  53. {orfdata-0.42.2 → orfdata-0.42.4}/docs/human-tissue.md +0 -0
  54. {orfdata-0.42.2 → orfdata-0.42.4}/docs/index.md +0 -0
  55. {orfdata-0.42.2 → orfdata-0.42.4}/docs/ingolia-yeast.md +0 -0
  56. {orfdata-0.42.2 → orfdata-0.42.4}/docs/measurements.md +0 -0
  57. {orfdata-0.42.2 → orfdata-0.42.4}/docs/pfizer-peptides.md +0 -0
  58. {orfdata-0.42.2 → orfdata-0.42.4}/docs/pfizer-protein.md +0 -0
  59. {orfdata-0.42.2 → orfdata-0.42.4}/docs/pfizer-rna.md +0 -0
  60. {orfdata-0.42.2 → orfdata-0.42.4}/docs/proteome.md +0 -0
  61. {orfdata-0.42.2 → orfdata-0.42.4}/docs/reference.md +0 -0
  62. {orfdata-0.42.2 → orfdata-0.42.4}/docs/search-references.md +0 -0
  63. {orfdata-0.42.2 → orfdata-0.42.4}/docs/source-references.md +0 -0
  64. {orfdata-0.42.2 → orfdata-0.42.4}/docs/species.md +0 -0
  65. {orfdata-0.42.2 → orfdata-0.42.4}/docs/storage.md +0 -0
  66. {orfdata-0.42.2 → orfdata-0.42.4}/docs/stylesheets/docs.css +0 -0
  67. {orfdata-0.42.2 → orfdata-0.42.4}/docs/viral.md +0 -0
  68. {orfdata-0.42.2 → orfdata-0.42.4}/docs.sh +0 -0
  69. {orfdata-0.42.2 → orfdata-0.42.4}/lint.sh +0 -0
  70. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/__init__.py +0 -0
  71. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/_pinned_genome.py +0 -0
  72. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/_structure.py +0 -0
  73. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/artifact_archives.py +0 -0
  74. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/build.py +0 -0
  75. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/catalog_cli.py +0 -0
  76. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/cli_output.py +0 -0
  77. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/chains.json +0 -0
  78. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/genomes.json +0 -0
  79. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/ires/rfam-15.1-human-ires.json +0 -0
  80. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/orf-evidence/AUTHOR-LICENSE.txt +0 -0
  81. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/orf-evidence/NOTICE.txt +0 -0
  82. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/orf-evidence/catalog.json.gz +0 -0
  83. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/orf-evidence/manifest.json +0 -0
  84. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/uorf-evidence/AUTHOR-LICENSE.txt +0 -0
  85. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/uorf-evidence/NOTICE.txt +0 -0
  86. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/uorf-evidence/catalog.json.gz +0 -0
  87. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/uorf-evidence/manifest.json +0 -0
  88. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/viral/NOTICE.md +0 -0
  89. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/viral/gdc-grch38-d1-vd1-coverage.tsv +0 -0
  90. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/viral/gdc-grch38-d1-vd1-genbank.tsv +0 -0
  91. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/viral/gdc-grch38-d1-vd1-pave.tsv +0 -0
  92. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/viral/hpv16-refseq-CDS.json.gz +0 -0
  93. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data/viral/subsets.yaml +0 -0
  94. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/data_resources.py +0 -0
  95. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/dataset.py +0 -0
  96. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/dataset_cli.py +0 -0
  97. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/datasets.py +0 -0
  98. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/download_cli.py +0 -0
  99. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/downloads.py +0 -0
  100. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/evidence.py +0 -0
  101. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/evidence_summary.py +0 -0
  102. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/fasta.py +0 -0
  103. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/genbank.py +0 -0
  104. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/genomes.py +0 -0
  105. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/genomes_cli.py +0 -0
  106. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/gtf.py +0 -0
  107. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/initiation_context.py +0 -0
  108. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/install.py +0 -0
  109. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/liftover_cli.py +0 -0
  110. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/measurements.py +0 -0
  111. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/model.py +0 -0
  112. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/net.py +0 -0
  113. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/numeric_vector.py +0 -0
  114. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/proteome_cli.py +0 -0
  115. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/record_sources.py +0 -0
  116. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/reference.py +0 -0
  117. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/reference_ledger.py +0 -0
  118. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/reference_mapping.py +0 -0
  119. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/reference_table.py +0 -0
  120. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/refseq.py +0 -0
  121. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/rna.py +0 -0
  122. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/search_reference.py +0 -0
  123. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sequence.py +0 -0
  124. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/copy.py +0 -0
  125. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/ingolia.py +0 -0
  126. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/kaabinejadian.py +0 -0
  127. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/ncorf_mammals.py +0 -0
  128. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/openprot.py +0 -0
  129. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/peptideatlas.py +0 -0
  130. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/pfizer.py +0 -0
  131. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/pfizer_attribution.py +0 -0
  132. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/pfizer_dataset.py +0 -0
  133. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/pfizer_definitions.py +0 -0
  134. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/pfizer_evidence.py +0 -0
  135. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/pfizer_lineage.py +0 -0
  136. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/pfizer_native.py +0 -0
  137. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/pfizer_queries.py +0 -0
  138. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/pfizer_rna.py +0 -0
  139. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/pfizer_vendor.py +0 -0
  140. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/sources/wang.py +0 -0
  141. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/viral.py +0 -0
  142. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/viral_annotation.py +0 -0
  143. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/viral_cli.py +0 -0
  144. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/viral_coverage.py +0 -0
  145. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/viral_panel.py +0 -0
  146. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/viral_registry.py +0 -0
  147. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata/viral_subsets.py +0 -0
  148. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata.egg-info/dependency_links.txt +0 -0
  149. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata.egg-info/entry_points.txt +0 -0
  150. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata.egg-info/requires.txt +0 -0
  151. {orfdata-0.42.2 → orfdata-0.42.4}/orfdata.egg-info/top_level.txt +0 -0
  152. {orfdata-0.42.2 → orfdata-0.42.4}/pyproject.toml +0 -0
  153. {orfdata-0.42.2 → orfdata-0.42.4}/setup.cfg +0 -0
  154. {orfdata-0.42.2 → orfdata-0.42.4}/test.sh +0 -0
  155. {orfdata-0.42.2 → orfdata-0.42.4}/tests/conftest.py +0 -0
  156. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/aggregate_evidence.json +0 -0
  157. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/GSM1905474.soft +0 -0
  158. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/GSM1905474_KL9_fpkm.txt.gz +0 -0
  159. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/GSM1905476.soft +0 -0
  160. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/GSM1905476_KL10_fpkm.txt.gz +0 -0
  161. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/GSM1905478.soft +0 -0
  162. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/GSM1905478_KL11_fpkm.txt.gz +0 -0
  163. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/GSM1905479.soft +0 -0
  164. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/GSM1905479_KL12_fpkm.txt.gz +0 -0
  165. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/NOTICE.md +0 -0
  166. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/expected.json +0 -0
  167. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/geo-series.soft +0 -0
  168. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/manifest.json +0 -0
  169. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/methods.pdf +0 -0
  170. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/paper.xml +0 -0
  171. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/pmc-metadata.json +0 -0
  172. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/qconcat.fasta +0 -0
  173. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/copy/workbook.xlsx +0 -0
  174. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346111.metadata.txt +0 -0
  175. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346111.quant.txt.gz +0 -0
  176. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346114.metadata.txt +0 -0
  177. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346114.quant.txt.gz +0 -0
  178. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346115.metadata.txt +0 -0
  179. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346115.quant.txt.gz +0 -0
  180. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346116.metadata.txt +0 -0
  181. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346116.quant.txt.gz +0 -0
  182. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346117.metadata.txt +0 -0
  183. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346117.quant.txt.gz +0 -0
  184. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346118.metadata.txt +0 -0
  185. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346118.quant.txt.gz +0 -0
  186. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346120.metadata.txt +0 -0
  187. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346120.quant.txt.gz +0 -0
  188. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346122.metadata.txt +0 -0
  189. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/GSM346122.quant.txt.gz +0 -0
  190. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/NOTICE.md +0 -0
  191. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/expected.json +0 -0
  192. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/manifest.json +0 -0
  193. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ingolia/readMe.txt.gz +0 -0
  194. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/kaabinejadian/README.md +0 -0
  195. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/kaabinejadian/Results.zip +0 -0
  196. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/kaabinejadian/manifest-v1.json +0 -0
  197. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/kaabinejadian/manifest.json +0 -0
  198. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/kaabinejadian/sdrf.tsv +0 -0
  199. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ncorf_mammals/README.md +0 -0
  200. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ncorf_mammals/S3.xlsx +0 -0
  201. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ncorf_mammals/ensembl107.cdna.fa.gz +0 -0
  202. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ncorf_mammals/ensembl107.gtf.gz +0 -0
  203. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ncorf_mammals/human-ensembl107.gtf.gz +0 -0
  204. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ncorf_mammals/human.bed +0 -0
  205. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ncorf_mammals/human.pep.fa +0 -0
  206. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ncorf_mammals/mouse.bed +0 -0
  207. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/ncorf_mammals/mouse.pep.fa +0 -0
  208. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/openprot/README.md +0 -0
  209. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/openprot/ensembl106.cdna.fa.gz +0 -0
  210. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/openprot/ensembl106.gtf.gz +0 -0
  211. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/openprot/mouse-openprot-2_2-altprots+isoforms-min_2_pep-GRCm39.106.bed.zip +0 -0
  212. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/openprot/mouse-openprot-2_2-altprots+isoforms-min_2_pep-GRCm39.106.fasta.zip +0 -0
  213. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/openprot/mouse-openprot-2_2-altprots+isoforms-min_2_pep-GRCm39.106.tsv.zip +0 -0
  214. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/peptideatlas/README.md +0 -0
  215. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/peptideatlas/atlas_build.tsv.zip +0 -0
  216. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/peptideatlas/ensembl.pep.fa.gz +0 -0
  217. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/peptideatlas/manifest.json +0 -0
  218. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/NOTICE.md +0 -0
  219. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/dog/expected.json +0 -0
  220. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/dog/manifest.json +0 -0
  221. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/dog/protein.tsv +0 -0
  222. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/dog/search.fasta +0 -0
  223. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/human/expected.json +0 -0
  224. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/human/manifest.json +0 -0
  225. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/human/protein.tsv +0 -0
  226. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/human/search.fasta +0 -0
  227. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/mouse/expected.json +0 -0
  228. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/mouse/manifest.json +0 -0
  229. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/mouse/protein.tsv +0 -0
  230. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/mouse/search.fasta +0 -0
  231. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/NOTICE.md +0 -0
  232. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/acquisition-missingness.json +0 -0
  233. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/definitions.json +0 -0
  234. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/dog-panel.json +0 -0
  235. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/membership-search-slice.fasta +0 -0
  236. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/memberships.json +0 -0
  237. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/native.json +0 -0
  238. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/parent-status-search-slice.fasta +0 -0
  239. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/parent-status.json +0 -0
  240. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/psm-parent-sets-search-slice.fasta +0 -0
  241. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/psm-parent-sets.json +0 -0
  242. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/search-slice.fasta +0 -0
  243. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/search-slice.json +0 -0
  244. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/study-slice.xml +0 -0
  245. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer/vendor/summary-samples.json +0 -0
  246. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer_rna/GSE325522_family.soft.gz +0 -0
  247. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer_rna/GSE325523_family.soft.gz +0 -0
  248. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer_rna/GSE325525_family.soft.gz +0 -0
  249. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer_rna/NOTICE.md +0 -0
  250. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer_rna/counts.csv.gz +0 -0
  251. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer_rna/dog-annotation.gtf.gz +0 -0
  252. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer_rna/dog-expected.json +0 -0
  253. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer_rna/dog-manifest.json +0 -0
  254. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer_rna/mouse-annotation.gtf.gz +0 -0
  255. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer_rna/mouse-expected.json +0 -0
  256. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer_rna/mouse-manifest.json +0 -0
  257. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/pfizer_rna/samples.xlsx +0 -0
  258. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/references/README.md +0 -0
  259. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/references/canis_lupus_familiaris.json +0 -0
  260. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/references/context-keys-v0.4.json +0 -0
  261. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/references/ensembl115.json +0 -0
  262. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/references/homo_sapiens.json +0 -0
  263. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/references/mitochondrial.json +0 -0
  264. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/references/mus_musculus.json +0 -0
  265. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/references/saccharomyces_cerevisiae.json +0 -0
  266. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/references/transcript_orf_v1_0.42.0.json +0 -0
  267. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/references/uniprot_literature.json +0 -0
  268. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/regions/NOTICE.md +0 -0
  269. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/regions/ingolia.json +0 -0
  270. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/SD3.xlsx +0 -0
  271. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/ensembl107.cdna.fa.gz +0 -0
  272. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/ensembl107.gtf.gz +0 -0
  273. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/ensembl107.ncrna.fa.gz +0 -0
  274. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/human-ensembl105.cdna.fa.gz +0 -0
  275. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/human-ensembl105.gtf.gz +0 -0
  276. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/human-ensembl105.ncrna.fa.gz +0 -0
  277. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/worm-ensembl105.cdna.fa.gz +0 -0
  278. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/worm-ensembl105.gtf.gz +0 -0
  279. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/worm-ensembl105.ncrna.fa.gz +0 -0
  280. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/yeast-ensembl115.cdna.fa.gz +0 -0
  281. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/yeast-ensembl115.dna.fa.gz +0 -0
  282. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/yeast-ensembl115.gtf.gz +0 -0
  283. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/zebrafish-ensembl115.cdna.fa.gz +0 -0
  284. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/zebrafish-ensembl115.gtf.gz +0 -0
  285. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/riborf/zebrafish-ensembl115.ncrna.fa.gz +0 -0
  286. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/search_reference/NOTICE.md +0 -0
  287. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/search_reference/dog.fasta +0 -0
  288. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/search_reference/ensembl83-expected.json +0 -0
  289. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/search_reference/ensembl83-human.fasta.gz +0 -0
  290. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/search_reference/expected.json +0 -0
  291. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/storage/README.md +0 -0
  292. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/storage/generate.py +0 -0
  293. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/storage/v1.json +0 -0
  294. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/storage/v1.sqlite +0 -0
  295. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/storage/v2.json +0 -0
  296. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/storage/v2.sqlite +0 -0
  297. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/storage/v3.json +0 -0
  298. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/storage/v3.sqlite +0 -0
  299. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/storage/v4.json +0 -0
  300. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/storage/v4.sqlite +0 -0
  301. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/viral/GRCh83.d1.vd1_virus_decoy.txt.gz +0 -0
  302. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/viral/NC_001526.4.gb.gz +0 -0
  303. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/viral/genbank/HBV__X04615.1.gb.gz +0 -0
  304. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/viral/genbank/HPV16__K02718.1.gb.gz +0 -0
  305. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/viral/genbank/HPV35__X74477.1.gb.gz +0 -0
  306. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/viral/genbank/HPV51__M62877.1.gb.gz +0 -0
  307. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/viral/genbank/HPV56__X74483.1.gb.gz +0 -0
  308. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/wang/NOTICE.md +0 -0
  309. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/wang/annotation.gtf.gz +0 -0
  310. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/wang/copies.zip +0 -0
  311. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/wang/expected.json +0 -0
  312. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/wang/manifest.json +0 -0
  313. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/wang/protein.zip +0 -0
  314. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/wang/rna.zip +0 -0
  315. {orfdata-0.42.2 → orfdata-0.42.4}/tests/data/wang/search.fasta.gz +0 -0
  316. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_artifact_archives.py +0 -0
  317. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_copy.py +0 -0
  318. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_cross_reference_pairing.py +0 -0
  319. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_dog_export_read_ahead.py +0 -0
  320. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_dog_ncorf_search.py +0 -0
  321. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_dog_peptides.py +0 -0
  322. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_downloads.py +0 -0
  323. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_ensembl_search_reference.py +0 -0
  324. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_evidence_rules.py +0 -0
  325. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_evidence_summary.py +0 -0
  326. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_export_sqlite_rows.py +0 -0
  327. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_extraction_budget.py +0 -0
  328. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_ftps_sqlite.py +0 -0
  329. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_genbank.py +0 -0
  330. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_genbank_equivalence.py +0 -0
  331. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_genetic_codes.py +0 -0
  332. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_genomes.py +0 -0
  333. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_ingolia.py +0 -0
  334. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_initiation_context.py +0 -0
  335. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_liftover.py +0 -0
  336. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_local_build_queries.py +0 -0
  337. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_measurements.py +0 -0
  338. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_merge_catalogs.py +0 -0
  339. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_more_species.py +0 -0
  340. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_ncorf_mammals.py +0 -0
  341. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_numeric_vector.py +0 -0
  342. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_openprot.py +0 -0
  343. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_orf_cases.py +0 -0
  344. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_orf_gtf.py +0 -0
  345. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_package_dog_dataset.py +0 -0
  346. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_package_sqlite_archive.py +0 -0
  347. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_paired_selectors.py +0 -0
  348. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_pairing.py +0 -0
  349. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_pfizer.py +0 -0
  350. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_pfizer_attribution.py +0 -0
  351. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_pfizer_dataset.py +0 -0
  352. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_pfizer_definitions.py +0 -0
  353. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_pfizer_evidence.py +0 -0
  354. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_pfizer_lineage.py +0 -0
  355. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_pfizer_native.py +0 -0
  356. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_pfizer_rna.py +0 -0
  357. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_pfizer_vendor.py +0 -0
  358. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_protein_set.py +0 -0
  359. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_proteome.py +0 -0
  360. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_proteome_external.py +0 -0
  361. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_proteome_fasta_tokens.py +0 -0
  362. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_proteome_producer_graph.py +0 -0
  363. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_reference_context.py +0 -0
  364. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_reference_ledger.py +0 -0
  365. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_reference_mapping.py +0 -0
  366. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_reference_orf.py +0 -0
  367. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_reference_table.py +0 -0
  368. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_refseq.py +0 -0
  369. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_region_targets.py +0 -0
  370. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_search_reference.py +0 -0
  371. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_selectors.py +0 -0
  372. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_storage.py +0 -0
  373. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_transcript_orf_serialization.py +0 -0
  374. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_uorf_catalog.py +0 -0
  375. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_verify_dog_dataset.py +0 -0
  376. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_viral.py +0 -0
  377. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_viral_bundle.py +0 -0
  378. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_viral_cli.py +0 -0
  379. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_viral_collections.py +0 -0
  380. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_viral_completeness.py +0 -0
  381. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_viral_coverage.py +0 -0
  382. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_viral_initiation.py +0 -0
  383. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_viral_origin_join.py +0 -0
  384. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_viral_sources.py +0 -0
  385. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_viral_subsets.py +0 -0
  386. {orfdata-0.42.2 → orfdata-0.42.4}/tests/test_wang.py +0 -0
  387. {orfdata-0.42.2 → orfdata-0.42.4}/tools/README-dog-results.md +0 -0
  388. {orfdata-0.42.2 → orfdata-0.42.4}/tools/__init__.py +0 -0
  389. {orfdata-0.42.2 → orfdata-0.42.4}/tools/build_dog_dataset.py +0 -0
  390. {orfdata-0.42.2 → orfdata-0.42.4}/tools/build_gdc_viral_coverage.py +0 -0
  391. {orfdata-0.42.2 → orfdata-0.42.4}/tools/build_hpv16_cds.py +0 -0
  392. {orfdata-0.42.2 → orfdata-0.42.4}/tools/build_reference_ledger.py +0 -0
  393. {orfdata-0.42.2 → orfdata-0.42.4}/tools/dog_result_plan.json +0 -0
  394. {orfdata-0.42.2 → orfdata-0.42.4}/tools/export_dog_lineage.py +0 -0
  395. {orfdata-0.42.2 → orfdata-0.42.4}/tools/export_dog_results.py +0 -0
  396. {orfdata-0.42.2 → orfdata-0.42.4}/tools/export_sqlite_rows.py +0 -0
  397. {orfdata-0.42.2 → orfdata-0.42.4}/tools/extraction_budget.py +0 -0
  398. {orfdata-0.42.2 → orfdata-0.42.4}/tools/ftps_sqlite.py +0 -0
  399. {orfdata-0.42.2 → orfdata-0.42.4}/tools/inspect_dog_results.py +0 -0
  400. {orfdata-0.42.2 → orfdata-0.42.4}/tools/normalize_dog_evidence.py +0 -0
  401. {orfdata-0.42.2 → orfdata-0.42.4}/tools/package_dog_dataset.py +0 -0
  402. {orfdata-0.42.2 → orfdata-0.42.4}/tools/package_sqlite_archive.py +0 -0
  403. {orfdata-0.42.2 → orfdata-0.42.4}/tools/verify_dog_dataset.py +0 -0
@@ -15,3 +15,4 @@ recursive-include tests/data/ncorf_mammals *.bed *.fa *.xlsx *.gz *.md
15
15
  recursive-include tests/data/riborf *.xlsx *.gz *.md
16
16
  recursive-include tests/data/kaabinejadian *.zip *.tsv
17
17
  recursive-include tests/data/peptideatlas *.zip *.gz
18
+ recursive-include tests/data/mammary_stroma *.gz *.txt *.xml
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orfdata
3
- Version: 0.42.2
3
+ Version: 0.42.4
4
4
  Summary: Reference proteomes with evidence-backed noncanonical ORFs on PyEnsembl genomes
5
5
  Author: OpenVax
6
6
  License-Expression: Apache-2.0
@@ -82,29 +82,19 @@ pip install "orfdata"
82
82
  orfdata setup --species mouse --accept-terms # Three catalogues and the chains
83
83
  ```
84
84
 
85
- `orfdata setup` downloads the published Chang et al. catalogue, builds the other
86
- registered mouse catalogues from their pinned sources, and downloads the chain files (`--accept-terms` for UCSC's non-commercial
85
+ `orfdata setup` downloads the published Chang et al. and RibORF catalogues, builds OpenProt from their pinned sources, and downloads the chain files (`--accept-terms` for UCSC's non-commercial
87
86
  GRCm38/GRCm39 chains). It prints what it did with each: built, downloaded,
88
87
  already installed, repaired or skipped. If one fails, the rest are still
89
88
  installed and it exits with status 1, naming each failure; in Python,
90
89
  `install_species` raises `InstallError`, whose `result` holds the same
91
- report. `load_catalog(species="mouse")` then merges the three,
92
- in this order, into 60,707 ORFs: 2,976 MS-supported OpenProt ORFs, 16,484
93
- Ribo-seq ORFs of Chang et al. and 51,991 of Yang et al. 10,448 of Chang's and
94
- Yang's ORFs are the same ORF (28 of them also in OpenProt), and 296 OpenProt
95
- ORFs have Ribo-seq support from one or both, 242 from Yang et al. alone. On
96
- Ensembl 115 (GRCm39):
97
-
98
- | Evidence | Selected | Added to the proteome |
99
- | --- | ---: | ---: |
100
- | `"ms"` (default) | 2,976 | 2,854 |
101
- | `RiboSeq()` | 58,109 | 57,992 |
102
- | `RiboSeq() & MS()` | 378 | 371 |
103
- | `None` | 60,707 | 60,475 |
104
-
105
- Loading the merged catalogue takes about 10 seconds and 1.1 GB of memory, once
106
- per process, whichever evidence is selected. On GRCm38 and NCBIM37 all three
107
- are [lifted automatically](#every-assembly-of-a-species).
90
+ report. `load_catalog(species="mouse")` merges OpenProt, Chang et al. and
91
+ Yang et al. in that order. Current inputs contain 2,976 MS-supported OpenProt
92
+ ORFs, 16,484 Chang et al. ORFs and 51,831 validated Yang et al. target placements.
93
+ Overlapping source models merge by coding path and protein while keeping their
94
+ original evidence. Merged counts and target-genome placement counts depend on
95
+ these versions; inspect the resulting catalogue and proteome layer receipts.
96
+ On GRCm38 and NCBIM37 the catalogues are
97
+ [lifted automatically](#every-assembly-of-a-species).
108
98
 
109
99
  ### Mouse Ribo-seq ORFs (Chang et al.)
110
100
 
@@ -143,48 +133,55 @@ ATG, CTG, GTG or TTG. Its types are uORF (8,294), lncORF (3,576), uoORF
143
133
 
144
134
  ### Mouse RibORF ORFs (Yang et al.)
145
135
 
146
- `riborf-mouse` holds the mouse ORFs that RibORF 2.0 identified as translated in
147
- the Ribo-seq data of Yang et al. (Nat Commun 2024,
148
- [doi:10.1038/s41467-024-46240-9](https://doi.org/10.1038/s41467-024-46240-9);
149
- 224 samples in 26 GEO series): uORF (26,052), lncORF (8,149), iORF (6,155),
150
- dORF (5,174), uoORF (3,157), N-terminal truncation (2,059), doORF (670) and
151
- extension (575). The source's ouORF, odORF and
152
- noncoding types take Chang et al.'s names, so `--biotype uoORF` finds both
153
- sources' overlapping uORFs. Annotated CDSs, likely sequencing errors,
154
- and stop-codon readthrough are not imported. Release 2 retains 11,902 valid
155
- ORFs shorter than five residues. Release 1, which applied a five-residue import
156
- floor, remains available explicitly as `--version 1`.
157
-
158
- - **Placement.** The source gives mm10 / GENCODE vM25 transcript coordinates
159
- (a 1-based start, an exclusive end) and no proteins. Rather than lift mm10
160
- through a restricted chain, each ORF is placed on the same transcript in
161
- Ensembl 107 GRCm39 and translated from that transcript's sequence. Of the
162
- 54,128 non-skipped source rows, 51,991 resolve. Listed as unresolved, with the
163
- reason: 1,642 rows on transcripts that changed length since GENCODE
164
- vM25, 399 on transcripts that Ensembl 107 has in its GTF but in
165
- neither FASTA, 95 on transcripts that are gone, and one whose
166
- transcript's sequence changed at the same length. Placing through the
167
- transcript gives the same coding path as lifting the source's mm10 blocks
168
- through UCSC's chain for all but 2, in a duplicated region of chr14 where
169
- the chain is ambiguous. Of the 12,222 source rows below five residues,
170
- 11,902 resolve and 320 carry one of the same explicit failures. In all,
171
- 51,881 place on Ensembl 115.
172
- - **Sources.** Supplementary Data 3 (CC BY 4.0) and Ensembl 107's GTF, cDNA
173
- and ncRNA FASTAs; about 115 MB, of which the 32 MB GTF is the one Chang et
174
- al.'s catalogue uses, so `orfdata setup` downloads it once.
175
- - **Evidence.** Presence in the source's set is aggregate Ribo-seq support:
176
- `RiboSeq()` selects every ORF, `RiboSeq(min_studies=2)` none.
177
- - **Length policy.** `catalog.query(min_protein_length=5)` and
178
- `Proteome.build(..., min_protein_length=5)` reproduce a downstream
179
- five-residue selection without removing short models from the catalogue.
180
- Proteome layers record the threshold and number filtered.
181
- - **IDs.** `riborf_` and the GRCm39 start and stop, such as
182
- `riborf_4_120262600_120262620_+`, never a name Chang et al. use. Two paths
183
- with the same start and stop add their transcript (`…@ENSMUST00000226495.2`),
184
- and a lookup by the shared name lists both, as for OpenProt's split
185
- accessions. An ORF in both sets merges by its coding path and protein,
186
- whatever its name, and keeps Chang et al.'s ID; its `riborf_` ID still
187
- finds it.
136
+ `riborf-mouse` generation 3 reconstructs the ORFs reported by Yang et al.
137
+ (Nat Commun 2024,
138
+ [doi:10.1038/s41467-024-46240-9](https://doi.org/10.1038/s41467-024-46240-9))
139
+ against their original GENCODE M25/GRCm38 reference before any placement on
140
+ Ensembl 107/GRCm39. The original table supplies RNA intervals and BED blocks,
141
+ not protein sequences. All 54,128 non-skipped rows reconstruct against the
142
+ pinned native RNA, with the full transcript version, length, start/stop and
143
+ every BED block checked.
144
+
145
+ - **Download.** `orfdata data fetch riborf-mouse` installs the verified 24.9 MB
146
+ catalogue. Rebuilding remains available from its pinned source files.
147
+ - **Target placement.** Exact full RNA, coding nucleotide sequence and translated
148
+ protein must agree. All target cDNA and ncRNA sequences are searched, including
149
+ duplicate loci and renamed transcripts. A surviving stable ID, unchanged RNA
150
+ length or matching start/stop alone cannot transfer evidence.
151
+ - **Coverage.** 51,831 rows have a unique validated target placement, representing
152
+ 41,882 distinct proteins. Another 118 have multiple exact target placements;
153
+ 2,179 lack an unchanged complete target RNA. These 2,297 retain their native
154
+ models, sequences, evidence and explicit mapping reasons in
155
+ `catalog.metadata["unresolved"]`. `extra_orfs(...).unlifted` also reports them
156
+ under the requested evidence rule. A changed RNA with an unchanged small CDS
157
+ remains unresolved under this conservative placement method.
158
+ - **Provenance.** Placed records retain their native `ORFRecord` in
159
+ `record.lifted_from` and a typed `record.reference_mapping`. The latter records
160
+ source/target references, original row ID, RNA interval, native CDS, source
161
+ pins, coordinate checks and exact sequence comparisons. Evidence summaries
162
+ continue to name the native reference and protein. No chain file is invented;
163
+ `record.liftover` is `None`. JSON and TSV exports retain both objects.
164
+ Managed manifests keep target annotation contexts in `references` and native
165
+ evidence contexts in `source_references`.
166
+ - **Sources.** Supplementary Data 3 (CC BY 4.0), native GENCODE M25 GTF/RNA and
167
+ Ensembl 107 GTF/cDNA/ncRNA: about 198 MB in total. The 32 MB target GTF is also
168
+ used by Chang et al., so species setup acquires it once.
169
+ - **Evidence and length.** The 224 samples in 26 GEO series provide aggregate
170
+ RibORF presence, not per-ORF named studies. `RiboSeq()` selects the target
171
+ records; `MS()` and `RiboSeq(min_studies=2)` select none. The catalogue retains
172
+ 11,858 target ORFs shorter than five residues. Consumers choose length limits
173
+ when querying or building proteomes.
174
+ - **IDs and earlier generations.** IDs are `riborf_` followed by the original
175
+ source row ID, including its native transcript version and RNA interval.
176
+ They do not relabel a current coordinate as an original observation.
177
+ Generations 1/2 reconstructed proteins directly from the target annotation;
178
+ new builds of those unvalidated generations fail before downloads and direct
179
+ callers to generation 3. Archived files remain historical data, with their
180
+ saved provenance; they are not retroactively sequence-validated.
181
+
182
+ The source's ouORF, odORF and noncoding categories use the common uoORF, doORF
183
+ and lncORF names. Canonical CDSs, likely sequencing errors and stop-codon
184
+ readthrough rows remain excluded.
188
185
 
189
186
  ## Mouse ORFs from OpenProt
190
187
 
@@ -8,13 +8,14 @@ data coverage, independently of what the API can represent.
8
8
  | --- | --- | --- | --- |
9
9
  | Human | Wang: 29 specimens, gene/transcript FPKM and estimated copies/cell | Wang: 15,210 groups, iBAQ and estimated copies/cell; Pfizer: 10,352 groups, 37 channels, iBAQ/rIBAQ | Wang: adjacent cryosections; Pfizer: native RNA missing |
10
10
  | Mouse | Pfizer: 606 libraries, 56,051 gene targets, counts | Pfizer: 12,124 groups, 63 channels, iBAQ/rIBAQ | Unresolved library-to-pool correspondence |
11
- | Dog | Pfizer: 434 libraries, 30,941 gene targets, counts | Pfizer: 9,929 groups, 38 channels, iBAQ/rIBAQ | Unresolved library-to-pool correspondence |
11
+ | Dog | Pfizer: 434 libraries, 30,941 gene targets, counts; mammary stroma: 18,582 genes × 30 samples | Pfizer: 9,929 groups, 38 channels, iBAQ/rIBAQ; mammary stroma: 1,583 native groups × 28 samples | Mammary stroma: 14 shared specimens, 28 paired compartments and two RNA samples without protein mates; Pfizer crosswalk remains unresolved |
12
12
  | Budding yeast | CoPY: four RNA libraries plus a source aggregate, FPKM and estimated copies/cell; Ingolia: four RNA libraries, counts and densities | CoPY: calibrated SRM and separately calibrated label-free estimates | CoPY: explicit source-cohort pairing; individual cross-assay replicate matches unknown |
13
13
 
14
14
  ## Peptides and MHC ligands
15
15
 
16
- Dog has three peptide-level datasets:
16
+ Dog has four peptide-level datasets:
17
17
 
18
+ - **Mammary stroma** ([guide](mammary-stroma.md)): 5,413 native peptide rows, intensity and LFQ columns, reported group memberships and original control/decoy flags across 28 samples.
18
19
  - **Pfizer native peptide evidence** ([guide](pfizer-peptides.md)): 953,980 target
19
20
  peptide sequences, native peptide/PSM reporter quantities and reported protein-group
20
21
  memberships. The 96 runs retain 38 tissue pools, four bridge channels and two
@@ -28,7 +29,7 @@ Dog has three peptide-level datasets:
28
29
  dog tumours, each searched against four protein databases, and from three
29
30
  human HCT 116 lines that each express one DLA-88 allele.
30
31
 
31
- All three searched known proteins only. Other species have no peptide-level
32
+ All four searched known proteins only. Other species have no peptide-level
32
33
  measurement dataset yet; the human and mouse ORF catalogues carry pooled
33
34
  peptide evidence for their noncanonical ORFs.
34
35
 
@@ -1,7 +1,8 @@
1
1
  # Canine paired measurements and translation-evidence audit
2
2
 
3
3
  Source check: **28 October 2026**. This audit identifies importable measurement
4
- files and their limitations. It does not add a dataset to the registry.
4
+ files and their limitations. The subsequent [mammary-stroma importer](mammary-stroma.md)
5
+ now exposes the paired study through the common quantitative registry.
5
6
  The [machine-readable audit](data/dog-source-audit-20261028.json) contains source
6
7
  URLs, hashes, counts, search queries and a candidate sample crosswalk.
7
8
 
@@ -37,7 +38,8 @@ deposited search used a dated canonical UniProt reference, but its FASTA is not
37
38
  among the 31 PRIDE files. Sequence/reference qualification remains necessary;
38
39
  these data do not establish ncORF translation. Author-derived contrasts in the
39
40
  supplementary workbooks must stay distinct from sample-level measurements.
40
- Import work remains tracked in [#20](https://github.com/openvax/orfdata/issues/20).
41
+ The paired study is now imported as `canine-mammary-stroma`; the remaining dog
42
+ data requests stay tracked in [#20](https://github.com/openvax/orfdata/issues/20).
41
43
 
42
44
  ## Dog Ribo-seq and ncORF translation
43
45
 
@@ -0,0 +1,104 @@
1
+ # Paired canine mammary-stroma RNA and protein
2
+
3
+ `canine-mammary-stroma` imports the processed measurements of
4
+ [Amini et al. (2021)](https://doi.org/10.1016/j.neo.2021.03.001),
5
+ [GSE135183](https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE135183) and
6
+ [PXD023023](https://www.ebi.ac.uk/pride/archive/projects/PXD023023).
7
+ It uses the same data commands and `QuantitativeDataset` API as other species
8
+ and sources:
9
+
10
+ ```sh
11
+ orfdata data info canine-mammary-stroma
12
+ orfdata data fetch canine-mammary-stroma
13
+ orfdata data path canine-mammary-stroma
14
+ ```
15
+
16
+ ```python
17
+ from orfdata import DatasetRegistry
18
+
19
+ registry = DatasetRegistry()
20
+ dataset = registry.open("canine-mammary-stroma") # Offline; no implicit download.
21
+ rna_reference, protein_reference = dataset.manifest.references
22
+ pairs = list(dataset.pairings())
23
+ complete_pairs = [pair for pair in pairs if pair.right_assay_id is not None]
24
+ pair = complete_pairs[0]
25
+ rna = dataset.measurements(
26
+ reference=pair.reference, assay_id=pair.left_assay_id, unit="estimated_count"
27
+ )
28
+ protein = dataset.measurements(
29
+ reference=pair.right_reference, assay_id=pair.right_assay_id, unit="LFQ intensity"
30
+ )
31
+ ```
32
+
33
+ The release contains 993,560 native measurements in a 52 MB download and a
34
+ 514 MB installed SQLite file. Rebuilding uses approximately 8 MB of pinned processed inputs; no raw MS
35
+ files, sequencing reads, alignment index or vendor database is required.
36
+
37
+ | Layer | Native scope | Quantities |
38
+ | --- | --- | --- |
39
+ | RNA | 18,582 Ensembl gene IDs × 30 samples, 15 cases | Integer estimated counts from Kallisto/tximport |
40
+ | Protein | 1,583 native MaxQuant groups × 28 samples, 14 cases | Intensity, LFQ intensity, iBAQ |
41
+ | Peptide | 5,413 native peptide rows × 28 samples | Intensity and the separately reported LFQ intensity columns |
42
+
43
+ Different quantitative columns do not add biological replicates. The 58
44
+ assays retain their original sample and run identities. Native MS rows include
45
+ 77 reversed protein groups and 52 contaminant groups; these counts are not
46
+ counts of confidently detected canine proteins.
47
+
48
+ ## Specimen pairing
49
+
50
+ The authors reused archived FFPE mammary specimens for separate laser-capture
51
+ RNA and protein preparations. The importer verifies a unique match between
52
+ clinical Table 1 and GEO by breed, age and histological subtype, recording
53
+ spelling normalizations and both original sets of labels. This is a
54
+ **metadata-derived crosswalk within an author-declared shared cohort**, not an
55
+ author-provided case-ID mapping.
56
+
57
+ Fourteen shared cases give 28 complete assay pairs: normal stroma and
58
+ cancer-associated stroma separately. Two RNA samples from GEO case 127 have
59
+ explicitly missing protein mates; the paper reports exclusion of proteomics
60
+ case 7 because its paraffin block was unavailable. No protein sample is invented.
61
+
62
+ These pairs use `same_specimen`. This basis means separate preparations from the
63
+ same original specimen, without claiming identical aliquots or adjacent
64
+ sections. Temporal labels refer to the original biological specimen, not the
65
+ dates of RNA sequencing and mass-spectrometry acquisition. Missing mates retain
66
+ an unknown temporal relationship. Pairing does not itself establish a
67
+ relationship between RNA genes and protein groups: this release has no
68
+ cross-modal target relations or current-reference mappings.
69
+
70
+ The normal compartment belongs to a cancer-bearing mammary specimen. It is not
71
+ a healthy-animal normal-tissue atlas. Source case IDs identify individual
72
+ specimens, and repeated compartments or quantities never imply additional dogs.
73
+
74
+ ## Missingness, native records and reference limits
75
+
76
+ - RNA zeros remain measured zero counts. Counts are estimated gene-level values,
77
+ with no conversion to TPM, copies per cell or translation efficiency.
78
+ - MaxQuant MS zeros denote unquantified cells. Their numeric values are `None`
79
+ with status `missing`; the original `"0"` survives in provenance. The 2,156
80
+ native `"NaN"` iBAQ cells also remain missing, with a separate reason.
81
+ - Every native MS field survives once in the corresponding mapping's
82
+ `provenance["native_record"]`. Measurements retain source row/column, original
83
+ numeric text, identification type and the original control/decoy flags.
84
+ - Peptide mappings retain every reported native protein-group ID. A unique
85
+ assignment to one *group* is not unique protein or isoform detection. Group
86
+ records retain reported protein labels, including contaminants, without
87
+ assigning them to a canine biological protein reference.
88
+ - No source QC threshold, aggregation, imputation, differential-expression model
89
+ or RNA/protein ratio is applied. Consumers can inspect the native flags and
90
+ scores explicitly.
91
+
92
+ RNA was quantified against Ensembl transcripts on CanFam3.1; its exact release
93
+ and transcript sequence bytes are not reported. The protein search used a
94
+ canonical UniProt dog reference dated 2019-07-29 with decoys and contaminants;
95
+ the searched FASTA is absent from the deposited processed files. Both references
96
+ remain source-bound and incomplete. Source membership and uniqueness flags are
97
+ preserved, but no full-background sequence uniqueness is asserted. These data
98
+ provide neither ncORF translation evidence nor MHC-presentation evidence.
99
+
100
+ The [earlier source audit](dog-data-sources.md) records the acquisition and
101
+ crosswalk evidence. The PRIDE project declares CC0; GEO numerical data and
102
+ factual metadata use [GEO's public-data terms](https://www.ncbi.nlm.nih.gov/geo/info/disclaimer.html).
103
+ Factual clinical curation cites Table 1 of the CC BY-NC-ND article. Its original
104
+ text and figures are excluded from the dataset artifact.
@@ -17,7 +17,7 @@ a Cartesian product of technical replicates. Each row retains its assay pairing
17
17
  and target relationship. A three-assay experiment can declare several pairwise
18
18
  comparisons; sharing an RNA measurement does not create independent replicates.
19
19
 
20
- Pairing bases are `same_material`, `adjacent_donor_tissue`,
20
+ Pairing bases are `same_material`, `same_specimen`, `adjacent_donor_tissue`,
21
21
  `biological_replicate`, `independent_cultures`, `tissue_aggregate` and
22
22
  `condition_aggregate`. The caller must choose the allowed bases. By default,
23
23
  only explicitly concurrent assays are returned; opt into `longitudinal` or
@@ -116,3 +116,8 @@ identities nor transfers abundance or protein-existence evidence. ORF comparison
116
116
  additionally require their own sequence, frame and positional evidence and
117
117
  `allow_orfs=True`; a gene ortholog cannot establish an orthologous ncORF.
118
118
  Human, mouse, dog, yeast and arbitrary other taxa use this same API.
119
+
120
+ `same_specimen` records separate preparations from the same original specimen.
121
+ It does not assert identical aliquots (`same_material`) or adjacent sections.
122
+ The [canine mammary-stroma dataset](mammary-stroma.md) uses this distinction and
123
+ retains missing mates explicitly.
@@ -41,6 +41,7 @@ nav:
41
41
  - Human, mouse and dog protein: pfizer-protein.md
42
42
  - Pfizer dog peptide and group evidence: pfizer-peptides.md
43
43
  - Dog and mouse RNA: pfizer-rna.md
44
+ - Paired canine mammary stroma: mammary-stroma.md
44
45
  - Yeast protein and RNA: copy-yeast.md
45
46
  - Yeast RNA and ribosome occupancy: ingolia-yeast.md
46
47
  - Dog MHC ligands and PeptideAtlas: dog-peptides.md
@@ -11,7 +11,7 @@ import os
11
11
  import re
12
12
  from collections import Counter
13
13
  from copy import copy, deepcopy
14
- from dataclasses import asdict, dataclass, replace
14
+ from dataclasses import asdict, dataclass, field, replace
15
15
  from importlib.resources import files
16
16
  from pathlib import Path
17
17
  from typing import NamedTuple, Optional
@@ -22,8 +22,10 @@ from .evidence import MS_METHODS, evidence_rule, stored_method
22
22
  from .evidence_summary import EvidenceSummary, unique_summaries
23
23
  from .initiation_context import KOZAK_PREFERENCES, InitiationContext
24
24
  from .liftover import Liftover
25
+ from .measurements import _plain
25
26
  from .model import ORFModel, TranscriptORF, _contig, _id_forms, _species, _transcript_match
26
- from .reference import ReferenceContext
27
+ from .reference import ReferenceContext, ScopedTarget
28
+ from .reference_mapping import ReferenceMapping
27
29
  from .sequence import genetic_code, reverse_complement_dna
28
30
 
29
31
 
@@ -142,17 +144,35 @@ class ORFRecord:
142
144
  members: tuple = ()
143
145
  lifted_from: Optional["ORFRecord"] = None
144
146
  liftover: Optional[Liftover] = None
147
+ reference_mapping: Optional[ReferenceMapping] = field(default=None, hash=False)
145
148
 
146
149
  def __post_init__(self):
147
150
  object.__setattr__(self, "summaries", unique_summaries(self.summaries))
148
151
  object.__setattr__(self, "members", tuple(self.members))
149
- if (self.lifted_from is None) != (self.liftover is None):
150
- raise ValueError("A lifted record names both its original record and the chain")
151
152
  original = self.lifted_from
153
+ methods = int(self.liftover is not None) + int(self.reference_mapping is not None)
154
+ if methods != int(original is not None):
155
+ raise ValueError("A placed record names its original and exactly one chain or reference mapping")
152
156
  if original is not None and any(getattr(self, name) != getattr(original, name) for name in (
153
157
  "orf_id", "protein_sequence", "translation_table", "start_codon", "source",
154
158
  "ribosome_studies", "peptides", "summaries")):
155
159
  raise ValueError(f"A lifted record keeps its original's ID, protein and evidence: {self.orf_id}")
160
+ mapping = self.reference_mapping
161
+ if mapping is not None:
162
+ if not isinstance(mapping, ReferenceMapping):
163
+ raise TypeError("ORF reference placements require a ReferenceMapping")
164
+ if original.reference_context is None or self.reference_context is None:
165
+ raise ValueError("ORF reference placements require both reference identities")
166
+ source = ScopedTarget(original.reference_context, "orf", original.orf_id, original.source)
167
+ target = ScopedTarget(self.reference_context, "orf", self.orf_id, self.source)
168
+ if mapping.source != source or mapping.targets != (target,) or mapping.status != "unique":
169
+ raise ValueError("ORF reference mapping endpoints disagree with the records")
170
+ digest = hashlib.sha256(self.protein_sequence.encode("ascii")).hexdigest()
171
+ if not mapping.sequence_validated or mapping.validation["sequence"]["source_sha256"] != digest:
172
+ raise ValueError("ORF reference mapping protein identity disagrees with the records")
173
+ expected = {"source": _placement_position(original), "target": _placement_position(self)}
174
+ if _plain(mapping.validation.get("position")) != expected:
175
+ raise ValueError("ORF reference mapping positions disagree with the records")
156
176
  if self.members:
157
177
  # Each member validated its own summaries against its own identity.
158
178
  key = _merge_key(self)
@@ -229,7 +249,7 @@ class ORFRecord:
229
249
 
230
250
  def to_dict(self):
231
251
  """Return a serializable copy of this record."""
232
- result = asdict(self)
252
+ result = _plain(self)
233
253
  if not self.summaries:
234
254
  result.pop("summaries")
235
255
  if self.reference_context is None:
@@ -246,7 +266,10 @@ class ORFRecord:
246
266
  result["lifted_from"] = self.lifted_from.to_dict()
247
267
  else:
248
268
  result.pop("lifted_from")
269
+ if self.liftover is None:
249
270
  result.pop("liftover")
271
+ if self.reference_mapping is None:
272
+ result.pop("reference_mapping")
250
273
  return result
251
274
 
252
275
  def map_initiation_position(self, position, *, genome_build):
@@ -417,6 +440,12 @@ class ORFRecord:
417
440
  }
418
441
 
419
442
 
443
+ def _placement_position(record):
444
+ """The coding placement bound by a typed source-to-target reference mapping."""
445
+ return dict(transcript_id=record.transcript_id, contig=record.contig, strand=record.strand,
446
+ coding_blocks=[list(block) for block in record.coding_blocks])
447
+
448
+
420
449
  def _qualify_colliding_ids(records):
421
450
  """Give colliding source records unique catalogue IDs, retaining their native records."""
422
451
  records = tuple(records)
@@ -436,7 +465,7 @@ def _qualify_colliding_ids(records):
436
465
  names = [f"{quote(r.source, safe='')}:{quote(r.orf_id, safe='')}" if i in qualified
437
466
  else r.orf_id for i, r in enumerate(records)]
438
467
  return tuple(r if name == r.orf_id else replace(
439
- r, orf_id=name, members=r.members or (r,), lifted_from=None, liftover=None)
468
+ r, orf_id=name, members=r.members or (r,), lifted_from=None, liftover=None, reference_mapping=None)
440
469
  for r, name in zip(records, names))
441
470
 
442
471
 
@@ -449,6 +478,15 @@ class ORFCatalog:
449
478
  self.genome_build = metadata["genome_build"]
450
479
  self.taxon_id = metadata["taxon_id"]
451
480
  self.species = metadata["species"]
481
+ for entry in metadata.get("unresolved", ()):
482
+ if entry.get("native_record") is not None:
483
+ native = _record(entry["native_record"])
484
+ mapping = ReferenceMapping.from_dict(entry["reference_mapping"])
485
+ expected = ScopedTarget(native.reference_context, "orf", native.orf_id, native.source)
486
+ if (mapping.source != expected or mapping.status == "unique"
487
+ or mapping.target_reference.taxon_id != self.taxon_id
488
+ or mapping.target_reference.genome_build != self.genome_build):
489
+ raise ValueError("Unresolved reference mapping disagrees with its native record or catalogue")
452
490
  self._by_id = {r.orf_id: r for r in self.records}
453
491
  self._aliases = {}
454
492
  self._by_source_id = {}
@@ -834,7 +872,7 @@ def merge_catalogs(catalogs):
834
872
  pinned = {None if m.reference_context is None else m.reference_context.key for m in members}
835
873
  records.append(replace(
836
874
  # The merged ORF is no one source's lift; each member keeps its own lift provenance.
837
- primary, members=tuple(members), lifted_from=None, liftover=None,
875
+ primary, members=tuple(members), lifted_from=None, liftover=None, reference_mapping=None,
838
876
  initiation_context=_shared_context(primary, members),
839
877
  # Sources pinned to different annotations of one assembly leave the ORF unpinned.
840
878
  reference_context=primary.reference_context if len(pinned) == 1 else None, **_union(members, study)))
@@ -927,7 +965,10 @@ def _record(row, legacy=False):
927
965
  row["members"] = tuple(_record(m) for m in row.get("members", ()))
928
966
  if row.get("lifted_from") is not None:
929
967
  row["lifted_from"] = _record(row["lifted_from"])
968
+ if row.get("liftover") is not None:
930
969
  row["liftover"] = Liftover(**row["liftover"])
970
+ if row.get("reference_mapping") is not None:
971
+ row["reference_mapping"] = ReferenceMapping.from_dict(row["reference_mapping"])
931
972
  return ORFRecord(**row)
932
973
 
933
974
 
@@ -21,14 +21,22 @@ class CatalogManifest(_Record):
21
21
  coverage: Mapping
22
22
  processing: Mapping
23
23
  schema: str = "orfdata.catalog-manifest.v1"
24
+ source_references: tuple = ()
24
25
 
25
26
  @classmethod
26
27
  def from_dict(cls, data):
27
28
  values = dict(data)
28
29
  values["references"] = tuple(ReferenceContext(**c) for c in values["references"])
29
30
  values["sources"] = tuple(SourceAsset.from_dict(s) for s in values["sources"])
31
+ values["source_references"] = tuple(ReferenceContext(**c) for c in values.get("source_references", ()))
30
32
  return cls(**values)
31
33
 
34
+ def to_dict(self):
35
+ result = super().to_dict()
36
+ if not self.source_references:
37
+ result.pop("source_references")
38
+ return result
39
+
32
40
  def __post_init__(self):
33
41
  for name in ("catalog_id", "version", "title"):
34
42
  _identifier(getattr(self, name), name)
@@ -54,6 +62,14 @@ class CatalogManifest(_Record):
54
62
  builds = {r.genome_build for r in self.references if r.genome_build is not None}
55
63
  if len(builds) != 1 or not any(r.is_genomic for r in self.references):
56
64
  raise ValueError("A catalogue must have one assembly and a complete genomic reference")
65
+ if isinstance(self.source_references, str):
66
+ raise TypeError("Source references must be a sequence of contexts")
67
+ object.__setattr__(self, "source_references", tuple(self.source_references))
68
+ if any(not isinstance(r, ReferenceContext) or not r.is_genomic
69
+ or r.taxon_id != self.taxon_id for r in self.source_references):
70
+ raise ValueError("Native source references must be genomic contexts of the catalogue species")
71
+ if len({r.key for r in self.source_references}) != len(self.source_references):
72
+ raise ValueError("Duplicate native source reference contexts")
57
73
  if any(not isinstance(s, SourceAsset) for s in self.sources):
58
74
  raise TypeError("Catalogue sources must be SourceAssets")
59
75
  if len({s.asset_id for s in self.sources}) != len(self.sources):
@@ -91,9 +107,16 @@ class CatalogManifest(_Record):
91
107
  reference = record.reference_context
92
108
  if reference is None or not reference.is_genomic or reference.key not in references:
93
109
  raise ValueError("Managed ORF records require a declared complete genomic reference")
110
+ evidence_references = references | {r.key for r in self.source_references}
94
111
  for summary in catalog.evidence_summaries:
95
- if summary.target.reference.key not in references:
112
+ if summary.target.reference.key not in evidence_references:
96
113
  raise ValueError("Evidence summary reference is absent from catalogue manifest")
114
+ for entry in catalog.metadata.get("unresolved", ()):
115
+ if entry.get("native_record") is not None:
116
+ native = ReferenceContext(**entry["native_record"]["reference_context"])
117
+ target = ReferenceContext(**entry["reference_mapping"]["target_reference"])
118
+ if native.key not in evidence_references or target.key not in references:
119
+ raise ValueError("Unresolved placement reference is absent from catalogue manifest")
97
120
  counts = dict(distinct_protein_sequences=len({r.protein_sequence for r in catalog.records}),
98
121
  evidence_summaries=len(catalog.evidence_summaries))
99
122
  for key, actual in counts.items():
@@ -40,7 +40,7 @@ def _copy_catalog(inputs, output, manifest):
40
40
  handle.write(json.dumps(catalog.to_dict(), sort_keys=True, separators=(",", ":"), allow_nan=False).encode())
41
41
 
42
42
 
43
- def _builder(manifest):
43
+ def _builder(manifest, *, for_build=False):
44
44
  """The packaged importer a release names; import paths in metadata are never executed."""
45
45
  importer = manifest.processing.get("importer")
46
46
  if importer == "catalog-copy-v1":
@@ -54,7 +54,13 @@ def _builder(manifest):
54
54
 
55
55
  return lambda inputs, output: import_orfs(inputs, output, manifest)
56
56
  if importer in ("riborf-v1", "riborf-v2"):
57
- from .sources.riborf import import_orfs
57
+ from .sources.riborf import import_orfs, validate_transcript_manifest
58
+
59
+ if for_build:
60
+ validate_transcript_manifest(manifest)
61
+ return lambda inputs, output: import_orfs(inputs, output, manifest)
62
+ if importer == "riborf-native-v3":
63
+ from .sources.riborf_native import import_orfs
58
64
 
59
65
  return lambda inputs, output: import_orfs(inputs, output, manifest)
60
66
  if importer in ("riborf-genome-v1", "riborf-genome-v2"):
@@ -198,7 +204,7 @@ class CatalogRegistry:
198
204
  def build(self, name, version=None, *, force=False, source_paths=None, download_options=None):
199
205
  """Explicitly materialize an allowlisted catalogue source adapter."""
200
206
  manifest = self.info(name, version)
201
- return build_catalog(manifest, _builder(manifest), cache_root=self._cache_root,
207
+ return build_catalog(manifest, _builder(manifest, for_build=True), cache_root=self._cache_root,
202
208
  source_paths=source_paths, force=force, download_options=download_options)
203
209
 
204
210
  def inspect_build(self, name, version=None, *, verify_files=True):
@@ -320,14 +320,14 @@ def _query(args, parser, catalog_loader):
320
320
  "initiation_context_json",
321
321
  )
322
322
  scoped = not isinstance(catalog, UORFCatalog)
323
- provenance = ("members", "liftover", "lifted_from")
323
+ provenance = ("members", "liftover", "lifted_from", "reference_mapping")
324
324
  if scoped:
325
325
  fields += ("start_codon", "reference_context_json", "summaries_json") + tuple(
326
326
  f + "_json" for f in provenance)
327
327
  elif any(r.summaries for r in records):
328
328
  # The released upstream-only columns have no place for aggregate counts.
329
329
  parser.error("The legacy upstream-ORF TSV cannot export aggregate evidence; use --format json")
330
- elif any(r.members or r.liftover for r in records):
330
+ elif any(r.members or r.lifted_from for r in records):
331
331
  parser.error("The legacy upstream-ORF TSV cannot export merged or lifted records; use --format json")
332
332
  elif any(getattr(r, "start_codon", None) for r in records):
333
333
  parser.error("The legacy upstream-ORF TSV cannot export declared start codons; use --format json")