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.
Files changed (450) hide show
  1. gippa-1.0.0/.gitignore +22 -0
  2. gippa-1.0.0/CHANGELOG.md +331 -0
  3. gippa-1.0.0/CITATION.cff +25 -0
  4. gippa-1.0.0/LICENSE +21 -0
  5. gippa-1.0.0/NOTICE.md +96 -0
  6. gippa-1.0.0/PKG-INFO +164 -0
  7. gippa-1.0.0/README.md +114 -0
  8. gippa-1.0.0/pyproject.toml +182 -0
  9. gippa-1.0.0/src/gippa/__init__.py +3 -0
  10. gippa-1.0.0/src/gippa/annotate/__init__.py +1 -0
  11. gippa-1.0.0/src/gippa/annotate/antismash.py +82 -0
  12. gippa-1.0.0/src/gippa/annotate/antismash_cmd.py +35 -0
  13. gippa-1.0.0/src/gippa/annotate/bakta.py +324 -0
  14. gippa-1.0.0/src/gippa/annotate/bakta_cmd.py +64 -0
  15. gippa-1.0.0/src/gippa/annotate/bakta_layers.py +108 -0
  16. gippa-1.0.0/src/gippa/annotate/codon_usage.py +182 -0
  17. gippa-1.0.0/src/gippa/annotate/genomad.py +144 -0
  18. gippa-1.0.0/src/gippa/annotate/genomad_cmd.py +25 -0
  19. gippa-1.0.0/src/gippa/annotate/layers.py +433 -0
  20. gippa-1.0.0/src/gippa/annotate/operons.py +209 -0
  21. gippa-1.0.0/src/gippa/annotate/ostir.py +116 -0
  22. gippa-1.0.0/src/gippa/annotate/ostir_cmd.py +14 -0
  23. gippa-1.0.0/src/gippa/annotate/precomputed.py +189 -0
  24. gippa-1.0.0/src/gippa/annotate/promotech_cmd.py +46 -0
  25. gippa-1.0.0/src/gippa/annotate/promoter_calculator.py +145 -0
  26. gippa-1.0.0/src/gippa/annotate/promoter_calculator_cmd.py +15 -0
  27. gippa-1.0.0/src/gippa/annotate/promoters.py +299 -0
  28. gippa-1.0.0/src/gippa/annotate/regions.py +330 -0
  29. gippa-1.0.0/src/gippa/annotate/terminatornet_cmd.py +26 -0
  30. gippa-1.0.0/src/gippa/annotate/terminators.py +340 -0
  31. gippa-1.0.0/src/gippa/annotate/tools.py +246 -0
  32. gippa-1.0.0/src/gippa/annotate/transtermhp_cmd.py +14 -0
  33. gippa-1.0.0/src/gippa/annotate/uniop_adapter.py +112 -0
  34. gippa-1.0.0/src/gippa/annotate/uniop_cmd.py +23 -0
  35. gippa-1.0.0/src/gippa/annotate/user_annotation.py +340 -0
  36. gippa-1.0.0/src/gippa/cli.py +1583 -0
  37. gippa-1.0.0/src/gippa/compare/__init__.py +1 -0
  38. gippa-1.0.0/src/gippa/compare/abundance.py +123 -0
  39. gippa-1.0.0/src/gippa/compare/detection.py +62 -0
  40. gippa-1.0.0/src/gippa/compare/stability.py +120 -0
  41. gippa-1.0.0/src/gippa/compare/versions.py +156 -0
  42. gippa-1.0.0/src/gippa/config/__init__.py +128 -0
  43. gippa-1.0.0/src/gippa/config/defaults.yaml +150 -0
  44. gippa-1.0.0/src/gippa/config/model.py +437 -0
  45. gippa-1.0.0/src/gippa/context/__init__.py +1 -0
  46. gippa-1.0.0/src/gippa/context/autocorrelation.py +353 -0
  47. gippa-1.0.0/src/gippa/context/diagnostics.py +110 -0
  48. gippa-1.0.0/src/gippa/context/islands.py +664 -0
  49. gippa-1.0.0/src/gippa/context/oriter.py +496 -0
  50. gippa-1.0.0/src/gippa/context/regions.py +561 -0
  51. gippa-1.0.0/src/gippa/context/regions_table.py +340 -0
  52. gippa-1.0.0/src/gippa/context/sensitivity.py +314 -0
  53. gippa-1.0.0/src/gippa/context/summary.py +356 -0
  54. gippa-1.0.0/src/gippa/context/support.py +81 -0
  55. gippa-1.0.0/src/gippa/context/tables.py +131 -0
  56. gippa-1.0.0/src/gippa/context/vocab.py +84 -0
  57. gippa-1.0.0/src/gippa/data/__init__.py +1 -0
  58. gippa-1.0.0/src/gippa/data/build_mass_equivalents.py +45 -0
  59. gippa-1.0.0/src/gippa/data/calibration.py +17 -0
  60. gippa-1.0.0/src/gippa/data/calibration.yaml +43 -0
  61. gippa-1.0.0/src/gippa/data/cog_categories.tsv +28 -0
  62. gippa-1.0.0/src/gippa/data/db_sources.yaml +121 -0
  63. gippa-1.0.0/src/gippa/data/demo/PROVENANCE.md +19 -0
  64. gippa-1.0.0/src/gippa/data/demo/layers/bakta.json.gz +0 -0
  65. gippa-1.0.0/src/gippa/data/demo/layers/operon_pairs.tsv.gz +0 -0
  66. gippa-1.0.0/src/gippa/data/demo/layers/promoters.tsv.gz +0 -0
  67. gippa-1.0.0/src/gippa/data/demo/layers/rbs.tsv.gz +0 -0
  68. gippa-1.0.0/src/gippa/data/demo/layers/rbs_novel.tsv.gz +0 -0
  69. gippa-1.0.0/src/gippa/data/demo/layers/regions.tsv.gz +0 -0
  70. gippa-1.0.0/src/gippa/data/demo/layers/terminators.tsv.gz +0 -0
  71. gippa-1.0.0/src/gippa/data/demo/layers/tx_rates.tsv.gz +0 -0
  72. gippa-1.0.0/src/gippa/data/demo/sim100k.fna.gz +0 -0
  73. gippa-1.0.0/src/gippa/data/demo/sim100k_peptides.tsv.gz +0 -0
  74. gippa-1.0.0/src/gippa/data/mass_equivalents.tsv +154 -0
  75. gippa-1.0.0/src/gippa/data/modifications.tsv +18 -0
  76. gippa-1.0.0/src/gippa/data/residue_masses.tsv +25 -0
  77. gippa-1.0.0/src/gippa/determinants/__init__.py +11 -0
  78. gippa-1.0.0/src/gippa/determinants/attribution.py +260 -0
  79. gippa-1.0.0/src/gippa/determinants/features.py +265 -0
  80. gippa-1.0.0/src/gippa/determinants/models.py +405 -0
  81. gippa-1.0.0/src/gippa/determinants/null.py +207 -0
  82. gippa-1.0.0/src/gippa/determinants/sensitivity.py +108 -0
  83. gippa-1.0.0/src/gippa/determinants/support.py +104 -0
  84. gippa-1.0.0/src/gippa/exitcodes.py +14 -0
  85. gippa-1.0.0/src/gippa/function/__init__.py +1 -0
  86. gippa-1.0.0/src/gippa/function/collections.py +228 -0
  87. gippa-1.0.0/src/gippa/function/elim.py +82 -0
  88. gippa-1.0.0/src/gippa/function/gsea.py +665 -0
  89. gippa-1.0.0/src/gippa/function/ora.py +476 -0
  90. gippa-1.0.0/src/gippa/function/running.py +80 -0
  91. gippa-1.0.0/src/gippa/function/sensitivity.py +73 -0
  92. gippa-1.0.0/src/gippa/function/summary.py +108 -0
  93. gippa-1.0.0/src/gippa/genetable/__init__.py +5 -0
  94. gippa-1.0.0/src/gippa/genetable/abundance.py +339 -0
  95. gippa-1.0.0/src/gippa/genetable/assemble.py +261 -0
  96. gippa-1.0.0/src/gippa/genetable/contract.py +641 -0
  97. gippa-1.0.0/src/gippa/genetable/covariates.py +232 -0
  98. gippa-1.0.0/src/gippa/genetable/detectability.py +412 -0
  99. gippa-1.0.0/src/gippa/genetable/detection.py +458 -0
  100. gippa-1.0.0/src/gippa/genetable/eligibility.py +16 -0
  101. gippa-1.0.0/src/gippa/genetable/evidence.py +308 -0
  102. gippa-1.0.0/src/gippa/io/__init__.py +1 -0
  103. gippa-1.0.0/src/gippa/io/_lines.py +37 -0
  104. gippa-1.0.0/src/gippa/io/_open.py +51 -0
  105. gippa-1.0.0/src/gippa/io/abundance.py +204 -0
  106. gippa-1.0.0/src/gippa/io/bed.py +130 -0
  107. gippa-1.0.0/src/gippa/io/cog_categories.py +22 -0
  108. gippa-1.0.0/src/gippa/io/compare_io.py +159 -0
  109. gippa-1.0.0/src/gippa/io/context_tsv.py +150 -0
  110. gippa-1.0.0/src/gippa/io/converters/__init__.py +24 -0
  111. gippa-1.0.0/src/gippa/io/converters/base.py +38 -0
  112. gippa-1.0.0/src/gippa/io/converters/cascadia.py +172 -0
  113. gippa-1.0.0/src/gippa/io/converters/diann.py +203 -0
  114. gippa-1.0.0/src/gippa/io/converters/generic.py +91 -0
  115. gippa-1.0.0/src/gippa/io/converters/strip.py +30 -0
  116. gippa-1.0.0/src/gippa/io/depth.py +59 -0
  117. gippa-1.0.0/src/gippa/io/determinants_tables.py +88 -0
  118. gippa-1.0.0/src/gippa/io/events.py +43 -0
  119. gippa-1.0.0/src/gippa/io/fasta.py +112 -0
  120. gippa-1.0.0/src/gippa/io/fgsea_r.py +519 -0
  121. gippa-1.0.0/src/gippa/io/function_resources.py +61 -0
  122. gippa-1.0.0/src/gippa/io/function_tables.py +59 -0
  123. gippa-1.0.0/src/gippa/io/genes_tsv.py +124 -0
  124. gippa-1.0.0/src/gippa/io/gff3.py +220 -0
  125. gippa-1.0.0/src/gippa/io/image_key.py +144 -0
  126. gippa-1.0.0/src/gippa/io/issues.py +33 -0
  127. gippa-1.0.0/src/gippa/io/manifest_sources.py +204 -0
  128. gippa-1.0.0/src/gippa/io/novel_tables.py +94 -0
  129. gippa-1.0.0/src/gippa/io/operon_tables.py +59 -0
  130. gippa-1.0.0/src/gippa/io/output_checks.py +135 -0
  131. gippa-1.0.0/src/gippa/io/parquet.py +32 -0
  132. gippa-1.0.0/src/gippa/io/peptides.py +402 -0
  133. gippa-1.0.0/src/gippa/io/plot_files.py +193 -0
  134. gippa-1.0.0/src/gippa/io/plot_support.py +48 -0
  135. gippa-1.0.0/src/gippa/io/probed.py +79 -0
  136. gippa-1.0.0/src/gippa/io/protein_fasta.py +141 -0
  137. gippa-1.0.0/src/gippa/io/regions_tsv.py +63 -0
  138. gippa-1.0.0/src/gippa/io/run_view.py +362 -0
  139. gippa-1.0.0/src/gippa/io/sensitivity_tsv.py +30 -0
  140. gippa-1.0.0/src/gippa/io/summary_tsv.py +63 -0
  141. gippa-1.0.0/src/gippa/io/tsv.py +111 -0
  142. gippa-1.0.0/src/gippa/io/variant_tables.py +70 -0
  143. gippa-1.0.0/src/gippa/io/vcf.py +265 -0
  144. gippa-1.0.0/src/gippa/io/work_tables.py +233 -0
  145. gippa-1.0.0/src/gippa/makedb/__init__.py +4 -0
  146. gippa-1.0.0/src/gippa/makedb/build.py +437 -0
  147. gippa-1.0.0/src/gippa/manifest.py +462 -0
  148. gippa-1.0.0/src/gippa/mapping/__init__.py +1 -0
  149. gippa-1.0.0/src/gippa/mapping/chance.py +84 -0
  150. gippa-1.0.0/src/gippa/mapping/contaminants.py +307 -0
  151. gippa-1.0.0/src/gippa/mapping/decoys.py +101 -0
  152. gippa-1.0.0/src/gippa/mapping/denovo_precision.py +205 -0
  153. gippa-1.0.0/src/gippa/mapping/diffops.py +98 -0
  154. gippa-1.0.0/src/gippa/mapping/digest.py +61 -0
  155. gippa-1.0.0/src/gippa/mapping/exact.py +206 -0
  156. gippa-1.0.0/src/gippa/mapping/frameshift.py +780 -0
  157. gippa-1.0.0/src/gippa/mapping/hits.py +46 -0
  158. gippa-1.0.0/src/gippa/mapping/initiator.py +230 -0
  159. gippa-1.0.0/src/gippa/mapping/loci.py +537 -0
  160. gippa-1.0.0/src/gippa/mapping/masses.py +116 -0
  161. gippa-1.0.0/src/gippa/mapping/miniprot.py +226 -0
  162. gippa-1.0.0/src/gippa/mapping/outputs.py +353 -0
  163. gippa-1.0.0/src/gippa/mapping/placement_fdr.py +564 -0
  164. gippa-1.0.0/src/gippa/mapping/protein_assign.py +239 -0
  165. gippa-1.0.0/src/gippa/mapping/qgram.py +236 -0
  166. gippa-1.0.0/src/gippa/mapping/readthrough.py +250 -0
  167. gippa-1.0.0/src/gippa/mapping/sixframe.py +436 -0
  168. gippa-1.0.0/src/gippa/mapping/tblastn.py +378 -0
  169. gippa-1.0.0/src/gippa/mapping/tolerant.py +343 -0
  170. gippa-1.0.0/src/gippa/mapping/tolerant_dp.py +342 -0
  171. gippa-1.0.0/src/gippa/model/__init__.py +43 -0
  172. gippa-1.0.0/src/gippa/model/coords.py +129 -0
  173. gippa-1.0.0/src/gippa/model/genes.py +176 -0
  174. gippa-1.0.0/src/gippa/model/genetic_code.py +77 -0
  175. gippa-1.0.0/src/gippa/novel/__init__.py +1 -0
  176. gippa-1.0.0/src/gippa/novel/candidates.py +352 -0
  177. gippa-1.0.0/src/gippa/novel/class_call.py +194 -0
  178. gippa-1.0.0/src/gippa/novel/evidence.py +376 -0
  179. gippa-1.0.0/src/gippa/novel/fdr.py +430 -0
  180. gippa-1.0.0/src/gippa/novel/outputs.py +367 -0
  181. gippa-1.0.0/src/gippa/operons/__init__.py +1 -0
  182. gippa-1.0.0/src/gippa/operons/detection_limit.py +554 -0
  183. gippa-1.0.0/src/gippa/operons/discordance.py +319 -0
  184. gippa-1.0.0/src/gippa/operons/flags.py +269 -0
  185. gippa-1.0.0/src/gippa/operons/missed.py +263 -0
  186. gippa-1.0.0/src/gippa/operons/pairs.py +293 -0
  187. gippa-1.0.0/src/gippa/operons/tu_table.py +84 -0
  188. gippa-1.0.0/src/gippa/preflight/__init__.py +1 -0
  189. gippa-1.0.0/src/gippa/preflight/checks.py +59 -0
  190. gippa-1.0.0/src/gippa/preflight/environment.py +1075 -0
  191. gippa-1.0.0/src/gippa/preflight/evidence.py +467 -0
  192. gippa-1.0.0/src/gippa/preflight/gbff.py +80 -0
  193. gippa-1.0.0/src/gippa/preflight/genetic_code.py +205 -0
  194. gippa-1.0.0/src/gippa/preflight/genome.py +317 -0
  195. gippa-1.0.0/src/gippa/preflight/report.py +189 -0
  196. gippa-1.0.0/src/gippa/preflight/run.py +668 -0
  197. gippa-1.0.0/src/gippa/preflight/tool_genetic_code.py +113 -0
  198. gippa-1.0.0/src/gippa/py.typed +0 -0
  199. gippa-1.0.0/src/gippa/report/__init__.py +1 -0
  200. gippa-1.0.0/src/gippa/report/build.py +372 -0
  201. gippa-1.0.0/src/gippa/report/checks.py +154 -0
  202. gippa-1.0.0/src/gippa/report/compare.py +66 -0
  203. gippa-1.0.0/src/gippa/report/content.py +378 -0
  204. gippa-1.0.0/src/gippa/report/snippets/islands.html +3 -0
  205. gippa-1.0.0/src/gippa/report/tables.py +41 -0
  206. gippa-1.0.0/src/gippa/report/templates/compare.html.j2 +97 -0
  207. gippa-1.0.0/src/gippa/report/templates/plotly_block.html.j2 +10 -0
  208. gippa-1.0.0/src/gippa/report/templates/report.css +16 -0
  209. gippa-1.0.0/src/gippa/report/templates/report.html.j2 +191 -0
  210. gippa-1.0.0/src/gippa/report/templates/tables.js +47 -0
  211. gippa-1.0.0/src/gippa/rng.py +16 -0
  212. gippa-1.0.0/src/gippa/runner/__init__.py +1 -0
  213. gippa-1.0.0/src/gippa/runner/local.py +393 -0
  214. gippa-1.0.0/src/gippa/runner/nextflow.py +284 -0
  215. gippa-1.0.0/src/gippa/runner/prereqs.py +155 -0
  216. gippa-1.0.0/src/gippa/runner/profiles.py +253 -0
  217. gippa-1.0.0/src/gippa/runner/workflow_path.py +16 -0
  218. gippa-1.0.0/src/gippa/schemas/__init__.py +17 -0
  219. gippa-1.0.0/src/gippa/schemas/annotation/id_map.schema.json +15 -0
  220. gippa-1.0.0/src/gippa/schemas/annotation/operon_pairs.schema.json +11 -0
  221. gippa-1.0.0/src/gippa/schemas/annotation/regions.schema.json +17 -0
  222. gippa-1.0.0/src/gippa/schemas/annotation/terminators_crosscheck.schema.json +12 -0
  223. gippa-1.0.0/src/gippa/schemas/annotation/tus.schema.json +16 -0
  224. gippa-1.0.0/src/gippa/schemas/config.schema.json +1407 -0
  225. gippa-1.0.0/src/gippa/schemas/datapackage.json +21 -0
  226. gippa-1.0.0/src/gippa/schemas/db_manifest.schema.json +52 -0
  227. gippa-1.0.0/src/gippa/schemas/plot_support/determinants_pd.json +12 -0
  228. gippa-1.0.0/src/gippa/schemas/plot_support/determinants_shap.json +11 -0
  229. gippa-1.0.0/src/gippa/schemas/plot_support/gc_skew.json +13 -0
  230. gippa-1.0.0/src/gippa/schemas/plot_support/gsea_running.json +14 -0
  231. gippa-1.0.0/src/gippa/schemas/plot_support/null_determinants.json +11 -0
  232. gippa-1.0.0/src/gippa/schemas/plot_support/null_islands.json +12 -0
  233. gippa-1.0.0/src/gippa/schemas/plot_support/null_regions.json +13 -0
  234. gippa-1.0.0/src/gippa/schemas/plot_support/null_regions_grid.json +13 -0
  235. gippa-1.0.0/src/gippa/schemas/plot_support/replicon_landmarks.json +14 -0
  236. gippa-1.0.0/src/gippa/schemas/plot_support/variant_windows.json +13 -0
  237. gippa-1.0.0/src/gippa/schemas/preflight.schema.json +114 -0
  238. gippa-1.0.0/src/gippa/schemas/run_manifest.schema.json +293 -0
  239. gippa-1.0.0/src/gippa/schemas/tables/autocorrelation.schema.json +24 -0
  240. gippa-1.0.0/src/gippa/schemas/tables/category_summary.schema.json +20 -0
  241. gippa-1.0.0/src/gippa/schemas/tables/compare_abundance.schema.json +21 -0
  242. gippa-1.0.0/src/gippa/schemas/tables/compare_detection.schema.json +15 -0
  243. gippa-1.0.0/src/gippa/schemas/tables/compare_stability.schema.json +16 -0
  244. gippa-1.0.0/src/gippa/schemas/tables/detection_summary.schema.json +16 -0
  245. gippa-1.0.0/src/gippa/schemas/tables/determinants_attribution.schema.json +19 -0
  246. gippa-1.0.0/src/gippa/schemas/tables/determinants_features.schema.json +44 -0
  247. gippa-1.0.0/src/gippa/schemas/tables/determinants_model.schema.json +16 -0
  248. gippa-1.0.0/src/gippa/schemas/tables/enrichment_detection.schema.json +33 -0
  249. gippa-1.0.0/src/gippa/schemas/tables/enrichment_gsea.schema.json +29 -0
  250. gippa-1.0.0/src/gippa/schemas/tables/genes.schema.json +82 -0
  251. gippa-1.0.0/src/gippa/schemas/tables/islands.schema.json +32 -0
  252. gippa-1.0.0/src/gippa/schemas/tables/mapping_fdr.schema.json +22 -0
  253. gippa-1.0.0/src/gippa/schemas/tables/novel_orfs.schema.json +34 -0
  254. gippa-1.0.0/src/gippa/schemas/tables/operon_flags.schema.json +19 -0
  255. gippa-1.0.0/src/gippa/schemas/tables/operons.schema.json +19 -0
  256. gippa-1.0.0/src/gippa/schemas/tables/pairs.schema.json +37 -0
  257. gippa-1.0.0/src/gippa/schemas/tables/peptide_hits.schema.json +30 -0
  258. gippa-1.0.0/src/gippa/schemas/tables/pileup.schema.json +18 -0
  259. gippa-1.0.0/src/gippa/schemas/tables/protein_hits.schema.json +22 -0
  260. gippa-1.0.0/src/gippa/schemas/tables/regions_stats.schema.json +32 -0
  261. gippa-1.0.0/src/gippa/schemas/tables/sensitivity.schema.json +14 -0
  262. gippa-1.0.0/src/gippa/schemas/tables/unmapped.schema.json +13 -0
  263. gippa-1.0.0/src/gippa/schemas/tables/variants.schema.json +28 -0
  264. gippa-1.0.0/src/gippa/setupdb/__init__.py +50 -0
  265. gippa-1.0.0/src/gippa/setupdb/dbdir.py +116 -0
  266. gippa-1.0.0/src/gippa/setupdb/images.py +259 -0
  267. gippa-1.0.0/src/gippa/setupdb/installed.py +29 -0
  268. gippa-1.0.0/src/gippa/setupdb/items.py +342 -0
  269. gippa-1.0.0/src/gippa/setupdb/manifest.py +133 -0
  270. gippa-1.0.0/src/gippa/setupdb/run.py +719 -0
  271. gippa-1.0.0/src/gippa/setupdb/space.py +262 -0
  272. gippa-1.0.0/src/gippa/setupdb/uniop_build.py +429 -0
  273. gippa-1.0.0/src/gippa/stats/__init__.py +1 -0
  274. gippa-1.0.0/src/gippa/stats/_fgsea_kernels.py +110 -0
  275. gippa-1.0.0/src/gippa/stats/autocorr.py +504 -0
  276. gippa-1.0.0/src/gippa/stats/bootstrap.py +168 -0
  277. gippa-1.0.0/src/gippa/stats/cutoffs.py +537 -0
  278. gippa-1.0.0/src/gippa/stats/decoy_fdr.py +394 -0
  279. gippa-1.0.0/src/gippa/stats/fgsea.py +226 -0
  280. gippa-1.0.0/src/gippa/stats/mayu.py +167 -0
  281. gippa-1.0.0/src/gippa/stats/multitest.py +38 -0
  282. gippa-1.0.0/src/gippa/stats/permutation.py +156 -0
  283. gippa-1.0.0/src/gippa/stats/poisson_binomial.py +281 -0
  284. gippa-1.0.0/src/gippa/stats/robust.py +130 -0
  285. gippa-1.0.0/src/gippa/stats/scan.py +299 -0
  286. gippa-1.0.0/src/gippa/stats/scores.py +54 -0
  287. gippa-1.0.0/src/gippa/stats/smooth.py +237 -0
  288. gippa-1.0.0/src/gippa/stats/tda.py +143 -0
  289. gippa-1.0.0/src/gippa/stats/tdist.py +348 -0
  290. gippa-1.0.0/src/gippa/stats/wallenius.py +110 -0
  291. gippa-1.0.0/src/gippa/steps/__init__.py +14 -0
  292. gippa-1.0.0/src/gippa/steps/annotation.py +151 -0
  293. gippa-1.0.0/src/gippa/steps/codon.py +87 -0
  294. gippa-1.0.0/src/gippa/steps/common.py +56 -0
  295. gippa-1.0.0/src/gippa/steps/context.py +165 -0
  296. gippa-1.0.0/src/gippa/steps/context_stats.py +344 -0
  297. gippa-1.0.0/src/gippa/steps/detectability.py +111 -0
  298. gippa-1.0.0/src/gippa/steps/determinants.py +242 -0
  299. gippa-1.0.0/src/gippa/steps/function.py +193 -0
  300. gippa-1.0.0/src/gippa/steps/gene_table.py +164 -0
  301. gippa-1.0.0/src/gippa/steps/manifest.py +165 -0
  302. gippa-1.0.0/src/gippa/steps/mapping.py +631 -0
  303. gippa-1.0.0/src/gippa/steps/novel.py +543 -0
  304. gippa-1.0.0/src/gippa/steps/operons.py +334 -0
  305. gippa-1.0.0/src/gippa/steps/plots.py +298 -0
  306. gippa-1.0.0/src/gippa/steps/promoters.py +96 -0
  307. gippa-1.0.0/src/gippa/steps/rbs.py +68 -0
  308. gippa-1.0.0/src/gippa/steps/regions.py +162 -0
  309. gippa-1.0.0/src/gippa/steps/registry.py +329 -0
  310. gippa-1.0.0/src/gippa/steps/sensitivity.py +302 -0
  311. gippa-1.0.0/src/gippa/steps/terminators.py +148 -0
  312. gippa-1.0.0/src/gippa/steps/transcription.py +55 -0
  313. gippa-1.0.0/src/gippa/steps/variants.py +243 -0
  314. gippa-1.0.0/src/gippa/variants/__init__.py +1 -0
  315. gippa-1.0.0/src/gippa/variants/align.py +373 -0
  316. gippa-1.0.0/src/gippa/variants/error_rates.py +124 -0
  317. gippa-1.0.0/src/gippa/variants/flags.py +211 -0
  318. gippa-1.0.0/src/gippa/variants/pileup.py +357 -0
  319. gippa-1.0.0/src/gippa/variants/qc.py +66 -0
  320. gippa-1.0.0/src/gippa/variants/vcf_records.py +201 -0
  321. gippa-1.0.0/src/gippa/viz/__init__.py +1 -0
  322. gippa-1.0.0/src/gippa/viz/base.py +218 -0
  323. gippa-1.0.0/src/gippa/viz/checklist.py +371 -0
  324. gippa-1.0.0/src/gippa/viz/circos.py +640 -0
  325. gippa-1.0.0/src/gippa/viz/compare.py +301 -0
  326. gippa-1.0.0/src/gippa/viz/correlogram.py +212 -0
  327. gippa-1.0.0/src/gippa/viz/detection.py +409 -0
  328. gippa-1.0.0/src/gippa/viz/determinants.py +425 -0
  329. gippa-1.0.0/src/gippa/viz/diagnostics.py +280 -0
  330. gippa-1.0.0/src/gippa/viz/enrichment.py +557 -0
  331. gippa-1.0.0/src/gippa/viz/interactive.py +60 -0
  332. gippa-1.0.0/src/gippa/viz/landscape.py +302 -0
  333. gippa-1.0.0/src/gippa/viz/locus.py +593 -0
  334. gippa-1.0.0/src/gippa/viz/mapping_fdr.py +332 -0
  335. gippa-1.0.0/src/gippa/viz/mapping_sankey.py +231 -0
  336. gippa-1.0.0/src/gippa/viz/novel_orfs.py +216 -0
  337. gippa-1.0.0/src/gippa/viz/null_panels.py +236 -0
  338. gippa-1.0.0/src/gippa/viz/operon_pairs.py +328 -0
  339. gippa-1.0.0/src/gippa/viz/qc.py +313 -0
  340. gippa-1.0.0/src/gippa/viz/style.py +147 -0
  341. gippa-1.0.0/src/gippa/viz/support.py +211 -0
  342. gippa-1.0.0/src/gippa/viz/twins.py +304 -0
  343. gippa-1.0.0/src/gippa/viz/twins_determinants.py +109 -0
  344. gippa-1.0.0/src/gippa/viz/twins_panels.py +286 -0
  345. gippa-1.0.0/src/gippa/viz/variants.py +368 -0
  346. gippa-1.0.0/workflow/assets/ps/ps +16 -0
  347. gippa-1.0.0/workflow/assets/stub/bakta.json +52 -0
  348. gippa-1.0.0/workflow/bin/gippa_fgsea.R +144 -0
  349. gippa-1.0.0/workflow/bin/gippa_terminatornet_shard +292 -0
  350. gippa-1.0.0/workflow/conf/base.config +73 -0
  351. gippa-1.0.0/workflow/conf/container_common.config +14 -0
  352. gippa-1.0.0/workflow/conf/containers.config +50 -0
  353. gippa-1.0.0/workflow/conf/farmshare.config +41 -0
  354. gippa-1.0.0/workflow/conf/farmshare_local.config +24 -0
  355. gippa-1.0.0/workflow/conf/images.json +65 -0
  356. gippa-1.0.0/workflow/conf/prebuilt_envs.config +20 -0
  357. gippa-1.0.0/workflow/conf/slurm.config +18 -0
  358. gippa-1.0.0/workflow/conf/standard.config +2 -0
  359. gippa-1.0.0/workflow/conf/test.config +4 -0
  360. gippa-1.0.0/workflow/containers/bactermfinder/Dockerfile +26 -0
  361. gippa-1.0.0/workflow/containers/fgsea/Dockerfile +18 -0
  362. gippa-1.0.0/workflow/containers/ostir/Dockerfile +18 -0
  363. gippa-1.0.0/workflow/containers/promotech/Dockerfile +31 -0
  364. gippa-1.0.0/workflow/containers/promoter_calculator/Dockerfile +18 -0
  365. gippa-1.0.0/workflow/containers/step/Dockerfile +42 -0
  366. gippa-1.0.0/workflow/containers/step/Dockerfile.dockerignore +7 -0
  367. gippa-1.0.0/workflow/containers/step/build-requirements.lock +7 -0
  368. gippa-1.0.0/workflow/containers/step/licences.allow +37 -0
  369. gippa-1.0.0/workflow/containers/step/requirements.lock +1871 -0
  370. gippa-1.0.0/workflow/containers/step-r/Dockerfile +46 -0
  371. gippa-1.0.0/workflow/containers/step-r/Dockerfile.dockerignore +7 -0
  372. gippa-1.0.0/workflow/containers/terminatornet/Dockerfile +26 -0
  373. gippa-1.0.0/workflow/containers/uniop/Dockerfile +19 -0
  374. gippa-1.0.0/workflow/containers/uniop/uniop.def +30 -0
  375. gippa-1.0.0/workflow/envs/antismash.yml +5 -0
  376. gippa-1.0.0/workflow/envs/bactermfinder.yml +19 -0
  377. gippa-1.0.0/workflow/envs/bakta.yml +5 -0
  378. gippa-1.0.0/workflow/envs/blast.yml +5 -0
  379. gippa-1.0.0/workflow/envs/cascadia.yml +47 -0
  380. gippa-1.0.0/workflow/envs/fgsea.yml +11 -0
  381. gippa-1.0.0/workflow/envs/genomad.yml +5 -0
  382. gippa-1.0.0/workflow/envs/locks/bactermfinder.explicit.txt +64 -0
  383. gippa-1.0.0/workflow/envs/locks/bactermfinder.pip.txt +50 -0
  384. gippa-1.0.0/workflow/envs/locks/cascadia.explicit.txt +254 -0
  385. gippa-1.0.0/workflow/envs/locks/cascadia.pip.txt +142 -0
  386. gippa-1.0.0/workflow/envs/locks/fgsea.explicit.txt +127 -0
  387. gippa-1.0.0/workflow/envs/locks/miniprot.explicit.txt +9 -0
  388. gippa-1.0.0/workflow/envs/locks/ostir.explicit.txt +48 -0
  389. gippa-1.0.0/workflow/envs/locks/ostir.pip.txt +3 -0
  390. gippa-1.0.0/workflow/envs/locks/promotech.explicit.txt +154 -0
  391. gippa-1.0.0/workflow/envs/locks/promotech.pip.txt +96 -0
  392. gippa-1.0.0/workflow/envs/locks/promoter_calculator.explicit.txt +49 -0
  393. gippa-1.0.0/workflow/envs/locks/promoter_calculator.pip.txt +9 -0
  394. gippa-1.0.0/workflow/envs/locks/terminatornet.explicit.txt +49 -0
  395. gippa-1.0.0/workflow/envs/locks/terminatornet.pip.txt +7 -0
  396. gippa-1.0.0/workflow/envs/locks/timsconvert.explicit.txt +30 -0
  397. gippa-1.0.0/workflow/envs/locks/timsconvert.pip.txt +37 -0
  398. gippa-1.0.0/workflow/envs/locks/uniop.explicit.txt +53 -0
  399. gippa-1.0.0/workflow/envs/locks/uniop.pip.txt +16 -0
  400. gippa-1.0.0/workflow/envs/miniprot.yml +5 -0
  401. gippa-1.0.0/workflow/envs/ostir.yml +10 -0
  402. gippa-1.0.0/workflow/envs/promotech.yml +28 -0
  403. gippa-1.0.0/workflow/envs/promoter_calculator.yml +13 -0
  404. gippa-1.0.0/workflow/envs/terminatornet.yml +12 -0
  405. gippa-1.0.0/workflow/envs/timsconvert.yml +20 -0
  406. gippa-1.0.0/workflow/envs/transtermhp.yml +5 -0
  407. gippa-1.0.0/workflow/envs/uniop.yml +11 -0
  408. gippa-1.0.0/workflow/main.nf +150 -0
  409. gippa-1.0.0/workflow/modules/local/antismash/main.nf +41 -0
  410. gippa-1.0.0/workflow/modules/local/antismash/meta.yml +17 -0
  411. gippa-1.0.0/workflow/modules/local/bactermfinder/main.nf +44 -0
  412. gippa-1.0.0/workflow/modules/local/bactermfinder/meta.yml +7 -0
  413. gippa-1.0.0/workflow/modules/local/bakta/main.nf +52 -0
  414. gippa-1.0.0/workflow/modules/local/bakta/meta.yml +11 -0
  415. gippa-1.0.0/workflow/modules/local/genomad/main.nf +39 -0
  416. gippa-1.0.0/workflow/modules/local/genomad/meta.yml +7 -0
  417. gippa-1.0.0/workflow/modules/local/gippa_step/main.nf +119 -0
  418. gippa-1.0.0/workflow/modules/local/gippa_step/meta.yml +32 -0
  419. gippa-1.0.0/workflow/modules/local/miniprot/main.nf +40 -0
  420. gippa-1.0.0/workflow/modules/local/miniprot/meta.yml +27 -0
  421. gippa-1.0.0/workflow/modules/local/ostir/main.nf +35 -0
  422. gippa-1.0.0/workflow/modules/local/ostir/meta.yml +7 -0
  423. gippa-1.0.0/workflow/modules/local/promotech/main.nf +40 -0
  424. gippa-1.0.0/workflow/modules/local/promotech/meta.yml +7 -0
  425. gippa-1.0.0/workflow/modules/local/promoter_calculator/main.nf +44 -0
  426. gippa-1.0.0/workflow/modules/local/promoter_calculator/meta.yml +7 -0
  427. gippa-1.0.0/workflow/modules/local/tblastn/main.nf +40 -0
  428. gippa-1.0.0/workflow/modules/local/tblastn/meta.yml +27 -0
  429. gippa-1.0.0/workflow/modules/local/terminatornet/main.nf +36 -0
  430. gippa-1.0.0/workflow/modules/local/terminatornet/meta.yml +7 -0
  431. gippa-1.0.0/workflow/modules/local/terminatornet_chunk/main.nf +24 -0
  432. gippa-1.0.0/workflow/modules/local/terminatornet_merge/main.nf +36 -0
  433. gippa-1.0.0/workflow/modules/local/terminatornet_plan/main.nf +26 -0
  434. gippa-1.0.0/workflow/modules/local/transtermhp/main.nf +34 -0
  435. gippa-1.0.0/workflow/modules/local/transtermhp/meta.yml +7 -0
  436. gippa-1.0.0/workflow/modules/local/uniop/main.nf +36 -0
  437. gippa-1.0.0/workflow/modules/local/uniop/meta.yml +7 -0
  438. gippa-1.0.0/workflow/nextflow.config +88 -0
  439. gippa-1.0.0/workflow/subworkflows/local/annotate.nf +273 -0
  440. gippa-1.0.0/workflow/subworkflows/local/context.nf +81 -0
  441. gippa-1.0.0/workflow/subworkflows/local/determinants.nf +39 -0
  442. gippa-1.0.0/workflow/subworkflows/local/function.nf +37 -0
  443. gippa-1.0.0/workflow/subworkflows/local/genetable.nf +58 -0
  444. gippa-1.0.0/workflow/subworkflows/local/mapping.nf +82 -0
  445. gippa-1.0.0/workflow/subworkflows/local/novel.nf +101 -0
  446. gippa-1.0.0/workflow/subworkflows/local/operons.nf +37 -0
  447. gippa-1.0.0/workflow/subworkflows/local/report.nf +26 -0
  448. gippa-1.0.0/workflow/subworkflows/local/sensitivity.nf +38 -0
  449. gippa-1.0.0/workflow/subworkflows/local/terminatornet_sharded.nf +23 -0
  450. 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
@@ -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).
@@ -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.