smftools 0.3.2__tar.gz → 0.4.5__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-0.4.5/.claude/scheduled_tasks.lock +1 -0
- smftools-0.4.5/.claude/settings.local.json +8 -0
- smftools-0.4.5/.devcontainer/Dockerfile +38 -0
- smftools-0.4.5/.devcontainer/devcontainer.json +32 -0
- {smftools-0.3.2 → smftools-0.4.5}/.github/workflows/ci.yml +2 -2
- {smftools-0.3.2 → smftools-0.4.5}/PKG-INFO +37 -7
- smftools-0.4.5/docs/source/api/analysis.md +65 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/api/index.md +1 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/conf.py +0 -1
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/tutorials/cli_usage.md +56 -3
- smftools-0.4.5/docs/source/tutorials/experiment_config.md +99 -0
- {smftools-0.3.2 → smftools-0.4.5}/experiment_config.csv +13 -13
- {smftools-0.3.2 → smftools-0.4.5}/notebooks/Kissiov_and_McKenna_2025_sample_sheet.csv +10 -10
- {smftools-0.3.2 → smftools-0.4.5}/pyproject.toml +60 -5
- {smftools-0.3.2 → smftools-0.4.5}/requirements.txt +1 -1
- {smftools-0.3.2 → smftools-0.4.5}/sample_sheet.csv +10 -10
- {smftools-0.3.2 → smftools-0.4.5}/smftools/_version.py +1 -1
- smftools-0.4.5/smftools/analysis/CLAUDE.md +103 -0
- smftools-0.4.5/smftools/analysis/__init__.py +19 -0
- smftools-0.4.5/smftools/analysis/compute/__init__.py +23 -0
- smftools-0.4.5/smftools/analysis/compute/autocorrelation.py +320 -0
- smftools-0.4.5/smftools/analysis/compute/dimensionality_reduction.py +205 -0
- smftools-0.4.5/smftools/analysis/compute/ep_classification.py +122 -0
- smftools-0.4.5/smftools/analysis/compute/hmm_features.py +79 -0
- smftools-0.4.5/smftools/analysis/compute/ls_periodicity.py +379 -0
- smftools-0.4.5/smftools/analysis/compute/metrics_store.py +89 -0
- smftools-0.4.5/smftools/analysis/compute/ml_cnn.py +505 -0
- smftools-0.4.5/smftools/analysis/compute/ml_metrics.py +215 -0
- smftools-0.4.5/smftools/analysis/compute/ml_splits.py +112 -0
- smftools-0.4.5/smftools/analysis/compute/pearson.py +58 -0
- smftools-0.4.5/smftools/analysis/compute/read_cache.py +398 -0
- smftools-0.4.5/smftools/analysis/config/__init__.py +11 -0
- smftools-0.4.5/smftools/analysis/config/hmm_histogram.py +83 -0
- smftools-0.4.5/smftools/analysis/filters/__init__.py +10 -0
- smftools-0.4.5/smftools/analysis/filters/obs_filters.py +113 -0
- smftools-0.4.5/smftools/analysis/filters/position_filters.py +39 -0
- smftools-0.4.5/smftools/analysis/plot/__init__.py +16 -0
- smftools-0.4.5/smftools/analysis/plot/autocorr.py +465 -0
- smftools-0.4.5/smftools/analysis/plot/embeddings.py +633 -0
- smftools-0.4.5/smftools/analysis/plot/heatmaps.py +66 -0
- smftools-0.4.5/smftools/analysis/plot/histograms.py +267 -0
- smftools-0.4.5/smftools/analysis/plot/locus.py +9 -0
- smftools-0.4.5/smftools/analysis/plot/ml.py +133 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/cli/chimeric_adata.py +8 -37
- smftools-0.4.5/smftools/cli/helpers.py +410 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/cli/hmm_adata.py +121 -46
- {smftools-0.3.2 → smftools-0.4.5}/smftools/cli/latent_adata.py +6 -35
- smftools-0.4.5/smftools/cli/load_adata.py +1330 -0
- smftools-0.4.5/smftools/cli/plot_current.py +64 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/cli/preprocess_adata.py +225 -95
- {smftools-0.3.2 → smftools-0.4.5}/smftools/cli/spatial_adata.py +73 -52
- {smftools-0.3.2 → smftools-0.4.5}/smftools/cli/variant_adata.py +301 -37
- {smftools-0.3.2 → smftools-0.4.5}/smftools/cli_entry.py +93 -51
- smftools-0.4.5/smftools/config/barcodes/SQK-NBD114-24.yaml +35 -0
- smftools-0.4.5/smftools/config/barcodes/SQK-NBD114-96.yaml +107 -0
- smftools-0.4.5/smftools/config/barcodes/SQK-RBK114-24.yaml +35 -0
- smftools-0.4.5/smftools/config/barcodes/SQK-RBK114-96.yaml +113 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/config/deaminase.yaml +3 -3
- {smftools-0.3.2 → smftools-0.4.5}/smftools/config/default.yaml +83 -5
- {smftools-0.3.2 → smftools-0.4.5}/smftools/config/direct.yaml +1 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/config/discover_input_files.py +1 -1
- {smftools-0.3.2 → smftools-0.4.5}/smftools/config/experiment_config.py +487 -65
- smftools-0.4.5/smftools/config/umis/dual-nextera-12.yaml +9 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/constants.py +48 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/datasets/F1_sample_sheet.csv +4 -4
- {smftools-0.3.2 → smftools-0.4.5}/smftools/hmm/call_hmm_peaks.py +2 -84
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/__init__.py +5 -0
- smftools-0.4.5/smftools/informatics/bam_functions.py +4915 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/basecalling.py +16 -7
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/binarize_converted_base_identities.py +10 -10
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/converted_BAM_to_adata.py +378 -182
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/h5ad_functions.py +204 -21
- smftools-0.4.5/smftools/informatics/modkit_extract_to_adata.py +2907 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/modkit_functions.py +13 -6
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/pod5_functions.py +88 -2
- smftools-0.4.5/smftools/informatics/run_multiqc.py +65 -0
- smftools-0.4.5/smftools/informatics/sidecar_manifest.py +66 -0
- smftools-0.4.5/smftools/memory_guard.py +204 -0
- smftools-0.4.5/smftools/parallel_utils.py +93 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/plotting/__init__.py +3 -0
- smftools-0.4.5/smftools/plotting/hmm_plotting.py +2135 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/plotting/plotting_utils.py +49 -6
- smftools-0.4.5/smftools/plotting/pod5_plotting.py +463 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/plotting/position_stats.py +6 -3
- smftools-0.4.5/smftools/plotting/preprocess_plotting.py +419 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/plotting/qc_plotting.py +29 -2
- {smftools-0.3.2 → smftools-0.4.5}/smftools/plotting/spatial_plotting.py +501 -420
- smftools-0.4.5/smftools/plotting/umi_plotting.py +119 -0
- smftools-0.4.5/smftools/plotting/variant_plotting.py +1831 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/__init__.py +6 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/append_base_context.py +13 -1
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/append_binary_layer_by_base_context.py +60 -57
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/append_variant_call_layer.py +71 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/binarize_on_Youden.py +13 -5
- smftools-0.4.5/smftools/preprocessing/clean_NaN.py +162 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/filter_reads_on_length_quality_mapping.py +82 -12
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/flag_duplicate_reads.py +581 -489
- smftools-0.4.5/smftools/preprocessing/invert_adata.py +71 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/load_sample_sheet.py +7 -0
- smftools-0.4.5/smftools/preprocessing/preprocess_umi_annotations.py +938 -0
- smftools-0.4.5/smftools/preprocessing/umi_bipartite_analysis.py +186 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/readwrite.py +337 -93
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/position_stats.py +66 -4
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/read_stats.py +7 -4
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/spatial_autocorrelation.py +4 -1
- smftools-0.4.5/tests/_test_inputs/parallel_dispatch/sample.bam +0 -0
- smftools-0.4.5/tests/_test_inputs/parallel_dispatch/sample.bam.bai +0 -0
- smftools-0.4.5/tests/_test_inputs/parallel_dispatch/sample.fasta +4 -0
- smftools-0.4.5/tests/_test_inputs/parallel_dispatch/sample.fasta.fai +2 -0
- smftools-0.4.5/tests/_test_inputs/parallel_dispatch/sample_extract.tsv.gz +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/_test_inputs/test_experiment_config_conversion_I.csv +12 -12
- {smftools-0.3.2 → smftools-0.4.5}/tests/_test_inputs/test_experiment_config_deaminase_I.csv +12 -12
- {smftools-0.3.2 → smftools-0.4.5}/tests/_test_inputs/test_experiment_config_direct_I.csv +14 -14
- smftools-0.4.5/tests/e2e/cli/test_load_adata.py +43 -0
- smftools-0.4.5/tests/integration/informatics/test_modkit_extract_to_adata_parallel.py +232 -0
- smftools-0.4.5/tests/unit/analysis/__init__.py +0 -0
- smftools-0.4.5/tests/unit/analysis/test_autocorrelation.py +211 -0
- smftools-0.4.5/tests/unit/analysis/test_hmm_features.py +105 -0
- smftools-0.4.5/tests/unit/analysis/test_ls_periodicity.py +220 -0
- smftools-0.4.5/tests/unit/analysis/test_obs_filters.py +175 -0
- smftools-0.4.5/tests/unit/analysis/test_pearson.py +101 -0
- smftools-0.4.5/tests/unit/analysis/test_position_filters.py +47 -0
- smftools-0.4.5/tests/unit/config/test_ExperimentConfig_skip_bam_qc.py +36 -0
- smftools-0.4.5/tests/unit/informatics/test_bam_bi_sidecar.py +66 -0
- smftools-0.4.5/tests/unit/informatics/test_bam_qc.py +164 -0
- smftools-0.4.5/tests/unit/informatics/test_barcode_extraction.py +1419 -0
- smftools-0.4.5/tests/unit/informatics/test_barcode_labels.py +26 -0
- smftools-0.4.5/tests/unit/informatics/test_converted_sequence_encoding.py +45 -0
- smftools-0.4.5/tests/unit/informatics/test_modkit_demux_type_annotation_mode.py +44 -0
- smftools-0.4.5/tests/unit/informatics/test_modkit_loop_b_skip.py +18 -0
- smftools-0.4.5/tests/unit/informatics/test_modkit_max_workers.py +221 -0
- smftools-0.4.5/tests/unit/informatics/test_modkit_sequence_batch_files.py +80 -0
- smftools-0.4.5/tests/unit/informatics/test_modkit_tsv_split.py +67 -0
- smftools-0.4.5/tests/unit/informatics/test_sidecar_manifest.py +29 -0
- smftools-0.4.5/tests/unit/informatics/test_umi_annotation.py +1095 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_append_variant_segment_layer.py +35 -0
- smftools-0.4.5/tests/unit/test_cli_artifact_helpers.py +94 -0
- smftools-0.4.5/tests/unit/test_expand_bi_tag_columns.py +32 -0
- smftools-0.4.5/tests/unit/test_filter_reads_length_thresholds.py +70 -0
- smftools-0.4.5/tests/unit/test_flag_duplicate_reads.py +366 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_hmm_variant_overlay_index_mapping.py +2 -4
- smftools-0.4.5/tests/unit/test_load_sample_sheet.py +25 -0
- smftools-0.4.5/tests/unit/test_memory_guard.py +97 -0
- smftools-0.4.5/tests/unit/test_plot_read_span_quality_clustermaps.py +87 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_variant_segment_clustermaps.py +1 -0
- smftools-0.4.5/tests/unit/test_plot_variant_segment_clustermaps_multi_obs.py +76 -0
- smftools-0.4.5/tests/unit/test_preprocess_umi_annotations.py +442 -0
- smftools-0.4.5/tests/unit/test_qc_plotting_histograms.py +51 -0
- smftools-0.4.5/tests/unit/test_variant_adata_umi_duplicate_plot_section.py +116 -0
- smftools-0.3.2/docs/source/tutorials/experiment_config.md +0 -52
- 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/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/run_multiqc.py +0 -37
- 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/tests/e2e/cli/test_load_adata.py +0 -29
- smftools-0.3.2/tests/unit/informatics/test_modkit_sequence_batch_files.py +0 -43
- smftools-0.3.2/tests/unit/test_plot_read_span_quality_clustermaps.py +0 -35
- {smftools-0.3.2 → smftools-0.4.5}/.gitattributes +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/.gitignore +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/.pre-commit-config.yaml +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/.readthedocs.yaml +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/AGENTS.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/CLAUDE.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/CONTRIBUTING.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/LICENSE +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/README.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/Makefile +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/make.bat +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/_static/converted_BAM_to_adata.png +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/_static/modkit_extract_to_adata.png +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/_static/smftools-1.svg +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/_static/smftools-1.tif +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/_static/smftools_informatics_diagram.pdf +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/_static/smftools_informatics_diagram.png +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/_static/smftools_preprocessing_diagram.png +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/_templates/tmp +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/api/datasets.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/api/informatics.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/api/preprocessing.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/api/tools.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/basic_usage.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/cli.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/contributors.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/dev/index.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/index.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/installation.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/references.bib +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/references.rst +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/release-notes/0.1.0.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/release-notes/0.1.1.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/release-notes/0.1.6.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/release-notes/0.2.1.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/release-notes/0.2.3.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/release-notes/0.3.0.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/release-notes/index.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/requirements.txt +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/schema/anndata_schema.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/docs/source/tutorials/index.md +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/notebooks/Kissiov_and_McKenna_2025_example_notebook.ipynb +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/_settings.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/cli/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/cli/archived/cli_flows.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/cli/recipes.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/config/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/config/conversion.yaml +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/datasets/F1_hybrid_NKG2A_enhander_promoter_GpC_conversion_SMF.h5ad.gz +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/datasets/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/datasets/dCas9_m6A_invitro_kinetics.h5ad.gz +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/datasets/datasets.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/hmm/HMM.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/hmm/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/hmm/archived/apply_hmm_batched.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/hmm/archived/calculate_distances.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/hmm/archived/call_hmm_peaks.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/hmm/archived/train_hmm.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/hmm/display_hmm.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/hmm/hmm_readwrite.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/hmm/nucleosome_hmm_refinement.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/bam_conversion.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/bam_direct.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/basecall_pod5s.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/basecalls_to_adata.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/conversion_smf.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/deaminase_smf.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/direct_smf.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/fast5_to_pod5.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/align_and_sort_BAM.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/aligned_BAM_to_bed.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/bam_qc.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/bed_to_bigwig.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/canoncall.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/concatenate_fastqs_to_bam.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/converted_BAM_to_adata.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/count_aligned_reads.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/demux_and_index_BAM.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/extract_base_identities.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/extract_mods.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/extract_read_features_from_bam.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/extract_read_lengths_from_bed.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/extract_readnames_from_BAM.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/find_conversion_sites.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/generate_converted_FASTA.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/get_chromosome_lengths.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/get_native_references.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/index_fasta.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/informatics.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/load_adata.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/make_modbed.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/modQC.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/modcall.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/ohe_batching.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/ohe_layers_decode.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/one_hot_decode.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/one_hot_encode.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/plot_bed_histograms.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/separate_bam_by_bc.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/helpers/archived/split_and_index_BAM.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/print_bam_query_seq.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/subsample_fasta_from_bed.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/archived/subsample_pod5.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/bed_functions.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/complement_base_list.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/fasta_functions.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/ohe.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/informatics/sequence_encoding.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/logging_utils.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/data/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/data/anndata_data_module.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/data/preprocessing.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/evaluation/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/evaluation/eval_utils.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/evaluation/evaluators.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/inference/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/inference/inference_utils.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/inference/lightning_inference.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/inference/sklearn_inference.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/inference/sliding_window_inference.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/models/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/models/base.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/models/cnn.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/models/lightning_base.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/models/mlp.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/models/positional.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/models/rnn.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/models/sklearn_models.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/models/transformer.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/models/wrappers.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/training/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/training/train_lightning_model.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/training/train_sklearn_model.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/utils/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/utils/device.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/machine_learning/utils/grl.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/metadata.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/optional_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/plotting/autocorrelation_plotting.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/plotting/chimeric_plotting.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/plotting/classifiers.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/plotting/general_plotting.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/plotting/latent_plotting.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/append_mismatch_frequency_sites.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/append_sequence_mismatch_annotations.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/archived/add_read_length_and_mapping_qc.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/archived/calculate_complexity.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/archived/mark_duplicates.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/archived/preprocessing.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/archived/remove_duplicates.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/binarize.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/binary_layers_to_ohe.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/calculate_complexity_II.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/calculate_consensus.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/calculate_coverage.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/calculate_pairwise_differences.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/calculate_pairwise_hamming_distances.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/calculate_position_Youden.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/calculate_read_length_stats.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/calculate_read_modification_stats.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/filter_adata_by_nan_proportion.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/filter_reads_on_modification_thresholds.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/make_dirs.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/min_non_diagonal.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/recipes.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/reindex_references_adata.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/preprocessing/subsample_adata.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/schema/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/schema/anndata_schema_v1.yaml +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/archived/apply_hmm.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/archived/classifiers.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/archived/classify_methylated_features.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/archived/classify_non_methylated_features.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/archived/subset_adata_v1.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/archived/subset_adata_v2.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/calculate_knn.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/calculate_leiden.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/calculate_nmf.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/calculate_pca.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/calculate_umap.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/cluster_adata_on_methylation.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/general_tools.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/rolling_nn_distance.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/sequence_alignment.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/subset_adata.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/smftools/tools/tensor_factorization.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/_test_inputs/_test_bed_I.bed +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/_test_inputs/_test_fasta_I.fa +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/_test_inputs/_test_fasta_I.fa.fai +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/_test_inputs/_test_pod5_I.pod5 +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/conftest.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/e2e/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/e2e/cli/test_spatial_adata.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/integration/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/cli/test_cli_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/config/test_config_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/datasets/test_datasets_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/hmm/test_hmm_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/import_helpers.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/informatics/test_informatics_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/machine_learning/data/test_data_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/machine_learning/evaluation/test_evaluation_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/machine_learning/inference/test_inference_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/machine_learning/models/test_models_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/machine_learning/training/test_training_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/machine_learning/utils/test_utils_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/plotting/test_plotting_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/preprocessing/test_preprocessing_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/test_smftools_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/smoke/tools/test_tools_imports.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/__init__.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/config/test_LoadExperimentConfig.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/datasets/test_datasets.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/hmm/test_mask_read_span.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/informatics/test_bam_base_identities.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/informatics/test_bam_read_tags.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/informatics/test_bam_secondary_supplementary.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/informatics/test_h5ad_secondary_supplementary.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/informatics/test_modkit_sequence_encoding.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/informatics/test_tool_backends.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_annotate_zero_hamming_segments_parent_layer.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_append_mismatch_frequency_sites.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_append_reference_strand_quality_stats.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_append_sequence_mismatch_annotations.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_calculate_nmf.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_chimeric_adata_mod_hamming_flag.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_chimeric_adata_span_layer.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_chimeric_adata_top_segments.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_combined_hmm_length_clustermap_barplot.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_combined_hmm_length_clustermap_outputs.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_combined_hmm_raw_clustermap_nan_fill.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_combined_raw_clustermap_barplot_nan_ignore.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_combined_raw_clustermap_nan_fill.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_hmm_clustermap_colormap.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_latent_adata_var_filters.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_length_layer_subclass_mapping.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_metadata.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_methylation_fraction_nan_handling.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_cp_sequence_components.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_hamming_span_trio.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_hmm_size_contours_feature_ranges.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_hmm_size_contours_nan_values.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_mismatch_base_frequency_by_position.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_nmf_components.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_pca_components.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_rolling_nn_and_layer.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_rolling_nn_and_two_layers.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_sequence_integer_encoding_clustermaps.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_zero_hamming_pair_counts.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_plot_zero_hamming_span_and_layer.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_readwrite.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_rolling_nn_distance.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_tensor_factorization.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/test_variant_adata_overlay_config_forwarding.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/tools/test_calculate_umap.py +0 -0
- {smftools-0.3.2 → smftools-0.4.5}/tests/unit/tools/test_sequence_alignment.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"sessionId":"15d14348-db85-4d8f-9fbc-7c6144caa7f9","pid":71788,"procStart":"Sun Jul 19 22:49:56 2026","acquiredAt":1784563851455}
|
|
@@ -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,7 +45,7 @@ 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
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: smftools
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.5
|
|
4
4
|
Summary: Single Molecule Footprinting Analysis in Python.
|
|
5
5
|
Project-URL: Source, https://github.com/jkmckenna/smftools
|
|
6
6
|
Project-URL: Documentation, https://smftools.readthedocs.io/
|
|
@@ -47,13 +47,15 @@ Requires-Python: >=3.10
|
|
|
47
47
|
Requires-Dist: anndata>=0.10.0
|
|
48
48
|
Requires-Dist: biopython>=1.79
|
|
49
49
|
Requires-Dist: click
|
|
50
|
+
Requires-Dist: dask[array]
|
|
50
51
|
Requires-Dist: numpy<2,>=1.22.0
|
|
51
52
|
Requires-Dist: pandas>=1.4.2
|
|
53
|
+
Requires-Dist: psutil>=5.9.0
|
|
52
54
|
Requires-Dist: scipy>=1.7.3
|
|
53
55
|
Requires-Dist: tqdm
|
|
54
56
|
Provides-Extra: all
|
|
55
57
|
Requires-Dist: captum; extra == 'all'
|
|
56
|
-
Requires-Dist:
|
|
58
|
+
Requires-Dist: edlib; extra == 'all'
|
|
57
59
|
Requires-Dist: hydra-core; extra == 'all'
|
|
58
60
|
Requires-Dist: igraph; extra == 'all'
|
|
59
61
|
Requires-Dist: leidenalg; extra == 'all'
|
|
@@ -63,8 +65,6 @@ Requires-Dist: multiqc; extra == 'all'
|
|
|
63
65
|
Requires-Dist: networkx>=3.2; extra == 'all'
|
|
64
66
|
Requires-Dist: omegaconf; extra == 'all'
|
|
65
67
|
Requires-Dist: pod5>=0.1.21; extra == 'all'
|
|
66
|
-
Requires-Dist: pybedtools>=0.12.0; extra == 'all'
|
|
67
|
-
Requires-Dist: pybigwig>=0.3.24; extra == 'all'
|
|
68
68
|
Requires-Dist: pynndescent>=0.5.10; extra == 'all'
|
|
69
69
|
Requires-Dist: pysam>=0.19.1; extra == 'all'
|
|
70
70
|
Requires-Dist: scikit-learn>=1.0.2; extra == 'all'
|
|
@@ -75,15 +75,40 @@ Requires-Dist: torch>=1.9.0; extra == 'all'
|
|
|
75
75
|
Requires-Dist: umap-learn>=0.5.5; extra == 'all'
|
|
76
76
|
Requires-Dist: upsetplot; extra == 'all'
|
|
77
77
|
Requires-Dist: wandb; extra == 'all'
|
|
78
|
+
Requires-Dist: xgboost>=1.7; extra == 'all'
|
|
79
|
+
Provides-Extra: all-2
|
|
80
|
+
Requires-Dist: captum; extra == 'all-2'
|
|
81
|
+
Requires-Dist: edlib; extra == 'all-2'
|
|
82
|
+
Requires-Dist: hydra-core; extra == 'all-2'
|
|
83
|
+
Requires-Dist: igraph; extra == 'all-2'
|
|
84
|
+
Requires-Dist: leidenalg; extra == 'all-2'
|
|
85
|
+
Requires-Dist: lightning; extra == 'all-2'
|
|
86
|
+
Requires-Dist: matplotlib>=3.6.2; extra == 'all-2'
|
|
87
|
+
Requires-Dist: multiqc; extra == 'all-2'
|
|
88
|
+
Requires-Dist: networkx>=3.2; extra == 'all-2'
|
|
89
|
+
Requires-Dist: omegaconf; extra == 'all-2'
|
|
90
|
+
Requires-Dist: pod5>=0.1.21; extra == 'all-2'
|
|
91
|
+
Requires-Dist: pybedtools>=0.12.0; extra == 'all-2'
|
|
92
|
+
Requires-Dist: pybigwig>=0.3.24; extra == 'all-2'
|
|
93
|
+
Requires-Dist: pynndescent>=0.5.10; extra == 'all-2'
|
|
94
|
+
Requires-Dist: pysam>=0.19.1; extra == 'all-2'
|
|
95
|
+
Requires-Dist: scikit-learn>=1.0.2; extra == 'all-2'
|
|
96
|
+
Requires-Dist: seaborn>=0.11; extra == 'all-2'
|
|
97
|
+
Requires-Dist: shap; extra == 'all-2'
|
|
98
|
+
Requires-Dist: tensorly; extra == 'all-2'
|
|
99
|
+
Requires-Dist: torch>=1.9.0; extra == 'all-2'
|
|
100
|
+
Requires-Dist: umap-learn>=0.5.5; extra == 'all-2'
|
|
101
|
+
Requires-Dist: upsetplot; extra == 'all-2'
|
|
102
|
+
Requires-Dist: wandb; extra == 'all-2'
|
|
103
|
+
Requires-Dist: xgboost>=1.7; extra == 'all-2'
|
|
78
104
|
Provides-Extra: cluster
|
|
79
|
-
Requires-Dist: fastcluster; extra == 'cluster'
|
|
80
105
|
Requires-Dist: igraph; extra == 'cluster'
|
|
81
106
|
Requires-Dist: leidenalg; extra == 'cluster'
|
|
82
107
|
Provides-Extra: dev
|
|
83
108
|
Requires-Dist: pre-commit; extra == 'dev'
|
|
84
109
|
Requires-Dist: pytest; extra == 'dev'
|
|
85
110
|
Requires-Dist: pytest-cov; extra == 'dev'
|
|
86
|
-
Requires-Dist: ruff; extra == 'dev'
|
|
111
|
+
Requires-Dist: ruff==0.15.0; extra == 'dev'
|
|
87
112
|
Provides-Extra: docs
|
|
88
113
|
Requires-Dist: ipython>=7.20; extra == 'docs'
|
|
89
114
|
Requires-Dist: matplotlib!=3.6.1; extra == 'docs'
|
|
@@ -108,6 +133,7 @@ Provides-Extra: ml-base
|
|
|
108
133
|
Requires-Dist: scikit-learn>=1.0.2; extra == 'ml-base'
|
|
109
134
|
Requires-Dist: tensorly; extra == 'ml-base'
|
|
110
135
|
Requires-Dist: torch>=1.9.0; extra == 'ml-base'
|
|
136
|
+
Requires-Dist: xgboost>=1.7; extra == 'ml-base'
|
|
111
137
|
Provides-Extra: ml-extended
|
|
112
138
|
Requires-Dist: captum; extra == 'ml-extended'
|
|
113
139
|
Requires-Dist: hydra-core; extra == 'ml-extended'
|
|
@@ -133,6 +159,10 @@ Requires-Dist: torch>=1.9.0; extra == 'torch'
|
|
|
133
159
|
Provides-Extra: umap
|
|
134
160
|
Requires-Dist: pynndescent>=0.5.10; extra == 'umap'
|
|
135
161
|
Requires-Dist: umap-learn>=0.5.5; extra == 'umap'
|
|
162
|
+
Provides-Extra: umi
|
|
163
|
+
Requires-Dist: edlib; extra == 'umi'
|
|
164
|
+
Provides-Extra: xgboost
|
|
165
|
+
Requires-Dist: xgboost>=1.7; extra == 'xgboost'
|
|
136
166
|
Description-Content-Type: text/markdown
|
|
137
167
|
|
|
138
168
|
[](https://pypi.org/project/smftools)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
## Analysis: `an`
|
|
2
|
+
|
|
3
|
+
Downstream statistical analysis library. Pure functions with no project-specific knowledge,
|
|
4
|
+
organised into four subpackages by role:
|
|
5
|
+
|
|
6
|
+
| Subpackage | Input | Output |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| `compute` | numpy arrays / DataFrames | arrays / dicts (no I/O) |
|
|
9
|
+
| `plot` | results + `output_path` | figure written to disk |
|
|
10
|
+
| `filters` | obs or var DataFrame | boolean `np.ndarray` mask |
|
|
11
|
+
| `config` | none (static) | configuration dicts |
|
|
12
|
+
|
|
13
|
+
### Compute
|
|
14
|
+
|
|
15
|
+
Pure statistical compute functions. No AnnData dependency (except `ep_classification`).
|
|
16
|
+
|
|
17
|
+
```{eval-rst}
|
|
18
|
+
.. autosummary::
|
|
19
|
+
:toctree: generated/analysis_compute
|
|
20
|
+
|
|
21
|
+
smftools.analysis.compute.autocorrelation
|
|
22
|
+
smftools.analysis.compute.pearson
|
|
23
|
+
smftools.analysis.compute.hmm_features
|
|
24
|
+
smftools.analysis.compute.ep_classification
|
|
25
|
+
smftools.analysis.compute.ls_periodicity
|
|
26
|
+
smftools.analysis.compute.dimensionality_reduction
|
|
27
|
+
smftools.analysis.compute.read_cache
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Plot
|
|
31
|
+
|
|
32
|
+
Figure rendering. Accepts results and an explicit `output_path`; writes a figure to disk.
|
|
33
|
+
|
|
34
|
+
```{eval-rst}
|
|
35
|
+
.. autosummary::
|
|
36
|
+
:toctree: generated/analysis_plot
|
|
37
|
+
|
|
38
|
+
smftools.analysis.plot.heatmaps
|
|
39
|
+
smftools.analysis.plot.histograms
|
|
40
|
+
smftools.analysis.plot.autocorr
|
|
41
|
+
smftools.analysis.plot.locus
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Filters
|
|
45
|
+
|
|
46
|
+
Boolean mask builders for obs-level and var-level (position) selection.
|
|
47
|
+
|
|
48
|
+
```{eval-rst}
|
|
49
|
+
.. autosummary::
|
|
50
|
+
:toctree: generated/analysis_filters
|
|
51
|
+
|
|
52
|
+
smftools.analysis.filters.obs_filters
|
|
53
|
+
smftools.analysis.filters.position_filters
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Config
|
|
57
|
+
|
|
58
|
+
Static configuration objects; no runtime inputs.
|
|
59
|
+
|
|
60
|
+
```{eval-rst}
|
|
61
|
+
.. autosummary::
|
|
62
|
+
:toctree: generated/analysis_config
|
|
63
|
+
|
|
64
|
+
smftools.analysis.config.hmm_histogram
|
|
65
|
+
```
|
|
@@ -29,7 +29,7 @@ The load command builds the raw AnnData object from your raw sequencing data. It
|
|
|
29
29
|
- adata.X contains binarized modification data (conversion/deaminase), or modification probabilitiesc (native).
|
|
30
30
|
- Adds basic read-level QC annotations (Read start, end, length, mean quality).
|
|
31
31
|
- Adds layers encoding read DNA sequences, base quality scores, base mismatches.
|
|
32
|
-
- Maintains BAM
|
|
32
|
+
- Maintains BAM tags/flags in adata.obs (UMI and barcode annotations loaded from Parquet sidecars).
|
|
33
33
|
- Writes the raw AnnData to the canonical output path and runs MultiQC.
|
|
34
34
|
- Optionally deletes intermediate BAMs, H5ADs, and TSVs.
|
|
35
35
|
|
|
@@ -52,6 +52,26 @@ The preprocess command performs QC, binarization, filtering, and duplicate detec
|
|
|
52
52
|
- Visualizes read span masks and base quality scores with clustermaps.
|
|
53
53
|
- Writes preprocessed (duplicates flagged, but kept) and preprocessed/deduplicated AnnData outputs.
|
|
54
54
|
|
|
55
|
+
General AnnData structures added by `preprocess`:
|
|
56
|
+
|
|
57
|
+
- `obs`
|
|
58
|
+
- sample-sheet metadata columns (when `sample_sheet_path` is provided) mapped by `sample_sheet_mapping_column`.
|
|
59
|
+
- read-level QC/ratio/modification summary fields used for filtering and plotting (for example read length/quality/mapping and fraction-modified metrics).
|
|
60
|
+
- optional UMI preprocessing fields when `use_umi=True`, including validity and clustering annotations (for example `U1_valid`, `U2_valid`, `U1_cluster`, `U2_cluster`, `RX_cluster`).
|
|
61
|
+
- optional UMI bipartite graph annotations and dominance metrics (for example edge-count/dominant-pair style fields) plus group-level stats in `uns`.
|
|
62
|
+
- duplicate-detection fields for non-direct modalities (for example merged cluster IDs/sizes and duplicate flags).
|
|
63
|
+
- `var`
|
|
64
|
+
- per-reference position masks and site-context columns used downstream (for example `position_in_<reference>` and `<reference>_<site_type>_site`).
|
|
65
|
+
- optional reindex columns from `reindex_references_adata` (suffix controlled by `reindexed_var_suffix`).
|
|
66
|
+
- `layers`
|
|
67
|
+
- binarized signal layer for direct modality (name controlled by `output_binary_layer_name`).
|
|
68
|
+
- NaN-cleaning strategy layers (for example `fill_nans_closest`, `nan0_0minus1`, `nan1_12`, `nan_minus_1`, `nan_half`).
|
|
69
|
+
- base-context/site-type derived binary layers used for downstream analyses and duplicate detection.
|
|
70
|
+
- `obsm`
|
|
71
|
+
- base-context level arrays written by context appending steps for downstream plotting/analysis.
|
|
72
|
+
- `uns`
|
|
73
|
+
- preprocessing stage metadata/flags plus auxiliary analysis outputs (for example UMI bipartite summaries and complexity-analysis summaries/fit outputs).
|
|
74
|
+
|
|
55
75
|
### `smftools variant`
|
|
56
76
|
|
|
57
77
|
The variant command focuses on DNA sequence variation analyses. It:
|
|
@@ -61,6 +81,24 @@ The variant command focuses on DNA sequence variation analyses. It:
|
|
|
61
81
|
- Generates z-scores for variant occurance given read level Q-scores and assuming uniform Palt transitions.
|
|
62
82
|
- Visualizes read DNA sequence encodings and mismatch encodings.
|
|
63
83
|
|
|
84
|
+
General AnnData structures added by `variant`:
|
|
85
|
+
|
|
86
|
+
- `layers`
|
|
87
|
+
- `"{seq1_col}__{seq2_col}_variant_call"`: per-position variant call state (`1=seq1`, `2=seq2`, `0=unknown/no-coverage`, `-1=non-informative/non-mismatch`).
|
|
88
|
+
- `"{seq1_col}__{seq2_col}_variant_segments"`: segmented track per read span (`0=outside span`, `1=seq1 segment`, `2=seq2 segment`, `3=transition zone`).
|
|
89
|
+
- `var`
|
|
90
|
+
- `"{prefix}_seq1_acceptable_bases"` and `"{prefix}_seq2_acceptable_bases"`: accepted base sets used for variant matching at informative sites.
|
|
91
|
+
- `"{prefix}_informative_site"`: boolean mask of informative mismatch positions.
|
|
92
|
+
- `obs`
|
|
93
|
+
- `"{prefix}_breakpoint_count"` and `"{prefix}_is_chimeric"`: per-read breakpoint summary.
|
|
94
|
+
- `"{prefix}_variant_breakpoints"` and `variant_breakpoints`: list of inferred breakpoint positions per read.
|
|
95
|
+
- `chimeric_variant_sites` and `chimeric_variant_sites_type`: mismatch-segment chimera flags and categorical type labels.
|
|
96
|
+
- `"{prefix}_variant_segment_cigar"` and `variant_segment_cigar`: run-length string using `S` (self) and `X` (other).
|
|
97
|
+
- `"{prefix}_variant_self_base_count"` / `variant_self_base_count`: count of self-classified bases per read span.
|
|
98
|
+
- `"{prefix}_variant_other_base_count"` / `variant_other_base_count`: count of other-classified bases per read span.
|
|
99
|
+
- `uns`
|
|
100
|
+
- workflow completion flags (e.g., `append_variant_call_layer_performed`, `append_variant_segment_layer_performed`) and prior mismatch/substitution metadata used by variant calling.
|
|
101
|
+
|
|
64
102
|
### `smftools chimeric`
|
|
65
103
|
|
|
66
104
|
The chimeric command is meant to find putative PCR chimeras. It:
|
|
@@ -69,7 +107,22 @@ The chimeric command is meant to find putative PCR chimeras. It:
|
|
|
69
107
|
- Performs sliding window nearest neighbor hamming distance analysis per read.
|
|
70
108
|
- Visualizes the windowed nearest neighbor hamming distances per read.
|
|
71
109
|
- Assembles maximum spanning intervals of 0-hamming distance neighbors per read within the reference/sample.
|
|
72
|
-
|
|
110
|
+
|
|
111
|
+
General AnnData structures added by `chimeric`:
|
|
112
|
+
|
|
113
|
+
- `obsm`
|
|
114
|
+
- `cfg.rolling_nn_obsm_key`: per-read rolling nearest-neighbor hamming distance tracks.
|
|
115
|
+
- `layers`
|
|
116
|
+
- `zero_hamming_distance_spans`: within-sample/reference top span mask derived from zero-distance partners.
|
|
117
|
+
- `cross_sample_zero_hamming_distance_spans`: top span mask from cross-sample pooling.
|
|
118
|
+
- `delta_zero_hamming_distance_spans`: clipped difference (`within - cross`) used for delta-based chimera evidence.
|
|
119
|
+
- `obs`
|
|
120
|
+
- `chimeric_by_mod_hamming_distance`: boolean flag based on longest positive delta span threshold.
|
|
121
|
+
- per-read top-segment tuple lists under keys like `"{rolling_nn_obsm_key}__top_segments"` (when top-segment extraction is enabled).
|
|
122
|
+
- `uns`
|
|
123
|
+
- rolling-distance and zero-pair metadata keyed by `rolling_nn_obsm_key`, including maps such as:
|
|
124
|
+
- `"{rolling_nn_obsm_key}_zero_pairs_map"` and `"{rolling_nn_obsm_key}_reference_map"`.
|
|
125
|
+
- optional stored segment records (`...__zero_hamming_segments`) and plotting metadata (`..._starts`, `..._window`, `..._step`, etc.), depending on cleanup settings in config.
|
|
73
126
|
|
|
74
127
|
### `smftools spatial`
|
|
75
128
|
|
|
@@ -133,4 +186,4 @@ smftools batch spatial /path/to/configs.tsv --column my_config --sep $'\t'
|
|
|
133
186
|
```
|
|
134
187
|
|
|
135
188
|
Each path is validated; missing configs are skipped with a message, while valid configs run the
|
|
136
|
-
requested task in sequence.
|
|
189
|
+
requested task in sequence.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Experiment configuration CSV
|
|
2
|
+
|
|
3
|
+
smftools uses an experiment configuration CSV to define paths, modality settings, and workflow
|
|
4
|
+
options. You can start from the repository template (`experiment_config.csv`) and fill in your
|
|
5
|
+
experiment-specific values. The configuration CSV can override any parameter within the default.yaml
|
|
6
|
+
and modality specific config .yamls found within the config subpackage of smftools.
|
|
7
|
+
|
|
8
|
+
## CSV format
|
|
9
|
+
|
|
10
|
+
The configuration CSV is a table with the following columns:
|
|
11
|
+
|
|
12
|
+
| Column | Description |
|
|
13
|
+
| --- | --- |
|
|
14
|
+
| `variable` | Configuration key name (used by smftools). |
|
|
15
|
+
| `value` | Your value for this key. |
|
|
16
|
+
| `help` | Short description of the key. |
|
|
17
|
+
| `options` | Expected values (when applicable). |
|
|
18
|
+
| `type` | Expected value type (`str`, `int`, `float`, `list`). |
|
|
19
|
+
|
|
20
|
+
A shortened example looks like:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
variable,value,help,options,type
|
|
24
|
+
smf_modality,conversion,Modality of SMF. Can either be conversion or direct.,"conversion, direct",str
|
|
25
|
+
input_data_path,/path_to_POD5_directory,Path to directory/file containing input sequencing data,,str
|
|
26
|
+
fasta,/path_to_fasta.fasta,Path to initial FASTA file,,str
|
|
27
|
+
output_directory,/outputs,Directory to act as root for all analysis outputs,,str
|
|
28
|
+
experiment_name,,An experiment name for the final h5ad file,,str
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Common fields
|
|
32
|
+
|
|
33
|
+
Below are some of the most commonly edited fields and how they affect the CLI workflows:
|
|
34
|
+
|
|
35
|
+
- `smf_modality`: Defines whether the data is `conversion`, `direct` or `deaminase`, which determines
|
|
36
|
+
preprocessing and HMM feature handling.
|
|
37
|
+
- `input_data_path`: Location of raw input data (fast5/pod5/fastq/bam).
|
|
38
|
+
- `fasta`: Reference FASTA for alignment and positional context.
|
|
39
|
+
- `fasta_regions_of_interest`: Optional BED file to subset the FASTA.
|
|
40
|
+
- `output_directory`: Root output folder for all generated AnnData files and plots.
|
|
41
|
+
- `experiment_name`: Base name used for output AnnData files.
|
|
42
|
+
- `model_dir` / `model`: Dorado basecalling model configuration (nanopore runs).
|
|
43
|
+
- `demux_backend`: Demultiplexing backend (`dorado` or `smftools`).
|
|
44
|
+
- `barcode_kit`: Barcode kit name. Required for `dorado`; for `smftools`, use either a known alias or
|
|
45
|
+
`custom` plus `custom_barcode_yaml`.
|
|
46
|
+
- `custom_barcode_yaml`: Barcode reference YAML path used when `demux_backend=smftools` and
|
|
47
|
+
`barcode_kit=custom`.
|
|
48
|
+
- `use_umi` / `umi_yaml`: Optional UMI extraction controls. `umi_yaml` can define flanking-aware UMI
|
|
49
|
+
extraction.
|
|
50
|
+
- `mapping_threshold`: Minimum mapping proportion per reference required for downstream steps.
|
|
51
|
+
- `mod_list`: Modification calls to use for direct-modality workflows.
|
|
52
|
+
- `conversion_types`: Target modification types for conversion workflows.
|
|
53
|
+
|
|
54
|
+
## Tips
|
|
55
|
+
|
|
56
|
+
- Keep paths absolute whenever possible to avoid ambiguity.
|
|
57
|
+
- Lists are written in bracketed form, e.g. `[5mC]` or `[5mC_5hmC]`.
|
|
58
|
+
- If you update the CSV, re-run the CLI command pointing at the updated file.
|
|
59
|
+
|
|
60
|
+
## Read annotations
|
|
61
|
+
|
|
62
|
+
smftools annotates reads during `load_adata` and stores the results in `adata.obs`. Standard BAM
|
|
63
|
+
tags (e.g. `NM`, `MD`, `MM`, `ML`) are read directly from BAM files. UMI and barcode annotations
|
|
64
|
+
are computed in parallel and written to Parquet sidecar files alongside the aligned BAM, then loaded
|
|
65
|
+
into `adata.obs` from those sidecars. The aligned BAM itself is not modified.
|
|
66
|
+
|
|
67
|
+
**UMI annotations** (written to `.umi_tags.parquet`)
|
|
68
|
+
|
|
69
|
+
- `U1`: Orientation-corrected UMI for the *left* reference end of the mapped fragment (forward reads: US, reverse reads: UE).
|
|
70
|
+
- `U2`: Orientation-corrected UMI for the *right* reference end of the mapped fragment (forward reads: UE, reverse reads: US).
|
|
71
|
+
- `US`: Positional UMI from read start (delimited `UMI_seq;slot;flank_seq`).
|
|
72
|
+
- `UE`: Positional UMI from read end (delimited `UMI_seq;slot;flank_seq`).
|
|
73
|
+
- `RX`: Combined UMI string (`U1-U2`, or `U1`/`U2` if only one is present).
|
|
74
|
+
- `FC`: Flank context of the U1/U2 pair (e.g. `top-bottom`).
|
|
75
|
+
|
|
76
|
+
When `threads` is set, UMI extraction is parallelized across multiple CPU cores.
|
|
77
|
+
|
|
78
|
+
**Barcode annotations (smftools demux backend)** (written to `.barcode_tags.parquet`)
|
|
79
|
+
|
|
80
|
+
- `BC`: Assigned barcode name, or `unclassified`.
|
|
81
|
+
- `BM`: Match type (`both`, `read_start_only`, `read_end_only`, `mismatch`, `unclassified`).
|
|
82
|
+
- `B1`: Edit distance for the read-start barcode match.
|
|
83
|
+
- `B2`: Edit distance for the read-end barcode match.
|
|
84
|
+
- `B3`: Extracted barcode sequence from the read start (forward orientation).
|
|
85
|
+
- `B4`: Extracted barcode sequence from the read end (reverse-complemented to forward orientation).
|
|
86
|
+
- `B5`: Barcode name matched at the read start (corresponds to `B1`/`B3`).
|
|
87
|
+
- `B6`: Barcode name matched at the read end (corresponds to `B2`/`B4`).
|
|
88
|
+
|
|
89
|
+
When `threads` is set, barcode extraction is parallelized across multiple CPU cores.
|
|
90
|
+
Demultiplexing (splitting reads into per-barcode BAMs) uses the sidecar `BC` assignments.
|
|
91
|
+
Only primary alignments are included in split BAMs and sidecar files.
|
|
92
|
+
|
|
93
|
+
**Barcode annotations (dorado demux backend)**
|
|
94
|
+
|
|
95
|
+
- `BC`: Assigned barcode name (read from BAM tag).
|
|
96
|
+
- `bi`: Dorado barcode info array (if present; expanded into columns during load).
|
|
97
|
+
|
|
98
|
+
Notes:
|
|
99
|
+
- `BE`/`BF` are not used by smftools.
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
variable,value,help,options,type
|
|
2
|
-
smf_modality,conversion,Modality of SMF. Can either be conversion or direct.,"conversion, direct",str
|
|
3
|
-
input_data_path,/path_to_POD5_directory,Path to directory/file containing input sequencing data,,str
|
|
4
|
-
fasta,/path_to_fasta.fasta,Path to initial FASTA file,,str
|
|
5
|
-
fasta_regions_of_interest,/path_to_bed.bed,Path to a bed file to subsample the fasta on.,,str
|
|
6
|
-
output_directory,/outputs,Directory to act as root for all analysis outputs,,str
|
|
7
|
-
experiment_name,,An experiment name for the final h5ad file,,str
|
|
8
|
-
model_dir,/path_to_dorado_model_dir,Path,,str
|
|
9
|
-
model,None,The dorado basecalling model to use,,str
|
|
10
|
-
barcode_kit,SQK-NBD114-24,The barcoding kit used for the experiment,,str
|
|
11
|
-
mapping_threshold,0.05,Minimum proportion of reads mapping to a reference to further use that reference (Ranges from 0-1 as a proportion of mapped reads),,float
|
|
12
|
-
mod_list,[5mC_5hmC],Modified base names for Dorado,"""6mA"", ""5mC_5hmC""",list
|
|
13
|
-
batch_size,4,number of samples to analyze at a time,,int
|
|
1
|
+
variable,value,help,options,type
|
|
2
|
+
smf_modality,conversion,Modality of SMF. Can either be conversion or direct.,"conversion, direct",str
|
|
3
|
+
input_data_path,/path_to_POD5_directory,Path to directory/file containing input sequencing data,,str
|
|
4
|
+
fasta,/path_to_fasta.fasta,Path to initial FASTA file,,str
|
|
5
|
+
fasta_regions_of_interest,/path_to_bed.bed,Path to a bed file to subsample the fasta on.,,str
|
|
6
|
+
output_directory,/outputs,Directory to act as root for all analysis outputs,,str
|
|
7
|
+
experiment_name,,An experiment name for the final h5ad file,,str
|
|
8
|
+
model_dir,/path_to_dorado_model_dir,Path,,str
|
|
9
|
+
model,None,The dorado basecalling model to use,,str
|
|
10
|
+
barcode_kit,SQK-NBD114-24,The barcoding kit used for the experiment,,str
|
|
11
|
+
mapping_threshold,0.05,Minimum proportion of reads mapping to a reference to further use that reference (Ranges from 0-1 as a proportion of mapped reads),,float
|
|
12
|
+
mod_list,[5mC_5hmC],Modified base names for Dorado,"""6mA"", ""5mC_5hmC""",list
|
|
13
|
+
batch_size,4,number of samples to analyze at a time,,int
|
|
14
14
|
conversion_types,[5mC],Types of modification types to use in conversion SMF,"5mC', '6mA'",list
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
Sample,Sample_names,MTase,Time (sec),Group
|
|
2
|
-
0,,Hia5,0,0
|
|
3
|
-
1,,Hia5,15,0
|
|
4
|
-
2,,Hia5,30,0
|
|
5
|
-
3,,Hia5,120,0
|
|
6
|
-
4,,Hia5,300,0
|
|
7
|
-
5,,Hia5,0,1
|
|
8
|
-
6,,Hia5,15,1
|
|
9
|
-
7,,Hia5,30,1
|
|
10
|
-
8,,Hia5,120,1
|
|
1
|
+
Sample,Sample_names,MTase,Time (sec),Group
|
|
2
|
+
0,,Hia5,0,0
|
|
3
|
+
1,,Hia5,15,0
|
|
4
|
+
2,,Hia5,30,0
|
|
5
|
+
3,,Hia5,120,0
|
|
6
|
+
4,,Hia5,300,0
|
|
7
|
+
5,,Hia5,0,1
|
|
8
|
+
6,,Hia5,15,1
|
|
9
|
+
7,,Hia5,30,1
|
|
10
|
+
8,,Hia5,120,1
|
|
11
11
|
9,,Hia5,300,1
|
|
@@ -43,8 +43,10 @@ dependencies = [
|
|
|
43
43
|
"anndata>=0.10.0",
|
|
44
44
|
"biopython>=1.79",
|
|
45
45
|
"click",
|
|
46
|
+
"dask[array]",
|
|
46
47
|
"numpy>=1.22.0,<2",
|
|
47
48
|
"pandas>=1.4.2",
|
|
49
|
+
"psutil>=5.9.0",
|
|
48
50
|
"scipy>=1.7.3",
|
|
49
51
|
"tqdm",
|
|
50
52
|
]
|
|
@@ -60,9 +62,9 @@ smftools = "smftools.cli_entry:cli"
|
|
|
60
62
|
[project.optional-dependencies]
|
|
61
63
|
|
|
62
64
|
dev = [
|
|
63
|
-
"ruff",
|
|
64
|
-
"pre-commit",
|
|
65
|
-
"pytest",
|
|
65
|
+
"ruff==0.15.0",
|
|
66
|
+
"pre-commit",
|
|
67
|
+
"pytest",
|
|
66
68
|
"pytest-cov"]
|
|
67
69
|
|
|
68
70
|
docs = [
|
|
@@ -85,7 +87,6 @@ docs = [
|
|
|
85
87
|
]
|
|
86
88
|
|
|
87
89
|
cluster = [
|
|
88
|
-
"fastcluster",
|
|
89
90
|
"igraph",
|
|
90
91
|
"leidenalg",
|
|
91
92
|
]
|
|
@@ -120,6 +121,11 @@ ml-base = [
|
|
|
120
121
|
"scikit-learn>=1.0.2",
|
|
121
122
|
"tensorly",
|
|
122
123
|
"torch>=1.9.0",
|
|
124
|
+
"xgboost>=1.7",
|
|
125
|
+
]
|
|
126
|
+
|
|
127
|
+
xgboost = [
|
|
128
|
+
"xgboost>=1.7",
|
|
123
129
|
]
|
|
124
130
|
|
|
125
131
|
ml-extended = [
|
|
@@ -135,6 +141,10 @@ qc = [
|
|
|
135
141
|
"multiqc",
|
|
136
142
|
]
|
|
137
143
|
|
|
144
|
+
umi = [
|
|
145
|
+
"edlib",
|
|
146
|
+
]
|
|
147
|
+
|
|
138
148
|
umap = [
|
|
139
149
|
"pynndescent>=0.5.10",
|
|
140
150
|
"umap-learn>=0.5.5",
|
|
@@ -146,7 +156,48 @@ torch = [
|
|
|
146
156
|
|
|
147
157
|
all = [
|
|
148
158
|
# cluster
|
|
149
|
-
"
|
|
159
|
+
"igraph",
|
|
160
|
+
"leidenalg",
|
|
161
|
+
|
|
162
|
+
# informatics
|
|
163
|
+
"pysam>=0.19.1",
|
|
164
|
+
|
|
165
|
+
# misc
|
|
166
|
+
"networkx>=3.2",
|
|
167
|
+
"upsetplot",
|
|
168
|
+
|
|
169
|
+
# ont
|
|
170
|
+
"pod5>=0.1.21",
|
|
171
|
+
|
|
172
|
+
# plotting
|
|
173
|
+
"matplotlib>=3.6.2",
|
|
174
|
+
"seaborn>=0.11",
|
|
175
|
+
|
|
176
|
+
# ml
|
|
177
|
+
"captum",
|
|
178
|
+
"hydra-core",
|
|
179
|
+
"lightning",
|
|
180
|
+
"omegaconf",
|
|
181
|
+
"scikit-learn>=1.0.2",
|
|
182
|
+
"shap",
|
|
183
|
+
"tensorly",
|
|
184
|
+
"torch>=1.9.0",
|
|
185
|
+
"wandb",
|
|
186
|
+
"xgboost>=1.7",
|
|
187
|
+
|
|
188
|
+
# umap
|
|
189
|
+
"pynndescent>=0.5.10",
|
|
190
|
+
"umap-learn>=0.5.5",
|
|
191
|
+
|
|
192
|
+
# qc
|
|
193
|
+
"multiqc",
|
|
194
|
+
|
|
195
|
+
# umi
|
|
196
|
+
"edlib",
|
|
197
|
+
]
|
|
198
|
+
|
|
199
|
+
all_2 = [
|
|
200
|
+
# cluster
|
|
150
201
|
"igraph",
|
|
151
202
|
"leidenalg",
|
|
152
203
|
|
|
@@ -176,6 +227,7 @@ all = [
|
|
|
176
227
|
"tensorly",
|
|
177
228
|
"torch>=1.9.0",
|
|
178
229
|
"wandb",
|
|
230
|
+
"xgboost>=1.7",
|
|
179
231
|
|
|
180
232
|
# umap
|
|
181
233
|
"pynndescent>=0.5.10",
|
|
@@ -183,6 +235,9 @@ all = [
|
|
|
183
235
|
|
|
184
236
|
# qc
|
|
185
237
|
"multiqc",
|
|
238
|
+
|
|
239
|
+
# umi
|
|
240
|
+
"edlib",
|
|
186
241
|
]
|
|
187
242
|
|
|
188
243
|
[tool.hatch.build]
|