gippa 1.0.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.
- gippa-1.0.0/.gitignore +22 -0
- gippa-1.0.0/CHANGELOG.md +331 -0
- gippa-1.0.0/CITATION.cff +25 -0
- gippa-1.0.0/LICENSE +21 -0
- gippa-1.0.0/NOTICE.md +96 -0
- gippa-1.0.0/PKG-INFO +164 -0
- gippa-1.0.0/README.md +114 -0
- gippa-1.0.0/pyproject.toml +182 -0
- gippa-1.0.0/src/gippa/__init__.py +3 -0
- gippa-1.0.0/src/gippa/annotate/__init__.py +1 -0
- gippa-1.0.0/src/gippa/annotate/antismash.py +82 -0
- gippa-1.0.0/src/gippa/annotate/antismash_cmd.py +35 -0
- gippa-1.0.0/src/gippa/annotate/bakta.py +324 -0
- gippa-1.0.0/src/gippa/annotate/bakta_cmd.py +64 -0
- gippa-1.0.0/src/gippa/annotate/bakta_layers.py +108 -0
- gippa-1.0.0/src/gippa/annotate/codon_usage.py +182 -0
- gippa-1.0.0/src/gippa/annotate/genomad.py +144 -0
- gippa-1.0.0/src/gippa/annotate/genomad_cmd.py +25 -0
- gippa-1.0.0/src/gippa/annotate/layers.py +433 -0
- gippa-1.0.0/src/gippa/annotate/operons.py +209 -0
- gippa-1.0.0/src/gippa/annotate/ostir.py +116 -0
- gippa-1.0.0/src/gippa/annotate/ostir_cmd.py +14 -0
- gippa-1.0.0/src/gippa/annotate/precomputed.py +189 -0
- gippa-1.0.0/src/gippa/annotate/promotech_cmd.py +46 -0
- gippa-1.0.0/src/gippa/annotate/promoter_calculator.py +145 -0
- gippa-1.0.0/src/gippa/annotate/promoter_calculator_cmd.py +15 -0
- gippa-1.0.0/src/gippa/annotate/promoters.py +299 -0
- gippa-1.0.0/src/gippa/annotate/regions.py +330 -0
- gippa-1.0.0/src/gippa/annotate/terminatornet_cmd.py +26 -0
- gippa-1.0.0/src/gippa/annotate/terminators.py +340 -0
- gippa-1.0.0/src/gippa/annotate/tools.py +246 -0
- gippa-1.0.0/src/gippa/annotate/transtermhp_cmd.py +14 -0
- gippa-1.0.0/src/gippa/annotate/uniop_adapter.py +112 -0
- gippa-1.0.0/src/gippa/annotate/uniop_cmd.py +23 -0
- gippa-1.0.0/src/gippa/annotate/user_annotation.py +340 -0
- gippa-1.0.0/src/gippa/cli.py +1583 -0
- gippa-1.0.0/src/gippa/compare/__init__.py +1 -0
- gippa-1.0.0/src/gippa/compare/abundance.py +123 -0
- gippa-1.0.0/src/gippa/compare/detection.py +62 -0
- gippa-1.0.0/src/gippa/compare/stability.py +120 -0
- gippa-1.0.0/src/gippa/compare/versions.py +156 -0
- gippa-1.0.0/src/gippa/config/__init__.py +128 -0
- gippa-1.0.0/src/gippa/config/defaults.yaml +150 -0
- gippa-1.0.0/src/gippa/config/model.py +437 -0
- gippa-1.0.0/src/gippa/context/__init__.py +1 -0
- gippa-1.0.0/src/gippa/context/autocorrelation.py +353 -0
- gippa-1.0.0/src/gippa/context/diagnostics.py +110 -0
- gippa-1.0.0/src/gippa/context/islands.py +664 -0
- gippa-1.0.0/src/gippa/context/oriter.py +496 -0
- gippa-1.0.0/src/gippa/context/regions.py +561 -0
- gippa-1.0.0/src/gippa/context/regions_table.py +340 -0
- gippa-1.0.0/src/gippa/context/sensitivity.py +314 -0
- gippa-1.0.0/src/gippa/context/summary.py +356 -0
- gippa-1.0.0/src/gippa/context/support.py +81 -0
- gippa-1.0.0/src/gippa/context/tables.py +131 -0
- gippa-1.0.0/src/gippa/context/vocab.py +84 -0
- gippa-1.0.0/src/gippa/data/__init__.py +1 -0
- gippa-1.0.0/src/gippa/data/build_mass_equivalents.py +45 -0
- gippa-1.0.0/src/gippa/data/calibration.py +17 -0
- gippa-1.0.0/src/gippa/data/calibration.yaml +43 -0
- gippa-1.0.0/src/gippa/data/cog_categories.tsv +28 -0
- gippa-1.0.0/src/gippa/data/db_sources.yaml +121 -0
- gippa-1.0.0/src/gippa/data/demo/PROVENANCE.md +19 -0
- gippa-1.0.0/src/gippa/data/demo/layers/bakta.json.gz +0 -0
- gippa-1.0.0/src/gippa/data/demo/layers/operon_pairs.tsv.gz +0 -0
- gippa-1.0.0/src/gippa/data/demo/layers/promoters.tsv.gz +0 -0
- gippa-1.0.0/src/gippa/data/demo/layers/rbs.tsv.gz +0 -0
- gippa-1.0.0/src/gippa/data/demo/layers/rbs_novel.tsv.gz +0 -0
- gippa-1.0.0/src/gippa/data/demo/layers/regions.tsv.gz +0 -0
- gippa-1.0.0/src/gippa/data/demo/layers/terminators.tsv.gz +0 -0
- gippa-1.0.0/src/gippa/data/demo/layers/tx_rates.tsv.gz +0 -0
- gippa-1.0.0/src/gippa/data/demo/sim100k.fna.gz +0 -0
- gippa-1.0.0/src/gippa/data/demo/sim100k_peptides.tsv.gz +0 -0
- gippa-1.0.0/src/gippa/data/mass_equivalents.tsv +154 -0
- gippa-1.0.0/src/gippa/data/modifications.tsv +18 -0
- gippa-1.0.0/src/gippa/data/residue_masses.tsv +25 -0
- gippa-1.0.0/src/gippa/determinants/__init__.py +11 -0
- gippa-1.0.0/src/gippa/determinants/attribution.py +260 -0
- gippa-1.0.0/src/gippa/determinants/features.py +265 -0
- gippa-1.0.0/src/gippa/determinants/models.py +405 -0
- gippa-1.0.0/src/gippa/determinants/null.py +207 -0
- gippa-1.0.0/src/gippa/determinants/sensitivity.py +108 -0
- gippa-1.0.0/src/gippa/determinants/support.py +104 -0
- gippa-1.0.0/src/gippa/exitcodes.py +14 -0
- gippa-1.0.0/src/gippa/function/__init__.py +1 -0
- gippa-1.0.0/src/gippa/function/collections.py +228 -0
- gippa-1.0.0/src/gippa/function/elim.py +82 -0
- gippa-1.0.0/src/gippa/function/gsea.py +665 -0
- gippa-1.0.0/src/gippa/function/ora.py +476 -0
- gippa-1.0.0/src/gippa/function/running.py +80 -0
- gippa-1.0.0/src/gippa/function/sensitivity.py +73 -0
- gippa-1.0.0/src/gippa/function/summary.py +108 -0
- gippa-1.0.0/src/gippa/genetable/__init__.py +5 -0
- gippa-1.0.0/src/gippa/genetable/abundance.py +339 -0
- gippa-1.0.0/src/gippa/genetable/assemble.py +261 -0
- gippa-1.0.0/src/gippa/genetable/contract.py +641 -0
- gippa-1.0.0/src/gippa/genetable/covariates.py +232 -0
- gippa-1.0.0/src/gippa/genetable/detectability.py +412 -0
- gippa-1.0.0/src/gippa/genetable/detection.py +458 -0
- gippa-1.0.0/src/gippa/genetable/eligibility.py +16 -0
- gippa-1.0.0/src/gippa/genetable/evidence.py +308 -0
- gippa-1.0.0/src/gippa/io/__init__.py +1 -0
- gippa-1.0.0/src/gippa/io/_lines.py +37 -0
- gippa-1.0.0/src/gippa/io/_open.py +51 -0
- gippa-1.0.0/src/gippa/io/abundance.py +204 -0
- gippa-1.0.0/src/gippa/io/bed.py +130 -0
- gippa-1.0.0/src/gippa/io/cog_categories.py +22 -0
- gippa-1.0.0/src/gippa/io/compare_io.py +159 -0
- gippa-1.0.0/src/gippa/io/context_tsv.py +150 -0
- gippa-1.0.0/src/gippa/io/converters/__init__.py +24 -0
- gippa-1.0.0/src/gippa/io/converters/base.py +38 -0
- gippa-1.0.0/src/gippa/io/converters/cascadia.py +172 -0
- gippa-1.0.0/src/gippa/io/converters/diann.py +203 -0
- gippa-1.0.0/src/gippa/io/converters/generic.py +91 -0
- gippa-1.0.0/src/gippa/io/converters/strip.py +30 -0
- gippa-1.0.0/src/gippa/io/depth.py +59 -0
- gippa-1.0.0/src/gippa/io/determinants_tables.py +88 -0
- gippa-1.0.0/src/gippa/io/events.py +43 -0
- gippa-1.0.0/src/gippa/io/fasta.py +112 -0
- gippa-1.0.0/src/gippa/io/fgsea_r.py +519 -0
- gippa-1.0.0/src/gippa/io/function_resources.py +61 -0
- gippa-1.0.0/src/gippa/io/function_tables.py +59 -0
- gippa-1.0.0/src/gippa/io/genes_tsv.py +124 -0
- gippa-1.0.0/src/gippa/io/gff3.py +220 -0
- gippa-1.0.0/src/gippa/io/image_key.py +144 -0
- gippa-1.0.0/src/gippa/io/issues.py +33 -0
- gippa-1.0.0/src/gippa/io/manifest_sources.py +204 -0
- gippa-1.0.0/src/gippa/io/novel_tables.py +94 -0
- gippa-1.0.0/src/gippa/io/operon_tables.py +59 -0
- gippa-1.0.0/src/gippa/io/output_checks.py +135 -0
- gippa-1.0.0/src/gippa/io/parquet.py +32 -0
- gippa-1.0.0/src/gippa/io/peptides.py +402 -0
- gippa-1.0.0/src/gippa/io/plot_files.py +193 -0
- gippa-1.0.0/src/gippa/io/plot_support.py +48 -0
- gippa-1.0.0/src/gippa/io/probed.py +79 -0
- gippa-1.0.0/src/gippa/io/protein_fasta.py +141 -0
- gippa-1.0.0/src/gippa/io/regions_tsv.py +63 -0
- gippa-1.0.0/src/gippa/io/run_view.py +362 -0
- gippa-1.0.0/src/gippa/io/sensitivity_tsv.py +30 -0
- gippa-1.0.0/src/gippa/io/summary_tsv.py +63 -0
- gippa-1.0.0/src/gippa/io/tsv.py +111 -0
- gippa-1.0.0/src/gippa/io/variant_tables.py +70 -0
- gippa-1.0.0/src/gippa/io/vcf.py +265 -0
- gippa-1.0.0/src/gippa/io/work_tables.py +233 -0
- gippa-1.0.0/src/gippa/makedb/__init__.py +4 -0
- gippa-1.0.0/src/gippa/makedb/build.py +437 -0
- gippa-1.0.0/src/gippa/manifest.py +462 -0
- gippa-1.0.0/src/gippa/mapping/__init__.py +1 -0
- gippa-1.0.0/src/gippa/mapping/chance.py +84 -0
- gippa-1.0.0/src/gippa/mapping/contaminants.py +307 -0
- gippa-1.0.0/src/gippa/mapping/decoys.py +101 -0
- gippa-1.0.0/src/gippa/mapping/denovo_precision.py +205 -0
- gippa-1.0.0/src/gippa/mapping/diffops.py +98 -0
- gippa-1.0.0/src/gippa/mapping/digest.py +61 -0
- gippa-1.0.0/src/gippa/mapping/exact.py +206 -0
- gippa-1.0.0/src/gippa/mapping/frameshift.py +780 -0
- gippa-1.0.0/src/gippa/mapping/hits.py +46 -0
- gippa-1.0.0/src/gippa/mapping/initiator.py +230 -0
- gippa-1.0.0/src/gippa/mapping/loci.py +537 -0
- gippa-1.0.0/src/gippa/mapping/masses.py +116 -0
- gippa-1.0.0/src/gippa/mapping/miniprot.py +226 -0
- gippa-1.0.0/src/gippa/mapping/outputs.py +353 -0
- gippa-1.0.0/src/gippa/mapping/placement_fdr.py +564 -0
- gippa-1.0.0/src/gippa/mapping/protein_assign.py +239 -0
- gippa-1.0.0/src/gippa/mapping/qgram.py +236 -0
- gippa-1.0.0/src/gippa/mapping/readthrough.py +250 -0
- gippa-1.0.0/src/gippa/mapping/sixframe.py +436 -0
- gippa-1.0.0/src/gippa/mapping/tblastn.py +378 -0
- gippa-1.0.0/src/gippa/mapping/tolerant.py +343 -0
- gippa-1.0.0/src/gippa/mapping/tolerant_dp.py +342 -0
- gippa-1.0.0/src/gippa/model/__init__.py +43 -0
- gippa-1.0.0/src/gippa/model/coords.py +129 -0
- gippa-1.0.0/src/gippa/model/genes.py +176 -0
- gippa-1.0.0/src/gippa/model/genetic_code.py +77 -0
- gippa-1.0.0/src/gippa/novel/__init__.py +1 -0
- gippa-1.0.0/src/gippa/novel/candidates.py +352 -0
- gippa-1.0.0/src/gippa/novel/class_call.py +194 -0
- gippa-1.0.0/src/gippa/novel/evidence.py +376 -0
- gippa-1.0.0/src/gippa/novel/fdr.py +430 -0
- gippa-1.0.0/src/gippa/novel/outputs.py +367 -0
- gippa-1.0.0/src/gippa/operons/__init__.py +1 -0
- gippa-1.0.0/src/gippa/operons/detection_limit.py +554 -0
- gippa-1.0.0/src/gippa/operons/discordance.py +319 -0
- gippa-1.0.0/src/gippa/operons/flags.py +269 -0
- gippa-1.0.0/src/gippa/operons/missed.py +263 -0
- gippa-1.0.0/src/gippa/operons/pairs.py +293 -0
- gippa-1.0.0/src/gippa/operons/tu_table.py +84 -0
- gippa-1.0.0/src/gippa/preflight/__init__.py +1 -0
- gippa-1.0.0/src/gippa/preflight/checks.py +59 -0
- gippa-1.0.0/src/gippa/preflight/environment.py +1075 -0
- gippa-1.0.0/src/gippa/preflight/evidence.py +467 -0
- gippa-1.0.0/src/gippa/preflight/gbff.py +80 -0
- gippa-1.0.0/src/gippa/preflight/genetic_code.py +205 -0
- gippa-1.0.0/src/gippa/preflight/genome.py +317 -0
- gippa-1.0.0/src/gippa/preflight/report.py +189 -0
- gippa-1.0.0/src/gippa/preflight/run.py +668 -0
- gippa-1.0.0/src/gippa/preflight/tool_genetic_code.py +113 -0
- gippa-1.0.0/src/gippa/py.typed +0 -0
- gippa-1.0.0/src/gippa/report/__init__.py +1 -0
- gippa-1.0.0/src/gippa/report/build.py +372 -0
- gippa-1.0.0/src/gippa/report/checks.py +154 -0
- gippa-1.0.0/src/gippa/report/compare.py +66 -0
- gippa-1.0.0/src/gippa/report/content.py +378 -0
- gippa-1.0.0/src/gippa/report/snippets/islands.html +3 -0
- gippa-1.0.0/src/gippa/report/tables.py +41 -0
- gippa-1.0.0/src/gippa/report/templates/compare.html.j2 +97 -0
- gippa-1.0.0/src/gippa/report/templates/plotly_block.html.j2 +10 -0
- gippa-1.0.0/src/gippa/report/templates/report.css +16 -0
- gippa-1.0.0/src/gippa/report/templates/report.html.j2 +191 -0
- gippa-1.0.0/src/gippa/report/templates/tables.js +47 -0
- gippa-1.0.0/src/gippa/rng.py +16 -0
- gippa-1.0.0/src/gippa/runner/__init__.py +1 -0
- gippa-1.0.0/src/gippa/runner/local.py +393 -0
- gippa-1.0.0/src/gippa/runner/nextflow.py +284 -0
- gippa-1.0.0/src/gippa/runner/prereqs.py +155 -0
- gippa-1.0.0/src/gippa/runner/profiles.py +253 -0
- gippa-1.0.0/src/gippa/runner/workflow_path.py +16 -0
- gippa-1.0.0/src/gippa/schemas/__init__.py +17 -0
- gippa-1.0.0/src/gippa/schemas/annotation/id_map.schema.json +15 -0
- gippa-1.0.0/src/gippa/schemas/annotation/operon_pairs.schema.json +11 -0
- gippa-1.0.0/src/gippa/schemas/annotation/regions.schema.json +17 -0
- gippa-1.0.0/src/gippa/schemas/annotation/terminators_crosscheck.schema.json +12 -0
- gippa-1.0.0/src/gippa/schemas/annotation/tus.schema.json +16 -0
- gippa-1.0.0/src/gippa/schemas/config.schema.json +1407 -0
- gippa-1.0.0/src/gippa/schemas/datapackage.json +21 -0
- gippa-1.0.0/src/gippa/schemas/db_manifest.schema.json +52 -0
- gippa-1.0.0/src/gippa/schemas/plot_support/determinants_pd.json +12 -0
- gippa-1.0.0/src/gippa/schemas/plot_support/determinants_shap.json +11 -0
- gippa-1.0.0/src/gippa/schemas/plot_support/gc_skew.json +13 -0
- gippa-1.0.0/src/gippa/schemas/plot_support/gsea_running.json +14 -0
- gippa-1.0.0/src/gippa/schemas/plot_support/null_determinants.json +11 -0
- gippa-1.0.0/src/gippa/schemas/plot_support/null_islands.json +12 -0
- gippa-1.0.0/src/gippa/schemas/plot_support/null_regions.json +13 -0
- gippa-1.0.0/src/gippa/schemas/plot_support/null_regions_grid.json +13 -0
- gippa-1.0.0/src/gippa/schemas/plot_support/replicon_landmarks.json +14 -0
- gippa-1.0.0/src/gippa/schemas/plot_support/variant_windows.json +13 -0
- gippa-1.0.0/src/gippa/schemas/preflight.schema.json +114 -0
- gippa-1.0.0/src/gippa/schemas/run_manifest.schema.json +293 -0
- gippa-1.0.0/src/gippa/schemas/tables/autocorrelation.schema.json +24 -0
- gippa-1.0.0/src/gippa/schemas/tables/category_summary.schema.json +20 -0
- gippa-1.0.0/src/gippa/schemas/tables/compare_abundance.schema.json +21 -0
- gippa-1.0.0/src/gippa/schemas/tables/compare_detection.schema.json +15 -0
- gippa-1.0.0/src/gippa/schemas/tables/compare_stability.schema.json +16 -0
- gippa-1.0.0/src/gippa/schemas/tables/detection_summary.schema.json +16 -0
- gippa-1.0.0/src/gippa/schemas/tables/determinants_attribution.schema.json +19 -0
- gippa-1.0.0/src/gippa/schemas/tables/determinants_features.schema.json +44 -0
- gippa-1.0.0/src/gippa/schemas/tables/determinants_model.schema.json +16 -0
- gippa-1.0.0/src/gippa/schemas/tables/enrichment_detection.schema.json +33 -0
- gippa-1.0.0/src/gippa/schemas/tables/enrichment_gsea.schema.json +29 -0
- gippa-1.0.0/src/gippa/schemas/tables/genes.schema.json +82 -0
- gippa-1.0.0/src/gippa/schemas/tables/islands.schema.json +32 -0
- gippa-1.0.0/src/gippa/schemas/tables/mapping_fdr.schema.json +22 -0
- gippa-1.0.0/src/gippa/schemas/tables/novel_orfs.schema.json +34 -0
- gippa-1.0.0/src/gippa/schemas/tables/operon_flags.schema.json +19 -0
- gippa-1.0.0/src/gippa/schemas/tables/operons.schema.json +19 -0
- gippa-1.0.0/src/gippa/schemas/tables/pairs.schema.json +37 -0
- gippa-1.0.0/src/gippa/schemas/tables/peptide_hits.schema.json +30 -0
- gippa-1.0.0/src/gippa/schemas/tables/pileup.schema.json +18 -0
- gippa-1.0.0/src/gippa/schemas/tables/protein_hits.schema.json +22 -0
- gippa-1.0.0/src/gippa/schemas/tables/regions_stats.schema.json +32 -0
- gippa-1.0.0/src/gippa/schemas/tables/sensitivity.schema.json +14 -0
- gippa-1.0.0/src/gippa/schemas/tables/unmapped.schema.json +13 -0
- gippa-1.0.0/src/gippa/schemas/tables/variants.schema.json +28 -0
- gippa-1.0.0/src/gippa/setupdb/__init__.py +50 -0
- gippa-1.0.0/src/gippa/setupdb/dbdir.py +116 -0
- gippa-1.0.0/src/gippa/setupdb/images.py +259 -0
- gippa-1.0.0/src/gippa/setupdb/installed.py +29 -0
- gippa-1.0.0/src/gippa/setupdb/items.py +342 -0
- gippa-1.0.0/src/gippa/setupdb/manifest.py +133 -0
- gippa-1.0.0/src/gippa/setupdb/run.py +719 -0
- gippa-1.0.0/src/gippa/setupdb/space.py +262 -0
- gippa-1.0.0/src/gippa/setupdb/uniop_build.py +429 -0
- gippa-1.0.0/src/gippa/stats/__init__.py +1 -0
- gippa-1.0.0/src/gippa/stats/_fgsea_kernels.py +110 -0
- gippa-1.0.0/src/gippa/stats/autocorr.py +504 -0
- gippa-1.0.0/src/gippa/stats/bootstrap.py +168 -0
- gippa-1.0.0/src/gippa/stats/cutoffs.py +537 -0
- gippa-1.0.0/src/gippa/stats/decoy_fdr.py +394 -0
- gippa-1.0.0/src/gippa/stats/fgsea.py +226 -0
- gippa-1.0.0/src/gippa/stats/mayu.py +167 -0
- gippa-1.0.0/src/gippa/stats/multitest.py +38 -0
- gippa-1.0.0/src/gippa/stats/permutation.py +156 -0
- gippa-1.0.0/src/gippa/stats/poisson_binomial.py +281 -0
- gippa-1.0.0/src/gippa/stats/robust.py +130 -0
- gippa-1.0.0/src/gippa/stats/scan.py +299 -0
- gippa-1.0.0/src/gippa/stats/scores.py +54 -0
- gippa-1.0.0/src/gippa/stats/smooth.py +237 -0
- gippa-1.0.0/src/gippa/stats/tda.py +143 -0
- gippa-1.0.0/src/gippa/stats/tdist.py +348 -0
- gippa-1.0.0/src/gippa/stats/wallenius.py +110 -0
- gippa-1.0.0/src/gippa/steps/__init__.py +14 -0
- gippa-1.0.0/src/gippa/steps/annotation.py +151 -0
- gippa-1.0.0/src/gippa/steps/codon.py +87 -0
- gippa-1.0.0/src/gippa/steps/common.py +56 -0
- gippa-1.0.0/src/gippa/steps/context.py +165 -0
- gippa-1.0.0/src/gippa/steps/context_stats.py +344 -0
- gippa-1.0.0/src/gippa/steps/detectability.py +111 -0
- gippa-1.0.0/src/gippa/steps/determinants.py +242 -0
- gippa-1.0.0/src/gippa/steps/function.py +193 -0
- gippa-1.0.0/src/gippa/steps/gene_table.py +164 -0
- gippa-1.0.0/src/gippa/steps/manifest.py +165 -0
- gippa-1.0.0/src/gippa/steps/mapping.py +631 -0
- gippa-1.0.0/src/gippa/steps/novel.py +543 -0
- gippa-1.0.0/src/gippa/steps/operons.py +334 -0
- gippa-1.0.0/src/gippa/steps/plots.py +298 -0
- gippa-1.0.0/src/gippa/steps/promoters.py +96 -0
- gippa-1.0.0/src/gippa/steps/rbs.py +68 -0
- gippa-1.0.0/src/gippa/steps/regions.py +162 -0
- gippa-1.0.0/src/gippa/steps/registry.py +329 -0
- gippa-1.0.0/src/gippa/steps/sensitivity.py +302 -0
- gippa-1.0.0/src/gippa/steps/terminators.py +148 -0
- gippa-1.0.0/src/gippa/steps/transcription.py +55 -0
- gippa-1.0.0/src/gippa/steps/variants.py +243 -0
- gippa-1.0.0/src/gippa/variants/__init__.py +1 -0
- gippa-1.0.0/src/gippa/variants/align.py +373 -0
- gippa-1.0.0/src/gippa/variants/error_rates.py +124 -0
- gippa-1.0.0/src/gippa/variants/flags.py +211 -0
- gippa-1.0.0/src/gippa/variants/pileup.py +357 -0
- gippa-1.0.0/src/gippa/variants/qc.py +66 -0
- gippa-1.0.0/src/gippa/variants/vcf_records.py +201 -0
- gippa-1.0.0/src/gippa/viz/__init__.py +1 -0
- gippa-1.0.0/src/gippa/viz/base.py +218 -0
- gippa-1.0.0/src/gippa/viz/checklist.py +371 -0
- gippa-1.0.0/src/gippa/viz/circos.py +640 -0
- gippa-1.0.0/src/gippa/viz/compare.py +301 -0
- gippa-1.0.0/src/gippa/viz/correlogram.py +212 -0
- gippa-1.0.0/src/gippa/viz/detection.py +409 -0
- gippa-1.0.0/src/gippa/viz/determinants.py +425 -0
- gippa-1.0.0/src/gippa/viz/diagnostics.py +280 -0
- gippa-1.0.0/src/gippa/viz/enrichment.py +557 -0
- gippa-1.0.0/src/gippa/viz/interactive.py +60 -0
- gippa-1.0.0/src/gippa/viz/landscape.py +302 -0
- gippa-1.0.0/src/gippa/viz/locus.py +593 -0
- gippa-1.0.0/src/gippa/viz/mapping_fdr.py +332 -0
- gippa-1.0.0/src/gippa/viz/mapping_sankey.py +231 -0
- gippa-1.0.0/src/gippa/viz/novel_orfs.py +216 -0
- gippa-1.0.0/src/gippa/viz/null_panels.py +236 -0
- gippa-1.0.0/src/gippa/viz/operon_pairs.py +328 -0
- gippa-1.0.0/src/gippa/viz/qc.py +313 -0
- gippa-1.0.0/src/gippa/viz/style.py +147 -0
- gippa-1.0.0/src/gippa/viz/support.py +211 -0
- gippa-1.0.0/src/gippa/viz/twins.py +304 -0
- gippa-1.0.0/src/gippa/viz/twins_determinants.py +109 -0
- gippa-1.0.0/src/gippa/viz/twins_panels.py +286 -0
- gippa-1.0.0/src/gippa/viz/variants.py +368 -0
- gippa-1.0.0/workflow/assets/ps/ps +16 -0
- gippa-1.0.0/workflow/assets/stub/bakta.json +52 -0
- gippa-1.0.0/workflow/bin/gippa_fgsea.R +144 -0
- gippa-1.0.0/workflow/bin/gippa_terminatornet_shard +292 -0
- gippa-1.0.0/workflow/conf/base.config +73 -0
- gippa-1.0.0/workflow/conf/container_common.config +14 -0
- gippa-1.0.0/workflow/conf/containers.config +50 -0
- gippa-1.0.0/workflow/conf/farmshare.config +41 -0
- gippa-1.0.0/workflow/conf/farmshare_local.config +24 -0
- gippa-1.0.0/workflow/conf/images.json +65 -0
- gippa-1.0.0/workflow/conf/prebuilt_envs.config +20 -0
- gippa-1.0.0/workflow/conf/slurm.config +18 -0
- gippa-1.0.0/workflow/conf/standard.config +2 -0
- gippa-1.0.0/workflow/conf/test.config +4 -0
- gippa-1.0.0/workflow/containers/bactermfinder/Dockerfile +26 -0
- gippa-1.0.0/workflow/containers/fgsea/Dockerfile +18 -0
- gippa-1.0.0/workflow/containers/ostir/Dockerfile +18 -0
- gippa-1.0.0/workflow/containers/promotech/Dockerfile +31 -0
- gippa-1.0.0/workflow/containers/promoter_calculator/Dockerfile +18 -0
- gippa-1.0.0/workflow/containers/step/Dockerfile +42 -0
- gippa-1.0.0/workflow/containers/step/Dockerfile.dockerignore +7 -0
- gippa-1.0.0/workflow/containers/step/build-requirements.lock +7 -0
- gippa-1.0.0/workflow/containers/step/licences.allow +37 -0
- gippa-1.0.0/workflow/containers/step/requirements.lock +1871 -0
- gippa-1.0.0/workflow/containers/step-r/Dockerfile +46 -0
- gippa-1.0.0/workflow/containers/step-r/Dockerfile.dockerignore +7 -0
- gippa-1.0.0/workflow/containers/terminatornet/Dockerfile +26 -0
- gippa-1.0.0/workflow/containers/uniop/Dockerfile +19 -0
- gippa-1.0.0/workflow/containers/uniop/uniop.def +30 -0
- gippa-1.0.0/workflow/envs/antismash.yml +5 -0
- gippa-1.0.0/workflow/envs/bactermfinder.yml +19 -0
- gippa-1.0.0/workflow/envs/bakta.yml +5 -0
- gippa-1.0.0/workflow/envs/blast.yml +5 -0
- gippa-1.0.0/workflow/envs/cascadia.yml +47 -0
- gippa-1.0.0/workflow/envs/fgsea.yml +11 -0
- gippa-1.0.0/workflow/envs/genomad.yml +5 -0
- gippa-1.0.0/workflow/envs/locks/bactermfinder.explicit.txt +64 -0
- gippa-1.0.0/workflow/envs/locks/bactermfinder.pip.txt +50 -0
- gippa-1.0.0/workflow/envs/locks/cascadia.explicit.txt +254 -0
- gippa-1.0.0/workflow/envs/locks/cascadia.pip.txt +142 -0
- gippa-1.0.0/workflow/envs/locks/fgsea.explicit.txt +127 -0
- gippa-1.0.0/workflow/envs/locks/miniprot.explicit.txt +9 -0
- gippa-1.0.0/workflow/envs/locks/ostir.explicit.txt +48 -0
- gippa-1.0.0/workflow/envs/locks/ostir.pip.txt +3 -0
- gippa-1.0.0/workflow/envs/locks/promotech.explicit.txt +154 -0
- gippa-1.0.0/workflow/envs/locks/promotech.pip.txt +96 -0
- gippa-1.0.0/workflow/envs/locks/promoter_calculator.explicit.txt +49 -0
- gippa-1.0.0/workflow/envs/locks/promoter_calculator.pip.txt +9 -0
- gippa-1.0.0/workflow/envs/locks/terminatornet.explicit.txt +49 -0
- gippa-1.0.0/workflow/envs/locks/terminatornet.pip.txt +7 -0
- gippa-1.0.0/workflow/envs/locks/timsconvert.explicit.txt +30 -0
- gippa-1.0.0/workflow/envs/locks/timsconvert.pip.txt +37 -0
- gippa-1.0.0/workflow/envs/locks/uniop.explicit.txt +53 -0
- gippa-1.0.0/workflow/envs/locks/uniop.pip.txt +16 -0
- gippa-1.0.0/workflow/envs/miniprot.yml +5 -0
- gippa-1.0.0/workflow/envs/ostir.yml +10 -0
- gippa-1.0.0/workflow/envs/promotech.yml +28 -0
- gippa-1.0.0/workflow/envs/promoter_calculator.yml +13 -0
- gippa-1.0.0/workflow/envs/terminatornet.yml +12 -0
- gippa-1.0.0/workflow/envs/timsconvert.yml +20 -0
- gippa-1.0.0/workflow/envs/transtermhp.yml +5 -0
- gippa-1.0.0/workflow/envs/uniop.yml +11 -0
- gippa-1.0.0/workflow/main.nf +150 -0
- gippa-1.0.0/workflow/modules/local/antismash/main.nf +41 -0
- gippa-1.0.0/workflow/modules/local/antismash/meta.yml +17 -0
- gippa-1.0.0/workflow/modules/local/bactermfinder/main.nf +44 -0
- gippa-1.0.0/workflow/modules/local/bactermfinder/meta.yml +7 -0
- gippa-1.0.0/workflow/modules/local/bakta/main.nf +52 -0
- gippa-1.0.0/workflow/modules/local/bakta/meta.yml +11 -0
- gippa-1.0.0/workflow/modules/local/genomad/main.nf +39 -0
- gippa-1.0.0/workflow/modules/local/genomad/meta.yml +7 -0
- gippa-1.0.0/workflow/modules/local/gippa_step/main.nf +119 -0
- gippa-1.0.0/workflow/modules/local/gippa_step/meta.yml +32 -0
- gippa-1.0.0/workflow/modules/local/miniprot/main.nf +40 -0
- gippa-1.0.0/workflow/modules/local/miniprot/meta.yml +27 -0
- gippa-1.0.0/workflow/modules/local/ostir/main.nf +35 -0
- gippa-1.0.0/workflow/modules/local/ostir/meta.yml +7 -0
- gippa-1.0.0/workflow/modules/local/promotech/main.nf +40 -0
- gippa-1.0.0/workflow/modules/local/promotech/meta.yml +7 -0
- gippa-1.0.0/workflow/modules/local/promoter_calculator/main.nf +44 -0
- gippa-1.0.0/workflow/modules/local/promoter_calculator/meta.yml +7 -0
- gippa-1.0.0/workflow/modules/local/tblastn/main.nf +40 -0
- gippa-1.0.0/workflow/modules/local/tblastn/meta.yml +27 -0
- gippa-1.0.0/workflow/modules/local/terminatornet/main.nf +36 -0
- gippa-1.0.0/workflow/modules/local/terminatornet/meta.yml +7 -0
- gippa-1.0.0/workflow/modules/local/terminatornet_chunk/main.nf +24 -0
- gippa-1.0.0/workflow/modules/local/terminatornet_merge/main.nf +36 -0
- gippa-1.0.0/workflow/modules/local/terminatornet_plan/main.nf +26 -0
- gippa-1.0.0/workflow/modules/local/transtermhp/main.nf +34 -0
- gippa-1.0.0/workflow/modules/local/transtermhp/meta.yml +7 -0
- gippa-1.0.0/workflow/modules/local/uniop/main.nf +36 -0
- gippa-1.0.0/workflow/modules/local/uniop/meta.yml +7 -0
- gippa-1.0.0/workflow/nextflow.config +88 -0
- gippa-1.0.0/workflow/subworkflows/local/annotate.nf +273 -0
- gippa-1.0.0/workflow/subworkflows/local/context.nf +81 -0
- gippa-1.0.0/workflow/subworkflows/local/determinants.nf +39 -0
- gippa-1.0.0/workflow/subworkflows/local/function.nf +37 -0
- gippa-1.0.0/workflow/subworkflows/local/genetable.nf +58 -0
- gippa-1.0.0/workflow/subworkflows/local/mapping.nf +82 -0
- gippa-1.0.0/workflow/subworkflows/local/novel.nf +101 -0
- gippa-1.0.0/workflow/subworkflows/local/operons.nf +37 -0
- gippa-1.0.0/workflow/subworkflows/local/report.nf +26 -0
- gippa-1.0.0/workflow/subworkflows/local/sensitivity.nf +38 -0
- gippa-1.0.0/workflow/subworkflows/local/terminatornet_sharded.nf +23 -0
- gippa-1.0.0/workflow/subworkflows/local/variants.nf +75 -0
gippa-1.0.0/.gitignore
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/local/
|
|
2
|
+
.gippa/
|
|
3
|
+
.giap/
|
|
4
|
+
__pycache__/
|
|
5
|
+
*.pyc
|
|
6
|
+
.pytest_cache/
|
|
7
|
+
.ruff_cache/
|
|
8
|
+
.mypy_cache/
|
|
9
|
+
.coverage
|
|
10
|
+
htmlcov/
|
|
11
|
+
.nextflow*
|
|
12
|
+
.nf-test*
|
|
13
|
+
/logs/
|
|
14
|
+
.coverage.*
|
|
15
|
+
.hypothesis/
|
|
16
|
+
|
|
17
|
+
# mkdocs build output
|
|
18
|
+
site/
|
|
19
|
+
/dist/
|
|
20
|
+
|
|
21
|
+
# toy tests of tests/unit/test_container_pull_guard.py left by a killed run
|
|
22
|
+
test_zz_container_guard_toy_*.py
|
gippa-1.0.0/CHANGELOG.md
ADDED
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes are recorded here by towncrier from `changelog.d/` fragments.
|
|
4
|
+
|
|
5
|
+
<!-- towncrier release notes start -->
|
|
6
|
+
|
|
7
|
+
## GIPPA 1.0.0 (2026-11-02)
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
- The genome-wide TerminatorNet scan is split into chunks of 250,000 windows per contig strand
|
|
12
|
+
(`TERMINATORNET_PLAN` → `TERMINATORNET_CHUNK` → `TERMINATORNET_MERGE`), each on
|
|
13
|
+
`--terminatornet_chunk_cpus` CPUs (default 4), with output byte-identical to the unsharded
|
|
14
|
+
`-n ≥ 2` run. A timeout now re-runs one chunk instead of the whole scan; `--terminatornet_sharded
|
|
15
|
+
false` runs the old single task. Under the developers' site profile a chunk asks for 4 GB and 2 h per attempt, and the step
|
|
16
|
+
uses at most 32 CPUs at a time. ([#455](https://github.com/khoa-yelo/gippa/pull/455))
|
|
17
|
+
- Preflight warns (`inputs.bakta_gbff`) when a precomputed Bakta JSON (`--annotation x.json[.gz]` or `annotation.precomputed.bakta_json`) has no `x.gbff` or `x.gbff.gz` next to it while the bgc module is on: antiSMASH would be skipped and the bgc layer would be empty. The warning names the expected paths, appears in `preflight.json`, `preflight.md` and the `run_manifest.json` warnings, and `--strict` turns it into exit code 3.
|
|
18
|
+
`preflight.md` now shows check messages in full (the Value column keeps its 200-character cap). ([#467](https://github.com/khoa-yelo/gippa/pull/467))
|
|
19
|
+
- `gippa run` now publishes the Bakta JSON and GBFF it produced as `OUT/annotation/tools/bakta/genome.json` and `genome.gbff` (copied, untouched), so `gippa makedb --annotation OUT/annotation/tools/bakta/genome.json` works after a run without running Bakta by hand. A precomputed Bakta JSON is not copied into `OUT/`. Runs started with an earlier version re-run Bakta and the steps after it on `--resume`. ([#468](https://github.com/khoa-yelo/gippa/pull/468))
|
|
20
|
+
- Under `--profile docker`, Nextflow's tool containers no longer pull images at run time (`docker run --pull=never`), and preflight stops the run when a pinned image the selected modules need is not present locally, naming `gippa setup --images --profile docker`. It also reports a Docker client older than 20.10 (podman older than 3.0) and a Docker daemon that is not reachable. Docker 20.10 or later is required. ([#477](https://github.com/khoa-yelo/gippa/pull/477))
|
|
21
|
+
- <!-- m00 -->
|
|
22
|
+
GIPPA installs as a Python package with a `gippa` command line, a validated YAML configuration
|
|
23
|
+
and a Nextflow workflow. It ships with a built-in genome and proteomics simulator for testing, and
|
|
24
|
+
continuous integration covers both.
|
|
25
|
+
- <!-- m01 -->
|
|
26
|
+
Inputs and preflight: `gippa preflight` checks the genome, proteins, peptides, abundance table and
|
|
27
|
+
environment before a run and writes `preflight.json` (validated against its JSON Schema) and
|
|
28
|
+
`preflight.md`, with exit codes 0, 1, 2 and 3. `gippa convert --from generic|diann` turns a search
|
|
29
|
+
engine report into GIPPA's peptide table. Readers and writers cover FASTA, GFF3, BED, proBed, VCF 4.3
|
|
30
|
+
and TSV.
|
|
31
|
+
- <!-- m02 -->
|
|
32
|
+
Genome annotation: `gippa setup` downloads and checks the Bakta (light or full), geNOMAD, antiSMASH,
|
|
33
|
+
Promotech, GO, KEGG, COG and contaminant databases and records them in `db_manifest.json`. A run
|
|
34
|
+
annotates the genome with Bakta and adds operon pairs and transcription units (UniOP), promoters,
|
|
35
|
+
terminators, ribosome binding sites, codon usage and regions (prophage, plasmid, biosynthetic gene
|
|
36
|
+
cluster, CRISPR, AMR). A Bakta JSON or your own GFF3/GBFF annotation can be supplied instead.
|
|
37
|
+
The pipeline runs through Nextflow (for example `--profile slurm,apptainer`) or a local executor.
|
|
38
|
+
- <!-- m03 -->
|
|
39
|
+
Peptide and protein mapping: peptides are placed on the genome through a six-frame index (exact,
|
|
40
|
+
tolerant and frameshift matches) and proteins through miniprot and tblastn, with target-decoy
|
|
41
|
+
control of the placement FDR. Unmapped and contaminant evidence is reported with reasons.
|
|
42
|
+
`gippa makedb` writes a strain search database (annotated proteins plus six-frame ORFs) for your
|
|
43
|
+
spectrum search.
|
|
44
|
+
- <!-- m04 -->
|
|
45
|
+
Gene table and region tests: `genes.tsv` has one row per Bakta locus tag with detection tiers
|
|
46
|
+
(picked FDR, MAYU, two-peptide, protein list), a cross-fitted detectability model, iBAQ or Top3
|
|
47
|
+
abundance and the genome context columns. `detection_summary.tsv` compares observed with expected
|
|
48
|
+
detection, and `regions_stats.tsv` tests prophages, plasmids and other regions with circular-shift
|
|
49
|
+
nulls.
|
|
50
|
+
- <!-- m05 -->
|
|
51
|
+
Autocorrelation and islands: `autocorrelation.tsv` reports Moran's I and join counts along each
|
|
52
|
+
replicon under label and transcription-unit block nulls, and `islands.tsv` lists runs of
|
|
53
|
+
neighbouring genes with unusually high or low abundance, with family-wise error control. Abundance
|
|
54
|
+
is also tested for a gradient from the origin to the terminus of replication.
|
|
55
|
+
- <!-- m06a -->
|
|
56
|
+
Operons: `pairs.tsv` describes every pair of adjacent genes (predicted operon pair or not, strand,
|
|
57
|
+
distance, promoter and terminator evidence), and `operons.tsv` summarises each transcription unit.
|
|
58
|
+
GIPPA tests whether genes in one operon disagree in abundance (discordance), finds likely operons that
|
|
59
|
+
the prediction missed with a decoy FDR, and lists flags in `operon_flags.tsv`.
|
|
60
|
+
- <!-- m06b -->
|
|
61
|
+
Operon and terminator calls can be checked against RegulonDB: `validation/fetch_regulondb.py` (in the source repository)
|
|
62
|
+
downloads the RegulonDB transcription units, terminators and gene coordinates with SHA-256
|
|
63
|
+
provenance (TLS verification stays on), and `validation/regulondb_truth.py` builds the E. coli
|
|
64
|
+
K-12 pair and terminator truth sets used for validation.
|
|
65
|
+
- <!-- m07 -->
|
|
66
|
+
Variants and novel ORFs: peptides that disagree with the genome give REF/ALT residue calls in
|
|
67
|
+
`variants.tsv` and `variants.vcf` (VCF 4.3), with flags and class error rates. Peptides outside
|
|
68
|
+
annotated genes are assembled into candidate novel ORFs in `novel_orfs.tsv`, with GFF3 and protein
|
|
69
|
+
FASTA files, promoter and ribosome-binding-site evidence from a second Promotech and OSTIR round,
|
|
70
|
+
and `annotation_patch.gff3` to update the annotation.
|
|
71
|
+
- <!-- m08 -->
|
|
72
|
+
Function and determinants: `category_summary.tsv` and `enrichment_detection.tsv` test GO, KEGG and
|
|
73
|
+
COG categories for detection with a detectability-aware (Wallenius) over-representation test, and
|
|
74
|
+
`enrichment_gsea.tsv` runs GSEA on abundance with genes collapsed to transcription units.
|
|
75
|
+
`determinants_features.tsv`, `determinants_model.tsv` and `determinants_attribution.tsv` show which
|
|
76
|
+
sequence and context features explain detection and abundance.
|
|
77
|
+
- <!-- m09 -->
|
|
78
|
+
Plots and report: every run writes 16 plots (SVG, PNG and PDF, each with its data as TSV) and a
|
|
79
|
+
self-contained, interactive `report.html` that works offline. `gippa report` rebuilds the report from
|
|
80
|
+
a finished run directory, and `gippa compare` compares two or more runs of one genome (detection
|
|
81
|
+
overlap, abundance agreement, stability) with its own plot and `compare.html`.
|
|
82
|
+
- <!-- m10 -->
|
|
83
|
+
Real-data support for the pilot: DIA-NN reports from public E. coli Nissle 1917 proteomics data
|
|
84
|
+
(iProX PXD078459) can be searched against a generic K-12 reference proteome or against the Nissle
|
|
85
|
+
database from `gippa makedb`, and the two runs can be compared with `gippa compare`.
|
|
86
|
+
`gippa convert --from cascadia` reads de novo peptides. A reproducibility runbook in the source
|
|
87
|
+
repository lists every command and input hash. Pilot results are reported with the release.
|
|
88
|
+
- A Bioconda recipe for GIPPA is rendered from `pyproject.toml` by
|
|
89
|
+
`scripts/release/bioconda_recipe.py` (PyPI sdist source, conda-forge and bioconda dependencies,
|
|
90
|
+
Nextflow and OpenJDK included), ready for a `bioconda-recipes` pull request after each release.
|
|
91
|
+
- At genetic code 4 or 25 the variants VCF header records the table as `##gippa_translation_table=<t>` (right after `##reference=`); code-11 VCFs are unchanged.
|
|
92
|
+
- Bakta, miniprot and tblastn now run with the genetic code set by `annotation.translation_table`: Bakta gets `--translation-table` at tables 4 and 25 (its command line at table 11 is unchanged), miniprot indexes the genome with `-T <table>`, and tblastn gets `-db_gencode <table>` appended to `mapping.proteins.tblastn_args`. The default `mapping.proteins.tblastn_args` is now `-seg no -evalue 1e-5` and no longer contains `-db_gencode`; one unquoted `-db_gencode` equal to the table still works, and any other value (or a quoted one such as `-db_gencode "4"`) stops the run. A precomputed Bakta annotation JSON that records a different translation table is refused: its step stops with an input error. `annotation_meta.json` and the run manifest's `annotation` block record `translation_table` (output schema version 1.1). The report's Methods section names the genetic code of every run, and at tables 4 and 25 the summary opens with a note on how TGA is read.
|
|
93
|
+
- Codon usage, novel ORFs, variants and `gippa makedb` now follow `annotation.translation_table`. Under genetic codes 4 and 25, codon usage accepts the run's table, so TGA joins the Trp family (code 4) or the Gly family (code 25) and can be a rare codon. A CDS with an internal TGA is scored. `novel_orfs.faa` translates TGA as W or G, and a pseudogene's junction is only looked for at the table's stops. In variant calling, a peptide with W or G at a TGA codon matches the reference instead of being a stop-codon site, and a substitution there is an ordinary SNV. A `U` over TGA is skipped as a rare residue. `gippa makedb` translates six-frame ORFs, N-terminal extensions, Bakta proteins without a sequence and `--patch` CDSs with the table taken from the resolved configuration (`--config` or `--set annotation.translation_table=N`), so a TGA in a patch CDS is no longer rejected under 4 or 25. `makedb_manifest.json` records `translation_table`, and `gippa makedb` refuses a Bakta JSON recorded at a different table. At table 11 every output is unchanged apart from the new manifest key.
|
|
94
|
+
- Content-addressed image keys and tags (`<version>-<key12>`), `workflow/conf/images.json` written by `update_digests.py`, and the shared image-cache helper.
|
|
95
|
+
- N-terminal peptides of genes annotated with a GTG or TTG start codon (Bakta writes their first residue as `M`) now map exactly to their own gene, flagged `initiator_m` in `peptide_hits.tsv` (output schema 1.2), instead of being lost, mapped as a strain difference with an ALT `M` at the start codon, or placed only at a chance copy elsewhere. The six-frame index is now format 4 and is rebuilt on the next fresh run (without `-resume`); an older index still loads but gives no initiator credit and logs a warning to rebuild it.
|
|
96
|
+
- New `gippa demo` command: runs a bundled synthetic genome (SIM100K) with precomputed layers in about a minute, with no Nextflow, containers, databases or network, and prints the report path (`--open` opens it). `gippa demo --full` runs the same inputs through `gippa run` with the real tools after `gippa setup`, as a check of the whole install. The demo data (under 1 MiB) ships in the wheel; the manifest records `demo: true` and the report shows a synthetic-data banner.
|
|
97
|
+
- Preflight now treats a pinned container image as the install of its tool under the `docker` and
|
|
98
|
+
`apptainer` profiles: under docker no local environment is needed, and under apptainer the image
|
|
99
|
+
must be in the image cache (`NXF_APPTAINER_CACHEDIR`, else
|
|
100
|
+
`<db_dir>/containers`), so a plain pip install works. A tool that has only a conda
|
|
101
|
+
environment is reported missing under `docker` or plain `apptainer`, with the reason, instead of
|
|
102
|
+
running on the host without its environment; a missing image names `gippa setup --images`.
|
|
103
|
+
- Preflight now warns (`genome.genetic_code`) when a genome left at the default translation table 11 probably uses genetic code 4 (TGA = Trp, as in Mycoplasma and Spiroplasma): long open reading frames cover far less of the genome with TGA as a stop than with TGA as a codon (ratio < 0.55, at least 20 such ORFs). The warning appears in `preflight.json`, the manifest `warnings` and at the top of the report summary; it never changes any result (`--strict` exits 3, as for every warning).
|
|
104
|
+
- R fgsea runs from the new `gippa-fgsea` image (R 4.5.3, fgsea 1.36.2, `gippa_fgsea.R` baked in) when no `GIPPA_FGSEA_PREFIX` and no prebuilt `gippa-fgsea` env is found: `gippa run` exports `GIPPA_CONTAINER_RUNTIME` and `GIPPA_DB_DIR`, preflight accepts the pinned image under `docker` and plain `apptainer`, and `containers.yml` builds the image.
|
|
105
|
+
- Releases are built and published by a manual release workflow: it checks the version, the release
|
|
106
|
+
readiness record and the changelog, builds and smoke-tests the wheel and sdist, uploads them to PyPI
|
|
107
|
+
by trusted publishing and creates the tagged GitHub release with these notes.
|
|
108
|
+
- Selenocysteine and pyrrolysine codons: annotated Sec (`U` over TGA) and Pyl (`O` over TAG) codons
|
|
109
|
+
are now consumable sites for tolerant peptide placement, with decoys mirrored as for annotated
|
|
110
|
+
stops. Rows over them are flagged `sec_site` / `pyl_site` in `peptide_hits.tsv` (GFF3
|
|
111
|
+
`recoded_codon`), `variants.tsv` reports the `U`/`O` residue as an ALT site, and
|
|
112
|
+
`detection_summary.tsv` counts the two new `placement_flag` groups.
|
|
113
|
+
- Step images `gippa-step` and `gippa-step-r` (`workflow/containers/step*/Dockerfile`) carry GIPPA
|
|
114
|
+
and its hashed, permissive-only Python dependencies (`requirements.lock`, checked by
|
|
115
|
+
`scripts/release/check_image_licences.py`), plus R fgsea in `gippa-step-r`; they are tagged with
|
|
116
|
+
the GIPPA version (ADR-0065). `scripts/dev/build_step_image.sh` builds dev copies.
|
|
117
|
+
The image licence check fails closed (missing site, empty run, `--require NAME`, every licence
|
|
118
|
+
signal checked), and the sdist-only dependencies build on a hash-checked setuptools.
|
|
119
|
+
- The `docker` profile now matches `apptainer`: `params.db_dir` is bound read-only, tasks run as the calling user (`-u $(id -u):$(id -g)`), the per-task `TMPDIR` is passed into the container, the BAKTA and antiSMASH images get the `ps` shim, and pinned-container processes never use conda (also under `-profile docker,conda`). The TMPDIR `beforeScript` and the conda-off selector live once in `workflow/conf/container_common.config`, included by both container profiles; `update_digests.py --nextflow-config` follows `includeConfig` to edit that selector. docker-smoke gains an advisory BAKTA DB-visibility job.
|
|
120
|
+
- The full calibration launcher now submits one job per suite, sized from the checkout's
|
|
121
|
+
`calibration_plan.tsv` (lanes x CPUs, memory and time per suite), instead of a throttled 4-CPU
|
|
122
|
+
array. It validates the plan first, refuses a launch whose CPUs would pass the shared-cluster cap
|
|
123
|
+
or whose longest suite would run into the nightly, and cancels every job already submitted when a
|
|
124
|
+
submission fails. It prints `jobs=<ids> rows=<id> log=<dir> cpus=<total>`.
|
|
125
|
+
- The release check now reuses calibration evidence from an earlier commit only when every change
|
|
126
|
+
since then lies in documentation, CI, report or plot code (or is the version line alone), and says
|
|
127
|
+
so in the row. It also checks that each container image key is current in `images.json`, and the
|
|
128
|
+
release workflow verifies that every GHCR image pin is publicly pullable.
|
|
129
|
+
- Tool images on GHCR now carry one immutable tag per build, `<version>-<key>`, where the key hashes
|
|
130
|
+
the image's Dockerfile, env file and locks; an existing tag is never rebuilt or overwritten. The
|
|
131
|
+
images install from the committed conda and pip locks, and every downloaded source archive is
|
|
132
|
+
checked against its sha256. BacTermFinder now has locks too.
|
|
133
|
+
- `annotation.translation_table` now accepts genetic codes 4 (Mycoplasma and Spiroplasma) and 25 (Candidate Division SR1 and Gracilibacteria) as well as 11 in preflight; any other value stops the run with an input error. A new preflight check, `config.tool_genetic_code`, refuses tool options that set a genetic code themselves (Bakta `--translation-table`, miniprot `-T`, or a tblastn `-db_gencode` that differs from the table or is repeated). The `genome.genetic_code` warning is now evaluated at every supported table: at table 11 it names codes 4 and 25 when TGA looks like a sense codon, and at tables 4 and 25 it warns when the genome looks like it uses code 11.
|
|
134
|
+
- `annotation.uniop.enabled: true | false | auto` (default `true`). Preflight resolves it before the
|
|
135
|
+
run: it runs UniOP's `--help` once to check that UniOP works, and `auto` turns into `true` or
|
|
136
|
+
`false` in `resolved_config.yaml`. `gippa run` then passes `params.run_uniop`, and UNIOP is skipped
|
|
137
|
+
when it is false. The distance-model fallback is always reported, with its reason:
|
|
138
|
+
- preflight warns for `false`, for `auto` resolving to false and for a failed probe, and quotes
|
|
139
|
+
the last failed `image:uniop` setup;
|
|
140
|
+
- under `--publication`, `auto` without UniOP is an error;
|
|
141
|
+
- `gippa run` prints a closing warning line;
|
|
142
|
+
- the manifest gains `operon_source` and `operon_source_reason`;
|
|
143
|
+
- the report states the distance model's precision and recall.
|
|
144
|
+
|
|
145
|
+
ADR-0061 row flags:
|
|
146
|
+
- TU-block Moran's I rows carry `tu_block_tu_error` on every run;
|
|
147
|
+
- under the distance model, those rows and every `both_detected_t` pair row also carry
|
|
148
|
+
`tu_source_distance_model`, with their caveats in the report.
|
|
149
|
+
- `annotation.uniop.enabled` now defaults to `auto` (M11-14d2, ADR-0061). When UniOP is installed for the profile the run uses it as before. When it is not, for example because a build failed, offline, or without build rights, operons come from the ADR-0022 distance model and the affected rows are flagged `tu_source_distance_model`, instead of preflight stopping with exit 2. Set `enabled: true` to require UniOP. Under `--publication`, `auto` must still resolve to `true`.
|
|
150
|
+
- `gippa compare` warns when the runs differ in GIPPA minor version, tool version or image digest,
|
|
151
|
+
database version or operon source (on stderr, in `logs/events.jsonl` and in `compare.html`).
|
|
152
|
+
Runs whose output schema majors differ stop with exit 1 unless `--allow-cross-major` is given.
|
|
153
|
+
`run_manifest.json` and `datapackage.json` now record `output_schema_version` (`1.0`), the version
|
|
154
|
+
of the output tables and manifest, apart from the config's `schema_version`.
|
|
155
|
+
- `gippa run`, `gippa preflight` and `gippa setup` choose a Nextflow profile when `--profile` is not given (new default `auto`): a developers' site profile is detected by its Slurm cluster name, `sbatch` on `PATH` selects the new generic `slurm` profile, and the container runtime follows what `gippa setup --images` recorded (`setup.runtime` in `db_manifest.json`, schema 1.1), else Apptainer, Singularity, Docker or conda. The choice is printed and recorded in `run_manifest.json` (`launch`). The accepted profile names are read from the bundled `nextflow.config`; two executor profiles or two container runtimes in `--profile` are a usage error.
|
|
156
|
+
- `gippa setup --images --profile apptainer|docker` pulls the pinned container images a config
|
|
157
|
+
needs (`--images all`: every pinned image), checks each pulled digest against its pin and records
|
|
158
|
+
the images in `db_manifest.json`; `--cache-dir` chooses the Apptainer image cache. `gippa setup`
|
|
159
|
+
itself now runs the Bakta and antiSMASH downloaders through Docker when no environment or cached
|
|
160
|
+
image is available, so it needs no prebuilt environment and no source checkout. `gippa setup --check`
|
|
161
|
+
reports a database installed from another release as `installed <old>, this release pins <new>`.
|
|
162
|
+
- `gippa setup --uniop --profile docker --accept-uniop-terms` fetches UniOP from its authors (pinned commit, sha256 checked), builds the image locally with docker and records it in `local_tools.config` and `db_manifest.json`; `setup --images` includes the step (`--no-uniop` skips it), and `gippa run` adds the local build under docker, apptainer and conda (M11-14u1).
|
|
163
|
+
- `gippa setup --uniop` builds UniOP for every runtime and asks first:
|
|
164
|
+
- the terms notice is always printed; without `--accept-uniop-terms` setup asks
|
|
165
|
+
`Build UniOP for your own use? [y/N]` on a terminal and builds nothing otherwise (no is the
|
|
166
|
+
default; `--uniop` then exits 2, `--images` warns and exits 0);
|
|
167
|
+
- apptainer builds `uniop.def` into a `0600` `.sif` (`--fakeroot`, then
|
|
168
|
+
`--fakeroot --ignore-fakeroot-command`); plain `conda` creates `<cache-dir>/envs/gippa-uniop`
|
|
169
|
+
from the lock; the developers' site profiles check and record the prebuilt env;
|
|
170
|
+
- an explicit `setup --uniop` installs UniOP only, and a rerun with a current build does nothing;
|
|
171
|
+
- `db_manifest.json` records the build as `local_build`; preflight accepts it only when its
|
|
172
|
+
runtime, key and image ID, `.sif` sha256 or env commit still match, and otherwise names the
|
|
173
|
+
setup command;
|
|
174
|
+
- the run manifest's `uniop` entry carries `local_build`, `runtime`, `source_sha256` and
|
|
175
|
+
`container_digest`.
|
|
176
|
+
|
|
177
|
+
Stub runs (`-stub-run`) write `operon_meta.json` with `operon_source: uniop` when UNIOP ran, so
|
|
178
|
+
the stub run's manifest records the operon source.
|
|
179
|
+
- `gippa setup` installs the official, checksum-pinned Nextflow 26.10.0 `-dist` launcher as `DIR/bin/nextflow` when no `nextflow` is on `PATH` (`--no-nextflow` skips it), with a per-item redirect allowlist; `gippa run` uses `nextflow` on `PATH`, else that launcher, and exits 2 when Java is missing or older than 17 (`gippa setup` only warns). The Java check picks Java exactly as the Nextflow launcher does (`NXF_JAVA_HOME`, an executable `JAVA_CMD`, a `JAVA_HOME` directory, then `PATH`), and `run_manifest.json` records the launcher under `launch.nextflow` (`path`, `source`: `path` or `db_dir`; volatile, outside the provenance digest).
|
|
180
|
+
- `gippa setup` no longer needs `--db-dir`: it uses `$GIPPA_DB_DIR`, else
|
|
181
|
+
`$XDG_DATA_HOME/gippa/db` (`~/.local/share/gippa/db`), and records the directory in
|
|
182
|
+
`~/.config/gippa/db_dir`, which `gippa run`, `gippa preflight --profile` and `gippa makedb` read
|
|
183
|
+
when neither `--db-dir` nor `$GIPPA_DB_DIR` is given. Before downloading, setup prints the plan
|
|
184
|
+
(each item and image with its size, the apptainer build space, the total, the free space and
|
|
185
|
+
user quota of each filesystem), refuses with exit 2 when less than 1.1 x the need is free, warns
|
|
186
|
+
about a default DB directory in a shared home, and asks `Proceed? [Y/n]` on a terminal (`--yes`
|
|
187
|
+
skips it). A full disk or quota during a download or pull marks the item `failed` and leaves no
|
|
188
|
+
partial file; `apptainer pull` runs with `--disable-cache` unless `APPTAINER_CACHEDIR` is set.
|
|
189
|
+
- `gippa setup` now installs everything by default: antiSMASH, GO, KEGG, COG and the contaminant library join Bakta light, geNOMAD and the Promotech models, and the container images are pulled when `--profile` names a runtime. Each item has a `--no-<item>` opt-out (`--no-antismash`, `--no-go`, `--no-kegg`, `--no-cog`, `--no-contaminants`, `--no-images`); `--minimal` leaves out geNOMAD and antiSMASH for small disks, and a later `gippa run` on such a directory runs `core,function` with a notice. Setup prints the geNOMAD (non-commercial) and KEGG (academic use) terms before downloading, and `run_manifest.json` and the report's Methods section record the `licence_notes` of what each run used.
|
|
190
|
+
- gippasim gains `SimConfig.n_readthrough`: planted stop-codon read-through genes, with their truth in `truth/readthrough.tsv`.
|
|
191
|
+
|
|
192
|
+
### Fixes
|
|
193
|
+
|
|
194
|
+
- SVG plots no longer carry matplotlib's float-hashed clip-path, marker and hatch ids: `write_instance` renumbers them (`clip0`, `marker0`, `hatch0`, …) in order of appearance, so 1-ulp layout noise (seen on macOS for V18) cannot change the SVG bytes. ([#452](https://github.com/khoa-yelo/gippa/pull/452))
|
|
195
|
+
- The UniOP preflight probe and the R fgsea engine no longer pull container images: their `docker run` carries `--pull=never`. A missing fgsea image fails at once with a message to run `gippa setup` (detected from docker's "No such image" and podman's "image not known" errors), and under docker preflight's fgsea row checks the pinned image is present locally. Nextflow's own step images are not covered yet (N6). ([#465](https://github.com/khoa-yelo/gippa/pull/465))
|
|
196
|
+
- `gippa setup`: an OSError while installing an item (for example EXDEV, ESTALE or EIO renaming a
|
|
197
|
+
verified download into place on NFS) now fails that item with a message naming the errno and the
|
|
198
|
+
path, exit 2, and the remaining items still install, instead of aborting with exit 5 and no
|
|
199
|
+
`db_manifest.json`; a full disk or quota gives the usual disk-full advice. A directory database is
|
|
200
|
+
swapped by renaming the old copy aside to `<path>.gippa-old` first, so a failed swap keeps the old
|
|
201
|
+
copy, or the next `gippa setup` recovers it. ([#466](https://github.com/khoa-yelo/gippa/pull/466))
|
|
202
|
+
- `gippa setup` with a `--db-dir` that cannot be created, or an existing one it cannot write to, now stops with one line (`cannot create --db-dir <path>: <reason>` or `cannot write to <path>: <reason>`) and exit 1 before printing the plan, instead of an internal error; a full disk while creating it is exit 2. The free-space line names the existing directory it measured ([#503](https://github.com/khoa-yelo/gippa/issues/503)). A failed `apptainer pull` or `docker pull` is retried once, its message keeps the last stderr lines, and setup ends with a line naming the images that were not pulled and saying to rerun `gippa setup`; images that hit a full disk or a digest mismatch point to their messages above instead ([#504](https://github.com/khoa-yelo/gippa/issues/504)). ([#506](https://github.com/khoa-yelo/gippa/pull/506))
|
|
203
|
+
- `gippa report OUT` on a local run (no `resolved_config.yaml`) now takes the run's config, modules included, from `run_manifest.json`, so a `--modules core` run's page is byte-identical to the run's own report.
|
|
204
|
+
- BacTermFinder results are now read from the table the tool actually writes (`<genome>_mean.csv`, with `SampleName` and `probability_mean` columns), so runs with `annotation.terminators.bactermfinder` enabled no longer fail when their output is parsed. Contig names that contain underscores are handled, and window coordinates are kept as written. Every scanned window is still reported; no probability cut-off is applied yet.
|
|
205
|
+
- The developers' site profile excludes one more slow node from task submission (quick Python steps stalled there for about 20 minutes at 1 % CPU).
|
|
206
|
+
- The TransTermHP terminator cross-check no longer fails on a complete circular genome with a gene across the origin: such a gene is now passed to TransTermHP as two in-range pieces instead of one with an end past the replicon length.
|
|
207
|
+
- The antiSMASH version is now recorded in the run manifest: the antiSMASH, Bakta, geNomad, miniprot and tblastn version captures discard stderr, so a tool warning no longer corrupts `versions.yml`. antiSMASH is right-sized to 4 CPUs and 8 GB per attempt instead of the `process_high` 16 CPUs and 48 GB. Tasks killed at the Slurm time limit (exit 140) are retried like exit 143. Under the developers' site profile, memory-derived CPU counts divide by 4000 MB to match the cluster's Slurm MaxMemPerCPU, and two slow nodes are excluded from task submission.
|
|
208
|
+
- The opt-in BacTermFinder terminator step now calls `genome_scan.py` with the arguments its README gives (step 3, batch 10000) and runs it from a task-local directory, so it no longer fails at start-up or writes into the shared tool directory.
|
|
209
|
+
- Tool runs no longer import Python packages from the user site (`~/.local`): every workflow task,
|
|
210
|
+
including Docker and Apptainer tasks, and every `gippa setup` tool call run with
|
|
211
|
+
`PYTHONNOUSERSITE=1`, so a user-installed ViennaRNA or biopython can no longer change OSTIR and
|
|
212
|
+
other tool results. OSTIR's `versions.yml` now records the ViennaRNA version it actually used.
|
|
213
|
+
- V03 locus plots are ordered within each test family instead of on one mixed scale. Loci
|
|
214
|
+
significant at their own family's level come first, then non-significant loci, then loci with
|
|
215
|
+
no estimate, and the families (prophage, BGC, island, operon discordance, missed operon) take
|
|
216
|
+
turns within each group, so under the `report.max_locus_plots` cap one family's significant loci
|
|
217
|
+
can no longer crowd out another's.
|
|
218
|
+
Operon flags from the two flag families are no longer merged into one locus. The index figure
|
|
219
|
+
names each estimate (`q`, `FWER p`, `decoy-FDR q`) and labels the groups.
|
|
220
|
+
- `-profile docker` runs the pinned images: `containers.config` drops the `docker://` prefix that
|
|
221
|
+
`docker run` rejects.
|
|
222
|
+
- `gippa setup` from an installed package reads the pinned images from the bundled workflow and
|
|
223
|
+
reports a missing `GIPPA_ROOT` clearly, instead of looking under site-packages. The report section
|
|
224
|
+
for V15 is titled "Determinants of abundance".
|
|
225
|
+
- `gippa setup`, preflight and `gippa run` now use one Apptainer image cache: setup's Bakta and antiSMASH downloaders look for their image in `--cache-dir` (else the default cache), and `gippa run` exports `NXF_APPTAINER_CACHEDIR` to the cache preflight checked when it is not set, so `DIR/containers` works without any variable. `gippa setup --images` pulls the images before it downloads the databases, so an Apptainer-only host installs Bakta (and antiSMASH) in one run. `gippa preflight --profile` checks the installed tools as `gippa run --profile` does, and `gippa run` without Nextflow points at the install page.
|
|
226
|
+
- `run_manifest.json` now records as `detection_tier` the tier that detection actually used, the same as `genes.tsv`. It no longer records preflight's provisional tier. Detection warnings such as `decoy_unscored` now appear in the manifest's `warnings`.
|
|
227
|
+
- The published tool images now run under `--profile apptainer`: their conda environment is on `PATH` without the entrypoint, the sharded TerminatorNet processes are pinned to the image, and the Promotech image has the `libGL` that its Qt import needs.
|
|
228
|
+
- `gippa run` on a local executor caps the default `threads` to the CPUs available, so a machine with fewer than 16 CPUs no longer aborts with "Task requirement exceeds available CPUs" ([issue 514](https://github.com/khoa-yelo/gippa/issues/514)); a value you set is used as given. antiSMASH passes `--databases` only when `DB_DIR/antismash` has content and otherwise uses the databases in its image, which is what a fresh `gippa setup` records ([issue 515](https://github.com/khoa-yelo/gippa/issues/515)). `gippa setup` no longer prints a doubled `v` in versions such as `v1.12.2`.
|
|
229
|
+
- `gippa setup` now falls back to the Promotech authors' GitHub LFS copy of the RF-HOT model (on `media.githubusercontent.com`, same SHA-256 pin) when `www.cs.mun.ca` cannot be reached, and records the URL that served it; a checksum mismatch never falls through to the other source. When both sources fail, the message names both hosts and how to install the model by hand ([issue 508](https://github.com/khoa-yelo/gippa/issues/508), ADR-0069).
|
|
230
|
+
- `pip install gippa` no longer resolves to pandas 3.1, which made `gippa run` and `gippa demo` crash on import (pandarallel, through codon-bias). The numeric dependencies now have upper bounds at the next release after the tested one.
|
|
231
|
+
|
|
232
|
+
### Documentation
|
|
233
|
+
|
|
234
|
+
- The user guide has a new "Genetic code" section under Inputs: when to set `annotation.translation_table` to 4 (Mycoplasma, Spiroplasma and other Mollicutes) or 25 (candidate division SR1, Gracilibacteria), what the table changes in Bakta, miniprot, tblastn, mapping, novel ORFs, variants, codon usage, `gippa makedb` and the report, how `-db_gencode` is added to `mapping.proteins.tblastn_args` and which values stop a run, why a precomputed Bakta JSON made at another table is refused, and the preflight checks `config.translation_table`, `config.tool_genetic_code` and `genome.genetic_code`. A new methods page explains the genetic-code check's evidence and limits: codes 4 and 25 cannot be told apart from the genome, on inputs with only 20–40 long open reading frames either warning is wrong about 1 % of the time, and the code-25 evidence rests on one assembly.
|
|
235
|
+
|
|
236
|
+
### Other
|
|
237
|
+
|
|
238
|
+
- Add an advisory `docker-smoke` workflow (real MINIPROT and TBLASTN under `-profile test,docker` on
|
|
239
|
+
path-filtered pull requests and weekly) and the platforms support matrix in the user guide.
|
|
240
|
+
- Pin the published GHCR images of Promotech, Promoter Calculator, TerminatorNet, BacTermFinder, OSTIR and fgsea by digest.
|
|
241
|
+
- The docs and the setup plan describe the published images: their sizes are in the plan total, and the pre-publish warnings are gone.
|
|
242
|
+
- Known limitations of version 1:
|
|
243
|
+
- licences: geNOMAD is for non-commercial use only. `gippa setup` downloads its database
|
|
244
|
+
unless you pass `--no-genomad` (or `--minimal`). KEGG is for academic use;
|
|
245
|
+
`gippa setup --kegg` downloads it on your machine, and GIPPA does not redistribute it. The GPL and AGPL
|
|
246
|
+
tools (Bakta, Promotech, Promoter Calculator, OSTIR, TransTermHP, BacTermFinder, antiSMASH)
|
|
247
|
+
run as separate programs; GIPPA does not import them, and the wheel and sdist contain none
|
|
248
|
+
of their code. UniOP has no licence file, so it is never published; `gippa setup --uniop`
|
|
249
|
+
builds it on your machine (see `NOTICE.md`);
|
|
250
|
+
- one sample per run: several samples in the abundance table, co-expression and differential
|
|
251
|
+
context tests are not supported yet;
|
|
252
|
+
- the V4 locus browser (igv-reports) and the V9 mass-fraction treemap are not built, so 16
|
|
253
|
+
plots are made instead of 18;
|
|
254
|
+
- no RO-Crate export;
|
|
255
|
+
- mapping attack `flat_c200` (a flat contaminant weight) reads FDP 0.015 at q 0.01, over its
|
|
256
|
+
bound; the contaminant weight is not decided (gate M3 not met).
|
|
257
|
+
- variant calling: G1 (F1 on simulated variants) and A6a were last measured at the release
|
|
258
|
+
commit on the scope before ADR-0049 (G1 0.869, below 0.9); the accepted scope has not been
|
|
259
|
+
rerun at that commit (gate M7 not met).
|
|
260
|
+
- calibration: the fast-tier nightly calibration did not run on the release commit (cluster
|
|
261
|
+
nodes); it last passed at the report-freeze commit, the full tier passed on the release code,
|
|
262
|
+
and readiness row R3 is waived for 1.0.0
|
|
263
|
+
([ADR-0073](https://github.com/khoa-yelo/gippa/blob/main/docs/adr/ADR-0073-r3-nightly-calibration-waiver-1-0-0.md)).
|
|
264
|
+
- six-frame novel ORFs: In the only real six-frame search so far (one *E. coli* Nissle 1917
|
|
265
|
+
strain, three runs), GIPPA called no novel ORFs, but this does not show the strain has none:
|
|
266
|
+
each ORF class had only 8 to 64 candidates that beat their decoys, and a class needs at least
|
|
267
|
+
100 such candidates ranked above every decoy before any ORF can reach q ≤ 0.01, so no call was possible. Decoy wins also outnumbered target wins in every class, and
|
|
268
|
+
the lowest q reached was 0.125 to 0.50 by class. The first segment of the known gene *prfB* had the
|
|
269
|
+
best peptide score in its class and was still not called (q = 0.25), and this route's error
|
|
270
|
+
rate has been measured only on simulated data.
|
|
271
|
+
- runtime: a standard K-12 run on 16 threads and 64 GB takes about 3-4 h on a 16-thread Intel Xeon Gold 6148 node, not the
|
|
272
|
+
16-55 min first estimated; see the
|
|
273
|
+
[runtimes page](https://github.com/khoa-yelo/gippa/blob/main/docs/user-guide/runtimes.md) and
|
|
274
|
+
[ADR-0072](https://github.com/khoa-yelo/gippa/blob/main/docs/adr/ADR-0072-benchmark-baseline-1-0-0.md);
|
|
275
|
+
- mapping FDR: on a same-database search (`--search-db same`) exact matches are exempt from
|
|
276
|
+
decoy estimation, so GIPPA adds no estimate of identification error; it comes from your
|
|
277
|
+
search engine. The pilot's mapping FDR on arm A2 was therefore not measured, and the release
|
|
278
|
+
criterion is waived
|
|
279
|
+
([ADR-0071](https://github.com/khoa-yelo/gippa/blob/main/docs/adr/ADR-0071-r2-mapping-fdr-waiver-1-0-0.md));
|
|
280
|
+
- abundance: the pilot fails true example TE4 for one protein pair (log2 RplL/RplJ is −0.48;
|
|
281
|
+
about 2 is expected, and [1, 3] is required). The failure is waived for this release
|
|
282
|
+
([ADR-0070](https://github.com/khoa-yelo/gippa/blob/main/docs/adr/ADR-0070-te4-rplL-rplJ-waiver-1-0-0.md)). Do not read an iBAQ ratio of a
|
|
283
|
+
single protein pair as stoichiometry;
|
|
284
|
+
- full validation (K-12 PXD075568, UTI89 beyond the pilot, the EDL933 holdout, FDRBench
|
|
285
|
+
entrapment) is planned after 1.0; 1.0 is calibrated on simulations;
|
|
286
|
+
- stop codons: a peptide is placed across a stop codon only at a gene's annotated terminal
|
|
287
|
+
stop, or at a selenocysteine (`U` over TGA) or pyrrolysine (`O` over TAG) codon that Bakta
|
|
288
|
+
annotates, and only if it has at least 10 residues; other stop codons are never read
|
|
289
|
+
through. Such a peptide has one difference from the genome, so it is judged in a small
|
|
290
|
+
placement-FDR stratum and is rejected when that stratum holds few peptides. On E. coli
|
|
291
|
+
Nissle 1917 the selenocysteine peptides of the two fdnG copies are rejected this way
|
|
292
|
+
(q = 0.25), so their Sec sites are not reported. A C-terminal read-through extension
|
|
293
|
+
(`cterm_extension`, labelled `readthrough_candidate`) is called only when a peptide crosses
|
|
294
|
+
the annotated stop into the 3′ flank and the ORF has at least two distinct peptides; it is
|
|
295
|
+
written to `annotation_patch.gff3`, where `gippa makedb --patch` reads the old stop as `X`.
|
|
296
|
+
Under genetic codes 4 and 25 a `U` over TGA is not recoded;
|
|
297
|
+
- genetic codes: the code comes from `annotation.translation_table` (11, 4 or 25) in the
|
|
298
|
+
configuration and is never inferred. Preflight warns (`genome.genetic_code`) when TGA looks
|
|
299
|
+
like a sense codon at table 11, or like a stop at tables 4 and 25, but the genome cannot
|
|
300
|
+
tell code 4 (TGA = Trp) from code 25 (TGA = Gly), so you choose. With only 20–40 long open
|
|
301
|
+
reading frames (a plasmid alone, a partial assembly) the warning is wrong about 1 % of the
|
|
302
|
+
time. When Bakta calls no tRNA-Trp(UCA) gene, as on Mycoplasma hyorhinis, the tRNA
|
|
303
|
+
adaptation index (tAI) at code 4 is approximate. `gippa compare` does not check that its
|
|
304
|
+
runs used the same genetic code;
|
|
305
|
+
- spectrum inputs: `gippa convert` reads DIA-NN, Cascadia and the generic table only;
|
|
306
|
+
`--from casanovo` and `--from instanovo` are accepted but not implemented, and DDA search
|
|
307
|
+
results must be written as the generic table;
|
|
308
|
+
- variant calls: precision is checked on unflagged substitution calls; `mass_equivalent`
|
|
309
|
+
calls and block, swap and frameshift calls are reported but not covered by that check;
|
|
310
|
+
- low-power tests: missed operons (with the shipped decoys), low islands at normal detection
|
|
311
|
+
rates and operon discordance at realistic effect sizes have little or no power by
|
|
312
|
+
construction, so an empty result there is not evidence of absence;
|
|
313
|
+
- older Linux (glibc < 2.28, such as CentOS 7): `pip install gippa` fails to build numpy,
|
|
314
|
+
numba or pyarrow from source; use `pip install --prefer-binary gippa`. The older versions
|
|
315
|
+
it picks are not in the tested matrix
|
|
316
|
+
([#502](https://github.com/khoa-yelo/gippa/issues/502));
|
|
317
|
+
- `gippa setup` retries a failed Apptainer image pull once automatically; on some clusters
|
|
318
|
+
`mksquashfs` exit status 139 still needs `APPTAINER_CACHEDIR` set
|
|
319
|
+
([#504](https://github.com/khoa-yelo/gippa/issues/504)).
|
|
320
|
+
- Refreshed the bactermfinder, cascadia and timsconvert env locks from fresh builds; the pip locks no longer list packages from the user's own site-packages.
|
|
321
|
+
- TerminatorNet asks for the process_high CPUs (clamped by `--threads`) and Promotech for 2 CPUs and 10 GB per chunk, matching their measured use; outputs are unchanged (ADR-0062).
|
|
322
|
+
- The README describes the released package: install from PyPI or Bioconda, a short quickstart, how
|
|
323
|
+
to cite GIPPA, and a link to the documentation site.
|
|
324
|
+
- The determinants step refits the permutation null of both models on one pool of `threads` worker processes instead of a LightGBM thread pool and a serial elastic net; the null values, p and b are bit-identical (ADR-0063).
|
|
325
|
+
- The fixed SVG hash salt is now `gippa`; written SVGs are unchanged, because their hashed ids are renumbered on write.
|
|
326
|
+
- The miniprot conda environment now has a committed lock file, so `build_envs.sh` can rebuild it exactly.
|
|
327
|
+
- The project, Python package, command and environment variables are renamed to `gippa` / `GIPPA_*` (ADR-0064); the developers' environment script still exports the old variable names for a transition window.
|
|
328
|
+
- The six-frame index, exact and tolerant peptide mapping, the annotated read-through stop sites and the N-terminal extension walk now use `annotation.translation_table`: under genetic codes 4 and 25, TGA reads as W and G and is never a stop, a Sec (`U`) residue cannot be recoded (it is counted as a codon mismatch and never gives `sec_site`), and Pyl (`O` over TAG) works as under 11. The six-frame index work file records the table it was built with (index format 3), and a run with another table refuses it with a message to rebuild the six-frame index; an older format-2 index is still accepted at table 11. The `mapping.stop_sites` log event reports the table. Output at table 11 is unchanged.
|
|
329
|
+
- `calibration.yaml: operon_distance` records the distance-model fallback's precision and recall at
|
|
330
|
+
`pair_threshold` 0.5 on RegulonDB 14.5.0 K-12 (0.828 [0.805, 0.847] and 0.916 [0.901, 0.931],
|
|
331
|
+
directon-bootstrap CIs; ADR-0022 addendum).
|
gippa-1.0.0/CITATION.cff
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use GIPPA, please cite it as below."
|
|
3
|
+
title: "GIPPA: genome integrated prokaryotic proteomics analysis"
|
|
4
|
+
type: software
|
|
5
|
+
abstract: >-
|
|
6
|
+
GIPPA (genome integrated prokaryotic proteomics analysis) takes one assembled bacterial genome plus
|
|
7
|
+
proteomics evidence and asks what genome context explains about which proteins are detected, and
|
|
8
|
+
how abundant they are. It places peptides and proteins on the genome with its own error control,
|
|
9
|
+
builds one gene table keyed by Bakta locus tags, tests genome context (regions, autocorrelation,
|
|
10
|
+
abundance islands, operons, function, sequence determinants), calls REF/ALT residues and novel
|
|
11
|
+
ORFs, and writes standard tables, plots and an HTML report.
|
|
12
|
+
authors:
|
|
13
|
+
- family-names: Hoang
|
|
14
|
+
given-names: Khoa
|
|
15
|
+
license: MIT
|
|
16
|
+
repository-code: "https://github.com/khoa-yelo/gippa"
|
|
17
|
+
version: 1.0.0
|
|
18
|
+
date-released: 2026-11-02
|
|
19
|
+
keywords:
|
|
20
|
+
- "proteogenomics"
|
|
21
|
+
- "bacteria"
|
|
22
|
+
- "genome context"
|
|
23
|
+
- "operons"
|
|
24
|
+
- "target-decoy"
|
|
25
|
+
- "Nextflow"
|
gippa-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Khoa Hoang
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
gippa-1.0.0/NOTICE.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Third-party tools and licences
|
|
2
|
+
|
|
3
|
+
GIPPA is MIT-licensed. It calls the tools below as separate programs, each in its own pinned
|
|
4
|
+
environment or container; it never imports or vendors their code (GIPPA_SPEC.md R5), except
|
|
5
|
+
codon-bias (MIT), which runs in-process. Pins, digests and licence checks: docs/adr/ADR-0008-tool-pins.md.
|
|
6
|
+
|
|
7
|
+
| Tool | Licence | Notes |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| Bakta | GPL-3.0 | 1.12.2; separate process |
|
|
10
|
+
| UniOP | unlicensed (no licence file) | git 3ed14dfc; fetched at a pinned commit when environments are built; never vendored |
|
|
11
|
+
| Promotech | GPL-3.0 | git 56251ad9; separate process |
|
|
12
|
+
| Promoter Calculator | GPL-3.0 (or later) | 1.2.4 (PyPI `promotercalculator`); separate process |
|
|
13
|
+
| OSTIR | GPL-3.0 | 1.1.3; separate process |
|
|
14
|
+
| TerminatorNet | MIT | git 72180309; separate process |
|
|
15
|
+
| TransTermHP | GPL-3.0 (or later) | 2.09; separate process |
|
|
16
|
+
| BacTermFinder | GPL-3.0 | git 02487044; opt-in; separate process |
|
|
17
|
+
| geNOMAD | non-commercial | 1.12.0; separate process; **non-commercial use only** |
|
|
18
|
+
| antiSMASH | AGPL-3.0 | 8.0.4; separate process |
|
|
19
|
+
| miniprot | MIT | 0.18; separate process |
|
|
20
|
+
| BLAST+ | public-domain (NCBI) | 2.16.0; separate process |
|
|
21
|
+
| fgsea | MIT | 1.36.2 (bioconda `bioconductor-fgsea`); run by `workflow/bin/gippa_fgsea.R` in R 4.5 (GPL-2) as a separate process (ADR-0038); R and fgsea are never imported |
|
|
22
|
+
| codon-bias | MIT | 0.5.0; imported in-process (PyPI) |
|
|
23
|
+
| DIA-NN | proprietary (academic licence) | used only by users' own searches; binaries never redistributed |
|
|
24
|
+
|
|
25
|
+
Container images: `.github/workflows/containers.yml` builds six images for GHCR
|
|
26
|
+
(`ghcr.io/khoa-yelo/gippa-<tool>`: promotech, promoter_calculator, terminatornet, bactermfinder, ostir, and
|
|
27
|
+
fgsea, described below).
|
|
28
|
+
Their digests enter `workflow/conf/containers.config` only through the digest-pin PR that the workflow opens;
|
|
29
|
+
until that PR merges, these tools run from their Conda environments. Four of them contain GPL-3.0 tools fetched from
|
|
30
|
+
upstream at build time, unmodified: Promotech (https://github.com/BioinformaticsLabAtMUN/PromoTech),
|
|
31
|
+
Promoter Calculator (GPL-3.0-or-later, https://pypi.org/project/promotercalculator/1.2.4/), OSTIR
|
|
32
|
+
(https://pypi.org/project/ostir/1.1.3/) and BacTermFinder (https://github.com/BioinformaticsLabAtMUN/BacTermFinder);
|
|
33
|
+
the corresponding source is available at those links at the pinned versions and commits above, and each image's
|
|
34
|
+
Dockerfile is in `workflow/containers/<tool>/`. TerminatorNet (MIT, https://github.com/btjaden/TerminatorNet) is
|
|
35
|
+
the fifth. UniOP (unlicensed) is never published.
|
|
36
|
+
|
|
37
|
+
The `gippa-fgsea` image (`ghcr.io/khoa-yelo/gippa-fgsea`, built by the same workflow from
|
|
38
|
+
`workflow/containers/fgsea/Dockerfile`) contains R 4.5.3 (GPL-2, https://www.r-project.org/), fgsea 1.36.2
|
|
39
|
+
(MIT, Bioconductor) and data.table 1.18.6.1 (MPL-2.0), installed unmodified from the conda packages of the
|
|
40
|
+
committed lock `workflow/envs/locks/fgsea.explicit.txt`, plus GIPPA's `workflow/bin/gippa_fgsea.R`. GIPPA starts it
|
|
41
|
+
only as a separate process (`docker run` / `apptainer exec`) and never imports R or fgsea; the corresponding
|
|
42
|
+
source is available from CRAN, Bioconductor and conda-forge/bioconda at those versions. Its ref is pinned in
|
|
43
|
+
`workflow/conf/images.json` only.
|
|
44
|
+
|
|
45
|
+
The step images (`ghcr.io/khoa-yelo/gippa-step` and `ghcr.io/khoa-yelo/gippa-step-r`, tagged with the GIPPA
|
|
46
|
+
version; ADR-0065) run GIPPA's own steps. `gippa-step` contains GIPPA (MIT) and its permissive Python
|
|
47
|
+
dependencies from the hashed lock `workflow/containers/step/requirements.lock` (every licence checked against
|
|
48
|
+
`workflow/containers/step/licences.allow` by `scripts/release/check_image_licences.py`), on a Debian
|
|
49
|
+
`python:3.12-slim` base with `procps` (GPL-2) and `ca-certificates` as separate system programs. The
|
|
50
|
+
`gippa-step-r` image (`workflow/containers/step-r/Dockerfile`) adds R 4.5.3 (GPL-2, https://www.r-project.org/),
|
|
51
|
+
fgsea 1.36.2 (MIT, Bioconductor) and data.table 1.18.6.1 (MPL-2.0), installed unmodified from the conda packages
|
|
52
|
+
of the committed lock `workflow/envs/locks/fgsea.explicit.txt`. GIPPA starts R only as a separate process
|
|
53
|
+
(`subprocess`) and never imports R or fgsea; the corresponding source is available from CRAN, Bioconductor and
|
|
54
|
+
conda-forge/bioconda at those versions, and Debian's from https://sources.debian.org.
|
|
55
|
+
|
|
56
|
+
Data resources: KEGG (academic use), RegulonDB (not redistributed), Gene Ontology (CC BY 4.0), NCBI COG 2020
|
|
57
|
+
(NCBI FTP).
|
|
58
|
+
|
|
59
|
+
Contaminant library: the universal protein contaminant FASTA of Frankenfield et al. 2022
|
|
60
|
+
(HaoGroup-ProtContLib/Protein-Contaminant-Libraries-for-DDA-and-DIA-Proteomics, commit bddf6da9); no licence
|
|
61
|
+
file found in the repository (checked 2026-10-15), so it is downloaded by `gippa setup --contaminants` and
|
|
62
|
+
never vendored (R11).
|
|
63
|
+
|
|
64
|
+
## Inlined in the report
|
|
65
|
+
|
|
66
|
+
| Code | Licence | Notes |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| plotly.js | MIT | 4.1.1 (from the plotly 7.1.0 Python package); inlined once in `report.html` when interactive figures are shown; the page footer names it |
|
|
69
|
+
|
|
70
|
+
## Ported code
|
|
71
|
+
|
|
72
|
+
| Source | Licence | Notes |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| fgsea 1.36.2 | MIT | Bioconductor 3.22 tarball (git b7862b7); `calcGseaStat`, `fgseaSimpleImpl`, `calcGseaStatCumulative(Batch)`, `preparePathways` and the simple stage of `fgseaMultilevel` ported to Python/numba in `src/gippa/stats/fgsea.py` and `src/gippa/stats/_fgsea_kernels.py`; no fgsea file is vendored (docs/methods/fgsea-port.md) |
|
|
75
|
+
|
|
76
|
+
fgsea licence (MIT):
|
|
77
|
+
|
|
78
|
+
Copyright (c) 2016-2019 Alexey Sergushichev
|
|
79
|
+
|
|
80
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
81
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
82
|
+
in the Software without restriction, including without limitation the rights
|
|
83
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
84
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
85
|
+
furnished to do so, subject to the following conditions:
|
|
86
|
+
|
|
87
|
+
The above copyright notice and this permission notice shall be included in all
|
|
88
|
+
copies or substantial portions of the Software.
|
|
89
|
+
|
|
90
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
91
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
92
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
93
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
94
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
95
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
96
|
+
SOFTWARE.
|