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.
- smftools-2.16.0/.devcontainer/Dockerfile +38 -0
- smftools-2.16.0/.devcontainer/devcontainer.json +32 -0
- {smftools-0.3.2 → smftools-2.16.0}/.github/workflows/ci.yml +43 -18
- smftools-2.16.0/.github/workflows/extended-ci.yml +48 -0
- smftools-2.16.0/.github/workflows/partitioned-acceptance.yml +67 -0
- {smftools-0.3.2 → smftools-2.16.0}/.gitignore +4 -0
- smftools-2.16.0/.readthedocs.yaml +16 -0
- smftools-2.16.0/AGENTS.md +162 -0
- smftools-2.16.0/PKG-INFO +273 -0
- smftools-2.16.0/README.md +81 -0
- smftools-2.16.0/docs/source/AGENTS.md +85 -0
- smftools-2.16.0/docs/source/api/analysis.md +71 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/api/index.md +2 -0
- smftools-2.16.0/docs/source/api/informatics.md +81 -0
- smftools-2.16.0/docs/source/api/plotting.md +34 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/api/preprocessing.md +13 -0
- smftools-2.16.0/docs/source/api/tools.md +33 -0
- smftools-2.16.0/docs/source/basic_usage.md +332 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/conf.py +9 -9
- smftools-2.16.0/docs/source/contributors.md +11 -0
- smftools-2.16.0/docs/source/dev/index.md +51 -0
- smftools-2.16.0/docs/source/installation.md +97 -0
- smftools-2.16.0/docs/source/release-notes/0.1.2.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.1.3.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.1.4.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.1.5.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.1.7.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.2.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.2.2.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.2.4.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.2.5.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.3.1.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.3.2.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.4.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.4.1.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.4.2.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.4.3.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.4.4.md +4 -0
- smftools-2.16.0/docs/source/release-notes/0.4.5.md +4 -0
- smftools-2.16.0/docs/source/release-notes/1.0.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/1.1.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.0.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.1.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.10.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.11.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.12.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.13.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.14.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.15.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.16.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.2.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.3.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.4.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.5.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.6.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.7.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.8.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/2.9.0.md +4 -0
- smftools-2.16.0/docs/source/release-notes/index.md +213 -0
- smftools-2.16.0/docs/source/tutorials/cli_usage.md +358 -0
- smftools-2.16.0/docs/source/tutorials/directory_organization.md +280 -0
- smftools-2.16.0/docs/source/tutorials/experiment_config.md +184 -0
- smftools-2.16.0/docs/source/tutorials/index.md +15 -0
- {smftools-0.3.2 → smftools-2.16.0}/experiment_config.csv +13 -13
- {smftools-0.3.2 → smftools-2.16.0}/notebooks/Kissiov_and_McKenna_2025_sample_sheet.csv +10 -10
- {smftools-0.3.2 → smftools-2.16.0}/pyproject.toml +183 -47
- {smftools-0.3.2 → smftools-2.16.0}/requirements.txt +1 -1
- {smftools-0.3.2 → smftools-2.16.0}/sample_sheet.csv +10 -10
- smftools-2.16.0/smftools/__init__.py +95 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/_version.py +1 -1
- smftools-2.16.0/smftools/analysis/AGENTS.md +103 -0
- smftools-2.16.0/smftools/analysis/__init__.py +19 -0
- smftools-2.16.0/smftools/analysis/compute/__init__.py +18 -0
- smftools-2.16.0/smftools/analysis/compute/autocorrelation.py +320 -0
- smftools-2.16.0/smftools/analysis/compute/dimensionality_reduction.py +226 -0
- smftools-2.16.0/smftools/analysis/compute/ep_classification.py +122 -0
- smftools-2.16.0/smftools/analysis/compute/hmm_features.py +79 -0
- smftools-2.16.0/smftools/analysis/compute/ls_periodicity.py +379 -0
- smftools-2.16.0/smftools/analysis/compute/metrics_store.py +89 -0
- smftools-2.16.0/smftools/analysis/compute/ml_cnn.py +507 -0
- smftools-2.16.0/smftools/analysis/compute/ml_metrics.py +215 -0
- smftools-2.16.0/smftools/analysis/compute/ml_splits.py +112 -0
- smftools-2.16.0/smftools/analysis/compute/pearson.py +58 -0
- smftools-2.16.0/smftools/analysis/compute/read_cache.py +398 -0
- smftools-2.16.0/smftools/analysis/config/__init__.py +11 -0
- smftools-2.16.0/smftools/analysis/config/hmm_histogram.py +83 -0
- smftools-2.16.0/smftools/analysis/filters/__init__.py +10 -0
- smftools-2.16.0/smftools/analysis/filters/obs_filters.py +113 -0
- smftools-2.16.0/smftools/analysis/filters/position_filters.py +39 -0
- smftools-2.16.0/smftools/analysis/plot/__init__.py +14 -0
- smftools-2.16.0/smftools/analysis/plot/autocorr.py +465 -0
- smftools-2.16.0/smftools/analysis/plot/embeddings.py +632 -0
- smftools-2.16.0/smftools/analysis/plot/heatmaps.py +66 -0
- smftools-2.16.0/smftools/analysis/plot/histograms.py +267 -0
- smftools-2.16.0/smftools/analysis/plot/locus.py +9 -0
- smftools-2.16.0/smftools/analysis/plot/ml.py +133 -0
- smftools-2.16.0/smftools/cli/AGENTS.md +72 -0
- smftools-2.16.0/smftools/cli/batch.py +162 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/chimeric_adata.py +51 -41
- smftools-2.16.0/smftools/cli/export_fastq.py +262 -0
- smftools-2.16.0/smftools/cli/helpers.py +626 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/hmm_adata.py +516 -148
- {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/latent_adata.py +104 -59
- smftools-2.16.0/smftools/cli/load_adata.py +1654 -0
- smftools-2.16.0/smftools/cli/plot_current.py +64 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/preprocess_adata.py +365 -123
- smftools-2.16.0/smftools/cli/project_cmd.py +171 -0
- smftools-2.16.0/smftools/cli/raw_adata.py +1661 -0
- smftools-2.16.0/smftools/cli/recipes.py +168 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/spatial_adata.py +194 -72
- smftools-2.16.0/smftools/cli/stage_artifacts.py +227 -0
- smftools-2.16.0/smftools/cli/stage_input.py +134 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/variant_adata.py +332 -38
- smftools-2.16.0/smftools/cli_entry.py +881 -0
- smftools-2.16.0/smftools/config/barcodes/SQK-NBD114-24.yaml +35 -0
- smftools-2.16.0/smftools/config/barcodes/SQK-NBD114-96.yaml +107 -0
- smftools-2.16.0/smftools/config/barcodes/SQK-RBK114-24.yaml +35 -0
- smftools-2.16.0/smftools/config/barcodes/SQK-RBK114-96.yaml +113 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/config/conversion.yaml +9 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/config/deaminase.yaml +13 -4
- smftools-2.16.0/smftools/config/default.yaml +644 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/config/direct.yaml +11 -1
- {smftools-0.3.2 → smftools-2.16.0}/smftools/config/discover_input_files.py +1 -1
- {smftools-0.3.2 → smftools-2.16.0}/smftools/config/experiment_config.py +968 -76
- smftools-2.16.0/smftools/config/umis/dual-nextera-12.yaml +9 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/constants.py +115 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/datasets/F1_sample_sheet.csv +4 -4
- {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/HMM.py +139 -97
- {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/call_hmm_peaks.py +3 -84
- smftools-2.16.0/smftools/hmm/fit_plan.py +310 -0
- smftools-2.16.0/smftools/hmm/model_artifacts.py +389 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/__init__.py +5 -0
- smftools-2.16.0/smftools/informatics/alignment_rescue.py +268 -0
- smftools-2.16.0/smftools/informatics/analysis_region_plan.py +287 -0
- smftools-2.16.0/smftools/informatics/artifact_paths.py +33 -0
- smftools-2.16.0/smftools/informatics/bam_functions.py +5087 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/basecalling.py +16 -7
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/bed_functions.py +7 -1
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/binarize_converted_base_identities.py +10 -10
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/converted_BAM_to_adata.py +380 -184
- smftools-2.16.0/smftools/informatics/derived_read_index.py +126 -0
- smftools-2.16.0/smftools/informatics/experiment_manifest.py +352 -0
- smftools-2.16.0/smftools/informatics/experiment_spine.py +105 -0
- smftools-2.16.0/smftools/informatics/fastq_export.py +150 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/h5ad_functions.py +204 -21
- smftools-2.16.0/smftools/informatics/incremental_zarr.py +125 -0
- smftools-2.16.0/smftools/informatics/modkit_extract_to_adata.py +2879 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/modkit_functions.py +13 -6
- smftools-2.16.0/smftools/informatics/molecule_identity.py +71 -0
- smftools-2.16.0/smftools/informatics/partition_query.py +241 -0
- smftools-2.16.0/smftools/informatics/partition_read.py +1081 -0
- smftools-2.16.0/smftools/informatics/partition_store.py +665 -0
- smftools-2.16.0/smftools/informatics/physical_layout.py +45 -0
- smftools-2.16.0/smftools/informatics/plot_region_stitching.py +405 -0
- smftools-2.16.0/smftools/informatics/pod5_functions.py +555 -0
- smftools-2.16.0/smftools/informatics/ragged_store.py +667 -0
- smftools-2.16.0/smftools/informatics/raw_store.py +782 -0
- smftools-2.16.0/smftools/informatics/reference_identity.py +32 -0
- smftools-2.16.0/smftools/informatics/region_catalog.py +520 -0
- smftools-2.16.0/smftools/informatics/run_multiqc.py +65 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/sequence_encoding.py +16 -0
- smftools-2.16.0/smftools/informatics/sidecar_manifest.py +95 -0
- smftools-2.16.0/smftools/informatics/signal_features.py +206 -0
- smftools-2.16.0/smftools/informatics/stage_obs.py +91 -0
- smftools-2.16.0/smftools/informatics/storage_planner.py +110 -0
- smftools-2.16.0/smftools/logging_utils.py +226 -0
- smftools-2.16.0/smftools/memory_guard.py +1275 -0
- smftools-2.16.0/smftools/parallel_utils.py +96 -0
- smftools-2.16.0/smftools/perf_log.py +490 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/__init__.py +4 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/autocorrelation_plotting.py +9 -2
- smftools-2.16.0/smftools/plotting/hmm_plotting.py +2401 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/latent_plotting.py +43 -6
- {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/plotting_utils.py +124 -7
- smftools-2.16.0/smftools/plotting/pod5_plotting.py +463 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/position_stats.py +6 -3
- smftools-2.16.0/smftools/plotting/preprocess_plotting.py +440 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/qc_plotting.py +158 -2
- {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/spatial_plotting.py +591 -394
- smftools-2.16.0/smftools/plotting/umi_plotting.py +119 -0
- smftools-2.16.0/smftools/plotting/variant_plotting.py +1884 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/__init__.py +10 -0
- smftools-2.16.0/smftools/preprocessing/_bitpack_utils.py +102 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/append_base_context.py +36 -3
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/append_binary_layer_by_base_context.py +60 -57
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/append_variant_call_layer.py +73 -1
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/binarize_on_Youden.py +13 -5
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_position_Youden.py +10 -0
- smftools-2.16.0/smftools/preprocessing/clean_NaN.py +185 -0
- smftools-2.16.0/smftools/preprocessing/dispatch_plan.py +199 -0
- smftools-2.16.0/smftools/preprocessing/duplicate_detection_dispatch.py +395 -0
- smftools-2.16.0/smftools/preprocessing/filter_reads_on_cigar_indels.py +89 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/filter_reads_on_length_quality_mapping.py +82 -12
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/flag_duplicate_reads.py +631 -490
- smftools-2.16.0/smftools/preprocessing/invert_adata.py +71 -0
- smftools-2.16.0/smftools/preprocessing/label_deaminase_pcr_chimeras.py +132 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/load_sample_sheet.py +7 -0
- smftools-2.16.0/smftools/preprocessing/partitioned_executor.py +1143 -0
- smftools-2.16.0/smftools/preprocessing/partitioned_plots.py +749 -0
- smftools-2.16.0/smftools/preprocessing/preprocess_umi_annotations.py +923 -0
- smftools-2.16.0/smftools/preprocessing/reindex_references_adata.py +180 -0
- smftools-2.16.0/smftools/preprocessing/umi_bipartite_analysis.py +186 -0
- smftools-2.16.0/smftools/project/__init__.py +9 -0
- smftools-2.16.0/smftools/project/catalog.py +829 -0
- smftools-2.16.0/smftools/project/embedding_store.py +406 -0
- smftools-2.16.0/smftools/project/reference_registry.py +112 -0
- smftools-2.16.0/smftools/project/registry.py +526 -0
- smftools-2.16.0/smftools/project/sample_analysis.py +253 -0
- smftools-2.16.0/smftools/project/sample_store.py +142 -0
- smftools-2.16.0/smftools/project/scaffold.py +272 -0
- smftools-2.16.0/smftools/project/set_store.py +169 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/readwrite.py +655 -166
- {smftools-0.3.2 → smftools-2.16.0}/smftools/schema/anndata_schema_v1.yaml +49 -0
- smftools-2.16.0/smftools/tools/partitioned_hmm.py +1356 -0
- smftools-2.16.0/smftools/tools/partitioned_latent.py +682 -0
- smftools-2.16.0/smftools/tools/partitioned_spatial.py +1887 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/position_stats.py +76 -5
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/read_stats.py +7 -4
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/rolling_nn_distance.py +59 -6
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/spatial_autocorrelation.py +4 -1
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/tensor_factorization.py +5 -2
- smftools-2.16.0/tests/AGENTS.md +40 -0
- smftools-2.16.0/tests/__init__.py +8 -0
- smftools-2.16.0/tests/_test_inputs/parallel_dispatch/sample.bam +0 -0
- smftools-2.16.0/tests/_test_inputs/parallel_dispatch/sample.bam.bai +0 -0
- smftools-2.16.0/tests/_test_inputs/parallel_dispatch/sample.fasta +4 -0
- smftools-2.16.0/tests/_test_inputs/parallel_dispatch/sample.fasta.fai +2 -0
- smftools-2.16.0/tests/_test_inputs/parallel_dispatch/sample_extract.tsv.gz +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/test_experiment_config_conversion_I.csv +12 -12
- {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/test_experiment_config_deaminase_I.csv +12 -12
- {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/test_experiment_config_direct_I.csv +14 -14
- smftools-2.16.0/tests/acceptance/partitioned_pipeline_criteria.json +51 -0
- smftools-2.16.0/tests/conftest.py +24 -0
- smftools-2.16.0/tests/e2e/cli/test_load_adata.py +43 -0
- smftools-2.16.0/tests/fixtures/__init__.py +1 -0
- smftools-2.16.0/tests/fixtures/partitioned_pipeline.py +143 -0
- smftools-2.16.0/tests/integration/informatics/test_modkit_extract_to_adata_parallel.py +228 -0
- smftools-2.16.0/tests/integration/test_resource_runtime.py +78 -0
- smftools-2.16.0/tests/unit/analysis/__init__.py +0 -0
- smftools-2.16.0/tests/unit/analysis/test_autocorrelation.py +211 -0
- smftools-2.16.0/tests/unit/analysis/test_dimensionality_reduction.py +82 -0
- smftools-2.16.0/tests/unit/analysis/test_hmm_features.py +105 -0
- smftools-2.16.0/tests/unit/analysis/test_ls_periodicity.py +220 -0
- smftools-2.16.0/tests/unit/analysis/test_obs_filters.py +175 -0
- smftools-2.16.0/tests/unit/analysis/test_pearson.py +101 -0
- smftools-2.16.0/tests/unit/analysis/test_position_filters.py +47 -0
- smftools-2.16.0/tests/unit/config/test_ExperimentConfig_skip_bam_qc.py +36 -0
- smftools-2.16.0/tests/unit/config/test_LoadExperimentConfig.py +209 -0
- smftools-2.16.0/tests/unit/config/test_hmm_device_default.py +42 -0
- smftools-2.16.0/tests/unit/config/test_hmm_plot_defaults.py +8 -0
- smftools-2.16.0/tests/unit/config/test_reindexing_offsets_default.py +47 -0
- smftools-2.16.0/tests/unit/config/test_spatial_read_metrics_config.py +33 -0
- smftools-2.16.0/tests/unit/hmm/test_fit_plan.py +125 -0
- smftools-2.16.0/tests/unit/hmm/test_model_artifacts.py +188 -0
- smftools-2.16.0/tests/unit/informatics/test_alignment_rescue.py +315 -0
- smftools-2.16.0/tests/unit/informatics/test_analysis_region_plan.py +153 -0
- smftools-2.16.0/tests/unit/informatics/test_bam_base_identities.py +218 -0
- smftools-2.16.0/tests/unit/informatics/test_bam_bi_sidecar.py +66 -0
- smftools-2.16.0/tests/unit/informatics/test_bam_qc.py +164 -0
- smftools-2.16.0/tests/unit/informatics/test_barcode_extraction.py +1419 -0
- smftools-2.16.0/tests/unit/informatics/test_barcode_labels.py +26 -0
- smftools-2.16.0/tests/unit/informatics/test_barcode_sidecar_dorado_reclassification.py +95 -0
- smftools-2.16.0/tests/unit/informatics/test_converted_sequence_encoding.py +45 -0
- smftools-2.16.0/tests/unit/informatics/test_derived_read_index.py +53 -0
- smftools-2.16.0/tests/unit/informatics/test_experiment_manifest.py +261 -0
- smftools-2.16.0/tests/unit/informatics/test_experiment_spine.py +216 -0
- smftools-2.16.0/tests/unit/informatics/test_fastq_export.py +158 -0
- smftools-2.16.0/tests/unit/informatics/test_incremental_zarr.py +118 -0
- smftools-2.16.0/tests/unit/informatics/test_modkit_demux_type_annotation_mode.py +31 -0
- smftools-2.16.0/tests/unit/informatics/test_modkit_loop_b_skip.py +18 -0
- smftools-2.16.0/tests/unit/informatics/test_modkit_max_workers.py +217 -0
- smftools-2.16.0/tests/unit/informatics/test_modkit_sequence_batch_files.py +74 -0
- smftools-2.16.0/tests/unit/informatics/test_modkit_tsv_split.py +67 -0
- smftools-2.16.0/tests/unit/informatics/test_molecule_identity.py +25 -0
- smftools-2.16.0/tests/unit/informatics/test_partition_query.py +206 -0
- smftools-2.16.0/tests/unit/informatics/test_partition_read.py +207 -0
- smftools-2.16.0/tests/unit/informatics/test_partition_store.py +127 -0
- smftools-2.16.0/tests/unit/informatics/test_plot_region_stitching.py +181 -0
- smftools-2.16.0/tests/unit/informatics/test_pod5_metadata.py +138 -0
- smftools-2.16.0/tests/unit/informatics/test_preprocess_x_fast_path.py +197 -0
- smftools-2.16.0/tests/unit/informatics/test_ragged_store.py +257 -0
- smftools-2.16.0/tests/unit/informatics/test_raw_store.py +469 -0
- smftools-2.16.0/tests/unit/informatics/test_reference_identity.py +25 -0
- smftools-2.16.0/tests/unit/informatics/test_region_catalog.py +278 -0
- smftools-2.16.0/tests/unit/informatics/test_sidecar_manifest.py +73 -0
- smftools-2.16.0/tests/unit/informatics/test_signal_features.py +133 -0
- smftools-2.16.0/tests/unit/informatics/test_stage_obs.py +89 -0
- smftools-2.16.0/tests/unit/informatics/test_storage_planner.py +44 -0
- smftools-2.16.0/tests/unit/informatics/test_strand_switch_metrics.py +83 -0
- smftools-2.16.0/tests/unit/informatics/test_umi_annotation.py +1095 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_append_variant_segment_layer.py +35 -0
- smftools-2.16.0/tests/unit/test_atomic_json_write.py +36 -0
- smftools-2.16.0/tests/unit/test_bitpack_utils.py +80 -0
- smftools-2.16.0/tests/unit/test_blas_thread_limiting.py +136 -0
- smftools-2.16.0/tests/unit/test_calculate_relative_risk_on_activity.py +50 -0
- smftools-2.16.0/tests/unit/test_clean_nan_callback.py +101 -0
- smftools-2.16.0/tests/unit/test_cli_artifact_helpers.py +94 -0
- smftools-2.16.0/tests/unit/test_cli_entry_batch_full.py +127 -0
- smftools-2.16.0/tests/unit/test_cli_entry_export_fastq.py +77 -0
- smftools-2.16.0/tests/unit/test_clustermap_pool_memory_guard.py +123 -0
- smftools-2.16.0/tests/unit/test_combined_hmm_length_clustermap_inverted_reference.py +68 -0
- smftools-2.16.0/tests/unit/test_combined_hmm_length_clustermap_outputs.py +86 -0
- smftools-2.16.0/tests/unit/test_combined_hmm_raw_clustermap_inverted_reference.py +63 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_combined_hmm_raw_clustermap_nan_fill.py +25 -12
- smftools-2.16.0/tests/unit/test_combined_hmm_raw_clustermap_read_span.py +68 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_combined_raw_clustermap_barplot_nan_ignore.py +2 -2
- smftools-2.16.0/tests/unit/test_combined_raw_clustermap_inverted_reference.py +65 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_combined_raw_clustermap_nan_fill.py +19 -3
- smftools-2.16.0/tests/unit/test_combined_raw_clustermap_read_span.py +67 -0
- smftools-2.16.0/tests/unit/test_dependency_profiles.py +73 -0
- smftools-2.16.0/tests/unit/test_duplicate_detection_dispatch.py +452 -0
- smftools-2.16.0/tests/unit/test_expand_bi_tag_columns.py +32 -0
- smftools-2.16.0/tests/unit/test_export_fastq.py +283 -0
- smftools-2.16.0/tests/unit/test_filter_reads_cigar_indels.py +101 -0
- smftools-2.16.0/tests/unit/test_filter_reads_length_thresholds.py +70 -0
- smftools-2.16.0/tests/unit/test_flag_duplicate_reads.py +364 -0
- smftools-2.16.0/tests/unit/test_flag_duplicate_reads_hierarchical_cap.py +84 -0
- smftools-2.16.0/tests/unit/test_flag_duplicate_reads_permutation_banding.py +85 -0
- smftools-2.16.0/tests/unit/test_full_recipe.py +207 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_hmm_clustermap_colormap.py +8 -1
- smftools-2.16.0/tests/unit/test_hmm_fit_em_log_likelihood.py +103 -0
- smftools-2.16.0/tests/unit/test_hmm_partitioned_cli.py +1068 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_hmm_variant_overlay_index_mapping.py +2 -4
- smftools-2.16.0/tests/unit/test_label_deaminase_pcr_chimeras.py +74 -0
- smftools-2.16.0/tests/unit/test_latent_partitioned_cli.py +318 -0
- smftools-2.16.0/tests/unit/test_load_sample_sheet.py +25 -0
- smftools-2.16.0/tests/unit/test_memory_guard.py +588 -0
- smftools-2.16.0/tests/unit/test_ordered_columns.py +59 -0
- smftools-2.16.0/tests/unit/test_partitioned_pipeline_acceptance_catalog.py +40 -0
- smftools-2.16.0/tests/unit/test_partitioned_pipeline_fixture.py +87 -0
- smftools-2.16.0/tests/unit/test_partitioned_plots_duplicate_diagnostics.py +45 -0
- smftools-2.16.0/tests/unit/test_partitioned_plots_swarm_overlay.py +44 -0
- smftools-2.16.0/tests/unit/test_partitioned_preprocess_executor.py +1382 -0
- smftools-2.16.0/tests/unit/test_perf_log.py +206 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_cp_sequence_components.py +1 -1
- smftools-2.16.0/tests/unit/test_plot_hmm_size_contours_index_col_suffix.py +92 -0
- smftools-2.16.0/tests/unit/test_plot_read_span_quality_clustermaps.py +128 -0
- smftools-2.16.0/tests/unit/test_plot_reference_barcode_chimera_rate.py +60 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_sequence_integer_encoding_clustermaps.py +40 -1
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_variant_segment_clustermaps.py +47 -1
- smftools-2.16.0/tests/unit/test_plot_variant_segment_clustermaps_multi_obs.py +120 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_zero_hamming_pair_counts.py +1 -1
- smftools-2.16.0/tests/unit/test_preprocess_dispatch_plan.py +142 -0
- smftools-2.16.0/tests/unit/test_preprocess_umi_annotations.py +442 -0
- smftools-2.16.0/tests/unit/test_project_catalog.py +471 -0
- smftools-2.16.0/tests/unit/test_project_cli.py +379 -0
- smftools-2.16.0/tests/unit/test_project_embedding_store.py +183 -0
- smftools-2.16.0/tests/unit/test_project_registry.py +418 -0
- smftools-2.16.0/tests/unit/test_project_sample_analysis.py +214 -0
- smftools-2.16.0/tests/unit/test_project_sample_store.py +164 -0
- smftools-2.16.0/tests/unit/test_project_scaffold.py +71 -0
- smftools-2.16.0/tests/unit/test_project_set_store.py +112 -0
- smftools-2.16.0/tests/unit/test_qc_plotting_histograms.py +51 -0
- smftools-2.16.0/tests/unit/test_raw_adata.py +1090 -0
- smftools-2.16.0/tests/unit/test_raw_signal_features.py +96 -0
- smftools-2.16.0/tests/unit/test_reduce_read_modification_stats.py +135 -0
- smftools-2.16.0/tests/unit/test_reindex_references_adata.py +104 -0
- smftools-2.16.0/tests/unit/test_resource_envelope.py +139 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_rolling_nn_distance.py +99 -0
- smftools-2.16.0/tests/unit/test_spatial_partitioned_cli.py +188 -0
- smftools-2.16.0/tests/unit/test_stage_artifacts.py +112 -0
- smftools-2.16.0/tests/unit/test_stage_input.py +178 -0
- smftools-2.16.0/tests/unit/test_subsample_reads_for_plot.py +86 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_tensor_factorization.py +9 -1
- smftools-2.16.0/tests/unit/test_variant_adata_reindexing.py +99 -0
- smftools-2.16.0/tests/unit/test_variant_adata_umi_duplicate_plot_section.py +116 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/tools/test_calculate_umap.py +11 -0
- smftools-0.3.2/.readthedocs.yaml +0 -16
- smftools-0.3.2/AGENTS.md +0 -172
- smftools-0.3.2/PKG-INFO +0 -151
- smftools-0.3.2/README.md +0 -14
- smftools-0.3.2/docs/source/api/informatics.md +0 -44
- smftools-0.3.2/docs/source/api/tools.md +0 -20
- smftools-0.3.2/docs/source/basic_usage.md +0 -183
- smftools-0.3.2/docs/source/contributors.md +0 -9
- smftools-0.3.2/docs/source/dev/index.md +0 -3
- smftools-0.3.2/docs/source/installation.md +0 -89
- smftools-0.3.2/docs/source/release-notes/index.md +0 -35
- smftools-0.3.2/docs/source/requirements.txt +0 -16
- smftools-0.3.2/docs/source/tutorials/cli_usage.md +0 -136
- smftools-0.3.2/docs/source/tutorials/experiment_config.md +0 -52
- smftools-0.3.2/docs/source/tutorials/index.md +0 -13
- smftools-0.3.2/smftools/__init__.py +0 -60
- smftools-0.3.2/smftools/cli/helpers.py +0 -98
- smftools-0.3.2/smftools/cli/load_adata.py +0 -793
- smftools-0.3.2/smftools/cli/recipes.py +0 -26
- smftools-0.3.2/smftools/cli_entry.py +0 -423
- smftools-0.3.2/smftools/config/default.yaml +0 -449
- smftools-0.3.2/smftools/informatics/bam_functions.py +0 -1951
- smftools-0.3.2/smftools/informatics/modkit_extract_to_adata.py +0 -1901
- smftools-0.3.2/smftools/informatics/pod5_functions.py +0 -264
- smftools-0.3.2/smftools/informatics/run_multiqc.py +0 -37
- smftools-0.3.2/smftools/logging_utils.py +0 -70
- smftools-0.3.2/smftools/plotting/hmm_plotting.py +0 -1961
- smftools-0.3.2/smftools/plotting/preprocess_plotting.py +0 -281
- smftools-0.3.2/smftools/plotting/variant_plotting.py +0 -1231
- smftools-0.3.2/smftools/preprocessing/clean_NaN.py +0 -72
- smftools-0.3.2/smftools/preprocessing/invert_adata.py +0 -53
- smftools-0.3.2/smftools/preprocessing/reindex_references_adata.py +0 -103
- smftools-0.3.2/tests/__init__.py +0 -8
- smftools-0.3.2/tests/conftest.py +0 -13
- smftools-0.3.2/tests/e2e/cli/test_load_adata.py +0 -29
- smftools-0.3.2/tests/unit/config/test_LoadExperimentConfig.py +0 -20
- smftools-0.3.2/tests/unit/informatics/test_bam_base_identities.py +0 -81
- smftools-0.3.2/tests/unit/informatics/test_modkit_sequence_batch_files.py +0 -43
- smftools-0.3.2/tests/unit/test_combined_hmm_length_clustermap_outputs.py +0 -41
- smftools-0.3.2/tests/unit/test_plot_read_span_quality_clustermaps.py +0 -35
- {smftools-0.3.2 → smftools-2.16.0}/.gitattributes +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/.pre-commit-config.yaml +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/CLAUDE.md +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/CONTRIBUTING.md +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/LICENSE +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/Makefile +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/make.bat +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/converted_BAM_to_adata.png +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/modkit_extract_to_adata.png +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/smftools-1.svg +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/smftools-1.tif +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/smftools_informatics_diagram.pdf +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/smftools_informatics_diagram.png +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/_static/smftools_preprocessing_diagram.png +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/_templates/tmp +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/api/datasets.md +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/cli.md +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/index.md +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/references.bib +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/references.rst +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/release-notes/0.1.0.md +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/release-notes/0.1.1.md +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/release-notes/0.1.6.md +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/release-notes/0.2.1.md +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/release-notes/0.2.3.md +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/release-notes/0.3.0.md +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/docs/source/schema/anndata_schema.md +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/notebooks/Kissiov_and_McKenna_2025_example_notebook.ipynb +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/_settings.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/cli/archived/cli_flows.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/config/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/datasets/F1_hybrid_NKG2A_enhander_promoter_GpC_conversion_SMF.h5ad.gz +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/datasets/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/datasets/dCas9_m6A_invitro_kinetics.h5ad.gz +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/datasets/datasets.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/archived/apply_hmm_batched.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/archived/calculate_distances.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/archived/call_hmm_peaks.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/archived/train_hmm.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/display_hmm.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/hmm_readwrite.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/hmm/nucleosome_hmm_refinement.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/bam_conversion.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/bam_direct.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/basecall_pod5s.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/basecalls_to_adata.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/conversion_smf.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/deaminase_smf.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/direct_smf.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/fast5_to_pod5.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/align_and_sort_BAM.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/aligned_BAM_to_bed.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/bam_qc.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/bed_to_bigwig.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/canoncall.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/concatenate_fastqs_to_bam.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/converted_BAM_to_adata.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/count_aligned_reads.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/demux_and_index_BAM.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/extract_base_identities.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/extract_mods.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/extract_read_features_from_bam.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/extract_read_lengths_from_bed.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/extract_readnames_from_BAM.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/find_conversion_sites.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/generate_converted_FASTA.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/get_chromosome_lengths.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/get_native_references.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/index_fasta.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/informatics.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/load_adata.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/make_modbed.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/modQC.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/modcall.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/ohe_batching.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/ohe_layers_decode.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/one_hot_decode.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/one_hot_encode.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/plot_bed_histograms.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/separate_bam_by_bc.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/helpers/archived/split_and_index_BAM.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/print_bam_query_seq.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/subsample_fasta_from_bed.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/archived/subsample_pod5.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/complement_base_list.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/fasta_functions.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/informatics/ohe.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/data/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/data/anndata_data_module.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/data/preprocessing.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/evaluation/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/evaluation/eval_utils.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/evaluation/evaluators.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/inference/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/inference/inference_utils.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/inference/lightning_inference.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/inference/sklearn_inference.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/inference/sliding_window_inference.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/base.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/cnn.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/lightning_base.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/mlp.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/positional.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/rnn.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/sklearn_models.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/transformer.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/models/wrappers.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/training/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/training/train_lightning_model.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/training/train_sklearn_model.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/utils/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/utils/device.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/machine_learning/utils/grl.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/metadata.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/optional_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/chimeric_plotting.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/classifiers.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/plotting/general_plotting.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/append_mismatch_frequency_sites.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/append_sequence_mismatch_annotations.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/archived/add_read_length_and_mapping_qc.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/archived/calculate_complexity.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/archived/mark_duplicates.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/archived/preprocessing.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/archived/remove_duplicates.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/binarize.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/binary_layers_to_ohe.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_complexity_II.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_consensus.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_coverage.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_pairwise_differences.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_pairwise_hamming_distances.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_read_length_stats.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/calculate_read_modification_stats.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/filter_adata_by_nan_proportion.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/filter_reads_on_modification_thresholds.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/make_dirs.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/min_non_diagonal.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/recipes.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/preprocessing/subsample_adata.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/schema/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/archived/apply_hmm.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/archived/classifiers.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/archived/classify_methylated_features.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/archived/classify_non_methylated_features.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/archived/subset_adata_v1.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/archived/subset_adata_v2.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/calculate_knn.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/calculate_leiden.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/calculate_nmf.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/calculate_pca.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/calculate_umap.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/cluster_adata_on_methylation.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/general_tools.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/sequence_alignment.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/smftools/tools/subset_adata.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/_test_bed_I.bed +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/_test_fasta_I.fa +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/_test_fasta_I.fa.fai +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/_test_inputs/_test_pod5_I.pod5 +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/e2e/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/e2e/cli/test_spatial_adata.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/integration/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/cli/test_cli_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/config/test_config_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/datasets/test_datasets_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/hmm/test_hmm_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/import_helpers.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/informatics/test_informatics_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/machine_learning/data/test_data_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/machine_learning/evaluation/test_evaluation_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/machine_learning/inference/test_inference_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/machine_learning/models/test_models_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/machine_learning/training/test_training_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/machine_learning/utils/test_utils_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/plotting/test_plotting_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/preprocessing/test_preprocessing_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/test_smftools_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/smoke/tools/test_tools_imports.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/__init__.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/datasets/test_datasets.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/hmm/test_mask_read_span.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/informatics/test_bam_read_tags.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/informatics/test_bam_secondary_supplementary.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/informatics/test_h5ad_secondary_supplementary.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/informatics/test_modkit_sequence_encoding.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/informatics/test_tool_backends.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_annotate_zero_hamming_segments_parent_layer.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_append_mismatch_frequency_sites.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_append_reference_strand_quality_stats.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_append_sequence_mismatch_annotations.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_calculate_nmf.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_chimeric_adata_mod_hamming_flag.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_chimeric_adata_span_layer.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_chimeric_adata_top_segments.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_combined_hmm_length_clustermap_barplot.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_latent_adata_var_filters.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_length_layer_subclass_mapping.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_metadata.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_methylation_fraction_nan_handling.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_hamming_span_trio.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_hmm_size_contours_feature_ranges.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_hmm_size_contours_nan_values.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_mismatch_base_frequency_by_position.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_nmf_components.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_pca_components.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_rolling_nn_and_layer.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_rolling_nn_and_two_layers.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_plot_zero_hamming_span_and_layer.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_readwrite.py +0 -0
- {smftools-0.3.2 → smftools-2.16.0}/tests/unit/test_variant_adata_overlay_config_forwarding.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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 .[
|
|
78
|
-
|
|
79
|
-
|
|
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
|
|
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.
|
|
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
|
|
@@ -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.
|