From 5573c9942f6cf24386fffe353f3ca63051ea5cc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Arnoux?= Date: Mon, 11 Sep 2023 17:48:42 +0200 Subject: [PATCH 01/16] Change setup.py for pyproject.toml --- VERSION | 2 +- ppanggolin/main.py | 20 ++++++++----- pyproject.toml | 70 ++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 29 ++++--------------- 4 files changed, 89 insertions(+), 32 deletions(-) create mode 100644 pyproject.toml diff --git a/VERSION b/VERSION index 52cd5461..c262507c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.173 +1.2.174 diff --git a/ppanggolin/main.py b/ppanggolin/main.py index a2de8535..2d94fc7b 100644 --- a/ppanggolin/main.py +++ b/ppanggolin/main.py @@ -4,11 +4,11 @@ # default libraries import sys -if sys.version_info < (3, 6): # minimum is python3.6 - raise AssertionError("Minimum python version to run PPanGGOLiN is 3.6. Your current python version is " + +if sys.version_info < (3, 8): # minimum is python3.8 + raise AssertionError("Minimum python version to run PPanGGOLiN is 3.8. Your current python version is " + ".".join(map(str, sys.version_info))) import argparse -import pkg_resources +from importlib.metadata import distribution # local modules import ppanggolin.pangenome @@ -32,6 +32,13 @@ from ppanggolin import SUBCOMMAND_TO_SUBPARSER +version = distribution("ppanggolin").version +epilog = f""" +PPanGGOLiN ({version}) is an opensource bioinformatic tools under CeCILL FREE SOFTWARE LICENSE AGREEMENT +LABGeM +Please cite: Gautreau G et al. (2020) PPanGGOLiN: Depicting microbial diversity via a partitioned pangenome graph. +PLOS Computational Biology 16(3): e1007732. https://doi.org/10.1371/journal.pcbi.1007732 +""" def cmd_line() -> argparse.Namespace: """ Manage the command line argument given by user @@ -80,19 +87,18 @@ def cmd_line() -> argparse.Namespace: desc += " \n" desc += " Utility command:\n" desc += " utils Helper side commands.\n" - desc += " \n" parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + epilog=epilog) parser.add_argument('-v', '--version', action='version', - version='%(prog)s ' + pkg_resources.get_distribution("ppanggolin").version) + version='%(prog)s ' + version) subparsers = parser.add_subparsers(metavar="", dest="subcommand", title="subcommands", description=desc) subparsers.required = True # because python3 sent subcommands to hell apparently - # print help if no subcommand is specified if len(sys.argv) == 1: parser.print_help() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..530c6052 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,70 @@ +[build-system] +requires = [ + "setuptools", + "setuptools-scm", + "cython" +] +build-backend = "setuptools.build_meta" +py_modules=["ppanggolin"] + +[project] +name = "PPanGGOLiN" +description = "Pangenome analysis suite" +dynamic = ["version"] +authors = [ + {name = "Guillaume Gautreau"}, + {name = "Adelme Bazin"}, + {name = "Jérôme Arnoux", email = "jarnoux@genoscope.cns.fr"}, + {name = "Jean Mainguy"}, +] +maintainers = [ + {name = "Guillaume Gautreau"}, + {name = "Adelme Bazin"}, + {name = "Jérôme Arnoux", email = "jarnoux@genoscope.cns.fr"}, + {name = "Jean Mainguy"}, +] +readme = "README.md" +keywords = ["Pangenomics", "Comparative genomics", "Bioinformatics", "Prokaryote"] +classifiers=[ + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: CEA CNRS Inria Logiciel Libre License, version 2.1 (CeCILL-2.1)", + "Natural Language :: English", + "Operating System :: POSIX :: Linux", + "Programming Language :: Python :: 3", + "Topic :: Scientific/Engineering :: Bio-Informatics"] +requires-python = ">=3.8" +license = {file="LICENCE.txt"} + +[project.optional-dependencies] +doc = [ + "sphinx==6.2.1", + "sphinx_rtd_theme==1.2.2", + "readthedocs-sphinx-search==0.3.1", + "sphinx-autobuild==2021.3.14", + "myst-parser==1.0.0", + "docutils==0.18.1" +] +test = [ + "pytest>=7.0.0" +] +# +[project.urls] +Homepage = "https://labgem.genoscope.cns.fr/2023/04/27/ppanggolin/" +Repository = "https://github.com/labgem/PPanGGOLiN/" +#Changelog = "https://github.com/me/spam/blob/master/CHANGELOG.md" +#Documentation = "https://readthedocs.org" +# +# +[project.scripts] +ppanggolin = "ppanggolin.main:main" + +[tool.setuptools] +packages = ["ppanggolin"] + +#[tool.setuptools.package-data] +#mypkg = ["*.txt", "*.rst"] + +[tool.setuptools.dynamic] +version = {file = "VERSION"} \ No newline at end of file diff --git a/setup.py b/setup.py index ada32680..dde043b5 100755 --- a/setup.py +++ b/setup.py @@ -1,31 +1,12 @@ #!/usr/bin/env python3 -import setuptools -import os - -from distutils.extension import Extension +from setuptools import Extension, setup NEM_DIR_PATH = "ppanggolin/nem/NEM/" -if __name__ == "__main__": - setuptools.setup( - name="ppanggolin", - version=open(os.path.join(os.path.dirname(__file__), "VERSION")).read().rstrip(), - url="https://github.com/labgem/PPanGGOLiN", - description="Pangenome analysis suite", - packages=setuptools.find_packages(), - setup_requires=["cython<3.0.0"], - install_requires=[], - package_data={'': ['rRNA_DB/*cm*']}, - classifiers=["Environment :: Console", - "Intended Audience :: Science/Research", - "License :: OSI Approved :: CEA CNRS Inria Logiciel Libre License, version 2.1 (CeCILL-2.1)", - "Natural Language :: English", - "Operating System :: POSIX :: Linux", - "Programming Language :: Python :: 3", - "Topic :: Scientific/Engineering :: Bio-Informatics"], - entry_points={"console_scripts": ["ppanggolin = ppanggolin.main:main"]}, - ext_modules=[Extension( +setup( + ext_modules=[ + Extension( extra_compile_args=['-fcommon'], name="nem_stats", sources=[NEM_DIR_PATH + 'nem_stats.pyx', @@ -38,4 +19,4 @@ NEM_DIR_PATH + 'nem_hlp.c', NEM_DIR_PATH + 'genmemo.c'], include_dirs=[NEM_DIR_PATH])] - ) +) From 8275fbdb4e4c1cadbb260f13ce8bc01fa43b4ad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Arnoux?= Date: Tue, 12 Sep 2023 17:28:56 +0200 Subject: [PATCH 02/16] Give structure for readthedoc --- README.md | 117 +++++++++ README.rst | 126 --------- VERSION | 2 +- docs/{dev => }/Makefile | 0 docs/dev/README.txt | 4 - docs/dev/requirements.txt | 3 - docs/dev/source/classes/edge.rst | 7 - docs/dev/source/classes/geneFamily.rst | 7 - docs/dev/source/classes/pangenome.rst | 7 - docs/dev/source/index.rst | 20 -- docs/dev/source/ppanggolin.RGP.rst | 23 -- docs/dev/source/ppanggolin.align.rst | 26 -- docs/dev/source/ppanggolin.annotate.rst | 33 --- docs/dev/source/ppanggolin.cluster.rst | 15 -- docs/dev/source/ppanggolin.figures.rst | 31 --- docs/dev/source/ppanggolin.formats.rst | 31 --- docs/dev/source/ppanggolin.graph.rst | 15 -- docs/dev/source/ppanggolin.info.rst | 15 -- docs/dev/source/ppanggolin.nem.rst | 23 -- docs/dev/source/ppanggolin.rst | 79 ------ docs/dev/source/ppanggolin.workflow.rst | 23 -- docs/{dev => }/make.bat | 70 ++--- docs/source/_static/drawspot_example.png | Bin 0 -> 60456 bytes docs/source/_static/evolution.png | Bin 0 -> 483347 bytes docs/source/_static/gephi.gif | Bin 0 -> 4779547 bytes docs/source/_static/logo.png | Bin 0 -> 81011 bytes docs/source/_static/projection.png | Bin 0 -> 677175 bytes docs/source/_static/resampling.png | Bin 0 -> 51612 bytes docs/source/_static/runtimes.png | Bin 0 -> 66768 bytes docs/source/_static/tile_plot.png | Bin 0 -> 47045 bytes docs/source/_static/u_plot.png | Bin 0 -> 21156 bytes docs/source/_static/workflow.png | Bin 0 -> 836904 bytes docs/source/api/ppanggolin.RGP.md | 39 +++ docs/source/api/ppanggolin.align.md | 21 ++ docs/source/api/ppanggolin.annotate.md | 30 +++ docs/source/api/ppanggolin.cluster.md | 21 ++ docs/source/api/ppanggolin.context.md | 21 ++ docs/source/api/ppanggolin.figures.md | 48 ++++ docs/source/api/ppanggolin.formats.md | 66 +++++ docs/source/api/ppanggolin.graph.md | 21 ++ docs/source/api/ppanggolin.info.md | 21 ++ docs/source/api/ppanggolin.md | 116 +++++++++ docs/source/api/ppanggolin.meta.md | 21 ++ docs/source/api/ppanggolin.metrics.md | 30 +++ docs/source/api/ppanggolin.mod.md | 21 ++ docs/source/api/ppanggolin.nem.md | 30 +++ docs/source/api/ppanggolin.utility.md | 21 ++ docs/source/api/ppanggolin.workflow.md | 48 ++++ docs/{dev => }/source/conf.py | 20 +- docs/source/dev/buildDoc.md | 243 ++++++++++++++++++ docs/source/dev/devRules.md | 4 + docs/source/dev/git.md | 6 + docs/source/dev/unitTest.md | 4 + docs/source/dev/workflows.md | 4 + docs/source/index.md | 55 ++++ docs/{ => source}/user/Align.md | 2 + .../Basic-usage-and-practical-information.md | 32 ++- docs/{ => source}/user/Conserved-modules.md | 10 +- docs/{ => source}/user/Genomic-context.md | 16 +- docs/source/user/Installation.md | 102 ++++++++ docs/{ => source}/user/Introduction.md | 1 + docs/{ => source}/user/Outputs.md | 82 +++--- .../user/Regions-of-Genome-Plasticity.md | 8 +- docs/{ => source}/user/metadata.md | 14 +- .../user/step-by-step-pangenome-analysis.md} | 39 ++- docs/user/Home.md | 48 ---- docs/user/Installation.md | 43 ---- docs/user/_Sidebar.md | 22 -- requirements_pip.txt | 11 - 69 files changed, 1283 insertions(+), 735 deletions(-) create mode 100644 README.md delete mode 100755 README.rst rename docs/{dev => }/Makefile (100%) delete mode 100644 docs/dev/README.txt delete mode 100644 docs/dev/requirements.txt delete mode 100644 docs/dev/source/classes/edge.rst delete mode 100644 docs/dev/source/classes/geneFamily.rst delete mode 100644 docs/dev/source/classes/pangenome.rst delete mode 100644 docs/dev/source/index.rst delete mode 100644 docs/dev/source/ppanggolin.RGP.rst delete mode 100644 docs/dev/source/ppanggolin.align.rst delete mode 100644 docs/dev/source/ppanggolin.annotate.rst delete mode 100644 docs/dev/source/ppanggolin.cluster.rst delete mode 100644 docs/dev/source/ppanggolin.figures.rst delete mode 100644 docs/dev/source/ppanggolin.formats.rst delete mode 100644 docs/dev/source/ppanggolin.graph.rst delete mode 100644 docs/dev/source/ppanggolin.info.rst delete mode 100644 docs/dev/source/ppanggolin.nem.rst delete mode 100644 docs/dev/source/ppanggolin.rst delete mode 100644 docs/dev/source/ppanggolin.workflow.rst rename docs/{dev => }/make.bat (91%) create mode 100644 docs/source/_static/drawspot_example.png create mode 100644 docs/source/_static/evolution.png create mode 100644 docs/source/_static/gephi.gif create mode 100644 docs/source/_static/logo.png create mode 100644 docs/source/_static/projection.png create mode 100644 docs/source/_static/resampling.png create mode 100644 docs/source/_static/runtimes.png create mode 100644 docs/source/_static/tile_plot.png create mode 100644 docs/source/_static/u_plot.png create mode 100644 docs/source/_static/workflow.png create mode 100644 docs/source/api/ppanggolin.RGP.md create mode 100644 docs/source/api/ppanggolin.align.md create mode 100644 docs/source/api/ppanggolin.annotate.md create mode 100644 docs/source/api/ppanggolin.cluster.md create mode 100644 docs/source/api/ppanggolin.context.md create mode 100644 docs/source/api/ppanggolin.figures.md create mode 100644 docs/source/api/ppanggolin.formats.md create mode 100644 docs/source/api/ppanggolin.graph.md create mode 100644 docs/source/api/ppanggolin.info.md create mode 100644 docs/source/api/ppanggolin.md create mode 100644 docs/source/api/ppanggolin.meta.md create mode 100644 docs/source/api/ppanggolin.metrics.md create mode 100644 docs/source/api/ppanggolin.mod.md create mode 100644 docs/source/api/ppanggolin.nem.md create mode 100644 docs/source/api/ppanggolin.utility.md create mode 100644 docs/source/api/ppanggolin.workflow.md rename docs/{dev => }/source/conf.py (81%) create mode 100644 docs/source/dev/buildDoc.md create mode 100644 docs/source/dev/devRules.md create mode 100644 docs/source/dev/git.md create mode 100644 docs/source/dev/unitTest.md create mode 100644 docs/source/dev/workflows.md create mode 100644 docs/source/index.md rename docs/{ => source}/user/Align.md (99%) rename docs/{ => source}/user/Basic-usage-and-practical-information.md (86%) rename docs/{ => source}/user/Conserved-modules.md (71%) rename docs/{ => source}/user/Genomic-context.md (67%) create mode 100644 docs/source/user/Installation.md rename docs/{ => source}/user/Introduction.md (99%) rename docs/{ => source}/user/Outputs.md (98%) rename docs/{ => source}/user/Regions-of-Genome-Plasticity.md (97%) rename docs/{ => source}/user/metadata.md (93%) rename docs/{user/PPanGGOLiN---step-by-step-pangenome-analysis.md => source/user/step-by-step-pangenome-analysis.md} (86%) delete mode 100644 docs/user/Home.md delete mode 100644 docs/user/Installation.md delete mode 100644 docs/user/_Sidebar.md delete mode 100644 requirements_pip.txt diff --git a/README.md b/README.md new file mode 100644 index 00000000..9eb25601 --- /dev/null +++ b/README.md @@ -0,0 +1,117 @@ +[![Actions](https://img.shields.io/github/actions/workflow/status/althonos/pyrodigal/test.yml?branch=main&logo=github&style=flat-square&maxAge=300)](https://github.com/labgem/ppanggolin/actions) +[![License](https://anaconda.org/bioconda/ppanggolin/badges/license.svg)](http://www.cecill.info/licences.fr.html) +[![Bioconda](https://img.shields.io/conda/vn/bioconda/ppanggolin?style=flat-square&maxAge=3600&logo=anaconda)](https://anaconda.org/bioconda/ppanggolin) +[![Source](https://img.shields.io/badge/source-GitHub-303030.svg?maxAge=2678400&style=flat-square)](https://github.com/labgem/ppanggolin/) +[![GitHub issues](https://img.shields.io/github/issues/labgem/ppanggolin.svg?style=flat-square&maxAge=600)](https://github.com/labgem/ppanggolin/issues) +[![Docs](https://img.shields.io/readthedocs/ppanggolin/latest?style=flat-square&maxAge=600)](https://ppanggolin.readthedocs.io) +[![Downloads](https://anaconda.org/bioconda/ppanggolin/badges/downloads.svg)](https://bioconda.github.io/recipes/ppanggolin/README.html#download-stats) + + +# PPanGGOLiN : Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors + +PPanGGOLiN (Gautreau et al. 2020) is a software suite used to create and manipulate prokaryotic pangenomes from a set of either genomic DNA sequences or provided genome annotations. It is designed to scale up to tens of thousands of genomes. It has the specificity to partition the pangenome using a statistical approach rather than using fixed thresholds which gives it the ability to work with low-quality data such as Metagenomic Assembled Genomes (MAGs) or Single-cell Amplified Genomes (SAGs) thus taking advantage of large scale environmental studies and letting users study the pangenome of uncultivable species. + +PPanGGOLiN builds pangenomes through a graphical model and a statistical method to partition gene families in persistent, shell and cloud genomes. It integrates both information on protein-coding genes and their genomic neighborhood to build a graph of gene families where each node is a gene family and each edge is a relation of genetic contiguity. The partitioning method promotes that two gene families that are consistent neighbors in the graph are more likely to belong to the same partition. It results in a Partitioned Pangenome Graph (PPG) made of persistent, shell and cloud nodes drawing genomes on rails like a subway map to help biologists navigate the great diversity of microbial life. + +Moreover, the panRGP method (Bazin et al. 2020) included in PPanGGOLiN predicts, for each genome, Regions of Genome Plasticity (RGPs) that are clusters of genes made of shell and cloud genomes in the pangenome graph. +Most of them arise from Horizontal gene transfer (HGT) and correspond to Genomic Islands (GIs). +RGPs from different genomes are next grouped in spots of insertion based on their conserved flanking persistent genes. + +Those RGPs can be further divided in conserved modules by panModule (Bazin et al. 2021). Those conserved modules correspond to groups of cooccurring and colocalized genes that are gained or lost together in the variable regions of the pangenome. + +```{image} _static/logo.png +:align: center +``` + +# Installation + +PPanGGOLiN is easily installed via conda +You will need the following conda channels if you don't have them already: + +```bash +conda config --add channels defaults +conda config --add channels bioconda +conda config --add channels conda-forge +``` + +Then, you can just run : + +```bash +conda install -c bioconda ppanggolin +``` + +# Quick usage + +PPanGGOLiN has a minimal command for the non-expert users : + +```bash +ppanggolin workflow --fasta ORGANISMS_FASTA_LIST +``` + +It uses parameters that we found to be generally the best when working with species pangenomes. + +The file ORGANISMS_FASTA_LIST is a tsv-separated file with the following organisation : +: 1. The first column contains a unique organism name **(without whitespace)** + 2. The second column the path to the associated FASTA file + 3. Circular contig identifiers are indicated in the following columns + 4. Each line represents an organism + +An [example](https://github.com/labgem/PPanGGOLiN/blob/master/testingDataset/organisms.fasta.list) with 50 *Chlamydia trachomatis* genomes can be found in the testingDataset/ directory. + +You can also give PPanGGOLiN your own annotations using .gff or .gbff/.gbk files instead of .fasta files, such as the ones provided by prokka using the following command : + +```bash +ppanggolin workflow --anno ORGANISMS_ANNOTATION_LIST +``` + +Another [example](https://github.com/labgem/PPanGGOLiN/blob/master/testingDataset/organisms.gbff.list) of such a file can be found in the testingDataset/ directory. + +Both of those commands write several output files and graphics. Most notably a HDF-5 (pangenome.h5) file is written. It can be used as input for any of the subcommands to rerun parts of the analysis with different parameters, write and draw different representations of the pangenome or run additional analysis with PPanGGOLiN. + +A minimum of 5 genomes is generally required to perform a pangenomics analysis using the traditional *core genome*/*accessory genome* paradigm. It is advised to use at least 15 genomes having genomic variations (and not only SNPs) to obtain robust results with the PPanGGOLiN statistical approach. + +If you want to use personalized parameters for each subcommand most options should be self descriptive. +If you want to know more about what each output file is, +or briefly how each subcommand works you can check the [steb by step documentation](https://github.com/labgem/PPanGGOLiN/wiki) + +Furthermore, you can also predict genomic islands and cluster them into spots of insertion using the panRGP pipeline. The usage is identical to the previous 'workflow' command: + +```bash +ppanggolin panrgp --fasta ORGANISMS_FASTA_LIST +``` + +It will run more analyses after the pangenome has been partitioned. Further details are available [here](https://github.com/labgem/PPanGGOLiN/wiki/Regions-of-Genome-Plasticity) and in the panRPG publication (see below) + +To detect the conserved modules in your pangenome, you can use the panModule workflow, as such: + +```bash +ppanggolin panmodule --fasta ORGANISMS_FASTA_LIST +``` + +Further details can be found [in the wiki](https://github.com/labgem/PPanGGOLiN/wiki/Conserved-modules) and in the panModule publication (see below) + +Alternatively, to run all the possible analysis that PPanGGOLiN can run, you can use: + +```bash +ppanggolin all --fasta ORGANISMS_FASTA_LIST +``` + +Overall, ppanggolin has a lot of subcommands and possibilities. Don't hesitate to check the command line help, and the [github wiki](https://github.com/labgem/PPanGGOLiN/wiki) to see all the possible analysis, if you are missing a file you're looking for, or do not understand an output. You can also raise an `issue` if you wish! + +# Issues, Questions, Remarks + +If you have any question or issue with installing, using or understanding PPanGGOLiN, please do not hesitate to post an issue ! We cannot correct bugs if we do not know about them, and will try to help you the best we can. + +# Citation + +If you use this tool for your research please cite: + +Gautreau G et al. (2020) PPanGGOLiN: Depicting microbial diversity via a partitioned pangenome graph. PLOS Computational Biology 16(3): e1007732. + +If you use this tool to study genomic islands, please cite: + +Bazin et al., panRGP: a pangenome-based method to predict genomic islands and explore their diversity, Bioinformatics, Volume 36, Issue Supplement_2, December 2020, Pages i651–i658, + +If you use this tool to study modules, please cite: + +Bazin et al., panModule: detecting conserved modules in the variable regions of a pangenome graph. biorxiv. diff --git a/README.rst b/README.rst deleted file mode 100755 index 1afdf1b2..00000000 --- a/README.rst +++ /dev/null @@ -1,126 +0,0 @@ -PPanGGOLiN : Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors -======================================================================================================== - -PPanGGOLiN (Gautreau et al. 2020) is a software suite used to create and manipulate prokaryotic pangenomes from a set of either genomic DNA sequences or provided genome annotations. It is designed to scale up to tens of thousands of genomes. It has the specificity to partition the pangenome using a statistical approach rather than using fixed thresholds which gives it the ability to work with low-quality data such as Metagenomic Assembled Genomes (MAGs) or Single-cell Amplified Genomes (SAGs) thus taking advantage of large scale environmental studies and letting users study the pangenome of uncultivable species. - -PPanGGOLiN builds pangenomes through a graphical model and a statistical method to partition gene families in persistent, shell and cloud genomes. It integrates both information on protein-coding genes and their genomic neighborhood to build a graph of gene families where each node is a gene family and each edge is a relation of genetic contiguity. The partitioning method promotes that two gene families that are consistent neighbors in the graph are more likely to belong to the same partition. It results in a Partitioned Pangenome Graph (PPG) made of persistent, shell and cloud nodes drawing genomes on rails like a subway map to help biologists navigate the great diversity of microbial life. - -Moreover, the panRGP method (Bazin et al. 2020) included in PPanGGOLiN predicts, for each genome, Regions of Genome Plasticity (RGPs) that are clusters of genes made of shell and cloud genomes in the pangenome graph. -Most of them arise from Horizontal gene transfer (HGT) and correspond to Genomic Islands (GIs). -RGPs from different genomes are next grouped in spots of insertion based on their conserved flanking persistent genes. - -Those RGPs can be further divided in conserved modules by panModule (Bazin et al. 2021). Those conserved modules correspond to groups of cooccurring and colocalized genes that are gained or lost together in the variable regions of the pangenome. - -|installs| |bioconda| |plat| |version| - -.. |installs| image:: https://img.shields.io/conda/dn/bioconda/ppanggolin.svg?style=flag&label=BioConda%20install - :target: https://anaconda.org/bioconda/ppanggolin -.. |plat| image:: https://anaconda.org/bioconda/ppanggolin/badges/platforms.svg - :target: https://anaconda.org/bioconda/ppanggolin -.. |version| image:: https://anaconda.org/bioconda/ppanggolin/badges/version.svg - :target: https://anaconda.org/bioconda/ppanggolin -.. |bioconda| image:: https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg?style=flat - :target: http://bioconda.github.io/recipes/ppanggolin/README.html - - -.. image:: images/logo.png - :align: center - - -Installation -============ - - -PPanGGOLiN is easily installed via conda -You will need the following conda channels if you don't have them already: - -.. code:: bash - - conda config --add channels defaults - conda config --add channels bioconda - conda config --add channels conda-forge - -Then, you can just run : - -.. code:: bash - - conda install -c bioconda ppanggolin - - -Quick usage -=========== - -PPanGGOLiN has a minimal command for the non-expert users : - -.. code:: bash - - ppanggolin workflow --fasta ORGANISMS_FASTA_LIST - -It uses parameters that we found to be generally the best when working with species pangenomes. - -The file ORGANISMS_FASTA_LIST is a tsv-separated file with the following organisation : - 1. The first column contains a unique organism name **(without whitespace)** - 2. The second column the path to the associated FASTA file - 3. Circular contig identifiers are indicated in the following columns - 4. Each line represents an organism - -An `example `_ with 50 *Chlamydia trachomatis* genomes can be found in the testingDataset/ directory. - -You can also give PPanGGOLiN your own annotations using .gff or .gbff/.gbk files instead of .fasta files, such as the ones provided by prokka using the following command : - -.. code:: bash - - ppanggolin workflow --anno ORGANISMS_ANNOTATION_LIST - -Another `example `_ of such a file can be found in the testingDataset/ directory. - -Both of those commands write several output files and graphics. Most notably a HDF-5 (pangenome.h5) file is written. It can be used as input for any of the subcommands to rerun parts of the analysis with different parameters, write and draw different representations of the pangenome or run additional analysis with PPanGGOLiN. - -A minimum of 5 genomes is generally required to perform a pangenomics analysis using the traditional *core genome*/*accessory genome* paradigm. It is advised to use at least 15 genomes having genomic variations (and not only SNPs) to obtain robust results with the PPanGGOLiN statistical approach. - -If you want to use personalized parameters for each subcommand most options should be self descriptive. If you want to know more about what each output file is, or briefly how each subcommand works you can check the `github wiki `_ - -Furthermore, you can also predict genomic islands and cluster them into spots of insertion using the panRGP pipeline. The usage is identical to the previous 'workflow' command: - -.. code:: bash - - ppanggolin panrgp --fasta ORGANISMS_FASTA_LIST - -It will run more analyses after the pangenome has been partitioned. Further details are available `here `_ and in the panRPG publication (see below) - -To detect the conserved modules in your pangenome, you can use the panModule workflow, as such: - -.. code:: bash - - ppanggolin panmodule --fasta ORGANISMS_FASTA_LIST - -Further details can be found `in the wiki `_ and in the panModule publication (see below) - -Alternatively, to run all the possible analysis that PPanGGOLiN can run, you can use: - -.. code:: bash - - ppanggolin all --fasta ORGANISMS_FASTA_LIST - -Overall, ppanggolin has a lot of subcommands and possibilities. Don't hesitate to check the command line help, and the `github wiki `_ to see all the possible analysis, if you are missing a file you're looking for, or do not understand an output. You can also raise an `issue` if you wish! - -Issues, Questions, Remarks -========================== - -If you have any question or issue with installing, using or understanding PPanGGOLiN, please do not hesitate to post an issue ! We cannot correct bugs if we do not know about them, and will try to help you the best we can. - - -Citation -======== -If you use this tool for your research please cite: - -Gautreau G et al. (2020) PPanGGOLiN: Depicting microbial diversity via a partitioned pangenome graph. PLOS Computational Biology 16(3): e1007732. https://doi.org/10.1371/journal.pcbi.1007732 - -If you use this tool to study genomic islands, please cite: - -Bazin et al., panRGP: a pangenome-based method to predict genomic islands and explore their diversity, Bioinformatics, Volume 36, Issue Supplement_2, December 2020, Pages i651–i658, https://doi.org/10.1093/bioinformatics/btaa792 - -If you use this tool to study modules, please cite: - -Bazin et al., panModule: detecting conserved modules in the variable regions of a pangenome graph. biorxiv. https://doi.org/10.1101/2021.12.06.471380 - diff --git a/VERSION b/VERSION index c262507c..8464960b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.174 +1.2.175 diff --git a/docs/dev/Makefile b/docs/Makefile similarity index 100% rename from docs/dev/Makefile rename to docs/Makefile diff --git a/docs/dev/README.txt b/docs/dev/README.txt deleted file mode 100644 index 76c1857f..00000000 --- a/docs/dev/README.txt +++ /dev/null @@ -1,4 +0,0 @@ -To build the doc, install the requirements listed in requirements.txt, and then run: - -make html - diff --git a/docs/dev/requirements.txt b/docs/dev/requirements.txt deleted file mode 100644 index fedd390e..00000000 --- a/docs/dev/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -sphinx -sphinx_rtd_theme - diff --git a/docs/dev/source/classes/edge.rst b/docs/dev/source/classes/edge.rst deleted file mode 100644 index bc984e55..00000000 --- a/docs/dev/source/classes/edge.rst +++ /dev/null @@ -1,7 +0,0 @@ -The ``Edge`` class -================== - -.. autoclass:: ppanggolin.pangenome.Edge - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/source/classes/geneFamily.rst b/docs/dev/source/classes/geneFamily.rst deleted file mode 100644 index f7c2f21a..00000000 --- a/docs/dev/source/classes/geneFamily.rst +++ /dev/null @@ -1,7 +0,0 @@ -The ``GeneFamily`` class -======================== - -.. autoclass:: ppanggolin.geneFamily.GeneFamily - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/source/classes/pangenome.rst b/docs/dev/source/classes/pangenome.rst deleted file mode 100644 index 4f2ebd31..00000000 --- a/docs/dev/source/classes/pangenome.rst +++ /dev/null @@ -1,7 +0,0 @@ -The ``Pangenome`` class -======================= - -.. autoclass:: ppanggolin.pangenome.Pangenome - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/source/index.rst b/docs/dev/source/index.rst deleted file mode 100644 index 14b36498..00000000 --- a/docs/dev/source/index.rst +++ /dev/null @@ -1,20 +0,0 @@ -.. PPanGGOLiN documentation master file, created by - sphinx-quickstart on Thu Mar 12 10:23:28 2020. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to PPanGGOLiN's documentation! -====================================== - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - ppanggolin - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/dev/source/ppanggolin.RGP.rst b/docs/dev/source/ppanggolin.RGP.rst deleted file mode 100644 index 3ffb12d1..00000000 --- a/docs/dev/source/ppanggolin.RGP.rst +++ /dev/null @@ -1,23 +0,0 @@ -The `RGP` package -====================== - -This package computes Regions of Genome Plasticity, and cluster them into spots of insertion. - -Submodules ----------- - -ppanggolin.RGP.genomicIsland module ------------------------------------ - -.. automodule:: ppanggolin.RGP.genomicIsland - :members: - :undoc-members: - :show-inheritance: - -ppanggolin.RGP.spot module --------------------------- - -.. automodule:: ppanggolin.RGP.spot - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/source/ppanggolin.align.rst b/docs/dev/source/ppanggolin.align.rst deleted file mode 100644 index e40dfe1a..00000000 --- a/docs/dev/source/ppanggolin.align.rst +++ /dev/null @@ -1,26 +0,0 @@ -The `align` package -=================== - -This package uses a pangenome as a reference to compute elements for a given genome, or a given set of proteins. As such, analysis that are usually run on multiple genomes can be run on the single genome or set of proteins that is provided. This subpackage depends on many of the other subpackages to run its analysis. -This package depends on the following packages: - -- `formats`, to check the pangenome status. -- `annotate`, to read the given input files that can be gff or gbff. -- `cluster`, to write gene sequences from annotations. -- `RGP`, to eventually compute RGP and spot predictions. - -It depends on the following modules: - -- `pangenome` -- `utils` - -Submodules ----------- - -ppanggolin.align.alignOnPang module ------------------------------------ - -.. automodule:: ppanggolin.align.alignOnPang - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/source/ppanggolin.annotate.rst b/docs/dev/source/ppanggolin.annotate.rst deleted file mode 100644 index 92fd67e8..00000000 --- a/docs/dev/source/ppanggolin.annotate.rst +++ /dev/null @@ -1,33 +0,0 @@ -The `annotate` package -=========================== - -This package is made to either annotate genomes or read annotations from gbff or gff files. - -It depends on the following subpackage: - -- `formats`, to write the pangenome to the HDF-5 file. - -It depends on the following modules: - -- `pangenome` -- `genome` -- `utils` - -Submodules ----------- - -ppanggolin.annotate.annotate module ------------------------------------ - -.. automodule:: ppanggolin.annotate.annotate - :members: - :undoc-members: - :show-inheritance: - -ppanggolin.annotate.synta module --------------------------------- - -.. automodule:: ppanggolin.annotate.synta - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/source/ppanggolin.cluster.rst b/docs/dev/source/ppanggolin.cluster.rst deleted file mode 100644 index 82193ea2..00000000 --- a/docs/dev/source/ppanggolin.cluster.rst +++ /dev/null @@ -1,15 +0,0 @@ -The `cluster` package -===================== - -This package is there to built gene families, or to read gene families from used input. It will mainly use MMseqs2 for the computation. - -Submodules ----------- - -ppanggolin.cluster.cluster module ---------------------------------- - -.. automodule:: ppanggolin.cluster.cluster - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/source/ppanggolin.figures.rst b/docs/dev/source/ppanggolin.figures.rst deleted file mode 100644 index 9b163b9d..00000000 --- a/docs/dev/source/ppanggolin.figures.rst +++ /dev/null @@ -1,31 +0,0 @@ -The `figures` package -========================== - -This package is there to draw informative figures about the pangenome after it has been computed. - -Submodules ----------- - -ppanggolin.figures.drawing module ---------------------------------- - -.. automodule:: ppanggolin.figures.drawing - :members: - :undoc-members: - :show-inheritance: - -ppanggolin.figures.tile\_plot module ------------------------------------- - -.. automodule:: ppanggolin.figures.tile_plot - :members: - :undoc-members: - :show-inheritance: - -ppanggolin.figures.ucurve module --------------------------------- - -.. automodule:: ppanggolin.figures.ucurve - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/source/ppanggolin.formats.rst b/docs/dev/source/ppanggolin.formats.rst deleted file mode 100644 index afebb751..00000000 --- a/docs/dev/source/ppanggolin.formats.rst +++ /dev/null @@ -1,31 +0,0 @@ -The `formats` package -===================== - -This package is used by the other packages to read and write the pangenome to/from the HDF-5 file. - -Submodules ----------- - -ppanggolin.formats.readBinaries module --------------------------------------- - -.. automodule:: ppanggolin.formats.readBinaries - :members: - :undoc-members: - :show-inheritance: - -ppanggolin.formats.writeBinaries module ---------------------------------------- - -.. automodule:: ppanggolin.formats.writeBinaries - :members: - :undoc-members: - :show-inheritance: - -ppanggolin.formats.writeFlat module ------------------------------------ - -.. automodule:: ppanggolin.formats.writeFlat - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/source/ppanggolin.graph.rst b/docs/dev/source/ppanggolin.graph.rst deleted file mode 100644 index 2de4840d..00000000 --- a/docs/dev/source/ppanggolin.graph.rst +++ /dev/null @@ -1,15 +0,0 @@ -The `graph` package -======================== - -This builds the pangenome graph, and eventually removes nodes from it. - -Submodules ----------- - -ppanggolin.graph.makeGraph module ---------------------------------- - -.. automodule:: ppanggolin.graph.makeGraph - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/source/ppanggolin.info.rst b/docs/dev/source/ppanggolin.info.rst deleted file mode 100644 index 8f7645a9..00000000 --- a/docs/dev/source/ppanggolin.info.rst +++ /dev/null @@ -1,15 +0,0 @@ -The `info` package -======================= - -This package is used to query a pangenome to get summaries of its content, the parameters used to compute it and the different analyses that were run on it and are stored in the HDF-5 file. - -Submodules ----------- - -ppanggolin.info.info module ---------------------------- - -.. automodule:: ppanggolin.info.info - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/source/ppanggolin.nem.rst b/docs/dev/source/ppanggolin.nem.rst deleted file mode 100644 index da4c0d2d..00000000 --- a/docs/dev/source/ppanggolin.nem.rst +++ /dev/null @@ -1,23 +0,0 @@ -The `nem` package -====================== - -This package is there to use the NEM algorithm. - -Submodules ----------- - -ppanggolin.nem.partition module -------------------------------- - -.. automodule:: ppanggolin.nem.partition - :members: - :undoc-members: - :show-inheritance: - -ppanggolin.nem.rarefaction module ---------------------------------- - -.. automodule:: ppanggolin.nem.rarefaction - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/source/ppanggolin.rst b/docs/dev/source/ppanggolin.rst deleted file mode 100644 index 2592b890..00000000 --- a/docs/dev/source/ppanggolin.rst +++ /dev/null @@ -1,79 +0,0 @@ -Developper doc -============== - -``ppanggolin`` is both a command line tool and a python library for comparative genomics. It tries to prodive a solution for using cutting-edge methods for large scale comparative analysis and stores any computed results in a compact format so that they can be reused at will. -This part of the documentation is made for people that want to use PPanGGOLiN as a python library, or for those that need to maintain the package or want to modify it. - -If you were looking for the command line tool documentation of PPanGGOLiN, you should check the github wiki instead. - -Subpackages ------------ - -There is a ppanggolin subpackage for each specific step of the analysis. Each subpackage is associated to one or more subcommand. - -.. toctree:: - :maxdepth: 1 - - ppanggolin.RGP - ppanggolin.align - ppanggolin.annotate - ppanggolin.cluster - ppanggolin.figures - ppanggolin.formats - ppanggolin.graph - ppanggolin.info - ppanggolin.nem - ppanggolin.workflow - -Submodules ----------- - -Submodules includes all of the basic classes of PPanGGOLiN that will be used by the subpackages. - -.. toctree:: - :maxdepth: 2 - - classes/pangenome - classes/edge - classes/geneFamily - -ppanggolin.genome module ------------------------- - -.. automodule:: ppanggolin.genome - :members: - :undoc-members: - :show-inheritance: - -ppanggolin.main module ----------------------- - -.. automodule:: ppanggolin.main - :members: - :undoc-members: - :show-inheritance: - -ppanggolin.region module ------------------------- - -.. automodule:: ppanggolin.region - :members: - :undoc-members: - :show-inheritance: - -ppanggolin.utils module ------------------------ - -.. automodule:: ppanggolin.utils - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: ppanggolin - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/dev/source/ppanggolin.workflow.rst b/docs/dev/source/ppanggolin.workflow.rst deleted file mode 100644 index 4046fe4b..00000000 --- a/docs/dev/source/ppanggolin.workflow.rst +++ /dev/null @@ -1,23 +0,0 @@ -The `workflow` package -=========================== - -This package includes the different 'basic' workflows of ppanggolin. It will depend on most of the other packages to run its analyses. - -Submodules ----------- - -ppanggolin.workflow.panRGP module ---------------------------------- - -.. automodule:: ppanggolin.workflow.panRGP - :members: - :undoc-members: - :show-inheritance: - -ppanggolin.workflow.workflow module ------------------------------------ - -.. automodule:: ppanggolin.workflow.workflow - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/dev/make.bat b/docs/make.bat similarity index 91% rename from docs/dev/make.bat rename to docs/make.bat index 6247f7e2..dc1312ab 100644 --- a/docs/dev/make.bat +++ b/docs/make.bat @@ -1,35 +1,35 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=source -set BUILDDIR=build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/_static/drawspot_example.png b/docs/source/_static/drawspot_example.png new file mode 100644 index 0000000000000000000000000000000000000000..73e1c90d2632aae651e48624532755438b8226d4 GIT binary patch literal 60456 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