smftools 0.3.2__tar.gz → 2.16.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 (626) hide show
  1. smftools-2.16.0/.devcontainer/Dockerfile +38 -0
  2. smftools-2.16.0/.devcontainer/devcontainer.json +32 -0
  3. {smftools-0.3.2 → smftools-2.16.0}/.github/workflows/ci.yml +43 -18
  4. smftools-2.16.0/.github/workflows/extended-ci.yml +48 -0
  5. smftools-2.16.0/.github/workflows/partitioned-acceptance.yml +67 -0
  6. {smftools-0.3.2 → smftools-2.16.0}/.gitignore +4 -0
  7. smftools-2.16.0/.readthedocs.yaml +16 -0
  8. smftools-2.16.0/AGENTS.md +162 -0
  9. smftools-2.16.0/PKG-INFO +273 -0
  10. smftools-2.16.0/README.md +81 -0
  11. smftools-2.16.0/docs/source/AGENTS.md +85 -0
  12. smftools-2.16.0/docs/source/api/analysis.md +71 -0
  13. {smftools-0.3.2 → smftools-2.16.0}/docs/source/api/index.md +2 -0
  14. smftools-2.16.0/docs/source/api/informatics.md +81 -0
  15. smftools-2.16.0/docs/source/api/plotting.md +34 -0
  16. {smftools-0.3.2 → smftools-2.16.0}/docs/source/api/preprocessing.md +13 -0
  17. smftools-2.16.0/docs/source/api/tools.md +33 -0
  18. smftools-2.16.0/docs/source/basic_usage.md +332 -0
  19. {smftools-0.3.2 → smftools-2.16.0}/docs/source/conf.py +9 -9
  20. smftools-2.16.0/docs/source/contributors.md +11 -0
  21. smftools-2.16.0/docs/source/dev/index.md +51 -0
  22. smftools-2.16.0/docs/source/installation.md +97 -0
  23. smftools-2.16.0/docs/source/release-notes/0.1.2.md +4 -0
  24. smftools-2.16.0/docs/source/release-notes/0.1.3.md +4 -0
  25. smftools-2.16.0/docs/source/release-notes/0.1.4.md +4 -0
  26. smftools-2.16.0/docs/source/release-notes/0.1.5.md +4 -0
  27. smftools-2.16.0/docs/source/release-notes/0.1.7.md +4 -0
  28. smftools-2.16.0/docs/source/release-notes/0.2.0.md +4 -0
  29. smftools-2.16.0/docs/source/release-notes/0.2.2.md +4 -0
  30. smftools-2.16.0/docs/source/release-notes/0.2.4.md +4 -0
  31. smftools-2.16.0/docs/source/release-notes/0.2.5.md +4 -0
  32. smftools-2.16.0/docs/source/release-notes/0.3.1.md +4 -0
  33. smftools-2.16.0/docs/source/release-notes/0.3.2.md +4 -0
  34. smftools-2.16.0/docs/source/release-notes/0.4.0.md +4 -0
  35. smftools-2.16.0/docs/source/release-notes/0.4.1.md +4 -0
  36. smftools-2.16.0/docs/source/release-notes/0.4.2.md +4 -0
  37. smftools-2.16.0/docs/source/release-notes/0.4.3.md +4 -0
  38. smftools-2.16.0/docs/source/release-notes/0.4.4.md +4 -0
  39. smftools-2.16.0/docs/source/release-notes/0.4.5.md +4 -0
  40. smftools-2.16.0/docs/source/release-notes/1.0.0.md +4 -0
  41. smftools-2.16.0/docs/source/release-notes/1.1.0.md +4 -0
  42. smftools-2.16.0/docs/source/release-notes/2.0.0.md +4 -0
  43. smftools-2.16.0/docs/source/release-notes/2.1.0.md +4 -0
  44. smftools-2.16.0/docs/source/release-notes/2.10.0.md +4 -0
  45. smftools-2.16.0/docs/source/release-notes/2.11.0.md +4 -0
  46. smftools-2.16.0/docs/source/release-notes/2.12.0.md +4 -0
  47. smftools-2.16.0/docs/source/release-notes/2.13.0.md +4 -0
  48. smftools-2.16.0/docs/source/release-notes/2.14.0.md +4 -0
  49. smftools-2.16.0/docs/source/release-notes/2.15.0.md +4 -0
  50. smftools-2.16.0/docs/source/release-notes/2.16.0.md +4 -0
  51. smftools-2.16.0/docs/source/release-notes/2.2.0.md +4 -0
  52. smftools-2.16.0/docs/source/release-notes/2.3.0.md +4 -0
  53. smftools-2.16.0/docs/source/release-notes/2.4.0.md +4 -0
  54. smftools-2.16.0/docs/source/release-notes/2.5.0.md +4 -0
  55. smftools-2.16.0/docs/source/release-notes/2.6.0.md +4 -0
  56. smftools-2.16.0/docs/source/release-notes/2.7.0.md +4 -0
  57. smftools-2.16.0/docs/source/release-notes/2.8.0.md +4 -0
  58. smftools-2.16.0/docs/source/release-notes/2.9.0.md +4 -0
  59. smftools-2.16.0/docs/source/release-notes/index.md +213 -0
  60. smftools-2.16.0/docs/source/tutorials/cli_usage.md +358 -0
  61. smftools-2.16.0/docs/source/tutorials/directory_organization.md +280 -0
  62. smftools-2.16.0/docs/source/tutorials/experiment_config.md +184 -0
  63. smftools-2.16.0/docs/source/tutorials/index.md +15 -0
  64. {smftools-0.3.2 → smftools-2.16.0}/experiment_config.csv +13 -13
  65. {smftools-0.3.2 → smftools-2.16.0}/notebooks/Kissiov_and_McKenna_2025_sample_sheet.csv +10 -10
  66. {smftools-0.3.2 → smftools-2.16.0}/pyproject.toml +183 -47
  67. {smftools-0.3.2 → smftools-2.16.0}/requirements.txt +1 -1
  68. {smftools-0.3.2 → smftools-2.16.0}/sample_sheet.csv +10 -10
  69. smftools-2.16.0/smftools/__init__.py +95 -0
  70. {smftools-0.3.2 → smftools-2.16.0}/smftools/_version.py +1 -1
  71. smftools-2.16.0/smftools/analysis/AGENTS.md +103 -0
  72. smftools-2.16.0/smftools/analysis/__init__.py +19 -0
  73. smftools-2.16.0/smftools/analysis/compute/__init__.py +18 -0
  74. smftools-2.16.0/smftools/analysis/compute/autocorrelation.py +320 -0
  75. smftools-2.16.0/smftools/analysis/compute/dimensionality_reduction.py +226 -0
  76. smftools-2.16.0/smftools/analysis/compute/ep_classification.py +122 -0
  77. smftools-2.16.0/smftools/analysis/compute/hmm_features.py +79 -0
  78. smftools-2.16.0/smftools/analysis/compute/ls_periodicity.py +379 -0
  79. smftools-2.16.0/smftools/analysis/compute/metrics_store.py +89 -0
  80. smftools-2.16.0/smftools/analysis/compute/ml_cnn.py +507 -0
  81. smftools-2.16.0/smftools/analysis/compute/ml_metrics.py +215 -0
  82. smftools-2.16.0/smftools/analysis/compute/ml_splits.py +112 -0
  83. smftools-2.16.0/smftools/analysis/compute/pearson.py +58 -0
  84. smftools-2.16.0/smftools/analysis/compute/read_cache.py +398 -0
  85. smftools-2.16.0/smftools/analysis/config/__init__.py +11 -0
  86. smftools-2.16.0/smftools/analysis/config/hmm_histogram.py +83 -0
  87. smftools-2.16.0/smftools/analysis/filters/__init__.py +10 -0
  88. smftools-2.16.0/smftools/analysis/filters/obs_filters.py +113 -0
  89. smftools-2.16.0/smftools/analysis/filters/position_filters.py +39 -0
  90. smftools-2.16.0/smftools/analysis/plot/__init__.py +14 -0
  91. smftools-2.16.0/smftools/analysis/plot/autocorr.py +465 -0
  92. smftools-2.16.0/smftools/analysis/plot/embeddings.py +632 -0
  93. smftools-2.16.0/smftools/analysis/plot/heatmaps.py +66 -0
  94. smftools-2.16.0/smftools/analysis/plot/histograms.py +267 -0
  95. smftools-2.16.0/smftools/analysis/plot/locus.py +9 -0
  96. smftools-2.16.0/smftools/analysis/plot/ml.py +133 -0
  97. smftools-2.16.0/smftools/cli/AGENTS.md +72 -0
  98. smftools-2.16.0/smftools/cli/batch.py +162 -0
  99. {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/chimeric_adata.py +51 -41
  100. smftools-2.16.0/smftools/cli/export_fastq.py +262 -0
  101. smftools-2.16.0/smftools/cli/helpers.py +626 -0
  102. {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/hmm_adata.py +516 -148
  103. {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/latent_adata.py +104 -59
  104. smftools-2.16.0/smftools/cli/load_adata.py +1654 -0
  105. smftools-2.16.0/smftools/cli/plot_current.py +64 -0
  106. {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/preprocess_adata.py +365 -123
  107. smftools-2.16.0/smftools/cli/project_cmd.py +171 -0
  108. smftools-2.16.0/smftools/cli/raw_adata.py +1661 -0
  109. smftools-2.16.0/smftools/cli/recipes.py +168 -0
  110. {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/spatial_adata.py +194 -72
  111. smftools-2.16.0/smftools/cli/stage_artifacts.py +227 -0
  112. smftools-2.16.0/smftools/cli/stage_input.py +134 -0
  113. {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/variant_adata.py +332 -38
  114. smftools-2.16.0/smftools/cli_entry.py +881 -0
  115. smftools-2.16.0/smftools/config/barcodes/SQK-NBD114-24.yaml +35 -0
  116. smftools-2.16.0/smftools/config/barcodes/SQK-NBD114-96.yaml +107 -0
  117. smftools-2.16.0/smftools/config/barcodes/SQK-RBK114-24.yaml +35 -0
  118. smftools-2.16.0/smftools/config/barcodes/SQK-RBK114-96.yaml +113 -0
  119. {smftools-0.3.2 → smftools-2.16.0}/smftools/config/conversion.yaml +9 -0
  120. {smftools-0.3.2 → smftools-2.16.0}/smftools/config/deaminase.yaml +13 -4
  121. smftools-2.16.0/smftools/config/default.yaml +644 -0
  122. {smftools-0.3.2 → smftools-2.16.0}/smftools/config/direct.yaml +11 -1
  123. {smftools-0.3.2 → smftools-2.16.0}/smftools/config/discover_input_files.py +1 -1
  124. {smftools-0.3.2 → smftools-2.16.0}/smftools/config/experiment_config.py +968 -76
  125. smftools-2.16.0/smftools/config/umis/dual-nextera-12.yaml +9 -0
  126. {smftools-0.3.2 → smftools-2.16.0}/smftools/constants.py +115 -0
  127. {smftools-0.3.2 → smftools-2.16.0}/smftools/datasets/F1_sample_sheet.csv +4 -4
  128. {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/HMM.py +139 -97
  129. {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/call_hmm_peaks.py +3 -84
  130. smftools-2.16.0/smftools/hmm/fit_plan.py +310 -0
  131. smftools-2.16.0/smftools/hmm/model_artifacts.py +389 -0
  132. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/__init__.py +5 -0
  133. smftools-2.16.0/smftools/informatics/alignment_rescue.py +268 -0
  134. smftools-2.16.0/smftools/informatics/analysis_region_plan.py +287 -0
  135. smftools-2.16.0/smftools/informatics/artifact_paths.py +33 -0
  136. smftools-2.16.0/smftools/informatics/bam_functions.py +5087 -0
  137. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/basecalling.py +16 -7
  138. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/bed_functions.py +7 -1
  139. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/binarize_converted_base_identities.py +10 -10
  140. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/converted_BAM_to_adata.py +380 -184
  141. smftools-2.16.0/smftools/informatics/derived_read_index.py +126 -0
  142. smftools-2.16.0/smftools/informatics/experiment_manifest.py +352 -0
  143. smftools-2.16.0/smftools/informatics/experiment_spine.py +105 -0
  144. smftools-2.16.0/smftools/informatics/fastq_export.py +150 -0
  145. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/h5ad_functions.py +204 -21
  146. smftools-2.16.0/smftools/informatics/incremental_zarr.py +125 -0
  147. smftools-2.16.0/smftools/informatics/modkit_extract_to_adata.py +2879 -0
  148. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/modkit_functions.py +13 -6
  149. smftools-2.16.0/smftools/informatics/molecule_identity.py +71 -0
  150. smftools-2.16.0/smftools/informatics/partition_query.py +241 -0
  151. smftools-2.16.0/smftools/informatics/partition_read.py +1081 -0
  152. smftools-2.16.0/smftools/informatics/partition_store.py +665 -0
  153. smftools-2.16.0/smftools/informatics/physical_layout.py +45 -0
  154. smftools-2.16.0/smftools/informatics/plot_region_stitching.py +405 -0
  155. smftools-2.16.0/smftools/informatics/pod5_functions.py +555 -0
  156. smftools-2.16.0/smftools/informatics/ragged_store.py +667 -0
  157. smftools-2.16.0/smftools/informatics/raw_store.py +782 -0
  158. smftools-2.16.0/smftools/informatics/reference_identity.py +32 -0
  159. smftools-2.16.0/smftools/informatics/region_catalog.py +520 -0
  160. smftools-2.16.0/smftools/informatics/run_multiqc.py +65 -0
  161. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/sequence_encoding.py +16 -0
  162. smftools-2.16.0/smftools/informatics/sidecar_manifest.py +95 -0
  163. smftools-2.16.0/smftools/informatics/signal_features.py +206 -0
  164. smftools-2.16.0/smftools/informatics/stage_obs.py +91 -0
  165. smftools-2.16.0/smftools/informatics/storage_planner.py +110 -0
  166. smftools-2.16.0/smftools/logging_utils.py +226 -0
  167. smftools-2.16.0/smftools/memory_guard.py +1275 -0
  168. smftools-2.16.0/smftools/parallel_utils.py +96 -0
  169. smftools-2.16.0/smftools/perf_log.py +490 -0
  170. {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/__init__.py +4 -0
  171. {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/autocorrelation_plotting.py +9 -2
  172. smftools-2.16.0/smftools/plotting/hmm_plotting.py +2401 -0
  173. {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/latent_plotting.py +43 -6
  174. {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/plotting_utils.py +124 -7
  175. smftools-2.16.0/smftools/plotting/pod5_plotting.py +463 -0
  176. {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/position_stats.py +6 -3
  177. smftools-2.16.0/smftools/plotting/preprocess_plotting.py +440 -0
  178. {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/qc_plotting.py +158 -2
  179. {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/spatial_plotting.py +591 -394
  180. smftools-2.16.0/smftools/plotting/umi_plotting.py +119 -0
  181. smftools-2.16.0/smftools/plotting/variant_plotting.py +1884 -0
  182. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/__init__.py +10 -0
  183. smftools-2.16.0/smftools/preprocessing/_bitpack_utils.py +102 -0
  184. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/append_base_context.py +36 -3
  185. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/append_binary_layer_by_base_context.py +60 -57
  186. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/append_variant_call_layer.py +73 -1
  187. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/binarize_on_Youden.py +13 -5
  188. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_position_Youden.py +10 -0
  189. smftools-2.16.0/smftools/preprocessing/clean_NaN.py +185 -0
  190. smftools-2.16.0/smftools/preprocessing/dispatch_plan.py +199 -0
  191. smftools-2.16.0/smftools/preprocessing/duplicate_detection_dispatch.py +395 -0
  192. smftools-2.16.0/smftools/preprocessing/filter_reads_on_cigar_indels.py +89 -0
  193. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/filter_reads_on_length_quality_mapping.py +82 -12
  194. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/flag_duplicate_reads.py +631 -490
  195. smftools-2.16.0/smftools/preprocessing/invert_adata.py +71 -0
  196. smftools-2.16.0/smftools/preprocessing/label_deaminase_pcr_chimeras.py +132 -0
  197. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/load_sample_sheet.py +7 -0
  198. smftools-2.16.0/smftools/preprocessing/partitioned_executor.py +1143 -0
  199. smftools-2.16.0/smftools/preprocessing/partitioned_plots.py +749 -0
  200. smftools-2.16.0/smftools/preprocessing/preprocess_umi_annotations.py +923 -0
  201. smftools-2.16.0/smftools/preprocessing/reindex_references_adata.py +180 -0
  202. smftools-2.16.0/smftools/preprocessing/umi_bipartite_analysis.py +186 -0
  203. smftools-2.16.0/smftools/project/__init__.py +9 -0
  204. smftools-2.16.0/smftools/project/catalog.py +829 -0
  205. smftools-2.16.0/smftools/project/embedding_store.py +406 -0
  206. smftools-2.16.0/smftools/project/reference_registry.py +112 -0
  207. smftools-2.16.0/smftools/project/registry.py +526 -0
  208. smftools-2.16.0/smftools/project/sample_analysis.py +253 -0
  209. smftools-2.16.0/smftools/project/sample_store.py +142 -0
  210. smftools-2.16.0/smftools/project/scaffold.py +272 -0
  211. smftools-2.16.0/smftools/project/set_store.py +169 -0
  212. {smftools-0.3.2 → smftools-2.16.0}/smftools/readwrite.py +655 -166
  213. {smftools-0.3.2 → smftools-2.16.0}/smftools/schema/anndata_schema_v1.yaml +49 -0
  214. smftools-2.16.0/smftools/tools/partitioned_hmm.py +1356 -0
  215. smftools-2.16.0/smftools/tools/partitioned_latent.py +682 -0
  216. smftools-2.16.0/smftools/tools/partitioned_spatial.py +1887 -0
  217. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/position_stats.py +76 -5
  218. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/read_stats.py +7 -4
  219. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/rolling_nn_distance.py +59 -6
  220. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/spatial_autocorrelation.py +4 -1
  221. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/tensor_factorization.py +5 -2
  222. smftools-2.16.0/tests/AGENTS.md +40 -0
  223. smftools-2.16.0/tests/__init__.py +8 -0
  224. smftools-2.16.0/tests/_test_inputs/parallel_dispatch/sample.bam +0 -0
  225. smftools-2.16.0/tests/_test_inputs/parallel_dispatch/sample.bam.bai +0 -0
  226. smftools-2.16.0/tests/_test_inputs/parallel_dispatch/sample.fasta +4 -0
  227. smftools-2.16.0/tests/_test_inputs/parallel_dispatch/sample.fasta.fai +2 -0
  228. smftools-2.16.0/tests/_test_inputs/parallel_dispatch/sample_extract.tsv.gz +0 -0
  229. {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/test_experiment_config_conversion_I.csv +12 -12
  230. {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/test_experiment_config_deaminase_I.csv +12 -12
  231. {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/test_experiment_config_direct_I.csv +14 -14
  232. smftools-2.16.0/tests/acceptance/partitioned_pipeline_criteria.json +51 -0
  233. smftools-2.16.0/tests/conftest.py +24 -0
  234. smftools-2.16.0/tests/e2e/cli/test_load_adata.py +43 -0
  235. smftools-2.16.0/tests/fixtures/__init__.py +1 -0
  236. smftools-2.16.0/tests/fixtures/partitioned_pipeline.py +143 -0
  237. smftools-2.16.0/tests/integration/informatics/test_modkit_extract_to_adata_parallel.py +228 -0
  238. smftools-2.16.0/tests/integration/test_resource_runtime.py +78 -0
  239. smftools-2.16.0/tests/unit/analysis/__init__.py +0 -0
  240. smftools-2.16.0/tests/unit/analysis/test_autocorrelation.py +211 -0
  241. smftools-2.16.0/tests/unit/analysis/test_dimensionality_reduction.py +82 -0
  242. smftools-2.16.0/tests/unit/analysis/test_hmm_features.py +105 -0
  243. smftools-2.16.0/tests/unit/analysis/test_ls_periodicity.py +220 -0
  244. smftools-2.16.0/tests/unit/analysis/test_obs_filters.py +175 -0
  245. smftools-2.16.0/tests/unit/analysis/test_pearson.py +101 -0
  246. smftools-2.16.0/tests/unit/analysis/test_position_filters.py +47 -0
  247. smftools-2.16.0/tests/unit/config/test_ExperimentConfig_skip_bam_qc.py +36 -0
  248. smftools-2.16.0/tests/unit/config/test_LoadExperimentConfig.py +209 -0
  249. smftools-2.16.0/tests/unit/config/test_hmm_device_default.py +42 -0
  250. smftools-2.16.0/tests/unit/config/test_hmm_plot_defaults.py +8 -0
  251. smftools-2.16.0/tests/unit/config/test_reindexing_offsets_default.py +47 -0
  252. smftools-2.16.0/tests/unit/config/test_spatial_read_metrics_config.py +33 -0
  253. smftools-2.16.0/tests/unit/hmm/test_fit_plan.py +125 -0
  254. smftools-2.16.0/tests/unit/hmm/test_model_artifacts.py +188 -0
  255. smftools-2.16.0/tests/unit/informatics/test_alignment_rescue.py +315 -0
  256. smftools-2.16.0/tests/unit/informatics/test_analysis_region_plan.py +153 -0
  257. smftools-2.16.0/tests/unit/informatics/test_bam_base_identities.py +218 -0
  258. smftools-2.16.0/tests/unit/informatics/test_bam_bi_sidecar.py +66 -0
  259. smftools-2.16.0/tests/unit/informatics/test_bam_qc.py +164 -0
  260. smftools-2.16.0/tests/unit/informatics/test_barcode_extraction.py +1419 -0
  261. smftools-2.16.0/tests/unit/informatics/test_barcode_labels.py +26 -0
  262. smftools-2.16.0/tests/unit/informatics/test_barcode_sidecar_dorado_reclassification.py +95 -0
  263. smftools-2.16.0/tests/unit/informatics/test_converted_sequence_encoding.py +45 -0
  264. smftools-2.16.0/tests/unit/informatics/test_derived_read_index.py +53 -0
  265. smftools-2.16.0/tests/unit/informatics/test_experiment_manifest.py +261 -0
  266. smftools-2.16.0/tests/unit/informatics/test_experiment_spine.py +216 -0
  267. smftools-2.16.0/tests/unit/informatics/test_fastq_export.py +158 -0
  268. smftools-2.16.0/tests/unit/informatics/test_incremental_zarr.py +118 -0
  269. smftools-2.16.0/tests/unit/informatics/test_modkit_demux_type_annotation_mode.py +31 -0
  270. smftools-2.16.0/tests/unit/informatics/test_modkit_loop_b_skip.py +18 -0
  271. smftools-2.16.0/tests/unit/informatics/test_modkit_max_workers.py +217 -0
  272. smftools-2.16.0/tests/unit/informatics/test_modkit_sequence_batch_files.py +74 -0
  273. smftools-2.16.0/tests/unit/informatics/test_modkit_tsv_split.py +67 -0
  274. smftools-2.16.0/tests/unit/informatics/test_molecule_identity.py +25 -0
  275. smftools-2.16.0/tests/unit/informatics/test_partition_query.py +206 -0
  276. smftools-2.16.0/tests/unit/informatics/test_partition_read.py +207 -0
  277. smftools-2.16.0/tests/unit/informatics/test_partition_store.py +127 -0
  278. smftools-2.16.0/tests/unit/informatics/test_plot_region_stitching.py +181 -0
  279. smftools-2.16.0/tests/unit/informatics/test_pod5_metadata.py +138 -0
  280. smftools-2.16.0/tests/unit/informatics/test_preprocess_x_fast_path.py +197 -0
  281. smftools-2.16.0/tests/unit/informatics/test_ragged_store.py +257 -0
  282. smftools-2.16.0/tests/unit/informatics/test_raw_store.py +469 -0
  283. smftools-2.16.0/tests/unit/informatics/test_reference_identity.py +25 -0
  284. smftools-2.16.0/tests/unit/informatics/test_region_catalog.py +278 -0
  285. smftools-2.16.0/tests/unit/informatics/test_sidecar_manifest.py +73 -0
  286. smftools-2.16.0/tests/unit/informatics/test_signal_features.py +133 -0
  287. smftools-2.16.0/tests/unit/informatics/test_stage_obs.py +89 -0
  288. smftools-2.16.0/tests/unit/informatics/test_storage_planner.py +44 -0
  289. smftools-2.16.0/tests/unit/informatics/test_strand_switch_metrics.py +83 -0
  290. smftools-2.16.0/tests/unit/informatics/test_umi_annotation.py +1095 -0
  291. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_append_variant_segment_layer.py +35 -0
  292. smftools-2.16.0/tests/unit/test_atomic_json_write.py +36 -0
  293. smftools-2.16.0/tests/unit/test_bitpack_utils.py +80 -0
  294. smftools-2.16.0/tests/unit/test_blas_thread_limiting.py +136 -0
  295. smftools-2.16.0/tests/unit/test_calculate_relative_risk_on_activity.py +50 -0
  296. smftools-2.16.0/tests/unit/test_clean_nan_callback.py +101 -0
  297. smftools-2.16.0/tests/unit/test_cli_artifact_helpers.py +94 -0
  298. smftools-2.16.0/tests/unit/test_cli_entry_batch_full.py +127 -0
  299. smftools-2.16.0/tests/unit/test_cli_entry_export_fastq.py +77 -0
  300. smftools-2.16.0/tests/unit/test_clustermap_pool_memory_guard.py +123 -0
  301. smftools-2.16.0/tests/unit/test_combined_hmm_length_clustermap_inverted_reference.py +68 -0
  302. smftools-2.16.0/tests/unit/test_combined_hmm_length_clustermap_outputs.py +86 -0
  303. smftools-2.16.0/tests/unit/test_combined_hmm_raw_clustermap_inverted_reference.py +63 -0
  304. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_combined_hmm_raw_clustermap_nan_fill.py +25 -12
  305. smftools-2.16.0/tests/unit/test_combined_hmm_raw_clustermap_read_span.py +68 -0
  306. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_combined_raw_clustermap_barplot_nan_ignore.py +2 -2
  307. smftools-2.16.0/tests/unit/test_combined_raw_clustermap_inverted_reference.py +65 -0
  308. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_combined_raw_clustermap_nan_fill.py +19 -3
  309. smftools-2.16.0/tests/unit/test_combined_raw_clustermap_read_span.py +67 -0
  310. smftools-2.16.0/tests/unit/test_dependency_profiles.py +73 -0
  311. smftools-2.16.0/tests/unit/test_duplicate_detection_dispatch.py +452 -0
  312. smftools-2.16.0/tests/unit/test_expand_bi_tag_columns.py +32 -0
  313. smftools-2.16.0/tests/unit/test_export_fastq.py +283 -0
  314. smftools-2.16.0/tests/unit/test_filter_reads_cigar_indels.py +101 -0
  315. smftools-2.16.0/tests/unit/test_filter_reads_length_thresholds.py +70 -0
  316. smftools-2.16.0/tests/unit/test_flag_duplicate_reads.py +364 -0
  317. smftools-2.16.0/tests/unit/test_flag_duplicate_reads_hierarchical_cap.py +84 -0
  318. smftools-2.16.0/tests/unit/test_flag_duplicate_reads_permutation_banding.py +85 -0
  319. smftools-2.16.0/tests/unit/test_full_recipe.py +207 -0
  320. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_hmm_clustermap_colormap.py +8 -1
  321. smftools-2.16.0/tests/unit/test_hmm_fit_em_log_likelihood.py +103 -0
  322. smftools-2.16.0/tests/unit/test_hmm_partitioned_cli.py +1068 -0
  323. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_hmm_variant_overlay_index_mapping.py +2 -4
  324. smftools-2.16.0/tests/unit/test_label_deaminase_pcr_chimeras.py +74 -0
  325. smftools-2.16.0/tests/unit/test_latent_partitioned_cli.py +318 -0
  326. smftools-2.16.0/tests/unit/test_load_sample_sheet.py +25 -0
  327. smftools-2.16.0/tests/unit/test_memory_guard.py +588 -0
  328. smftools-2.16.0/tests/unit/test_ordered_columns.py +59 -0
  329. smftools-2.16.0/tests/unit/test_partitioned_pipeline_acceptance_catalog.py +40 -0
  330. smftools-2.16.0/tests/unit/test_partitioned_pipeline_fixture.py +87 -0
  331. smftools-2.16.0/tests/unit/test_partitioned_plots_duplicate_diagnostics.py +45 -0
  332. smftools-2.16.0/tests/unit/test_partitioned_plots_swarm_overlay.py +44 -0
  333. smftools-2.16.0/tests/unit/test_partitioned_preprocess_executor.py +1382 -0
  334. smftools-2.16.0/tests/unit/test_perf_log.py +206 -0
  335. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_cp_sequence_components.py +1 -1
  336. smftools-2.16.0/tests/unit/test_plot_hmm_size_contours_index_col_suffix.py +92 -0
  337. smftools-2.16.0/tests/unit/test_plot_read_span_quality_clustermaps.py +128 -0
  338. smftools-2.16.0/tests/unit/test_plot_reference_barcode_chimera_rate.py +60 -0
  339. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_sequence_integer_encoding_clustermaps.py +40 -1
  340. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_variant_segment_clustermaps.py +47 -1
  341. smftools-2.16.0/tests/unit/test_plot_variant_segment_clustermaps_multi_obs.py +120 -0
  342. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_zero_hamming_pair_counts.py +1 -1
  343. smftools-2.16.0/tests/unit/test_preprocess_dispatch_plan.py +142 -0
  344. smftools-2.16.0/tests/unit/test_preprocess_umi_annotations.py +442 -0
  345. smftools-2.16.0/tests/unit/test_project_catalog.py +471 -0
  346. smftools-2.16.0/tests/unit/test_project_cli.py +379 -0
  347. smftools-2.16.0/tests/unit/test_project_embedding_store.py +183 -0
  348. smftools-2.16.0/tests/unit/test_project_registry.py +418 -0
  349. smftools-2.16.0/tests/unit/test_project_sample_analysis.py +214 -0
  350. smftools-2.16.0/tests/unit/test_project_sample_store.py +164 -0
  351. smftools-2.16.0/tests/unit/test_project_scaffold.py +71 -0
  352. smftools-2.16.0/tests/unit/test_project_set_store.py +112 -0
  353. smftools-2.16.0/tests/unit/test_qc_plotting_histograms.py +51 -0
  354. smftools-2.16.0/tests/unit/test_raw_adata.py +1090 -0
  355. smftools-2.16.0/tests/unit/test_raw_signal_features.py +96 -0
  356. smftools-2.16.0/tests/unit/test_reduce_read_modification_stats.py +135 -0
  357. smftools-2.16.0/tests/unit/test_reindex_references_adata.py +104 -0
  358. smftools-2.16.0/tests/unit/test_resource_envelope.py +139 -0
  359. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_rolling_nn_distance.py +99 -0
  360. smftools-2.16.0/tests/unit/test_spatial_partitioned_cli.py +188 -0
  361. smftools-2.16.0/tests/unit/test_stage_artifacts.py +112 -0
  362. smftools-2.16.0/tests/unit/test_stage_input.py +178 -0
  363. smftools-2.16.0/tests/unit/test_subsample_reads_for_plot.py +86 -0
  364. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_tensor_factorization.py +9 -1
  365. smftools-2.16.0/tests/unit/test_variant_adata_reindexing.py +99 -0
  366. smftools-2.16.0/tests/unit/test_variant_adata_umi_duplicate_plot_section.py +116 -0
  367. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/tools/test_calculate_umap.py +11 -0
  368. smftools-0.3.2/.readthedocs.yaml +0 -16
  369. smftools-0.3.2/AGENTS.md +0 -172
  370. smftools-0.3.2/PKG-INFO +0 -151
  371. smftools-0.3.2/README.md +0 -14
  372. smftools-0.3.2/docs/source/api/informatics.md +0 -44
  373. smftools-0.3.2/docs/source/api/tools.md +0 -20
  374. smftools-0.3.2/docs/source/basic_usage.md +0 -183
  375. smftools-0.3.2/docs/source/contributors.md +0 -9
  376. smftools-0.3.2/docs/source/dev/index.md +0 -3
  377. smftools-0.3.2/docs/source/installation.md +0 -89
  378. smftools-0.3.2/docs/source/release-notes/index.md +0 -35
  379. smftools-0.3.2/docs/source/requirements.txt +0 -16
  380. smftools-0.3.2/docs/source/tutorials/cli_usage.md +0 -136
  381. smftools-0.3.2/docs/source/tutorials/experiment_config.md +0 -52
  382. smftools-0.3.2/docs/source/tutorials/index.md +0 -13
  383. smftools-0.3.2/smftools/__init__.py +0 -60
  384. smftools-0.3.2/smftools/cli/helpers.py +0 -98
  385. smftools-0.3.2/smftools/cli/load_adata.py +0 -793
  386. smftools-0.3.2/smftools/cli/recipes.py +0 -26
  387. smftools-0.3.2/smftools/cli_entry.py +0 -423
  388. smftools-0.3.2/smftools/config/default.yaml +0 -449
  389. smftools-0.3.2/smftools/informatics/bam_functions.py +0 -1951
  390. smftools-0.3.2/smftools/informatics/modkit_extract_to_adata.py +0 -1901
  391. smftools-0.3.2/smftools/informatics/pod5_functions.py +0 -264
  392. smftools-0.3.2/smftools/informatics/run_multiqc.py +0 -37
  393. smftools-0.3.2/smftools/logging_utils.py +0 -70
  394. smftools-0.3.2/smftools/plotting/hmm_plotting.py +0 -1961
  395. smftools-0.3.2/smftools/plotting/preprocess_plotting.py +0 -281
  396. smftools-0.3.2/smftools/plotting/variant_plotting.py +0 -1231
  397. smftools-0.3.2/smftools/preprocessing/clean_NaN.py +0 -72
  398. smftools-0.3.2/smftools/preprocessing/invert_adata.py +0 -53
  399. smftools-0.3.2/smftools/preprocessing/reindex_references_adata.py +0 -103
  400. smftools-0.3.2/tests/__init__.py +0 -8
  401. smftools-0.3.2/tests/conftest.py +0 -13
  402. smftools-0.3.2/tests/e2e/cli/test_load_adata.py +0 -29
  403. smftools-0.3.2/tests/unit/config/test_LoadExperimentConfig.py +0 -20
  404. smftools-0.3.2/tests/unit/informatics/test_bam_base_identities.py +0 -81
  405. smftools-0.3.2/tests/unit/informatics/test_modkit_sequence_batch_files.py +0 -43
  406. smftools-0.3.2/tests/unit/test_combined_hmm_length_clustermap_outputs.py +0 -41
  407. smftools-0.3.2/tests/unit/test_plot_read_span_quality_clustermaps.py +0 -35
  408. {smftools-0.3.2 → smftools-2.16.0}/.gitattributes +0 -0
  409. {smftools-0.3.2 → smftools-2.16.0}/.pre-commit-config.yaml +0 -0
  410. {smftools-0.3.2 → smftools-2.16.0}/CLAUDE.md +0 -0
  411. {smftools-0.3.2 → smftools-2.16.0}/CONTRIBUTING.md +0 -0
  412. {smftools-0.3.2 → smftools-2.16.0}/LICENSE +0 -0
  413. {smftools-0.3.2 → smftools-2.16.0}/docs/Makefile +0 -0
  414. {smftools-0.3.2 → smftools-2.16.0}/docs/make.bat +0 -0
  415. {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/converted_BAM_to_adata.png +0 -0
  416. {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/modkit_extract_to_adata.png +0 -0
  417. {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/smftools-1.svg +0 -0
  418. {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/smftools-1.tif +0 -0
  419. {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/smftools_informatics_diagram.pdf +0 -0
  420. {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/smftools_informatics_diagram.png +0 -0
  421. {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/smftools_preprocessing_diagram.png +0 -0
  422. {smftools-0.3.2 → smftools-2.16.0}/docs/source/_templates/tmp +0 -0
  423. {smftools-0.3.2 → smftools-2.16.0}/docs/source/api/datasets.md +0 -0
  424. {smftools-0.3.2 → smftools-2.16.0}/docs/source/cli.md +0 -0
  425. {smftools-0.3.2 → smftools-2.16.0}/docs/source/index.md +0 -0
  426. {smftools-0.3.2 → smftools-2.16.0}/docs/source/references.bib +0 -0
  427. {smftools-0.3.2 → smftools-2.16.0}/docs/source/references.rst +0 -0
  428. {smftools-0.3.2 → smftools-2.16.0}/docs/source/release-notes/0.1.0.md +0 -0
  429. {smftools-0.3.2 → smftools-2.16.0}/docs/source/release-notes/0.1.1.md +0 -0
  430. {smftools-0.3.2 → smftools-2.16.0}/docs/source/release-notes/0.1.6.md +0 -0
  431. {smftools-0.3.2 → smftools-2.16.0}/docs/source/release-notes/0.2.1.md +0 -0
  432. {smftools-0.3.2 → smftools-2.16.0}/docs/source/release-notes/0.2.3.md +0 -0
  433. {smftools-0.3.2 → smftools-2.16.0}/docs/source/release-notes/0.3.0.md +0 -0
  434. {smftools-0.3.2 → smftools-2.16.0}/docs/source/schema/anndata_schema.md +0 -0
  435. {smftools-0.3.2 → smftools-2.16.0}/notebooks/Kissiov_and_McKenna_2025_example_notebook.ipynb +0 -0
  436. {smftools-0.3.2 → smftools-2.16.0}/smftools/_settings.py +0 -0
  437. {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/__init__.py +0 -0
  438. {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/archived/cli_flows.py +0 -0
  439. {smftools-0.3.2 → smftools-2.16.0}/smftools/config/__init__.py +0 -0
  440. {smftools-0.3.2 → smftools-2.16.0}/smftools/datasets/F1_hybrid_NKG2A_enhander_promoter_GpC_conversion_SMF.h5ad.gz +0 -0
  441. {smftools-0.3.2 → smftools-2.16.0}/smftools/datasets/__init__.py +0 -0
  442. {smftools-0.3.2 → smftools-2.16.0}/smftools/datasets/dCas9_m6A_invitro_kinetics.h5ad.gz +0 -0
  443. {smftools-0.3.2 → smftools-2.16.0}/smftools/datasets/datasets.py +0 -0
  444. {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/__init__.py +0 -0
  445. {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/archived/apply_hmm_batched.py +0 -0
  446. {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/archived/calculate_distances.py +0 -0
  447. {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/archived/call_hmm_peaks.py +0 -0
  448. {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/archived/train_hmm.py +0 -0
  449. {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/display_hmm.py +0 -0
  450. {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/hmm_readwrite.py +0 -0
  451. {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/nucleosome_hmm_refinement.py +0 -0
  452. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/bam_conversion.py +0 -0
  453. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/bam_direct.py +0 -0
  454. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/basecall_pod5s.py +0 -0
  455. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/basecalls_to_adata.py +0 -0
  456. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/conversion_smf.py +0 -0
  457. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/deaminase_smf.py +0 -0
  458. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/direct_smf.py +0 -0
  459. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/fast5_to_pod5.py +0 -0
  460. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/__init__.py +0 -0
  461. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/align_and_sort_BAM.py +0 -0
  462. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/aligned_BAM_to_bed.py +0 -0
  463. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/bam_qc.py +0 -0
  464. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/bed_to_bigwig.py +0 -0
  465. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/canoncall.py +0 -0
  466. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/concatenate_fastqs_to_bam.py +0 -0
  467. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/converted_BAM_to_adata.py +0 -0
  468. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/count_aligned_reads.py +0 -0
  469. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/demux_and_index_BAM.py +0 -0
  470. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/extract_base_identities.py +0 -0
  471. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/extract_mods.py +0 -0
  472. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/extract_read_features_from_bam.py +0 -0
  473. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/extract_read_lengths_from_bed.py +0 -0
  474. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/extract_readnames_from_BAM.py +0 -0
  475. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/find_conversion_sites.py +0 -0
  476. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/generate_converted_FASTA.py +0 -0
  477. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/get_chromosome_lengths.py +0 -0
  478. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/get_native_references.py +0 -0
  479. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/index_fasta.py +0 -0
  480. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/informatics.py +0 -0
  481. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/load_adata.py +0 -0
  482. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/make_modbed.py +0 -0
  483. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/modQC.py +0 -0
  484. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/modcall.py +0 -0
  485. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/ohe_batching.py +0 -0
  486. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/ohe_layers_decode.py +0 -0
  487. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/one_hot_decode.py +0 -0
  488. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/one_hot_encode.py +0 -0
  489. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/plot_bed_histograms.py +0 -0
  490. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/separate_bam_by_bc.py +0 -0
  491. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/split_and_index_BAM.py +0 -0
  492. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/print_bam_query_seq.py +0 -0
  493. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/subsample_fasta_from_bed.py +0 -0
  494. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/subsample_pod5.py +0 -0
  495. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/complement_base_list.py +0 -0
  496. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/fasta_functions.py +0 -0
  497. {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/ohe.py +0 -0
  498. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/__init__.py +0 -0
  499. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/data/__init__.py +0 -0
  500. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/data/anndata_data_module.py +0 -0
  501. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/data/preprocessing.py +0 -0
  502. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/evaluation/__init__.py +0 -0
  503. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/evaluation/eval_utils.py +0 -0
  504. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/evaluation/evaluators.py +0 -0
  505. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/inference/__init__.py +0 -0
  506. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/inference/inference_utils.py +0 -0
  507. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/inference/lightning_inference.py +0 -0
  508. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/inference/sklearn_inference.py +0 -0
  509. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/inference/sliding_window_inference.py +0 -0
  510. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/__init__.py +0 -0
  511. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/base.py +0 -0
  512. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/cnn.py +0 -0
  513. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/lightning_base.py +0 -0
  514. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/mlp.py +0 -0
  515. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/positional.py +0 -0
  516. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/rnn.py +0 -0
  517. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/sklearn_models.py +0 -0
  518. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/transformer.py +0 -0
  519. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/wrappers.py +0 -0
  520. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/training/__init__.py +0 -0
  521. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/training/train_lightning_model.py +0 -0
  522. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/training/train_sklearn_model.py +0 -0
  523. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/utils/__init__.py +0 -0
  524. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/utils/device.py +0 -0
  525. {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/utils/grl.py +0 -0
  526. {smftools-0.3.2 → smftools-2.16.0}/smftools/metadata.py +0 -0
  527. {smftools-0.3.2 → smftools-2.16.0}/smftools/optional_imports.py +0 -0
  528. {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/chimeric_plotting.py +0 -0
  529. {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/classifiers.py +0 -0
  530. {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/general_plotting.py +0 -0
  531. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/append_mismatch_frequency_sites.py +0 -0
  532. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/append_sequence_mismatch_annotations.py +0 -0
  533. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/archived/add_read_length_and_mapping_qc.py +0 -0
  534. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/archived/calculate_complexity.py +0 -0
  535. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/archived/mark_duplicates.py +0 -0
  536. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/archived/preprocessing.py +0 -0
  537. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/archived/remove_duplicates.py +0 -0
  538. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/binarize.py +0 -0
  539. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/binary_layers_to_ohe.py +0 -0
  540. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_complexity_II.py +0 -0
  541. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_consensus.py +0 -0
  542. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_coverage.py +0 -0
  543. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_pairwise_differences.py +0 -0
  544. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_pairwise_hamming_distances.py +0 -0
  545. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_read_length_stats.py +0 -0
  546. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_read_modification_stats.py +0 -0
  547. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/filter_adata_by_nan_proportion.py +0 -0
  548. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/filter_reads_on_modification_thresholds.py +0 -0
  549. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/make_dirs.py +0 -0
  550. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/min_non_diagonal.py +0 -0
  551. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/recipes.py +0 -0
  552. {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/subsample_adata.py +0 -0
  553. {smftools-0.3.2 → smftools-2.16.0}/smftools/schema/__init__.py +0 -0
  554. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/__init__.py +0 -0
  555. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/archived/apply_hmm.py +0 -0
  556. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/archived/classifiers.py +0 -0
  557. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/archived/classify_methylated_features.py +0 -0
  558. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/archived/classify_non_methylated_features.py +0 -0
  559. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/archived/subset_adata_v1.py +0 -0
  560. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/archived/subset_adata_v2.py +0 -0
  561. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/calculate_knn.py +0 -0
  562. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/calculate_leiden.py +0 -0
  563. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/calculate_nmf.py +0 -0
  564. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/calculate_pca.py +0 -0
  565. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/calculate_umap.py +0 -0
  566. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/cluster_adata_on_methylation.py +0 -0
  567. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/general_tools.py +0 -0
  568. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/sequence_alignment.py +0 -0
  569. {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/subset_adata.py +0 -0
  570. {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/_test_bed_I.bed +0 -0
  571. {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/_test_fasta_I.fa +0 -0
  572. {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/_test_fasta_I.fa.fai +0 -0
  573. {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/_test_pod5_I.pod5 +0 -0
  574. {smftools-0.3.2 → smftools-2.16.0}/tests/e2e/__init__.py +0 -0
  575. {smftools-0.3.2 → smftools-2.16.0}/tests/e2e/cli/test_spatial_adata.py +0 -0
  576. {smftools-0.3.2 → smftools-2.16.0}/tests/integration/__init__.py +0 -0
  577. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/__init__.py +0 -0
  578. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/cli/test_cli_imports.py +0 -0
  579. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/config/test_config_imports.py +0 -0
  580. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/datasets/test_datasets_imports.py +0 -0
  581. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/hmm/test_hmm_imports.py +0 -0
  582. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/import_helpers.py +0 -0
  583. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/informatics/test_informatics_imports.py +0 -0
  584. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/machine_learning/data/test_data_imports.py +0 -0
  585. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/machine_learning/evaluation/test_evaluation_imports.py +0 -0
  586. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/machine_learning/inference/test_inference_imports.py +0 -0
  587. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/machine_learning/models/test_models_imports.py +0 -0
  588. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/machine_learning/training/test_training_imports.py +0 -0
  589. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/machine_learning/utils/test_utils_imports.py +0 -0
  590. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/plotting/test_plotting_imports.py +0 -0
  591. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/preprocessing/test_preprocessing_imports.py +0 -0
  592. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/test_smftools_imports.py +0 -0
  593. {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/tools/test_tools_imports.py +0 -0
  594. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/__init__.py +0 -0
  595. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/datasets/test_datasets.py +0 -0
  596. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/hmm/test_mask_read_span.py +0 -0
  597. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/informatics/test_bam_read_tags.py +0 -0
  598. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/informatics/test_bam_secondary_supplementary.py +0 -0
  599. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/informatics/test_h5ad_secondary_supplementary.py +0 -0
  600. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/informatics/test_modkit_sequence_encoding.py +0 -0
  601. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/informatics/test_tool_backends.py +0 -0
  602. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_annotate_zero_hamming_segments_parent_layer.py +0 -0
  603. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_append_mismatch_frequency_sites.py +0 -0
  604. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_append_reference_strand_quality_stats.py +0 -0
  605. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_append_sequence_mismatch_annotations.py +0 -0
  606. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_calculate_nmf.py +0 -0
  607. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_chimeric_adata_mod_hamming_flag.py +0 -0
  608. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_chimeric_adata_span_layer.py +0 -0
  609. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_chimeric_adata_top_segments.py +0 -0
  610. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_combined_hmm_length_clustermap_barplot.py +0 -0
  611. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_latent_adata_var_filters.py +0 -0
  612. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_length_layer_subclass_mapping.py +0 -0
  613. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_metadata.py +0 -0
  614. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_methylation_fraction_nan_handling.py +0 -0
  615. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_hamming_span_trio.py +0 -0
  616. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_hmm_size_contours_feature_ranges.py +0 -0
  617. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_hmm_size_contours_nan_values.py +0 -0
  618. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_mismatch_base_frequency_by_position.py +0 -0
  619. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_nmf_components.py +0 -0
  620. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_pca_components.py +0 -0
  621. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_rolling_nn_and_layer.py +0 -0
  622. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_rolling_nn_and_two_layers.py +0 -0
  623. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_zero_hamming_span_and_layer.py +0 -0
  624. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_readwrite.py +0 -0
  625. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_variant_adata_overlay_config_forwarding.py +0 -0
  626. {smftools-0.3.2 → smftools-2.16.0}/tests/unit/tools/test_sequence_alignment.py +0 -0
@@ -0,0 +1,38 @@
1
+ FROM python:3.12-slim-bookworm
2
+
3
+ # System deps needed by pysam, pybedtools, htslib, etc.
4
+ RUN apt-get update && apt-get install -y --no-install-recommends \
5
+ build-essential \
6
+ git \
7
+ zlib1g-dev \
8
+ libbz2-dev \
9
+ liblzma-dev \
10
+ libcurl4-openssl-dev \
11
+ libssl-dev \
12
+ libdeflate-dev \
13
+ samtools \
14
+ bedtools \
15
+ && rm -rf /var/lib/apt/lists/*
16
+
17
+ # Create non-root user
18
+ ARG USERNAME=vscode
19
+ ARG USER_UID=1000
20
+ ARG USER_GID=$USER_UID
21
+ RUN groupadd --gid $USER_GID $USERNAME \
22
+ && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME
23
+
24
+ # Set up a venv so the editable install is isolated
25
+ RUN python -m venv /opt/venv \
26
+ && /opt/venv/bin/pip install --upgrade pip
27
+ ENV PATH="/opt/venv/bin:$PATH"
28
+
29
+ # Pre-install heavy deps so rebuilds are faster
30
+ COPY pyproject.toml README.md LICENSE /tmp/smftools/
31
+ RUN pip install --no-cache-dir \
32
+ "numpy>=1.22.0,<2" \
33
+ "scipy>=1.7.3" \
34
+ "torch>=1.9.0" \
35
+ "anndata>=0.10.0" \
36
+ "pysam>=0.19.1"
37
+
38
+ USER $USERNAME
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "smftools",
3
+ "build": {
4
+ "dockerfile": "Dockerfile",
5
+ "context": ".."
6
+ },
7
+ "customizations": {
8
+ "vscode": {
9
+ "settings": {
10
+ "python.defaultInterpreterPath": "/opt/venv/bin/python",
11
+ "python.testing.pytestEnabled": true,
12
+ "python.testing.pytestArgs": ["tests"],
13
+ "editor.formatOnSave": true,
14
+ "[python]": {
15
+ "editor.defaultFormatter": "charliermarsh.ruff",
16
+ "editor.codeActionsOnSave": {
17
+ "source.fixAll": "explicit",
18
+ "source.organizeImports": "explicit"
19
+ }
20
+ }
21
+ },
22
+ "extensions": [
23
+ "ms-python.python",
24
+ "ms-python.vscode-pylance",
25
+ "charliermarsh.ruff",
26
+ "ms-toolsai.jupyter"
27
+ ]
28
+ }
29
+ },
30
+ "postCreateCommand": "pip install -e '.[all,dev]'",
31
+ "remoteUser": "vscode"
32
+ }
@@ -26,7 +26,7 @@ jobs:
26
26
  - name: Install dependencies
27
27
  run: |
28
28
  python -m pip install --upgrade pip
29
- python -m pip install "ruff==0.8.6"
29
+ python -m pip install "ruff==0.15.0"
30
30
  - name: Check formatting with ruff
31
31
  run: ruff format --check .
32
32
 
@@ -45,38 +45,62 @@ jobs:
45
45
  - name: Install dependencies
46
46
  run: |
47
47
  python -m pip install --upgrade pip
48
- python -m pip install "ruff==0.8.6"
48
+ python -m pip install "ruff==0.15.0"
49
49
  - name: Lint with ruff
50
50
  run: ruff check --output-format=github .
51
51
 
52
52
  pytest:
53
53
  runs-on: ubuntu-latest
54
+ timeout-minutes: 30
54
55
  strategy:
55
56
  fail-fast: false
56
57
  matrix:
57
- python-version: ["3.10", "3.12"]
58
+ python-version: ["3.11", "3.12"]
58
59
  steps:
59
60
  - uses: actions/checkout@v4
60
61
  - uses: actions/setup-python@v5
61
62
  with:
62
63
  python-version: ${{ matrix.python-version }}
63
64
  cache: pip
64
- - name: Install system deps for pysam
65
- run: |
66
- sudo apt-get update
67
- sudo apt-get install -y \
68
- build-essential \
69
- zlib1g-dev \
70
- libbz2-dev \
71
- liblzma-dev \
72
- libcurl4-openssl-dev \
73
- pkg-config
74
65
  - name: Install dependencies
75
66
  run: |
76
67
  python -m pip install --upgrade pip
77
- python -m pip install .[dev,torch,plotting]
78
- - name: Run pytest
79
- run: pytest -m "smoke" -q
68
+ python -m pip install ".[all]"
69
+ python -m pip install --group test
70
+ - name: Run Python 3.11 smoke compatibility tests
71
+ if: matrix.python-version == '3.11'
72
+ run: pytest -m smoke -q
73
+ - name: Run Python 3.12 smoke and unit tests
74
+ if: matrix.python-version == '3.12'
75
+ run: pytest -m "smoke or unit" -vv --durations=30
76
+
77
+ storage-minimums:
78
+ runs-on: ubuntu-latest
79
+ steps:
80
+ - uses: actions/checkout@v4
81
+ - uses: actions/setup-python@v5
82
+ with:
83
+ python-version: "3.11"
84
+ cache: pip
85
+ - name: Install minimum supported storage stack
86
+ run: |
87
+ python -m pip install --upgrade pip
88
+ python -m pip install \
89
+ "anndata==0.12.0" \
90
+ "biopython>=1.79" \
91
+ "zarr==3.1.0" \
92
+ "pyarrow==15.0.0" \
93
+ "pandas==2.1.0" \
94
+ "psutil>=5.9.0"
95
+ python -m pip install --group test
96
+ python -m pip install --no-deps .
97
+ - name: Test minimum supported storage stack
98
+ run: |
99
+ pytest -q \
100
+ tests/unit/informatics/test_incremental_zarr.py \
101
+ tests/unit/informatics/test_partition_read.py \
102
+ tests/unit/informatics/test_raw_store.py \
103
+ tests/unit/test_partitioned_pipeline_fixture.py
80
104
 
81
105
  docs:
82
106
  runs-on: ubuntu-latest
@@ -92,7 +116,8 @@ jobs:
92
116
  - name: Install docs deps
93
117
  run: |
94
118
  python -m pip install --upgrade pip
95
- python -m pip install .[docs]
119
+ python -m pip install --group docs
120
+ python -m pip install --no-deps .
96
121
  - name: Build docs
97
122
  run: sphinx-build -W -b html docs/source docs/_build/html
98
123
 
@@ -101,7 +126,7 @@ jobs:
101
126
  strategy:
102
127
  fail-fast: false
103
128
  matrix:
104
- python-version: ["3.10", "3.11", "3.12"]
129
+ python-version: ["3.11", "3.12"]
105
130
  steps:
106
131
  - uses: actions/checkout@v4
107
132
  - uses: actions/setup-python@v5
@@ -0,0 +1,48 @@
1
+ name: Extended CI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ schedule:
6
+ - cron: "17 9 * * 1"
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ minimum-python-unit:
17
+ runs-on: ubuntu-latest
18
+ timeout-minutes: 30
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ - uses: actions/setup-python@v5
22
+ with:
23
+ python-version: "3.11"
24
+ cache: pip
25
+ - name: Install dependencies
26
+ run: |
27
+ python -m pip install --upgrade pip
28
+ python -m pip install ".[all]"
29
+ python -m pip install --group test
30
+ - name: Run smoke and unit tests
31
+ run: pytest -m "smoke or unit" -q
32
+
33
+ integration:
34
+ runs-on: ubuntu-latest
35
+ timeout-minutes: 20
36
+ steps:
37
+ - uses: actions/checkout@v4
38
+ - uses: actions/setup-python@v5
39
+ with:
40
+ python-version: "3.12"
41
+ cache: pip
42
+ - name: Install dependencies
43
+ run: |
44
+ python -m pip install --upgrade pip
45
+ python -m pip install ".[all]"
46
+ python -m pip install --group test
47
+ - name: Run integration tests
48
+ run: pytest -m integration -q
@@ -0,0 +1,67 @@
1
+ name: Partitioned Pipeline Acceptance
2
+
3
+ on:
4
+ pull_request:
5
+ branches: ["main"]
6
+ paths:
7
+ - ".github/workflows/partitioned-acceptance.yml"
8
+ - "src/smftools/config/**"
9
+ - "src/smftools/informatics/**"
10
+ - "src/smftools/memory_guard.py"
11
+ - "src/smftools/project/**"
12
+ - "tests/acceptance/**"
13
+ - "tests/fixtures/partitioned_pipeline.py"
14
+ - "tests/integration/test_resource_runtime.py"
15
+ - "tests/unit/test_partitioned_pipeline_acceptance_catalog.py"
16
+ - "tests/unit/test_partitioned_pipeline_fixture.py"
17
+ - "tests/unit/test_resource_envelope.py"
18
+ - "tests/unit/config/test_LoadExperimentConfig.py"
19
+ workflow_dispatch:
20
+
21
+ permissions:
22
+ contents: read
23
+
24
+ concurrency:
25
+ group: ${{ github.workflow }}-${{ github.ref }}
26
+ cancel-in-progress: true
27
+
28
+ jobs:
29
+ portable-storage-config-query:
30
+ name: Portable storage/config/query (${{ matrix.os }})
31
+ runs-on: ${{ matrix.os }}
32
+ timeout-minutes: 20
33
+ strategy:
34
+ fail-fast: false
35
+ matrix:
36
+ os: [macos-latest, windows-latest]
37
+ steps:
38
+ - uses: actions/checkout@v4
39
+ - uses: actions/setup-python@v5
40
+ with:
41
+ python-version: "3.11"
42
+ cache: pip
43
+ - name: Install portable storage test stack
44
+ run: python -m pip install --upgrade pip && python -m pip install "anndata==0.12.0" "biopython>=1.79" "zarr==3.1.0" "pyarrow==15.0.0" "pandas==2.1.0" "psutil>=5.9.0" "dask[array]" click pyyaml xarray && python -m pip install --group test && python -m pip install --no-deps .
45
+ - name: Run portable acceptance checks
46
+ run: python -m pytest -q tests/unit/test_partitioned_pipeline_acceptance_catalog.py tests/unit/test_partitioned_pipeline_fixture.py tests/unit/informatics/test_partition_query.py tests/unit/test_resource_envelope.py tests/integration/test_resource_runtime.py tests/unit/config/test_LoadExperimentConfig.py -k "var_dict or region_catalog_config_defaults_are_independent or invalid_resource_values or partitioned_pipeline or partition_query or resource_envelope or resource_runtime"
47
+
48
+ linux-resource-runtime:
49
+ name: Linux cgroup capability and fallback
50
+ runs-on: ubuntu-latest
51
+ timeout-minutes: 10
52
+ steps:
53
+ - uses: actions/checkout@v4
54
+ - uses: actions/setup-python@v5
55
+ with:
56
+ python-version: "3.11"
57
+ cache: pip
58
+ - name: Install resource test stack
59
+ run: python -m pip install --upgrade pip && python -m pip install "anndata==0.12.0" "biopython>=1.79" "zarr==3.1.0" "pyarrow==15.0.0" "pandas==2.1.0" "psutil>=5.9.0" && python -m pip install --group test && python -m pip install --no-deps .
60
+ - name: Record cgroup mount and delegation
61
+ shell: bash
62
+ run: |
63
+ test -r /proc/self/cgroup && sed -n '1,20p' /proc/self/cgroup
64
+ test -r /sys/fs/cgroup/cgroup.controllers && sed -n '1,20p' /sys/fs/cgroup/cgroup.controllers || true
65
+ test -r /sys/fs/cgroup/cgroup.subtree_control && sed -n '1,20p' /sys/fs/cgroup/cgroup.subtree_control || true
66
+ - name: Test cgroup activation or explicit fallback
67
+ run: python -m pytest -q tests/integration/test_resource_runtime.py tests/unit/test_resource_envelope.py
@@ -1,3 +1,6 @@
1
+ # Claude Code local state
2
+ .claude/
3
+
1
4
  # Python
2
5
  __pycache__/
3
6
 
@@ -54,3 +57,4 @@ Thumbs.db
54
57
  htmlcov/
55
58
 
56
59
  # Docs
60
+ .aider*
@@ -0,0 +1,16 @@
1
+ version: 2
2
+ build:
3
+ os: ubuntu-22.04
4
+ tools:
5
+ python: "3.12"
6
+ jobs:
7
+ post_install:
8
+ - python -m pip install --upgrade pip
9
+ - python -m pip install --group docs
10
+ - python -m pip install --no-deps .
11
+ sphinx:
12
+ configuration: docs/source/conf.py
13
+ fail_on_warning: true
14
+ submodules:
15
+ include: all
16
+ recursive: true
@@ -0,0 +1,162 @@
1
+ # AGENTS.md - root
2
+
3
+ You are the implementation agent defined in smftools/AGENTS.md
4
+
5
+ - For AGENTS.md or CLAUDE.md files (this one, and any nested ones under `src/`, `docs/`, `tests/`):
6
+ - Agents can read from these files.
7
+ - Agents can never edit these files.
8
+
9
+ ## Goals
10
+ - Make minimal, correct changes.
11
+ - Prefer small PRs / diffs.
12
+ - Keep behavior stable unless the task explicitly requests changes.
13
+ - Generate production grade, scalable code.
14
+
15
+ ## Prompt interface
16
+ - When asked about a problem or task, first read all files relevent to the task's scope.
17
+ - Describe the problem given the context.
18
+ - Formulate a plan to address the problem within scope.
19
+ - Refine the plan with user input.
20
+ - Implement code after being told to proceed.
21
+
22
+ ## Repo orientation
23
+ - Read existing patterns before inventing new ones.
24
+ - Don't refactor broadly unless asked.
25
+ - If you're unsure about intended behavior, look for tests or docs first.
26
+ - Ignore all files in any directory named "archived".
27
+ - User defined parameters exist within src/smftools/config.
28
+ - Parameters are inherited from default.yaml -> MODALITY.yaml -> user_defined_config.csv
29
+ - Frequently used non user defined variables should exist within src/smftools/constants.py
30
+ - Logging functionality is defined within src/smftools/logging_utils.py
31
+ - Optional dependency handling is defined within src/smftools/optional_imports.py
32
+ - Frequently used I/O functionality is defined within src/smftools/readwrite.py
33
+ - CLI functionality is provided through click; see src/smftools/cli/AGENTS.md for the command
34
+ map and conventions before editing anything under src/smftools/cli/.
35
+ - RTD documentation organization through smftools/docs; see docs/source/AGENTS.md before editing
36
+ docstrings or anything under docs/.
37
+ - Pytest testing within smftools/tests; see tests/AGENTS.md for markers and known gotchas before
38
+ running or writing tests.
39
+ - smftools.analysis (downstream analysis library) has its own design contract at
40
+ src/smftools/analysis/AGENTS.md — read it before adding to compute/plot/filters/config.
41
+ - Nested AGENTS.md/CLAUDE.md files exist to keep this file from re-growing per-subpackage detail.
42
+ If you find yourself wanting to document something specific to one subpackage here, it
43
+ probably belongs in that subpackage's own file instead (create one if it doesn't exist, and
44
+ flag it to the user since agents can't create AGENTS.md/CLAUDE.md files themselves).
45
+
46
+ ## Project dependencies
47
+ - A core set of dependencies is required for the project.
48
+ - Various optional dependencies are provided for:
49
+ - Optional functional modules of the package (ont, plotting, ml-base, ml-extended, umap, qc,
50
+ pysam, catalog, cluster, ...) — see pyproject.toml's [project.optional-dependencies] for
51
+ the full, current list; do not enumerate it here, it changes often.
52
+ - If available, a Python version of a CLI tool is preferred (Such as for Samtools, Bedtools,
53
+ BedGraphToBigWig).
54
+ - torch is listed as an extra dependency, but is currently required.
55
+ - All functional extras can be installed with `pip install -e ".[all_2]"` (the more complete
56
+ of two overlapping "everything" extras — `all` predates `pybedtools`/`pyBigWig` being added
57
+ and is missing them; prefer `all_2`). See Setup below for the canonical dev venv this
58
+ produces.- Certain command line tools are currently needed for certain functionalities within smftools load:
59
+ - dorado: Used for nanopore basecalling from POD5/FAST5 files to BAM.
60
+ - dorado/minimap2: Used for alignment of reads to reference.
61
+ - dorado: Used for demultiplexing of nanopore derived BAMs.
62
+ - modkit: Used for extracting modification probabilities from MM/ML BAM tags for native smf modality.
63
+
64
+ ## Setup
65
+
66
+ Which interpreter to use, in priority order:
67
+
68
+ 1. **User- or task-specified venv/interpreter** — if one is given, use it, full stop.
69
+ 2. **The currently active environment**, if it already satisfies what the task needs (e.g. it's
70
+ already running with the right packages importable) — don't switch environments just because
71
+ a canonical one exists.
72
+ 3. **`venvs/venv-all`** — the canonical, fully-provisioned dev venv (editable install, every
73
+ functional extra: `pip install -e ".[all_2,dev,docs]"`). This is the default when neither of
74
+ the above applies. Being editable, it always reflects whatever branch is currently checked
75
+ out — it does not need to be recreated per branch, only re-installed
76
+ (`venvs/venv-all/bin/pip install -e ".[all_2,dev,docs]"`) if `pyproject.toml`'s dependencies
77
+ changed since it was last built.
78
+
79
+ If `venvs/venv-all` doesn't exist yet or a narrower environment is wanted, create one:
80
+ - `python3 -m venv venvs/<name> && venvs/<name>/bin/pip install -e ".[dev,torch]"` (core +
81
+ dev/test tooling), then add extras as needed: `venvs/<name>/bin/pip install -e ".[EXTRA_NAME]"`.
82
+
83
+ **Common trap**: a venv/interpreter that's missing an optional extra (e.g. `pod5`, `pysam`,
84
+ `umap`) will fail *test collection*, not just individual tests, for any file that imports it
85
+ at module level — this looks like a code regression but usually isn't. Before debugging, check
86
+ which interpreter you're actually running and whether it has the extras the failing files need.
87
+ `venvs/venv-all` exists specifically to make this class of bug not happen in the first place.
88
+
89
+ ## How to run checks
90
+ - Smoke tests: `pytest -m smoke -q`
91
+ - Unit tests: `pytest -m unit -q`
92
+ - Integration tests: `pytest -m integration -q`
93
+ - E2E tests: `pytest -m e2e -q`
94
+ - Coverage (if configured): `pytest --cov`
95
+ - Lint: `ruff check .`
96
+ - Format: `ruff format .`
97
+ - Type-check (if configured): `mypy .`
98
+ - **Docs build** (before committing anything that touches a docstring or `docs/`):
99
+ `sphinx-build -W -b html docs/source docs/_build/html`. `-W` treats warnings as errors, matching
100
+ CI's `docs` job and Read the Docs' `fail_on_warning: true` — a docstring that imports fine can
101
+ still fail this. See docs/source/AGENTS.md for the specific pitfalls that trip this up.
102
+
103
+ ## Coding conventions
104
+ - Follow existing style and module layout.
105
+ - Prefer clear, explicit code over cleverness.
106
+ - Prefer modular functionality to facilitate testing and future development.
107
+ - Do not over-parametize functions when possible.
108
+ - For function parameters that a user may want to tune, use the config management strategy.
109
+ - Use constants.py when appropriate.
110
+ - Annotate code blocks to describe functionality.
111
+ - Add/adjust tests for bug fixes and new behavior.
112
+ - Keep public APIs backward compatible unless explicitly changing them.
113
+ - Python:
114
+ - Use type hints for new/modified functions where reasonable.
115
+ - Use Google style docstring format.
116
+ - Avoid heavy dependencies unless necessary.
117
+ - Use typing.TYPE_CHECKING and annotations.
118
+ - In docstring of new functions, define the purpose of the function and what it does.
119
+ - If a function's return-type annotation (or any forward-referenced type) names a symbol that
120
+ is only ever imported inside a `TYPE_CHECKING` block, that symbol's *top-level package* must
121
+ also be in `docs/source/conf.py`'s `autodoc_mock_imports` — otherwise the docs build breaks
122
+ even though the code runs fine. See docs/source/AGENTS.md.
123
+
124
+ ## Testing expectations
125
+ - New functionality must include tests.
126
+ - If tests are flaky or slow, note it and scope the change.
127
+ - There is currently no "regression" test marker/category, despite the concept coming up in
128
+ practice — if you need one, propose it explicitly rather than assuming a convention exists.
129
+
130
+ ## Logging & secrets
131
+ - Don't log secrets, tokens, or PII.
132
+ - Never hardcode credentials.
133
+ - If sample keys are needed, use obvious placeholders like `YOUR_API_KEY_HERE`.
134
+
135
+ ## Git / PR hygiene
136
+ - Keep commits focused.
137
+ - Update docs/changelog if behavior or user-facing CLI changes.
138
+ - If you change a CLI flag or config schema, add a migration note.
139
+ - Feature/fix identity is decoupled from release versions. Branch names describe the work, not a
140
+ planned version slot: `feature/<description>` or `fix/<description>`, cut from `main`. Do not
141
+ bump `src/smftools/_version.py` on these branches — that happens only on a release branch (see
142
+ below), which avoids merge conflicts when multiple feature branches are in flight and lets them
143
+ merge into `main` in whatever order they're ready, not a predetermined sequence.
144
+ - `main`'s `_version.py` carries a `.devN` suffix between releases (e.g. `2.16.0.dev0`) so its
145
+ version string is always distinguishable from an actual release. Hatch reads this directly, so
146
+ `.devN` is a valid build version, not just a convention.
147
+ - To cut a release: create `release/<version>` from `main`, set `_version.py` to the plain
148
+ `MAJOR.MINOR.PATCH` (no `.devN`), add `docs/source/release-notes/<version>.md` (summarize
149
+ `git log <prev-tag>..HEAD` — one to a few sentences, matching the terse style of existing
150
+ entries in that directory) and add its `{include}` block to `docs/source/release-notes/index.md`,
151
+ then run `python -m build && twine check dist/*` as a local sanity check. After that branch
152
+ merges to `main`, tag the resulting merge commit locally (`git tag -a vMAJOR.MINOR.PATCH -m
153
+ "..."`), then bump `main`'s `_version.py` to the next `MAJOR.MINOR.PATCH.dev0`.
154
+ - A minor release does not need to correspond to exactly one feature — bundle whatever's ready
155
+ when the release branch is cut. Patch releases (`MAJOR.MINOR.PATCH+1`) are for bugfix-only
156
+ follow-ups to an already-tagged release; breaking changes bump `MAJOR`.
157
+ - Do not push tags, delete branches, merge PRs, or publish build artifacts without explicit
158
+ confirmation each time — these are shared-state/irreversible actions on a public repo.
159
+
160
+ ## If something fails
161
+ - If a command fails, paste the full error and summarize likely causes.
162
+ - Don't "fix" by deleting tests or weakening assertions unless explicitly instructed.