From 4fa7833a8754fec0c4d524d7e750d6a7d3e886b9 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Tue, 20 Nov 2018 11:47:00 -0700 Subject: [PATCH 01/19] minor correction [skip ci] --- docs/gui.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/gui.rst b/docs/gui.rst index fc2af2a..e131a37 100644 --- a/docs/gui.rst +++ b/docs/gui.rst @@ -19,8 +19,8 @@ Step by step guide to run PhaME using web interface in a local machine. Docker a POSTGRES_HOST=postgres POSTGRES_PORT=5432 POSTGRES_DB=phame_api01 - POSTGRES_USER=debug - POSTGRES_PASSWORD=debug + POSTGRES_USER=<user> + POSTGRES_PASSWORD=<postgres_password> 4. cd to the project root directory `phame_api01` From a0055b9945df92c25cbe757cd0d42ea2cf9fe760 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Tue, 20 Nov 2018 14:12:05 -0700 Subject: [PATCH 02/19] added git repo --- docs/gui.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/gui.rst b/docs/gui.rst index e131a37..f95634e 100644 --- a/docs/gui.rst +++ b/docs/gui.rst @@ -7,7 +7,7 @@ Step by step guide to run PhaME using web interface in a local machine. Docker a .. code-block:: console - git clone + git clone git@github.com:LANL-Bioinformatics/phame-api.git 2. create a `.postegres` file within the cloned directory `phame_api01/.envs/.local/.postgres`, and add following lines to it. From 21c2c5891c4a6f865961cac0c2059fba2f869746 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Sat, 15 Dec 2018 10:50:43 -0700 Subject: [PATCH 03/19] more badges --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5920b72..1fad4fc 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,10 @@ [](https://travis-ci.org/mshakya/PhaME) [](https://waffle.io/mshakya/PhaME-1) [](https://phame.readthedocs.io/en/latest/?badge=latest) -[](http://bioconda.github.io/recipes/phame/README.html) +[] +(http://bioconda.github.io/recipes/phame/README.html) +[](https://quay.io/repository/biocontainers/phame) +[] Given a reference, PhaME extracts SNPs from complete genomes, draft genomes and/or reads. Uses SNP multiple sequence alignment to construct a phylogenetic tree. From 846a9097b6a9920c100d7958116356283bb1c6b6 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Sat, 15 Dec 2018 11:01:31 -0700 Subject: [PATCH 04/19] [skip ci] minor change --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 1fad4fc..e7746b9 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,7 @@ [](https://travis-ci.org/mshakya/PhaME) [](https://waffle.io/mshakya/PhaME-1) [](https://phame.readthedocs.io/en/latest/?badge=latest) -[] -(http://bioconda.github.io/recipes/phame/README.html) +[](http://bioconda.github.io/recipes/phame/README.html) [](https://quay.io/repository/biocontainers/phame) [] From b7183693939c7a1ea084ee3677e0aac111d9880c Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Wed, 19 Dec 2018 15:50:54 -0700 Subject: [PATCH 05/19] splitting installation files --- docs/install/conda.rst | 26 +++++++++ docs/{ => install}/docker.rst | 6 +- docs/{gui.rst => install/web-interface.rst} | 0 docs/installation.rst | 63 --------------------- 4 files changed, 29 insertions(+), 66 deletions(-) create mode 100644 docs/install/conda.rst rename docs/{ => install}/docker.rst (91%) rename docs/{gui.rst => install/web-interface.rst} (100%) delete mode 100644 docs/installation.rst diff --git a/docs/install/conda.rst b/docs/install/conda.rst new file mode 100644 index 0000000..1175bc2 --- /dev/null +++ b/docs/install/conda.rst @@ -0,0 +1,26 @@ +Installing PhaME using conda +############################ + +PhaME can be installed using conda. If you do not have anaconda or miniconda installed, please do so. Installation of miniconda or anaconda is rather straight forward. After installtion of conda, add channels for bioconda and conda-forge using: + + .. code-block:: console + + $ conda config --add channels r + $ conda config --add channels defaults + $ conda config --add channels conda-forge + $ conda config --add channels bioconda + + +Then simply run + + +.. code-block:: console + + conda install phame + +We recommend creating a separate conda environment for PhaME. You can create a conda environment by: + +.. code-block:: console + + $ conda create -n my_env + $ conda install phame -n my_env diff --git a/docs/docker.rst b/docs/install/docker.rst similarity index 91% rename from docs/docker.rst rename to docs/install/docker.rst index 1891fb3..d1875e7 100644 --- a/docs/docker.rst +++ b/docs/install/docker.rst @@ -10,15 +10,15 @@ To bypass the installation steps, we have provided a docker [image](https://stac .. code-block:: console - $ docker pull quay.io/biocontainers/phame:1.0.1--0 + $ docker pull quay.io/biocontainers/phame:1.0.3--0 3. Check if the image is correctly downloaded by running the provided test: .. code-block:: console - $ docker run --rm quay.io/biocontainers/phame:1.0.1--1 phame -h - $ docker run --rm quay.io/biocontainers/phame:1.0.1--1 phame -vcheck + $ docker run --rm quay.io/biocontainers/phame:1.0.3--0 phame -h + $ docker run --rm quay.io/biocontainers/phame:1.0.3--0 phame -vcheck 4. Run your own data using docker. A step by step guide - Create a folder to mount onto your docker diff --git a/docs/gui.rst b/docs/install/web-interface.rst similarity index 100% rename from docs/gui.rst rename to docs/install/web-interface.rst diff --git a/docs/installation.rst b/docs/installation.rst deleted file mode 100644 index 2bf103d..0000000 --- a/docs/installation.rst +++ /dev/null @@ -1,63 +0,0 @@ -Installing PhaME -################ - -PhaME can be installed using conda. If you do not have anaconda or miniconda installed, please do so. Installation of miniconda or anaconda is rather straight forward. After installtion of conda, add channels for bioconda and conda-forge using: - - .. code-block:: console - - $ conda config --add channels r - $ conda config --add channels defaults - $ conda config --add channels conda-forge - $ conda config --add channels bioconda - - -Then simply run - - -.. code-block:: console - - conda install phame - -We do recommend creating a separate conda environment for PhaME. You can create a conda environment by: - -.. code-block:: console - - $ conda create -n my_env - $ conda install phame -n my_env - - - -Dependencies -============ - -Programming/Scripting languages -------------------------------- -* Perl > 5.16 - -Third party softwares/packages -------------------------------- -* MUMmer version 3.23 - For pairwise alignments of genomes and contigs using NUCmer -* Bowtie2 version >=2.2.8 - To map reads -* BWA >= 0.7.17 - To map reads -* SAMtools >=1.6 Convert BAM files and other miscs functions. -* FastTree version >=2.1.9 - Construction of phylogenetic tree. -* RAxML version >=8.2.9 - Maximum likelihood construction of phylogenetic tree. -* mafft version >=7.305 - Alignment of protein coding genes for evolutionary analyses. -* pal2nal version >=14 - Converts protein sequence alignment to codon alignments. -* paml version >=4.8 - For evolutionary analyses -* HyPhy version >=2.2 - For evolutionary analyses -* cmake VER >= 3.0.1 -* gcc >= 4.9 -* bcftools VER >= 1.6 - For calling SNPs. -* bbmap version >= 37.90 - For picking references using mash - -Perl Packages -------------- -* File::Basename = 2.85 -* File::Path = 2.09 -* Getopt::Long = 2.45 -* IO::Handle = 1.28 -* Parllel::ForkManager = 1.17 -* Statistics::Distributions = 1.02 -* Time::BaseName = 2.85 -* Time::HiRes = 1.9726 From 43d38d7989b43b6f7146d026354f1ba97c70479d Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Wed, 19 Dec 2018 15:59:06 -0700 Subject: [PATCH 06/19] [skip ci] testing some doc changes --- docs/index.rst | 4 ++-- docs/introduction.rst | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 0898354..46a5989 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -4,9 +4,9 @@ PhaME: **Ph**\ylogenetics **a**\nd **M**\olecular **E**\volution analysis tool .. toctree:: :numbered: :maxdepth: 2 - + introduction - installation + install runphame cases docker diff --git a/docs/introduction.rst b/docs/introduction.rst index b010772..5484523 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -7,3 +7,12 @@ What is PhaME? PhaME or Phylogenetic and Molecular Evolution (PhaME) analysis tool allows suite of analysis pertaining to phylogeny and moleuclar evolution. Given a reference, PhaME extracts SNPs from complete genomes, draft genomes and/or reads, uses SNP multiple sequence alignment to construct a phylogenetic tree, and provides evolutionary analyses (genes under positive selection) using CDS SNPs. + + +Quick usage +=========== +To quickly get started with PhaME, you can install using conda. + +.. code-block:: console + + conda install phame From 48b9e19f3a4712d5906e4d0c1bb811567fa350ac Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Wed, 19 Dec 2018 16:09:34 -0700 Subject: [PATCH 07/19] testing [skip ci] --- docs/index.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index 46a5989..c9f847a 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,6 +1,11 @@ PhaME: **Ph**\ylogenetics **a**\nd **M**\olecular **E**\volution analysis tool ########################################################################## +Phylogenetic and Molecular Evolution (PhaME) analysis tool allows suite of analysis pertaining to phylogeny and moleuclar evolution. + +Given a reference, PhaME extracts SNPs from complete genomes, draft genomes and/or reads, uses SNP multiple sequence alignment to construct a phylogenetic tree, and provides evolutionary analyses (genes under positive selection) using CDS SNPs. + + .. toctree:: :numbered: :maxdepth: 2 From fddf4b4ead6488bf32bf0aa838c00c3226264007 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Wed, 19 Dec 2018 16:22:43 -0700 Subject: [PATCH 08/19] [skip ci] testing readthedoc --- docs/index.rst | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index c9f847a..3a55df3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -6,23 +6,28 @@ Phylogenetic and Molecular Evolution (PhaME) analysis tool allows suite of analy Given a reference, PhaME extracts SNPs from complete genomes, draft genomes and/or reads, uses SNP multiple sequence alignment to construct a phylogenetic tree, and provides evolutionary analyses (genes under positive selection) using CDS SNPs. + +Introduction +----- .. toctree:: :numbered: :maxdepth: 2 - introduction - install - runphame - cases - docker - gui - commandline - output - database - third_party - troubleshooting - copyright + +Install +------- +.. toctree:: + install/conda.rst + install/docker.rst + install/web-interface.rst + + +Citation +-------- +.. toctree:: citation - contact + +Contact + From 7df38a84d95a3863a8125508727e48b549480584 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Wed, 19 Dec 2018 16:36:34 -0700 Subject: [PATCH 09/19] [skip ci] fixing readthedocs --- docs/img/phame.png | Bin 0 -> 47945 bytes docs/index.rst | 20 ++++++++------------ docs/install/conda.rst | 5 ++--- docs/install/docker.rst | 4 ++-- docs/install/web-interface.rst | 2 +- 5 files changed, 13 insertions(+), 18 deletions(-) create mode 100644 docs/img/phame.png diff --git a/docs/img/phame.png b/docs/img/phame.png new file mode 100644 index 0000000000000000000000000000000000000000..a9cceddc5e73bc1ea90b86521164370ebc5d8d47 GIT binary patch literal 47945 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 KMNUMnLSTX(o!wRd literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index 3a55df3..fa2a206 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -6,24 +6,20 @@ Phylogenetic and Molecular Evolution (PhaME) analysis tool allows suite of analy Given a reference, PhaME extracts SNPs from complete genomes, draft genomes and/or reads, uses SNP multiple sequence alignment to construct a phylogenetic tree, and provides evolutionary analyses (genes under positive selection) using CDS SNPs. - -Introduction ------ .. toctree:: - :numbered: :maxdepth: 2 - introduction + :hidden: + :caption: Introduction + introduction -Install -------- .. toctree:: - install/conda.rst - install/docker.rst - install/web-interface.rst + :maxdepth: 2 + :caption: Install + install/conda.rst + install/docker.rst + install/web-interface.rst -Citation --------- .. toctree:: citation diff --git a/docs/install/conda.rst b/docs/install/conda.rst index 1175bc2..16d457a 100644 --- a/docs/install/conda.rst +++ b/docs/install/conda.rst @@ -1,7 +1,7 @@ -Installing PhaME using conda +Conda ############################ -PhaME can be installed using conda. If you do not have anaconda or miniconda installed, please do so. Installation of miniconda or anaconda is rather straight forward. After installtion of conda, add channels for bioconda and conda-forge using: +PhaME can be installed using [conda](https://conda.io/docs/index.html). If you do not have anaconda or miniconda installed, please do so. Installation of miniconda or anaconda is rather straight forward. After installtion of conda, add channels for bioconda and conda-forge using: .. code-block:: console @@ -13,7 +13,6 @@ PhaME can be installed using conda. If you do not have anaconda or miniconda ins Then simply run - .. code-block:: console conda install phame diff --git a/docs/install/docker.rst b/docs/install/docker.rst index d1875e7..8c500f3 100644 --- a/docs/install/docker.rst +++ b/docs/install/docker.rst @@ -1,5 +1,5 @@ -Running PhaME with Docker -######################### +Docker +####### To bypass the installation steps, we have provided a docker [image](https://stackoverflow.com/questions/23735149/what-is-the-difference-between-a-docker-image-and-a-container) for PhaME. To run PhaME from a docker image, follow these steps: diff --git a/docs/install/web-interface.rst b/docs/install/web-interface.rst index f95634e..3b8311c 100644 --- a/docs/install/web-interface.rst +++ b/docs/install/web-interface.rst @@ -1,4 +1,4 @@ -Using PhaME through a web-interface. +Web-interface. #################################### Step by step guide to run PhaME using web interface in a local machine. Docker and git is required. From 6d34f2827902247c86e23459689dceaeee5ac12e Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Wed, 19 Dec 2018 21:47:55 -0700 Subject: [PATCH 10/19] still fixing [skip ci] --- .gitignore | 3 ++- docs/index.rst | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index e030bcf..971dd81 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,5 @@ thirdParty/messages.log thirdParty/evolver.out thirdParty/errors.log messages.log -*.log \ No newline at end of file +*.log +docs/_build/* \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index fa2a206..f467983 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,20 +8,22 @@ Given a reference, PhaME extracts SNPs from complete genomes, draft genomes and/ .. toctree:: :maxdepth: 2 - :hidden: :caption: Introduction + introduction .. toctree:: :maxdepth: 2 :caption: Install + install/conda.rst install/docker.rst install/web-interface.rst .. toctree:: - citation + :maxdepth: 2 + citation Contact From 60558de07612be2d61c3f6b7df838bd6955ea242 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Wed, 19 Dec 2018 22:34:36 -0700 Subject: [PATCH 11/19] [skip ci] moving files around --- docs/README.rst | 1 - docs/index.rst | 30 +++++++++++------ docs/install/docker.rst | 68 +++++++++++++++++++------------------- docs/introduction.rst | 4 +-- docs/{ => usage}/cases.rst | 0 5 files changed, 55 insertions(+), 48 deletions(-) delete mode 100644 docs/README.rst rename docs/{ => usage}/cases.rst (100%) diff --git a/docs/README.rst b/docs/README.rst deleted file mode 100644 index 30d74d2..0000000 --- a/docs/README.rst +++ /dev/null @@ -1 +0,0 @@ -test \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index f467983..8cbe3b8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,5 +1,5 @@ PhaME: **Ph**\ylogenetics **a**\nd **M**\olecular **E**\volution analysis tool -########################################################################## +############################################################################## Phylogenetic and Molecular Evolution (PhaME) analysis tool allows suite of analysis pertaining to phylogeny and moleuclar evolution. @@ -7,25 +7,33 @@ Given a reference, PhaME extracts SNPs from complete genomes, draft genomes and/ .. toctree:: - :maxdepth: 2 - :caption: Introduction - - introduction + :maxdepth: 2 + :caption: INTRODUCTION + + introduction.rst + +.. toctree:: + :maxdepth: 2 + :caption: INSTALL + + install/conda + install/docker + install/web-interface .. toctree:: :maxdepth: 2 - :caption: Install + :caption: USAGE - install/conda.rst - install/docker.rst - install/web-interface.rst + usage/cases .. toctree:: :maxdepth: 2 - citation + :caption: CITATION + + citation.rst + -Contact diff --git a/docs/install/docker.rst b/docs/install/docker.rst index 8c500f3..be96395 100644 --- a/docs/install/docker.rst +++ b/docs/install/docker.rst @@ -6,55 +6,55 @@ To bypass the installation steps, we have provided a docker [image](https://stac 1. Install .. _Docker: https://docs.docker.com/install/ -2. Download the latest PhaME image from [quay.io](https:quay.io/) - - .. code-block:: console - - $ docker pull quay.io/biocontainers/phame:1.0.3--0 +2. Download the latest PhaME image from [quay.io](https:quay.io/) + + .. code-block:: console + + $ docker pull quay.io/biocontainers/phame:1.0.3--0 3. Check if the image is correctly downloaded by running the provided test: - - .. code-block:: console + + .. code-block:: console - $ docker run --rm quay.io/biocontainers/phame:1.0.3--0 phame -h - $ docker run --rm quay.io/biocontainers/phame:1.0.3--0 phame -vcheck + $ docker run --rm quay.io/biocontainers/phame:1.0.3--0 phame -h + $ docker run --rm quay.io/biocontainers/phame:1.0.3--0 phame -vcheck 4. Run your own data using docker. A step by step guide - - Create a folder to mount onto your docker + - Create a folder to mount onto your docker - .. code-block:: console - - $ mkdir -p phame_analysis_folder + .. code-block:: console + + $ mkdir -p phame_analysis_folder - - - Create a `refdir` folder with complete genomes within `phame_analysis_folder` + + - Create a `refdir` folder with complete genomes within `phame_analysis_folder` - This folder will contain fasta files representing complete genomes. + This folder will contain fasta files representing complete genomes. - .. code-block:: console - - $ cd phame_analysis_folder - $ mkdir -p refdir + .. code-block:: console + + $ cd phame_analysis_folder + $ mkdir -p refdir - Copy or download genomes and their gff files (if needed) onto this folder. + Copy or download genomes and their gff files (if needed) onto this folder. - - Create a `workdir` folder within the `phame_analysis_folder`. - This folder will have all the intermediate and final outputs of the analysis including input contigs and reference. + - Create a `workdir` folder within the `phame_analysis_folder`. + This folder will have all the intermediate and final outputs of the analysis including input contigs and reference. - .. code-block:: console - - $ mkdir -p workdir + .. code-block:: console + + $ mkdir -p workdir - - Create a control file. - All the inputs and parameters of a PhaME analysis is set in the control file. Using the provided template create a control file with apprpriate parameters and save it in the `phame_analysis_foler`. + - Create a control file. + All the inputs and parameters of a PhaME analysis is set in the control file. Using the provided template create a control file with apprpriate parameters and save it in the `phame_analysis_foler`. - - Run the analysis using docker. + - Run the analysis using docker. - .. code-block:: console - - $ docker run --rm -v $(pwd)/phame_analysis_folder:/data migun/phame src/phame /data/ecoli.ctl - $ git clone https://github.com/mshakya/phame_examples.git - $ docker run --rm -v $(pwd)/phame_examples:/data migun/phame-1 perl src/phame /data/ecoli/ecoli.ctl + .. code-block:: console + + $ docker run --rm -v $(pwd)/phame_analysis_folder:/data migun/phame src/phame /data/ecoli.ctl + $ git clone https://github.com/mshakya/phame_examples.git + $ docker run --rm -v $(pwd)/phame_examples:/data migun/phame-1 perl src/phame /data/ecoli/ecoli.ctl diff --git a/docs/introduction.rst b/docs/introduction.rst index 5484523..9139128 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -1,8 +1,8 @@ Introduction -############ +############# What is PhaME? -============= +============== PhaME or Phylogenetic and Molecular Evolution (PhaME) analysis tool allows suite of analysis pertaining to phylogeny and moleuclar evolution. diff --git a/docs/cases.rst b/docs/usage/cases.rst similarity index 100% rename from docs/cases.rst rename to docs/usage/cases.rst From 50875031454c12f296c3023ebbf364ece0c76956 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Wed, 19 Dec 2018 22:35:45 -0700 Subject: [PATCH 12/19] [skip ci] image file --- docs/img/{phame.png => runPhame.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/img/{phame.png => runPhame.png} (100%) diff --git a/docs/img/phame.png b/docs/img/runPhame.png similarity index 100% rename from docs/img/phame.png rename to docs/img/runPhame.png From 939429318f9b0555b013394bd282a61d4bb816e7 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Wed, 19 Dec 2018 22:42:18 -0700 Subject: [PATCH 13/19] [skip ci] renaming files --- docs/conf.py | 177 ++++++++++++++++++++++++++++ docs/img/{runPhame.png => logo.png} | Bin 2 files changed, 177 insertions(+) create mode 100644 docs/conf.py rename docs/img/{runPhame.png => logo.png} (100%) diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..219dc9f --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = 'phame' +copyright = '2018, migun' +author = 'migun' + +# The short X.Y version +version = '' +# The full version, including alpha/beta/rc tags +release = '' + + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = None + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# + +html_logo = 'img/logo.png' +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +html_theme_options = { + 'logo_only': True +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'phame' + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'phame.tex', 'phame Documentation', + 'migun', 'manual'), +] + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'phame', 'phame Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'phame', 'phame Documentation', + author, 'phame', 'One line description of project.', + 'Miscellaneous'), +] + + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] \ No newline at end of file diff --git a/docs/img/runPhame.png b/docs/img/logo.png similarity index 100% rename from docs/img/runPhame.png rename to docs/img/logo.png From 875599d4c561209c00cbefa642c256f0bb0cca6c Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Wed, 19 Dec 2018 22:50:22 -0700 Subject: [PATCH 14/19] [skip ci] arranged docs --- docs/conf.py | 6 +- docs/index.rst | 3 +- docs/{ => introduction}/introduction.rst | 2 + docs/introduction/runphame.rst | 294 +++++++++++++++++++++++ docs/runphame.rst | 290 ---------------------- 5 files changed, 301 insertions(+), 294 deletions(-) rename docs/{ => introduction}/introduction.rst (99%) create mode 100644 docs/introduction/runphame.rst delete mode 100644 docs/runphame.rst diff --git a/docs/conf.py b/docs/conf.py index 219dc9f..7cd3676 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -82,9 +82,9 @@ # further. For a list of options available for each theme, see the # documentation. # -html_theme_options = { - 'logo_only': True -} +# html_theme_options = { +# 'logo_only': True +# } # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, diff --git a/docs/index.rst b/docs/index.rst index 8cbe3b8..7967086 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -10,7 +10,8 @@ Given a reference, PhaME extracts SNPs from complete genomes, draft genomes and/ :maxdepth: 2 :caption: INTRODUCTION - introduction.rst + introduction/introduction + introduction/runphame .. toctree:: :maxdepth: 2 diff --git a/docs/introduction.rst b/docs/introduction/introduction.rst similarity index 99% rename from docs/introduction.rst rename to docs/introduction/introduction.rst index 9139128..542ffbc 100644 --- a/docs/introduction.rst +++ b/docs/introduction/introduction.rst @@ -4,6 +4,8 @@ Introduction What is PhaME? ============== + + PhaME or Phylogenetic and Molecular Evolution (PhaME) analysis tool allows suite of analysis pertaining to phylogeny and moleuclar evolution. Given a reference, PhaME extracts SNPs from complete genomes, draft genomes and/or reads, uses SNP multiple sequence alignment to construct a phylogenetic tree, and provides evolutionary analyses (genes under positive selection) using CDS SNPs. diff --git a/docs/introduction/runphame.rst b/docs/introduction/runphame.rst new file mode 100644 index 0000000..6ba7253 --- /dev/null +++ b/docs/introduction/runphame.rst @@ -0,0 +1,294 @@ +How to run PhaME? +################# +After installation, PhaME only requires a control file along with your input files. + +.. code-block:: console + + $ phame phame.ctl + + +What is in control file? +======================== +.. _control_file: + .. In a control file, parameters and input folders are specified. + + .. Here is how a control file looks like with the description of their options. + + +:: + + refdir = test/data/ebola_ref # directory where reference (Complete) files are located + workdir = test/workdirs/ebola_complete # directory where contigs/reads files are located and output is stored + + reference = 2 # 0:pick a random reference from refdir; 1:use given reference; 2: use ANI based reference + reffile = KJ660347.fasta # reference filename when option 1 is chosen + + project = t4 # main alignment file name + + cdsSNPS = 1 # 0:no cds SNPS; 1:cds SNPs, divides SNPs into coding and non-coding sequences, gff file is required + + buildSNPdb = 0 # 0: only align to reference 1: build SNP database of all complete genomes from refdir + + FirstTime = 1 # 1:yes; 2:update existing SNP alignment, only works when buildSNPdb is used first time to build DB + + data = 0 # *See below 0:only complete(F); 1:only contig(C); 2:only reads(R); + # 3:combination F+C; 4:combination F+R; 5:combination C+R; + # 6:combination F+C+R; 7:realignment *See below + reads = 2 # 1: single reads; 2: paired reads; 3: both types present; + + tree = 1 # 0:no tree; 1:use FastTree; 2:use RAxML; 3:use both; + bootstrap = 0 # 0:no; 1:yes; # Run bootstrapping *See below + N = 100 # Number of bootstraps to run *See below + + PosSelect = 1 # 0:No; 1:use PAML; 2:use HyPhy; 3:use both # these analysis need gff file to parse genomes to genes + + code = 0 # 0:Bacteria; 1:Virus; 2: Eukarya # Bacteria and Virus sets ploidy to haploid + + clean = 0 # 0:no clean; 1:clean # remove intermediate and temp files after analysis is complete + + threads = 2 # Number of threads to use + + cutoff = 0.1 # Linear alignment (LA) coverage against reference - ignores SNPs from organism that have lower cutoff. + + * When using data option 1,2,5 need a complete reference to align/map to. + * Use data option 7 when need to extract SNPs using a sublist of already aligned genomes. + + +It is a simple text file similar to the ones used PAML analysis. + +What do parameters in control file stand for? +============================================== + +1. *refdir* +A directory with reference genomes (complete genomes) and their annotation file in gff format (optional). Each file should represent a genome and have following extensions. The path to the folder should be either absolute or relative to the location of the control file. Please avoid filenames that have multiple `.` or has special characters like `:` in their name. + - `*`.fasta + - `*`.fna + - `*`.fa + - `*`.gff (optional: to analyze Coding region SNPs of a selected reference file) + +For example, a typical reference folder with reference genomes look like this: + +:: + + $ ls ref/ + GCA_000006925_2_ASM692v2_genomic.fna GCA_000017745_1_ASM1774v1_genomic.fna GCA_000026245_1_ASM2624v1_genomic.fna GCA_000227625_1_ASM22762v1_genomic.fna + GCA_000007405_1_ASM740v1_genomic.fna GCA_000017765_1_ASM1776v1_genomic.fna GCA_000026265_1_ASM2626v1_genomic.fna GCA_000245515_1_ASM24551v1_genomic.fna + GCA_000008865_1_ASM886v1_genomic.fna GCA_000017985_1_ASM1798v1_genomic.fna GCA_000026265_1_ASM2626v1_genomic.gff GCA_000257275_1_ASM25727v1_genomic.fna + + +Each of these files represent one genome. Each genome may have multiple sequences representing multiple replicons or contigs, but are all part of one genome. `gff` files corresponding to a genome must have the same exact name and in the same folder, just different extension. For example, `gff` file for genome `GCA_000006925_2_ASM692v2_genomic.fna` is `GCA_000006925_2_ASM692v2_genomic.gff`. + +2. *workdir* +This is the folder where intermediate and final results of analysis are stored. The path to the folder should be either absolute or relative to the location of the control file. Additionally, if the analysis includes incomplete genomes or contig files and raw reads, they must be in this folder. Contigs file must have following extensions to be recognised as contig file. + - `*`.contig + - `*`.contigs + + For example, a working directory with contigs folder look like this: + +:: + + $ ls workdir/*.contig\ + workdir/GCA_000155105_1_ASM15510v1_genomic.contig workdir/GCA_000968895_2_ASM96889v2_genomic.contig workdir/GCA_001514825_1_ASM151482v1_genomic.contig + workdir/GCA_000190495_1_ASM19049v1_genomic.contig workdir/GCA_000968905.2_ASM96890v2_genomic.contig workdir/GCA_001514845_1_ASM151484v1_genomic.contig + workdir/GCA_000191665_1_ecmda7_genomic.contig workdir/GCA_001471755_1_ASM147175v1_genomic.contig workdir/GCA_001514865_1_ASM151486v1_genomic.contig + + +If the analysis includes reads, they must be in `workdir` as well and decompressed. If reads are paired, they must have same file name at the beginning of the name and `R1` and `R2` at the end of the name and needs to have `.fastq` as their extension (`*_`R1.fastq `*_`R2.fastq). Any file that have `*.fastq` as their extension but dont have paired reads will be treated as single reads. For example, a working folder with paired raw read files loole like this: + +:: + + $ ls *.fastq + GGB_SRR2000383_QC_trimmed_R1.fastq GGB_SRR2000383_QC_trimmed_R2.fastq GGC_SRR2164314_QC_trimmed_R1.fastq GGC_SRR2164314_QC_trimmed_R2.fastq + + +3. *reference* + This is where you specify how do you want to pick your reference genome. The available options are: + - 0: randomly pick a genome from `refdir` folder as the reference genome. + - 1: use the specified genome as the reference. Genome's filename is specified in the `reffile` option. + - 2: picks a `mid point` genome based on the Average Nucleotide Identity (ANI) among all genomes. It uses mash (implemented in BBMap) to calculate ANI. + +4. *reffile* + This is where you specify the reference genome, if option 1 is picked in previous option. File name of the genome is written here and the program will look for that file in `reffile` folder. For example, `KJ660347.fasta` in the control file example above is found in the `reffile` folder. + +5. *project* + The name of the project. All the important downstream output filenames will have the specified project name as their prefix. + +6. *cdsSNPS* + This option allows users to parse SNPs based on their position into coding and non-coding sequences. It can be turned ON (0) or OFF (1). If turned ON, the picked reference genome must have a corresponding gff file. This option is automatically turned ON, if Molecular evolutionary analyses is turned ON (see below). + +7. *buildSNPdb* + This option will turn ON (1) or OFF (0) database creation, which is essentially all possible pairwise alignment of all genomes in `refdir`. Turning this ON will significantly increase the runtime. + +8. *FirstTime* + This options default is 1, which reruns everything. The option 2, which only recalculates the SNP matrix only works when SNP database is turned ON in previous step. + +9. *data* + Select the appropriate option based on the type of data that was included in the analysis. + - 0: only full/complete(F); + + + Select this option if you only have full/complete genomes or you only want to analyze these genomes from the dataset. Full/COmplete genomes are the ones that are found in *refdir*. + + - 1: only contig(C); + + + Select this option if you only have contigs and one reference that is complete. PhaME requires users to input a complete genome as reference. This option will only report contigs in the final alignments and the tree. + + - 2: only reads(R); + + + Select this option if you only want to analyze reads file. Remember similar to option 1, a reference must be given. + + - 3: combination F+C; + + + Select this option if you have full/complete genome and contigs. + + - 4: combination F+R; + + + Select thsi option if you have full/complete genomes and only reads. + + - 5: combination C+R; + + + Select this option if you have full/complete genomes and reads. However, it still requires at least one Full/Complete genome. + + - 6:combination F+C+R; + + + Select this option if you have full/complete, contigs, and read datasets in your analysis. + + - 7:realignment + + + Select this option if you want to realign using a subset of genomes that have already been aligned using one of the option above. It requires editing the `working_list.txt` file. + +10. *reads* + This option is dependent on option chosen in `data`. If the analysis contains only single reads, enter 1, if paired reads enter 2, and if both are present enter 3. + +11. *tree* + The option to generate tree. If 0 is entered, no tree is generted. If 1 is entered, only FastTree is used. If 2 is entered, only RAxML is used. If 3 is entered, both FastTree and RAxMl are used to make trees. + +12. *bootstrap* + - The option is valid if 2 or 3 is selected in `tree` option. It will calculate bootstrap trees using RAxML. + +13. *N* + - Specify the number of bootstrap trees to generate if its turned ON in `bootstrap` option. + +14. *PosSelect* + The option to turn ON and select type of molecular evolution analysis to be done. Enter 0 to turn OFF molecular evolutionary analysis, 1 to use PAML to do molecular evolutionary analysis, 2 to use HyPhy, and 3 to use both of them. Turning this option ON will significantly slow the runtime. If this option is turned ON, you must provide the gff file for the corresponding reference genome. + +15. *code* + This specifies the pre-calculated parameters during genome alignments.Option 0 which is specific for bacteria uses, `Bacteria` aligns using default option with `maxmatch` for nucmer. And, option 1 which is for`Virus` sets option for nucmer alignment with `maxmatch` turned ON and `-b 200 -c 65 -d 0.12 -g 90 -l 20`. + +16. *clean* + Turning this option ON (1) will remove intermediate files. + +17. *threads* + Specify the number of threads to run analysis ON. + +18. *cutoff* + This options lets user control the genomes to include based on how much of their region was included in the alignemnt against the reference genome. Linear alignment (LA) coverage against reference - ignores SNPs from organism that have lower cutoff. + + +What output files are produced? +=============================== + +Summary files ( all files are found under folder `workdir/results`) + + - SNP alignment files + + + all positions (including monomorphic sites) + + * `project`_all_alignment.fna + - all detected SNPs + `project`_all_snp_alignment.fna + - SNPs in CDS (coding sequence) + `project`_cds_snp_alignment.fna + - intergenic SNPs + `project`_int_snp_alignment.fna + + - Newick tree files + - bootstrap mapped Maximum Likelihood trees + - RAxML_bipartitionsBranchLabels.`project`_all_best + - RAxML_bipartitions.`project`_all_best + - bootstraps + - RAxML_bootstrap.`project`_all_b + - best ML tree + - RAxML_bestTree.`project`_all + - RAxML tree using only CDS SNPs + - FastTree using all SNPs + - `project`_all.fasttree + - FastTree using SNPs from coding sequence + `project`_cds.fasttree + + - Other files: + - coordinates of gaps throughout the overall alignment + `project`_gaps.txt + - the size of gaps between `reference` and other genomes. + `project`_all_gaps.txt + - A tab delimited summary file containing information on the core genome size, total SNPs, etc. + `project`_summaryStatistics.txt + - Most rows are genome name (first column), attribute name (second column), and corresponding value (third column) + - `Total_length` for genome size (total base pair) of the corresponding genome (first column) + - `Gap_legnth` for total gaps in the corresponding genome (first column) + - One row labeled `REPEAT` (first column) and `Gap_length`(second column) correspond to repeat size (third column) of reference genome. + - `Reference used` shows the name of the reference genome used. + - `Total gap length:` shows the length of total gaps in the alignment. + - `Core genome length:` shows the length of genomes that were aligned. + - `Total SNPs:` shows the length of SNPs. + - `CDS SNPs:` shows the subset of SNPs from Total SNPs that fall within coding regions. + - A pairwise list of all compared position with coordinates between references and samples + `project`_comparison.txt + `project`_stats.txt (also contains if SNPs are in coding or non-coding regions) + - A matrix file that lists the number of SNPs present between genomes + - all core regions + `project`_snp_coreMatrix.txt + - CDS only + `project`_snp_CDSmatrix.txt + - intergenic only + `project`_snp_intergenicMatrix.txt + - Log file + `project`.log + + - Error file + `project`.error + +Directory structures + + - `working directory`/files + references (concatenated chromosomes) + - `working directory`/results + All output files + - `working directory`/results/snps + SNP coordinate files generated from NUCmer and bowtie + - `g1_g2.snps`: contains pairwise snps between `g1` and `g2`. For example: + + .. code-block:: console + + [P1] [SUB] [SUB] [P2] [BUFF] [DIST] [FRM] [TAGS] + 127 T C 127 22 127 1 1 KJ660347_1_18959 ZEBOV_2002_Ilembe_1_18958 + 149 T C 149 6 149 1 1 KJ660347_1_18959 ZEBOV_2002_Ilembe_1_18958 + 155 C A 155 6 155 1 1 KJ660347_1_18959 ZEBOV_2002_Ilembe_1_18958 + + + - `working directory`/results/gaps + - Gap coordinate files generated from NUCmer and bowtie + - `working directory`/results/stats + - Intermediate stat files generated when parsing NUCmer and Bowtie results + - `g1_g2.coords` is a table file that contains regions of genome `g1` and `g2` that were aligned. + - `g_repeat_coords.txt` is a table that contains region within genome `g` that were detected as similar. + - `g_repeat_stats.txt` contains genome size, repeat segment, and repeat length of genome `g`. For example: + + :: + + ZEBOV_2007_4Luebo size: 18958 + Repeats segment #: 0 + Repeats total length: 0 (0.00%) + + - `repeat_stats.txt` summary of all `g_repeat_stats.txt`. + + - `working directory`/results/temp + - Temporary files generated + - `working directory`/results/PSgenes + - All gene fasta files that contain at least 1 SNP, along with their amino acid sequences and codon alignments + - `working directory`/results/paml + - PAML results + - `working directory`/results/hyphy + - HyPhy results + - `working directory`/results/`*_ambiguousSNPpositions.txt` + - Positions in genomes represented as raw reads where there are ambiguous SNPs. + diff --git a/docs/runphame.rst b/docs/runphame.rst deleted file mode 100644 index d93979c..0000000 --- a/docs/runphame.rst +++ /dev/null @@ -1,290 +0,0 @@ -How to run PhaME? -################# -After installation, PhaME only requires a control file along with your input files. - -.. code-block:: console - - $ phame phame.ctl - - -What is in control file? -======================== -.. _control_file: -In a control file, parameters and input folders are specified. Here is how a control file looks like with the description of their options. -:: - - refdir = test/data/ebola_ref # directory where reference (Complete) files are located - workdir = test/workdirs/ebola_complete # directory where contigs/reads files are located and output is stored - - reference = 2 # 0:pick a random reference from refdir; 1:use given reference; 2: use ANI based reference - reffile = KJ660347.fasta # reference filename when option 1 is chosen - - project = t4 # main alignment file name - - cdsSNPS = 1 # 0:no cds SNPS; 1:cds SNPs, divides SNPs into coding and non-coding sequences, gff file is required - - buildSNPdb = 0 # 0: only align to reference 1: build SNP database of all complete genomes from refdir - - FirstTime = 1 # 1:yes; 2:update existing SNP alignment, only works when buildSNPdb is used first time to build DB - - data = 0 # *See below 0:only complete(F); 1:only contig(C); 2:only reads(R); - # 3:combination F+C; 4:combination F+R; 5:combination C+R; - # 6:combination F+C+R; 7:realignment *See below - reads = 2 # 1: single reads; 2: paired reads; 3: both types present; - - tree = 1 # 0:no tree; 1:use FastTree; 2:use RAxML; 3:use both; - bootstrap = 0 # 0:no; 1:yes; # Run bootstrapping *See below - N = 100 # Number of bootstraps to run *See below - - PosSelect = 1 # 0:No; 1:use PAML; 2:use HyPhy; 3:use both # these analysis need gff file to parse genomes to genes - - code = 0 # 0:Bacteria; 1:Virus; 2: Eukarya # Bacteria and Virus sets ploidy to haploid - - clean = 0 # 0:no clean; 1:clean # remove intermediate and temp files after analysis is complete - - threads = 2 # Number of threads to use - - cutoff = 0.1 # Linear alignment (LA) coverage against reference - ignores SNPs from organism that have lower cutoff. - - * When using data option 1,2,5 need a complete reference to align/map to. - * Use data option 7 when need to extract SNPs using a sublist of already aligned genomes. - - -It is a simple text file similar to the ones used PAML analysis. - -What do parameters in control file stand for? -============================================== - -1. *refdir* -A directory with reference genomes (complete genomes) and their annotation file in gff format (optional). Each file should represent a genome and have following extensions. The path to the folder should be either absolute or relative to the location of the control file. Please avoid filenames that have multiple `.` or has special characters like `:` in their name. - - `*`.fasta - - `*`.fna - - `*`.fa - - `*`.gff (optional: to analyze Coding region SNPs of a selected reference file) - -For example, a typical reference folder with reference genomes look like this: - -:: - - $ ls ref/ - GCA_000006925_2_ASM692v2_genomic.fna GCA_000017745_1_ASM1774v1_genomic.fna GCA_000026245_1_ASM2624v1_genomic.fna GCA_000227625_1_ASM22762v1_genomic.fna - GCA_000007405_1_ASM740v1_genomic.fna GCA_000017765_1_ASM1776v1_genomic.fna GCA_000026265_1_ASM2626v1_genomic.fna GCA_000245515_1_ASM24551v1_genomic.fna - GCA_000008865_1_ASM886v1_genomic.fna GCA_000017985_1_ASM1798v1_genomic.fna GCA_000026265_1_ASM2626v1_genomic.gff GCA_000257275_1_ASM25727v1_genomic.fna - - -Each of these files represent one genome. Each genome may have multiple sequences representing multiple replicons or contigs, but are all part of one genome. `gff` files corresponding to a genome must have the same exact name and in the same folder, just different extension. For example, `gff` file for genome `GCA_000006925_2_ASM692v2_genomic.fna` is `GCA_000006925_2_ASM692v2_genomic.gff`. - -2. *workdir* -This is the folder where intermediate and final results of analysis are stored. The path to the folder should be either absolute or relative to the location of the control file. Additionally, if the analysis includes incomplete genomes or contig files and raw reads, they must be in this folder. Contigs file must have following extensions to be recognised as contig file. - - `*`.contig - - `*`.contigs - - For example, a working directory with contigs folder look like this: - -:: - - $ ls workdir/*.contig\ - workdir/GCA_000155105_1_ASM15510v1_genomic.contig workdir/GCA_000968895_2_ASM96889v2_genomic.contig workdir/GCA_001514825_1_ASM151482v1_genomic.contig - workdir/GCA_000190495_1_ASM19049v1_genomic.contig workdir/GCA_000968905.2_ASM96890v2_genomic.contig workdir/GCA_001514845_1_ASM151484v1_genomic.contig - workdir/GCA_000191665_1_ecmda7_genomic.contig workdir/GCA_001471755_1_ASM147175v1_genomic.contig workdir/GCA_001514865_1_ASM151486v1_genomic.contig - - -If the analysis includes reads, they must be in `workdir` as well and decompressed. If reads are paired, they must have same file name at the beginning of the name and `R1` and `R2` at the end of the name and needs to have `.fastq` as their extension (`*_`R1.fastq `*_`R2.fastq). Any file that have `*.fastq` as their extension but dont have paired reads will be treated as single reads. For example, a working folder with paired raw read files loole like this: - -:: - - $ ls *.fastq - GGB_SRR2000383_QC_trimmed_R1.fastq GGB_SRR2000383_QC_trimmed_R2.fastq GGC_SRR2164314_QC_trimmed_R1.fastq GGC_SRR2164314_QC_trimmed_R2.fastq - - -3. *reference* - This is where you specify how do you want to pick your reference genome. The available options are: - - 0: randomly pick a genome from `refdir` folder as the reference genome. - - 1: use the specified genome as the reference. Genome's filename is specified in the `reffile` option. - - 2: picks a `mid point` genome based on the Average Nucleotide Identity (ANI) among all genomes. It uses mash (implemented in BBMap) to calculate ANI. - -4. *reffile* - This is where you specify the reference genome, if option 1 is picked in previous option. File name of the genome is written here and the program will look for that file in `reffile` folder. For example, `KJ660347.fasta` in the control file example above is found in the `reffile` folder. - -5. *project* - The name of the project. All the important downstream output filenames will have the specified project name as their prefix. - -6. *cdsSNPS* - This option allows users to parse SNPs based on their position into coding and non-coding sequences. It can be turned ON (0) or OFF (1). If turned ON, the picked reference genome must have a corresponding gff file. This option is automatically turned ON, if Molecular evolutionary analyses is turned ON (see below). - -7. *buildSNPdb* - This option will turn ON (1) or OFF (0) database creation, which is essentially all possible pairwise alignment of all genomes in `refdir`. Turning this ON will significantly increase the runtime. - -8. *FirstTime* - This options default is 1, which reruns everything. The option 2, which only recalculates the SNP matrix only works when SNP database is turned ON in previous step. - -9. *data* - Select the appropriate option based on the type of data that was included in the analysis. - - 0: only full/complete(F); - - + Select this option if you only have full/complete genomes or you only want to analyze these genomes from the dataset. Full/COmplete genomes are the ones that are found in *refdir*. - - - 1: only contig(C); - - + Select this option if you only have contigs and one reference that is complete. PhaME requires users to input a complete genome as reference. This option will only report contigs in the final alignments and the tree. - - - 2: only reads(R); - - + Select this option if you only want to analyze reads file. Remember similar to option 1, a reference must be given. - - - 3: combination F+C; - - + Select this option if you have full/complete genome and contigs. - - - 4: combination F+R; - - + Select thsi option if you have full/complete genomes and only reads. - - - 5: combination C+R; - - + Select this option if you have full/complete genomes and reads. However, it still requires at least one Full/Complete genome. - - - 6:combination F+C+R; - - + Select this option if you have full/complete, contigs, and read datasets in your analysis. - - - 7:realignment - - + Select this option if you want to realign using a subset of genomes that have already been aligned using one of the option above. It requires editing the `working_list.txt` file. - -10. *reads* - This option is dependent on option chosen in `data`. If the analysis contains only single reads, enter 1, if paired reads enter 2, and if both are present enter 3. - -11. *tree* - The option to generate tree. If 0 is entered, no tree is generted. If 1 is entered, only FastTree is used. If 2 is entered, only RAxML is used. If 3 is entered, both FastTree and RAxMl are used to make trees. - -12. *bootstrap* - - The option is valid if 2 or 3 is selected in `tree` option. It will calculate bootstrap trees using RAxML. - -13. *N* - - Specify the number of bootstrap trees to generate if its turned ON in `bootstrap` option. - -14. *PosSelect* - The option to turn ON and select type of molecular evolution analysis to be done. Enter 0 to turn OFF molecular evolutionary analysis, 1 to use PAML to do molecular evolutionary analysis, 2 to use HyPhy, and 3 to use both of them. Turning this option ON will significantly slow the runtime. If this option is turned ON, you must provide the gff file for the corresponding reference genome. - -15. *code* - This specifies the pre-calculated parameters during genome alignments.Option 0 which is specific for bacteria uses, `Bacteria` aligns using default option with `maxmatch` for nucmer. And, option 1 which is for`Virus` sets option for nucmer alignment with `maxmatch` turned ON and `-b 200 -c 65 -d 0.12 -g 90 -l 20`. - -16. *clean* - Turning this option ON (1) will remove intermediate files. - -17. *threads* - Specify the number of threads to run analysis ON. - -18. *cutoff* - This options lets user control the genomes to include based on how much of their region was included in the alignemnt against the reference genome. Linear alignment (LA) coverage against reference - ignores SNPs from organism that have lower cutoff. - - -What output files are produced? -=============================== - -Summary files ( all files are found under folder `workdir/results`) - - - SNP alignment files - - + all positions (including monomorphic sites) - - * `project`_all_alignment.fna - - all detected SNPs - `project`_all_snp_alignment.fna - - SNPs in CDS (coding sequence) - `project`_cds_snp_alignment.fna - - intergenic SNPs - `project`_int_snp_alignment.fna - - - Newick tree files - - bootstrap mapped Maximum Likelihood trees - - RAxML_bipartitionsBranchLabels.`project`_all_best - - RAxML_bipartitions.`project`_all_best - - bootstraps - - RAxML_bootstrap.`project`_all_b - - best ML tree - - RAxML_bestTree.`project`_all - - RAxML tree using only CDS SNPs - - FastTree using all SNPs - - `project`_all.fasttree - - FastTree using SNPs from coding sequence - `project`_cds.fasttree - - - Other files: - - coordinates of gaps throughout the overall alignment - `project`_gaps.txt - - the size of gaps between `reference` and other genomes. - `project`_all_gaps.txt - - A tab delimited summary file containing information on the core genome size, total SNPs, etc. - `project`_summaryStatistics.txt - - Most rows are genome name (first column), attribute name (second column), and corresponding value (third column) - - `Total_length` for genome size (total base pair) of the corresponding genome (first column) - - `Gap_legnth` for total gaps in the corresponding genome (first column) - - One row labeled `REPEAT` (first column) and `Gap_length`(second column) correspond to repeat size (third column) of reference genome. - - `Reference used` shows the name of the reference genome used. - - `Total gap length:` shows the length of total gaps in the alignment. - - `Core genome length:` shows the length of genomes that were aligned. - - `Total SNPs:` shows the length of SNPs. - - `CDS SNPs:` shows the subset of SNPs from Total SNPs that fall within coding regions. - - A pairwise list of all compared position with coordinates between references and samples - `project`_comparison.txt - `project`_stats.txt (also contains if SNPs are in coding or non-coding regions) - - A matrix file that lists the number of SNPs present between genomes - - all core regions - `project`_snp_coreMatrix.txt - - CDS only - `project`_snp_CDSmatrix.txt - - intergenic only - `project`_snp_intergenicMatrix.txt - - Log file - `project`.log - - - Error file - `project`.error - -Directory structures - - - `working directory`/files - references (concatenated chromosomes) - - `working directory`/results - All output files - - `working directory`/results/snps - SNP coordinate files generated from NUCmer and bowtie - - `g1_g2.snps`: contains pairwise snps between `g1` and `g2`. For example: - - .. code-block:: console - - [P1] [SUB] [SUB] [P2] [BUFF] [DIST] [FRM] [TAGS] - 127 T C 127 22 127 1 1 KJ660347_1_18959 ZEBOV_2002_Ilembe_1_18958 - 149 T C 149 6 149 1 1 KJ660347_1_18959 ZEBOV_2002_Ilembe_1_18958 - 155 C A 155 6 155 1 1 KJ660347_1_18959 ZEBOV_2002_Ilembe_1_18958 - - - - `working directory`/results/gaps - - Gap coordinate files generated from NUCmer and bowtie - - `working directory`/results/stats - - Intermediate stat files generated when parsing NUCmer and Bowtie results - - `g1_g2.coords` is a table file that contains regions of genome `g1` and `g2` that were aligned. - - `g_repeat_coords.txt` is a table that contains region within genome `g` that were detected as similar. - - `g_repeat_stats.txt` contains genome size, repeat segment, and repeat length of genome `g`. For example: - - :: - - ZEBOV_2007_4Luebo size: 18958 - Repeats segment #: 0 - Repeats total length: 0 (0.00%) - - - `repeat_stats.txt` summary of all `g_repeat_stats.txt`. - - - `working directory`/results/temp - - Temporary files generated - - `working directory`/results/PSgenes - - All gene fasta files that contain at least 1 SNP, along with their amino acid sequences and codon alignments - - `working directory`/results/paml - - PAML results - - `working directory`/results/hyphy - - HyPhy results - - `working directory`/results/`*_ambiguousSNPpositions.txt` - - Positions in genomes represented as raw reads where there are ambiguous SNPs. - From 3d5d7759e6ae6a4629fad872c82000a247796e70 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Wed, 19 Dec 2018 23:10:41 -0700 Subject: [PATCH 15/19] [skip ci] changing theme --- docs/conf.py | 9 +++++---- docs/index.rst | 9 ++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 7cd3676..02d7e12 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -76,15 +76,16 @@ # html_logo = 'img/logo.png' -html_theme = 'alabaster' +html_theme = 'sphinx_rtd_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # -# html_theme_options = { -# 'logo_only': True -# } +html_theme_options = { + 'logo_only': True, + 'display_version': False, +} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, diff --git a/docs/index.rst b/docs/index.rst index 7967086..a0212a6 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,7 +3,6 @@ PhaME: **Ph**\ylogenetics **a**\nd **M**\olecular **E**\volution analysis tool Phylogenetic and Molecular Evolution (PhaME) analysis tool allows suite of analysis pertaining to phylogeny and moleuclar evolution. -Given a reference, PhaME extracts SNPs from complete genomes, draft genomes and/or reads, uses SNP multiple sequence alignment to construct a phylogenetic tree, and provides evolutionary analyses (genes under positive selection) using CDS SNPs. .. toctree:: @@ -28,11 +27,11 @@ Given a reference, PhaME extracts SNPs from complete genomes, draft genomes and/ usage/cases -.. toctree:: - :maxdepth: 2 - :caption: CITATION +.. .. toctree:: +.. :maxdepth: 2 +.. :caption: CITATION - citation.rst +.. citation.rst From 86c23556673b8db367cd119c43aa5c8eb6a19bf3 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Tue, 8 Jan 2019 09:56:57 -0700 Subject: [PATCH 16/19] changes in doc based on mark's coment --- README.md | 2 +- docs/install/web-interface.rst | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e7746b9..6323471 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [](https://phame.readthedocs.io/en/latest/?badge=latest) [](http://bioconda.github.io/recipes/phame/README.html) [](https://quay.io/repository/biocontainers/phame) -[] + Given a reference, PhaME extracts SNPs from complete genomes, draft genomes and/or reads. Uses SNP multiple sequence alignment to construct a phylogenetic tree. diff --git a/docs/install/web-interface.rst b/docs/install/web-interface.rst index 3b8311c..97783f2 100644 --- a/docs/install/web-interface.rst +++ b/docs/install/web-interface.rst @@ -23,11 +23,11 @@ Step by step guide to run PhaME using web interface in a local machine. Docker a POSTGRES_PASSWORD=<postgres_password> -4. cd to the project root directory `phame_api01` +4. cd to the project root directory `phame_api` .. code-block:: console - cd phame_api01 + cd phame_api 5. Create docker containers. @@ -39,7 +39,7 @@ Step by step guide to run PhaME using web interface in a local machine. Docker a .. code-block:: console - docker-compose up + docker-compose up -d 7. `docker-compose run --rm web /bin/bash -c "python -c 'import database; database.init_db()'"` to initialize the database. @@ -48,4 +48,4 @@ Step by step guide to run PhaME using web interface in a local machine. Docker a docker-compose run --rm web /bin/bash -c "python -c 'import database; database.init_db()'" -8. If all went well, :sunglasses: you can go to localhost:8080 to see the phame webpage. \ No newline at end of file +8. If all went well, you can go to open http://localhost to access the phame web-interface. \ No newline at end of file From a213b45d7be498f30a2a5ecaab70c13b897e61f8 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Tue, 8 Jan 2019 10:20:47 -0700 Subject: [PATCH 17/19] changes based on mark --- docs/install/web-interface.rst | 105 ++++++++++++++++++++++++++------- 1 file changed, 85 insertions(+), 20 deletions(-) diff --git a/docs/install/web-interface.rst b/docs/install/web-interface.rst index 97783f2..2088e2f 100644 --- a/docs/install/web-interface.rst +++ b/docs/install/web-interface.rst @@ -1,51 +1,116 @@ Web-interface. -#################################### +############## -Step by step guide to run PhaME using web interface in a local machine. Docker and git is required. +Phame App +========= -1. clone the repo +This Dockerized application contains all of the code you need to run PhaME as a standalone app. It has containers for +the PhaME application, the web interface, Celery and Redis queues and a PostGREs database. + +Step by step guide to running PhaME using a web interface on a local machine. +*Docker and git are required.* + +1. clone the repo .. code-block:: console - git clone git@github.com:LANL-Bioinformatics/phame-api.git + $ git clone git@github.com:LANL-Bioinformatics/phame-app.git +2. cd to the project root directory `phame-app` -2. create a `.postegres` file within the cloned directory `phame_api01/.envs/.local/.postgres`, and add following lines to it. +.. code-block:: console + + $ cd phame-app + +3. run .. code-block:: console - # PostgreSQL - # ------------------------------------------------------------------------------ - POSTGRES_HOST=postgres - POSTGRES_PORT=5432 - POSTGRES_DB=phame_api01 - POSTGRES_USER=<user> - POSTGRES_PASSWORD=<postgres_password> + $ cp .envs/.local/.postgres_template phame-app/.envs/.local/.postgres + $ cp .envs/.local/.email_template phame-app/.envs/.local/.email +4. Edit the `.postgres` file and change the values for `POSTGRES_USER` and `POSTGRES_PASSWORD` -4. cd to the project root directory `phame_api` +5. Create docker containers. .. code-block:: console - cd phame_api + $ docker-compose -f docker-compose-local.yml build + +6. start docker + +.. code-block:: console + + $ docker-compose -f docker-compose-local.yml up -d + +7. initialize the database. + +.. code-block:: console + + $ docker-compose -f docker-compose-local.yml run --rm web /bin/bash -c "python -c 'import database; database.init_db()'" + +If all went well, you can go to `localhost` to see the phame webpage. + +Running PhaME using a web interface +================================================================================== + +The user input files can require a lot of storage space. Use these instructions if you want to store the users' data on +a data volume that is different from the main volume where the Docker container is created. + +Go through steps 1-3 as for the local installation and then: + +1. Run + +.. code-block:: console + + mkdir -p /path/to/api/uploads + + +2. Update paths in `docker-compose-production.yml` to the volume where you want to store the users' upload files for the +`phame` and `web` containers. + +.. code-block:: console + + phame: + volumes: + - phame_data:/phame_api/media + - /path/to/api/uploads:/api/static/uploads + web: + volumes: + - phame_data:/phame_api/media + - /path/to/api/uploads:/api/static/uploads + + +For example set volumes to `- /vol_d/api/uploads:/api/static/uploads` if you want to store the upload files +on `/vol_d` 5. Create docker containers. .. code-block:: console - docker-compose build + docker-compose -f docker-compose-production.yml build 6. start docker .. code-block:: console - docker-compose up -d + docker-compose -f docker-compose-production.yml up -d -7. `docker-compose run --rm web /bin/bash -c "python -c 'import database; database.init_db()'"` to initialize the database. +Monitoring tasks +================ -.. code-block:: console +Browse to `localhost:5555` to see the Flower Dashboard. Here you can see the status of the celery workers and their tasks. + +You can look at projects run by other users if you create an `admin` account and login to that account. Click on the +admin user icon in the upper right corner and select the username for the projects you would like to view. + +Email notifications +=================== + +If you would like users to receive email notifications with the error and execution logs when their projects have finished running: - docker-compose run --rm web /bin/bash -c "python -c 'import database; database.init_db()'" +1. Setup an email client. We use https://www.mailgun.com/ +2. Edit the `.email` file and change the values for `API_KEY`, `EMAIL_URL` and `SENDER` -8. If all went well, you can go to open http://localhost to access the phame web-interface. \ No newline at end of file +3. Edit `phame-app/api/config.py` and set `SEND_NOTIFICATIONS = True` \ No newline at end of file From d92ea86ba76571262e383bce0b33e85bd23d9edc Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Tue, 8 Jan 2019 10:35:36 -0700 Subject: [PATCH 18/19] minor changes --- docs/install/web-interface.rst | 2 +- lib/PhaME.pm | 7 ++++--- src/phame | 5 ++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/install/web-interface.rst b/docs/install/web-interface.rst index 2088e2f..759d6d9 100644 --- a/docs/install/web-interface.rst +++ b/docs/install/web-interface.rst @@ -52,7 +52,7 @@ Step by step guide to running PhaME using a web interface on a local machine. If all went well, you can go to `localhost` to see the phame webpage. Running PhaME using a web interface -================================================================================== +=================================== The user input files can require a lot of storage space. Use these instructions if you want to store the users' data on a data volume that is different from the main volume where the Docker container is created. diff --git a/lib/PhaME.pm b/lib/PhaME.pm index 1203143..64da6cf 100644 --- a/lib/PhaME.pm +++ b/lib/PhaME.pm @@ -446,7 +446,7 @@ sub movefiles { system("mv $dir/*.fasttree $dir/trees/"); } elsif ($trees == 2 || $trees == 4){ - system("mv $dir/RAxML* $dir/trees/"); + system("mv $dir/RAxML*.* $dir/trees/"); } elsif ($trees == 3 || $trees == 4){ system("mv $dir/*.fna.* $dir/trees/"); @@ -628,7 +628,7 @@ sub buildTree { print OUT "Also bootstraping IQ-Trees trees\n"; print OUT "\n"; my $iqtree - = "iqtree -m TEST -s $outdir/$name\_snp_alignment.fna -nt $thread -bc $bootstrap 2>>$error >> $log\n\n"; + = "iqtree -m TEST -s $outdir/$name\_snp_alignment.fna -nt $thread 2>>$error >> $log\n\n"; print OUT $iqtree; if ( system($iqtree) ) { die "Error running $iqtree.\n"; } } @@ -637,7 +637,8 @@ sub buildTree { if ( $tree == 1 ) { return ("Fasttree phylogeny complete"); } if ( $tree == 2 ) { return ("RAxML phylogeny complete"); } - if ( $tree == 3 ) { return ("Phylogeny complete"); } + if ( $tree == 3 ) { return ("IQ-TREE Phylogeny complete"); } + if ( $tree == 4 ) { return ("All phylogeny complete"); } } sub bootstrap { diff --git a/src/phame b/src/phame index 45b877e..cc7cd4f 100755 --- a/src/phame +++ b/src/phame @@ -230,9 +230,10 @@ while (<CTL>) { # default is NO. if (/FirstTime\s*=\s*(1|2)\s*#{0,1}.*$/) { $time = $1; } if (/data\s*=\s*(\d)\s*#{0,1}.*$/) { $data = $1; } - if (/SNPSfilter\s*=\s*(\d+\.*\d+)\s*#.*$/) { $snp_filter = $1; } # 0=Finished; 1=contig; 2=reads; 3=F+C; 4=F+R; 5=C+R 6=F+C+R if (/\s+reads\s*=\s*(1|2|3)\s*#{0,1}.*$/) { $reads = $1; } + if (/SNPsfilter\s*=\s*(\d+\.*\d+)\s*#.*$/) { $snp_filter = $1; } + if (/tree\s*=\s*(0|1|2|3|4)\s*#{0,1}.*$/) { $tree = $1; } #0=no tree; 1=fasttree; 2=raxml; 3=iqtree;4=both @@ -262,6 +263,7 @@ while (<CTL>) { } } if (/cutoff\s*=\s*(\d+\.*\d+)\s*#.*$/) { $cutoff = $1; } + } close CTL; ########################################################################################## @@ -364,6 +366,7 @@ END_MESSAGE } +print "\tSNPs filter:\t$snp_filter\n"; print "\tCode:\t$type\n"; print "\tLog file:\t$logfile\n"; print "\tError file:\t$error\n"; From 95085268aae1d2504f56bd5aa99c16a46bcb4902 Mon Sep 17 00:00:00 2001 From: Migun Shakya <microbeatic@gmail.com> Date: Wed, 30 Jan 2019 09:33:52 -0700 Subject: [PATCH 19/19] [skip ci] header change --- docs/install/web-interface.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/install/web-interface.rst b/docs/install/web-interface.rst index 759d6d9..6936332 100644 --- a/docs/install/web-interface.rst +++ b/docs/install/web-interface.rst @@ -8,6 +8,8 @@ This Dockerized application contains all of the code you need to run PhaME as a the PhaME application, the web interface, Celery and Redis queues and a PostGREs database. Step by step guide to running PhaME using a web interface on a local machine. +============================================================================== + *Docker and git are required.* 1. clone the repo @@ -51,8 +53,8 @@ Step by step guide to running PhaME using a web interface on a local machine. If all went well, you can go to `localhost` to see the phame webpage. -Running PhaME using a web interface -=================================== +Step by step guide to running PhaME using a web interface on a production machine. +================================================================================== The user input files can require a lot of storage space. Use these instructions if you want to store the users' data on a data volume that is different from the main volume where the Docker container is created.